@@ -572,6 +572,8 @@ static MTAB cpu_mod[] = {
572
572
NULL , NULL , "Sets the RAM type to Cromemco RAM for 8080 / Z80 / 8086" },
573
573
{ MTAB_XTD | MTAB_VDV , 4 , NULL , "B810" , & cpu_set_ramtype ,
574
574
NULL , NULL , "Sets the RAM type AB Digital Design B810 8080 / Z80 / 8086" },
575
+ { MTAB_XTD | MTAB_VDV , 5 , NULL , "ERAM" , & cpu_set_ramtype ,
576
+ NULL , NULL , "Sets the RAM type to SD Systems ERAM for 8080 / Z80 / 8086" },
575
577
{ MTAB_VDV , 4 , NULL , "4KB" , & cpu_set_size ,
576
578
NULL , NULL , "Sets the RAM size to 4KB for 8080 / Z80 / 8086" },
577
579
{ MTAB_VDV , 8 , NULL , "8KB" , & cpu_set_size ,
@@ -734,7 +736,8 @@ const char* handlerNameForPort(const int32 port) {
734
736
#define RAM_TYPE_VRAM 2 /* Vector Graphic RAM card */
735
737
#define RAM_TYPE_CRAM 3 /* Cromemco RAM card */
736
738
#define RAM_TYPE_B810 4 /* AB Digital Design B810 RAM card */
737
- #define MAX_RAM_TYPE RAM_TYPE_B810
739
+ #define RAM_TYPE_ERAM 5 /* SD Systems ExpandoRAM */
740
+ #define MAX_RAM_TYPE RAM_TYPE_ERAM
738
741
739
742
static int32 ramtype = RAM_TYPE_AZ80 ;
740
743
@@ -6760,7 +6763,7 @@ const static CPUFLAG *cpuflags[NUM_CHIP_TYPE] = { cpuflags8080, cpuflagsZ80,
6760
6763
cpuflags8086 , cpuflagsM68K , };
6761
6764
6762
6765
/* needs to be set for each ramtype <= MAX_RAM_TYPE */
6763
- static const char * ramTypeToString [] = { "AZ80" , "HRAM" , "VRAM" , "CRAM" , "B810" };
6766
+ static const char * ramTypeToString [] = { "AZ80" , "HRAM" , "VRAM" , "CRAM" , "B810" , "ERAM" };
6764
6767
6765
6768
static const char * m68kVariantToString [] = {
6766
6769
"INVALID" ,
@@ -7000,6 +7003,13 @@ static int32 bankseldev(const int32 port, const int32 io, const int32 data) {
7000
7003
sim_printf ("Invalid bank select 0x%02x for B810\n" , data );
7001
7004
}
7002
7005
break ;
7006
+ case RAM_TYPE_ERAM :
7007
+ if (data < 8 ) {
7008
+ setBankSelect (data );
7009
+ } else {
7010
+ sim_printf ("Invalid bank select 0x%02x for ERAM\n" , data );
7011
+ }
7012
+ break ;
7003
7013
case RAM_TYPE_AZ80 :
7004
7014
default :
7005
7015
break ;
@@ -7143,6 +7153,11 @@ static t_stat cpu_set_ramtype(UNIT *uptr, int32 value, CONST char *cptr, void *d
7143
7153
sim_printf ("Unmapping AB Digital Design B810 RAM\n" );
7144
7154
sim_map_resource (0x40 , 1 , RESOURCE_TYPE_IO , & bankseldev , "bankseldev" , TRUE);
7145
7155
break ;
7156
+ case RAM_TYPE_ERAM :
7157
+ if (cpu_unit .flags & UNIT_CPU_VERBOSE )
7158
+ sim_printf ("Unmapping SD Systems ExpandoRAM\n" );
7159
+ sim_map_resource (0xff , 1 , RESOURCE_TYPE_IO , & bankseldev , "bankseldev" , TRUE);
7160
+ break ;
7146
7161
case 0 :
7147
7162
default :
7148
7163
if (cpu_unit .flags & UNIT_CPU_VERBOSE )
@@ -7171,6 +7186,11 @@ static t_stat cpu_set_ramtype(UNIT *uptr, int32 value, CONST char *cptr, void *d
7171
7186
sim_printf ("AB Digital Design B810 RAM Selected\n" );
7172
7187
sim_map_resource (0x40 , 1 , RESOURCE_TYPE_IO , & bankseldev , "bankseldev" , FALSE);
7173
7188
break ;
7189
+ case RAM_TYPE_ERAM :
7190
+ if (cpu_unit .flags & UNIT_CPU_VERBOSE )
7191
+ sim_printf ("SD Systems ExpandoRAM Selected\n" );
7192
+ sim_map_resource (0xff , 1 , RESOURCE_TYPE_IO , & bankseldev , "bankseldev" , FALSE);
7193
+ break ;
7174
7194
case 0 :
7175
7195
default :
7176
7196
if (cpu_unit .flags & UNIT_CPU_VERBOSE )
@@ -7521,11 +7541,21 @@ static t_stat cpu_hex_load(FILE *fileref, CONST char *cptr, CONST char *fnam, in
7521
7541
char linebuf [1024 ], datastr [1024 ], * bufptr ;
7522
7542
int32 bytecnt , rectype , databyte , chksum , line = 0 , cnt = 0 ;
7523
7543
uint32 makeROM = FALSE;
7524
- t_addr addr , org = 0 ;
7544
+ t_addr addr , start = 0 , offset = 0 , org = -1 ;
7545
+ CONST char * result ;
7525
7546
7526
7547
get_glyph (cptr , gbuf , 0 );
7527
7548
if (strcmp (gbuf , "ROM" ) == 0 ) {
7528
7549
makeROM = TRUE;
7550
+ } else {
7551
+ start = strtotv (cptr , & result , 16 ) & ADDRMASKEXTENDED ;
7552
+ if (cptr != result )
7553
+ org = start ;
7554
+ while (isspace (* result ))
7555
+ result ++ ;
7556
+ get_glyph (result , gbuf , 0 );
7557
+ if (strcmp (gbuf , "ROM" ) == 0 )
7558
+ makeROM = TRUE;
7529
7559
}
7530
7560
7531
7561
while (!feof (fileref )) {
@@ -7556,16 +7586,20 @@ static t_stat cpu_hex_load(FILE *fileref, CONST char *cptr, CONST char *fnam, in
7556
7586
datastr [sizeof (datastr ) - 1 ] = '\0' ;
7557
7587
7558
7588
if ((rectype == 0 ) && (bytecnt > 0 ) && (addr + bytecnt <= MAXMEMORY )) {
7559
- if (cnt == 0 )
7560
- org = addr ;
7589
+ if (cnt == 0 ) {
7590
+ if (org == -1 )
7591
+ org = addr ;
7592
+ else
7593
+ offset = org - addr ;
7594
+ }
7561
7595
7562
7596
do {
7563
7597
if (sscanf (bufptr , "%2x" , & databyte ) != 1 ) {
7564
7598
return sim_messagef (SCPE_IERR , "Hex file format error at line %d\n" , line );
7565
7599
}
7566
7600
bufptr += 2 ;
7567
7601
7568
- PutBYTEasROMorRAM (addr ++ , databyte , makeROM );
7602
+ PutBYTEasROMorRAM (offset + addr ++ , databyte , makeROM );
7569
7603
7570
7604
chksum += databyte ;
7571
7605
cnt ++ ;
0 commit comments