Files
SharpMZ/software/asm/mz80kfdif.asm
Philip Smart 4a64af4a00 Initial commit
2019-10-25 17:16:34 +01:00

661 lines
19 KiB
NASM

;
; MZ-80K FDC ROM
;
ORG F000H
F000 00 NOP
F001 F3 DI
F002 AF XOR A
F003 329C11 LD (#119C),A ;clock off
F006 3EC3 LD A,#C3 ;JP code for error trap
F008 320B10 LD (#100B),A
F00B 215AF0 LD HL,#F05A ;error can't boot
F00E 220C10 LD (#100C),HL ;error trap
F011 11F09F LD DE,#9FF0 ;transfer 9 bytes from
F014 2187F0 LD HL,#F087 ;ROM to RAM for use
;
;IBT1
;
F017 010900 IBT1: LD BC,#0009 ;by (IX+D) in reader
F01A EDB0 LDIR
F01C CD0900 CALL CRLF ;NL
F01F 117AF0 LD DE,MESS1
F022 CD1500 CALL MESSAGE ;msg "BOOT DRIVE ?"
F025 11009F LD DE,BUFF2
F028 CD0300 CALL USER ;get line
F02B 210C00 LD HL,#000C
F02E 19 ADD HL,DE ;skip around msg
F02F 7E LD A,(HL) ;pickup answer to prompt
F030 FE0D CP #0D ;CR ?
F032 2002 JR NZ,#F036 ;Z=CR assume drive 1
F034 3E31 LD A,#31 ;ASCII for 1
;
;IBT2
;
F036 47 IBT2: LD B,A ;save driveno
F037 E6F0 AND #F0 ;take ASCII and convert
F039 FE30 CP #30 ;to numeric having
F03B 20DF JR NZ,IBT1 ;checked >1 & <=4
F03D 78 LD A,B ;get driveno
F03E E60F AND #0F ;mask
F040 3D DEC A ;-1 00-03
F041 FE04 CP #04
F043 30D7 JR NC,IBT1 ;dud key, >=4, try again
F045 32F09F LD (#9FF0),A ;save drive no
F048 321110 LD (#1011),A ;save drive no
F04B DD21F09F LD IX,#9FF0 ;IX pointer to fdc parameters at 9FF0
;ready for disk read
F04F CD3BF1 CALL READER ;get boot records
F052 3A0098 LD A,(#9800) ;1st byte of input buffer of boot records
F055 FEC3 CP #C3 ;jump cmd?
F057 CA0098 JP Z,#9800 ;yes, execute to 9800
;
;IBT3
;
F05A 31F010 IBT3: LD SP,#10F0 ;no, reset stack
F05D CD0900 CALL CRLF ;NL
F060 116CF0 LD DE,MESS2 ;msg can't boot
F063 CD1500 CALL MESSAGE
F066 CDA7F0 CALL MOTOFF ;motor off
F069 C38200 JP MAINLP ;warm start, ret to monitor
;
;MESS2
;
F06C 45523A43 MESS2: DB "ER:CAN'T BOOT"
F070 414E2754
F074 20424F4F
F078 54
F079 0D DB 0DH
;
;MESS1
;
F07A 424F4F54 DB "BOOT DRIVE ?"
F07E 20445249
F082 5645203F
F086 0D DB 0DH
;
;DDATA
;fdc parameters
;
F087 00 DB 00H ;drive no-1
F088 00 DB 00H ;trk*2 remainder = head
F089 01 DB 01H ;sector no (range: 01 - 10)
F08A 00 DB 00H ;$80 = add 1 record to read to (F08B)
F08B 0700 DB 07H ;07H = 07*2 = 14 sectors to read, add 1 if (F08A = $80)
F08D 0098 DB 00H,98H ;9800H = load addr.
F08F 00 DB 00H ;no meaning
;
;MOTON
;
F090 C5 MOTON: PUSH BC ;starts motors
F091 01F808 LD BC,#08F8
F094 ED78 IN A,(C) ;start motor
F096 010000 LD BC,#0000
;
;WAIT1
;
F099 0B WAIT1: DEC BC ;wait for motor to
F09A 00 NOP ;get up to speed
F09B 00 NOP
F09C 78 LD A,B
F09D B1 OR C
F09E 20F9 JR NZ,WAIT1
F0A0 3E01 LD A,#01
F0A2 320210 LD (MOTFLG),A ;01=on 00=off
F0A5 C1 POP BC
F0A6 C9 RET
;
;MOTOFF
;
F0A7 C5 MOTOFF: PUSH BC ;stop motors
F0A8 CDAEF1 CALL LNGDEL ;timed wait
F0AB 01F800 LD BC,#00F8
F0AE ED78 IN A,(C)
F0B0 C1 POP BC
F0B1 C9 RET
;
;SKZERO
;
F0B2 CDBDF0 SKZERO: CALL DREADY ;seek track 0
F0B5 AF XOR A
F0B6 D3F9 OUT (#F9),A ;clear track reg
F0B8 320010 LD (#1000),A
F0BB D3FA OUT (#FA),A ;send seek zero code
;
;DREADY
;
F0BD C5 DREADY: PUSH BC
F0BE 010000 LD BC,#0000
;
;DRY1
;
F0C1 DBF9 DRY1: IN A,(#F9) ;get DRDY, CRDY, RQM
F0C3 E603 AND #03 ;leave DRDY, CRDY
;
;DRY2
;
F0C5 FE02 DRY2: CP #02 ;wait for DRDY & CRDY
F0C7 2002 JR NZ,WAIT2 ;no, =03
F0C9 C1 POP BC ;yes, =02
F0CA C9 RET
;
;WAIT2
;
F0CB 0B WAIT2: DEC BC
F0CC 78 LD A,B
F0CD B1 OR C
F0CE 20F1 JR NZ,DRY1
F0D0 C1 POP BC
F0D1 3E32 LD A,#32
F0D3 320810 LD (#1008),A ;error 40 (not found)
F0D6 C30B10 JP #100B ;error can't boot
;
;STATUS
;
F0D9 DBFA STATUS: IN A,(#FA) ;read status
F0DB E6F0 AND #F0
F0DD 07 RLCA
F0DE 30F9 JR NC,STATUS ;wait for CRDY
F0E0 E6F0 AND #F0 ;mask leave CRDY, S1, S2, S3
F0E2 0F RRCA ;move right until S§
F0E3 0F RRCA ;is in B0
F0E4 0F RRCA
F0E5 0F RRCA
F0E6 B7 OR A ;clear flags
F0E7 C8 RET Z ;Z=ok
F0E8 FE0C CP #0C ;0C=drive not ready etc.
F0EA 2004 JR NZ,STS1
F0EC 3E32 LD A,#32 ;error code 40 (not found)
F0EE 180A JR STS3
;
STS1
;
F0F0 FE04 STS1: CP #04 ;04=ID not found
F0F2 2004 JR NZ,STS2
F0F4 3E36 LD A,#36 ;error code 54 (unformat error)
F0F6 1802 JR STS3
;
;STS2
;
F0F8 3E29 STS2: LD A,#29
F0FA 320810 LD (#1008),A ;error code 41 disk hw error
F0FD 37 SCF
F0FE C9 RET
;
;PRMDRV
;
F0FF C5 PRMDRV: PUSH BC ;prime drive
F100 E5 PUSH HL
F101 CD90F0 CALL MOTON
F104 DD7E00 LD A,(IX+#00) ;get drive no-1
F107 E603 AND #03 ;form drive code
F109 F61C OR #1C ;set TND, MOTOR, SELECT BIT
F10B 320110 LD (#1001),A ;keep drive code
F10E E60F AND #0F ;mask out TND
F110 47 LD B,A
F111 0EF8 LD C,#F8
F113 ED60 IN H,(C) ;select drive
F115 3E32 LD A,#32
;
;PRM1
;
F117 CDAEF1 PRM1: CALL LNGDEL ;wait for head
F11A 3D DEC A :to load
F11B 20FA JR NZ,PRM1
F11D 010000 LD BC,#0000
;
;PRM2
;
F120 DBF9 PRM2: IN A,(#F9) ;get DRDY, CRDY, RQM
F122 E607 AND #07 ;mask out RUBBISH
F124 FE06 CP #06 ;DRDY & CRDY ?
F126 2006 JR NZ,PRM3 ;NZ=no, keep trying
F128 CDB2F0 CALL SKZERO
F12B E1 POP HL
F12C C1 POP BC
F12D C9 RET ;correct exit
;
;PRM3
;
F12E 0B PRM3: DEC BC
F12F 78 LD A,B
F130 B1 OR C
F131 20ED JR NZ,PRM2
F133 3E32 LD A,#32
F135 320810 LD (#1008),A ;error 40 (not found)
F138 C30B10 JP #100B ;abort; error can't boot
;
;READER
;
F13B 3E0A READER: LD A,#0A ;no. of tries
F13D 320710 LD (#1007),A
;
;RDR1
;
F140 CDFFF0 RDR1: CALL PRMDRV
F143 3A0110 LD A,(#1001) ;keep drive in use
F146 47 LD B,A
F147 0EF8 LD C,#F8
F149 D9 EXX ;save all regs
F14A 0EFB LD C,#FB ;port fb??
F14C DD5E03 LD E,(IX+#03) ;no meaning
F14F DD5604 LD D,(IX+#04) ;get half of numbers to read (7)
F152 CB13 RL E ;B7 to carry
F154 CB12 RL D ;double number of sectors (14), add carry
F156 1E03 LD E,#03 ;no meaning
F158 DD6E05 LD L,(IX+#05) ;get loading address lo
F15B DD6606 LD H,(IX+#06) ;hi into HL
F15E CDBDF0 CALL DREADY
F161 AF XOR A ;no meaning
F162 DD7E01 LD A,(IX+#01) ;get track to read
F165 1F RRA ;divide by 2, remainder to carry = head no.
F166 D3F9 OUT (#F9),A ;send track to FDC
F168 DD7E02 LD A,(IX+#02) ;sector number
F16B 3002 JR NC,RDR2
F16D F680 OR #80 ;odds/evens for side code
;
;RDR2
;
F16F D3F8 RDR2: OUT (#F8),A ;send sect+side
F171 CDA6F1 CALL SHTDEL ;short delay
F174 3E70 LD A,#70 ;seek & read code
F176 320010 LD (#1000),A ;keep it
F179 F3 DI
F17A D3FA OUT (#FA),A ;send seek & read code to FDC
;
;RDR3
;
F17C 0680 RDR3: LD B,#80 ;128 bytes/sector
;
;RDR4
;
F17E DBF9 RDR4: IN A,(#F9) ;get DRDY, CRDY, RQM
F180 A3 AND E ;mask with 03
F181 28FB JR Z,RDR4 ;wait for either CRDY/RQM
F183 0F RRCA ;RQM into carry
F184 300C JR NC,RDR5 ;NC=no RQM
F186 EDA2 INI ;get data. port FB to (HL), B=B-1
F188 C27EF1 JP NZ,RDR4 ;do whole sector
F18B 15 DEC D ;dec sector counter
F18C C27CF1 JP NZ,RDR3 ;NZ=more to do
F18F D9 EXX ;restore all regs
F190 ED78 IN A,(C) ;send TND high
;
;RDR5
;
F192 CDD9F0 RDR5: CALL STATUS
F195 D0 RET NC ;NC=good read
F196 3A0710 LD A,(#1007)
F199 3D DEC A ;A try gone
F19A 320710 LD (#1007),A ;counter 10times
F19D CA0B10 JP Z,#100B ;can't read at all abort
F1A0 CDB2F0 CALL SKZERO
F1A3 C340F1 JP RDR1
;
;SHTDEL
;
F1A6 F5 SHTDEL: PUSH AF
F1A7 3E0A LD A,#0A
;
;SDY1
;
F1A9 3D SDY1: DEC A
F1AA 20FD JR NZ,SDY1
F1AC F1 POP AF
F1AD C9 RET
;
;LNGDEL
;
F1AE F5 LNGDEL: PUSH AF ;long delay
F1AF 3E0A LD A,#0A
;
;LDY1
;
F1B1 CDA6F1 LDY1: CALL SHTDEL
F1B4 3D DEC A
F1B5 20FA JR NZ,LDY1
F1B7 F1 POP AF
F1B8 C9 RET
CRLF: EQU 00009H
MESSAGE: EQU 00015H
BUFF2: EQU 9F00H
USER: EQU 00003H
MAINLP: EQU 00082H
MOTFLG: EQU 1002H
END
;
;no meaning !!
;
F1B9 13 INC DE
F1BA 1B DEC DE
F1BB 72 LD (HL),D
F1BC DE42 SBC A,#42
F1BE FB EI
F1BF 2F CPL
F1C0 58 LD E,B
F1C1 43 LD B,E
F1C2 7C LD A,H
F1C3 52 LD D,D
F1C4 3023 JR NC,#F1E9 ; (35)
F1C6 71 LD (HL),C
F1C7 42 LD B,D
F1C8 1020 DJNZ #F1EA ; (32)
F1CA 74 LD (HL),H
F1CB 40 LD B,B
F1CC 43 LD B,E
F1CD 03 INC BC
F1CE 51 LD D,C
F1CF 00 NOP
F1D0 3C INC A
F1D1 42 LD B,D
F1D2 D8 RET C
F1D3 60 LD H,B
F1D4 FB EI
F1D5 09 ADD HL,BC
F1D6 FC402C CALL M,#2C40
F1D9 80 ADD A,B
F1DA 79 LD A,C
F1DB 2A4940 LD HL,(#4049)
F1DE 4D LD C,L
F1DF EE3E XOR #3E
F1E1 B2 OR D
F1E2 1EA2 LD E,#A2
F1E4 58 LD E,B
F1E5 02 LD (BC),A
F1E6 58 LD E,B
F1E7 12 LD (DE),A
F1E8 02 LD (BC),A
F1E9 43 LD B,E
F1EA 02 LD (BC),A
F1EB 220002 LD (#0200),HL
F1EE 2D DEC L
F1EF 4B LD C,E
F1F0 5A LD E,D
F1F1 0A LD A,(BC)
F1F2 40 LD B,B
F1F3 4A LD C,D
F1F4 13 INC DE
F1F5 42 LD B,D
F1F6 45 LD B,L
F1F7 0A LD A,(BC)
F1F8 5B LD E,E
F1F9 6E LD L,(HL)
F1FA 6A LD L,D
F1FB 4E LD C,(HL)
F1FC 4E LD C,(HL)
F1FD 4E LD C,(HL)
F1FE 5D LD E,L
F1FF 7E LD A,(HL)
F200 3011 JR NC,#F213 ; (17)
F202 DD300E JR NC,#F213 ; (14)
F205 067E LD B,#7E
F207 FE3A CP #3A
F209 CAC221 JP Z,#21C2
F20C 12 LD (DE),A
F20D 23 INC HL
F20E 13 INC DE
F20F 0D DEC C
F210 C20622 JP NZ,#2206
F213 C3C221 JP #21C2
F216 3AB830 LD A,(#30B8)
F219 FEB1 CP #B1
F21B CA4522 JP Z,#2245
F21E 2A5030 LD HL,(#3050)
F221 CD1E20 CALL #201E
F224 7E LD A,(HL)
F225 FE27 CP #27
F227 CA5722 JP Z,#2257
F22A 3E84 LD A,#84
F22C 327630 LD (#3076),A
F22F 3E02 LD A,#02
F231 327730 LD (#3077),A
F234 CDCA13 CALL #13CA
F237 D24A22 JP NC,#224A
F23A 2E00 LD L,#00
F23C 3EB2 LD A,#B2
F23E 32C830 LD (#30C8),A
F241 7D LD A,L
F242 326F30 LD (#306F),A
F245 3E01 LD A,#01
F247 C3C321 JP #21C3
F24A 3ABE30 LD A,(#30BE)
F24D FEC5 CP #C5
F24F C23C22 JP NZ,#223C
F252 3EB0 LD A,#B0
F254 C33E22 JP #223E
F257 23 INC HL
F258 7E LD A,(HL)
F259 E67F AND #7F
F25B 6F LD L,A
F25C C33C22 JP #223C
F25F 3AB830 LD A,(#30B8)
F262 FEB1 CP #B1
F264 CA9022 JP Z,#2290
F267 2A5030 LD HL,(#3050)
F26A CD1E20 CALL #201E
F26D 3E80 LD A,#80
F26F 327630 LD (#3076),A
F272 3E01 LD A,#01
F274 327730 LD (#3077),A
F277 CDCA13 CALL #13CA
F27A D29522 JP NC,#2295
F27D 210000 LD HL,#0000
F280 3E82 LD A,#82
F282 32C830 LD (#30C8),A
F285 226330 LD (#3063),HL
F288 116F30 LD DE,#306F
F28B 7C LD A,H
F28C 12 LD (DE),A
F28D 13 INC DE
F28E 7D LD A,L
F28F 12 LD (DE),A
F290 3E02 LD A,#02
F292 C3C321 JP #21C3
F295 3ABE30 LD A,(#30BE)
F298 FEC5 CP #C5
F29A C2A222 JP NZ,#22A2
F29D 3EB1 LD A,#B1
F29F C38222 JP #2282
F2A2 CDEA1A CALL #1AEA
F2A5 C38222 JP #2282
F2A8 2A5030 LD HL,(#3050)
F2AB CD1E20 CALL #201E
F2AE 116F30 LD DE,#306F
F2B1 0600 LD B,#00
F2B3 0E04 LD C,#04
F2B5 7E LD A,(HL)
F2B6 23 INC HL
F2B7 FE27 CP #27
F2B9 C2F822 JP NZ,#22F8
F2BC 7E LD A,(HL)
F2BD FE27 CP #27
F2BF C2DE22 JP NZ,#22DE
F2C2 3AB830 LD A,(#30B8)
F2C5 FEB1 CP #B1
F2C7 CAD522 JP Z,#22D5
F2CA AF XOR A
F2CB 21C830 LD HL,#30C8
F2CE B8 CP B
F2CF CAD922 JP Z,#22D9
F2D2 3EB3 LD A,#B3
F2D4 77 LD (HL),A
F2D5 78 LD A,B
F2D6 C3C321 JP #21C3
F2D9 3EB4 LD A,#B4
F2DB C3D422 JP #22D4
F2DE FE8D CP #8D
F2E0 CAF822 JP Z,#22F8
F2E3 FE0A CP #0A
F2E5 CAF822 JP Z,#22F8
F2E8 E67F AND #7F
F2EA 12 LD (DE),A
F2EB 23 INC HL
F2EC 13 INC DE
F2ED 04 INC B
F2EE 0D DEC C
F2EF C2BC22 JP NZ,#22BC
F2F2 117A30 LD DE,#307A
F2F5 C3BC22 JP #22BC
F2F8 3E53 LD A,#53
F2FA CD111C CALL #1C11
F2FD C3C222 JP #22C2
F300 CDE511 CALL #11E5
F303 CD0C20 CALL #200C
F306 FE3A CP #3A
F308 C26423 JP NZ,#2364
F30B 2A5030 LD HL,(#3050)
F30E CD1E20 CALL #201E
F311 3E80 LD A,#80
F313 327630 LD (#3076),A
F316 3E02 LD A,#02
F318 327730 LD (#3077),A
F31B CDCA13 CALL #13CA
F31E DA2E23 JP C,#232E
F321 3ACC30 LD A,(#30CC)
F324 FE01 CP #01
F326 C23123 JP NZ,#2331
F329 3ECC LD A,#CC
F32B CD111C CALL #1C11
F32E 210000 LD HL,#0000
F331 3AB830 LD A,(#30B8)
F334 FEB1 CP #B1
F336 CA6E23 JP Z,#236E
F339 FEB2 CP #B2
F33B CAC221 JP Z,#21C2
F33E 226330 LD (#3063),HL
F341 3EA2 LD A,#A2
F343 32C830 LD (#30C8),A
F346 CDB51D CALL #1DB5
F349 06DD LD B,#DD
F34B 30CD JR NC,#F31A ; (-51)
F34D E5 PUSH HL
F34E 1111DD LD DE,#DD11
F351 300E JR NC,#F361 ; (14)
F353 067E LD B,#7E
F355 FE3A CP #3A
F357 CAC221 JP Z,#21C2
F35A 12 LD (DE),A
F35B 23 INC HL
F35C 13 INC DE
F35D 0D DEC C
F35E C25423 JP NZ,#2354
F361 C3C221 JP #21C2
F364 3E4E LD A,#4E
F366 CD111C CALL #1C11
F369 3EB4 LD A,#B4
F36B C3BF21 JP #21BF
F36E EB EX DE,HL
F36F 2A4D31 LD HL,(#314D)
F372 2B DEC HL
F373 2B DEC HL
F374 2B DEC HL
F375 72 LD (HL),D
F376 23 INC HL
F377 73 LD (HL),E
F378 23 INC HL
F379 3680 LD (HL),#80
F37B C3C221 JP #21C2
F37E CC44A0 CALL Z,#A044
F381 41 LD B,C
F382 AC XOR H
F383 2842 JR Z,#F3C7 ; (66)
F385 C3A9F1 JP #F1A9
F388 0A LD A,(BC)
F389 CC44A0 CALL Z,#A044
F38C 41 LD B,C
F38D AC XOR H
F38E 2844 JR Z,#F3D4 ; (68)
F390 C5 PUSH BC
F391 A9 XOR C
F392 F1 POP AF
F393 1A LD A,(DE)
F394 CC44A0 CALL Z,#A044
F397 2842 JR Z,#F3DB ; (66)
F399 C3A9AC JP #ACA9
F39C 41 LD B,C
F39D F1 POP AF
F39E 02 LD (BC),A
F39F CC44A0 CALL Z,#A044
F3A2 2844 JR Z,#F3E8 ; (68)
F3A4 C5 PUSH BC
F3A5 A9 XOR C
F3A6 AC XOR H
F3A7 41 LD B,C
F3A8 F1 POP AF
F3A9 12 LD (DE),A
F3AA CC44A0 CALL Z,#A044
F3AD 41 LD B,C
F3AE AC XOR H
F3AF C9 RET
F3B0 F2ED57 JP P,#57ED
F3B3 CC44A0 CALL Z,#A044
F3B6 41 LD B,C
F3B7 AC XOR H
F3B8 D2F2ED JP NC,#EDF2
F3BB 5F LD E,A
F3BC CC44A0 CALL Z,#A044
F3BF C9 RET
F3C0 AC XOR H
F3C1 41 LD B,C
F3C2 F2ED47 JP P,#47ED
F3C5 CC44A0 CALL Z,#A044
F3C8 D2AC41 JP NC,#41AC
F3CB F2ED4F JP P,#4FED
F3CE CC44A0 CALL Z,#A044
F3D1 53 LD D,E
F3D2 50 LD D,B
F3D3 AC XOR H
F3D4 48 LD C,B
F3D5 CCF1F9 CALL Z,#F9F1
F3D8 CC44A0 CALL Z,#A044
F3DB 53 LD D,E
F3DC 50 LD D,B
F3DD AC XOR H
F3DE C9 RET
F3DF D8 RET C
F3E0 F2DDF9 JP P,#F9DD
F3E3 CC44A0 CALL Z,#A044
F3E6 53 LD D,E
F3E7 50 LD D,B
F3E8 AC XOR H
F3E9 C9 RET
F3EA 59 LD E,C
F3EB F2FDF9 JP P,#F9FD
F3EE 50 LD D,B
F3EF 55 LD D,L
F3F0 53 LD D,E
F3F1 48 LD C,B
F3F2 A0 AND B
F3F3 42 LD B,D
F3F4 C3F1C5 JP #C5F1
F3F7 50 LD D,B
F3F8 55 LD D,L
F3F9 53 LD D,E
F3FA 48 LD C,B
F3FB A0 AND B
F3FC 44 LD B,H
F3FD C5 PUSH BC
F3FE F1 POP AF
F3FF D5 PUSH DE