AltairZ80: Implemented proper memory refresh register R semantics

This commit is contained in:
Peter Schorn 2016-12-17 12:24:12 +01:00
parent 76103cf760
commit a2d900e62b
2 changed files with 37 additions and 1 deletions

View file

@ -123,6 +123,9 @@
} \
}
/* increase R by val */
#define INCR(val) IR_S = (IR_S & ~0x7f) | ((IR_S + (val)) & 0x7f)
extern int32 sio0s (const int32 port, const int32 io, const int32 data);
extern int32 sio0d (const int32 port, const int32 io, const int32 data);
extern int32 sio1s (const int32 port, const int32 io, const int32 data);
@ -294,7 +297,7 @@ REG cpu_reg[] = {
}, /* 13 */
{ GRDATAD (IFF, IFF_S, 2, 2, 0, "Z80 Interrupt Flip Flop register")
}, /* 6 */
{ FLDATAD (IR, IR_S, 8, "8Z80 Interrupt (upper) / Refresh (lower) register")
{ HRDATAD (IR, IR_S, 16, "Z80 Interrupt (upper) / Refresh (lower) register")
}, /* 7 */
// 8086 registers
@ -2173,6 +2176,7 @@ static t_stat sim_instr_mmu (void) {
}
PCX = PC;
INCR(1);
switch(RAM_PP(PC)) {
@ -3550,6 +3554,8 @@ static t_stat sim_instr_mmu (void) {
break;
}
}
INCR(1);
adr = HL;
switch ((op = GetBYTE(PC)) & 7) {
@ -3857,6 +3863,8 @@ static t_stat sim_instr_mmu (void) {
break;
}
}
INCR(1);
switch (RAM_PP(PC)) {
case 0x09: /* ADD IX,BC */
@ -4683,6 +4691,8 @@ static t_stat sim_instr_mmu (void) {
break;
}
}
INCR(1);
switch (RAM_PP(PC)) {
case 0x40: /* IN B,(C) */
@ -5144,6 +5154,7 @@ static t_stat sim_instr_mmu (void) {
BC = 0x10000;
do {
tStates += 21;
INCR(2);
CHECK_BREAK_TWO_BYTES(HL, DE);
acu = RAM_PP(HL);
PUT_BYTE_PP(DE, acu);
@ -5160,6 +5171,7 @@ static t_stat sim_instr_mmu (void) {
BC = 0x10000;
do {
tStates += 21;
INCR(1);
CHECK_BREAK_BYTE(HL);
temp = RAM_PP(HL);
op = --BC != 0;
@ -5181,6 +5193,7 @@ static t_stat sim_instr_mmu (void) {
temp = 0x100;
do {
tStates += 21;
INCR(1);
CHECK_BREAK_BYTE(HL);
acu = in(LOW_REGISTER(BC));
PutBYTE(HL, acu);
@ -5198,6 +5211,7 @@ static t_stat sim_instr_mmu (void) {
temp = 0x100;
do {
tStates += 21;
INCR(1);
CHECK_BREAK_BYTE(HL);
acu = GetBYTE(HL);
out(LOW_REGISTER(BC), acu);
@ -5215,6 +5229,7 @@ static t_stat sim_instr_mmu (void) {
BC = 0x10000;
do {
tStates += 21;
INCR(2);
CHECK_BREAK_TWO_BYTES(HL, DE);
acu = RAM_MM(HL);
PUT_BYTE_MM(DE, acu);
@ -5231,6 +5246,7 @@ static t_stat sim_instr_mmu (void) {
BC = 0x10000;
do {
tStates += 21;
INCR(1);
CHECK_BREAK_BYTE(HL);
temp = RAM_MM(HL);
op = --BC != 0;
@ -5252,6 +5268,7 @@ static t_stat sim_instr_mmu (void) {
temp = 0x100;
do {
tStates += 21;
INCR(1);
CHECK_BREAK_BYTE(HL);
acu = in(LOW_REGISTER(BC));
PutBYTE(HL, acu);
@ -5269,6 +5286,7 @@ static t_stat sim_instr_mmu (void) {
temp = 0x100;
do {
tStates += 21;
INCR(1);
CHECK_BREAK_BYTE(HL);
acu = GetBYTE(HL);
out(LOW_REGISTER(BC), acu);
@ -5388,6 +5406,8 @@ static t_stat sim_instr_mmu (void) {
break;
}
}
INCR(1);
switch (RAM_PP(PC)) {
case 0x09: /* ADD IY,BC */

View file

@ -101,6 +101,9 @@
} \
}
/* increase R by val */
#define INCR(val) IR_S = (IR_S & ~0x7f) | ((IR_S + (val)) & 0x7f)
/* function prototypes */
t_stat sim_instr_nommu(void);
@ -1032,6 +1035,7 @@ t_stat sim_instr_nommu(void) {
}
PCX = PC;
INCR(1);
sim_interval--;
switch(RAM_PP(PC)) {
@ -2118,6 +2122,7 @@ t_stat sim_instr_nommu(void) {
case 0xcb: /* CB prefix */
CHECK_CPU_8080;
INCR(1);
adr = HL;
switch ((op = GET_BYTE(PC)) & 7) {
@ -2354,6 +2359,7 @@ t_stat sim_instr_nommu(void) {
case 0xdd: /* DD prefix */
CHECK_CPU_8080;
INCR(1);
switch (RAM_PP(PC)) {
case 0x09: /* ADD IX,BC */
@ -3020,6 +3026,7 @@ t_stat sim_instr_nommu(void) {
case 0xed: /* ED prefix */
CHECK_CPU_8080;
INCR(1);
switch (RAM_PP(PC)) {
case 0x40: /* IN B,(C) */
@ -3410,6 +3417,7 @@ t_stat sim_instr_nommu(void) {
if (BC == 0)
BC = 0x10000;
do {
INCR(2);
acu = RAM_PP(HL);
PUT_BYTE_PP(DE, acu);
} while (--BC);
@ -3423,6 +3431,7 @@ t_stat sim_instr_nommu(void) {
if (BC == 0)
BC = 0x10000;
do {
INCR(1);
temp = RAM_PP(HL);
op = --BC != 0;
sum = acu - temp;
@ -3441,6 +3450,7 @@ t_stat sim_instr_nommu(void) {
if (temp == 0)
temp = 0x100;
do {
INCR(1);
acu = in(LOW_REGISTER(BC));
PUT_BYTE(HL, acu);
++HL;
@ -3455,6 +3465,7 @@ t_stat sim_instr_nommu(void) {
if (temp == 0)
temp = 0x100;
do {
INCR(1);
acu = GET_BYTE(HL);
out(LOW_REGISTER(BC), acu);
++HL;
@ -3469,6 +3480,7 @@ t_stat sim_instr_nommu(void) {
if (BC == 0)
BC = 0x10000;
do {
INCR(2);
acu = RAM_MM(HL);
PUT_BYTE_MM(DE, acu);
} while (--BC);
@ -3482,6 +3494,7 @@ t_stat sim_instr_nommu(void) {
if (BC == 0)
BC = 0x10000;
do {
INCR(1);
temp = RAM_MM(HL);
op = --BC != 0;
sum = acu - temp;
@ -3500,6 +3513,7 @@ t_stat sim_instr_nommu(void) {
if (temp == 0)
temp = 0x100;
do {
INCR(1);
acu = in(LOW_REGISTER(BC));
PUT_BYTE(HL, acu);
--HL;
@ -3514,6 +3528,7 @@ t_stat sim_instr_nommu(void) {
if (temp == 0)
temp = 0x100;
do {
INCR(1);
acu = GET_BYTE(HL);
out(LOW_REGISTER(BC), acu);
--HL;
@ -3594,6 +3609,7 @@ t_stat sim_instr_nommu(void) {
case 0xfd: /* FD prefix */
CHECK_CPU_8080;
INCR(1);
switch (RAM_PP(PC)) {
case 0x09: /* ADD IY,BC */