… | |
… | |
98 | |
98 | |
99 | ############################################################################# |
99 | ############################################################################# |
100 | # 8085 CPU registers and I/O support |
100 | # 8085 CPU registers and I/O support |
101 | |
101 | |
102 | # 8080/8085 registers |
102 | # 8080/8085 registers |
103 | # b, c, d, e, h, l, a |
|
|
104 | my ($A, $B, $C, $D, $E, $H, $L, $A); |
103 | my ($A, $B, $C, $D, $E, $H, $L); |
105 | my ($PC, $SP, $IFF, $FA, $FZ, $FS, $FP, $FC); |
104 | my ($PC, $SP, $IFF, $FA, $FZ, $FS, $FP, $FC); |
106 | |
105 | |
107 | my $RST = 0; # 8080 pending interrupts |
106 | my $RST = 0; # 8080 pending interrupts |
108 | my $INTMASK = 7; # 8085 half interrupts |
107 | my $INTMASK = 7; # 8085 half interrupts |
109 | my $INTPEND = 0; # 8085 half interrupts |
108 | my $INTPEND = 0; # 8085 half interrupts |
110 | |
|
|
111 | my $x; # dummy temp for instructions |
|
|
112 | |
109 | |
113 | my $CLK; # rather inexact clock |
110 | my $CLK; # rather inexact clock |
114 | |
111 | |
115 | ############################################################################# |
112 | ############################################################################# |
116 | # the dreaded NVR1400 chip. not needed to get it going, but provided anyway |
113 | # the dreaded NVR1400 chip. not needed to get it going, but provided anyway |
… | |
… | |
292 | sub in_17 { 0xff } # vt102 unknown, printer status clear by reading? |
289 | sub in_17 { 0xff } # vt102 unknown, printer status clear by reading? |
293 | sub in_1b { 0xff } # vt102 unknown |
290 | sub in_1b { 0xff } # vt102 unknown |
294 | |
291 | |
295 | ############################################################################# |
292 | ############################################################################# |
296 | # 8085 cpu opcodes and flag handling |
293 | # 8085 cpu opcodes and flag handling |
|
|
294 | |
|
|
295 | my $x; # dummy scratchpad for opcodes |
297 | |
296 | |
298 | sub sf { # set flags (ZSC - AP not implemented) |
297 | sub sf { # set flags (ZSC - AP not implemented) |
299 | $FS = $_[0] & 0x080; |
298 | $FS = $_[0] & 0x080; |
300 | $FZ = !($_[0] & 0x0ff); |
299 | $FZ = !($_[0] & 0x0ff); |
301 | $FC = $_[0] & 0x100; |
300 | $FC = $_[0] & 0x100; |
… | |
… | |
747 | eval "use integer; sub { $insn }" or die "$insn: $@" |
746 | eval "use integer; sub { $insn }" or die "$insn: $@" |
748 | })->(); |
747 | })->(); |
749 | |
748 | |
750 | ++$CLK; |
749 | ++$CLK; |
751 | |
750 | |
752 | # things we do from time too time only |
751 | # things we do from time to time only |
753 | unless ($CLK & 0xf) { |
752 | unless ($CLK & 0xf) { |
754 | # do I/O |
753 | # do I/O |
755 | |
754 | |
756 | unless ($CLK & 0xfff) { |
755 | unless ($CLK & 0xfff) { |
757 | |
756 | |
… | |
… | |
801 | # 6.5 vt125 mb7 read ready (something modem?) |
800 | # 6.5 vt125 mb7 read ready (something modem?) |
802 | # 7.5 vt125 mb7 vblank h(?) |
801 | # 7.5 vt125 mb7 vblank h(?) |
803 | # trap vt125 mbi init h(?) |
802 | # trap vt125 mbi init h(?) |
804 | my $vec; |
803 | my $vec; |
805 | |
804 | |
806 | $x = $INTPEND & ~$INTMASK; |
805 | my $pend = $INTPEND & ~$INTMASK; |
807 | |
806 | |
808 | if ($x & 1) { $vec = 0x2c; $INTPEND &= ~1; |
807 | if ($pend & 1) { $vec = 0x2c; $INTPEND &= ~1; |
809 | } elsif ($x & 2) { $vec = 0x34; $INTPEND &= ~2; |
808 | } elsif ($pend & 2) { $vec = 0x34; $INTPEND &= ~2; |
810 | } elsif ($x & 4) { $vec = 0x3c; $INTPEND &= ~4; |
809 | } elsif ($pend & 4) { $vec = 0x3c; $INTPEND &= ~4; |
811 | # } elsif ($RST ) { $vec = $RST * 8; $RST = 0; # the vt102 firmware doesn't like combined interrupts |
810 | # } elsif ($RST ) { $vec = $RST * 8; $RST = 0; # the vt102 firmware doesn't like combined interrupts |
812 | } elsif ($RST & 1) { $vec = 0x08; $RST &= ~1; # separate is better for vt102 |
811 | } elsif ($RST & 1) { $vec = 0x08; $RST &= ~1; # separate is better for vt102 |
813 | } elsif ($RST & 2) { $vec = 0x10; $RST &= ~2; |
812 | } elsif ($RST & 2) { $vec = 0x10; $RST &= ~2; |
814 | } elsif ($RST & 4) { $vec = 0x20; $RST &= ~4; |
813 | } elsif ($RST & 4) { $vec = 0x20; $RST &= ~4; |
815 | } else { |
814 | } else { |