Files
TZFS/asm/1z-013a.asm

3691 lines
148 KiB
NASM
Raw Permalink Blame History

; MONITOR PROGRAM 1Z-013A
; (MZ700) FOR PAL
; REV. 83.4.7
; Tuesday, 02 of June 1998 at 10:02 PM
; Tuesday, 09 of June 1998 at 07:17 AM
; Configurable parameters. These are set in the wrapper file, ie monitor_SA1510.asm
;
;COLW: EQU 40 ; Width of the display screen (ie. columns).
;ROW: EQU 25 ; Number of rows on display screen.
;SCRNSZ: EQU COLW * ROW ; Total size, in bytes, of the screen display area.
ORG 0000h ; 0000h Entrypoint
MONIT: JP START ; MONITOR ON
GETL: JP QGETL ; GET LINE (END "CR")
LETNL: JP QLTNL ; NEW LINE
NL: JP QNL ;
PRNTS: JP QPRTS ; PRINT SPACE
PRNTT: JP QPRTT ; PRINT TAB
PRNT: JP QPRNT ; 1 CHARACTER PRINT
MSG: JP QMSG ; 1 LINE PRINT (END "0DH")
MSGX: JP QMSGX ; RST 18H
GETKY: JP QGET ; GET KEY
BRKEY: JP QBRK ; GET BREAK
WRINF: JP QWRI ; WRITE INFORMATION
WRDAT: JP QWRD ; WRITE DATA
RDINF: JP QRDI ; READ INFORMATION
RDDAT: JP QRDD ; READ DATA
VERFY: JP QVRFY ; VERIFYING CMT
MELDY: JP QMLDY ; RST 30H
TIMST: JP QTMST ; TIME SET
NOP
NOP
JP 1038H ; INTERRUPT ROUTINE (8253)
TIMRD: JP QTMRD ; TIME READ
BELL: JP QBEL ; BELL ON
XTEMP: JP QTEMP ; TEMPO SET (1 - 7)
MSTA: JP MLDST ; MELODY START
MSTP: JP MLDSP ; MELODY STOP
START: LD SP,SPV ; STACK SET (10F0H)
IM 1 ; IM 1 SET
CALL QMODE ; 8255 MODE SET
CALL QBRK ; CTRL ?
JR NC,ST0
CP 20H ; KEY IS CTRL KEY
JR NZ,ST0
CMY0: OUT (0E1H),A ; D000-FFFFH IS DRAM
LD DE,0FFF0H ; TRANS. ADR.
LD HL,DMCP ; MEMORY CHANG PROGRAM
LD BC,05H ; BYTE SIZE
LDIR
JP 0FFF0H ; JUMP $FFF0
DMCP: OUT (0E0H),A ; 0000H-0FFFH IS DRAM
JP 0000H
ST0: LD B,0FFH ; BUFFER CLEAR
LD HL,NAME ; 10F1H-11F0H CLEAR
CALL QCLER
LD A,16H ; LASTER CLR.
CALL PRNT
IF MODE80C = 0
LD A,071H ; Black background, white characters. Bit 7 is clear as a write to bit 7 @ DFFFH selects 40Char mode.
ELSE
LD A,071H ; Blue background, white characters in colour mode. Bit 7 is set as a write to bit 7 @ DFFFH selects 80Char mode.
ENDIF
; LD A,71H ; BACK:BLUE CHA.:WRITE
LD HL,0D800H ; COLOR ADDRESS
CALL NCLR8
LD HL,TIMIN ; INTERRUPT JUMP ROUTINE
LD A,0C3H
LD (1038H),A
LD (1039H),HL
LD A,04H ; NORMAL TEMPO
LD (TEMPW),A
CALL MLDSP ; MELODY STOP
CALL NL
LD DE,MSGQ3 ; ** MONITOR 1Z-013A **
RST 18H ; CALL MGX
CALL QBEL
SS: LD A,01H
LD (SWRK),A ; KEY IN SILENT
LD HL,0E800H ; USR ROM?
LD (HL),A ; ROM CHECK
JR FD2
ST1: CALL NL
LD A,2AH ; "*" PRINT
CALL PRNT
LD DE,BUFER ; GET LINE WORK (11A3H)
CALL GETL
ST2: LD A,(DE)
INC DE
CP 0DH
JR Z,ST1
CP 'J' ; JUMP
JR Z,GOTO
CP 'L' ; LOAD PROGRAM
JR Z,LOAD
CP 'F' ; FLOPPY ACCESS
JR Z,FD
CP 'B' ; KEY IN BELL
JR Z,SG
CP '#' ; CHANG MEMORY
JR Z,CMY0
CP 'P' ; PRINTER TEST
JR Z,PTEST
CP 'M' ; MEMORY CORRECTION
JP Z,MCOR
CP 'S' ; SAVE DATA
JP Z,SAVE
CP 'V' ; VERIFYING DATA
JP Z,VRFY
CP 'D' ; DUMP DATA
JP Z,DUMP
NOP
NOP
NOP
NOP
JR ST2 ; NO COMMAND
; JUMP COMMAND
GOTO: CALL HEXIY
JP (HL)
; KEY SOUND ON/OFF
SG: LD A,(SWRK) ; D0=SOUND WORK
RRA
CCF ; CHANGE MODE
RLA
JR SS+2
; FLOPPY
FD: LD HL,0F000H ; FLOPPY I/O CHECK
FD2: LD A,(HL)
OR A
JR NZ,ST1
FD1: JP (HL)
; ERROR (LOADING)
QER: CP 02H ; A=02H : BREAK IN
JR Z,ST1
LD DE,MSGE1 ; CHECK SUM ERROR
RST 18H ; CALL MSGX
L010F: JR ST1
; LOAD COMMAND
LOAD: CALL QRDI
JR C,QER
LOA0: CALL NL
LD DE,MSGQ2 ; LOADING
RST 18H ; CALL MSGX
LD DE,NAME ; FILE NAME
RST 18H ; CALL MSGX
CALL QRDD
JR C,QER
LD HL,(EXADR) ; EXECUTE ADDRESS
LD A,H
CP 12H ; EXECUTE CHECK
JR C,L010F
JP (HL)
; GETLINE AND BREAK IN CHECK
;
; EXIT BREAK IN THEN JUMP (ST1)
; ACC=TOP OF LINE DATA
BGETL: EX (SP),HL
POP BC ; STACK LOAD
LD DE,BUFER ; MONITOR GETLINE BUFF
CALL GETL
LD A,(DE)
CP 1BH ; BREAK CODE
JR Z,L010F ; JP Z,ST1
JP (HL)
; ASCII TO HEX CONVERT
; INPUT (DE)=ASCII
; CY=1 THEN JUMP (ST1)
HEXIY: EX (SP),IY
POP AF
CALL HLHEX
JR C,L010F ; JP C,ST1
JP (IY)
MSGE1: DB "CHECK SUM ER.\r"
; PLOTTER PRINTER TEST COMMAND
; (DPG23)
; &=CONTROL COMMANDS GROUP
; C=PEN CHANGE
; G=GRAPH MODE
; S=80 CHA. IN 1 LINE
; L=40 CHA. IN 1 LINE
; T=PLOTTER TEST
; IN (DE)=PRINT DATA
PTEST: LD A,(DE)
CP '&'
JR NZ,PTST1
PTST0: INC DE
LD A,(DE)
CP 'L' ; 40 IN 1 LINE
JR Z,PLPT
CP 'S' ; 80 IN 1 LINE
JR Z,PPLPT
CP 'C' ; PEN CHANGE
JR Z,PEN
CP 'G' ; GRAPH MODE
JR Z,PLOT
CP 'T' ; TEST
JR Z,PTRN
PTST1: CALL PMSG ; PLOT MESSAGE
JP ST1
PLPT: LD DE,LLPT ; 01-09-09-0B-0D
JR PTST1
PPLPT: LD DE,SLPT ; 01-09-09-09-0D
JR PTST1
PTRN: LD A,04H ; TEST PATTERN
JR PLOT+2
PLOT: LD A,02H ; GRAPH CODE
CALL LPRNT
JR PTST0
PEN: LD A,1DH ; 1 CHANGE CODE (TEXT MODE)
JR PLOT+2
; 1CHA. PRINT TO $LPT
; IN: ACC PRINT DATA
LPRNT: LD C,0 ; RDA TEST (READY? RDA=0)
LD B,A ; PRINT DATA STORE
CALL RDA
LD A,B
OUT (0FFH),A ; DATA OUT
LD A,80H ; RDP HIGH
OUT (0FEH),A
LD C,01H ; RDA TEST
CALL RDA
XOR A ; RDP LOW
OUT (0FEH),A
RET
; $LPT MSG
; IN: DE DATA LOW ADDRESS
; 0DH MSG END
PMSG: PUSH DE
PUSH BC
PUSH AF
PMSG1: LD A,(DE) ; ACC=DATA
CALL LPRNT
LD A,(DE)
INC DE
CP 0DH ; END?
JR NZ,PMSG1
POP AF
POP BC
POP DE
RET
; RDA CHECK
; BRKEY IN TO MONITOR RETURN
; IN: C RDA CODE
RDA: IN A,(0FEH)
AND 0DH ; RDA ONLY
CP C
RET Z
CALL BRKEY
JR NZ,RDA
LD SP,SPV
JP ST1
; MELODY
; DE=DATA LOW ADDRESS
; EXIT CF=1 BREAK
; CF=0 OK
QMLDY: PUSH BC
PUSH DE
PUSH HL
LD A,02H
LD (OCTV),A
LD B,01H
MLD1: LD A,(DE)
CP 0DH ; CR
JR Z,MLD4
CP 0C8H ; END MARK
JR Z,MLD4
CP 0CFH ; UNDER OCTAVE
JR Z,MLD2
CP 2DH ; "-"
JR Z,MLD2
CP 2BH ; "+"
JR Z,MLD3
CP 0D7H ; UPPER OCTAVE
JR Z,MLD3
CP 23H ; "#" HANON
LD HL,MTBL
JR NZ,L01F5
LD HL,MNTBL
INC DE
L01F5: CALL ONPU ; ONTYO SET
JR C,MLD1
CALL RYTHM
JR C,MLD5
CALL MLDST ; MELODY START
LD B,C
JR MLD1
MLD2: LD A,3
L0207: LD (OCTV),A
INC DE
JR MLD1
MLD3: LD A,01H
JR L0207
MLD4: CALL RYTHM
MLD5: PUSH AF
CALL MLDSP
POP AF
JP RET3
; ONPU TO RATIO CONV
; EXIT (RATIO)=RATIO VALUE
; C=ONTYO*TEMPO
ONPU: PUSH BC
LD B,8
ONP1: LD A,(DE)
L0220: CP (HL)
JR Z,ONP2
INC HL
INC HL
INC HL
DJNZ L0220
SCF
INC DE
POP BC
RET
ONP2: INC HL
PUSH DE
LD E,(HL)
INC HL
LD D,(HL)
EX DE,HL
LD A,H
OR A
JR Z,L023F
LD A,(OCTV) ; 11A0H OCTAVE WORK
L0239: DEC A
JR Z,L023F
ADD HL,HL
JR L0239
L023F: LD (RATIO),HL ; 11A1H ONPU RATIO
LD HL,OCTV
LD (HL),02H
DEC HL
POP DE
INC DE
LD A,(DE)
LD B,A
AND 0F0H ; ONTYO ?
CP 30H
JR Z,L0255
LD A,(HL) ; HL=ONTYO
JR L025A
L0255: INC DE
LD A,B
AND 0FH
LD (HL),A ; HL=ONTYO
L025A: LD HL,OPTBL
ADD A,L
LD L,A
LD C,(HL)
LD A,(TEMPW)
LD B,A
XOR A
ONP3: ADD A,C
DJNZ ONP3
POP BC
LD C,A
XOR A
RET
MTBL: DB "C"
DW 0846H
DB "D"
DW 075FH
DB "E"
DW 0691H
DB "F"
DW 0633H
DB "G"
DW 0586H
DB "A"
DW 04ECH
DB "B"
DW 0464H
DB "R"
DW 0000H
MNTBL: DB "C" ; #C
DW 07CFH
DB "D" ; #D
DW 06F5H
DB "E" ; #E
DW 0633H
DB "F" ; #F
DW 05DAH
DB "G" ; #G
DW 0537H
DB "A" ; #A
DW 04A5H
DB "B" ; #B
DW 0423H
DB "R" ; #R
DW 0000H
OPTBL: DB 01H
DB 02H
DB 03H
DB 04H
DB 06H
DB 08H
DB 0CH
DB 10H
DB 18H
DB 20H
; INCREMENT DE REG.
P4DE: INC DE
INC DE
INC DE
INC DE
RET
; MELODY START & STOP
MLDST: LD HL,(RATIO)
LD A,H
OR A
JR Z,MLDSP
PUSH DE
EX DE,HL
LD HL,CONT0
LD (HL),E
LD (HL),D
LD A,01H
POP DE
JR MLDS1
MLDSP: LD A,36H ; MODE SET (8253 C0)
LD (CONTF),A ; E007H
XOR A
MLDS1: LD (SUNDG),A ; E008H
RET ; TEHRO SET
; RHYTHM
; B=COUNT DATA
; IN
; EXIT CF=1 BREAK
; CF=0 OK
RYTHM: LD HL,KEYPA ; E000H
LD (HL),0F8H
INC HL
LD A,(HL)
AND 81H ; BREAK IN CHECK
JR NZ,L02D5
SCF
RET
L02D5: LD A,(TEMP) ; E008H
RRCA ; TEMPO OUT
JR C,L02D5
L02DB: LD A,(TEMP)
RRCA
JR NC,L02DB
DJNZ L02D5
XOR A
RET
; TEMPO SET
; ACC=VALUE (1-7)
QTEMP: PUSH AF
PUSH BC
AND 0FH
LD B,A
LD A,8
SUB B
LD (TEMPW),A
POP BC
POP AF
RET
; CRT MANAGEMENT
; EXIT HL:DSPXY H=Y,L=X
; DE:MANG ADR. (ON DSPXY)
; A :MANG DATA
; CY:MANG=1
PMANG: LD HL,MANG ; CRT MANG POINTER
LD A,(1172H) ; DSPXY+1
ADD A,L
LD L,A
LD A,(HL)
INC HL
RL (HL)
OR (HL)
RR (HL)
RRCA
EX DE,HL
LD HL,(DSPXY)
RET
; TIME SET
; ACC=0 : AM
; =1 : PM
; DE=SEC: BINARY
QTMST: DI
PUSH BC
PUSH DE
PUSH HL
LD (AMPM),A ; AMPM DATA
LD A,0F0H
LD (TIMFG),A ; TIME FLAG
LD HL,0A8C0H ; 12 HOURS (43200 SECONDS)
XOR A
SBC HL,DE ; COUNT DATA = 12H-IN DATA
PUSH HL
NOP
EX DE,HL
LD HL,CONTF ; E007H
LD (HL),74H ; C1
LD (HL),0B0H ; C2
DEC HL ; CONT2
LD (HL),E ; E006H
LD (HL),D
DEC HL ; CONT1
LD (HL),0AH ; E005H STROBE 640,6<>SECONDS COUNT2
LD (HL),0
INC HL
INC HL ; CONTF
LD (HL),80H ; E007H
DEC HL ; CONT2
QTMS1: LD C,(HL) ; E006H
LD A,(HL)
CP D
JR NZ,QTMS1
LD A,C
CP E
JR NZ,QTMS1
DEC HL ; E005H
NOP
NOP
NOP
LD (HL),0FBH ; 1 SECOND (15611HZ) E005H
LD (HL),3CH
INC HL
POP DE
QTMS2: LD C,(HL) ; E006H
LD A,(HL)
CP D
JR NZ,QTMS2
LD A,C
CP E
JR NZ,QTMS2
POP HL
POP DE
POP BC
EI
RET
; BELL DATA
;
QBELD: DB 0D7H
DB "A0"
DB 0DH
NOP
NOP
; TIME READ
; EXIT ACC=0 :AM
; =1 :PM
; DE=SEC. BINARY
QTMRD: PUSH HL
LD HL,CONTF
LD (HL),80H ; E007H C2
DEC HL ; CONT2
DI
LD E,(HL)
LD D,(HL) ; e006H C2 MODE0
EI
L0363: LD A,E
OR D
JR Z,QTMR1
XOR A
LD HL,0A8C0H ; 12 HOURS
SBC HL,DE
JR C,QTMR2
EX DE,HL
LD A,(AMPM)
POP HL
RET
QTMR1: LD DE,0A8C0H
L0378: LD A,(AMPM)
XOR 01H
POP HL
RET
QTMR2: DI
LD HL,CONT2
LD A,(HL)
CPL
LD E,A
LD A,(HL)
CPL
LD D,A
EI
INC DE
JR L0378
; TIME INTERRUPT
TIMIN: PUSH AF
PUSH BC
PUSH DE
PUSH HL
LD HL,AMPM
LD A,(HL)
XOR 01H
LD (HL),A
LD HL,CONTF
LD (HL),80H ; CONT2
DEC HL
PUSH HL
LD E,(HL)
LD D,(HL)
LD HL,0A8C0H
ADD HL,DE
DEC HL
DEC HL
EX DE,HL
POP HL
LD (HL),E
LD (HL),D
POP HL
POP DE
POP BC
POP AF
EI
RET
; SPACE PRINT AND DISP ACC
; INPUT:HL=DISP. ADR.
SPHEX: CALL QPRTS ; SPACE PRINT
LD A,(HL)
CALL PRTHX ; DSP OF ACC (ASCII)
LD A,(HL)
RET
; (ASCII PRINT) FOR HL
PRTHL: LD A,H
CALL PRTHX
LD A,L
JR PRTHX
NOP
NOP
; (ASCII PRINT) FOR ACC
PRTHX: PUSH AF
RRCA
RRCA
RRCA
RRCA
CALL ASC
CALL PRNT
POP AF
CALL ASC
JP PRNT
; 80 CHA. 1 LINE CODE (DATA)
SLPT: DB 01H ; TEXT MODE
DB 09H
DB 09H
DB 09H
DB 0DH
; HEXADECIMAL TO ASCII
; IN : ACC (D3-D0)=HEXADECIMAL
; EXIT: ACC = ASCII
ASC: AND 0FH
CP 0AH
JR C,NOADD
ADD A,07H
NOADD: ADD A,30H
RET
; ASCII TO HEXADECIMAL
; IN : ACC = ASCII
; EXIT: ACC = HEXADECIMAL
; CY = 1 ERROR
HEXJ: SUB 30H
RET C ; <0
CP 0AH
CCF
RET NC ; 0-9
SUB 07H
CP 10H
CCF
RET C
CP 0AH
RET
NOP
NOP
NOP
NOP
HEX: JR HEXJ
; PRESS PLAY MESSAGE
MSGN1: DW 207FH
MSGN2: DB "PLAY\r"
MSGN3: DW 207FH
DB "RECORD.\r" ; PRESS RECORD
NOP
NOP
NOP
NOP
; 4 ASCII TO (HL)
; IN DE=DATA LOW ADDRESS
; EXIT CF=0 : OK
; =1 : OUT
HLHEX: PUSH DE
CALL L2HEX
JR C,L041D
LD H,A
CALL L2HEX
JR C,L041D
LD L,A
L041D: POP DE
RET
; 2 ASCII TO (ACC)
; IN DE=DATA LOW ADRRESS
; EXIT CF=0 : OK
; =1 : OUT
L2HEX: PUSH BC
LD A,(DE)
INC DE
CALL HEX
JR C,L0434
RRCA
RRCA
RRCA
RRCA
LD C,A
LD A,(DE)
INC DE
CALL HEX
JR C,L0434
OR C
L0434: POP BC
RET
; WRITE INFORMATION
QWRI: DI
PUSH DE
PUSH BC
PUSH HL
LD D,0D7H ; "W"
LD E,0CCH ; "L"
LD HL,IBUFE ; 10F0H
LD BC,80H ; WRITE BYTE SIZE
WRI1: CALL CKSUM ; CHECK SUM
CALL MOTOR ; MOTOR ON
JR C,WRI3
LD A,E
CP 0CCH ; "L"
JR NZ,WRI2
CALL NL
PUSH DE
LD DE,MSGN7 ; WRITING
RST 18H ; CALL MSGX
LD DE,NAME ; FILE NAME
RST 18H ; CALL MSGX
POP DE
WRI2: CALL GAP
CALL WTAPE
WRI3: JP RET2
MSGN7: DB "WRITING \r"
; 40 CHA. IN 1 LINE CODE (DATA)
LLPT: DB 01H ; TEXT MODE
DB 09H
DB 09H
DB 0BH
DB 0DH
; WRITE DATA
; EXIT CF=0 : OK
; =1 : BREAK
QWRD: DI
PUSH DE
PUSH BC
PUSH HL
LD D,0D7H ; "W"
LD E,53H ; "S"
L047D: LD BC,(SIZE) ; WRITE DATA BYTE SIZE
LD HL,(DTADR) ; WRITE DATA ADDRESS
LD A,B
OR C
JR Z,RET1
JR WRI1
; TAPE WRITE
; BC=BYTE SIZE
; HL=DATA LOW ADDRESS
; EXIT CF=0 : OK
; =1 : BREAK
WTAPE: PUSH DE
PUSH BC
PUSH HL
LD D,02H
LD A,0F8H ; 88H WOULD BE BETTER!!
LD (KEYPA),A ; E000H
WTAP1: LD A,(HL)
CALL WBYTE ; 1 BYTE WRITE
LD A,(KEYPB) ; E001H
AND 81H ; SHIFT & BREAK
JP NZ,WTAP2
LD A,02H ; BREAK IN CODE
SCF
JR WTAP3
WTAP2: INC HL
DEC BC
LD A,B
OR C
JP NZ,WTAP1
LD HL,(SUMDT) ; SUM DATA SET
LD A,H
CALL WBYTE
LD A,L
CALL WBYTE
CALL LONG
DEC D
JP NZ,L04C2
OR A
JP WTAP3
L04C2: LD B,0
L04C4: CALL SHORT
DEC B
JP NZ,L04C4
POP HL
POP BC
PUSH BC
PUSH HL
JP WTAP1
WTAP3:
RET1: POP HL
POP BC
POP DE
RET
DB 2FH
DB 4EH
; READ INFORMATION (FROM $CMT)
; EXIT ACC=0: OK CF=0
; =1: ER CF=1
; =2: BREAK CF=1
QRDI: DI
PUSH DE
PUSH BC
PUSH HL
LD D,0D2H ; "R"
LD E,0CCH ; "L"
LD BC,80H
LD HL,IBUFE
RD1: CALL MOTOR
JP C,RTP6
CALL TMARK
JP C,RTP6
CALL RTAPE
JP RTP4
; READ DATA (FROM $CMT)
; EXIT SAME UP
QRDD: DI
PUSH DE
PUSH BC
PUSH HL
LD D,0D2H ; "R"
LD E,53H ; "S"
LD BC,(SIZE)
LD HL,(DTADR)
LD A,B
OR C
JP Z,RTP4
JR RD1
; READ TAPE
; IN BC=SIZE
; DE=LOAD ADDRESS
; EXIT ACC=0 : OK CF=0
; =1 : ER =1
; =2 : BREAK=1
RTAPE: PUSH DE
PUSH BC
PUSH HL
LD H,02H ; TWICE WRITE
RTP1: LD BC,KEYPB
LD DE,CSTR
RTP2: CALL EDGE ; 1-->0 EDGE DETECT
JR C,RTP6
CALL DLY3 ; CALL DLY2*3
LD A,(DE) ; DATA (1 BIT) READ
AND 20H
JP Z,RTP2
LD D,H
LD HL,0
LD (SUMDT),HL
POP HL
POP BC
PUSH BC
PUSH HL
RTP3: CALL RBYTE ; 1 BYTE READ
JR C,RTP6
LD (HL),A
INC HL
DEC BC
LD A,B
OR C
JR NZ,RTP3
LD HL,(SUMDT) ; CHECK SUM
CALL RBYTE ; CHECK SUM DATA
JR C,RTP6
LD E,A
CALL RBYTE ; CHECK SUM DATA
JR C,RTP6
CP L
JR NZ,RTP5
LD A,E
CP H
JR NZ,RTP5
RTP8: XOR A
RTP4:
RET2: POP HL
POP BC
POP DE
CALL MSTOP
PUSH AF
LD A,(TIMFG) ; INT. CHECK
CP 0F0H
JR NZ,L0563
EI
L0563: POP AF
RET
RTP5: DEC D
JR Z,RTP7
LD H,D
CALL GAPCK
JR RTP1
RTP7: LD A,01H
JR RTP9
RTP6: LD A,02H
RTP9: SCF
JR RTP4
; BELL
QBEL: PUSH DE
LD DE,QBELD
RST 30H ; CALL MELODY
POP DE
RET
; FLASHING AND KEYIN
; EXIT: ACC INPUT KEY DATA (DSP.CODE)
; H=F0H THEN NO KEYIN (Z FLAG)
FLKEY: CALL QFLAS
CALL QKEY
CP 0F0H
RET
NOP
; VERIFY (FROM $CMT)
; EXIT ACC=0 : OK CF=0
; =1 : ER CF=1
; =2 : BREAK CF=1
QVRFY: DI
PUSH DE
PUSH BC
PUSH HL
LD BC,(SIZE)
LD HL,(DTADR)
LD D,0D2H ; "R"
LD E,53H ; "S"
LD A,B
OR C
JR Z,RTP4 ; END
CALL CKSUM
CALL MOTOR
JR C,RTP6 ; BRK
CALL TMARK ; TAPE MARK DETECT
JR C,RTP6 ; BRK
CALL TVRFY
JR RTP4
; DATA VERIFY
; BC=SIZE
; HL=DATA LOW ADDRESS
; CSMDT=CHECK SUM
; EXIT ACC=0 : OK CF=0
; =1 : ER =1
; =2 : BREAK =1
TVRFY: PUSH DE
PUSH BC
PUSH HL
LD H,02H ; COMPARE TWICE
TVF1: LD BC,KEYPB
LD DE,CSTR
TVF2: CALL EDGE
JP C,RTP6 ; BRK
CALL DLY3 ; CALL DLY2*3
LD A,(DE)
AND 20H
JP Z,TVF2
LD D,H
POP HL
POP BC
PUSH BC
PUSH HL
; COMPARE TAPE DATA AND STORAGE
TVF3: CALL RBYTE
JR C,RTP6 ; BRK
CP (HL)
JR NZ,RTP7 ; ERROR, NOT EQUAL
INC HL ; STORAGE ADDRESS + 1
DEC BC ; SIZE - 1
LD A,B
OR C
JR NZ,TVF3
; COMPARE CHECK SUM (1199H/CSMDT) AND TAPE
LD HL,(CSMDT)
CALL RBYTE
CP H
JR NZ,RTP7 ; ERROR, NOT EQUAL
CALL RBYTE
CP L
JR NZ,RTP7 ; ERROR, NOT EQUAL
DEC D ; NUMBER OF COMPARES (2) - 1
JP Z,RTP8 ; OK, 2 COMPARES
LD H,D ; (-->05C7H), SAVE NUMBER OF COMPARES
JR TVF1 ; NEXT COMPARE
; FLASHING DATA LOAD
QLOAD: PUSH AF
LD A,(FLASH)
CALL QPONT
LD (HL),A
POP AF
RET
; NEW LINE AND PRINT HL REG (ASCII)
NLPHL: CALL NL
CALL PRTHL
RET
; EDGE (TAPE DATA EDGE DETECT)
; BC=KEYPB (E001H)
; DE=CSTR (E002H)
; EXIT CF=0 OK CF=1 BREAK
EDGE: LD A,0F8H ; BREAK KEY IN (88H WOULD BE BETTER!!)
LD (KEYPA),A
NOP
EDG1: LD A,(BC)
AND 81H ; SHIFT & BREAK
JR NZ,L060E
SCF
RET
L060E: LD A,(DE)
AND 20H
JR NZ,EDG1 ; CSTR D5 = 0
EDG2: LD A,(BC) ; 8
AND 81H ; 9
JR NZ,L061A ; 10/14
SCF
RET
L061A: LD A,(DE) ; 8
AND 20H ; 9
JR Z,EDG2 ; CSTR D5 = 1 10/14
RET ; 11
NOP
NOP
NOP
NOP
; 1 BYTE READ
; EXIT SUMDT=STORE
; CF=1 : BREAK
; CF=0 : DATA=ACC
RBYTE: PUSH BC
PUSH DE
PUSH HL
LD HL,0800H ; 8 BITS
LD BC,KEYPB ; KEY DATA E001H
LD DE,CSTR ; $TAPE DATA E002H
RBY1: CALL EDGE ; 41 OR 101
JP C,RBY3 ; 13 (SHIFT & BREAK)
CALL DLY3 ; 20+18*63+33
LD A,(DE) ; DATA READ :8
AND 20H
JP Z,RBY2 ; 0
PUSH HL
LD HL,(SUMDT)
INC HL ; CHECK SUM ; COUNT HIGH BITS ON TAPE
LD (SUMDT),HL
POP HL
SCF
RBY2: LD A,L ; BUILD CHAR
RLA
LD L,A
DEC H ; BITCOUNT-1
JP NZ,RBY1
CALL EDGE
LD A,L ; CHAR READ
RBY3: POP HL
POP DE
POP BC
RET
NOP
NOP
NOP
; TAPE MARK DETECT
; E=@L@ : INFORMATION
; =@S@ : DATA
; EXIT CF=0 OK
; =1 BREAK
TMARK: CALL GAPCK
PUSH BC
PUSH DE
PUSH HL
LD HL,2828H
LD A,E
CP 0CCH ; "L"
JR Z,L066C
LD HL,1414H
L066C: LD (TMCNT),HL
LD BC,KEYPB
LD DE,CSTR
TM1: LD HL,(TMCNT)
TM2: CALL EDGE
JR C,TM4
CALL DLY3 ; CALL DLY2*3
LD A,(DE)
AND 20H
JR Z,TM1
DEC H
JR NZ,TM2
TM3: CALL EDGE
JR C,TM4
CALL DLY3 ; CALL DLY2*3
LD A,(DE)
AND 20H
JR NZ,TM1
DEC L
JR NZ,TM3
CALL EDGE
TM4:
RET3: POP HL
POP DE
POP BC
RET
; MOTOR ON
; IN D=@W@ :WRITE
; =@R@ :READ
; EXIT CF=0 OK
; =1 BREAK
;
; If the button is pressed,
MOTOR: PUSH BC
PUSH DE
PUSH HL
LD B,0AH ; Pulse motor upto 10 times if sense is low. Each pulse flips on->off or off->on
MOT1: LD A,(CSTR) ; Check sense, if low then pulse motor to switch it on.
AND 10H
JR Z,MOT4 ; If NZ (bit PC4 is high), then wait a bit and return, motor running.
; If Z then pulse the motor on circuit.
MOT2: LD B,0FFH ; 2 SEC DELAY
L06AD: CALL DLY12 ; 7 MSEC DELAY
JR L06B4 ; MOTOR ENTRY ADJUST
JR MOTOR ; ORG 06B2H
L06B4: DJNZ L06AD
XOR A
MOT7: JR RET3
MOT4: LD A,06H ;
LD HL,CSTPT ; 8255 Control register
LD (HL),A ; Set PC3 low
INC A
LD (HL),A ; Set PC3 high
DJNZ MOT1 ; Check to see if sense now active.
CALL NL ; Sense not active so play button hasnt been pressed.
LD A,D ; Determine if we are Loading or Saving, display correct message.
CP 0D7H ; "W"
JR Z,MOT8
LD DE,MSGN1 ; PLAY MARK
JR MOT9
MOT8: LD DE,MSGN3 ; "RECORD."
RST 18H ; CALL MSGX
LD DE,MSGN2 ; "PLAY"
MOT9: RST 18H ; CALL MSGX
MOT5: LD A,(CSTR) ; Check sense input and wait until it is high.
AND 10H
JR NZ,MOT2
CALL QBRK ; If sense is low, check for User Key Break entry.
JR NZ,MOT5
SCF
JR MOT7
; INITIAL MESSAGE
MSGQ3: DB "** MONITOR 1Z-013A **\r"
NOP
; MOTOR STOP
MSTOP: PUSH AF
PUSH BC
PUSH DE
LD B,0AH
MST1: LD A,(CSTR)
AND 10H
JR Z,MST3
LD A,06H
LD (CSTPT),A
INC A
LD (CSTPT),A
DJNZ MST1
MST3: JP QRSTR1
; CHECK SUM
; IN BC=SIZE
; HL=DATA ADDRESS
; EXIT SUMDT=STORE
; CSMDT=STORE
CKSUM: PUSH BC
PUSH DE
L071C: PUSH HL
LD DE,0
CKS1: LD A,B
OR C
JR NZ,CKS2
EX DE,HL
L0725: LD (SUMDT),HL ; NUMBER OF HIGHBITS IN DATA
LD (CSMDT),HL
POP HL
POP DE
POP BC
RET
CKS2: LD A,(HL)
PUSH BC
LD B,8
CKS3: RLCA
JR NC,L0737
INC DE
L0737: DJNZ CKS3
L0739: POP BC
INC HL
DEC BC
JR CKS1
; MODE SET OF KEYPORT
QMODE: LD HL,KEYPF
LD (HL),8AH ; 10001010 CTRL WORD MODE0
LD (HL),07H ; PC3=1 M-ON
LD (HL),05H ; PC2=1 INTMSK
LD (HL),01H ; TZ: Enable VGATE (2xNOP removed below to keep ROM consistency).
RET
;NOP
;NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
; 107 MICRO SEC DELAY
DLY1: LD A,15H ; 18*21+20
L075B: DEC A
JP NZ,L075B
RET
DLY2: LD A,13H ; 18*19+20
L0762: DEC A
JP NZ,L0762
RET
; 1 BYTE WRITE
WBYTE: PUSH BC
LD B,8
CALL LONG
WBY1: RLCA
CALL C,LONG
CALL NC,SHORT
DEC B
JP NZ,WBY1
POP BC
RET
; GAP + TAPEMARK
; E=@L@ LONG GAP
; =@s@ SHORT GAP
GAP: PUSH BC
PUSH DE
LD A,E
LD BC,55F0H
LD DE,2828H
CP 0CCH ; "L"
JP Z,GAP1
LD BC,2AF8H
LD DE,1414H
GAP1: CALL SHORT
DEC BC
LD A,B
OR C
JR NZ,GAP1
GAP2: CALL LONG
DEC D
JR NZ,GAP2
GAP3: CALL SHORT
DEC E
JR NZ,GAP3
CALL LONG
POP DE
POP BC
RET
; MEMORY CORRECTION
; COMMAND "M"
MCOR: CALL HEXIY ; CORRECTION ADDRESS
MCR1: CALL NLPHL ; CORRECTION ADDRESS PRINT
CALL SPHEX ; ACC-->ASCII DISP.
CALL QPRTS ; SPACE PRINT
CALL BGETL ; GET DATA & CHECK DATA
CALL HLHEX ; HL<--ASCII(DE)
JR C,MCR3
CALL P4DE ; (INC DE)*4
INC DE
CALL L2HEX ; DATA CHECK
JR C,MCR1
CP (HL)
JR NZ,MCR1
INC DE
LD A,(DE)
CP 0DH ; NOT CORRECTION ?
JR Z,MCR2
CALL L2HEX ; ACC<--HL(ASCII)
JR C,MCR1
LD (HL),A ; DATA CORRECT
MCR2: INC HL
JR MCR1
MCR3: LD H,B ; MEMORY ADDRESS
LD L,C
JR MCR1
DB "(HL)"
DB 0F1H
DB 9EH
DB "SUB ("
; GET 1 LINE STATEMENT *
; DE=DATA STORE LOW ADDRESS
; (END=CR)
QGETL: PUSH AF
PUSH BC
PUSH HL
PUSH DE
GETL1: CALL QQKEY ; ENTRY KEY
AUTO3: PUSH AF ; IN KEY DATA SAVE
LD B,A
LD A,(SWRK) ; BELL WORK
RRCA
CALL NC,QBEL ; ENTRY BELL
LD A,B
LD HL,KANAF ; KANA & GRAPH FLAGS
AND 0F0H
CP 0C0H
POP DE ; EREG=FLAGREG
LD A,B
JR NZ,GETL2 ; NOT C0H
CP 0CDH ; CR
JR Z,GETL3
CP 0CBH ; BREAK
JP Z,GETLC
CP 0CFH ; NIKO MARK WH.
JR Z,GETL2
CP 0C7H ; CRT EDITION
JR NC,GETL5 ; <=C7H
RR E ; >C7H & CFLAG, CY ? GRAPHIC MODE,CURS.DISPL.
LD A,B
JR NC,GETL5
GETL2: CALL QDSP ; DISPL.
JR GETL1
GETL5: CALL QDPCT ; CRT CONTROL
JR GETL1
; BREAK IN
GETLC: POP HL
PUSH HL
LD (HL),1BH ; BREAK CODE
INC HL
LD (HL),0DH
JR GETLR
; GETLA
GETLA: RRCA ; CY<--D7
JR NC,GETL6
JR GETLB
; DELAY 7 MSEC AND SWEP
DSWEP: CALL DLY12
CALL QSWEP
RET
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
GETL3: CALL PMANG ; CR
LD B,COLW ; 1 LINE
JR NC,GETLA
DEC H ; BEFORE LINE
GETLB: LD B,COLW*2 ; 2 LINE
GETL6: LD L,0
CALL QPNT1
POP DE ; STORE TOP ADDRESS
PUSH DE
GETLZ: LD A,(HL)
CALL QDACN
LD (DE),A
INC HL
INC DE
DJNZ GETLZ
EX DE,HL
GETLU: LD (HL),0DH
DEC HL
LD A,(HL)
CP 20H ; SPACE THEN CR
; CR AND NEW LINE
JR Z,GETLU
; NEW LINE RETURN
GETLR: CALL QLTNL
POP DE
POP HL
POP BC
POP AF
RET
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
; MESSAGE PRINT
; DE PRINT DATA LOW ADDRESS
; END=CR
QMSG: PUSH AF
PUSH BC
PUSH DE
MSG1: LD A,(DE)
CP 0DH ; CR
JR Z,MSGX2
CALL QPRNT
INC DE
JR MSG1
; ALL PRINT MESSAGE
QMSGX: PUSH AF
PUSH BC
PUSH DE
MSGX1: LD A,(DE)
CP 0DH
MSGX2: JP Z,QRSTR1
CALL QADCN
CALL PRNT3
INC DE
JR MSGX1
; TOP OF KEYTBLS
QKYSM: LD DE,KTBLS ; SHIFT ALSO
JR QKY5
; BREAK CODE IN
NBRK: LD A,0CBH ; BREAK CODE
OR A
JR QKY1
; GETKEY
; NO ECHO BACK
; EXIT ACC=ASCII CODE
QGET: CALL QKEY ; KEY IN (DISPLAY CODE)
SUB 0F0H ; NOT KEYIN CODE
RET Z
ADD A,0F0H
JP QDACN ; DISPLAY TO ASCII CODE
NOP
NOP
; 1 KEY INPUT
; IN B=KEY MODE (SHIFT, CTRL, BREAK)
; C=KEY DATA (COLUMN & ROW)
; EXIT ACC=DISPLAY CODE
; IF NO KEY ACC=F0H
; IF CY=1 THEN ATTRIBUTE ON
; (SMALL, HIRAKANA)
QKEY: PUSH BC
PUSH DE
PUSH HL
CALL DSWEP ; DELAY AND KEY SWEP
LD A,B
RLCA
JR C,QKY2
LD A,0F0H ; SHIFT OR CTRL HERE
QKY1: POP HL
POP DE
POP BC
RET
QKY2: LD DE,KTBL ; NORMAL KEY TABLE
LD A,B
CP 88H ; BREAK IN (SHIFT & BRK)
JR Z,NBRK
LD H,0 ; HL=ROW & COLUMN
LD L,C
BIT 5,A ; CTRL CHECK
JR NZ,L08F7 ; YES, CTRL
LD A,(KANAF) ; 0=NR., 1=GRAPH
RRCA
JP C,QKYGRP ; GRAPH MODE
LD A,B ; CTRL KEY CHECK
RLA
RLA
JR C,QKYSM
JR QKY5
L08F7: LD DE,KTBLC ; CONTROL KEY TABLE
QKY5: ADD HL,DE ; TABLE
QKY55: LD A,(HL)
JR QKY1
QKYGRP: BIT 6,B
JR Z,QKYGRS
LD DE,KTBLG
ADD HL,DE
SCF
JR QKY55
QKYGRS: LD DE,KTBLGS
JR QKY5
; NEWLINE
QLTNL: XOR A
LD (DPRNT),A ; ROW POINTER
LD A,0CDH ; CR
JR PRNT5
NOP
NOP
QNL: LD A,(DPRNT)
OR A
RET Z
JR QLTNL
NOP
; PRINT SPACE
QPRTS: LD A,20H
JR QPRNT
; PRINT TAB
QPRTT: CALL PRNTS
LD A,(DPRNT)
OR A
RET Z
L092C: SUB 10
JR C,QPRTT
JR NZ,L092C
NOP
NOP
NOP
; PRINT
; IN ACC=PRINT DATA (ASCII)
QPRNT: CP 0DH ; CR
JR Z,QLTNL
PUSH BC
LD C,A
LD B,A
CALL QPRT
LD A,B
POP BC
RET
MSGOK: DB "OK!\r"
; PRINT ROUTINE
; 1 CHARACTER
; INPUT:C=ASCII DATA (QDSP+QDPCT)
QPRT: LD A,C
CALL QADCN ; ASCII TO DSPLAY
LD C,A
CP 0F0H
RET Z ; ZERO=ILLEGAL DATA
AND 0F0H ; MSD CHECK
CP 0C0H
LD A,C
JR NZ,PRNT3
CP 0C7H
JR NC,PRNT3 ; CRT EDITOR
PRNT5: CALL QDPCT
CP 0C3H ; "->"
JR Z,PRNT4
CP 0C5H ; HOME
JR Z,PRNT2
CP 0C6H ; CLR
RET NZ
PRNT2: XOR A
L0968: LD (DPRNT),A
RET
PRNT3: CALL QDSP
PRNT4: LD A,(DPRNT) ; TAB POINT+1
INC A
CP COLW*2
JR C,L0968
SUB COLW*2
JR L0968
; FLASHING BYPASS 1
FLAS1: LD A,(FLASH)
JR FLAS2
; BREAK SUBROUTINE BYPASS 1
; CTRL OR NOT KEY
QBRK2: BIT 5,A ; NOT OR CTRL
JR Z,QBRK3 ; CTRL
OR A ; NOTKEY A=7FH
RET
QBRK3: LD A,20H ; CTRL D5=1
OR A ; ZERO FLG CLR
SCF
RET
MSGSV: DB "FILENAME? "
DB 0DH
; DLY 7 MSEC
DLY12: PUSH BC
LD B,15H
L0999: CALL DLY3
DJNZ L0999
POP BC
RET
; LOADING MESSAGE
MSGQ2: DB "LOADING \r"
; DELAY FOR LONG PULSE
DLY4: LD A,59H ; 18*89+20
L09AB: DEC A
JP NZ,L09AB
RET
NOP
NOP
NOP
; KEY BOARD SEARCH
; & DISPLAY CODE CONVERSION
; EXIT A=DISPLAY CODE
; CY=GRAPH MODE
; WITH CURSOR DISPLAY
QQKEY: PUSH HL
CALL QSAVE
KSL1: CALL FLKEY ; KEY
JR NZ,KSL1 ; KEY IN THEN JUMP
KSL2: CALL FLKEY
JR Z,KSL2 ; NOT KEY IN THEN JUMP
LD H,A
CALL DLY12 ; DELAY CHATTER
CALL QKEY
PUSH AF
CP H ; CHATTER CHECK
POP HL
JR NZ,KSL2
PUSH HL
POP AF ; IN KEY DATA
CALL QLOAD ; FLASHING DATA LOAD
POP HL
RET
; CLEAR 2
NCLR08: XOR A ; CY FLAG
NCLR8: LD BC,0800H
CLEAR: PUSH DE ; BC=CLR BYTE SIZE, A=CLR DATA
LD D,A
CLEAR1: LD (HL),D
INC HL
DEC BC
LD A,B
OR C
JR NZ,CLEAR1
POP DE
RET
; FLASHING 2
QFLS: PUSH AF
PUSH HL
LD A,(KEYPC)
RLCA
RLCA
JR C,FLAS1
LD A,(FLSDT)
FLAS2: CALL QPONT ; DISPLAY POSITION
LD (HL),A
POP HL
POP AF
RET
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
QFLAS: JR QFLS
; SHORT AND LONG PULSE FOR 1 BIT WRITE
SHORT: PUSH AF ; 12
LD A,03H ; 9
LD (CSTPT),A ; E003H PC3=1:16
CALL DLY1 ; 20+18*21+20
CALL DLY1 ; 20+18*21+20
LD A,02H ; 9
LD (CSTPT),A ; E003H PC3=0:16
CALL DLY1 ; 20+18*21+20
CALL DLY1 ; 20+18*21+20
POP AF ; 11
RET ; 11
LONG: PUSH AF ; 11
LD A,03H ; 9
LD (CSTPT),A ; 16
CALL DLY4 ; 20+18*89+20
LD A,02H ; 9
LD (CSTPT),A ; 16
CALL DLY4 ; 20+18*89+20
POP AF ; 11
RET ; 11
NOP
NOP
NOP
NOP
NOP
; BREAK KEY CHECK
; AND SHIFT, CTRL KEY CHECK
; EXIT BREAK ON : ZERO=1
; OFF: ZERO=0
; NO KEY : CY =0
; KEY IN : CY =1
; A D6=1 : SHIFT ON
; =0 : OFF
; D5=1 : CTRL ON
; =0 : OFF
; D4=1 : SHIFT+CNT ON
; =0 : OFF
QBRK: LD A,0F8H ; LINE 8SWEEP
LD (KEYPA),A
NOP
LD A,(KEYPB)
OR A
RRA
JP C,QBRK2 ; SHIFT ?
RLA
RLA
JR NC,QBRK1 ; BREAK ?
LD A,40H ; SHIFT D6=1
SCF
RET
QBRK1: XOR A ; SHIFT ?
RET
; 320 U SEC DELAY
DLY3: LD A,3FH ; 18*63+33
JP L0762 ; JP DLY2+2
NOP
; KEY BOARD SWEEP
; EXIT B,D7=0 NO DATA
; =1 DATA
; D6=0 SHIFT OFF
; =1 SHIFT ON
; D5=0 CTRL OFF
; =1 CTRL ON
; D4=0 SHIFT+CTRL OFF
; =1 SHIFT+CTRL ON
; C = ROW & COLUMN
; 7 6 5 4 3 2 1 0
; * * ^ ^ ^ < < <
QSWEP: PUSH DE
PUSH HL
XOR A
LD B,0F8H
LD D,A
CALL QBRK
JR NZ,SWEP6
LD D,88H ; BREAK ON
JR SWEP9
SWEP6: JR NC,SWEP0
LD D,A
JR SWEP0
SWEP01: SET 7,D
SWEP0: DEC B
LD A,B
LD (KEYPA),A
CP 0EFH ; MAP SWEEP END ?
JR NZ,SWEP3
CP 0F8H ; BREAK KEY ROW
JR Z,SWEP0
SWEP9: LD B,D
POP HL
POP DE
RET
SWEP3: LD A,(KEYPB)
CPL
OR A
JR Z,SWEP0
LD E,A
SWEP2: LD H,8
LD A,B
AND 0FH
RLCA
RLCA
RLCA
LD C,A
LD A,E
L0A89: DEC H
RRCA
JR NC,L0A89
LD A,H
ADD A,C
LD C,A
JR SWEP01
;
;
; ASCII TO DISPLAY CODE TABL
;
ATBL:
; 00 - 0F
DB 0F0H ; ^ @
DB 0F0H ; ^ A
DB 0F0H ; ^ B
DB 0F3H ; ^ C
DB 0F0H ; ^ D
DB 0F5H ; ^ E
DB 0F0H ; ^ F
DB 0F0H ; ^ G
DB 0F0H ; ^ H
DB 0F0H ; ^ I
DB 0F0H ; ^ J
DB 0F0H ; ^ K
DB 0F0H ; ^ L
DB 0F0H ; ^ M
DB 0F0H ; ^ N
DB 0F0H ; ^ O
; 10 - 1F
DB 0F0H ; ^ P
DB 0C1H ; ^ Q CUR. DOWN
DB 0C2H ; ^ R CUR. UP
DB 0C3H ; ^ S CUR. RIGHT
DB 0C4H ; ^ T CUR. LEFT
DB 0C5H ; ^ U HOME
DB 0C6H ; ^ V CLEAR
DB 0F0H ; ^ W
DB 0F0H ; ^ X
DB 0F0H ; ^ Y
DB 0F0H ; ^ Z SEP.
DB 0F0H ; ^ [
DB 0F0H ; ^ \
DB 0F0H ; ^ ]
DB 0F0H ; ^ ^
DB 0F0H ; ^ -
; 20 - 2F
DB 00H ; SPACE
DB 61H ; !
DB 62H ; "
DB 63H ; #
DB 64H ; $
DB 65H ; %
DB 66H ; &
DB 67H ; '
DB 68H ; (
DB 69H ; )
DB 6BH ; *
DB 6AH ; +
DB 2FH ; ,
DB 2AH ; -
DB 2EH ; .
DB 2DH ; /
; 30 - 3F
DB 20H ; 0
DB 21H ; 1
DB 22H ; 2
DB 23H ; 3
DB 24H ; 4
DB 25H ; 5
DB 26H ; 6
DB 27H ; 7
DB 28H ; 8
DB 29H ; 9
DB 4FH ; :
DB 2CH ; ;
DB 51H ; <
DB 2BH ; =
DB 57H ; >
DB 49H ; ?
; 40 - 4F
DB 55H ; @
DB 01H ; A
DB 02H ; B
DB 03H ; C
DB 04H ; D
DB 05H ; E
DB 06H ; F
DB 07H ; G
DB 08H ; H
DB 09H ; I
DB 0AH ; J
DB 0BH ; K
DB 0CH ; L
DB 0DH ; M
DB 0EH ; N
DB 0FH ; O
; 50 - 5F
DB 10H ; P
DB 11H ; Q
DB 12H ; R
DB 13H ; S
DB 14H ; T
DB 15H ; U
DB 16H ; V
DB 17H ; W
DB 18H ; X
DB 19H ; Y
DB 1AH ; Z
DB 52H ; [
DB 59H ; \
DB 54H ; ]
DB 50H ;
DB 45H ;
; 60 - 6F
DB 0C7H ; UFO
DB 0C8H
DB 0C9H
DB 0CAH
DB 0CBH
DB 0CCH
DB 0CDH
DB 0CEH
DB 0CFH
DB 0DFH
DB 0E7H
DB 0E8H
DB 0E5H
DB 0E9H
DB 0ECH
DB 0EDH
; 70 - 7F
DB 0D0H
DB 0D1H
DB 0D2H
DB 0D3H
DB 0D4H
DB 0D5H
DB 0D6H
DB 0D7H
DB 0D8H
DB 0D9H
DB 0DAH
DB 0DBH
DB 0DCH
DB 0DDH
DB 0DEH
DB 0C0H
; 80 - 8F
DB 80H ; }
DB 0BDH
DB 9DH
DB 0B1H
DB 0B5H
DB 0B9H
DB 0B4H
DB 9EH
DB 0B2H
DB 0B6H
DB 0BAH
DB 0BEH
DB 9FH
DB 0B3H
DB 0B7H
DB 0BBH
; 90 - 9F
DB 0BFH ; _
DB 0A3H
DB 85H
DB 0A4H ; `
DB 0A5H ; ~
DB 0A6H
DB 94H
DB 87H
DB 88H
DB 9CH
DB 82H
DB 98H
DB 84H
DB 92H
DB 90H
DB 83H
; A0 - AF
DB 91H
DB 81H
DB 9AH
DB 97H
DB 93H
DB 95H
DB 89H
DB 0A1H
DB 0AFH
DB 8BH
DB 86H
DB 96H
DB 0A2H
DB 0ABH
DB 0AAH
DB 8AH
; B0 - BF
DB 8EH
DB 0B0H
DB 0ADH
DB 8DH
DB 0A7H
DB 0A8H
DB 0A9H
DB 8FH
DB 8CH
DB 0AEH
DB 0ACH
DB 9BH
DB 0A0H
DB 99H
DB 0BCH ; {
DB 0B8H
; C0 - CF
DB 40H
DB 3BH
DB 3AH
DB 70H
DB 3CH
DB 71H
DB 5AH
DB 3DH
DB 43H
DB 56H
DB 3FH
DB 1EH
DB 4AH
DB 1CH
DB 5DH
DB 3EH
; D0 - DF
DB 5CH
DB 1FH
DB 5FH
DB 5EH
DB 37H
DB 7BH
DB 7FH
DB 36H
DB 7AH
DB 7EH
DB 33H
DB 4BH
DB 4CH
DB 1DH
DB 6CH
DB 5BH
; E0 - EF
DB 78H
DB 41H
DB 35H
DB 34H
DB 74H
DB 30H
DB 38H
DB 75H
DB 39H
DB 4DH
DB 6FH
DB 6EH
DB 32H
DB 77H
DB 76H
DB 72H
; F0 - FF
DB 73H
DB 47H
DB 7CH
DB 53H
DB 31H
DB 4EH
DB 6DH
DB 48H
DB 46H
DB 7DH
DB 44H
DB 1BH
DB 58H
DB 79H
DB 42H
DB 60H
; FLASHING DATA SAVE
QSAVE: LD HL,FLSDT
LD (HL),0EFH ; NORMAL CURSOR
LD A,(KANAF)
RRCA
JR C,L0BA0 ; GRAPH MODE
RRCA
JR NC,SV0 ; NORMAL MODE
L0BA0: LD (HL),0FFH ; GRAPH CURSOR
SV0: LD A,(HL)
PUSH AF
CALL QPONT ; FLASHING POSITION
LD A,(HL)
LD (FLASH),A
POP AF
LD (HL),A
XOR A
LD HL,KEYPA
L0BB1: LD (HL),A
CPL ; OH NO! UNUSED BITS WERE TOUCHED TOO!!!
LD (HL),A
RET
SV1: LD (HL),43H ; KANA CURSOR
JR SV0
; ASCII TO DISPLAY CODE CONVERT
; IN ACC:ASCII
; EXIT ACC:DISPLAY CODE
QADCN: PUSH BC
PUSH HL
LD HL,ATBL
LD C,A
LD B,0
ADD HL,BC
LD A,(HL)
JR DACN3
VRNS: DB "V1.0A\r" ; VERSION MANAGEMENT
NOP
NOP
NOP
; DISPLAY CODE TO ASCII CONVERSION
; IN ACC=DISPLAY CODE
; EXIT ACC=ASCII
QDACN: PUSH BC
PUSH HL
PUSH DE
LD HL,ATBL
LD D,H
LD E,L
LD BC,0100H
CPIR
JR Z,DACN1
LD A,0F0H
DACN2: POP DE
DACN3: POP HL
POP BC
RET
DACN1: OR A
DEC HL
SBC HL,DE
LD A,L
JR DACN2
;
;
; KEY MATRIX TO DISPLAY CODE TABL
;
KTBL:
;S0 00 - 07
DB 0BFH ; SPARE
DB 0CAH ; GRAPH
DB 58H ;
DB 0C9H ; ALPHA
DB 0F0H ; NO
DB 2CH ; ;
DB 4FH ; :
DB 0CDH ; CR
;S1 08 - 0F
DB 19H ; Y
DB 1AH ; Z
DB 55H ; @
DB 52H ; [
DB 54H ; ]
DB 0F0H ; NULL
DB 0F0H ; NULL
DB 0F0H ; NULL
;S2 10 - 17
DB 11H ; Q
DB 12H ; R
DB 13H ; S
DB 14H ; T
DB 15H ; U
DB 16H ; V
DB 17H ; W
DB 18H ; X
;S3 18 - 1F
DB 09H ; I
DB 0AH ; J
DB 0BH ; K
DB 0CH ; L
DB 0DH ; M
DB 0EH ; N
DB 0FH ; O
DB 10H ; P
;S4 20 - 27
DB 01H ; A
DB 02H ; B
DB 03H ; C
DB 04H ; D
DB 05H ; E
DB 06H ; F
DB 07H ; G
DB 08H ; H
;S5 28 - 2F
DB 21H ; 1
DB 22H ; 2
DB 23H ; 3
DB 24H ; 4
DB 25H ; 5
DB 26H ; 6
DB 27H ; 7
DB 28H ; 8
;S6 30 - 37
DB 59H ; \
DB 50H ;
DB 2AH ; -
DB 00H ; SPACE
DB 20H ; 0
DB 29H ; 9
DB 2FH ; ,
DB 2EH ; .
;S7 38 - 3F
DB 0C8H ; INST.
DB 0C7H ; DEL.
DB 0C2H ; CURSOR UP
DB 0C1H ; CURSOR DOWN
DB 0C3H ; CURSOR RIGHT
DB 0C4H ; CURSOR LEFT
DB 49H ; ?
DB 2DH ; /
;
;
; KTBL SHIFT ON
;
KTBLS:
;S0 00 - 07
DB 0BFH ; SPARE
DB 0CAH ; GRAPH
DB 1BH ; POND
DB 0C9H ; ALPHA
DB 0F0H ; NO
DB 6AH ; +
DB 6BH ; *
DB 0CDH ; CR
;S1 08 - 0F
DB 99H ; y
DB 9AH ; z
DB 0A4H ; `
DB 0BCH ; {
DB 40H ; }
DB 0F0H ; NULL
DB 0F0H ; NULL
DB 0F0H ; NULL
;S2 10 - 17
DB 91H ; q
DB 92H ; r
DB 93H ; s
DB 94H ; t
DB 95H ; u
DB 96H ; v
DB 97H ; w
DB 98H ; x
;S3 18 - 1F
DB 89H ; i
DB 8AH ; j
DB 8BH ; k
DB 8CH ; l
DB 8DH ; m
DB 8EH ; n
DB 8FH ; o
DB 90H ; p
;S4 20 - 27
DB 81H ; a
DB 82H ; b
DB 83H ; c
DB 84H ; d
DB 85H ; e
DB 86H ; f
DB 87H ; g
DB 88H ; h
;S5 28 - 2F
DB 61H ; !
DB 62H ; "
DB 63H ; #
DB 64H ; $
DB 65H ; %
DB 66H ; &
DB 67H ; '
DB 68H ; (
;S6 30 - 37
DB 80H ; \
DB 0A5H ; POND MARK
DB 2BH ; YEN
DB 00H ; SPACE
DB 60H ; <20>
DB 69H ; )
DB 51H ; <
DB 57H ; >
;S7 38 - 3F
DB 0C6H ; CLR
DB 0C5H ; HOME
DB 0C2H ; CURSOR UP
DB 0C1H ; CURSOR DOWN
DB 0C3H ; CURSOR RIGHT
DB 0C4H ; CURSOR LEFT
DB 5AH ;
DB 45H ;
;
;
; GRAPHIC
;
KTBLGS:
;S0 00 - 07
DB 0BFH ; SPARE
DB 0F0H ; GRAPH BUT NULL
DB 0E5H ; #
DB 0C9H ; ALPHA
DB 0F0H ; NO
DB 42H ; # ;
DB 0B6H ; #:
DB 0CDH ; CR
;S1 08 - 0F
DB 75H ; #Y
DB 76H ; #Z
DB 0B2H ; #@
DB 0D8H ; #[
DB 4EH ; #]
DB 0F0H ; #NULL
DB 0F0H ; #NULL
DB 0F0H ; #NULL
;S2 10 - 17
DB 3CH ; #Q
DB 30H ; #R
DB 44H ; #S
DB 71H ; #T
DB 79H ; #U
DB 0DAH ; #V
DB 38H ; #W
DB 6DH ; #X
;S3 18 - 1F
DB 7DH ; #I
DB 5CH ; #J
DB 5BH ; #K
DB 0B4H ; #L
DB 1CH ; #M
DB 32H ; #N
DB 0B0H ; #O
DB 0D6H ; #P
;S4 20 - 27
DB 53H ; #A
DB 6FH ; #B
DB 0DEH ; #C
DB 47H ; #D
DB 34H ; #E
DB 4AH ; #F
DB 4BH ; #G
DB 72H ; #H
;S5 28 - 2F
DB 37H ; #1
DB 3EH ; #2
DB 7FH ; #3
DB 7BH ; #4
DB 3AH ; #5
DB 5EH ; #6
DB 1FH ; #7
DB 0BDH ; #8
;S6 30 - 37
DB 0D4H ; #YEN
DB 9EH ; #+
DB 0D2H ; #-
DB 00H ; SPACE
DB 9CH ; #0
DB 0A1H ; #9
DB 0CAH ; #,
DB 0B8H ; #.
;S7 38 - 3F
DB 0C8H ; INST
DB 0C7H ; DEL.
DB 0C2H ; CURSOR UP
DB 0C1H ; CURSOR DOWN
DB 0C3H ; CURSOR RIGHT
DB 0C4H ; CURSOR LEFT
DB 0BAH ; #?
DB 0DBH ; #/
;
;
; CONTROL CODE
;
KTBLC:
;S0 00 - 07
DB 0F0H
DB 0F0H
DB 0F0H ; ^
DB 0F0H
DB 0F0H
DB 0F0H
DB 0F0H
DB 0F0H
;S1 08 - 0F
DB 0F0H ; ^Y E3
DB 5AH ; ^Z E4 (CHECKER)
DB 0F0H ; ^@
DB 0F0H ; ^[ EB/E5
DB 0F0H ; ^] EA/E7
DB 0F0H ; #NULL
DB 0F0H ; #NULL
DB 0F0H ; #NULL
;S2 10 - 17
DB 0C1H ; ^Q
DB 0C2H ; ^R
DB 0C3H ; ^S
DB 0C4H ; ^T
DB 0C5H ; ^U
DB 0C6H ; ^V
DB 0F0H ; ^W E1
DB 0F0H ; ^X E2
;S3 18 - 1F
DB 0F0H ; ^I F9
DB 0F0H ; ^J FA
DB 0F0H ; ^K FB
DB 0F0H ; ^L FC
DB 0F0H ; ^M CD
DB 0F0H ; ^N FE
DB 0F0H ; ^O FF
DB 0F0H ; ^P E0
;S4 20 - 27
DB 0F0H ; ^A F1
DB 0F0H ; ^B F2
DB 0F0H ; ^C F3
DB 0F0H ; ^D F4
DB 0F0H ; ^E F5
DB 0F0H ; ^F F6
DB 0F0H ; ^G F7
DB 0F0H ; ^H F8
;S5 28 - 2F
DB 0F0H
DB 0F0H
DB 0F0H
DB 0F0H
DB 0F0H
DB 0F0H
DB 0F0H
DB 0F0H
;S6 30 - 37 (ERROR? 7 VALUES ONLY!!)
DB 0F0H ; ^YEN E6
DB 0F0H ; ^ EF
DB 0F0H
DB 0F0H
DB 0F0H
DB 0F0H ; ^,
DB 0F0H
;S7 38 - 3F
DB 0F0H
DB 0F0H
DB 0F0H
DB 0F0H
DB 0F0H
DB 0F0H
DB 0F0H
DB 0F0H ; ^/ EE
;
;
; KANA
;
KTBLG:
;S0 00 - 07
DB 0BFH ; SPARE
DB 0F0H ; GRAPH BUT NULL
DB 0CFH ; NIKO WH.
DB 0C9H ; ALPHA
DB 0F0H ; NO
DB 0B5H ; MO
DB 4DH ; DAKU TEN
DB 0CDH ; CR
;S1 08 - 0F
DB 35H ; HA
DB 77H ; TA
DB 0D7H ; WA
DB 0B3H ; YO
DB 0B7H ; HANDAKU
DB 0F0H
DB 0F0H
DB 0F0H
;S2 10 - 17
DB 7CH ; KA
DB 70H ; KE
DB 41H ; SHI
DB 31H ; KO
DB 39H ; HI
DB 0A6H ; TE
DB 78H ; KI
DB 0DDH ; CHI
;S3 18 - 1F
DB 3DH ; FU
DB 5DH ; MI
DB 6CH ; MU
DB 56H ; ME
DB 1DH ; RHI
DB 33H ; RA
DB 0D5H ; HE
DB 0B1H ; HO
;S4 20 - 27
DB 46H ; SA
DB 6EH ; TO
DB 0D9H ; THU
DB 48H ; SU
DB 74H ; KU
DB 43H ; SE
DB 4CH ; SO
DB 73H ; MA
;S5 28 - 2F
DB 3FH ; A
DB 36H ; I
DB 7EH ; U
DB 3BH ; E
DB 7AH ; O
DB 1EH ; NA
DB 5FH ; NI
DB 0A2H ; NU
;S6 30 - 37
DB 0D3H ; YO
DB 9FH ; YU
DB 0D1H ; YA
DB 00H ; SPACE
DB 9DH ; NO
DB 0A3H ; NE
DB 0D0H ; RU
DB 0B9H ; RE
;S7 38 - 3F
DB 0C6H ; ?CLR
DB 0C5H ; ?HOME
DB 0C2H ; ?CURSOR UP
DB 0C1H ; ?CURSOR DOWN
DB 0C3H ; ?CURSOR RIGHT
DB 0C4H ; ?CURSOR LEFT
DB 0BBH ; DASH
DB 0BEH ; RO
;KTBL:
; ;S0 00 - 07
; DB 0BFH ; SPARE
; DB 0CAH ; GRAPH
; DB 58H ;
; DB 0C9H ; ALPHA
; DB 0F0H ; NO
; DB 2CH ; ;
; DB 4FH ; :
; DB 0CDH ; CR
; ;S1 08 - 0F
; DB 19H ; Y
; DB 1AH ; Z
; DB 55H ; @
; DB 52H ; [
; DB 54H ; ]
; DB 0F0H ; NULL
; DB 0F0H ; NULL
; DB 0F0H ; NULL
; ;S2 10 - 17
; DB 11H ; Q
; DB 12H ; R
; DB 13H ; S
; DB 14H ; T
; DB 15H ; U
; DB 16H ; V
; DB 17H ; W
; DB 18H ; X
; ;S3 18 - 1F
; DB 09H ; I
; DB 0AH ; J
; DB 0BH ; K
; DB 0CH ; L
; DB 0DH ; M
; DB 0EH ; N
; DB 0FH ; O
; DB 10H ; P
; ;S4 20 - 27
; DB 01H ; A
; DB 02H ; B
; DB 03H ; C
; DB 04H ; D
; DB 05H ; E
; DB 06H ; F
; DB 07H ; G
; DB 08H ; H
; ;S5 28 - 2F
; DB 21H ; 1
; DB 22H ; 2
; DB 23H ; 3
; DB 24H ; 4
; DB 25H ; 5
; DB 26H ; 6
; DB 27H ; 7
; DB 28H ; 8
; ;S6 30 - 37
; DB 59H ; \
; DB 50H ;
; DB 2AH ; -
; DB 00H ; SPACE
; DB 20H ; 0
; DB 29H ; 9
; DB 2FH ; ,
; DB 2EH ; .
; ;S7 38 - 3F
; DB 0C8H ; INST.
; DB 0C7H ; DEL.
; DB 0C2H ; CURSOR UP
; DB 0C1H ; CURSOR DOWN
; DB 0C3H ; CURSOR RIGHT
; DB 0C4H ; CURSOR LEFT
; DB 49H ; ?
; DB 2DH ; /
; ;
; ;
; ; KTBL SHIFT ON
; ;
;KTBLS:
; ;S0 00 - 07
; DB 0BFH ; SPARE
; DB 0CAH ; GRAPH
; DB 1BH ; POND
; DB 0C9H ; ALPHA
; DB 0F0H ; NO
; DB 6AH ; +
; DB 6BH ; *
; DB 0CDH ; CR
; ;S1 08 - 0F
; DB 99H ; y
; DB 9AH ; z
; DB 0A4H ; `
; DB 0BCH ; {
; DB 40H ; }
; DB 0F0H ; NULL
; DB 0F0H ; NULL
; DB 0F0H ; NULL
; ;S2 10 - 17
; DB 91H ; q
; DB 92H ; r
; DB 93H ; s
; DB 94H ; t
; DB 95H ; u
; DB 96H ; v
; DB 97H ; w
; DB 98H ; x
; ;S3 18 - 1F
; DB 89H ; i
; DB 8AH ; j
; DB 8BH ; k
; DB 8CH ; l
; DB 8DH ; m
; DB 8EH ; n
; DB 8FH ; o
; DB 90H ; p
; ;S4 20 - 27
; DB 81H ; a
; DB 82H ; b
; DB 83H ; c
; DB 84H ; d
; DB 85H ; e
; DB 86H ; f
; DB 87H ; g
; DB 88H ; h
; ;S5 28 - 2F
; DB 61H ; !
; DB 62H ; "
; DB 63H ; #
; DB 64H ; $
; DB 65H ; %
; DB 66H ; &
; DB 67H ; '
; DB 68H ; (
; ;S6 30 - 37
; DB 80H ; \
; DB 0A5H ; POND MARK
; DB 2BH ; YEN
; DB 00H ; SPACE
; DB 60H ; <20>
; DB 69H ; )
; DB 51H ; <
; DB 57H ; >
; ;S7 38 - 3F
; DB 0C6H ; CLR
; DB 0C5H ; HOME
; DB 0C2H ; CURSOR UP
; DB 0C1H ; CURSOR DOWN
; DB 0C3H ; CURSOR RIGHT
; DB 0C4H ; CURSOR LEFT
; DB 5AH ;
; DB 45H ;
; ;
; ;
; ; GRAPHIC
; ;
;KTBLCL:
; ;S0 00 - 07
; DB 0BFH ; SPARE
; DB 0F0H ; GRAPH BUT NULL
; DB 0E5H ; #
; DB 0C9H ; ALPHA
; DB 0F0H ; NO
; DB 42H ; # ;
; DB 0B6H ; #:
; DB 0CDH ; CR
; ;S1 08 - 0F
; DB 75H ; #Y
; DB 76H ; #Z
; DB 0B2H ; #@
; DB 0D8H ; #[
; DB 4EH ; #]
; DB 0F0H ; #NULL
; DB 0F0H ; #NULL
; DB 0F0H ; #NULL
; ;S2 10 - 17
; DB 3CH ; #Q
; DB 30H ; #R
; DB 44H ; #S
; DB 71H ; #T
; DB 79H ; #U
; DB 0DAH ; #V
; DB 38H ; #W
; DB 6DH ; #X
; ;S3 18 - 1F
; DB 7DH ; #I
; DB 5CH ; #J
; DB 5BH ; #K
; DB 0B4H ; #L
; DB 1CH ; #M
; DB 32H ; #N
; DB 0B0H ; #O
; DB 0D6H ; #P
; ;S4 20 - 27
; DB 53H ; #A
; DB 6FH ; #B
; DB 0DEH ; #C
; DB 47H ; #D
; DB 34H ; #E
; DB 4AH ; #F
; DB 4BH ; #G
; DB 72H ; #H
; ;S5 28 - 2F
; DB 37H ; #1
; DB 3EH ; #2
; DB 7FH ; #3
; DB 7BH ; #4
; DB 3AH ; #5
; DB 5EH ; #6
; DB 1FH ; #7
; DB 0BDH ; #8
; ;S6 30 - 37
; DB 0D4H ; #YEN
; DB 9EH ; #+
; DB 0D2H ; #-
; DB 00H ; SPACE
; DB 9CH ; #0
; DB 0A1H ; #9
; DB 0CAH ; #,
; DB 0B8H ; #.
; ;S7 38 - 3F
; DB 0C8H ; INST
; DB 0C7H ; DEL.
; DB 0C2H ; CURSOR UP
; DB 0C1H ; CURSOR DOWN
; DB 0C3H ; CURSOR RIGHT
; DB 0C4H ; CURSOR LEFT
; DB 0BAH ; #?
; DB 0DBH ; #/
; ;
; ;
; ; CONTROL CODE
; ;
;KTBLC:
; ;S0 00 - 07
; DB 0F0H
; DB 0F0H
; DB 0F0H ; ^
; DB 0F0H
; DB 0F0H
; DB 0F0H
; DB 0F0H
; DB 0F0H
; ;S1 08 - 0F
; DB 0F0H ; ^Y E3
; DB 5AH ; ^Z E4 (CHECKER)
; DB 0F0H ; ^@
; DB 0F0H ; ^[ EB/E5
; DB 0F0H ; ^] EA/E7
; DB 0F0H ; #NULL
; DB 0F0H ; #NULL
; DB 0F0H ; #NULL
; ;S2 10 - 17
; DB 0C1H ; ^Q
; DB 0C2H ; ^R
; DB 0C3H ; ^S
; DB 0C4H ; ^T
; DB 0C5H ; ^U
; DB 0C6H ; ^V
; DB 0F0H ; ^W E1
; DB 0F0H ; ^X E2
; ;S3 18 - 1F
; DB 0F0H ; ^I F9
; DB 0F0H ; ^J FA
; DB 0F0H ; ^K FB
; DB 0F0H ; ^L FC
; DB 0F0H ; ^M CD
; DB 0F0H ; ^N FE
; DB 0F0H ; ^O FF
; DB 0F0H ; ^P E0
; ;S4 20 - 27
; DB 0F0H ; ^A F1
; DB 0F0H ; ^B F2
; DB 0F0H ; ^C F3
; DB 0F0H ; ^D F4
; DB 0F0H ; ^E F5
; DB 0F0H ; ^F F6
; DB 0F0H ; ^G F7
; DB 0F0H ; ^H F8
; ;S5 28 - 2F
; DB 0F0H
; DB 0F0H
; DB 0F0H
; DB 0F0H
; DB 0F0H
; DB 0F0H
; DB 0F0H
; DB 0F0H
; ;S6 30 - 37 (ERROR? 7 VALUES ONLY!!)
; DB 0F0H ; ^YEN E6
; DB 0F0H ; ^ EF
; DB 0F0H
; DB 0F0H
; DB 0F0H
; DB 0F0H ; ^,
; DB 0F0H
; ;S7 38 - 3F
; DB 0F0H
; DB 0F0H
; DB 0F0H
; DB 0F0H
; DB 0F0H
; DB 0F0H
; DB 0F0H
; DB 0F0H ; ^/ EE
; ;
; ;
; ; KANA
; ;
;KTBLG:
; ;S0 00 - 07
; DB 0BFH ; SPARE
; DB 0F0H ; GRAPH BUT NULL
; DB 0CFH ; NIKO WH.
; DB 0C9H ; ALPHA
; DB 0F0H ; NO
; DB 0B5H ; MO
; DB 4DH ; DAKU TEN
; DB 0CDH ; CR
; ;S1 08 - 0F
; DB 35H ; HA
; DB 77H ; TA
; DB 0D7H ; WA
; DB 0B3H ; YO
; DB 0B7H ; HANDAKU
; DB 0F0H
; DB 0F0H
; DB 0F0H
; ;S2 10 - 17
; DB 7CH ; KA
; DB 70H ; KE
; DB 41H ; SHI
; DB 31H ; KO
; DB 39H ; HI
; DB 0A6H ; TE
; DB 78H ; KI
; DB 0DDH ; CHI
; ;S3 18 - 1F
; DB 3DH ; FU
; DB 5DH ; MI
; DB 6CH ; MU
; DB 56H ; ME
; DB 1DH ; RHI
; DB 33H ; RA
; DB 0D5H ; HE
; DB 0B1H ; HO
; ;S4 20 - 27
; DB 46H ; SA
; DB 6EH ; TO
; DB 0D9H ; THU
; DB 48H ; SU
; DB 74H ; KU
; DB 43H ; SE
; DB 4CH ; SO
; DB 73H ; MA
; ;S5 28 - 2F
; DB 3FH ; A
; DB 36H ; I
; DB 7EH ; U
; DB 3BH ; E
; DB 7AH ; O
; DB 1EH ; NA
; DB 5FH ; NI
; DB 0A2H ; NU
; ;S6 30 - 37
; DB 0D3H ; YO
; DB 9FH ; YU
; DB 0D1H ; YA
; DB 00H ; SPACE
; DB 9DH ; NO
; DB 0A3H ; NE
; DB 0D0H ; RU
; DB 0B9H ; RE
; ;S7 38 - 3F
; DB 0C6H ; ?CLR
; DB 0C5H ; ?HOME
; DB 0C2H ; ?CURSOR UP
; DB 0C1H ; ?CURSOR DOWN
; DB 0C3H ; ?CURSOR RIGHT
; DB 0C4H ; ?CURSOR LEFT
; DB 0BBH ; DASH
; DB 0BEH ; RO
; MEMORY DUMP COMMAND "D"
DUMP: CALL HEXIY ; START ADDRESS
CALL P4DE
PUSH HL
CALL HLHEX ; END ADDRESS
POP DE
JR C,DUM1 ; DATA ERROR THEN
L0D36: EX DE,HL
DUM3: LD B,08H ; DISPLAY 8 BYTES
LD C,23 ; CHANGE PRINT BIAS
CALL NLPHL ; NEWLINE PRINT
DUM2: CALL SPHEX ; SPACE PRINT + ACC PRINT
INC HL
PUSH AF
LD A,(DSPXY) ; DISPLAY POINT
ADD A,C
LD (DSPXY),A ; X AXIS=X+CREG
POP AF
CP 20H
JR NC,L0D51
LD A,2EH ; "."
L0D51: CALL QADCN ; ASCII TO DISPLAY CODE
CALL PRNT3
LD A,(DSPXY)
INC C
SUB C ; ASCII DISPLAY POSITION
LD (DSPXY),A
DEC C
DEC C
DEC C
PUSH HL
SBC HL,DE
POP HL
JR Z,L0D85
LD A,0F8H
LD (KEYPA),A
NOP
LD A,(KEYPB)
CP 0FEH ; SHIFT KEY ?
JR NZ,L0D78
CALL QBLNK ; 64MSEC DELAY
L0D78: DJNZ DUM2
L0D7A: CALL QKEY ; STOP DISPLAY
OR A
JR Z,L0D7A ; SPACE KEY THEN STOP
CALL QBRK ; BREAK IN ?
JR NZ,DUM3
L0D85: JP ST1 ; COMMAND IN !
DUM1: LD HL,160 ; 20*8 BYTES
ADD HL,DE
JR L0D36
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
; V-BLANK CHECK
QBLNK: PUSH AF
L0DA7: LD A,(KEYPC) ; V-BLANK
RLCA
JR NC,L0DA7
L0DAD: LD A,(KEYPC) ; 64
RLCA ;
JR C,L0DAD ; MSEC
POP AF
RET
; DISPLAY ON POINTER
; ACC=DISPLAY CODE
; EXCEPT F0H
QDSP: PUSH AF
PUSH BC
PUSH DE
PUSH HL
DSP01: CALL QPONT ; DISPLAY POSITION
LD (HL),A
LD HL,(DSPXY)
LD A,L
CP COLW-1
JR NZ,DSP04
CALL PMANG
JR C,DSP04
EX DE,HL
LD (HL),1 ; LOGICAL 1ST COLUMN
INC HL
LD (HL),0 ; LOGICAL 2ND COLUMN
DSP04: LD A,0C3H ; CURSL
JR L0DE0
; GRAPHIC STATUS CHECK
GRSTAS: LD A,(KANAF)
CP 01H
LD A,0CAH
RET
; DISPLAY CONTROL
; ACC=CONTROL CODE
QDPCT: PUSH AF
PUSH BC
PUSH DE
PUSH HL
L0DE0: LD B,A
AND 0F0H
CP 0C0H
JR NZ,CURS5
XOR B
RLCA
LD C,A
LD B,0
LD HL,CTBL ; PAGE MODE1
ADD HL,BC
LD E,(HL)
INC HL
LD D,(HL)
LD HL,(DSPXY)
EX DE,HL
JP (HL)
CURSD: EX DE,HL ; LD HL,(DSPXY)
LD A,H
CP 24
JR Z,CURS4
INC H
CURS1:
CURS3: LD (DSPXY),HL
CURS5: JP QRSTR
CURSU: EX DE,HL ; LD HL,(DSPXY)
LD A,H
OR A
JR Z,CURS5
DEC H
CURSU1: JR CURS3
CURSR: EX DE,HL ; LD HL,(DSPXY)
LD A,L
CP COLW-1
JR NC,CURS2
INC L
JR CURS3
CURS2: LD L,0
INC H
LD A,H
CP 25
JR C,CURS1
LD H,24
LD (DSPXY),HL
CURS4: JR SCROL
CURSL: EX DE,HL ; LD HL,(DSPXY)
LD A,L
OR A
JR Z,L0E2D
DEC L
JR CURS3
L0E2D: LD L,COLW-1
DEC H
JP P,CURSU1
LD H,0
LD (DSPXY),HL
JR CURS5
CLRS: LD HL,MANG
LD B,27
CALL QCLER
LD HL,0D000H ; SCRN TOP
CALL NCLR08
IF MODE80C = 0
LD A,071H ; Black background, white characters. Bit 7 is clear as a write to bit 7 @ DFFFH selects 40Char mode.
ELSE
LD A,071H ; Blue background, white characters in colour mode. Bit 7 is set as a write to bit 7 @ DFFFH selects 80Char mode.
ENDIF
;LD A,71H ; COLOR DATA
CALL NCLR8 ; D800H-DFFFH CLEAR
HOME: LD HL,0 ; DSPXY:0 X=0,Y=0
JR CURS3
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
; CR
CR: CALL PMANG
RRCA
JR NC,CURS2
LD L,0
INC H
CP 24
JR Z,CR1
INC H
JR CURS1
CR1: LD (DSPXY),HL
; SCROLL
SCROL: LD BC,SCRNSZ - COLW
LD DE,SCRN ; TOP OF $CRT ADDRESS
LD HL,SCRN+COLW ; COLUMN
PUSH BC ; 1000 STORE
LDIR
POP BC
PUSH DE
LD DE,SCRN + 800H ; COLOR RAM SCROLL
LD HL,SCRN + 800H + COLW ; SCROLL TOP + 1 LINE
LDIR
LD B,COLW ; ONE LINE
EX DE,HL
IF MODE80C = 0
LD A,071H ; Black background, white characters. Bit 7 is clear as a write to bit 7 @ DFFFH selects 40Char mode.
ELSE
LD A,071H ; Blue background, white characters in colour mode. Bit 7 is set as a write to bit 7 @ DFFFH selects 80Char mode.
ENDIF
;LD A,71H ; COLOR RAM INITIAL DATA
CALL QDINT
POP HL
LD B,COLW
CALL QCLER ; LAST LINE CLEAR
LD BC,ROW + 1 ; ROW NUMBER+1
LD DE,MANG ; LOGICAL MANAGEMENT
LD HL,MANG+1
LDIR
LD (HL),0
LD A,(MANG)
OR A
JR Z,QRSTR
LD HL,DSPXY+1
DEC (HL)
JR SCROL
; CONTROL CODE TABLE
CTBL: DW SCROL ; SCROLLING 10H
DW CURSD ; CURSOR DOWN 11H
DW CURSU ; CURSOR UP 12H
DW CURSR ; CURSOR RIGHT 13H
DW CURSL ; CURSOR LEFT 14H
DW HOME ; 15H
DW CLRS ; 16H
DW DEL ; 17H
DW INST ; 18H
DW ALPHA ; 19H
DW KANA ; GRAPHIC 1AH
DW QRSTR ; 1BH
DW QRSTR ; 1CH
DW CR ; 1DH
DW QRSTR ; 1EH
DW QRSTR ; 1FH
; INST BYPASS
INST2: SET 3,H ; COLOR RAM
LD A,(HL) ; FROM
INC HL
LD (HL),A ; TO
DEC HL ; ADDRESS ADJUST
RES 3,H
LDD ; CHANGE TRNS.
LD A,C
OR B ; BC=0 ?
JR NZ,INST2
EX DE,HL
LD (HL),0
SET 3,H ; COLOR RAM
IF MODE80C = 0
LD (HL),071H ; Black background, white characters. Bit 7 is clear as a write to bit 7 @ DFFFH selects 40Char mode.
ELSE
LD (HL),071H ; Blue background, white characters in colour mode. Bit 7 is set as a write to bit 7 @ DFFFH selects 80Char mode.
ENDIF
;LD (HL),71H
JR QRSTR
ALPHA: XOR A
ALPH1: LD (KANAF),A
; RESTORE
QRSTR: POP HL
QRSTR1: POP DE
POP BC
POP AF
RET
NOP
NOP
NOP
NOP
KANA: CALL GRSTAS
JP Z,DSP01 ; NOT GRAPH KEY THEN JUMP
LD A,01H
JR ALPH1
DEL: EX DE,HL ; LD HL,(DSPXY)
LD A,H ; HOME ?
OR L
JR Z,QRSTR
LD A,L
OR A
JR NZ,DEL1 ; LEFT SIDE ?
CALL PMANG
JR C,DEL1
CALL QPONT
DEC HL
LD (HL),0
JR L0F33 ; JUMP CURSL
DEL1: CALL PMANG
RRCA
LD A,COLW
JR NC,L0F17
RLCA ; ACC=80
L0F17: SUB L
LD B,A ; TRNS. BYTE
CALL QPONT
DEL2: LD A,(HL) ; CHANGE FROM ADDRESS
DEC HL
LD (HL),A ; TO
INC HL
SET 3,H ; COLOR RAM
LD A,(HL)
DEC HL
LD (HL),A
RES 3,H ; CHANGE
INC HL
INC HL ; NEXT
DJNZ DEL2
DEC HL ; ADDRESS ADJUST
LD (HL),0
SET 3,H
IF MODE80C = 0
LD HL,071H ; Black background, white characters. Bit 7 is clear as a write to bit 7 @ DFFFH selects 40Char mode.
ELSE
LD HL,071H ; Blue background, white characters in colour mode. Bit 7 is set as a write to bit 7 @ DFFFH selects 80Char mode.
ENDIF
;LD HL,71H ; BLUE + WHITE
L0F33: LD A,0C4H ; JP CURSL
JP L0DE0
INST: CALL PMANG
RRCA
LD L,COLW - 1
LD A,L
JR NC,L0F42
INC H
L0F42: CALL QPNT1
PUSH HL
LD HL,(DSPXY)
JR NC,L0F4D
LD A,(COLW*2) - 1
L0F4D: SUB L
LD B,0
LD C,A
POP DE
JR Z,QRSTR
LD A,(DE)
OR A
JR NZ,QRSTR
LD H,D ; HL<-DE
LD L,E
DEC HL
JP INST2 ; JUMP NEXT (BYPASS)
; PROGRAM SAVE
; COMMAND "S"
SAVE: CALL HEXIY ; START ADDRESS
LD (DTADR),HL ; DATA ADDRESS BUFFER
LD B,H
LD C,L
CALL P4DE
CALL HEXIY ; END ADDRESS
SBC HL,BC ; BYTE SIZE
INC HL
LD (SIZE),HL ; BYTE SIZE BUFFER
CALL P4DE
CALL HEXIY ; EXECUTE ADDRESS
LD (EXADR),HL ; BUFFER
CALL NL
LD DE,MSGSV ; SAVED FILENAME
RST 18H ; CALL MSGX
CALL BGETL ; FILENAME INPUT
CALL P4DE
CALL P4DE
LD HL,NAME ; NAME BUFFER
SAV1: INC DE
LD A,(DE)
LD (HL),A ; FILENAME TRANS.
INC HL
CP 0DH ; END CODE
JR NZ,SAV1
LD A,01H ; ATTRIBUTE: OBJECT CODE
LD (ATRB),A
CALL QWRI
JP C,QER ; WRITE ERROR
CALL QWRD ; DATA
JP C,QER
CALL NL
LD DE,MSGOK ; OK MESSAGE
RST 18H ; CALL MSGX
JP ST1
; COMPUTE POINT ADDRESS
; HL=SCREEN COORDINATE
; EXIT HL=POINT ADDRESS ON SCREEN
QPONT: LD HL,(DSPXY)
QPNT1: PUSH AF
PUSH BC
PUSH DE
PUSH HL
POP BC
LD DE,COLW ; 40
LD HL,SCRN-COLW
QPNT2: ADD HL,DE
DEC B
JP P,QPNT2
LD B,0
ADD HL,BC
POP DE
POP BC
POP AF
RET
; VERIFYING COMMAND "V"
VRFY: CALL QVRFY
JP C,QER
LD DE,MSGOK
RST 18H
JP ST1
; CLER
; B=SIZE
; HL=LOW ADDRESS
QCLER: XOR A
JR QDINT
QCLRFF: LD A,0FFH
QDINT: LD (HL),A
INC HL
DJNZ QDINT
RET
; GAP CHECK
GAPCK: PUSH BC
PUSH DE
PUSH HL
LD BC,KEYPB
LD DE,CSTR
GAPCK1: LD H,100
GAPCK2: CALL EDGE
JR C,GAPCK3
CALL DLY3 ; CALL DLY2*3
LD A,(DE)
AND 20H
JR NZ,GAPCK1
DEC H
JR NZ,GAPCK2
GAPCK3: JP RET3
; MONITOR WORK AREA
; (MZ700)
ORG 10F0H
SPV:
IBUFE: ; TAPE BUFFER (128 BYTES)
ATRB: DS virtual 1 ; ATTRIBUTE
NAME: DS virtual 17 ; FILE NAME
SIZE: DS virtual 2 ; BYTESIZE
DTADR: DS virtual 2 ; DATA ADDRESS
EXADR: DS virtual 2 ; EXECUTION ADDRESS
COMNT: DS virtual 104 ; COMMENT
KANAF: DS virtual 1 ; KANA FLAG (01=GRAPHIC MODE)
DSPXY: DS virtual 2 ; DISPLAY COORDINATES
MANG: DS virtual 27 ; COLUMN MANAGEMENT
FLASH: DS virtual 1 ; FLASHING DATA
FLPST: DS virtual 2 ; FLASHING POSITION
FLSST: DS virtual 1 ; FLASHING STATUS
FLSDT: DS virtual 1 ; CURSOR DATA
STRGF: DS virtual 1 ; STRING FLAG
DPRNT: DS virtual 1 ; TAB COUNTER
TMCNT: DS virtual 2 ; TAPE MARK COUNTER
SUMDT: DS virtual 2 ; CHECK SUM DATA
CSMDT: DS virtual 2 ; FOR COMPARE SUM DATA
AMPM: DS virtual 1 ; AMPM DATA
TIMFG: DS virtual 1 ; TIME FLAG
SWRK: DS virtual 1 ; KEY SOUND FLAG
TEMPW: DS virtual 1 ; TEMPO WORK
ONTYO: DS virtual 1 ; ONTYO WORK
OCTV: DS virtual 1 ; OCTAVE WORK
RATIO: DS virtual 2 ; ONPU RATIO
BUFER: DS virtual 81 ; GET LINE BUFFER
; EQU TABLE I/O REPORT
KEYPA: EQU 0E000H
KEYPB: EQU 0E001H
KEYPC: EQU 0E002H
KEYPF: EQU 0E003H
CSTR: EQU 0E002H
CSTPT: EQU 0E003H
CONT0: EQU 0E004H
CONT1: EQU 0E005H
CONT2: EQU 0E006H
CONTF: EQU 0E007H
SUNDG: EQU 0E008H
TEMP: EQU 0E008H
; MONITOR WORK AREA
SCRN: EQU 0D000H
KANST: EQU 0E003H ; KANA STATUS REPORT