Files
TZFS/asm/mz800_9z_504m.asm

3165 lines
185 KiB
NASM

;
;
; SHARP MZ-800 IPL 9Z-504M
; (C) Sharp Corporation, 1982-84
;
; This source based on the printer listing of the original rom dissassembled by the Czech Sharp Users Club 1987.
;
; Dissassembly had missing data definition areas which have now been added along with translation
; of the comments and changes to better match the Sharp original listing labels.
;
; Re-assembly of this source using the Glass Z80 assembler results in identical output compared with the original rom.
;
; This code is targetted in the upper monitor region, 0xE000 - 0xF3FF
ORG 0E000H
INCLUDE "macros.asm"
;----------------------------------------------------------------------------------------
; Change this constant, 0 = original 9Z-504M build, 1 = tranZPUter/TZFS additions build.
;----------------------------------------------------------------------------------------
TZFS_BUILD EQU 0 ;
;
; Printer interface
PCPR: EQU 0FCH ; Z80 / PIO
PLPT: EQU PCPR+3 ; printer data output
PLPTS: EQU PCPR+2 ; printer strobe
PLPTI: EQU PCPR+1 ; printer data port inic
PLPTSI: EQU PCPR+0 ; printer strobe port inic
; Program sound generator
PPSG: EQU 0F2H ; Prog. Sound Gen.
; Joystick registers
PJ1: EQU 0F1H ; joystick-2 input port
PJ0: EQU 0F0H ; joystick-1 input port
; Pallet write
PPAL: EQU 0F0H ; pallet write
; Memory managerment ports OUT / IN
MMIO0: EQU 0E0H ; DRAM up / VRAM
MMIO1: EQU 0E1H ; DRAM up / VRAM pryc
; Memory managerment ports OUT
MMIO2: EQU 0E2H ; ROM down
MMIO3: EQU 0E3H ; ROM up
MMIO4: EQU 0E4H ; maximum neRAM as far as possible
MMIO5: EQU 0E5H ; Inhibit upper memory access
MMIO6: EQU 0E6H ; Restore upper memory access
; Floppy disk
PFD: EQU 0D8H
PFDSIZ: EQU PFD+5 ; floppy side settings
PFDMOT: EQU PFD+4 ; drive on / off
PFDDAT: EQU PFD+3 ; register that
PFDSEC: EQU PFD+2 ; sector register
PFDTRK: EQU PFD+1 ; track register
PFDCTR: EQU PFD+0 ; driving word
; 8253 I / O. mapped. - interupt, clock, etc.
P8253: EQU 0D4H ; 8253 I / O. Mapped
PCTCC: EQU P8253+3 ; control word 8253
PCTC2: EQU P8253+2 ; counter 2
PCTC1: EQU P8253+1 ; counter 1
PCTC0: EQU P8253+0 ; counter 0
; 8255 I / O mapped - keyboard, joystick, CMT
P8255: EQU 0D0H
PCWR55: EQU P8255+3 ; control word 8255
PPORTC: EQU P8255+2 ; port C - CMT and control
PKBDIN: EQU P8255+1 ; keyboard input
PKBOUT: EQU P8255+0 ; keyboard strobe
; GDG I / O ports
GDCRTC: EQU 0CFH ; CRTC control register
GDCMD: EQU 0CEH ; CRTC Mode register
GDGRF: EQU 0CDH ; read format register
GDGWF: EQU 0CCH ; write format register
;
; Memory mapping
;
MGATE0: EQU 0E008H ; disable / enable melody
; 8253 mem. mapped - Interupt, clock
M8253: EQU 0E004H ; 8253 Mem. Mapped
MCTCC: EQU M8253+3 ; control word 8253
MCTC2: EQU M8253+2 ; counter 2
MCTC1: EQU M8253+1 ; counter 1
MCTC0: EQU M8253+0 ; counter 0
; 8255 mem. mapped - keyboard, joystick, CMT
M8255: EQU 0E000H
MCWR55: EQU M8255+3 ; control word 8255
MPORTC: EQU M8255+2 ; port C - CMT and control
MKBDIN: EQU M8255+1 ; keyboard input
MKBOUT: EQU M8255+0 ; keyboard strobe
;
; ASCII constants
CR: EQU 0DH
SPACE: EQU 20H
ESC: EQU 1BH
CLS: EQU 16H
CRD: EQU 0CDH
; definition of display addresses
ADRCRT: EQU 0D000H ; address MZ-700 VRAM
ADRATB: EQU 0D800H ; the address of the CRS attribute
IMPATB: EQU 71H ; default display attribute
;
; tranZPUter additions.
;
CPLDSTATUS EQU 06BH ; Version 2.1 CPLD status register.
CPLDCFG EQU 06EH ; Version 2.1 CPLD configuration register.
CPLDINFO EQU 06FH ; Version 2.1 CPLD version information register.
MODE_MZ80K EQU 0 ; Set to MZ-80K mode.
MODE_MZ80C EQU 1 ; Set to MZ-80C mode.
MODE_MZ1200 EQU 2 ; Set to MZ-1200 mode.
MODE_MZ80A EQU 3 ; Set to MZ-80A mode (base mode on MZ-80A hardware).
MODE_MZ700 EQU 4 ; Set to MZ-700 mode (base mode on MZ-700 hardware).
MODE_MZ800 EQU 5 ; Set to MZ-800 mode.
MODE_MZ80B EQU 6 ; Set to MZ-80B mode.
MODE_MZ2000 EQU 7 ; Set to MZ-2000 mode.
MODE_VID_FPGA EQU 8 ; Bit flag (bit 3) to switch CPLD into using the new FPGA video hardware.
;
;
; Ports D0-D7 are mapped here in MZ-700 mode
;
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
;----------------------------------------------------
;
; QUICKDISK
;
;----------------------------------------------------
@QDISK:
LD A,5
LD (M1145),A
JE015:
DI
CALL JE06A
RET NC
PUSH AF
CP 28H
JR Z,JE068
CALL JE2E8
LD A,(M1130)
CP 4
JR NZ,JE045
LD A,(M1141)
OR A
JR Z,JE045
XOR A
LD (M1141),A
LD A,(M1142)
PUSH HL
LD (OLDSP),SP
POP HL
DI
CALL JE268
JR C,JE062
CALL JE2E8
JE045:
CP 3
JR NZ,JE04D
LD HL,113DH
DEC (HL)
JE04D:
POP AF
PUSH AF
CP 29H
JR NZ,JE062
LD HL,1145H
DEC (HL)
JR Z,JE062
POP AF
LD A,(M1140)
LD (M113F),A
JR JE015
;
JE062:
CALL JE1DB
CALL JE083
JE068:
POP AF
RET
;
JE06A:
LD (OLDSP),SP
LD A,(M1130)
DEC A
JR Z,JE08A
DEC A
JR Z,JE090
DEC A
JR Z,JE0DA
DEC A
JP Z,JE14E
DEC A
JR Z,JE083
JR JE0D3
;
JE083:
PUSH AF
XOR A
LD (M113D),A
POP AF
RET
;
JE08A:
LD A,(M1131)
JP JE23C
;
JE090:
XOR A
CALL JE268
CALL JE365
LD BC,0EFFFH
LD A,0AAH
JE09C:
CPL
LD D,A
CALL JE3DB
DEC BC
LD A,B
OR C
JR Z,JE0A9
LD A,D
JR JE09C
;
JE0A9:
CALL JE3B2
CALL JE2E8
CALL JE29B
LD A,(M1143)
DEC A
JR NZ,JE0D6
CALL JE2FD
LD BC,0EFFFH
LD E,55H
JE0C0:
CP E
JR NZ,JE0D6
DEC BC
LD A,B
OR C
JR Z,JE0D0
LD A,E
CPL
LD E,A
CALL JE3F0
JR JE0C0
;
JE0D0:
CALL JE3C3
JE0D3:
JP JE2E8
;
JE0D6:
LD A,29H
SCF
RET
;
JE0DA:
LD A,(M1144)
OR A
CALL Z,JE29B
CALL JE114
RET C
CALL JE435
CALL JE3F0
LD C,A
CALL JE3F0
LD B,A
OR C
JP Z,JE1E5
LD HL,(M1134)
SBC HL,BC
JP C,JE1E5
LD HL,(M1132)
JE0FF:
CALL JE3F0
LD (HL),A
INC HL
DEC BC
LD A,B
OR C
JR NZ,JE0FF
CALL JE3C3
LD A,(M1131)
BIT 0,A
JR NZ,JE0D3
RET
;
JE114:
LD HL,1143H
DEC (HL)
JR Z,JE14A
CALL JE2FD
LD C,A
LD A,(M113D)
LD HL,113EH
CP (HL)
JR NZ,JE147
INC A
LD (M113D),A
LD (HL),A
LD A,(M1131)
XOR C
RRA
RET NC
JE132:
CALL JE3F0
LD C,A
CALL JE3F0
LD B,A
JE13A:
CALL JE3F0
DEC BC
LD A,B
OR C
JR NZ,JE13A
CALL JE3C3
JR JE114
;
JE147:
INC (HL)
JR JE132
;
JE14A:
LD A,28H
SCF
RET
;
JE14E:
LD A,(M113F)
LD (M1140),A
LD A,(M1144)
OR A
JR NZ,JE171
CALL JE29B
LD A,(M113F)
LD HL,1143H
ADD A,(HL)
LD (M1143),A
INC A
LD (M113D),A
CALL JE114
JP NC,JE1E5
JE171:
LD A,(M1131)
LD B,A
AND 1
JR NZ,JE185
LD DE,1132H
LD A,B
RES 2,A
CALL JE1ED
CALL JE435
JE185:
LD DE,1136H
LD A,(M1131)
SET 0,A
CALL JE1ED
CALL JE2E8
CALL JE435
LD A,(M1131)
AND 4
JR Z,JE1E8
LD A,(M1142)
LD HL,113FH
ADD A,(HL)
CALL JE268
LD A,1
LD (M1141),A
JE1AC:
LD A,(M1142)
LD HL,1140H
ADD A,(HL)
INC A
LD (M1143),A
INC A
LD (M113D),A
CALL JE114
JR NC,JE1E5
LD A,(M1131)
AND 1
JR NZ,JE1CE
LD DE,1132H
CALL JE21B
RET C
JE1CE:
LD DE,1136H
CALL JE21B
RET C
LD A,(M1141)
OR A
JR Z,JE1E2
JE1DB:
XOR A
LD (M113F),A
LD (M1141),A
JE1E2:
JP JE2E8
;
JE1E5:
JP JE0D6
;
JE1E8:
CALL JE29B
JR JE1AC
;
JE1ED:
PUSH AF
LD HL,113FH
INC (HL)
CALL JE365
POP AF
CALL JE3DB
CALL JE211
LD A,C
CALL JE3DB
LD A,B
CALL JE3DB
JE204:
LD A,(HL)
CALL JE3DB
INC HL
DEC BC
LD A,B
OR C
JR NZ,JE204
JP JE3B2
;
JE211:
EX DE,HL
LD E,(HL)
INC HL
LD D,(HL)
INC HL
LD C,(HL)
INC HL
LD B,(HL)
EX DE,HL
RET
;
JE21B:
CALL JE2FD
CALL JE211
CALL JE3F0
CP C
JR NZ,JE1E5
CALL JE3F0
CP B
JR NZ,JE1E5
JE22D:
CALL JE3F0
CP (HL)
JR NZ,JE1E5
INC HL
DEC BC
LD A,B
OR C
JR NZ,JE22D
JP JE3C3
;
JE23C:
LD B,A
LD A,2
OUT (0F7H),A
LD A,81H
OUT (0F7H),A
LD A,2
OUT (0F7H),A
IN A,(0F7H)
AND 81H
CP 81H
JP NZ,JE406
LD A,10H
OUT (0F6H),A
IN A,(0F6H)
LD C,A
AND 8
JP Z,JE406
LD A,B
OR A
RET Z
LD A,C
AND 20H
RET NZ
JP JE403
;
JE268:
PUSH AF
LD HL,0E42CH
LD B,9
CALL JE2D8
JE271:
LD A,10H
OUT (0F6H),A
IN A,(0F6H)
AND 8
JP Z,JE406
LD A,10H
OUT (0F7H),A
IN A,(0F7H)
AND 8
JR Z,JE271
LD BC,0E9H
CALL @944BC
CALL JE39A
CALL JE37E
POP AF
CALL JE3DB
CALL JE3B2
JR JE2CE
;
JE29B:
LD HL,0E421H
LD B,0BH
CALL JE2D8
JE2A3:
LD A,10H
OUT (0F6H),A
IN A,(0F6H)
AND 8
JP Z,JE406
CALL JE435
LD A,10H
OUT (0F7H),A
IN A,(0F7H)
AND 8
JR Z,JE2A3
LD BC,0E9H
CALL @944BC
CALL JE313
LD (M1142),A
INC A
LD (M1143),A
CALL JE3C3
JE2CE:
LD HL,1147H
SET 3,(HL)
XOR A
LD (M113E),A
RET
;
JE2D8:
LD C,0F6H
OTIR
LD A,5
LD (M1144),A
OUT (0F7H),A
LD A,80H
OUT (0F7H),A
RET
;
JE2E8:
PUSH AF
LD A,5
OUT (0F6H),A
LD A,60H
OUT (0F6H),A
LD A,5
OUT (0F7H),A
XOR A
LD (M1144),A
OUT (0F7H),A
POP AF
RET
;
JE2FD:
LD A,58H
LD B,0BH
LD HL,0E421H
CALL JE3A3
LD HL,1147H
BIT 3,(HL)
LD BC,3
JR Z,JE316
RES 3,(HL)
JE313:
LD BC,0A0H
JE316:
CALL @944BC
LD A,5
OUT (0F7H),A
LD A,82H
OUT (0F7H),A
LD A,3
OUT (0F6H),A
LD A,0D3H
OUT (0F6H),A
LD BC,2CC0H
JE32C:
LD A,10H
OUT (0F6H),A
IN A,(0F6H)
AND 10H
JR Z,JE33D
DEC BC
LD A,B
OR C
JR NZ,JE32C
JR JE354
;
JE33D:
LD A,3
OUT (0F6H),A
LD A,0C3H
OUT (0F6H),A
LD B,9FH
JE347:
LD A,10H
OUT (0F6H),A
IN A,(0F6H)
AND 1
JR NZ,JE357
DEC B
JR NZ,JE347
JE354:
JP JE40C
;
JE357:
LD A,3
OUT (0F6H),A
LD A,0C9H
OUT (0F6H),A
CALL JE3F0
JP JE3F0
;
JE365:
LD A,98H
LD B,9
LD HL,0E42CH
CALL JE3A3
CALL JE39A
LD HL,1147H
BIT 3,(HL)
LD BC,1DH
JR Z,JE381
RES 3,(HL)
JE37E:
LD BC,140H
JE381:
CALL @944BC
LD A,5
OUT (0F6H),A
LD A,0EFH
OUT (0F6H),A
LD BC,1
CALL @944BC
LD A,0A5H
CALL JE3DB
JP JF380
;
JE39A:
LD A,5
OUT (0F6H),A
LD A,0FFH
OUT (0F6H),A
RET
;
JE3A3:
LD C,0F6H
OUT (C),A
LD A,5
OUT (0F7H),A
LD A,80H
OUT (0F7H),A
OTIR
RET
;
JE3B2:
LD BC,1
CALL @944BC
LD A,10H
OUT (0F7H),A
IN A,(0F7H)
AND 8
RET NZ
JR JE409
;
JE3C3:
LD B,3
JE3C5:
CALL JE3F0
DJNZ JE3C5
JE3CA:
IN A,(0F6H)
RRCA
JR NC,JE3CA
LD A,1
OUT (0F6H),A
IN A,(0F6H)
AND 40H
JR NZ,JE400
OR A
RET
;
JE3DB:
PUSH AF
JE3DC:
IN A,(0F6H)
AND 4
JR Z,JE3DC
POP AF
OUT (0F4H),A
JE3E5:
LD A,10H
OUT (0F6H),A
IN A,(0F6H)
AND 8
JR Z,JE406
RET
;
JE3F0:
CALL JE3E5
IN A,(0F6H)
RLCA
JR C,JE400
RRCA
RRCA
JR NC,JE3F0
IN A,(0F4H)
OR A
RET
;
JE400:
LD A,29H
LD HL,2E3EH
JE403: EQU 0E403H
LD HL,323EH
JE406: EQU 0E406H
LD HL,353EH
JE409: EQU 0E409H
LD HL,363EH
JE40C: EQU 0E40CH
LD SP,(OLDSP)
SCF
RET
;
@944BC:
PUSH AF
JE415:
LD A,96H
JE417:
DEC A
JR NZ,JE417
DEC BC
LD A,B
OR C
JR NZ,JE415
POP AF
RET
;
LD E,B
INC B
DJNZ JE42A
INC B
INC BC
RET NC
LD B,16H
JE42A:
RLCA
LD D,98H
INC B
DJNZ JE436
LD D,7
LD D,5
LD L,L
JE435:
LD A,0E8H
JE436: EQU 0E436H
LD (MKBOUT),A
NOP
LD A,(MKBDIN)
AND 81H
RET NZ
CALL JE1DB
LD SP,(OLDSP)
SCF
RET
;----------------------------------------------------
;
; FLOPPYDISK
;
;----------------------------------------------------
;
; Most subroutines use error returns,
; for this case it is necessary to set the return
; address to FDARET and be aware that the CAP will change
;
;
; Read the program from FD and run
; The program can pass control back to the RET instruction.
; The program name must start with IPLPRO, otherwise it will be executed
; error return FDERR1. Only the rest is shown on the display
; names.
;
; nothing: everything
;
@FDBOOT: ; floppy disc BOOT
EX (SP),HL ;
LD (FDARET),HL ; return address
CALL @???FD ; fdc?
JP NZ,FDERR0
LD DE,FDCB ; parameter block
LD HL,TFDTAB ; initial values
LD BC,11 ; 11 Byte
LDIR ; move ...
CALL @FDDESL ; deselect
LD IX,FDCB ; parameters
CALL @FDREAD ; read ...
LD HL,FDHEAD ; compared to
LD DE,TIPLPR ; 03 "IPLPRO"
LD B,7 ;
JE471: LD C,(HL) ;
LD A,(DE) ;
CP C ;
JP NZ,FDERR1 ; IPLPRO not found
INC HL ;
INC DE ;
DJNZ JE471 ; comparison loop
LD DE,IPLM0 ; "IPL IS LOADING"
RST 18H ;
LD DE,FDHEAD+7 ; filename, the other half
RST 18H ;
LD HL,MGBASE ;
LD (IX+005H),L ; boot address of the program
LD (IX+006H),H ;
LD HL,(FDHEAD+14H) ;
LD (IX+003H),L ; block length
LD (IX+004H),H ;
LD HL,(FDHEAD+1EH) ;
LD (IX+001H),L ; sector number calculated
LD (IX+002H),H ; from the beginning of the block
CALL @FDREAD ; honor data
CALL @FDDESL ; disconnect disks
LD BC,200H ; starts from FD
EXX
LD HL,FDHEAD+14H ; address to the header file
JP QGOPGM
;
; Error correction
;
FDERR1:
CALL @FDDESL ; disconnect disks
LD DE,ERRM1 ; FD: not master
JR FDCERR
FDERR3:
CP 32H ; diskette request?
JR NZ,JE4BF ; no, it's a mistake
FDERR0: ; request to turn on the floppy disk
LD DE,IPLM3 ; Make ready FD
JR FDCERR
JE4BF: LD DE,ERRM0 ; FD: loading error
FDCERR: LD SP,NEWSP-2 ; almost initialize the clip
LD HL,(FDARET) ; return address
EX (SP),HL ; to the clip instead of something
RET
;
; The name of the file with the FD loader
;
TIPLPR: DB 03H ; type BSD
DB "IPLPRO" ; the name of the bootloader
;
; Sample FD disk table, used by the FDBOOT routine
; is copied to RAM
;
TFDTAB: DB 0 ; disc number (0-3)
DW 00 ; block number from the beginning of the disc
DW 256 ; the length of the read block
DW FDHEAD ; boot address
DB 0 ; current rate
DB 0 ; current sector
DB 0 ; initial rate
DB 0 ; initial sector
;
; Select a disk and perform a restore if selected
; first
;
; nothing: what is possible
;
@FDSEL: ; Drive selct & restore if desired
LD A,(FDON?)
RRCA ; engine ON?
CALL NC,@FDON ; NO =M turn ON
LD A,(IX+000H) ; disk number
OR 10000100B ; pricist prikaz
OUT (PFDMOT),A ; select disk
XOR A
LD (FDCMD),A ; disk selected
CALL @D60MS ; I'd rather wait
LD HL,0
JE4F4: DEC HL
LD A,H
OR L
JR Z,JE512 ; TO expired
IN A,(PFDCTR) ; status read
CPL
RLCA
JR C,JE4F4 ; is waiting for the FDC
LD C,(IX+000H) ; disk number
LD HL,TFDRES
LD B,0
ADD HL,BC ; index table
BIT 0,(HL) ; connected disks
JR NZ,JE511 ; the disk has been connected
CALL @FDTR0 ; restore
SET 0,(HL) ; but come to restore no
JE511: RET
JE512: LD A,32H ; TO expired
JP FDERR2
;
; Turn on the floppy disk motor
;
@FDON:
LD A,80H
OUT (PFDMOT),A ; start the engine
LD B,16
JE51D: CALL @D60MS ; delay approx. 960 MS
DJNZ JE51D
LD A,1
LD (FDON?),A ; on flag
RET
;
; Search for the drive of the selected track
;
@FDSEEK:
LD A,1BH ; track search display
CALL @FDCOPE
AND 10011001B ; edit status
RET
;
; Disconnected floppy disks
;
@FDDESL:
PUSH AF
CALL @D1200
XOR A
OUT (PFDMOT),A ; disconnect display
LD (TFDRES),A ; reset all flags
LD (TFDRES+1),A ; for all disks before work
LD (TFDRES+2),A ; will have to perform FDTR0
LD (TFDRES+3),A
LD (FDON?),A ; and also turn off the engine
POP AF
RET
;
; Restore floppy (to 0th track)
;
@FDTR0:
LD A,0BH ; RESTORE display
CALL @FDCOPE ; exhibit
AND 10000101B ; mask status
XOR 00000100B
RET Z ; everything OK
JP FDERR4
;
; Send the display to the FD controller, also save the display and status
; to the appropriate variables
;
; input: A = display for FD
; output: A = status
;
@FDCOPE:
LD (FDCMD),A ; save your display
CPL
OUT (PFDCTR),A ; to radice
CALL @FDWT1 ; wait for not busy
CALL @D60MS ; delay
IN A,(PFDCTR) ; status
CPL
LD (FDSTAT),A ; impose
RET
;
; Wait for FDC ready
; if it doesn't, end with an error
;
; nici: AF
;
@FDWT1:
PUSH DE
PUSH HL
CALL @FDREPC ; delay 125 microseconds
JE56D: LD HL,0 ; E = 7 ... number of repetitions
JE570: DEC HL
LD A,H
OR L
JR Z,JE57D ; IT has expired
IN A,(PFDCTR) ; status
RRCA
JR NC,JE570 ; you are not ready
POP HL ; FDC ready, all right
POP DE
RET
JE57D: DEC E
JR NZ,JE56D
JE580: LD A,29H ; error 29H, disk does not boot
POP HL
POP DE
JP FDERR2
;
; Wait for the FDC to be busy,
; if it doesn't finish, it ends with an error
;
; nici: AF
;
@FDWT2:
PUSH DE
PUSH HL
CALL @FDREPC ; delay, E = 7
JE58C: LD HL,0
JE58F: DEC HL
LD A,H
OR L
JR Z,JE59C
IN A,(PFDCTR) ; status
RRCA
JR C,JE58F ; still ready
POP HL
POP DE
RET
JE59C: DEC E ; it is still necessary to wait
JR NZ,JE58C
JR JE580 ; end, error ERR 29H
;
; Delay 125 microseconds and 7 -M E
;
@FDREPC:
CALL @D125 ; wait
LD E,7 ; that's the length of the next wait
RET
;
; Reads data from a floppy disk
;
@FDREAD:
CALL @FDTR? ; calculate the footprint and the sector
CALL @FDPREP ; prepare disk and registers
JE5AD: CALL @FDTR ; set the track
CALL @FDSEEK ; look for her physically
JP NZ,FDERR2 ; failed
CALL @FDSEC ; set sector
DI ; do not interrupt, therefore
LD A,94H ; allow interruption
CALL FDSTRT ; start reading the sector
JE5BF: LD B,0 ; 256 apartments
JE5C1: IN A,(PFDCTR) ; status
RRCA
JR C,JE5E0 ; error
RRCA
JR C,JE5C1 ; not ready
INI ; precist byte
JR NZ,JE5C1 ; you are reading more
INC (IX+008H) ; read everything, another sector
LD A,(IX+008H)
CP 17
JR Z,JE5DC ; go to the next track
DEC D
JR NZ,JE5BF ; honor another sector
JR JE5DD
JE5DC: DEC D
JE5DD: CALL @FDSTOP ; stop FD
JE5E0: NOP
IN A,(PFDCTR) ; status
CPL
LD (FDSTAT),A
AND 0FFH
JR NZ,FDERR4
CALL @FDNEXT ; dalsi stop
JP Z,JE5F6 ; end of disc
LD A,(IX+007H) ; it should do FDPREP
JR JE5AD ; and cte se dal
JE5F6: LD A,80H ; end of disc
OUT (PFDMOT),A
RET
;
; Prepare a floppy disk and file parameters to the registry
;
; output: D = number of file sectors
; HL = boot address
; A = rate
;
@FDPREP:
CALL @FDSEL ; select disc
LD D,(IX+004H)
LD A,(IX+003H)
OR A ; length MOD 256
JR Z,JE608 ; it is a multiple of 256
INC D ; this short is also read
JE608: LD A,(IX+00AH) ; in D is now the number of sectors
LD (IX+008H),A ; copy initial number
LD A,(IX+009H) ; tracks to the current
LD (IX+007H),A ;
LD L,(IX+005H) ; boot address
LD H,(IX+006H)
RET
;
; Set the physical track and side of the floppy, odd tracks
; they are on one side and the barrel on the other side
;
; input: A = logical track number
; nici: AF
;
@FDTR:
SRL A ; rate / 2
CPL
OUT (PFDDAT),A ; set a track
JR NC,JE626
LD A,1 ; licha stopa
JR JE627
JE626: XOR A ; suda stopa
JE627: CPL
OUT (PFDSIZ),A ; set page
RET
;
; Set the track and sector according to the data in the FDCB
;
; output: C = PFDDAT
; A = sector
;
@FDSEC:
LD C,PFDDAT ; THIS IS NOT NEEDED
LD A,(IX+007H) ; track
SRL A ; / 2, on the side of the coffin
CPL
OUT (PFDTRK),A ; set
LD A,(IX+008H) ; sector
CPL
OUT (PFDSEC),A ; set
RET
;
; Parameters in FDCB on the next track
;
; output: A = D ... number of sectors to transmit
; F ....... set according to A and therefore also D
;
@FDNEXT:
LD A,(IX+008H) ; sector
CP 17 ; is the last one?
JR NZ,JE64B ; no
LD A,1 ; Sector 1
LD (IX+008H),A
INC (IX+007H) ; another footprint
JE64B: LD A,D ; you will transfer me
OR A
RET
;
; Show on FD
;
FDSTRT:
LD (FDCMD),A ; save the display
CPL
OUT (PFDCTR),A ; send
CALL @FDWT2 ; wait for it to work
RET
;
; Stop FD
;
; nici: AF
;
@FDSTOP:
LD A,PFDCTR ; stop display
CPL
OUT (PFDCTR),A ; stop
CALL @FDWT1 ; wait for it to stop
RET
;
; Errors when working with FD
;
FDERR4:
LD A,(FDCMD) ; last view
CP 0BH
JR Z,JE683
CP 1BH
JR Z,JE683
CP 0F4H
JR Z,JE683
LD A,(FDSTAT) ; status
BIT 7,A
JR NZ,JE68E
BIT 6,A
JR NZ,JE68A
BIT 4,A
LD A,36H
JR NZ,FDERR2
JR JE68A
JE683: LD A,(FDSTAT)
BIT 7,A
JR NZ,JE68E
JE68A: LD A,29H
JR FDERR2
JE68E: LD A,32H
FDERR2: CALL @FDDESL
JP FDERR3
;
; The computed trace number from the sector address on the FDCB (1) a
; FDCB (2). The result will be FDCB (9) = foot
; FDCB (10) = sector
; output: H = B = initial track of the file
; L = initial sector of the file
; DE = 16
; A = 0
;
@FDTR?:
LD B,0
LD DE,16 ; sector on track
LD L,(IX+001H) ; sector address
LD H,(IX+002H)
XOR A ;
JE6A2: SBC HL,DE ; about 16 sectors
JR C,JE6A9
INC B ; means 1 foot more
JR JE6A2 ; and again
JE6A9: ADD HL,DE ; sector number remains in L
LD H,B ; the track number will be in H
INC L ; sectors are counted from 1
LD (IX+009H),H ; save to FDCB
LD (IX+00AH),L
RET
;
; delay approx. 125 microseconds
;
@D125:
PUSH DE
LD DE,0FH
JR D60MS1
;
; delay approx. 1.2 milliseconds
;
@D1200:
PUSH DE
LD DE,0A0H
JR D60MS1
;
; Delay approx. 60 milliseconds
;
@D60MS:
PUSH DE
LD DE,2026H
D60MS1: DEC DE
LD A,E
OR D
JR NZ,D60MS1
POP DE
RET
;----------------------------------------------------
;
; RAMDISK
;
;----------------------------------------------------
;
; Load the program from the house
;
QEB:
CALL @RDLOAD ; honor program from RD
JP NZ,CMTERR ; error
QGORD:
LD BC,0 ; and run it
EXX
LD HL,FSIZE ; GOPGM needs it
JP QGOPGM
;
; Read the program from the Ram disk
;
; input: C = I / O address
; input: Z = 1 ... program read OK
; 0 ... checksum error
;
@RDLOAD:
CALL JE729 ; check the CRC on the RD
RET NZ
IN A,(C)
INC C ; entry address
LD HL,FSIZE
LD B,9
INIR ; piece of head here
LD DE,(FSIZE)
LD HL,MGBASE
LD A,E
OR A ; length MOD 256
JR Z,JE6F6 ; it's in whole blocks
LD B,A
JE6F4: INIR
JE6F6: LD B,0
DEC D
JP P,JE6F4 ; for each block
LD DE,MGBASE
LD BC,(FSIZE)
CALL @RDCRC ; counted CRC
LD DE,(RDCRC)
OR A
SBC HL,DE ; and compare with read
RET
;
; Count checksum
;
; input: BC = block length in bytes
; DE = block address
;
; output: BC = 8
; DE = DE '
; HL = calculated CRC
; BC '= 0
; DE '= address after the data block
; HL '= HL
; A = 0
;
@RDCRC:
EXX
LD HL,0 ; they will feel the same here
LD C,8 ; byte ma 8 bit
EXX
JE715: LD A,B
OR C
JR Z,JE727 ; everything is already calculated
LD A,(DE) ; another byte from the file
EXX
LD B,C ; it's 8
JE71C: RLCA
JR NC,JE720
INC HL ; it's one
JE720: DJNZ JE71C ; 8 times
EXX
INC DE ; on the next byte
DEC BC ; and the length is shortened
JR JE715 ; repeat
JE727: EXX
RET
;
; Check the CRC header on the RD, read from the beginning of the RD
; 8 bytes, 9th byte is considered the number of units
;
; input: C = I / O port
; output: Z = 1 ... CRC agrees
; 0 ... checksum error
; A = read CRC from RD
; D = calculated CRC
; B = 0
;
JE729:
IN A,(C) ; pointer to the beginning
LD B,8
LD D,0
INC C ; cteci port
JE730: IN A,(C)
PUSH BC
LD B,8
JE735: RLCA
JR NC,JE739
INC D ; we feel one
JE739: DJNZ JE735 ; 8 times
LD A,D
POP BC
LD D,A
DJNZ JE730 ; 8 times
IN A,(C) ; cti CRC
DEC C ; turn control port
CP D ; compare with CRC calculated
RET
;
; Read the program from the CMT and save it to the RAM disk
;
QES:
LD DE,SRCPRG ; Ramcard prog.
CALL IFNL?
RST 18H
CALL IFNL?
LD DE,SMASTS ; Master tape set
RST 18H
CALL IFNL?
CALL @RHEAD ; header from CMT
JR C,JE769 ; failed
LD DE,MSGLD ; Loading
CALL IFNL?
RST 18H
LD DE,FNAME ; listing file name
RST 18H
CALL @RDATA ; and honor data from CMT
JE769: JP C,CMTERR ; CMT error
IN A,(C) ; at the beginning of the RAM disk
LD (RDADR),BC ; save the IIO address of the RD
LD DE,(BEGIN)
LD BC,(FSIZE)
PUSH DE
PUSH BC
CALL @RDCRC ; counted CRC
LD (RDCRC),HL ; save to header
LD HL,FSIZE
LD BC,(RDADR) ; restore I / O address
LD B,8
INC C
INC C ; data output port
PUSH HL
PUSH BC ; 8 byte headers =
OTIR ; length, address, start, CRC
POP BC ; B = 8 C = I / O
POP HL
PUSH DE
LD D,0 ; calculate the CRC header
JE796: PUSH BC
LD B,8
LD A,(HL)
JE79A: RLCA
JR NC,JE79E
INC D ; another one found
JE79E: DJNZ JE79A ; 8 times
INC HL
POP BC
DJNZ JE796 ; 8 times
LD A,D
POP DE
OUT (C),A ; CRC to RD
POP DE ; file length
POP HL ; boot address
LD A,E ; length MOD 256
OR A
JR Z,JE7B1 ; only whole blocks
LD B,E ; the piece first
JE7AF: OTIR
JE7B1: LD B,0 ; and now only whole blocks
DEC D
JP P,JE7AF ; send another block
JP QPRMPT
;
; Check if a RAM disk is present
;
; input: C = I / O address
; output: CY = 1 ... ram disk no
; 0 ... ram disk is
; nici: AF, if the ram disk is not, so is C
;
@???RD:
XOR A
IN A,(C) ; at the beginning of the house
INC C ; cteci port
IN A,(C) ; honor byte
EX AF,AF'
DEC C
IN A,(C) ; again at the beginning
LD B,0A5H
INC C
INC C ; write port
OUT (C),B ; business A5
DEC C
DEC C
IN A,(C) ; at the beginning
INC C
IN A,(C) ; honor, it should
CP B ; apartment A5
JR NZ,JE7DF ; but it's not
DEC C ; control port
IN A,(C) ; again at the beginning
EX AF,AF' ; what was read
INC C ; will have to go back
INC C
OUT (C),A
DEC C
DEC C ; and the original C
RET ; mame RD =M CY = 0
JE7DF: XOR A ; RD not connected
SCF ; CY = 1
RET
;
SRCPRG: DB 'R',0A1H,0B3H,9FH,0A1H,9DH,9CH,' '
DB 9EH,9DH,0B7H,97H,'.',CR
; Ramcard prog.
SMASTS: DB 4DH,0A1H,0A4H,96H,92H,9DH,' ',96H
DB 0A1H,9EH,92H,' ',0A4H,92H,96H,CR ; Master tape set
;----------------------------------------------------
;
; Cold start monitor
;
;----------------------------------------------------
ORG 0E800H
COLD:
NOP
JP JE813 ; skip JUMP vector
JP QPRMPT ; monitor prompt
@COPYL: JP COPYL ; load file from CMT:
@COPYS: JP COPYS ; save file to CMT:
@COPYV: JP COPYV ; verify file on CMT:
JP @QDISK ; call quick disk driver.
;
JE813:
DI
IM 1
LD A,8
OUT (GDCMD),A ; MZ-700 mode settings
LD A,1 ; CRT settings:
OUT (GDGRF),A ; single color
OUT (GDGWF),A ; MZ-700 = DATA, ATB, CG
OUT (MMIO4 ),A ; mapped ROM, CGROM, VRAM
LD SP,NEWSP
CALL @INI55
XOR A
LD DE,0
CALL TIMST ; we start at midnight
LD BC,37
CALL @944BC ; delay approx. 16.28 ms
LD BC,4*256+PCPR ; control PIO port
LD HL,TPIO ; bit mode, 6th and 7th bit as
OTIR ; output, other input, DI
LD BC,4*256+PCPR+1 ; PIO data port
OTIR ; bit mode, all output, DI
LD A,1
OUT (0F7H),A
XOR A
OUT (0F7H),A ; turn off QD:
CALL BRKEY ; test CTRL
JR NC,PSG0 ; CTRL not pressed
CP 20H
JP NZ,PSG0 ; just SHIFT, we don't care
IN A,(GDCMD) ; state of switch MZ-700
AND 2 ; is ON?
JR Z,JE85F ; is, we leave the MZ-700
XOR A
OUT (GDCMD),A ; no, so MZ-800
CALL PLTST ; Pallette set
JE85F: JP GORAM ; jump to RAM at 0
;
; PSG Reset
;
PSG0: LD B,4 ; turn off PSG
LD A,9FH
PSGSET: OUT (PPSG),A
ADD A,20H
DJNZ PSGSET ; all registers are turned off
; Sound & Interrupt mask reset.
SORES: LD A,1
LD (MCWR55),A ; ban on whistling from 8253
LD A,5
LD (MCWR55),A ; permission interrupted
BGI0: LD B,0FFH ; zero
LD HL,FNAME ; buffer
CALL @F0B ; CMT control block
LD A,16H
CALL @PRNTC
LD A,71H ; filling VRAM
LD HL,ADRATB ; attribute 71H
CALL @FILLA
LD HL,38DH ; initialization
LD A,0C3H ; jump RST38
LD (INTSRQ),A ; in RAM on
LD (INTADR),HL ; patricna mista
LD A,4
LD (TEMPO),A ; medium speed tune
CALL MSTP ; stop MZ 700 music
CALL @IFNL?
CALL BEEP ; beep
LD A,1 ; beep on each key
LD (BPFLG),A ; will not
IN A,(MMIO0 ) ; Set memory map to page in CGROM and CGRAM.
LOADPCG: LD DE,0C000H ; point to the programmable character generator,
LD HL,1000H ; set location of bitmap in ROM.
LD BC,1000H ; 4K in size.
LDIR ; to VRAM
IN A,(MMIO1) ; unmaps CG
; Add in tranZPUter/TZFS customisations when enabled.
IF TZFS_BUILD = 1
JP GETBOOTKEY ; Check to see if a boot key was pressed during reset for quick device boot.
ELSE
CALL @GETKY
ENDIF
BOOTKEYSEL: CP 'M'
JR Z,QMONIT ; to the monitor now
CP 'Q'
JR Z,KSJPQB ; clean from QD:
CP 'C'
JR Z,IPLCMT ; clean from CMT:
CALL @???FD ; we have floppy disks
JR NZ,R12C_B ; we don't
IPLFD: CALL @CLRS ; delete CRT:
CALL @FDBOOT ; cti program IPLPRO
JP QIPL ; return voice printing and RET
;
; Find out if we have FD:
;
; output: Z = 1 ... floppy disk found
; Z = 0 ... we don't have a floppy disk
;
; nici: AF, B
;
@???FD: LD A,0A5H ; some constant
LD B,A
OUT (PFDTRK),A ; to the trace register
CALL @D125 ; wait for a while
IN A,(PFDTRK) ; and we read it back
CP B ; did she stay there?
RET ; if so, we have FD
;
; Pallet Reg. & Border Reg. set
; PLT0~3 Black
; Border Black
;
; output: BC = 6CFH, A = 0
;
PLTST: PUSH HL
LD BC,05F0H ; C=port (Pallet Write), B=count
LD HL,PLTDT ; Data
OTIR
XOR A
LD BC,06CFH ; Border Black
OUT (C),A ; Send to port.
POP HL
RET
;
; MZ-1R12 check & boot
;
R12C_B: LD C,0F8H
CALL @???RD ; do we have RD?
JP C,IPLQD ; we don't
CALL @RDLOAD ; The house is here, try to clean
LD DE,ERMG12 ; SRAM: check sum error
JP NZ,QIPL ; we don't have a ram disk
JP QGORD ; program from the RD and run
;
;
;
; Display the initialization screen and wait for the user to choose one of the
; displayed options.
;
SLMSG: CALL CLLET ; delete the CRT and three times the CRLF
SELMG0: CALL SELMSG ; initialize screen
CALL @WNKEY ; until the key is pressed
KSCAN0: CALL @???QD
JR NZ,KSCAN1 ; QD not connected
LD A,2
CALL QKBD??
CP 7FH ; pressed Q?
KSJPQB: JP Z,IPLQD ; Yes
KSCAN1: LD A,4
CALL QKBD??
CP 0DFH ; C pressed?
JR Z,IPLCMT ; Yes
LD C,A
CALL @???FD
JR NZ,KSCAN2 ; FDs are not
LD A,C
CP 0FBH ; pressed F?
JR Z,IPLFD ; Yes
KSCAN2: LD A,3
CALL QKBD??
; Add in tranZPUter/TZFS customisations when enabled.
IF TZFS_BUILD = 1
JP TZFSKEY ; Check to see if TZFS key pressed.
DB 000H ; Filler to ensure remainder of compilation matches original.
ELSE
CP 0F7H ; 'M' - Monitor?
JR NZ,KSCAN0
ENDIF
;
; List the header of the monitor and jump to its reading display
;
QMONIT:
CALL @CLRS
LD DE,MONMSG
RST 18H
JP QPRMPT
;
; Program implementation from CMT
;
IPLCMT:
LD HL,MPORTC ; is CMT?
LD A,(HL)
AND 10H
JR NZ,JE972 ; Tape drive active, button pressed, start reading.
INC HL
LD A,6
LD (HL),A ; Toggle the motor enable, first up
INC A
LD (HL),A ; then down
DEC HL
LD A,(HL)
AND 10H ; Has the button been pressed?
JR NZ,JE972 ; yes, start reading.
CALL @CLRS
CALL @LETNL
CALL @LETNL
LD DE,IPLM1 ; Make ready CMT
CALL MSGLET
JE968:
CALL @BRKEY
JR Z,CMTER2 ; break key check
LD A,(HL)
AND 10H
JR Z,JE968 ; Go in a loop until the play button has been pressed on the tape drive.
JE972:
CALL @CLRS
CALL @LETNL
LD DE,IPLM4 ; IPL is looking ...
RST 18H
CALL @RHEAD ; Read tape header.
JP C,CMTER1 ; Exit on error.
CALL @CLRS ; Clear screen to print loading message.
LD DE,IPLM0 ; IPL is loading ..
RST 18H
LD DE,FNAME ; file name
RST 18H
LD HL,(BEGIN)
EXX ; DE <-> HL
LD HL,MGBASE ; Load address @ 1200H
LD (BEGIN),HL ; Place the load address into the header overwriting the read value so that data is read into a known location.
CALL @RDATA ; Read in the main data.
JP C,CMTER1 ; error
;
; run the program loaded from CMT
;
QGOCMT:
LD BC,100H ; tape recorder
EXX ; to BC '
LD (BEGIN),HL ; Put back the original load address
LD HL,FSIZE ; to the header points to the length
JP QGOPGM ; start
;
; error returns
;
CMTER1:
CP 2
CMTER2:
LD DE,IPLM1 ; Make ready CMT
JR Z,JE9B4
LD DE,ERRM2 ; CMT loading err.
JE9B4:
JP QIPL
;
; Load a program from QD
;
IPLQD:
CALL @???QD ; mame QD?
LD A,2
JR NZ,CMTER1 ; we don't, read from CMT
CALL JEEEC
CALL JEF27
LD DE,IPLM2 ; Make ready QD
JR C,QIPL
CALL @CLRS
LD A,0DH
LD (IOBUF),A
CALL JF25F
LD A,1
LD (M113A),A
LD HL,0EA04H
LD SP,NEWSP-2
EX (SP),HL
CALL JEEF7
JP C,JF202
LD A,(HEAD)
CP 1
LD DE,ERRM4 ; QD: File mode error
JR NZ,QDERR ; the mistake is really
LD DE,IPLM0 ; IPL is loading
RST 18H
JP JEEC2
;
LD DE,IPLM2
;
; Error working with QD
;
QDERR:
PUSH DE
LD A,6
LD (M1130),A
CALL @QDISK
POP DE
JR QIPL
;
; List on the initialization message display without
; 1. radku. According to the available equipment
; writes a menu for selecting a display
; Nothing all registers
;
SELMSG: CALL @LETNL
LD DE,SELM0 ; Please push key
CALL MSGLET
CALL @LETNL
CALL @???FD
JR NZ,SELM00 ; not floppy
LD DE,SELM1 ; F: floppy disk
CALL MSGLET
SELM00: CALL @???QD
JR NZ,SELM01 ; not QD
LD DE,SELM2 ; Q: quick disk
CALL MSGLET
SELM01: LD DE,SELM3 ; C: tape cassette
CALL MSGLET
LD DE,SELM4 ; M: monitor
; Add in tranZPUter/TZFS customisations when enabled.
IF TZFS_BUILD = 1
JP TZFSMSG ; Add in the TZFS option.
ELSE
JP MSGLET
ENDIF
;
; List of messages from DE on the display, list of help menus
; MGIN and waiting for the keyboard to press
;
QIPL: CALL @CLRS
CALL @LETNL
CALL @LETNL
CALL MSGLET
JP SELMG0
;
; Clear the display and CRLF 3 times on it
;
CLLET: CALL @CLRS
LD B,3
JEA48: CALL @LETNL
DJNZ JEA48
RET
;
; Printing twelve spaces and messages on the display, which
; the address is in the DE register
;
MSGLET:
LD B,12 ; number of spaces
JEA50: CALL @PRNTS ; gap
DJNZ JEA50
RST 18H ; message from the DE register
JP @LETNL
;
; Clear the screen
;
; nici: AF
;
@CLRS:
LD A,0C6H
JP @?DPCT
;----------------------------------------------------
;
; MONITOR 9Z-504M
;
;----------------------------------------------------
QPRMPT:
LD SP,NEWSP ; SP is in the area through which
CALL @IFNL? ; is mapping CG-ROMT
LD A,'*'
CALL @PRNTC
LD DE,IOBUF ; input buffer address
CALL @GETL
QPRMLOP:
LD A,(DE)
INC DE
CP CR
JR Z,QPRMPT
CP 'J'
JR Z,QJUMP ; jump to the program
CP 'L'
JP Z,QLOAD ; honor the program from CMT
CP 'F'
JR Z,QFLOPY ; honor the program from FD
CP 'B'
JP Z,QBEEP ; controlled keyboards
CP 'M'
JP Z,QMODIF ; memory modification
CP 'S'
JP Z,QSAVE ; save the program to a tape
CP 'V'
JP Z,QVERIF ; program verification
CP 'D'
JP Z,QDUMP ; HEXA memory dump
CP 'Q'
JR Z,QQDISK ; work with quick disk
CP 'E'
JR Z,QRCARD ; work with ram disk
CP 'G'
JR Z,QGOSUB ; jump to subroutine
JR QPRMLOP
;----------------------------------------------------
;
; J = jump
;
;----------------------------------------------------
QJUMP:
CALL QHEXHL ; decode the address
QJPHL: JP (HL) ; and jump on her
;
; Called subroutines
;
;----------------------------------------------------
;
; G = gosub (subroutine call)
;
;----------------------------------------------------
QGOSUB:
CALL QHEXHL ; decode the address
CALL QJPHL ; call JP (HL)
JR QPRMPT
;----------------------------------------------------
;
; Q = quick disk (works with QD :)
;
;----------------------------------------------------
QQDISK:
CALL @???QD ; mame QD:
JR NZ,QPRMPT ; no, that's why we won't be with him
CALL JEEEC ; work
LD HL,0
LD (M113A),HL
LD A,(DE) ; kinds of display character
CP 'L'
JP Z,QQL ; read the program
CP 'S'
JP Z,QQS ; save the program
CP 'C'
JP Z,QQC ; program copy
CP 'F'
JP Z,QQF ; disk formatting
CP 'X'
JP Z,QQX ; program copy
CP 'D'
JP Z,QQD ; directory listing
QPRMP1:
JP QPRMPT
;----------------------------------------------------
;
; E = read and save program to RAM disk =
;
;----------------------------------------------------
;
; E .... Work with RD
;
; ES ... Save the program from the cassette to the RD
; EB ... Run program from RD
;
QRCARD:
LD C,0F8H ; this is perhaps an I / O address
CALL @???RD ; RAM disk
JR NC,JEAF3 ; No, let's try
LD C,0A8H ; such an I / O address
CALL @???RD
JR C,QPRMP1 ; again, we probably don't have it
JEAF3:
LD A,(DE) ; 2nd character of the display
CP 'B'
JP Z,QEB ; run the program from the RD
CP 'S'
JP Z,QES ; program from CMT to RD
JR QPRMP1
;----------------------------------------------------
;
; F = floppy (load program from floppy)
;
;----------------------------------------------------
QFLOPY:
LD A,(DE)
CP CR
JR NZ,QPRMP1 ; must not be parameters
CALL @???FD ; do we have FD?
JR NZ,QPRMP1 ; No
CALL @FDBOOT ; read the file
CALL @IFNL?
RST 18H
JR QPRMP1
;
; Find out if QD is connected
;
; output: Z = 1 ... QD connected
; 0 ... QD does not exist
;
; nici: AF
;
@???QD:
LD A,2
OUT (0F7H),A
LD A,0A5H ; sample
OUT (0F7H),A ; write a sample
LD A,2
OUT (0F7H),A
IN A,(0F7H) ; clean with QD
CP 0A5H ; compare with the sent sample
RET ; if there is a QD, it has to be equal
;
; statement CHECK SUM ERR. or BREAKT according to the error number,
; return to monitor
;
CMTERR:
LD DE,MGBRK ; BREAKT
CP 2
JR Z,JEB2E ; it really was a break
LD DE,SCHECK ; check sum error
JEB2E: CALL @IFNL?
RST 18H
JR QPRMP1 ; to the monitor
;
QGETL:
EX (SP),HL ; return address in HL
POP BC ; BC: = HL
LD DE,IOBUF
CALL @GETL
LD A,(DE)
CP 1BH
JR Z,QPRMP1 ; break
JP (HL) ; return
;
; Decodes 4 HEXA bytes from the input chain,
; returns in HL. If the number cannot be decoded,
; monitor control sales.
; Nici: AF, IY
;
QHEXHL:
EX (SP),IY ; return address
POP AF
CALL @HLHEX ; decode
JR C,QPRMP1 ; error
JP (IY)
;----------------------------------------------------
;
; L = load (load RAM on CMT)
;
;----------------------------------------------------
QLOAD:
CALL @RFILE ; cti program
JR C,CMTERR ; failed
JP QGOCMT ; launch him
;
; Read CMT file from MGBASE (1200H)
;
; output: HL '= actual boot address
; HL = address where the program was loaded (1200H)
;
; nici: DE
;
@RFILE:
CALL RHEAD ; header
RET C ; not possible
CALL @IFNL?
LD DE,MSGLD ; Loading
RST 18H
LD DE,FNAME
RST 18H ; listing file name
LD HL,(BEGIN) ; actual boot address
EXX ; keep
LD HL,MGBASE ; always from 1200H
LD (BEGIN),HL
JP RDATA ; with honored data
;
; Copier - Load
;
COPYL:
CALL @RFILE ; honor file
JR C,CMTERR ; error
EXX ; the correct address must
LD (BEGIN),HL ; data in the header for
JR @OKT ; COPYS and COPYV
;----------------------------------------------------
;
; M = modify
;
;----------------------------------------------------
QMODIF:
CALL QHEXHL ; starting address
JEB7E: CALL @?NLHL ; write on new line
CALL @MHEX ; and byte to her
CALL PRNTS
CALL QGETL
CALL @HLHEX
JR C,JEBAA
CALL @IC4DE
INC DE
CALL @2HEX
JR C,JEB7E
CP (HL)
JR NZ,JEB7E
INC DE
LD A,(DE)
CP 0DH
JR Z,JEBA7
CALL @2HEX
JR C,JEB7E
LD (HL),A
JEBA7: INC HL
JR JEB7E
JEBAA: LD H,B
LD L,C
JR JEB7E
;----------------------------------------------------
;
; S = save (save program to tape)
;
;----------------------------------------------------
QSAVE:
CALL QFNAME ; honor name
LD HL,IOBUF
LD DE,FNAME
LD BC,11H
LDIR ; move to header
CALL QTOPA ; boot address
LD (BEGIN),HL
CALL QENDA ; end address
LD BC,(BEGIN)
SCF
SBC HL,BC ; calculate the length
INC HL
INC HL ; THIS INSTRUCTION IS IN ADDITION
LD (FSIZE),HL
CALL QEXCA ; start address
LD (ENTRY),HL
LD A,1 ; type always 1 = ORDER NO
LD (HEAD),A
CALL WHEAD ; write the header
JEBDF: JP C,CMTERR
CALL QWDATA ; write down the data
JEBE5: JP QPRMPT
;
; Kopirka - Save
;
COPYS:
CALL WHEAD ; write header
JR C,JEBDF
LD HL,MGBASE ; the program is from 1200
LD (BEGIN),HL ; impose
;
; Write data to the tape, in case of error make a report
; sell monitor control
;
QWDATA:
CALL WDATA ; write down the data
JR C,JEBDF ; error bounce
;
; List OKT on display
;
; nici: DE
;
@OKT:
CALL @IFNL?
LD DE,942H
RST 18H
RET
;----------------------------------------------------
;
; V = verify (check the program on the tape
;
;----------------------------------------------------
QVERIF:
CALL VERIF ; verify normally
JEC03: JP C,CMTERR
JP QOKT
;
; Copier - Verify
;
COPYV:
CALL @VER12 ; This is to verify, however
JR C,JEC03 ; boot address 1200H
JR @OKT
;
; Verify with boot address 1200H
;
@VER12:
DI
PUSH DE
PUSH BC
PUSH HL
LD BC,(FSIZE) ; length
LD HL,MGBASE ; replacement address
JP VERIF1 ; to the lower monitor
;----------------------------------------------------
;
; B = beep (controlled whistling after each key)
;
;----------------------------------------------------
QBEEP:
LD A,(BPFLG)
RRA
CCF
RLA ; kind of condition than it was
LD (BPFLG),A
JEC27: JR JEBE5
;----------------------------------------------------
;
; D = dump
;
;----------------------------------------------------
QDUMP:
CALL QHEXHL
CALL @IC4DE
PUSH HL
CALL @HLHEX
POP DE
JR C,JEC87
JEC36: EX DE,HL
JEC37: LD B,8
LD C,17H
CALL @?NLHL
JEC3E: CALL @MHEX
INC HL
PUSH AF
LD A,(CURSOR)
ADD A,C
LD (CURSOR),A
POP AF
CP 20H
JR NC,JEC51
LD A,2EH
JEC51: CALL @?ADCN
CALL PRNTA
LD A,(CURSOR)
INC C
SUB C
LD (CURSOR),A
DEC C
DEC C
DEC C
PUSH HL
SBC HL,DE
POP HL
JR Z,JEC84
LD A,0F8H
LD (MKBOUT),A
NOP
LD A,(MKBDIN)
CP 0FEH
JR NZ,JEC78
CALL @?BLNK
JEC78: DJNZ JEC3E
JEC7A: CALL @GETKD
OR A
JR Z,JEC7A
CALL BRKEY
JR NZ,JEC37
JEC84: EQU 0EC84H
JR JEC27
JEC87: LD HL,0A0H
ADD HL,DE
JR JEC36
;
; Read the name of the file on the keyboard
;
QFNAME:
CALL @IFNL?
LD DE,MSGV0 ; Filename?
RST 18H
LD DE,IOBUF
CALL @GETL
LD A,(DE)
CP 1BH ; break?
JR NZ,JECA4 ; No, all right
JEC9F: LD HL,QPRMPT
EX (SP),HL ; return to monitor
RET
;
JECA4: LD B,0 ; name read
LD DE,IOBUF+10 ; this is where the name starts with
LD HL,IOBUF
LD A,(DE) ; name sign
CP CR
JR Z,JECD1 ; end of string
JECB1: ; ignore spaces before name
CP SPACE
JR NZ,JECB9 ; no gap
INC DE ; ignore space
LD A,(DE)
JR JECB1 ; another sign
JECB9: CP '"'
JR Z,JECC5 ; quotation marks as the 1st character
JECBD: LD (HL),A ; save the character at the beginning of the buffer
INC HL
INC B ; increase the length
LD A,17
CP B ; bigger length than it should be?
JR Z,QFNAME ; yes, honor again
JECC5: INC DE
LD A,(DE) ; another sign
CP '"'
JR Z,JECCF ; quotes or CRs close
CP CR ; name
JR NZ,JECBD ; save the character and continue
JECCF: LD A,CR ; you have to save CR
JECD1: LD (HL),A
RET
;
; Honor the loading address
;
QTOPA:
LD DE,MSGTA ; Top?
JR QHEXIN
;
; Honor the end address
;
QENDA:
LD DE,MSGEA ; End?
JR QHEXIN
;
; Honor the start address
;
QEXCA:
LD DE,MSGXA ; Exc?
;
; Print the string DE on the display and honor the HEXA number as follows
; as long as it fails
;
QHEXIN:
CALL @IFNL?
RST 18H ; list the appropriate voice
PUSH DE
LD DE,IOBUF
CALL @GETL ; honor string
LD A,(DE)
CP 1BH
POP DE
JR Z,JEC9F ; it was a break
PUSH DE ; permanent address introductory voice
LD DE,IOBUF+10 ; the number starts here
CALL @HLHEX ; try to decode
POP DE
JR C,QHEXIN ; wrong input
RET
;
; Start of program loaded from 1200H, setup to execute changing mode as necessary.
;
; input: HL = address of the file size in the header
;
QGOPGM:
IN A,(GDCMD) ; Query the mode switch, bit 1 = 1 - MZ-700, = 0 - MZ-800 mode.
BIT 1,A
JR Z,MODE700 ; MZ 700 mode, skip configuration as monitor operates in MZ-700 mode.
XOR A
OUT (GDCMD),A ; Set MZ 800 mode
CALL PLTST ; Clear screen
;
MODE700: LD C,(HL) ; BC = length
INC HL
LD B,(HL)
INC HL
LD E,(HL) ; DE = Load address
LD A,(HL)
INC HL
LD D,(HL)
OR (HL)
PUSH DE
INC HL
LD E,(HL) ; DE: = start address
OR (HL)
INC HL
LD D,(HL)
OR (HL)
PUSH DE
POP IX ; IX = Exec address
POP DE ; Load address
JR NZ,BLKTR ; if the bootloader and boot address are
OUT (MMIO0 ),A ; zero, map down to RAM
BLKTR: LD HL,MGBASE
LD A, 012H ; address of the program page
CP D
JR C,LDDEC ; the program will be over 1200
JR NZ,LDINC ; the program will be below 1200
XOR A ; will be from 1200 to 12FF
CP E ;
JR NC,LDINC ;
LDDEC: DEC BC ; the program will be over 1200
PUSH HL ; addresses must be edited
LD HL,0 ; reading length
ADD HL,DE ; and reading the unit
ADD HL,BC
PUSH HL
POP DE
POP HL
ADD HL,BC
INC BC
LDDR
JR EXF0 ; run
LDINC: ; program below 1200, it's easy
LDIR
EXF0:
EXX ; to the BC start parameter
JP (IX)
; Please push key
SELM0: DB 050H, 0b8H, 092H, 0a1H, 0a4H, 092H, 020H, 09eH, 0a5H, 0a4H, 098H, 020H, 0a9H, 092H, 0bdH, CR
; F: Floppy disk
SELM1: DB 046H, 03aH, 046H, 0b8H, 0b7H, 09eH, 09eH, 0bdH, 020H, 09cH, 0a6H, 0a4H, 0a9H, CR
; Q: Quick disk
SELM2: DB 051H, 03aH, 051H, 0a5H, 0a6H, 09fH, 0a9H, 020H, 09cH, 0a6H, 0a4H, 0a9H, CR
; C: Cassette tape
SELM3: DB 043H, 03aH, 043H, 0a1H, 0a4H, 0a4H, 092H, 096H, 096H, 092H, 020H, 096H, 0a1H, 09eH, 092H, CR
; M: Monitor
SELM4: DB 04dH, 03aH, 04dH, 0b7H, 0b0H, 0a6H, 096H, 0b7H, 09dH, CR
; IPL is loading
IPLM0: DB 049H, 050H, 04cH, 020H, 0a6H, 0a4H, 020H, 0b8H, 0b7H, 0a1H, 09cH, 0a6H, 0b0H, 097H, 020H, CR
; Make ready CMT
IPLM1: DB 04dH, 0a1H, 0a9H, 092H, 020H, 09dH, 092H, 0a1H, 09cH, 0bdH, 020H, 043H, 04dH, 054H, CR
; Make ready QD
IPLM2: DB 04dH, 0a1H, 0a9H, 092H, 020H, 09dH, 092H, 0a1H, 09cH, 0bdH, 020H, 051H, 044H, CR
; Make ready FD
IPLM3: DB 04dH, 0a1H, 0a9H, 092H, 020H, 09dH, 092H, 0a1H, 09cH, 0bdH, 020H, 046H, 044H, CR
; IPL is looking for a program
IPLM4: DB 020H, 020H, 020H, 020H, 020H, 049H, 050H, 04cH, 020H, 0a6H, 0a4H, 020H, 0b8H, 0b7H, 0b7H, 0a9H, 0a6H, 0b0H, 097H, 020H, 0aaH, 0b7H, 09dH, 020H, 0a1H, 020H, 09eH, 09dH, 0b7H, 097H, 09dH, 0a1H, 0b3H, CR
; FD: Loading err
ERRM0: DB 046H, 044H, 03aH, 04cH, 0b7H, 0a1H, 09cH, 0a6H, 0b0H, 097H, 020H, 092H, 09dH, 09dH, 0b7H, 09dH, CR
; FD: Not master
ERRM1: DB 046H, 044H, 03aH, 04eH, 0b7H, 096H, 020H, 0b3H, 0a1H, 0a4H, 096H, 092H, 09dH, CR
; CMT: Loading error
ERRM2: DB 043H, 04dH, 054H, 03aH, 04cH, 0b7H, 0a1H, 09cH, 0a6H, 0b0H, 097H, 020H, 092H, 09dH, 09dH, 0b7H, 09dH, CR
; QD: Loading error
ERRM3: DB 051H, 044H, 03aH, 04cH, 0b7H, 0a1H, 09cH, 0a6H, 0b0H, 097H, 020H, 092H, 09dH, 09dH, 0b7H, 09dH, CR
; QD: File mode error
ERRM4: DB 051H, 044H, 03aH, 046H, 0a6H, 0b8H, 092H, 020H, 0b3H, 0b7H, 09cH, 092H, 020H, 092H, 09dH, 09dH, 0b7H, 09dH, CR
; SRAM: Checksum error
ERMG12: DB 053H, 052H, 041H, 04dH, 03aH, 043H, 098H, 092H, 09fH, 0a9H, 020H, 0a4H, 0a5H, 0b3H, 020H, 092H, 09dH, 09dH, CR
; ** MONITOR 9Z-504M **
MONMSG: IF TZFS_BUILD = 1
DB "** MONITOR 9Z-504TZ **", CR
ELSE
DB "** MONITOR 9Z-504M **", CR
ENDIF
; Filename?
MSGV0: DB 046H, 0a6H, 0b8H, 092H, 0b0H, 0a1H, 0b3H, 092H, 03fH, 020H, CR
; Top address?
MSGTA: DB 054H, 0b7H, 09eH, 020H, 0a1H, 09cH, 09dH, 0a4H, 03fH, 020H, CR
; Exc address?
MSGEA: DB 045H, 0b0H, 09cH, 020H, 0a1H, 09cH, 09dH, 0a4H, 03fH, 020H, CR
; End address?
MSGXA: DB 045H, 09bH, 09fH, 020H, 0a1H, 09cH, 09dH, 0a4H, 03fH, 020H, CR
; Loading
MSGLD: DB 04cH, 0b7H, 0a1H, 09cH, 0a6H, 0b0H, 097H, 020H, CR
;
;
; Initialization tables for PIO
;
TPIO: DB 0,0CFH,3FH,7
DB 0,0CFH,0,7
;
; Initialization table for Palette
;
PLTDT: DB 0,10H,20H,30H,40H
;----------------------------------------------------
;
; Monitoring displays for QD
;
;----------------------------------------------------
QQL:
CALL JEF27
JR C,JEEE0
CALL QFNAME
CALL JF25F
LD DE,MSGLD
RST 18H
JEEB6:
CALL JEEF7
JR C,JEEE0
LD A,(HEAD)
CP 1
JR NZ,JEEB6
JEEC2:
LD DE,FNAME
RST 18H
LD HL,MGBASE
JR JEECE
;
LD HL,(ENTRY)
JEECE:
LD (M1132),HL
LD HL,(BEGIN)
LD (M1134),HL
LD HL,103H
LD (M1130),HL
CALL @QDISK
JEEE0:
JR C,JEF31
LD BC,300H
EXX
LD HL,BEGIN
JP QGOPGM
;
JEEEC:
XOR A
LD (M1144),A
LD (M113F),A
LD (M1141),A
RET
;
JEEF7:
LD HL,3
LD (M1130),HL
LD HL,HEAD
LD (M1132),HL
LD HL,40H
LD (M1134),HL
JEF09:
CALL @QDISK
RET C
LD A,(IOBUF)
CP 0DH
RET Z
LD HL,IOBUF
LD DE,FNAME
LD B,11H
JEF1B:
LD A,(DE)
CP (HL)
JR NZ,JEF09
CP 0DH
RET Z
INC DE
INC HL
DJNZ JEF1B
RET
;
JEF27:
XOR A
LD (M1131),A
JP JEFE6
;
QQS:
CALL JEFE1
JEF31:
JR C,JEF92
CALL QFNAME
LD A,(IOBUF)
CP 0DH
JR Z,QQS
LD HL,IOBUF
LD DE,FNAME
LD BC,11H
LDIR
CALL QTOPA
LD (ENTRY),HL
CALL QENDA
OR A
LD BC,(ENTRY)
SBC HL,BC
INC HL
LD (BEGIN),HL
CALL QEXCA
LD (RDCRC),HL
LD A,1
LD (HEAD),A
CALL JEF9F
JR C,JEF92
CP 28H
JP NZ,JF202
LD HL,(ENTRY)
JEF74:
LD (M1136),HL
LD HL,404H
LD (M1130),HL
LD HL,HEAD
LD (M1132),HL
LD HL,40H
LD (M1134),HL
LD HL,(BEGIN)
LD (M1138),HL
CALL @QDISK
JEF92:
JP C,JF028
QOKT:
CALL @IFNL?
LD DE,TTYP
RST 18H
JP QPRMPT
;
JEF9F:
CALL JF25F
LD HL,3
LD (M1130),HL
LD HL,IOBUF
LD (M1132),HL
LD HL,40H
LD (M1134),HL
XOR A
LD (M113C),A
JEFB8:
LD A,(M113C)
INC A
CP 21H
LD (M113C),A
LD A,33H
RET NC
CALL @QDISK
CCF
RET NC
LD DE,11A4H
LD HL,FNAME
LD B,11H
JEFD1:
LD A,(DE)
CP (HL)
JR NZ,JEFB8
CP 0DH
JR Z,JEFDD
INC DE
INC HL
DJNZ JEFD1
JEFDD:
LD A,2AH
SCF
RET
;
JEFE1:
LD A,0FFH
LD (M1131),A
JEFE6:
LD A,1
LD (M1130),A
CALL @QDISK
RET
;
QQD:
CALL JEF27
JR C,JF028
CALL JF25F
LD B,0
CALL @IFNL?
LD DE,DIRMSG
RST 18H
LD HL,DIRQD
JF003:
LD (M1132),HL
LD HL,3
LD (M1130),HL
LD HL,40H
LD (M1134),HL
PUSH BC
CALL @QDISK
POP BC
JR C,JF023
INC B
LD HL,(M1132)
LD DE,12H
ADD HL,DE
JR JF003
;
JF023:
CP 28H
JR Z,JF02B
SCF
JF028:
JP C,JF0C9
JF02B:
LD A,6
LD (M1130),A
PUSH BC
CALL @QDISK
POP BC
XOR A
CP B
JR NC,JF0B2
CALL @IFNL?
LD HL,DIRQD
JF03F:
LD A,(HL)
LD DE,TTYP+1*4
DEC A
JR Z,JF07C
LD DE,TTYP+2*4
DEC A
JR Z,JF07C
LD DE,TTYP+3*4
DEC A
JR Z,JF07C
LD DE,TTYP+4*4
DEC A
JR Z,JF07C
LD DE,TTYP+5*4
DEC A
JR Z,JF07C
DEC A
JR Z,JF079
LD DE,TTYP+6*4
DEC A
JR Z,JF07C
DEC A
JR Z,JF079
DEC A
JR Z,JF079
LD DE,TTYP+7*4
DEC A
JR Z,JF07C
LD DE,TTYP+8*4
DEC A
JR Z,JF07C
JF079:
LD DE,TTYP+9*4
JF07C:
PUSH BC
LD B,4
JF07F:
CALL @PRNTS
DJNZ JF07F
POP BC
RST 18H
CALL @PRNTS
CALL @PRNTS
CALL @PRNTS
LD A,22H
CALL @PRNTC
INC HL
PUSH HL
POP DE
RST 18H
LD A,22H
CALL @PRNTC
CALL @IFNL?
LD DE,11H
ADD HL,DE
JF0A4:
CALL @GETKD
OR A
JR Z,JF0A4
CALL BRKEY
JP Z,QPRMPT
DJNZ JF03F
JF0B2:
JP QOKT
;
QQF:
LD DE,0F330H
RST 18H
CALL JF0CE
CALL JEFE1
JR C,JF0C9
LD A,2
LD (M1130),A
CALL @QDISK
JF0C9:
JP C,JF160
JR JF0B2
;
JF0CE:
CALL @IFNL?
LD DE,QDCM0
RST 18H
CALL @WNKEY
CALL @?PONT
LD A,0EFH
JF0DD:
LD (HL),A
CALL JF0EB
JR C,JF0E8
LD A,(HL)
XOR 0EFH
JR JF0DD
;
JF0E8:
XOR A
LD (HL),A
RET
;
JF0EB:
LD BC,6
JF0EE:
DEC BC
LD A,B
OR C
RET Z
LD A,1
CALL QKBD??
CP 7FH
SCF
RET Z
LD A,3
CALL QKBD??
CP 0FBH
JR Z,JF10D
LD A,8
CALL QKBD??
CP 7EH
JR NZ,JF0EE
JF10D:
XOR A
LD (HL),A
LD SP,NEWSP
JP QPRMPT
;
QKBD??:
PUSH HL
LD HL,MKBOUT
LD (HL),A
INC HL
JF11B: LD A,(HL)
PUSH AF
PUSH BC
LD B,14H
JF120:
CALL @D1200
DJNZ JF120
POP BC
POP AF
CP (HL)
JR NZ,JF11B
POP HL
RET
;
QQC:
CALL JEF27
JR C,JF160
CALL QFNAME
LD A,(IOBUF)
CP 0DH
JR Z,QQC
CALL JF25F
LD DE,MSGLD
RST 18H
CALL JEEF7
JR C,JF160
LD DE,FNAME
RST 18H
LD HL,MGBASE
LD (M1132),HL
LD HL,(BEGIN)
LD (M1134),HL
LD HL,103H
LD (M1130),HL
CALL @QDISK
JF160:
JR C,JF183
CALL @BELL
CALL @IFNL?
LD DE,QDQCM
RST 18H
LD A,2
LD (M113A),A
LD HL,0F16CH
LD SP,NEWSP-2
EX (SP),HL
CALL JF0CE
JF17B:
CALL JEFE1
JR C,JF183
CALL JEF9F
JF183:
JP C,JF202
CP 28H
JP NZ,JF202
LD HL,MGBASE
JP JEF74
;
@WNKEY:
LD B,0AH
JF193:
LD HL,MKBOUT
DEC B
LD (HL),B
INC B
INC HL
LD A,(HL)
CP 0FFH
JR NZ,@WNKEY
DJNZ JF193
RET
;
QQX:
CALL @RFILE
JP C,CMTERR
EXX
LD (BEGIN),HL
CALL @BELL
JF1AF:
CALL QFNAME
LD A,(IOBUF)
CP 0DH
JR Z,JF1AF
LD HL,IOBUF
LD DE,FNAME
LD BC,11H
LDIR
CALL @IFNL?
LD DE,QDQCM
RST 18H
LD A,(HEAD)
CP 4
JR Z,JF1D8
CP 5
JR NZ,JF1DC
DEC A
DEC A
JF1D8:
DEC A
LD (HEAD),A
JF1DC:
LD HL,112EH
LD DE,1130H
LD BC,2DH
LDDR
LD HL,0
LD (FSIZE),HL
LD A,2
LD (M113A),A
LD HL,0F1EDH
LD SP,NEWSP-2
EX (SP),HL
CALL JF0CE
CALL JEEEC
JP JF17B
;
JF202:
LD DE,0F290H
CP 28H
JR Z,JF244
LD DE,MGBDE
CP 39H
JR Z,JF244
LD DE,MGWPT
CP 2EH
JR Z,JF244
LD DE,MGNRE
CP 32H
JR Z,JF244
LD DE,MGNSE
CP 35H
JR Z,JF244
LD DE,MGUFE
CP 36H
JR Z,JF244
LD DE,MGALE
CP 2AH
JR Z,JF244
LD DE,MGTME
CP 33H
JR Z,JF244
LD DE,MGBRK
CP 0
JR Z,JF244
LD DE,MGHDE
JF244:
LD A,6
LD (M1130),A
CALL @QDISK
CALL JF25F
LD A,(M113A)
RRA
RET C
PUSH AF
CALL @IFNL?
RST 18H
POP AF
RRA
RET C
JP QPRMPT
;
JF25F:
LD A,5
LD (M1130),A
CALL @QDISK
RET
;
; Program type table.
;
TTYP: DB "OK!"
DB 0DH
DB "OBJ"
DB 0DH
DB "BTX"
DB 0DH
DB "BSD"
DB 0DH
DB "BRD"
DB 0DH
DB "RB "
DB 0DH
DB "LIB"
DB 0DH
DB "SYS"
DB 0DH
DB "GR "
DB 0DH
DB "???"
DB 0DH
; QD: File not found
MGNFE: DB 051H, 044H, 03aH, 046H, 0a6H, 0b8H, 092H, 020H, 0b0H, 0b7H, 096H, 020H, 0aaH, 0b7H, 0a5H, 0b0H, 09cH, CR
; QD: Too many files
MGTME: DB 051H, 044H, 03aH, 054H, 0b7H, 0b7H, 020H, 0b3H, 0a1H, 0b0H, 0bdH, 020H, 0aaH, 0a6H, 0b8H, 092H, 0a4H, 020H, 092H, 09dH, 09dH, CR
; QD: Hard err
MGHDE: DB 051H, 044H, 03aH, 048H, 0a1H, 09dH, 09cH, 020H, 092H, 09dH, 09dH, CR
; Already exist err
MGALE: DB 041H, 0b8H, 09dH, 092H, 0a1H, 09cH, 0bdH, 020H, 092H, 09bH, 0a6H, 0a4H, 096H, 020H, 092H, 09dH, 09dH, CR
; QD: Write protect
MGWPT: DB 051H, 044H, 03aH, 057H, 09dH, 0a6H, 096H, 092H, 020H, 09eH, 09dH, 0b7H, 096H, 092H, 09fH, 096H, CR
; QD: Not ready
MGNRE: DB 051H, 044H, 03aH, 04eH, 0b7H, 096H, 020H, 09dH, 092H, 0a1H, 09cH, 0bdH, CR
; QD: No file space
MGNSE: DB 051H, 044H, 03aH, 04eH, 0b7H, 020H, 0aaH, 0a6H, 0b8H, 092H, 020H, 0a4H, 09eH, 0a1H, 09fH, 092H, 020H, 092H, 09dH, 09dH, CR
; QD: Unformat err
MGUFE: DB 051H, 044H, 03aH, 055H, 0b0H, 0aaH, 0b7H, 09dH, 0b3H, 0a1H, 096H, 020H, 092H, 09dH, 09dH, CR
; QD: Bad disk err
MGBDE: DB 051H, 044H, 03aH, 042H, 0a1H, 09cH, 020H, 09cH, 0a6H, 0a4H, 0a9H, 020H, 092H, 09dH, 09dH, CR
; BreakT
MGBRK: DB 042H, 09dH, 092H, 0a1H, 0a9H, 021H, CR
; QD: Formatting
QDFMG: DB 051H, 044H, 03aH, 046H, 0b7H, 09dH, 0b3H, 0a1H, 096H, 096H, 0a6H, 0b0H, 097H, CR
; Set destination disk
QDQCM: DB 053H, 092H, 096H, 020H, 09cH, 092H, 0a4H, 096H, 0a6H, 0b0H, 0a1H, 096H, 0a6H, 0b7H, 0b0H, 020H, 09cH, 0a6H, 0a4H, 0a9H, CR
; OK? (Y / N)
QDCM0: DB 04fH, 04bH, 03fH, 028H, 059H, 02fH, 04eH, 029H, CR
; Directory of QD:
DIRMSG: DB 044H, 0a6H, 09dH, 092H, 09fH, 096H, 0b7H, 09dH, 0bdH, 020H, 0b7H, 0aaH, 020H, 051H, 044H, 03aH, CR
; Add in tranZPUter/TZFS customisations when enabled.
IF TZFS_BUILD = 1
; T: TZFS
SELM5: DB "T:TZFS ", 04dH, 0b7H, 0b0H, 0a6H, 096H, 0b7H, 09dH, CR
ENDIF
;
ALIGN 0F380H
;
JF380:
LD A,0C0H
OUT (0F6H),A
RET
; Add in tranZPUter/TZFS customisations when enabled.
TZFSMSG: IF TZFS_BUILD = 1
CALL MSGLET ; Display the Monitor option pointed to by DE.
LD DE, SELM5 ; Offer the TZFS option.
JP MSGLET ; Output and return.
ENDIF
GETBOOTKEY: IF TZFS_BUILD = 1
; Check to see if a boot key was pressed during reset for quick device boot.
CALL @GETKY ; key pressed during RESET?
CP 'T'
JR Z,TZFSINIT ; Init TZFS at user request.
JP BOOTKEYSEL ; Go back to original code to finish checks.
ENDIF
TZFSKEY: IF TZFS_BUILD = 1
CP 0F7H ; pressed M? - Monitor request?
JP Z, QMONIT ; Launch monitor.
LD A,2 ; Select 3rd row of keyboard matrix.
CALL QKBD??
CP 0EFH ; T key pressed?
JP NZ, KSCAN0 ; No valid key entered return to loop.
ENDIF
TZFSINIT: IF TZFS_BUILD = 1
LD HL,BOOTTZFS ; Copy the memory change routine to 'safe' memory.
LD DE,01200H
LD BC,BOOTTZFS_END - BOOTTZFS
LDIR
JP 01200H ; Execute it.
ENDIF
; Method to change from MZ-800 memory mode to TZFS.
BOOTTZFS: IF TZFS_BUILD = 1
LD A, 088H ; Issue non-standard GDG command to swap bank 7 with bank 0 memory allowing use of TZFS.
OUT (GDCMD), A
OUT (MMIO4), A ; Set memory to default.
JP 0E800H
ENDIF
BOOTTZFS_END: IF TZFS_BUILD = 1
ENDIF
ALIGN 0F400H
;
;
; EQU table, they are described in detail
; in the lower monitor
;
INTSRQ: EQU 01038H
INTADR: EQU 01039H
HEAD: EQU 010F0H
NEWSP: EQU HEAD
FNAME: EQU 010F1H
FSIZE: EQU 01102H
BEGIN: EQU 01104H
ENTRY: EQU 01106H
RDCRC: EQU 01108H
RDADR: EQU 0110AH
MGBASE: EQU 01200H
OLDSP: EQU 01148H
CONMOD: EQU 01170H
CURSOR: EQU 01171H
CURCH: EQU 01192H
CSRH: EQU 01194H
TMLONG: EQU 01195H
MGCRC: EQU 01197H
MGCRCV: EQU 01199H
AMPM: EQU 0119BH
EIFLG: EQU 0119CH
BPFLG: EQU 0119DH
TEMPO: EQU 0119EH
OKTNUM: EQU 011A0H
FREQ: EQU 011A1H
IOBUF: EQU 011A3H
;
; Variables for working with QD:
;
M1130: EQU 01130H
M1131: EQU 01131H
M1132: EQU 01132H
M1134: EQU 01134H
M1136: EQU 01136H
M1138: EQU 01138H
M113A: EQU 0113AH
M113C: EQU 0113CH
M113D: EQU 0113DH
M113E: EQU 0113EH
M113F: EQU 0113FH
M1140: EQU 01140H
M1141: EQU 01141H
M1142: EQU 01142H
M1143: EQU 01143H
M1144: EQU 01144H
M1145: EQU 01145H
;
DIRQD: EQU 0CD90H ; buffer for QD directory
;
; Variables used by FD subroutines
;
FDCB: EQU 0CEE9H ; FD parameter block
FDCMD: EQU 0CEF4H ; last view of the controller
FDON?: EQU 0CEF5H ; mechanic on flag
TFDRES: EQU 0CEF6H ; table of mounted disks
FDSTAT: EQU 0CEFBH ; status read last
FDARET: EQU 0CEFEH ; return address in case of error
FDHEAD: EQU 0CF00H ; program header on FD
;
; BINDINGS HORNI ==M DOLNI
;
SCHECK: EQU 0147H
@2HEX: EQU 041FH
@??KEY: EQU 09B3H
@?ADCN: EQU 0BB9H
@?BLNK: EQU 0DA6H
@?DACN: EQU 0BCEH
@?DPCT: EQU 0DDCH
@?PONT: EQU 0FB1H
@ASC: EQU 03DAH
@BELL: EQU 003EH
@BRKEY: EQU 001EH
@IFNL?: EQU 0009H
IFNL?: EQU 0918H
@GETKY: EQU 001BH
@GETL: EQU 0003H
@HEX: EQU 03F9H
@HLHEX: EQU 0410H
@LETNL: EQU 0006H
@MELDY: EQU 0030H
@MSG: EQU 0015H
@MSTA: EQU 0044H
@MSTP: EQU 0047H
@PRNTC: EQU 0012H
@PRNTS: EQU 000CH
@TIMRD: EQU 003BH
@TIMST: EQU 0033H
@XTEMP: EQU 0041H
@RHEAD: EQU 0027H
@RDATA: EQU 002AH
GORAM: EQU 005BH
@IC4DE: EQU 02A6H
MSTP: EQU 02BEH
TIMST: EQU 0308H
@MHEX: EQU 03B1H
WHEAD: EQU 0436H
WDATA: EQU 0475H
RHEAD: EQU 04D8H
RDATA: EQU 04F8H
BEEP: EQU 0577H
VERIF: EQU 0588H
VERIF1: EQU 0593H
@?NLHL: EQU 05FAH
@INI55: EQU 073EH
@GETKD: EQU 08CAH
PRNTS: EQU 0920H
PRNTA: EQU 096CH
@FILLA: EQU 09D5H
BRKEY: EQU 0A32H
@F0B: EQU 0FD8H ; END MARKER
END