ORG 00000H
;---------------------------------------;
;
;---------------------------------------;
Y7EB0 EQU 07EB0H ; DW
Y7EB2 EQU 07EB2H ; DB
Y7EB3 EQU 07EB3H ; DW
Y7EB5 EQU 07EB5H ; DB
Y7EB6 EQU 07EB6H ; DB
Y7EB7 EQU 07EB7H ; DB
Y7EB8 EQU 07EB8H ; DB
Y7EB9 EQU 07EB9H ; DW
Y7EBB EQU 07EBBH ; DB
Y7EBC EQU 07EBCH ; DB
X8000 EQU 08000H
;---------------------------------------;
;8080 Boot-up at address 0000h
;---------------------------------------;
0000 F3 DI ;disable interrupt if runaway to here
0001 F3 DI ;same but if 2byte opcode skewed
0002 97 SUB A ;clear accumulator
0003 D303 OUT (003H),A ;output port 03 <-- 000h
0005 31AF7E LD SP,07EAFH ;set stack near top of 6000-7FFFh block
;ram variables and buffers at 7EB0-7FFFh
0008 DB01 IN A,(001H) ;input port 01 b0
000A 1F RRA ;rotate b0 into Carry
;---------------------------------------;
;Assume this is a jump to ram after a program has been loaded from the disk
;---------------------------------------;
000B D20080 JP NC,X8000 ;execute at 8000h if b0=0
;---------------------------------------;
;Otherwise process until disk program is loaded.
;---------------------------------------;
000E 3E0C LD A,00CH ;value to write at port 16
0010 D316 OUT (016H),A ;output port 16 <-- 00Ch
0012 3E64 LD A,064H ;100dec
0014 CDE701 CALL DELAYA ;call delay function at 01E7h
0017 DB05 WAIT: IN A,(005H) ;input port 05 b0 b1
0019 E603 AND 003H ;filter for b1.b0
001B C22900 JP NZ,A0029 ;exit WAIT Loop when either bit high to A0029
;b1.b0 may be status disk loaded in drive A and B
001E 3E0B LD A,00BH ;value for port B (must be drive related?)
0020 D304 OUT (004H),A ;output port 04 <-- 00Bh
0022 3E03 LD A,003H ;value for port B (must be drive related?)
0024 D304 OUT (004H),A ;output port 04 <-- 003h
0026 C31700 JP WAIT ;go back as scan for diskette?
;---------------------------------------;
;Condition met, delay and test again before proceding else begin condition test again
;---------------------------------------;
0029 3E19 A0029: LD A,019H ;VALUE FOR LOOP DELAYA FUNCTION
002B CDE701 CALL DELAYA ;DO DELAYA THEN ASSURE DISKS STILL IN DRIVE
002E DB05 IN A,(005H) ;input port 05 b0 b1
0030 E603 AND 003H ;value for port B (must be drive related?)
0032 CA1700 JP Z,WAIT ;if neither disk ready, go back to WAIT again
;---------------------------------------;
;Assumed disk in drive for duration. First wait condition fully met. Proceed.
;A={1,2,3}
;---------------------------------------;
0035 47 LD B,A ;save pattern of available drives in register B
0036 3D DEC A
0037 0F RRCA
0038 F60C OR 00CH
003A B0 OR B
003B D316 OUT (016H),A ;output port 16 <-- 0xxh
003D 32B57E LD (Y7EB5),A
0040 3E06 LD A,006H
0042 CDE701 CALL DELAYA
0045 CDA901 CALL A01A9
0048 97 SUB A
0049 32B77E LD (Y7EB7),A
004C 3C INC A
004D 32B87E LD (Y7EB8),A
0050 21BD7E LD HL,07EBDH
0053 CD0A01 CALL A010A
0056 E5 PUSH HL
0057 E1 A0057: POP HL
0058 7E LD A,(HL)
0059 23 INC HL
005A FE0A CP 00AH
005C CA6900 JP Z,A0069
005F FE0B CP 00BH
0061 CAB400 JP Z,A00B4
;---------------------------------------;
;Fill 8000h block with '2' to 8000-9EFFh and HALT forever
;---------------------------------------;
0064 0632 ERROR2: LD B,032H
0066 C3BD00 JP ERRHLT
;---------------------------------------;
;
;---------------------------------------;
0069 0606 A0069: LD B,006H
006B 11B77E LD DE,07EB7H
006E CDDC01 CALL HL2DE
0071 E5 PUSH HL
0072 215D7F A0072: LD HL,07F5DH
0075 CD0A01 CALL A010A
0078 EB EX DE,HL
0079 3E08 LD A,008H
007B 21B77E LD HL,07EB7H
007E 34 INC (HL)
007F 96 SUB (HL)
0080 C28600 JP NZ,A0086
0083 77 LD (HL),A
0084 23 INC HL
0085 34 INC (HL)
0086 3ABC7E A0086: LD A,(Y7EBC)
0089 B7 OR A
008A C29500 JP NZ,A0095
008D 3ABB7E LD A,(Y7EBB)
0090 B8 CP B
0091 D29500 JP NC,A0095
0094 47 LD B,A
0095 2AB97E A0095: LD HL,(Y7EB9)
0098 EB EX DE,HL
0099 CDDC01 CALL HL2DE
009C EB EX DE,HL
009D 22B97E LD (Y7EB9),HL
00A0 2ABB7E LD HL,(Y7EBB)
00A3 7D LD A,L
00A4 90 SUB B
00A5 6F LD L,A
00A6 7C LD A,H
00A7 DE00 SBC A,000H
00A9 67 LD H,A
00AA 22BB7E LD (Y7EBB),HL
00AD B5 OR L
00AE C27200 JP NZ,A0072
00B1 C35700 JP A0057
;---------------------------------------;
;
;---------------------------------------;
00B4 5E A00B4: LD E,(HL)
00B5 23 INC HL
00B6 56 LD D,(HL)
00B7 23 INC HL
00B8 E5 PUSH HL
00B9 EB EX DE,HL
00BA E9 JP (HL)
;---------------------------------------;
;Fill 8000h block with '0' to 8000-9EFFh and HALT forever
;---------------------------------------;
00BB 0630 ERROR0: LD B,030H ;this isn't an 8080 opcode, ascii "0" (zero)
00BD 210080 ERRHLT: LD HL,08000H ;point to Dram at 8000h
00C0 3E9F LD A,09FH ;load loop exit value
00C2 70 ERRHL0: LD (HL),B ;write 030h to Dram 8000-9FFFh
00C3 23 INC HL ;bump Dram pointer
00C4 BC CP H ;09Fh-09Fh=0 is Positive so takes the jump
00C5 F2C200 JP P,ERRHL0 ;loop till H=A0h
00C8 3E08 LD A,008H ;value to port 04
00CA D304 OUT (004H),A ;output port 04 <-- 008h
00CC 76 HALT ;8080 exits only if INT but no EI in Prom
;HALT forever
;---------------------------------------;
;
;---------------------------------------;
00CD 0E32 A00CD: LD C,032H
00CF 3AB67E A00CF: LD A,(Y7EB6)
00D2 47 LD B,A
00D3 3AB87E LD A,(Y7EB8)
00D6 57 LD D,A
00D7 FE46 CP 046H
00D9 D46400 CALL NC,ERROR2
00DC 97 SUB A
00DD 7A LD A,D
00DE 1F RRA
00DF 90 SUB B
00E0 C8 RET Z
00E1 21B67E LD HL,07EB6H
00E4 17 RLA
00E5 3AB57E LD A,(Y7EB5)
00E8 DAF100 JP C,A00F1
00EB F620 OR 020H
00ED 34 INC (HL)
00EE C3F400 JP A00F4
;---------------------------------------;
;
;---------------------------------------;
00F1 E6DF A00F1: AND 0DFH
00F3 35 DEC (HL)
00F4 D316 A00F4: OUT (016H),A ;output port 16 <-- 0xxh
00F6 32B57E LD (Y7EB5),A
00F9 D314 OUT (014H),A ;output port 14 <-- 0xxh
00FB 3E07 LD A,007H
00FD CDE701 CALL DELAYA
0100 0D DEC C
0101 C2CF00 JP NZ,A00CF
0104 CDA901 CALL A01A9
0107 C3CD00 JP A00CD
;---------------------------------------;
;
;---------------------------------------;
010A 22B07E A010A: LD (Y7EB0),HL
010D 1E0A LD E,00AH
010F D5 PUSH DE
0110 CDCD00 CALL A00CD
0113 D1 POP DE
0114 3AB77E LD A,(Y7EB7)
0117 4F LD C,A
0118 0600 LD B,000H
011A 3AB87E LD A,(Y7EB8)
011D 21A101 LD HL,T01A1
0120 1F RRA
0121 DA2701 JP C,A0127
0124 219901 LD HL,T0199
0127 09 A0127: ADD HL,BC
0128 7E LD A,(HL)
0129 32B27E LD (Y7EB2),A
012C 3AB27E A012C: LD A,(Y7EB2)
012F 2AB07E LD HL,(Y7EB0)
0132 D315 OUT (015H),A ;output port 15 <-- 0xxh
0134 3EDB LD A,0DBH
0136 D311 OUT (011H),A ;output port 11 <-- 0DBh
0138 3E42 LD A,042H
013A D328 OUT (028H),A ;output port 28 <-- 042H
013C 3E9B LD A,09BH
013E D323 OUT (023H),A ;output port 23 <-- 09Bh
0140 3E40 LD A,040H
0142 D323 OUT (023H),A ;output port 23 <-- 040H
0144 7D LD A,L
0145 D322 OUT (022H),A ;output port 22 <-- 0xxh
0147 7C LD A,H
0148 D322 OUT (022H),A ;output port 22 <-- 0xxh
014A 3AB57E LD A,(Y7EB5)
014D F610 OR 010H
014F E6BF AND 0BFH
0151 32B57E LD (Y7EB5),A
0154 D316 OUT (016H),A ;output port 16 <-- 0xxh
0156 D317 OUT (017H),A ;output port 17 <-- 0xxh
0158 DB05 A0158: IN A,(005H) ;input port 05 b7
015A 17 RLA
015B DA5801 JP C,A0158
015E 23 INC HL
015F 0602 LD B,002H
0161 CDC601 CALL A01C6
0164 2B DEC HL
0165 3AB27E LD A,(Y7EB2)
0168 BE CP (HL)
0169 C29201 JP NZ,A0192
016C 2B DEC HL
016D 3AB87E LD A,(Y7EB8)
0170 BE CP (HL)
0171 C29201 JP NZ,A0192
0174 23 INC HL
0175 23 INC HL
0176 23 INC HL
0177 0696 LD B,096H
0179 3AB77E LD A,(Y7EB7)
017C B7 OR A
017D C28801 JP NZ,A0188
0180 0611 LD B,011H
0182 CDC601 CALL A01C6
0185 0684 LD B,084H
0187 23 INC HL
0188 22B37E A0188: LD (Y7EB3),HL
018B CDC601 CALL A01C6
018E 2AB37E LD HL,(Y7EB3)
0191 C9 RET
;---------------------------------------;
;
;---------------------------------------;
0192 1D A0192: DEC E
0193 C22C01 JP NZ,A012C
0196 C3BB00 JP ERROR0
;---------------------------------------;
;
;---------------------------------------;
0199 00 T0199: DB 00,03,06,09,0C,0F,02,05
01A1 08 T01A1: DB 08,0B,0E,01,04,07,0A,0D
;---------------------------------------;
;
;---------------------------------------;
01A9 97 A01A9: SUB A
01AA 32B67E LD (Y7EB6),A
01AD 3AB57E LD A,(Y7EB5)
01B0 E6DF AND 0DFH
01B2 D316 OUT (016H),A ;output port 16 <-- 0xxh
01B4 32B57E LD (Y7EB5),A
;---------------------------------------;
;Wait for port 4 b4 to go high, then return
;---------------------------------------;
01B7 DB05 WAITB4: IN A,(005H) ;input port 05 b4
01B9 E610 AND 010H ;test b5 only
01BB C0 RET NZ ;exit loop when port 5 b4 is high
01BC D314 OUT (014H),A ;output port 14 <-- 0xxh
01BE 3E07 LD A,007H ;
01C0 CDE701 CALL DELAYA ;wait and try again
01C3 C3B701 JP WAITB4 ;
;---------------------------------------;
;
;---------------------------------------;
01C6 C5 A01C6: PUSH BC
01C7 97 SUB A
01C8 86 A01C8: ADD A,(HL)
01C9 23 INC HL
01CA 05 DEC B
01CB C2C801 JP NZ,A01C8
01CE C1 POP BC
01CF BE CP (HL)
01D0 C8 RET Z
01D1 0631 LD B,031H
01D3 1D DEC E
01D4 CABD00 JP Z,ERRHLT ;ERROR1
01D7 212C01 LD HL,A012C
01DA E3 EX (SP),HL
01DB C9 RET
;---------------------------------------;
;BLOCK MOVE (HL)-->(DE) Countdown B
;---------------------------------------;
01DC C5 HL2DE: PUSH BC ;save B
01DD 7E HLOOP: LD A,(HL) ;copy from (HL)
01DE 12 LD (DE),A ;copy to (DE)
01DF 23 INC HL ;bump
01E0 13 INC DE ;bump
01E1 05 DEC B ;countdown B
01E2 C2DD01 JP NZ,HLOOP ;loop till down
01E5 C1 POP BC ;restore B
01E6 C9 RET ;return
;---------------------------------------;
;OPCODE DELAYA LOOP:
;---------------------------------------;
01E7 1ECF DELAYA: LD E,0CFH
01E9 E3 DELAY0: EX (SP),HL
01EA E3 EX (SP),HL
01EB 1D DEC E
01EC C2E901 JP NZ,DELAY0
01EF 3D DEC A
01F0 C2E701 JP NZ,DELAYA
01F3 C9 RET
;---------------------------------------;
; >> NO EXECUTION PATH TO HERE <<
;---------------------------------------;
01F4 00 NOP
01F5 00 NOP
01F6 00 NOP
01F7 00 NOP
01F8 00 NOP
01F9 00 NOP
01FA 00 NOP
01FB 00 NOP
01FC 00 NOP
01FD 00 NOP
01FE 00 NOP
01FF 00 NOP
0200 00 NOP
;---------------------------------------;
;
;---------------------------------------;
END
;
; UNRESOLVED LABELS
;
; LABLE CROSS REFRENCE
;WAIT A0026 A0032
;A0029 A001B
;A0057 A00B1
;ERROR2 A00D9
;A0069 A005C
;A0072 A00AE
;A0086 A0080
;A0095 A008A A0091
;A00B4 A0061
;ERROR0 A0196
;ERRHLT A0066 A01D4
;ERRHL0 A00C5
;A00CD A0107 A0110
;A00CF A0101
;A00F1 A00E8
;A00F4 A00EE
;A010A A0053 A0075
;A0127 A0121
;A012C A0193 T01D7
;A0158 A015B
;A0188 A017D
;A0192 A0169 A0171
;T0199 T0124
;T01A1 T011D
;A01A9 A0045 A0104
;WAITB4 A01C3
;A01C6 A0161 A0182 A018B
;A01C8 A01CB
;HL2DE A006E A0099
;HLOOP A01E2
;DELAYA A0014 A002B A0042 A00FD
; A01C0 A01F0
;DELAY0 A01EC
;Z7EAF Z0005
;Y7EB0 Y010A Y012F
;Y7EB2 Y0129 Y012C Y0165
;Y7EB3 Y0188 Y018E
;Y7EB5 Y003D Y00E5 Y00F6 Y014A
; Y0151 Y01AD Y01B4
;Y7EB6 Y00CF Z00E1 Y01AA
;Y7EB7 Y0049 Z006B Z007B Y0114
; Y0179
;Y7EB8 Y004D Y00D3 Y011A Y016D
;Y7EB9 Y0095 Y009D
;Y7EBB Y008D Y00A0 Y00AA
;Y7EBC Y0086
;Z7EBD Z0050
;Z7F5D Z0072
;X8000 X000B Z00BD