Files
TZFS/dis/MZ2000_IPL/mz2000_ipl.asm

890 lines
27 KiB
NASM

;****************************************************************
;
; MZ-2000 Initial Program Loader Firmware.
;
; Disassembled with dz80 v2.1 and comments copied from the
; MZ-80B IPL disassembly.
;
;****************************************************************
;
CR EQU 0D8H
TR EQU 0D9H
SCR EQU 0DAH
DR EQU 0DBH
DM EQU 0DCH
HS EQU 0DDH
PPIA EQU 0E0H
PPIB EQU 0E1H
PPIC EQU 0E2H
PPICTL EQU 0E3H
PIOA EQU 0E8H
PIOCTLA EQU 0E9H
PIOB EQU 0EAH
PIOCTLB EQU 0EBH
GRPHCTL EQU 0F4H
IBUFE EQU 0CF00H
ATRB EQU 0CF00H
NAME EQU 0CF01H
SIZE EQU 0CF12H
DTADR EQU 0CF14H
SUMDT EQU 0FFE0H
TMCNT EQU 0FFE2H
IBADR1 EQU 0CF00H
IBADR2 EQU 08000H
NTRACK EQU 0FFE0H
NSECT EQU 0FFE1H
BSIZE EQU 0FFE2H
STTR EQU 0FFE4H
STSE EQU 0FFE5H
MTFG EQU 0FFE6H
CLBF0 EQU 0FFE7H
CLBF1 EQU 0FFE8H
CLBF2 EQU 0FFE9H
CLBF3 EQU 0FFEAH
RETRY EQU 0FFEBH
DRINO EQU 0FFECH
PRGSTART EQU 00000H
ORG PRGSTART
L0000: JR START
;
; NST RESET
;
NST: LD A,003H ;Set PC1 NST=1
OUT (PPICTL),A
START: LD A,082H ;8255 A=OUT B=IN C=OUT
OUT (PPICTL),A
LD A,058H ;PIO A=OUT
OUT (PPIC),A
LD SP,SUMDT ;PIO B=IN
LD A,0F7H
OUT (PPIA),A
LD A,00FH
OUT (PIOCTLA),A ;BST=1 NST=0 OPEN=1 WRITE=1
LD A,0CFH
OUT (PIOCTLB),A
LD A,0FFH
OUT (PIOCTLB),A
XOR A ;Set Graphics VRAM to default, input to GRPH I, no output.
OUT (0F6H),A
OUT (GRPHCTL),A
INC A
OUT (0F7H),A
LD A,007H
OUT (0F5H),A
LD A,0D3H
OUT (PIOA),A
LD HL,0D000H
LD A,CR
CLEAR: LD (HL),000H ; DISPLAY CLEAR
INC HL
CP H
JR NZ,CLEAR
LD A,0FFH
OUT (PPIA),A
LD A,003H
OUT (0F7H),A
CALL L006E
LD A,002H
OUT (0F7H),A
CALL L006E
LD A,001H
OUT (0F7H),A
CALL L006E
LD A,013H
OUT (PIOA),A
XOR A
LD (DRINO),A
LD (MTFG),A
KEYIN: CALL KEYS1
BIT 3,A ;C - Cassette.
JR Z,CMT
BIT 0,A ;/ - Boot external rom.
JP Z,EXROMT
JR NKIN ;No selection, so standard startup, try FDC then CMT.
L006E: LD HL,0C000H
DI
IN A,(PIOA)
SET 7,A
RES 6,A
OUT (PIOA),A
LD DE,0C001H
LD (HL),000H
LD BC,03E7FH
L0082: LDIR
RES 7,A
SET 6,A
OUT (PIOA),A
EI
RET
KEYS1: LD B,014H ;Preserve A4-A7, set A4 to prevent all strobes low, the select line 5 (0-4).
KEYS: IN A,(PIOA)
AND 0F0H
OR B
OUT (PIOA),A
IN A,(PIOB) ;Read the strobed key.
RET
NKIN: CALL FDCC
JP Z,FD
JR CMT
FDCC: LD A,0A5H
LD B,A
OUT (TR),A
CALL DLY80U
IN A,(TR)
CP B
RET
;
; ;
; CMT CONTROL ;
; ;
;
CMT: CALL MSTOP
CALL KYEMES
CALL RDINF
JR C,ST1
CALL LDMSG
LD HL,NAME
LD E,010H
LD C,010H
CALL DISP2
LD A,(IBUFE)
CP 001H
JR NZ,MISMCH
CALL RDDAT
ST1: PUSH AF
CALL FR
POP AF
JP C,TRYAG
JP NST
MISMCH: LD HL,MES16
LD E,00AH
LD C,00FH
CALL DISP
CALL MSTOP
SCF
JR ST1
;
;READ INFORMATION
; CF=1:ERROR
?RDI:
RDINF: DI
IN A,(PPIC)
SET 5,A
OUT (PPIC),A
LD D,004H
LD BC,0080H
LD HL,IBUFE
RD1: CALL MOTOR
JR C,STPEIR
CALL TMARK
JR C,STPEIR
CALL RTAPE
JR C,STPEIR
BIT 3,D
JR Z,EIRTN
STPEIR: CALL MSTOP
EIRTN: EI
RET
;
;
;READ DATA
;
?RDD:
RDDAT: DI
LD D,008H
LD BC,(0CF12H)
LD HL,IBADR2
JR RD1
;
;
;READ TAPE
; BC=SIZE
; DE=LOAD ADDRSS
RTAPE: PUSH DE
PUSH BC
PUSH HL
LD H,002H
RTP2: CALL SPDIN
JR C,TRTN1 ; BREAK
JR Z,RTP2
LD D,H
LD HL,L0000
LD (SUMDT),HL
POP HL
POP BC
PUSH BC
PUSH HL
RTP3: CALL RBYTE
JR C,TRTN1
LD (HL),A
INC HL
DEC BC
LD A,B
OR C
JR NZ,RTP3
LD HL,(SUMDT)
CALL RBYTE
JR C,TRTN1
LD E,A
CALL RBYTE
JR C,TRTN1
CP L
JR NZ,RTP5
LD A,E
CP H
JR Z,TRTN1
RTP5: DEC D
JR Z,RTP6
LD H,D
JR RTP2
RTP6: CALL BOOTER
SCF
TRTN1: POP HL
POP BC
POP DE
RET
EDGE: IN A,(PPIB)
CPL
RLCA
RET C ; BREAK
RLCA
JR NC,EDGE ; WAIT ON LOW
L016A: IN A,(PPIB)
CPL
RLCA
RET C ; BREAK
RLCA
JR C,L016A ; WAIT ON HIGH
RET
; 1 BYTE READ
; DATA=A
; SUMDT STORE
RBYTE: PUSH HL
LD HL,00800H ; 8 BITS
RBY1: CALL SPDIN
JR C,RBY3 ; BREAK
JR Z,RBY2 ; BIT=0
PUSH HL
LD HL,(SUMDT) ;CHECKSUM
INC HL
LD (SUMDT),HL
POP HL
SCF
RBY2: RL L
DEC H
JR NZ,RBY1
CALL EDGE
LD A,L
RBY3: POP HL
RET
;TAPE MARK DETECT
; E=L:INFORMATION
; E=S:DATA
TMARK: PUSH HL
LD HL,01414H
BIT 3,D
JR NZ,TM0
ADD HL,HL
TM0: LD (TMCNT),HL
TM1: LD HL,(TMCNT)
TM2: CALL SPDIN
JR C,RBY3
JR Z,TM1
DEC H
JR NZ,TM2
TM3: CALL SPDIN
JR C,RBY3
JR NZ,TM1
DEC L
JR NZ,TM3
CALL EDGE
JR RBY3
SPDIN: CALL EDGE ;WAIT ON HIGH
RET C ;BREAK
CALL DLY2
IN A,(PPIB) ;READ BIT
AND 040H
RET
;
;
;MOTOR ON
MOTOR: PUSH DE
PUSH BC
PUSH HL
IN A,(PPIB)
AND 020H
JR Z,MOTRD
LD HL,MES6
LD E,00AH
LD C,00EH
CALL DISP
CALL OPEN
MOT1: IN A,(PIOB)
CPL
RLCA
JR C,MOTR
IN A,(PPIB)
AND 020H
JR NZ,MOT1
CALL KYEMES
CALL DEL1M
MOTRD: CALL PLAY
MOTR: POP HL
POP BC
POP DE
RET
;
;
;MOTOR STOP
MSTOP: LD A,0F7H
OUT (PPIA),A
CALL DEL6
LD A,0FFH
OUT (PPIA),A
RET
;EJECT
OPEN: LD A,008H ;Reset PC4 - EJECT activate
OUT (PPICTL),A
CALL DEL6
LD A,009H
OUT (PPICTL),A ;Set PC4 - Deactivate EJECT
RET
KYEMES: LD HL,MES3
LD E,004H
LD C,01CH
CALL DISP
RET
;
;PLAY
PLAY: LD A,0FBH
OUT (PPIA),A
CALL DEL6
LD A,0FFH
OUT (PPIA),A
RET
FR: LD A,0FEH
FR1: OUT (PPIA),A
CALL DEL6
LD A,0FFH
OUT (PPIA),A
IN A,(PPIC)
RES 5,A
OUT (PPIC),A
RET
;
;TIMING DEL
DM1: PUSH AF
DM1A: XOR A
DM1B: DEC A
JR NZ,DM1B
DEC BC
LD A,B
OR C
JR NZ,DM1A
POP AF
POP BC
RET
DEL6: PUSH BC
LD BC,RDINF
JR DM1
DEL1M: PUSH BC
LD BC,060FH
JR DM1
;
;TAPE DELAY TIMING
;
;
DLY2: LD A,031H
DLY2A: DEC A
JP NZ,DLY2A
RET
LDMSG: LD HL,MES1
LD E,000H
LD C,00EH
JR DISP
DISP2: LD A,0D3H
OUT (PIOA),A
JR DISP1
BOOTER: LD HL,MES8
LD E,00AH
LD C,00DH
DISP: LD A,0D3H
OUT (PIOA),A
EXX
LD HL,0D000H
LD A,CR
DISP3: LD (HL),000H
INC HL
CP H
JR NZ,DISP3
EXX
DISP1: XOR A
LD B,A
LD D,0D0H
LDIR
LD A,013H
OUT (PIOA),A
RET
;
MES1: DB "IPL is loading"
MES3: DB "IPL is looking for a program"
MES6: DB "Make ready CMT"
MES8: DB "Loading error"
MES9: DB "Make ready FD"
MES10: DB "Press F or C"
MES11: DB "F:Floppy disk "
MES12: DB "C:Cassette tape"
MES13: DB "Drive No? (1-4)"
MES14: DB "This disk is not master "
MES15: DB "Pressing S key starts the CMT"
MES16: DB "File mode error"
;
IPLMC: DB 01H
DB "IPLPRO"
;
;
;FD
FD: LD IX,IBUFE
XOR A
LD (0CF1EH),A
LD (0CF1FH),A
LD IY,SUMDT
LD HL,0100H
LD (IY+002H),L
LD (IY+003H),H
CALL BREAD ;INFORMATION INPUT
LD HL,IBUFE ;MASTER CHECK
LD DE,IPLMC
LD B,006H
MCHECK: LD C,(HL)
LD A,(DE)
CP C
JP NZ,NMASTE
INC HL
INC DE
DJNZ MCHECK
CALL LDMSG
LD HL,0CF07H
LD E,010H
LD C,00AH
CALL DISP2
LD IX,IBADR2
LD HL,(0CF14H)
LD (IY+002H),L
LD (IY+003H),H
CALL BREAD
CALL MOFF
JP NST
NODISK: LD HL,MES9
LD E,00AH
LD C,00DH
CALL DISP
JP ERR1
;
; READY CHECK
;
READY: LD A,(MTFG)
RRCA
CALL NC,MTON
LD A,(DRINO) ;DRIVE NO GET
OR 084H
OUT (DM),A ;DRIVE SELECT MOTON
XOR A
CALL DLY60M
LD HL,L0000
REDY0: DEC HL
LD A,H
OR L
JR Z,NODISK
RET C
RET C
CPL
RLCA
JR C,REDY0
LD A,(DRINO)
LD C,A
LD HL,CLBF0
LD B,000H
ADD HL,BC
BIT 0,(HL)
RET NZ
CALL RCLB
SET 0,(HL)
RET
;
; MOTOR ON
;
MTON: LD A,080H
OUT (DM),A
LD B,00AH ;1SEC DELAY
MTD1: LD HL,03C19H
MTD2: DEC HL
LD A,L
OR H
JR NZ,MTD2
DJNZ MTD1
LD A,001H
LD (MTFG),A
RET
;
; Track SEEK
;
SEEK: LD A,01BH
CPL
OUT (CR),A
CALL BUSY
CALL DLY60M
IN A,(CR)
CPL
AND 099H
RET
;
;MOTOR OFF
;
MOFF: CALL DLY1M
XOR A
OUT (DM),A
LD (CLBF0),A
LD (CLBF1),A
LD (CLBF2),A
LD (CLBF3),A
LD (MTFG),A
RET
;
; RECALIBRATION
;
RCLB: PUSH HL
LD A,00BH
CPL
OUT (CR),A
CALL BUSY
CALL DLY60M
IN A,(CR)
CPL
AND 085H
XOR 004H
POP HL
RET Z
JP ERR
;
; BUSY AND WAIT
;
BUSY: PUSH DE
PUSH HL
CALL DLY80U
LD E,007H
BUSY2: LD HL,L0000
BUSY0: DEC HL
LD A,H
OR L
JR Z,BUSY1
IN A,(CR)
CPL
RRCA
JR C,BUSY0
POP HL
POP DE
RET
BUSY1: DEC E
JR NZ,BUSY2
JP ERR
;
; DATA CHECK
;
CONVRT: LD B,000H
LD DE,0010H
LD HL,(0CF1EH)
XOR A
TRANS: SBC HL,DE
JR C,TRANS1
INC B
JR TRANS
TRANS1: ADD HL,DE
LD H,B
INC L
LD (IY+004H),H
LD (IY+005H),L
DCHK: LD A,(DRINO)
CP 004H
JR NC,DTCK1
LD A,(IY+004H)
CP 046H
JR NC,DTCK1
LD A,(IY+005H)
OR A
JR Z,DTCK1
CP 011H
JR NC,DTCK1
LD A,(IY+002H)
OR (IY+003H)
RET NZ
DTCK1: JP ERR
;
; SEQUENTIAL READ
;
BREAD: DI
CALL CONVRT
LD A,00AH
LD (RETRY),A
READ1: CALL READY
LD D,(IY+003H)
LD A,(IY+002H)
OR A
JR Z,RE0
INC D
RE0: LD A,(IY+005H)
LD (IY+001H),A
LD A,(IY+004H)
LD (IY+000H),A
PUSH IX
POP HL
RE8: SRL A
CPL
OUT (DR),A
JR NC,RE1
LD A,001H
JR RE2
RE1: LD A,000H
RE2: CPL
OUT (HS),A
CALL SEEK
JR NZ,REE
LD C,DR
LD A,(IY+000H)
SRL A
CPL
OUT (TR),A
LD A,(IY+001H)
CPL
OUT (SCR),A
EXX
LD HL,RE3
PUSH HL
EXX
LD A,094H
CPL
OUT (CR),A
CALL WAIT
RE6: LD B,000H
RE4: IN A,(CR)
RRCA
RET C
RRCA
JR C,RE4
INI
JR NZ,RE4
INC (IY+001H)
LD A,(IY+001H)
CP 011H
JR Z,RETS
DEC D
JR NZ,RE6
JR RE5
RETS: DEC D
RE5: LD A,CR
CPL
OUT (CR),A
CALL BUSY
RE3: IN A,(CR)
CPL
AND 0FFH
JR NZ,REE
EXX
POP HL
EXX
LD A,(IY+001H)
CP 011H
JR NZ,REX
LD A,001H
LD (IY+001H),A
INC (IY+000H)
REX: LD A,D
OR A
JR NZ,RE7
LD A,080H
OUT (DM),A
RET
RE7: LD A,(IY+000H)
JR RE8
REE: LD A,(RETRY)
DEC A
LD (RETRY),A
JR Z,ERR
CALL RCLB
JP READ1
;
; WAIT AND BUSY OFF
;
WAIT: PUSH DE
PUSH HL
CALL DLY80U
LD E,008H
WAIT2: LD HL,L0000
WAIT0: DEC HL
LD A,H
OR L
JR Z,WAIT1
IN A,(CR)
CPL
RRCA
JR NC,WAIT0
POP HL
POP DE
RET
WAIT1: DEC E
JR NZ,WAIT2
JR ERR
NMASTE: LD HL,MES14
LD E,007H
LD C,01BH
CALL DISP
JR ERR1
;
; ;
; ERRROR OR BREAK ;
; ;
;
ERR: CALL BOOTER
ERR1: CALL MOFF
LD SP,SUMDT
TRYAG: CALL FDCC
JR NZ,TRYAG3
LD HL,MES10
LD E,05AH
LD C,00CH
CALL DISP2
LD E,0ABH
LD C,011H
CALL DISP2
LD E,0D3H
LD C,00FH
CALL DISP2
TRYAG1: CALL KEYS1
BIT 3,A
JP Z,CMT
BIT 6,A
JR Z,DNO
JR TRYAG1
DNO: LD HL,MES13
LD E,00AH
LD C,00FH
CALL DISP
DNO10: LD D,012H
CALL DNO0
JR NC,DNO3
LD D,018H
CALL DNO0
JR NC,DNO3
JR DNO10
DNO3: LD A,B
LD (DRINO),A
JP FD
TRYAG3: LD HL,MES15
LD E,054H
LD C,01DH
CALL DISP2
TRYAG4: LD B,006H
TRYAG5: CALL KEYS
BIT 3,A
JP Z,CMT
JR TRYAG5
DNO0: IN A,(PIOA)
AND 0F0H
OR D
OUT (PIOA),A
IN A,(PIOB)
LD B,000H
LD C,004H
RRCA
DNO1: RRCA
RET NC
INC B
DEC C
JR NZ,DNO1
RET
;
; TIME DELAY (1M &60M &80U )
;
DLY80U: PUSH DE
LD DE,000DH
JP DLYT
DLY1M: PUSH DE
LD DE,L0082
JP DLYT
DLY60M: PUSH DE
LD DE,01A2CH
DLYT: DEC DE
LD A,E
OR D
JR NZ,DLYT
POP DE
RET
;
;
; ;
; INTRAM EXROM ;
; ;
;
EXROMT: LD HL,IBADR2
LD IX,EROM1
JR SEROMA
EROM1: IN A,(0F9H)
CP 000H
JP NZ,NKIN
LD IX,EROM2
ERMT1: JR SEROMA
EROM2: IN A,(0F9H)
LD (HL),A
INC HL
LD A,L
OR H
JR NZ,ERMT1
OUT (0F8H),A
JP NST
SEROMA: LD A,H
OUT (0F8H),A
LD A,L
OUT (0F9H),A
LD D,004H
SEROMD: DEC D
JR NZ,SEROMD
JP (IX)