Updates to RFS and disassembly of MZ700 QD and FD BASIC

This commit is contained in:
Philip Smart
2026-03-25 13:32:26 +00:00
parent 314e4e0966
commit f0526fc33c
69 changed files with 182331 additions and 768 deletions

View File

@@ -23,7 +23,7 @@
; Original source is: (C) 1978 Microsoft
; Updates (some reversed out): Grant Searle, http://searle.hostei.com/grant/index.html
; eMail: home.micros01@btinternet.com
; All other updates (C) Philip Smart, 2020-23. http://www.eaw.app philip.smart\@net2net.org
; All other updates (C) Philip Smart, 2020-26. http://www.eaw.app philip.smart\@net2net.org
;-----------------------------------------------------------------------------------------------
@@ -5666,6 +5666,7 @@ FLSHCTL1: LD HL,(DSPXYADDR) ; Load
; Keyboard processing.
;
TIMIN3: ; Perform keyboard sweep - inline to avoid overhead of a call.
IF BUILD_MZ80A > 0
; KEYBOARD SWEEP
;
; EXIT B,D7=0 NO DATA
@@ -5839,7 +5840,7 @@ MEMSW3: IF BUILD_TZFS+BUILD_RFSTZ > 0
;
LD SP,(SPISRSAVE)
EI
RET
RETI
;
; Helper to determine if a key is being held down and autorepeat should be applied.
@@ -6209,7 +6210,555 @@ KTBLC: ; CTRL ON
DB NOKEY
DB CTRL_RB
DB NOKEY
ENDIF
;
; Keyboard routine for the MZ-700 hardware.
;
IF BUILD_MZ700+BUILD_MZ1500 > 0
;
; 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
; * * ^ ^ ^ < < <
XOR A
LD B,0F8H
LD D,A
; 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
; D3=1 : BREAK ON
; =0 : OFF
BREAK: LD A,0F8H ; LINE 8SWEEP
LD (KEYPA),A
NOP
LD A,(KEYPB)
CP 03EH ; BREAK + CTRL + SHIFT = RESET TO MONITOR
JP Z, REBOOT
OR A
RRA
JP C,BREAK2 ; SHIFT ?
RLA
RLA
JR NC,BREAK1 ; BREAK ?
LD A,40H ; SHIFT D6=1
SCF
JR SWEP6
BREAK1: XOR A ; SHIFT ?
JR SWEP6
; BREAK SUBROUTINE BYPASS 1
; CTRL OR NOT KEY
BREAK2: BIT 5,A ; NOT OR CTRL
JR Z,BREAK3 ; CTRL
OR A ; NOTKEY A=7FH
JR SWEP6
BREAK3: LD A,20H ; CTRL D5=1
OR A ; ZERO FLG CLR
SCF
JR SWEP6
SWEP1: 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
JP ISRKEY0
SWEP3: LD A,(KEYPB)
LD E,A
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
ISRKEY0: LD A,B
RLCA
JP C,ISRKEY2 ; CY=1 then data available.
XOR A
LD (KEYRPT),A ; No key held then clear the auto repeat initial pause counter.
LD A,NOKEY ; No key code.
JR ISRKEY10
;
ISRKEY1: LD E, A
LD A,(KEYLAST)
CP E
JR Z, ISRAUTORPT
LD A, E
ISRKEY10: CP NOKEY
LD (KEYLAST),A
JR Z,ISREXIT
CP GRAPHKEY
JR Z,LOCKTOGGLE
CP ALPHAKEY
JR Z,ALPHATOGGLE
ISRKEYRPT: LD A,(KEYCOUNT) ; Get current count of bytes in the keyboard buffer.
CP KEYBUFSIZE - 1
JR NC, ISREXIT ; Keyboard buffer full, so waste character.
INC A
LD (KEYCOUNT),A
LD HL,(KEYWRITE) ; Get the write buffer pointer.
LD (HL), E ; Store the character.
INC L
LD A,L
AND KEYBUFSIZE-1 ; Circular buffer, keep boundaries.
LD L,A
LD (KEYWRITE),HL ; Store updated pointer.
;
ISREXIT: POP HL
POP DE
POP BC
POP AF
;
LD SP,(SPISRSAVE)
EI
RETI
;
; Helper to determine if a key is being held down and autorepeat should be applied.
; The criterion is a timer, if this expires then autorepeat is applied.
;
ISRAUTORPT: LD A,(KEYRPT) ; Increment an initial pause counter.
INC A
CP 10
JR C,ISRAUTO1 ; Once expired we can auto repeat the last key.
LD A,(KEYLAST)
CP 080H
JR NC,ISREXIT ; Dont auto repeat control keys.
LD E,A
JR ISRKEYRPT
ISRAUTO1: LD (KEYRPT),A
JR ISREXIT
;
; Method to alternate through the 3 shift modes, CAPSLOCK=1, SHIFTLOCK=2, NO LOCK=0
;
LOCKTOGGLE: LD HL,FLSDT
LD A,(SFTLK)
INC A
CP 3
JR C,LOCK0
XOR A
LOCK0: LD (SFTLK),A
OR A
LD (HL),043H ; Thick block cursor when lower case.
JR Z,LOCK1
CP 1
LD (HL),03EH ; Thick underscore when CAPS lock.
JR Z,LOCK1
LD (HL),0EFH ; Block cursor when SHIFT lock.
LOCK1: JP ISREXIT
; Method to alternate between NO LOCK and CAPSLOCK.
ALPHATOGGLE:LD HL,FLSDT
LD A,(SFTLK)
INC A
AND 001H
JR LOCK0
ISRKEY2: LD DE,KTBLSL ; KEY TABLE WITH SHIFT LOCK
LD A,B
CP 88H ; BREAK IN (SHIFT & BRK)
JR Z,ISRBRK
LD H,0 ; HL=ROW & COLUMN
LD L,C
BIT 5,A ; CTRL CHECK
JR NZ,ISRKEY15 ; YES, CTRL
LD A,(SFTLK) ; CAPSLOCK=1, SHIFTLOCK=2, NO LOCK=0
RRCA
JR C,ISRKEY3
RRCA
JR C,ISRKEY6
LD A, B
BIT 6, A
LD DE,KTBLSL ; Shift lock.
JR NZ, ISRKEY5
LD DE,KTBLNS ; Lower case.
JR ISRKEY5
; Setup pointer to Control Key mapping.
ISRKEY15: LD DE,KTBLC
; Add in offset.
ISRKEY5: ADD HL,DE
; Get key.
ISRKEY55: LD A,(HL)
JP ISRKEY1
; Setup pointer to Caps Lock mapping.
ISRKEY3: LD A, B
BIT 6, A ; Shift pressed when caps lock on?
LD DE, KTBLSL
JR NZ, ISRKEY5
LD DE,KTBLCL
JR ISRKEY5
; Setup pointer to Shift Lock mapping.
ISRKEY6: LD A, B
BIT 6, A ; Shift pressed when shift lock on?
LD DE, KTBLNS
JR NZ, ISRKEY5
LD DE,KTBLSL
JR ISRKEY5
; Break key pressed, handled in getkey routine.
ISRBRK: LD A,(KEYLAST)
CP BREAKKEY
JP Z,ISREXIT
XOR A ; Reset the keyboard buffer.
LD (KEYCOUNT),A
LD HL,KEYBUF
LD (KEYWRITE),HL
LD (KEYREAD),HL
LD A,BREAKKEY
JP ISRKEY10
KTBLSL: ; SHIFT LOCK.
;S0 00 - 07
DB 0BFH ; SPARE
DB GRAPHKEY ; GRAPH
DB 58H ;
DB ALPHAKEY ; ALPHA
DB NOKEY ; NO
DB ';' ; ;
DB ':' ; :
DB CR ; CR
;S1 08 - 0F
DB 'Y' ; Y
DB 'Z' ; Z
DB '@' ; @
DB '(' ; [
DB ')' ; ]
DB NOKEY ; NULL
DB NOKEY ; NULL
DB NOKEY ; NULL
;S2 10 - 17
DB 'Q' ; Q
DB 'R' ; R
DB 'S' ; S
DB 'T' ; T
DB 'U' ; U
DB 'V' ; V
DB 'W' ; W
DB 'X' ; X
;S3 18 - 1F
DB 'I' ; I
DB 'J' ; J
DB 'K' ; K
DB 'L' ; L
DB 'M' ; M
DB 'N' ; N
DB 'O' ; O
DB 'P' ; P
;S4 20 - 27
DB 'A' ; A
DB 'B' ; B
DB 'C' ; C
DB 'D' ; D
DB 'E' ; E
DB 'F' ; F
DB 'G' ; G
DB 'H' ; H
;S5 28 - 2F
DB '!' ; !
DB '"' ; "
DB '#' ; #
DB '$' ; $
DB '%' ; %
DB '&' ; &
DB '\'' ; '
DB '(' ; (
;S6 30 - 37
DB '\\' ; \
DB '#' ; POND MARK
DB 2BH ; YEN
DB ' ' ; SPACE
DB ' ' ; ¶
DB ')' ; )
DB '<' ; <
DB '>' ; >
;S7 38 - 3F
DB INSERT ; INST.
DB DELETE ; DEL.
DB CURSUP ; CURSOR UP
DB CURSDOWN ; CURSOR DOWN
DB CURSRIGHT ; CURSOR RIGHT
DB CURSLEFT ; CURSOR LEFT
DB '?' ; ?
DB '/' ; /
;
;
KTBLNS: ; NO SHIFT
;S0 00 - 07
DB 0BFH ; SPARE
DB GRAPHKEY ; GRAPH
DB 1BH ; POND
DB ALPHAKEY ; ALPHA
DB NOKEY ; NO
DB '+' ; +
DB '*' ; *
DB CR ; CR
;S1 08 - 0F
DB 'y' ; y
DB 'z' ; z
DB '`' ; `
DB '{' ; {
DB '}' ; }
DB NOKEY ; NULL
DB NOKEY ; NULL
DB NOKEY ; NULL
;S2 10 - 17
DB 'q' ; q
DB 'r' ; r
DB 's' ; s
DB 't' ; t
DB 'u' ; u
DB 'v' ; v
DB 'w' ; w
DB 'x' ; x
;S3 18 - 1F
DB 'i' ; i
DB 'j' ; j
DB 'k' ; k
DB 'l' ; l
DB 'm' ; m
DB 'n' ; n
DB 'o' ; o
DB 'p' ; p
;S4 20 - 27
DB 'a' ; a
DB 'b' ; b
DB 'c' ; c
DB 'd' ; d
DB 'e' ; e
DB 'f' ; f
DB 'g' ; g
DB 'h' ; h
;S5 28 - 2F
DB '1' ; 1
DB '2' ; 2
DB '3' ; 3
DB '4' ; 4
DB '5' ; 5
DB '6' ; 6
DB '7' ; 7
DB '8' ; 8
;S6 30 - 37
DB '\\' ; \
DB CURSUP ;
DB '-' ; -
DB ' ' ; SPACE
DB '0' ; 0
DB '9' ; 9
DB ',' ; ,
DB '.' ; .
;S7 38 - 3F
DB CLRKEY ; CLR.
DB HOMEKEY ; HOME.
DB CURSUP ; CURSOR UP
DB CURSDOWN ; CURSOR DOWN
DB CURSRIGHT ; CURSOR RIGHT
DB CURSLEFT ; CURSOR LEFT
DB 0C6H ; CLR
DB 5AH ;
DB 45H ;
;
;
KTBLCL: ; CAPS LOCK
;S0 00 - 07
DB 0BFH ; SPARE
DB GRAPHKEY ; GRAPH
DB 58H ;
DB ALPHAKEY ; ALPHA
DB NOKEY ; NO
DB ';' ; ;
DB ':' ; :
DB CR ; CR
;S1 08 - 0F
DB 'Y' ; Y
DB 'Z' ; Z
DB '@' ; @
DB '(' ; [
DB ')' ; ]
DB NOKEY ; NULL
DB NOKEY ; NULL
DB NOKEY ; NULL
;S2 10 - 17
DB 'Q' ; Q
DB 'R' ; R
DB 'S' ; S
DB 'T' ; T
DB 'U' ; U
DB 'V' ; V
DB 'W' ; W
DB 'X' ; X
;S3 18 - 1F
DB 'I' ; I
DB 'J' ; J
DB 'K' ; K
DB 'L' ; L
DB 'M' ; M
DB 'N' ; N
DB 'O' ; O
DB 'P' ; P
;S4 20 - 27
DB 'A' ; A
DB 'B' ; B
DB 'C' ; C
DB 'D' ; D
DB 'E' ; E
DB 'F' ; F
DB 'G' ; G
DB 'H' ; H
;S5 28 - 2F
DB '1' ; 1
DB '2' ; 2
DB '3' ; 3
DB '4' ; 4
DB '5' ; 5
DB '6' ; 6
DB '7' ; 7
DB '8' ; 8
;S6 30 - 37
DB '\\' ; \
DB CURSUP ;
DB '-' ; -
DB ' ' ; SPACE
DB '0' ; 0
DB '9' ; 9
DB ',' ; ,
DB '.' ; .
;S7 38 - 3F
DB INSERT ; INST.
DB DELETE ; DEL.
DB CURSUP ; CURSOR UP
DB CURSDOWN ; CURSOR DOWN
DB CURSRIGHT ; CURSOR RIGHT
DB CURSLEFT ; CURSOR LEFT
DB '?' ; ?
DB '/' ; /
;
;
KTBLC: ; CONTROL CODE
;S0 00 - 07
DB NOKEY
DB NOKEY
DB CTRL_CAPPA ; ^
DB NOKEY
DB NOKEY
DB NOKEY
DB NOKEY
DB NOKEY
;S1 08 - 0F
DB CTRL_Y ; ^Y E3
DB CTRL_Z ; ^Z E4 (CHECKER)
DB CTRL_AT ; ^@
DB CTRL_LB ; ^[ EB/E5
DB CTRL_RB ; ^] EA/E7
DB NOKEY ; #NULL
DB NOKEY ; #NULL
DB NOKEY ; #NULL
;S2 10 - 17
DB CTRL_Q ; ^Q
DB CTRL_R ; ^R
DB CTRL_S ; ^S
DB CTRL_T ; ^T
DB CTRL_U ; ^U
DB CTRL_V ; ^V
DB CTRL_W ; ^W E1
DB CTRL_X ; ^X E2
;S3 18 - 1F
DB CTRL_I ; ^I F9
DB CTRL_J ; ^J FA
DB CTRL_K ; ^K FB
DB CTRL_L ; ^L FC
DB CTRL_M ; ^M CD
DB CTRL_N ; ^N FE
DB CTRL_O ; ^O FF
DB CTRL_P ; ^P E0
;S4 20 - 27
DB CTRL_A ; ^A F1
DB CTRL_B ; ^B F2
DB CTRL_C ; ^C F3
DB CTRL_D ; ^D F4
DB CTRL_E ; ^E F5
DB CTRL_F ; ^F F6
DB CTRL_G ; ^G F7
DB CTRL_H ; ^H F8
;S5 28 - 2F
DB NOKEY
DB NOKEY
DB NOKEY
DB NOKEY
DB NOKEY
DB NOKEY
DB NOKEY
DB NOKEY
;S6 30 - 37 (ERROR? 7 VALUES ONLY!!)
DB NOKEY ; ^YEN E6
DB CTRL_CAPPA ; ^ EF
DB NOKEY
DB NOKEY
DB NOKEY
DB CTRL_UNDSCR ; ^,
DB NOKEY
;S7 38 - 3F
DB NOKEY
DB NOKEY
DB NOKEY
DB NOKEY
DB NOKEY
DB NOKEY
DB NOKEY
DB CTRL_SLASH ; ^/ EE
ENDIF
;-------------------------------------------------------------------------------
; END OF TIMER INTERRUPT
;-------------------------------------------------------------------------------
@@ -6551,14 +7100,32 @@ TIMESET: LD (TIMESEC),HL ; Load
;
LD HL,CONTF
LD (HL),074H ; Set Counter 1, read/load lsb first then msb, mode 2 rate generator, binary
LD (HL),0B0H ; Set Counter 2, read/load lsb first then msb, mode 0 interrupt on terminal count, binary
IF BUILD_MZ80A = 1
LD (HL),0B0H ; Set Counter 2, read/load lsb first then msb, mode 0 interrupt on terminal count, binary
ENDIF
IF BUILD_RFS = 1
LD (HL),0B6H ; Set Counter 2, read/load lsb first then msb, mode 0 interrupt on terminal count, binary
ENDIF
IF BUILD_MZ1500 = 1
LD (HL),0B0H ; Set Counter 2, read/load lsb first then msb, mode 0 interrupt on terminal count, binary
ENDIF
DEC HL
LD DE,TMRTICKINTV ; 100Hz coming into Timer 2 from Timer 1, set divisor to set interrupts per second.
LD (HL),E ; Place current time in Counter 2
LD (HL),D
DEC HL
LD (HL),03BH ; Place divisor in Counter 1, = 315, thus 31500/315 = 100
LD (HL),001H
IF BUILD_MZ80A = 1
LD (HL),03BH ; Place divisor in Counter 1, = 315, thus 31500/315 = 100
LD (HL),001H
ENDIF
IF BUILD_RFS = 1
LD (HL),09CH ; Place divisor in Counter 1, = 156, thus 15611/156 = 100
LD (HL),000H
ENDIF
IF BUILD_MZ1500 = 1
LD (HL),09CH ; Place divisor in Counter 1, = 156, thus 15611/156 = 100
LD (HL),000H
ENDIF
NOP
NOP
NOP