From 942782091be0cbcbb0c459fb9ee7dbb92233fc44 Mon Sep 17 00:00:00 2001 From: Philip Smart Date: Fri, 14 Jul 2023 22:14:53 +0100 Subject: [PATCH] Added Kuma80 and updates for MZ700 --- asm/cbios.asm | 1915 +++++++++++++++++++++------ asm/cbios_bank1.asm | 52 +- asm/cbios_bank2.asm | 6 +- asm/cbios_bank3.asm | 6 +- asm/cbios_bank4.asm | 6 +- asm/include/cpm_definitions.asm | 23 +- asm/include/msbasic_definitions.asm | 25 +- asm/include/rfs_definitions.asm | 3 + asm/monitor_1z-013a.asm | 4 +- asm/monitor_80c_1z-013a.asm | 4 +- asm/monitor_80c_sa1510.asm | 4 +- asm/monitor_80c_sa1510_hiload.asm | 4 +- asm/monitor_kuma_sa1510.asm | 10 + asm/monitor_sa1510.asm | 4 +- asm/monitor_sa1510_hiload.asm | 4 +- asm/msbasic.asm | 33 +- asm/rfs.asm | 82 +- asm/rfs_bank6.asm | 2 +- asm/sa1510.asm | 253 +++- roms/SHARP_MZ80A_RFS_IMAGE_0.img | Bin 16785408 -> 16785408 bytes roms/cbios.rom | Bin 4096 -> 4096 bytes roms/cbios_bank1.rom | Bin 2048 -> 2048 bytes roms/cbios_bank2.rom | Bin 2048 -> 2048 bytes roms/cbios_bank3.rom | Bin 2048 -> 2048 bytes roms/cbios_bank4.rom | Bin 2048 -> 2048 bytes roms/monitor_1z-009b.rom | Bin 0 -> 4096 bytes roms/monitor_sa1510.rom | Bin 4096 -> 4096 bytes roms/rfs.rom | Bin 16384 -> 16384 bytes tools/assemble_roms.sh | 12 +- tools/make_roms.sh | 1 + 30 files changed, 1912 insertions(+), 541 deletions(-) create mode 100644 asm/monitor_kuma_sa1510.asm create mode 100755 roms/monitor_1z-009b.rom diff --git a/asm/cbios.asm b/asm/cbios.asm index 2538d02..1ebbc0f 100644 --- a/asm/cbios.asm +++ b/asm/cbios.asm @@ -19,6 +19,7 @@ ;- Mar 2021 - Updates for the RFS v2.1 board. ;- Apr 2021 - Removed ROM and RAM Drive functionality as it provided no performance or ;- use benefit over SD which are much larger and RW. +;- Jun 2023 - Updates to accommodate Kuma 40/80 upgrade. ;-------------------------------------------------------------------------------------------------------- ;- This source file is free software: you can redistribute it and-or modify ;- it under the terms of the GNU General Public License as published @@ -293,8 +294,9 @@ INIT2: LD (HL),D ; Clear JR NZ,INIT2 ; CALL ?MODE ; Configure 8255 port C, set Motor Off, VGATE to 1 (off) and INTMSK to 0 (interrupts disabled). - LD A,016H + LD A,016H ; Clear screen. CALL ?PRNT + ; LD A,017H ; Blue background, white characters in colour mode. Bit 7 is set as a write to bit 7 @ DFFFH selects 80Char mode. LD HL,ARAM CALL CLR8 @@ -310,7 +312,6 @@ INIT3: LD A,(BNKCTRLRST) LD (ROMCTL),A ; Save to memory the value in the bank control register - this register is used for SPI etc so need to remember its setting. LD A,ROMBANK9 ; Screen Bank. LD (BNKSELUSER),A - ; ; Setup keyboard buffer control. LD A,0 @@ -321,7 +322,7 @@ INIT3: LD A,(BNKCTRLRST) ; Setup keyboard rate control and set to CAPSLOCK mode. ; (0 = Off, 1 = CAPSLOCK, 2 = SHIFTLOCK). - LD A,002H ; Initialise key repeater. + LD A,002H ; Initialise key repeater. LD (KEYRPT),A LD A,001H LD (SFTLK),A ; Setup shift lock, default = off. @@ -332,12 +333,23 @@ INIT3: LD A,(BNKCTRLRST) LD A,080H ; Cursor on (Bit D7=1). LD (FLASHCTL),A - ; Change to 80 character mode if enabled. - IF BUILD_80C = 1 + ; 40/80 Column card upgrade? + IF BUILD_KUMA = 0 LD HL,DSPCTL ; Setup address of display control register latch. - LD A, 128 ; 80 char mode. + IF BUILD_80C = 1 + LD A, 128 ; 80 char mode. + ELSE + LD A, 0 ; 40 char mode. + ENDIF LD E,(HL) ; Dummy operation to enable latch write via multivibrator. LD (HL), A + ELSE ; Kuma 80 column upgrade? + IF BUILD_80C = 1 + LD A, 05H ; Set the INTEN bit to enable 80 column mode. + ELSE + LD A, 04H ; Clear the INTEN bit to enable 40 column mode. + ENDIF + LD (KEYPF),A ENDIF CALL ?MLDSP @@ -372,9 +384,9 @@ INIT3: LD A,(BNKCTRLRST) ; ; Initialise the SD Card subsystem (if connected). ; - ; CALL ?SDINIT + CALL ?SDINIT LD A,0 ; No drives yet detected so zero available mask. - ; JR NZ,STRT2 + JR NZ,STRT2 SET 2,A ; Assume the SD Card is present if it initialised. ; LD DE,SDAVAIL @@ -481,8 +493,11 @@ WBTDSKOK2: CALL ?SETDRVMAP ; Refre ; OR A ; CALL Z,?SELDRIVE ; Select and start disk drive motor if floppy disk. ; - LD A,05H ; Enable interrupts at hardware level. - LD (KEYPF),A + ; Kuma modification uses INTEN to switch between 40/80 columns, interrupts are always enabled. + IF BUILD_KUMA = 0 + LD A,05H ; Enable interrupts at hardware level. + LD (KEYPF),A + ENDIF ; LD A, (CDISK) LD C, A ; C = current User/Disk for CCP jump (UUUUDDDD) @@ -511,9 +526,9 @@ ADDFLPYDRV: LD A,(DRVAVAIL) BIT 0,A RET Z ; No Floppy drives available then skip. - LD BC,128/4 ; Setup CSV/ALV parameters for a 1.4MB Floppy drive. + LD BC,128/4 ; Setup CSV/ALV parameters for a 340K / 1.4MB Floppy drive. LD (CDIRBUF+3),BC - LD BC,91 ; 720/8 + 1 + LD BC,44 ; ,91 ; 340K = 2 * (170/8 + 1), 1.4MB = 2 * (720/8 + 1) LD (CDIRBUF+5),BC LD BC,DPBLOCK3 LD (CDIRBUF+7),BC ; Address of Disk Parameters @@ -1086,10 +1101,138 @@ TIMIN2: LD A,(MTROFFTIMER) ; Is th ; ; Keyboard processing. ; -TIMIN3: CALL ?SWEP ; Perform keyboard sweep +TIMIN3: + ; + ; Keyboard routine for the Sharp MZ-80A hardware. + ; + IF BUILD_MZ80A = 1 ; Perform keyboard sweep - inline to avoid overhead of a call. + ; KEYBOARD SWEEP + ; + ; EXIT B,D7=0 NO DATA + ; =1 DATA + ; D6=0 SHIFT OFF + ; =1 SHIFT ON + ; C = ROW & COLUMN + ; +SWEP: XOR A + LD (KDATW),A ; Reset key counter + LD B,0FAH ; Starting scan line, D3:0 = scan = line 10. D5:4 not used, D7=Cursor flash. + LD D,A + + ; BREAK TEST + ; BREAK ON : ZERO = 1 + ; OFF : ZERO = 0 + ; NO KEY : CY = 0 + ; KEY IN : CY = 1 + ; A D6=1: SHIFT ON + ; =0: SHIFT OFF + ; D5=1: CTRL ON + ; =0: CTRL OFF + ; D4=1: GRAPH ON + ; =0: GRAPH OFF +BREAK: LD A,0F0H + LD (KEYPA),A ; Port A scan line 0 + NOP + LD A,(KEYPB) ; Read back key data. + OR A + RLA + JR NC,BREAK3 ; CTRL/BREAK key pressed? + RRA + RRA ; Check if SHIFT key pressed/ + JR NC,BREAK1 ; SHIFT BREAK not pressed, jump. + RRA + JR NC,BREAK2 ; Check for GRAPH. + CCF + JR SWEP6 ;SWEP1 + +BREAK1: LD A,040H ; A D6=1 SHIFT ON + SCF + JR SWEP6 + +BREAK2: LD A,001H ; No keys found to be pressed on scanline 0. + LD (KDATW),A + LD A,010H ; A D4=1 GRAPH + SCF + JR SWEP6 + +BREAK3: AND 006H ; SHIFT + GRAPH + BREAK? + JR Z,SWEP1A + AND 002H ; SHIFT ? + JR Z,SWEP1 ; Z = 1 = SHIFT BREAK pressed/ + LD A,020H ; A D5=1 CTRL + SCF + JR SWEP6 + +SWEP1: LD D,088H ; Break ON + JR SWEP9 +SWEP1A: JP ?REBOOT ; Shift + Graph + Break ON = RESET. + ; +SWEP6: LD HL,SWPW + PUSH HL + JR NC,SWEP11 + LD D,A + AND 060H ; Shift & Ctrl =no data. + JR NZ,SWEP11 + LD A,D ; Graph Check + XOR (HL) + BIT 4,A + LD (HL),D + JR Z,SWEP0 +SWEP01: SET 7,D ; Data available, set flag. +SWEP0: DEC B + POP HL ; SWEP column work + INC HL LD A,B + LD (KEYPA),A ; Port A (8255) D3:0 = Scan line output. + CP 0F0H + JR NZ,SWEP3 ; If we are not at scan line 0 then check for key data. + LD A,(HL) ; SWPW + CP 003H ; Have we scanned all lines, if yes then no data? + JR C,SWEP9 + LD (HL),000H ; + RES 7,D ; Reset data in as no data awailable. +SWEP9: LD B,D + JR ISRKEY0 + +SWEP11: LD (HL),000H + JR SWEP0 +SWEP3: LD A,(KEYPB) ; Port B (8255) D7:0 = Key data in for given scan line. + LD E,A + CPL + AND (HL) + LD (HL),E + PUSH HL + LD HL,KDATW + PUSH BC + LD B,008H +SWEP8: RLC E + JR C,SWEP7 + INC (HL) +SWEP7: DJNZ SWEP8 + POP BC + OR A + JR Z,SWEP0 + LD E,A +SWEP2: LD H,008H + LD A,B + DEC A ; TBL adjust + AND 00FH RLCA - JR C,ISRKEY2 ; CY=1 then data available. + RLCA + RLCA + LD C,A + LD A,E +SWEP12: DEC H + RRCA + JR NC,SWEP12 + LD A,H + ADD A,C + LD C,A + JP SWEP01 + +ISRKEY0: LD A,B + RLCA + JP C,ISRKEY2 ; CY=1 then data available. LD HL,KDATW LD A,(HL) ; Is a key being held down? OR A @@ -1097,7 +1240,8 @@ TIMIN3: CALL ?SWEP ; Perfo XOR A LD (KEYRPT),A ; No key held then clear the auto repeat initial pause counter. LD A,NOKEY ; No key code. -ISRKEY1: LD E,A +ISRKEY1: LD HL,KDATW + LD E,A LD A,(HL) ; Current key scan line position. INC HL LD D,(HL) ; Previous key position. @@ -1118,9 +1262,10 @@ ISRKEYRPT: LD A,(KEYCOUNT) ; Get c LD (HL), E ; Store the character. INC L LD A,L - AND KEYBUFSIZE-1 ; Circular buffer, keep boundaries. + AND KEYBUFSIZE-1 ; Circular buffer, keep boundaries. LD L,A LD (KEYWRITE),HL ; Store updated pointer. + ; ISREXIT: POP HL POP DE POP BC @@ -1128,7 +1273,7 @@ ISREXIT: POP HL ; LD SP,(SPISRSAVE) EI - RET + RETI ; ; Helper to determine if a key is being held down and autorepeat should be applied. @@ -1192,7 +1337,7 @@ ISRKEY14: RLA JR NC,ISRKEY3 ISRKEY15: LD DE,KTBLC ISRKEY5: ADD HL,DE - LD A,(HL) +ISRKEY55: LD A,(HL) JP ISRKEY1 ISRKEY3: RRA @@ -1224,130 +1369,1092 @@ ISRBRK: LD A,(KEYLAST) LD A,BREAKKEY JP ISRKEY10 - ; KEYBOARD SWEEP +KTBL: ; Strobe 0 + DB '"' + DB '!' + DB 'W' + DB 'Q' + DB 'A' + DB INSERT + DB NULL + DB 'Z' + ; Strobe 1 + DB '$' + DB '#' + DB 'R' + DB 'E' + DB 'D' + DB 'S' + DB 'X' + DB 'C' + ; Strobe 2 + DB '&' + DB '%' + DB 'Y' + DB 'T' + DB 'G' + DB 'F' + DB 'V' + DB 'B' + ; Strobe 3 + DB '(' + DB '\'' + DB 'I' + DB 'U' + DB 'J' + DB 'H' + DB 'N' + DB SPACE + ; Strobe 4 + DB '_' + DB ')' + DB 'P' + DB 'O' + DB 'L' + DB 'K' + DB '<' + DB 'M' + ; Strobe 5 + DB '~' + DB '=' + DB '{' + DB '`' + DB '*' + DB '+' + DB CURSLEFT + DB '>' + ; Strobe 6 + DB HOMEKEY + DB '|' + DB CURSRIGHT + DB CURSUP + DB CR + DB '}' + DB NULL + DB CURSUP + ; Strobe 7 + DB '8' + DB '7' + DB '5' + DB '4' + DB '2' + DB '1' + DB DBLZERO + DB '0' + ; Strobe 8 + DB '*' + DB '9' + DB '-' + DB '6' + DB NULL + DB '3' + DB NULL + DB ',' + +KTBLS: ; Strobe 0 + DB '2' + DB '1' + DB 'w' + DB 'q' + DB 'a' + DB DELETE + DB NULL + DB 'z' + ; Strobe 1 + DB '4' + DB '3' + DB 'r' + DB 'e' + DB 'd' + DB 's' + DB 'x' + DB 'c' + ; Strobe 2 + DB '6' + DB '5' + DB 'y' + DB 't' + DB 'g' + DB 'f' + DB 'v' + DB 'b' + ; Strobe 3 + DB '8' + DB '7' + DB 'i' + DB 'u' + DB 'j' + DB 'h' + DB 'n' + DB SPACE + ; Strobe 4 + DB '0' + DB '9' + DB 'p' + DB 'o' + DB 'l' + DB 'k' + DB ',' + DB 'm' + ; Strobe 5 + DB '^' + DB '-' + DB '[' + DB '@' + DB ':' + DB ';' + DB '/' + DB '.' + ; Strobe 6 + DB CLRKEY + DB '\\' + DB CURSLEFT + DB CURSDOWN + DB CR + DB ']' + DB NULL + DB '?' + +KTBLCL: ; Strobe 0 + DB '2' + DB '1' + DB 'W' + DB 'Q' + DB 'A' + DB DELETE + DB NULL + DB 'Z' + ; Strobe 1 + DB '4' + DB '3' + DB 'R' + DB 'E' + DB 'D' + DB 'S' + DB 'X' + DB 'C' + ; Strobe 2 + DB '6' + DB '5' + DB 'Y' + DB 'T' + DB 'G' + DB 'F' + DB 'V' + DB 'B' + ; Strobe 3 + DB '8' + DB '7' + DB 'I' + DB 'U' + DB 'J' + DB 'H' + DB 'N' + DB SPACE + ; Strobe 4 + DB '0' + DB '9' + DB 'P' + DB 'O' + DB 'L' + DB 'K' + DB ',' + DB 'M' + ; Strobe 5 + DB '^' + DB '-' + DB '[' + DB '@' + DB ':' + DB ';' + DB '/' + DB '.' + ; Strobe 6 + DB CLRKEY + DB '\\' + DB CURSLEFT + DB CURSDOWN + DB CR + DB ']' + DB NULL + DB '?' + +KTBLC: ; CTRL ON + ; Strobe 0 + DB NOKEY + DB NOKEY + DB CTRL_W + DB CTRL_Q + DB CTRL_A + DB NOKEY + DB 000H + DB CTRL_Z + ; Strobe 1 + DB NOKEY + DB NOKEY + DB CTRL_R + DB CTRL_E + DB CTRL_D + DB CTRL_S + DB CTRL_X + DB CTRL_C + ; Strobe 2 + DB NOKEY + DB NOKEY + DB CTRL_Y + DB CTRL_T + DB CTRL_G + DB CTRL_F + DB CTRL_V + DB CTRL_B + ; Strobe 3 + DB NOKEY + DB NOKEY + DB CTRL_I + DB CTRL_U + DB CTRL_J + DB CTRL_H + DB CTRL_N + DB NOKEY + ; Strobe 4 + DB NOKEY + DB NOKEY + DB CTRL_P + DB CTRL_O + DB CTRL_L + DB CTRL_K + DB NOKEY + DB CTRL_M + ; Strobe 5 + DB CTRL_CAPPA + DB CTRL_UNDSCR + DB ESC + DB CTRL_AT + DB NOKEY + DB NOKEY + DB NOKEY + DB NOKEY + ; Strobe 6 + DB NOKEY + DB CTRL_SLASH + DB NOKEY + DB NOKEY + DB NOKEY + DB CTRL_RB + DB NOKEY + ENDIF + + ; - ; EXIT B,D7=0 NO DATA - ; =1 DATA - ; D6=0 SHIFT OFF - ; =1 SHIFT ON - ; C = ROW & COLUMN + ; Keyboard routine for the MZ-700 hardware. ; -?SWEP: XOR A - LD (KDATW),A ; Reset key counter - LD B,0FAH ; Starting scan line, D3:0 = scan = line 10. D5:4 not used, D7=Cursor flash. + 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 TEST - ; BREAK ON : ZERO = 1 - ; OFF : ZERO = 0 - ; NO KEY : CY = 0 - ; KEY IN : CY = 1 - ; A D6=1: SHIFT ON - ; =0: SHIFT OFF - ; D5=1: CTRL ON - ; =0: CTRL OFF - ; D4=1: GRAPH ON - ; =0: GRAPH OFF -BREAK: LD A,0F0H - LD (KEYPA),A ; Port A scan line 0 + ; 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) ; Read back key data. + LD A,(KEYPB) + CP 03EH ; BREAK + CTRL + SHIFT = RESET TO MONITOR + JP Z, ?REBOOT OR A + RRA + JP C,BREAK2 ; SHIFT ? RLA - JR NC,BREAK3 ; CTRL/BREAK key pressed? - RRA - RRA ; Check if SHIFT key pressed/ - JR NC,BREAK1 ; SHIFT BREAK not pressed, jump. - RRA - JR NC,BREAK2 ; Check for GRAPH. - CCF - JR SWEP6 ;SWEP1 - -BREAK1: LD A,040H ; A D6=1 SHIFT ON + RLA + JR NC,BREAK1 ; BREAK ? + LD A,40H ; SHIFT D6=1 SCF JR SWEP6 -BREAK2: LD A,001H ; No keys found to be pressed on scanline 0. - LD (KDATW),A - LD A,010H ; A D4=1 GRAPH +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 -BREAK3: AND 006H ; SHIFT + GRAPH + BREAK? - JR Z,SWEP1A - AND 002H ; SHIFT ? - JR Z,SWEP1 ; Z = 1 = SHIFT BREAK pressed/ - LD A,020H ; A D5=1 CTRL - SCF - JR SWEP6 +SWEP1: LD D,88H ; BREAK ON + JR SWEP9 -SWEP1: LD D,088H ; Break ON - JR SWEP9 -SWEP1A: JP ?REBOOT ; Shift + Graph + Break ON = RESET. - ; - JR SWEP9 -SWEP6: LD HL,SWPW - PUSH HL - JR NC,SWEP11 +SWEP6: JR NC,SWEP0 LD D,A - AND 060H ; Shift & Ctrl =no data. - JR NZ,SWEP11 - LD A,D ; Graph Check - XOR (HL) - BIT 4,A - LD (HL),D - JR Z,SWEP0 -SWEP01: SET 7,D ; Data available, set flag. -SWEP0: DEC B - POP HL ; SWEP column work - INC HL - LD A,B - LD (KEYPA),A ; Port A (8255) D3:0 = Scan line output. - CP 0F0H - JR NZ,SWEP3 ; If we are not at scan line 0 then check for key data. - LD A,(HL) ; SWPW - CP 003H ; Have we scanned all lines, if yes then no data? - JR C,SWEP9 - LD (HL),000H ; - RES 7,D ; Reset data in as no data awailable. -SWEP9: LD B,D - RET + JR SWEP0 -SWEP11: LD (HL),000H - JR SWEP0 -SWEP3: LD A,(KEYPB) ; Port B (8255) D7:0 = Key data in for given scan line. +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 - AND (HL) - LD (HL),E - PUSH HL - LD HL,KDATW - PUSH BC - LD B,008H -SWEP8: RLC E - JR C,SWEP7 - INC (HL) -SWEP7: DJNZ SWEP8 - POP BC OR A - JR Z,SWEP0 + JR Z,SWEP0 LD E,A -SWEP2: LD H,008H +SWEP2: LD H,8 LD A,B - DEC A ; TBL adjust - AND 00FH + AND 0FH RLCA RLCA RLCA LD C,A LD A,E -SWEP12: DEC H +L0A89: DEC H RRCA - JR NC,SWEP12 + JR NC,L0A89 LD A,H ADD A,C LD C,A - JP SWEP01 + 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 + +;TIMIN3: CALL ?SWEP ; Perform keyboard sweep +; LD A,B +; RLCA +; JR C,ISRKEY2 ; CY=1 then data available. +; LD HL,KDATW +; LD A,(HL) ; Is a key being held down? +; OR A +; JR NZ, ISRAUTORPT ; It is so process as an auto repeat key. +; XOR A +; LD (KEYRPT),A ; No key held then clear the auto repeat initial pause counter. +; LD A,NOKEY ; No key code. +;ISRKEY1: LD E,A +; LD A,(HL) ; Current key scan line position. +; INC HL +; LD D,(HL) ; Previous key position. +; LD (HL),A ; Previous <= current +; SUB D ; Are they the same? +; JR NC,ISRKEY11 +; INC (HL) ; +;ISRKEY11: LD A,E +;ISRKEY10: CP NOKEY +; JR Z,ISREXIT +; LD (KEYLAST),A +;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 +; RET +; +; ; +; ; 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 +; +; +;ISRKEY2: RLCA +; RLCA +; RLCA +; JP C,LOCKTOGGLE ; GRAPH key which acts as the Shift Lock. +; RLCA +; JP C,ISRBRK ; BREAK key. +; LD H,000H +; LD L,C +; LD A,C +; CP 038H ; TEN KEY check. +; JR NC,ISRKEY6 ; Jump if TENKEY. +; LD A,B +; RLCA +; LD B,A +; LD A,(SFTLK) +; OR A +; LD A,B +; JR Z,ISRKEY14 +; RLA +; CCF +; RRA +;ISRKEY14: RLA +; RLA +; JR NC,ISRKEY3 +;ISRKEY15: LD DE,KTBLC +;ISRKEY5: ADD HL,DE +; LD A,(HL) +; JP ISRKEY1 +; +;ISRKEY3: RRA +; JR NC,ISRKEY6 +; LD A,(SFTLK) +; CP 1 +; LD DE,KTBLCL +; JR Z,ISRKEY5 +; LD DE,KTBLS +; JR ISRKEY5 +; +;ISRKEY6: LD DE,KTBL +; JR ISRKEY5 +;ISRKEY4: RLCA +; RLCA +; JR C,ISRKEY15 +; LD DE,KTBL +; 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 +; +; ; KEYBOARD SWEEP +; ; +; ; EXIT B,D7=0 NO DATA +; ; =1 DATA +; ; D6=0 SHIFT OFF +; ; =1 SHIFT ON +; ; C = ROW & COLUMN +; ; +;?SWEP: XOR A +; LD (KDATW),A ; Reset key counter +; LD B,0FAH ; Starting scan line, D3:0 = scan = line 10. D5:4 not used, D7=Cursor flash. +; LD D,A +; +; ; BREAK TEST +; ; BREAK ON : ZERO = 1 +; ; OFF : ZERO = 0 +; ; NO KEY : CY = 0 +; ; KEY IN : CY = 1 +; ; A D6=1: SHIFT ON +; ; =0: SHIFT OFF +; ; D5=1: CTRL ON +; ; =0: CTRL OFF +; ; D4=1: GRAPH ON +; ; =0: GRAPH OFF +;BREAK: LD A,0F0H +; LD (KEYPA),A ; Port A scan line 0 +; NOP +; LD A,(KEYPB) ; Read back key data. +; OR A +; RLA +; JR NC,BREAK3 ; CTRL/BREAK key pressed? +; RRA +; RRA ; Check if SHIFT key pressed/ +; JR NC,BREAK1 ; SHIFT BREAK not pressed, jump. +; RRA +; JR NC,BREAK2 ; Check for GRAPH. +; CCF +; JR SWEP6 ;SWEP1 +; +;BREAK1: LD A,040H ; A D6=1 SHIFT ON +; SCF +; JR SWEP6 +; +;BREAK2: LD A,001H ; No keys found to be pressed on scanline 0. +; LD (KDATW),A +; LD A,010H ; A D4=1 GRAPH +; SCF +; JR SWEP6 +; +;BREAK3: AND 006H ; SHIFT + GRAPH + BREAK? +; JR Z,SWEP1A +; AND 002H ; SHIFT ? +; JR Z,SWEP1 ; Z = 1 = SHIFT BREAK pressed/ +; LD A,020H ; A D5=1 CTRL +; SCF +; JR SWEP6 +; +;SWEP1: LD D,088H ; Break ON +; JR SWEP9 +;SWEP1A: JP ?REBOOT ; Shift + Graph + Break ON = RESET. +; ; +; JR SWEP9 +;SWEP6: LD HL,SWPW +; PUSH HL +; JR NC,SWEP11 +; LD D,A +; AND 060H ; Shift & Ctrl =no data. +; JR NZ,SWEP11 +; LD A,D ; Graph Check +; XOR (HL) +; BIT 4,A +; LD (HL),D +; JR Z,SWEP0 +;SWEP01: SET 7,D ; Data available, set flag. +;SWEP0: DEC B +; POP HL ; SWEP column work +; INC HL +; LD A,B +; LD (KEYPA),A ; Port A (8255) D3:0 = Scan line output. +; CP 0F0H +; JR NZ,SWEP3 ; If we are not at scan line 0 then check for key data. +; LD A,(HL) ; SWPW +; CP 003H ; Have we scanned all lines, if yes then no data? +; JR C,SWEP9 +; LD (HL),000H ; +; RES 7,D ; Reset data in as no data awailable. +;SWEP9: LD B,D +; RET +; +;SWEP11: LD (HL),000H +; JR SWEP0 +;SWEP3: LD A,(KEYPB) ; Port B (8255) D7:0 = Key data in for given scan line. +; LD E,A +; CPL +; AND (HL) +; LD (HL),E +; PUSH HL +; LD HL,KDATW +; PUSH BC +; LD B,008H +;SWEP8: RLC E +; JR C,SWEP7 +; INC (HL) +;SWEP7: DJNZ SWEP8 +; POP BC +; OR A +; JR Z,SWEP0 +; LD E,A +;SWEP2: LD H,008H +; LD A,B +; DEC A ; TBL adjust +; AND 00FH +; RLCA +; RLCA +; RLCA +; LD C,A +; LD A,E +;SWEP12: DEC H +; RRCA +; JR NC,SWEP12 +; LD A,H +; ADD A,C +; LD C,A +; JP SWEP01 ;------------------------------------------------------------------------------- ; END OF TIMER INTERRUPT @@ -1915,6 +3022,7 @@ READHST: PUSH BC CP DSKTYP_SDC ; Is the drive an SD Card? JP Z,SDCREAD READHST2: CALL ?DSKREAD ; Floppy card, use the FDC Controller. + CALL DEBUG READHST3: POP HL POP BC RET @@ -2188,286 +3296,286 @@ INFOMSG5: DB ",SP=", 000H ; START OF STATIC LOOKUP TABLES AND CONSTANTS ;------------------------------------------------------------------------------- -KTBL: ; Strobe 0 - DB '"' - DB '!' - DB 'W' - DB 'Q' - DB 'A' - DB INSERT - DB NULL - DB 'Z' - ; Strobe 1 - DB '$' - DB '#' - DB 'R' - DB 'E' - DB 'D' - DB 'S' - DB 'X' - DB 'C' - ; Strobe 2 - DB '&' - DB '%' - DB 'Y' - DB 'T' - DB 'G' - DB 'F' - DB 'V' - DB 'B' - ; Strobe 3 - DB '(' - DB '\'' - DB 'I' - DB 'U' - DB 'J' - DB 'H' - DB 'N' - DB SPACE - ; Strobe 4 - DB '_' - DB ')' - DB 'P' - DB 'O' - DB 'L' - DB 'K' - DB '<' - DB 'M' - ; Strobe 5 - DB '~' - DB '=' - DB '{' - DB '`' - DB '*' - DB '+' - DB CURSLEFT - DB '>' - ; Strobe 6 - DB HOMEKEY - DB '|' - DB CURSRIGHT - DB CURSUP - DB CR - DB '}' - DB NULL - DB CURSUP - ; Strobe 7 - DB '8' - DB '7' - DB '5' - DB '4' - DB '2' - DB '1' - DB DBLZERO - DB '0' - ; Strobe 8 - DB '*' - DB '9' - DB '-' - DB '6' - DB NULL - DB '3' - DB NULL - DB ',' - -KTBLS: ; Strobe 0 - DB '2' - DB '1' - DB 'w' - DB 'q' - DB 'a' - DB DELETE - DB NULL - DB 'z' - ; Strobe 1 - DB '4' - DB '3' - DB 'r' - DB 'e' - DB 'd' - DB 's' - DB 'x' - DB 'c' - ; Strobe 2 - DB '6' - DB '5' - DB 'y' - DB 't' - DB 'g' - DB 'f' - DB 'v' - DB 'b' - ; Strobe 3 - DB '8' - DB '7' - DB 'i' - DB 'u' - DB 'j' - DB 'h' - DB 'n' - DB SPACE - ; Strobe 4 - DB '0' - DB '9' - DB 'p' - DB 'o' - DB 'l' - DB 'k' - DB ',' - DB 'm' - ; Strobe 5 - DB '^' - DB '-' - DB '[' - DB '@' - DB ':' - DB ';' - DB '/' - DB '.' - ; Strobe 6 - DB CLRKEY - DB '\\' - DB CURSLEFT - DB CURSDOWN - DB CR - DB ']' - DB NULL - DB '?' - -KTBLCL: ; Strobe 0 - DB '2' - DB '1' - DB 'W' - DB 'Q' - DB 'A' - DB DELETE - DB NULL - DB 'Z' - ; Strobe 1 - DB '4' - DB '3' - DB 'R' - DB 'E' - DB 'D' - DB 'S' - DB 'X' - DB 'C' - ; Strobe 2 - DB '6' - DB '5' - DB 'Y' - DB 'T' - DB 'G' - DB 'F' - DB 'V' - DB 'B' - ; Strobe 3 - DB '8' - DB '7' - DB 'I' - DB 'U' - DB 'J' - DB 'H' - DB 'N' - DB SPACE - ; Strobe 4 - DB '0' - DB '9' - DB 'P' - DB 'O' - DB 'L' - DB 'K' - DB ',' - DB 'M' - ; Strobe 5 - DB '^' - DB '-' - DB '[' - DB '@' - DB ':' - DB ';' - DB '/' - DB '.' - ; Strobe 6 - DB CLRKEY - DB '\\' - DB CURSLEFT - DB CURSDOWN - DB CR - DB ']' - DB NULL - DB '?' - -KTBLC: ; CTRL ON - ; Strobe 0 - DB NOKEY - DB NOKEY - DB CTRL_W - DB CTRL_Q - DB CTRL_A - DB NOKEY - DB 000H - DB CTRL_Z - ; Strobe 1 - DB NOKEY - DB NOKEY - DB CTRL_R - DB CTRL_E - DB CTRL_D - DB CTRL_S - DB CTRL_X - DB CTRL_C - ; Strobe 2 - DB NOKEY - DB NOKEY - DB CTRL_Y - DB CTRL_T - DB CTRL_G - DB CTRL_F - DB CTRL_V - DB CTRL_B - ; Strobe 3 - DB NOKEY - DB NOKEY - DB CTRL_I - DB CTRL_U - DB CTRL_J - DB CTRL_H - DB CTRL_N - DB NOKEY - ; Strobe 4 - DB NOKEY - DB NOKEY - DB CTRL_P - DB CTRL_O - DB CTRL_L - DB CTRL_K - DB NOKEY - DB CTRL_M - ; Strobe 5 - DB CTRL_CAPPA - DB CTRL_UNDSCR - DB ESC - DB CTRL_AT - DB NOKEY - DB NOKEY - DB NOKEY - DB NOKEY - ; Strobe 6 - DB NOKEY - DB CTRL_SLASH - DB NOKEY - DB NOKEY - DB NOKEY - DB CTRL_RB - DB NOKEY +;KTBL: ; Strobe 0 +; DB '"' +; DB '!' +; DB 'W' +; DB 'Q' +; DB 'A' +; DB INSERT +; DB NULL +; DB 'Z' +; ; Strobe 1 +; DB '$' +; DB '#' +; DB 'R' +; DB 'E' +; DB 'D' +; DB 'S' +; DB 'X' +; DB 'C' +; ; Strobe 2 +; DB '&' +; DB '%' +; DB 'Y' +; DB 'T' +; DB 'G' +; DB 'F' +; DB 'V' +; DB 'B' +; ; Strobe 3 +; DB '(' +; DB '\'' +; DB 'I' +; DB 'U' +; DB 'J' +; DB 'H' +; DB 'N' +; DB SPACE +; ; Strobe 4 +; DB '_' +; DB ')' +; DB 'P' +; DB 'O' +; DB 'L' +; DB 'K' +; DB '<' +; DB 'M' +; ; Strobe 5 +; DB '~' +; DB '=' +; DB '{' +; DB '`' +; DB '*' +; DB '+' +; DB CURSLEFT +; DB '>' +; ; Strobe 6 +; DB HOMEKEY +; DB '|' +; DB CURSRIGHT +; DB CURSUP +; DB CR +; DB '}' +; DB NULL +; DB CURSUP +; ; Strobe 7 +; DB '8' +; DB '7' +; DB '5' +; DB '4' +; DB '2' +; DB '1' +; DB DBLZERO +; DB '0' +; ; Strobe 8 +; DB '*' +; DB '9' +; DB '-' +; DB '6' +; DB NULL +; DB '3' +; DB NULL +; DB ',' +; +;KTBLS: ; Strobe 0 +; DB '2' +; DB '1' +; DB 'w' +; DB 'q' +; DB 'a' +; DB DELETE +; DB NULL +; DB 'z' +; ; Strobe 1 +; DB '4' +; DB '3' +; DB 'r' +; DB 'e' +; DB 'd' +; DB 's' +; DB 'x' +; DB 'c' +; ; Strobe 2 +; DB '6' +; DB '5' +; DB 'y' +; DB 't' +; DB 'g' +; DB 'f' +; DB 'v' +; DB 'b' +; ; Strobe 3 +; DB '8' +; DB '7' +; DB 'i' +; DB 'u' +; DB 'j' +; DB 'h' +; DB 'n' +; DB SPACE +; ; Strobe 4 +; DB '0' +; DB '9' +; DB 'p' +; DB 'o' +; DB 'l' +; DB 'k' +; DB ',' +; DB 'm' +; ; Strobe 5 +; DB '^' +; DB '-' +; DB '[' +; DB '@' +; DB ':' +; DB ';' +; DB '/' +; DB '.' +; ; Strobe 6 +; DB CLRKEY +; DB '\\' +; DB CURSLEFT +; DB CURSDOWN +; DB CR +; DB ']' +; DB NULL +; DB '?' +; +;KTBLCL: ; Strobe 0 +; DB '2' +; DB '1' +; DB 'W' +; DB 'Q' +; DB 'A' +; DB DELETE +; DB NULL +; DB 'Z' +; ; Strobe 1 +; DB '4' +; DB '3' +; DB 'R' +; DB 'E' +; DB 'D' +; DB 'S' +; DB 'X' +; DB 'C' +; ; Strobe 2 +; DB '6' +; DB '5' +; DB 'Y' +; DB 'T' +; DB 'G' +; DB 'F' +; DB 'V' +; DB 'B' +; ; Strobe 3 +; DB '8' +; DB '7' +; DB 'I' +; DB 'U' +; DB 'J' +; DB 'H' +; DB 'N' +; DB SPACE +; ; Strobe 4 +; DB '0' +; DB '9' +; DB 'P' +; DB 'O' +; DB 'L' +; DB 'K' +; DB ',' +; DB 'M' +; ; Strobe 5 +; DB '^' +; DB '-' +; DB '[' +; DB '@' +; DB ':' +; DB ';' +; DB '/' +; DB '.' +; ; Strobe 6 +; DB CLRKEY +; DB '\\' +; DB CURSLEFT +; DB CURSDOWN +; DB CR +; DB ']' +; DB NULL +; DB '?' +; +;KTBLC: ; CTRL ON +; ; Strobe 0 +; DB NOKEY +; DB NOKEY +; DB CTRL_W +; DB CTRL_Q +; DB CTRL_A +; DB NOKEY +; DB 000H +; DB CTRL_Z +; ; Strobe 1 +; DB NOKEY +; DB NOKEY +; DB CTRL_R +; DB CTRL_E +; DB CTRL_D +; DB CTRL_S +; DB CTRL_X +; DB CTRL_C +; ; Strobe 2 +; DB NOKEY +; DB NOKEY +; DB CTRL_Y +; DB CTRL_T +; DB CTRL_G +; DB CTRL_F +; DB CTRL_V +; DB CTRL_B +; ; Strobe 3 +; DB NOKEY +; DB NOKEY +; DB CTRL_I +; DB CTRL_U +; DB CTRL_J +; DB CTRL_H +; DB CTRL_N +; DB NOKEY +; ; Strobe 4 +; DB NOKEY +; DB NOKEY +; DB CTRL_P +; DB CTRL_O +; DB CTRL_L +; DB CTRL_K +; DB NOKEY +; DB CTRL_M +; ; Strobe 5 +; DB CTRL_CAPPA +; DB CTRL_UNDSCR +; DB ESC +; DB CTRL_AT +; DB NOKEY +; DB NOKEY +; DB NOKEY +; DB NOKEY +; ; Strobe 6 +; DB NOKEY +; DB CTRL_SLASH +; DB NOKEY +; DB NOKEY +; DB NOKEY +; DB CTRL_RB +; DB NOKEY CBIOSSIGNON:IF BUILD_80C = 1 - DB "** CBIOS v1.25, (C) P.D. Smart, 2019-21. Drives:", NUL + DB "** CBIOS v1.26, (C) P.D. Smart, 2019-23. Drives:", NUL ELSE - DB "CBIOS v1.25, (C) P.D. Smart, 2019-21. " + DB "CBIOS v1.26, (C) P.D. Smart, 2019-23. " DB "Drives:", NUL ENDIF CBIOSIGNEND:IF BUILD_80C = 1 @@ -2572,27 +3680,44 @@ DPB2: DW 128 ; SPT - ; Bit 4:3 = Disk type, 00 = FDC, 10 = ROM, 11 = SD Card, 01 = Unused ; Bit 5 = ROMFS Image, 0 = DRV0, 1 = DRV1 - -; 1.44MB Floppy -DPB3: DW 144 ; SPT - 128 bytes sectors per track (= 36 sectors of 512 bytes) +; 340K Floppy +DPB3: DW 80 ; SPT - 128 bytes sectors per track (= 36 sectors of 512 bytes) DB 4 ; BSH - block shift factor DB 15 ; BLM - block mask - DB 0 ; EXM - Extent mask - DW 719 ; DSM - Storage size (blocks - 1) + DB 1 ; EXM - Extent mask + DW 169 ; DSM - Storage size (blocks - 1) DW 127 ; DRM - Number of directory entries - 1 DB 192 ; AL0 - 1 bit set per directory block DB 0 ; AL1 - " DW 32 ; CKS - DIR check vector size (DRM+1)/4 (0=fixed disk) - DW 0 ; OFF - Reserved tracks - DB 7 ; CFG - MZ80A Addition, configuration flag: + DW 1 ; OFF - Reserved tracks + DB 3 ; CFG - MZ80A Addition, configuration flag: ; Bit 1:0 = FDC: Sector Size, 00 = 128, 10 = 256, 11 = 512, 01 = Unused. ; Bit 2 = Invert, 1 = Invert data, 0 = Use data as read (on MB8866 this is inverted). ; Bit 4:3 = Disk type, 00 = FDC, 10 = ROM, 11 = SD Card, 01 = Unused ; Bit 5 = ROMFS Image, 0 = DRV0, 1 = DRV1 +; 1.44MB Floppy +;DPB3: DW 144 ; SPT - 128 bytes sectors per track (= 36 sectors of 512 bytes) +; DB 4 ; BSH - block shift factor +; DB 15 ; BLM - block mask +; DB 0 ; EXM - Extent mask +; DW 719 ; DSM - Storage size (blocks - 1) +; DW 127 ; DRM - Number of directory entries - 1 +; DB 192 ; AL0 - 1 bit set per directory block +; DB 0 ; AL1 - " +; DW 32 ; CKS - DIR check vector size (DRM+1)/4 (0=fixed disk) +; DW 0 ; OFF - Reserved tracks +; DB 7 ; CFG - MZ80A Addition, configuration flag: +; ; Bit 1:0 = FDC: Sector Size, 00 = 128, 10 = 256, 11 = 512, 01 = Unused. +; ; Bit 2 = Invert, 1 = Invert data, 0 = Use data as read (on MB8866 this is inverted). +; ; Bit 4:3 = Disk type, 00 = FDC, 10 = ROM, 11 = SD Card, 01 = Unused +; ; Bit 5 = ROMFS Image, 0 = DRV0, 1 = DRV1 + + ; 16Mb SD Hard Disk drives (not hot-swappable). ; This drive has 2048 blocks (small due to size of RAM needed, more blocks more RAM) of 8192 bytes = 16Mb -; There are 1024 directory entries thus AL0/AL1 needs to ave the top four bits set as each block can hold 256 directory entries. +; There are 1024 directory entries thus AL0/AL1 needs to have the top four bits set as each block can hold 256 directory entries. ; This implementation limits the sectors per track to 255 (8 bit) even though CPM supports 16bit sectors, so the ; physical drive make up is: 32 Sectors (128 CPM sectors of 128 bytes each) x 1024 tracks, 1 head = 16777216bytes. ; This size has been chosen to maximise the use of the SD Card space and the number of files/programs which can be online diff --git a/asm/cbios_bank1.asm b/asm/cbios_bank1.asm index 3b0bac8..425f9da 100644 --- a/asm/cbios_bank1.asm +++ b/asm/cbios_bank1.asm @@ -16,6 +16,10 @@ ;- additional and different hardware. The SPI is now onboard the PCB and ;- not using the printer interface card. ;- Mar 2021 - Updates for the RFS v2.1 board. +;- Jun 2023 - Updates to accommodate the Kuma 40/80 upgrade. INTEN is permanently +;- enabled as PC2 is requisitioned to act as the 40/80 switch so ?MODE adjusted +;- to setup the 8253 timer with a long 655 second interrupt to get around the +;- problem where ?PRNT enables interrupts prior to the hook being setup. ;- ;-------------------------------------------------------------------------------------------------------- ;- This source file is free software: you can redistribute it and-or modify @@ -348,8 +352,18 @@ OPTBL: DB 001H 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_MZ700 = 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 @@ -377,11 +391,35 @@ OPTBL: DB 001H ; START OF KEYBOARD FUNCTIONALITY (INTR HANDLER SEPERATE IN CBIOS) ;------------------------------------------------------------------------------- -?MODE: LD HL,KEYPF +?MODE: ; + ; 8255 PPI + ; + LD HL,KEYPF LD (HL),08AH LD (HL),007H ; Set Motor to Off. - LD (HL),004H ; Disable interrupts by setting INTMSK to 0. + IF BUILD_KUMA = 0 + LD (HL),004H ; Disable interrupts by setting INTMSK to 0. + ELSE + IF BUILD_80C = 1 + LD (HL),005H ; Kuma upgrade, set display to 80 columns. + ELSE + LD (HL),004H ; Kuma upgrade, set display to 40 columns. + ENDIF + ENDIF LD (HL),001H ; Set VGATE to 1. + ; + ; 8253 Timer. + ; + 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 + DEC HL + LD DE,0FFFFH ; 100Hz coming into Timer 2 from Timer 1, set divisor to maximum, ie. 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 = 100Hz + LD (HL),001H RET ; Method to check if a key has been pressed and stored in buffer.. @@ -451,6 +489,6 @@ GETKY2: LD A,(KEYCOUNT) ; No ke ;------------------------------------------------------------------------------- ; Align to end of bank. - ALIGN UROMADDR + 07F8h - ORG UROMADDR + 07F8h - DB 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh + ALIGN UROMADDR + 07F7h + ORG UROMADDR + 07F7h + DB 021H,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFH diff --git a/asm/cbios_bank2.asm b/asm/cbios_bank2.asm index 62cf113..e657eeb 100644 --- a/asm/cbios_bank2.asm +++ b/asm/cbios_bank2.asm @@ -1463,6 +1463,6 @@ RCP: LD HL,(CURSORPSAV) ; (curr ;------------------------------------------------------------------------------- ; Align to end of bank. - ALIGN UROMADDR + 07F8h - ORG UROMADDR + 07F8h - DB 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh + ALIGN UROMADDR + 07F7h + ORG UROMADDR + 07F7h + DB 022H,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFH diff --git a/asm/cbios_bank3.asm b/asm/cbios_bank3.asm index 0874837..fac0c37 100644 --- a/asm/cbios_bank3.asm +++ b/asm/cbios_bank3.asm @@ -891,7 +891,7 @@ SDC_WRITE1: RET ;------------------------------------------------------------------------------- ; Align to end of bank. - ALIGN UROMADDR + 07F8h - ORG UROMADDR + 07F8h - DB 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh + ALIGN UROMADDR + 07F7h + ORG UROMADDR + 07F7h + DB 023H,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFH diff --git a/asm/cbios_bank4.asm b/asm/cbios_bank4.asm index 9af52f9..d540a8c 100644 --- a/asm/cbios_bank4.asm +++ b/asm/cbios_bank4.asm @@ -636,6 +636,6 @@ DATAOVRMSG: DB "DISK ERROR - DATA OVERRUN", CR, NUL CRCERRMSG: DB "DISK ERROR - CRC ERROR", CR, NUL ; Align to end of bank. - ALIGN UROMADDR + 07F8h - ORG UROMADDR + 07F8h - DB 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh + ALIGN UROMADDR + 07F7h + ORG UROMADDR + 07F7h + DB 024H,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFH diff --git a/asm/include/cpm_definitions.asm b/asm/include/cpm_definitions.asm index 5daf9d6..7f3b47e 100644 --- a/asm/include/cpm_definitions.asm +++ b/asm/include/cpm_definitions.asm @@ -10,12 +10,13 @@ ;- Copyright: (c) 2019-23 Philip Smart ;- ;- History: Jan 2020 - Initial version. -; May 2020 - Advent of the new RFS PCB v2.0, quite a few changes to accommodate the -; additional and different hardware. The SPI is now onboard the PCB and -; not using the printer interface card. -; Mar 2021 - Changes to work with the RFS v2.1 board. +;- May 2020 - Advent of the new RFS PCB v2.0, quite a few changes to accommodate the +;- additional and different hardware. The SPI is now onboard the PCB and +;- not using the printer interface card. +;- Mar 2021 - Changes to work with the RFS v2.1 board. ;- Apr 2021 - Removed ROM and RAM Drive functionality as it provided no performance or ;- use benefit over SD which are much larger and RW. +;- May 2023 - Updates to accommodate RFS use on a FusionX board. ;- ;-------------------------------------------------------------------------------------------------------- ;- This source file is free software: you can redistribute it and-or modify @@ -39,13 +40,19 @@ HW_SPI_ENA EQU 1 ; Set t SW_SPI_ENA EQU 0 ; Set to 1 if software SPI is present on the RFS PCB v2 board. PP_SPI_ENA EQU 0 ; Set to 1 if using the SPI interface via the Parallel Port, ie. for RFS PCB v1 which doesnt have SPI onboard. -; Build time options, only set to '1' to build, '0' to disable, only 1 can be set to '1'. +; Build time options, only set to '1' to build, '0' to disable, only set one 40C/80C at a time. Set KUMA 80C option if Kuma upgrade being targetted otherwise will default to 40/80 column card. ; IF BUILD_VERSION = 0 -BUILD_80C EQU 1 ; Build for an MZ-80A with a 40/80 column card. -BUILD_40C EQU 0 ; Build for a standard 40 column MZ-80A. +BUILD_80C EQU 0 ; Build for an MZ-80A with a 40/80 column card. +BUILD_40C EQU 1 ; Build for a standard 40 column MZ-80A. +BUILD_KUMA EQU 0 ; Enable support for the Kuma 40/80 column upgrade. +BUILD_MZ80A EQU 0 ; Build for the Sharp MZ-80A base hardware. +BUILD_MZ700 EQU 1 ; Build for the Sharp MZ-700 base hardware. +BUILD_MZ1500 EQU 0 ; Build for the Sharp MZ-1500 base hardware. + ; ENDIF ; IF BUILD_VERSION = 1 ;BUILD_80C EQU 0 ; Build for an MZ-80A with a 40/80 column card. +;BUILD_80C_KUMA EQU 0 ; If set, 80 column mode is provided by the Kuma upgrade and not the 40/80 column card. ;BUILD_40C EQU 1 ; Build for a standard 40 column MZ-80A. ; ENDIF @@ -79,7 +86,7 @@ MAXDISKS EQU 7 ; Max n KEYBUFSIZE EQU 16 ; Ensure this is a power of 2, max size 256. ; Debugging -ENADEBUG EQU 0 ; Enable debugging logic, 1 = enable, 0 = disable +ENADEBUG EQU 1 ; Enable debugging logic, 1 = enable, 0 = disable ;----------------------------------------------- diff --git a/asm/include/msbasic_definitions.asm b/asm/include/msbasic_definitions.asm index c272ddd..580c832 100644 --- a/asm/include/msbasic_definitions.asm +++ b/asm/include/msbasic_definitions.asm @@ -16,6 +16,8 @@ ; Jun 2020 - Copied and strpped from TZFS for BASIC. ; Mar 2021 - Updates to run on v2.1 RFS board and provide SD card CLOAD/CSAVE and DIR ; along with bug fixes. +;- May 2023 - Updates to allow running on a FusionX board. +;- Jun 2023 - Updates to accommodate a Kuma 80 Column upgrade. ; ;-------------------------------------------------------------------------------------------------------- ;- This source file is free software: you can redistribute it and-or modify @@ -44,6 +46,9 @@ ; Build options. Set just one to '1' the rest to '0'. ; NB: As there are now 4 versions and 1 or more need to be built, ie. MZ-80A and RFS version for RFS, a flag is set in the file ; BASIC_build.asm which configures the equates below for the correct build. +BUILD_KUMA EQU 1 ; Enable support for Kuma 40/80 column upgrade. + +; NZ-80A Build IF BUILD_VERSION = 0 BUILD_MZ80A EQU 1 ; Build for the standard Sharp MZ80A, no lower memory. Manually change MAXMEM above. BUILD_RFS EQU 0 ; Build for standard RFS with SD enhancements. @@ -52,22 +57,25 @@ BUILD_TZFS EQU 0 ; Build BUILD_80C EQU 0 INCLUDE_ANSITERM EQU 1 ; Include the Ansi terminal emulation processor in the build. ENDIF +; RFS 40 Build IF BUILD_VERSION = 1 BUILD_MZ80A EQU 0 BUILD_RFS EQU 1 BUILD_RFSTZ EQU 0 BUILD_TZFS EQU 0 -BUILD_80C EQU 1 -INCLUDE_ANSITERM EQU 1 ; Include the Ansi terminal emulation processor in the build. - ENDIF - IF BUILD_VERSION = 2 -BUILD_MZ80A EQU 0 -BUILD_RFS EQU 1 -BUILD_RFSTZ EQU 0 -BUILD_TZFS EQU 0 BUILD_80C EQU 0 INCLUDE_ANSITERM EQU 1 ; Include the Ansi terminal emulation processor in the build. ENDIF +; RFS 80 Build + IF BUILD_VERSION = 2 +BUILD_MZ80A EQU 0 +BUILD_RFS EQU 1 +BUILD_RFSTZ EQU 0 +BUILD_TZFS EQU 0 +BUILD_80C EQU 1 +INCLUDE_ANSITERM EQU 1 ; Include the Ansi terminal emulation processor in the build. + ENDIF +; RFS/TZ Build IF BUILD_VERSION = 3 BUILD_MZ80A EQU 0 BUILD_RFS EQU 0 @@ -76,6 +84,7 @@ BUILD_TZFS EQU 0 BUILD_80C EQU 1 INCLUDE_ANSITERM EQU 1 ; Include the Ansi terminal emulation processor in the build. ENDIF +; TZFS Build IF BUILD_VERSION = 4 BUILD_MZ80A EQU 0 BUILD_RFS EQU 0 diff --git a/asm/include/rfs_definitions.asm b/asm/include/rfs_definitions.asm index fcd4b57..dba8dd2 100644 --- a/asm/include/rfs_definitions.asm +++ b/asm/include/rfs_definitions.asm @@ -18,6 +18,7 @@ ;- processor all operations are done by the Z80 under RFS. ;- March 2021- Updates to accommodate the RFS v2.1 board along with back porting TZFS ;- developments. +;- May 2023 - Updates to accommodate RFS use on a FusionX board. ;- ;-------------------------------------------------------------------------------------------------------- ;- This source file is free software: you can redistribute it and-or modify @@ -41,6 +42,8 @@ HW_SPI_ENA EQU 1 ; Set t SW_SPI_ENA EQU 0 ; Set to 1 if software SPI is present on the RFS PCB v2 board. PP_SPI_ENA EQU 0 ; Set to 1 if using the SPI interface via the Parallel Port, ie. for RFS PCB v1 which doesnt have SPI onboard. FUSIONX_ENA EQU 1 ; Set to 1 if using RFS on the tranZPUter FusionX board. +KUMA80_ENA EQU 0 ; Target has Kuma 40/80 upgrade installed. +VIDEOMODULE_ENA EQU 0 ; Target has 40/80 column colour video module installed. ; Debugging ENADEBUG EQU 0 ; Enable debugging logic, 1 = enable, 0 = disable diff --git a/asm/monitor_1z-013a.asm b/asm/monitor_1z-013a.asm index 7b02f6e..4de0748 100644 --- a/asm/monitor_1z-013a.asm +++ b/asm/monitor_1z-013a.asm @@ -2,6 +2,8 @@ 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. -MODE80C:EQU 0 +MODE80C:EQU 0 ; Configure for 80 column mode monitor. +KUMABIN:EQU 0 ; Generate original Kuma Monitor Binary (=1) +KUMA80: EQU 0 ; Kuma upgrade installed, enable 80 column mode. INCLUDE "1z-013a.asm" diff --git a/asm/monitor_80c_1z-013a.asm b/asm/monitor_80c_1z-013a.asm index 4a6b8ae..7f029e3 100644 --- a/asm/monitor_80c_1z-013a.asm +++ b/asm/monitor_80c_1z-013a.asm @@ -2,6 +2,8 @@ COLW: EQU 80 ; 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. -MODE80C:EQU 1 +MODE80C:EQU 1 ; Configure for 80 column mode monitor. +KUMABIN:EQU 0 ; Generate original Kuma Monitor Binary (=1) +KUMA80: EQU 0 ; Kuma upgrade installed, enable 80 column mode. INCLUDE "1z-013a.asm" diff --git a/asm/monitor_80c_sa1510.asm b/asm/monitor_80c_sa1510.asm index 526b0ff..3e90c9d 100644 --- a/asm/monitor_80c_sa1510.asm +++ b/asm/monitor_80c_sa1510.asm @@ -3,6 +3,8 @@ COLW: EQU 80 ; Width of the display screen (ie. colum ROW: EQU 25 ; Number of rows on display screen. SCRNSZ: EQU COLW * ROW ; Total size, in bytes, of the screen display area. SCRLW: EQU COLW / 8 ; Number of 8 byte regions in a line for hardware scroll. -MODE80C:EQU 1 +MODE80C:EQU 1 ; Configure for 80 column mode monitor. +KUMABIN:EQU 0 ; Generate original Kuma Monitor Binary (=1) +KUMA80: EQU 1 ; Kuma upgrade installed, enable 80 column mode. INCLUDE "sa1510.asm" diff --git a/asm/monitor_80c_sa1510_hiload.asm b/asm/monitor_80c_sa1510_hiload.asm index c751b44..d16c8e3 100644 --- a/asm/monitor_80c_sa1510_hiload.asm +++ b/asm/monitor_80c_sa1510_hiload.asm @@ -3,6 +3,8 @@ COLW: EQU 80 ; Width of the display screen (ie. colum ROW: EQU 25 ; Number of rows on display screen. SCRNSZ: EQU COLW * ROW ; Total size, in bytes, of the screen display area. SCRLW: EQU COLW / 8 ; Number of 8 byte regions in a line for hardware scroll. -MODE80C:EQU 1 +MODE80C:EQU 1 ; Configure for 80 column mode monitor. +KUMABIN:EQU 0 ; Generate original Kuma Monitor Binary (=1) +KUMA80: EQU 0 ; Kuma upgrade installed, enable 80 column mode. INCLUDE "sa1510_hiload.asm" diff --git a/asm/monitor_kuma_sa1510.asm b/asm/monitor_kuma_sa1510.asm new file mode 100644 index 0000000..03efcba --- /dev/null +++ b/asm/monitor_kuma_sa1510.asm @@ -0,0 +1,10 @@ +; Configurable parameters. +COLW: EQU 80 ; 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. +SCRLW: EQU COLW / 8 ; Number of 8 byte regions in a line for hardware scroll. +MODE80C:EQU 0 ; Configure for 80 column mode monitor. +KUMABIN:EQU 1 ; Generate original Kuma Monitor Binary (=1) +KUMA80: EQU 0 ; Kuma upgrade installed, enable 80 column mode. + + INCLUDE "sa1510.asm" diff --git a/asm/monitor_sa1510.asm b/asm/monitor_sa1510.asm index b773df1..c2ae81e 100644 --- a/asm/monitor_sa1510.asm +++ b/asm/monitor_sa1510.asm @@ -3,6 +3,8 @@ COLW: EQU 40 ; Width of the display screen (ie. colum ROW: EQU 25 ; Number of rows on display screen. SCRNSZ: EQU COLW * ROW ; Total size, in bytes, of the screen display area. SCRLW: EQU COLW / 8 ; Number of 8 byte regions in a line for hardware scroll. -MODE80C:EQU 0 +MODE80C:EQU 0 ; Configure for 80 column mode monitor. +KUMABIN:EQU 0 ; Generate original Kuma Monitor Binary (=1) +KUMA80: EQU 0 ; Kuma upgrade installed, enable 80 column mode. INCLUDE "sa1510.asm" diff --git a/asm/monitor_sa1510_hiload.asm b/asm/monitor_sa1510_hiload.asm index 1c1c61d..1107b36 100644 --- a/asm/monitor_sa1510_hiload.asm +++ b/asm/monitor_sa1510_hiload.asm @@ -3,6 +3,8 @@ COLW: EQU 40 ; Width of the display screen (ie. colum ROW: EQU 25 ; Number of rows on display screen. SCRNSZ: EQU COLW * ROW ; Total size, in bytes, of the screen display area. SCRLW: EQU COLW / 8 ; Number of 8 byte regions in a line for hardware scroll. -MODE80C:EQU 0 +MODE80C:EQU 0 ; Configure for 80 column mode monitor. +KUMABIN:EQU 0 ; Generate original Kuma Monitor Binary (=1) +KUMA80: EQU 0 ; Kuma upgrade installed, enable 80 column mode. INCLUDE "sa1510_hiload.asm" diff --git a/asm/msbasic.asm b/asm/msbasic.asm index 5eb7934..0fb4019 100644 --- a/asm/msbasic.asm +++ b/asm/msbasic.asm @@ -184,11 +184,17 @@ INIT80CHAR: IF BUILD_RFS = 1 LD A, 0FFH LD (SPAGE), A - ; Change to 80 character mode. - LD HL,DSPCTL ; Setup address of display control register latch. - LD A, 128 ; 80 char mode. - LD E,(HL) ; Dummy operation to enable latch write via multivibrator. - LD (HL), A + ; 40/80 Column card upgrade? + IF BUILD_KUMA = 0 + ; Change to 80 character mode. + LD HL,DSPCTL ; Setup address of display control register latch. + LD A, 128 ; 80 char mode. + LD E,(HL) ; Dummy operation to enable latch write via multivibrator. + LD (HL), A + ELSE ; Kuma 80 column upgrade? + LD A, 05H ; Set the INTEN bit to enable 80 column mode. + LD (KEYPF),A + ENDIF ELSE LD A, ROMBANK0 ; Switch to 40char monitor SA-1510. LD (ROMBK1),A @@ -223,8 +229,11 @@ INITANSI: IF INCLUDE_ANSITERM = 1 ; If the ansi terminal emulator is buil LD HL,00000H CALL TIMESET ; - LD A,05H ; Enable interrupts at hardware level, this must be done before switching memory mode. - LD (KEYPF),A + ; The Kuma upgrade uses INTEN to switch between 40/80 columns so ignore if target is for a Kuma upgrade. + IF BUILD_KUMA = 0 + LD A,05H ; Enable interrupts at hardware level, this must be done before switching memory mode. + LD (KEYPF),A + ENDIF ; MEMSW1: IF BUILD_TZFS+BUILD_RFSTZ > 0 LD A,TZMM_MZ700_2 ; Enable the full 64K memory range before starting BASIC initialisation. @@ -6711,7 +6720,15 @@ ADD3216: ADD HL,BC MODE: LD HL,KEYPF LD (HL),08AH LD (HL),007H ; Set Motor to Off. - LD (HL),004H ; Disable interrupts by setting INTMSK to 0. + IF BUILD_KUMA = 0 + LD (HL),004H ; Disable interrupts by setting INTMSK to 0. + ELSE + IF BUILD_80C = 1 + LD (HL),005H ; Set Kuma display to 80 column mode. + ELSE + LD (HL),004H ; Set Kuma display to 40 column mode. + ENDIF + ENDIF LD (HL),001H ; Set VGATE to 1. RET diff --git a/asm/rfs.asm b/asm/rfs.asm index b16e981..d041181 100644 --- a/asm/rfs.asm +++ b/asm/rfs.asm @@ -21,6 +21,7 @@ ; or without the K64 I/O processor. RFS wont use the K64 processor all ; operations are done by the Z80 under RFS. ;- April 2021- Updates for the v2.1 RFS board. +;- June 2023 - Updates for the Kuma 40/80 upgrade. ;- ;-------------------------------------------------------------------------------------------------------- ;- This source file is free software: you can redistribute it and-or modify @@ -175,22 +176,24 @@ ROMFS_3: LD (BNKSELMROM),A ; start ; Replacement command processor in place of the SA1510 command processor. ; MONITOR: IF FUSIONX_ENA = 0 - IN A,(CPLDINFO) ; See if a tranZPUter board is present. - AND 0E7H ; Mask out the CPLD Version and host HW. - LD C,A - CP 020H ; Upper bits specify the version, should be at least 1. - JR C,CHKTZ1 - AND 007H ; Get Hardware, should be an MZ-80A for RFS. - CP MODE_MZ80A - LD A,C - JR Z,CHKTZ1 - XOR A -CHKTZ1: AND 0E0H + IN A,(CPLDINFO) ; See if a tranZPUter board is present. + AND 0E7H ; Mask out the CPLD Version and host HW. + LD C,A + CP 020H ; Upper bits specify the version, should be at least 1. + JR C,CHKTZ1 + AND 007H ; Get Hardware, should be an MZ-80A for RFS. + CP MODE_MZ80A + LD A,C + JR Z,CHKTZ1 + XOR A +CHKTZ1: AND 0E0H ELSE - XOR A + XOR A ENDIF LD (TZPU), A ; Flag = 0 if no tranZPUter present otherwise contains version (1 - 15). - LD HL,DSPCTL ; Setup address of display control register latch. + IF VIDEOMODULE_ENA = 1 + LD HL,DSPCTL ; Setup address of display control register latch. + ENDIF ; XOR A ; Set the initial SDCFS active drive number. LD (SDDRIVENO),A @@ -201,15 +204,28 @@ CHKTZ1: AND 0E0H CP 0 JR NZ, SIGNON ; -SET40CHAR: LD A, 0 ; Using MROM in Bank 0 = 40 char mode. - LD E,(HL) ; Dummy operation to enable latch write via multivibrator. - LD (HL), A +SET40CHAR: IF VIDEOMODULE_ENA = 1 + XOR A ; Using MROM in Bank 0 = 40 char mode. + LD E,(HL) ; Dummy operation to enable latch write via multivibrator. + LD (HL), A + ENDIF + IF KUMA80_ENA = 1 ; Kuma modification toggles the INTEN bit PC2 of the 8255 to switch mode, 0 = 40 column. + LD A,04H + LD (KEYPF),A + ENDIF + XOR A LD (SCRNMODE), A LD (SPAGE), A ; Allow MZ80A scrolling JR SIGNON -SET80CHAR: LD A, 128 ; Using MROM in Bank 1 = 80 char mode. - LD E,(HL) ; Dummy operation to enable latch write via multivibrator. - LD (HL), A +SET80CHAR: IF VIDEOMODULE_ENA = 1 + LD A, 128 ; Using MROM in Bank 1 = 80 char mode. + LD E,(HL) ; Dummy operation to enable latch write via multivibrator. + LD (HL), A + ENDIF + IF KUMA80_ENA = 1 ; Kuma modification toggles the INTEN bit PC2 of the 8255 to switch mode, 1 = 80 column. + LD A,05H + LD (KEYPF),A + ENDIF LD A, 1 LD (SCRNMODE), A LD A, 0FFH @@ -500,19 +516,31 @@ HIROM: LD A, (MEMSW) ; Swap SETMODE40: LD A, ROMBANK0 ; Switch to 40Char monitor. LD (ROMBK1),A LD (BNKSELMROM),A - LD HL,DSPCTL ; Setup address of display control register latch. - LD A, 0 - LD E,(HL) ; Dummy operation to enable latch write via multivibrator. - LD (HL), A + IF VIDEOMODULE_ENA = 1 + LD HL,DSPCTL ; Setup address of display control register latch. + LD A, 0 + LD E,(HL) ; Dummy operation to enable latch write via multivibrator. + LD (HL), A + ENDIF + IF KUMA80_ENA = 1 ; Kuma80 modification uses INTEN on PC@ of 8255, 0 = 40 column. + LD A,04H + LD (KEYPF),A + ENDIF JP MONIT SETMODE80: LD A, ROMBANK1 ; Switch to 80char monitor. LD (ROMBK1),A LD (BNKSELMROM),A - LD HL,DSPCTL ; Setup address of display control register latch. - LD A, 128 - LD E,(HL) ; Dummy operation to enable latch write via multivibrator. - LD (HL), A + IF VIDEOMODULE_ENA = 1 + LD HL,DSPCTL ; Setup address of display control register latch. + LD A, 128 + LD E,(HL) ; Dummy operation to enable latch write via multivibrator. + LD (HL), A + ENDIF + IF KUMA80_ENA = 1 ; Kuma80 modification uses INTEN on PC@ of 8255, 0 = 40 column. + LD A,05H + LD (KEYPF),A + ENDIF JP MONIT NOTZPU: LD DE,MSGNOTZINST ; No tranZPUter installed. diff --git a/asm/rfs_bank6.asm b/asm/rfs_bank6.asm index 776b790..cfff453 100644 --- a/asm/rfs_bank6.asm +++ b/asm/rfs_bank6.asm @@ -455,7 +455,7 @@ ATBL: DB 0CCH ; NUL '\0' (null character) ; ;-------------------------------------- MSGSONTZ: DB "+ TZ" ; Version 2.x with version 2.1+ of tranZPUter board installed. -MSGSON: DB "+ RFS ", 0ABh, "2.1b **", 00DH, 000H ; Version 2.x-> as we are now using the v2.x PCB with 4 devices on-board +MSGSON: DB "+ RFS ", 0ABh, "2.2 **", 00DH, 000H ; Version 2.x-> as we are now using the v2.x PCB with 4 devices on-board MSGNOTFND: DB "Not Found", 00DH, 000H MSGRDIRLST: DB "ROM Directory:", 00DH, 000H MSGTRM: DB 00DH, 000H diff --git a/asm/sa1510.asm b/asm/sa1510.asm index 0648efd..86b254b 100644 --- a/asm/sa1510.asm +++ b/asm/sa1510.asm @@ -42,10 +42,14 @@ START: LD SP,STACK CALL ?CLER ; Clear 256 bytes from NAME 10F1h to 11F0h LD A,016H CALL PRNT - IF MODE80C = 0 - LD A,007H ; Black background, white characters. Bit 7 is clear as a write to bit 7 @ DFFFH selects 40Char mode. + IF KUMABIN = 1 + LD A,0CFH ELSE - LD A,017H ; Blue background, white characters in colour mode. Bit 7 is set as a write to bit 7 @ DFFFH selects 80Char mode. + IF MODE80C+KUMA80 = 0 + LD A,007H ; Black background, white characters. Bit 7 is clear as a write to bit 7 @ DFFFH selects 40Char mode. + ELSE + LD A,017H ; Blue background, white characters in colour mode. Bit 7 is set as a write to bit 7 @ DFFFH selects 80Char mode. + ENDIF ENDIF LD HL,ARAM JR STRT1 @@ -61,7 +65,7 @@ STRT1: CALL CLR8 CALL NL LD DE,00100H RST 018H - IF MODE80C = 0 ; For 80 char mode we need a hook to setup SPAGE mode. + IF MODE80C+KUMA80 = 0 ; For 80 char mode we need a hook to setup SPAGE mode. CALL ?BEL ELSE CALL HOOK ; Call new routine to setup SPAGE. @@ -130,53 +134,88 @@ LOAD: CALL ?RDI JR C,ST1 JP (HL) + ; LOADING MSG?2: DB 04CH, 0B7H, 0A1H, 09CH DB 0A6H, 0B0H, 097H, 020H DB 00DH - ; SIGN ON BANNER -MSG?3: DB "** MONITOR SA-1510 **", 0DH + ; SIGN ON BANNER - Different for Kuma 80 BIOS +MSG?3: IF KUMABIN = 0 + DB "** MONITOR SA-1510 **", 0DH + ELSE + DB "*K",0A5H,0B3H,0A1H," MZ-80A M",0B7H,0B0H,0A6H + DB 096H,0B7H,09DH,"*",00DH,"*",00DH + ENDIF ; For 80 Character mode we need some space, so shorten the Check Sum Error message. ; ; CHECK SUM ERROR -MSGE1: IF MODE80C = 0 +MSGE1: IF MODE80C+KUMA80 = 0 DB 043H, 098H, 092H, 09FH, 0A9H, 020H, 0A4H, 0A5H DB 0B3H, 020H, 092H, 09DH, 09DH, 0B7H, 09DH, 00DH ELSE DB "CK SUM?", 0DH ENDIF - ; Hook = 7 bytes. -HOOK: IF MODE80C = 1 + ; Hook = 7 bytes using space taken from Check Sum message. +HOOK: IF MODE80C+KUMA80 > 0 LD A,0FFH LD (SPAGE),A JP ?BEL ; Original called routine ENDIF ; CR PAGE MODE1 -.CR: CALL .MANG - RRCA - JP NC,CURS2 - LD L,000H - INC H - CP ROW - 1 ; End of line? - JR Z,.CP1 - INC H - JP CURS1 +.CR: IF KUMABIN = 1 + LD HL,(DSPXY) + JP CURS2 + ELSE + CALL .MANG + RRCA + JP NC,CURS2 + LD L,000H + INC H + CP ROW - 1 ; End of line? + JR Z,.CP1 + INC H + JP CURS1 + ENDIF +.CR1: IF KUMABIN = 1 + NEG + LD (SPAGE),A + ADD A,004H + LD (KEYPF),A + RET + DB 00EH + ENDIF .CP1: LD (DSPXY),HL ; SCROLLER -.SCROL: LD BC,SCRNSZ - COLW ; Scroll COLW -1 lines +.SCROL: IF KUMABIN = 1 + LD BC, 0780H + ELSE + LD BC,SCRNSZ - COLW ; Scroll COLW -1 lines + ENDIF LD DE,SCRN ; Start of the screen. - LD HL,SCRN + COLW ; Start of screen + 1 line. + IF KUMABIN = 1 + LD HL,0D050H + ELSE + LD HL,SCRN + COLW ; Start of screen + 1 line. + ENDIF LDIR EX DE,HL - LD B,COLW ; Clear last line at bottom of screen. + IF KUMABIN = 1 + LD B, 050H + ELSE + LD B,COLW ; Clear last line at bottom of screen. + ENDIF CALL ?CLER - LD BC,0001AH + IF KUMABIN = 1 + JP ?RSTR + ELSE + LD BC,0001AH + ENDIF LD DE,MANG LD HL,MANG + 1 LDIR @@ -450,7 +489,7 @@ L02DB: LD A,(SUNDG) RET ?BEL: PUSH DE - LD DE,00DB1H + LD DE,?BELD ;00DB1H RST 030H POP DE RET @@ -587,22 +626,46 @@ TIMIN: PUSH AF EI RET -.DSP03: EX DE,HL - LD (HL),001H - INC HL - LD (HL),000H - JP CURSR -.MANG2: LD A,(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) +.DSP03: IF KUMABIN = 1 + LD A,(SPAGE) + OR A + LD A,027H + RET Z + ADD A,A + INC A + RET + +L03A7: PUSH BC + CALL .DSP03 + LD B,A + LD A,L + CP B + POP BC + RET + +L03B0: CALL .DSP03 + LD L,A + XOR A + DEC H + RET + ELSE + EX DE,HL + LD (HL),001H + INC HL + LD (HL),000H + JP CURSR +.MANG2: LD A,(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) + ENDIF RET LD C,H @@ -1141,7 +1204,11 @@ L0743: DEC H ?MODE: LD HL,KEYPF LD (HL),08AH LD (HL),007H - LD (HL),005H + IF KUMABIN+KUMA80 > 0 + LD (HL),005H + ELSE + LD (HL),004H + ENDIF LD (HL),001H RET @@ -1264,13 +1331,17 @@ GETL5: CALL ?DPCT JR AUTO2 CHGPA: XOR A - IF MODE80C = 1 + IF MODE80C+KUMA80 > 0 JR CHGPK ELSE JR CHGPK1 ENDIF CHGPK: LD A,0FFH -CHGPK1: LD (SPAGE),A +CHGPK1: IF KUMABIN = 1 + CALL .CR1 + ELSE + LD (SPAGE),A + ENDIF LD A,0C6H CALL ?DPCT CHGP1: JP GETL0 @@ -1581,7 +1652,12 @@ REV2: JP ?RSTR .MANG: LD HL,MANG LD A,(SPAGE) OR A - JP NZ,.MANG2 + IF KUMABIN = 1 + JR NZ,.MANG1 ; (+018H) + NOP + ELSE + JP NZ,.MANG2 + ENDIF LD A,(MGPNT) .MANG3: SUB 008H INC HL @@ -2407,14 +2483,24 @@ DLY12A: CALL DLY3 CALL ?PONT LD (HL),B LD HL,(DSPXY) - LD A,L -DSP01: CP COLW - 1 ; End of line. + IF KUMABIN = 1 + CALL L03A7 + ELSE + LD A,L + ENDIF +DSP01: IF KUMABIN = 0 + CP COLW - 1 ; End of line. + ENDIF JR NZ,DSP04 CALL .MANG JR C,DSP04 LD A,(SPAGE) OR A - JP NZ,.DSP03 + IF KUMABIN = 1 + JP NZ,CURSR + ELSE + JP NZ,.DSP03 + ENDIF EX DE,HL LD A,B CP 007H @@ -2535,8 +2621,12 @@ CURSU1: CALL MGP.D JR CURS3 CURSR: LD HL,(DSPXY) - LD A,L - CP COLW - 1 ; End of line + IF KUMABIN = 1 + CALL L03A7 + ELSE + LD A,L + CP COLW - 1 ; End of line + ENDIF JR NC,CURS2 INC L JR CURS3 @@ -2555,8 +2645,12 @@ CURSL: LD HL,(DSPXY) JR Z,CURS5A DEC L JR CURS3 -CURS5A: LD L,COLW - 1 ; End of line - DEC H +CURS5A: IF KUMABIN = 1 + CALL L03B0 + ELSE + LD L,COLW - 1 ; End of line + DEC H + ENDIF JP P,CURSU1 LD H,000H LD (DSPXY),HL @@ -2643,13 +2737,24 @@ INST: CALL .MANG RRCA LD L,COLW - 1 ; End of line LD A,L - JR NC,INST1A - INC H -INST1A: CALL ?PNT1 - PUSH HL - LD HL,(DSPXY) - JR NC,INST2 - LD A,(COLW*2)-1 ; 04FH + IF KUMABIN = 1 + JR NC,INST1B + LD A,028H + ADD A,L + LD L,A +INST1B: CALL ?PNT1 + PUSH HL + LD HL,(DSPXY) + NOP + ELSE + JR NC,INST1A + INC H +INST1A: CALL ?PNT1 + PUSH HL + LD HL,(DSPXY) + JR NC,INST2 + LD A,(COLW*2)-1 ; 04FH + ENDIF INST2: SUB L LD B,A POP DE @@ -2720,16 +2825,30 @@ ROLU1: CALL MGP.I PUSH HL POP BC LD DE,COLW - LD HL,SCRN - COLW - LD A,(SPAGE) - OR A - JR NZ,?PNT2 - LD HL,(PAGETP) - SBC HL,DE -?PNT2: ADD HL,DE - DEC B - JP P,?PNT2 - LD B,000H + IF KUMABIN = 1 + LD HL,(PAGETP) + INC B + LD A,(SPAGE) + OR A + JR Z,L0FCE ; (+008H) + LD HL,0D000H + LD E,050H + JR L0FCE ; (+001H) +L0FCD: ADD HL,DE +L0FCE: DJNZ L0FCD ; (-003H) + NOP + ELSE + LD HL,SCRN - COLW + LD A,(SPAGE) + OR A + JR NZ,?PNT2 + LD HL,(PAGETP) + SBC HL,DE +?PNT2: ADD HL,DE + DEC B + JP P,?PNT2 + LD B,000H + ENDIF ADD HL,BC RES 3,H POP DE diff --git a/roms/SHARP_MZ80A_RFS_IMAGE_0.img b/roms/SHARP_MZ80A_RFS_IMAGE_0.img index a428e2affa57a58e1e103905a81f38288290ed8f..a964bdd272293a814a38cc0e65ba65715c143ef0 100644 GIT binary patch delta 40878 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 delta 1651 zcmcK1hnHMs8G!NKyPKKa$?ojzgs>aR-6xF}0vnRBbVz{Ev4kdy0s;z%Ac!L(vb2W| z3zyy%L3#^uEJRV7O0fbepaN1<&?sd@i16-r4*Un4Gk4DY&3B*oyL0d8y`x>Daolle zM=`6jQtll)WL{f+uVS^%DP7fCI$u;Q>ln@Y4-~I-S7NCZ zdZW9qm{F;ZKafhEtrb;esMw=2Se#QSXKP1S86VP&wRK|0gjQfy>^L#q<-|N&H>!k2 zV0JVK&A@umB(wtSN7IvwLWGC@jGmM-a*icFLq>6NPVNlp5tE|X*>nJg>IfDFnMSw*I%PcB36 zpHGwNGDBv{8nULWC2Pw%GE3H#*|MIjFT*lNHjue8Pv*;pG9nwv#?wQ6CuDE=qUy+7(mZkDt zY0CHH`|<<%q1+?OmMqw<*iQhp`Bmfy&4 z<#+P9JRwiY@8u8jM|nz~mS^No@@M&rJS)%1^YT}DL0*)XkKoIdVm=+*mp?>LrYYp6lXF_I=orcMqK#DKMTPie;fYG$A3eSXjH z`P#3i9kxRjZ+77aZk&yAD#q~`mt$OpaS6ti81KWl3gbGAcVqk+#vY8fWBkcQb`Ql} z{9stM&nFzF@~vQBi*(5;jXLQ&ekn?nK6LUASvNAQav05yZdMIg4Uhs(9zdP{I=y2+ z8g;XM$gpWZy6$s_i-DqHB+)Jy#q}Y-kFHjDdd&c-L<1WS*rPT>&}MA1NnLK`>J438 z?m$J8%^>&K1BOD2ikaY!+Sps@7ej}K0)Pg<0D$z3lh$>TIzp)`CA!1IT7WSZQ0+k4 zEu2;r*X;C&O3Ttd3W7jUvyDn8#|ayC`TIaoi%lZ*wBKq9d#eB6nfNKW79l_IVAOq?lccKi3|(qsyj{4YmyY+ ztTC$U2824z*VgXv*VNX4*}EG^XfU$MjmQwyJHd-aLQid=)d; zs=YDq?PlW;A7pfm+zRxqiEWdE(d-IjN|NVIdGdm(LD&!mt$`g}9NHpBS|Ul5+-@Fg zWClncGi*SJ>miKVLUpq}$evwf(#cddZ&GDX;LF~}^ccnbMnB)%Dqk?=r+`ELBQTC+ z=`D=jVr=!d5DMz(k9!$4y~dYt4!`An?3|*9dzm|}erpS1;TVZyMw9{O`Y)5YV~_zL zBaMv95kH6D^E&1m7J{3(=-qn?OzVQd;IlQgb@e-UHI#3!sNC^PRrS`wqT-TmrDX6S5QcZi4*F(5&3qNC>x;J?@KhrUvxDZ^Q7JcgU3vFjfe$%n$<0nqGv>tlR`uZD( z-#l`3|A7}@I{5M{uV%3upWc+6W7#{k0h)8uGw#nS1$y_C{ND-wTVQd5U~moT8w@6_ z1c|H3NiSO-yCN>0NsWk%S`xifA493sny_%KE)=CGB|d2ptrFf1&r!YO6WrnTkn?zl z4B+;u(xo6m>hcY`;IiZ)Z{WF~5Jdy&ZJ&^%&80Y@Nt;0Q``QAc2eb!PbDl|&&L3dF zN_*dO@{u$5r7#yB6Qw8@o)Ic^Yt#Eh7{T2|h8c9#l*-*lcF(xT-9hXWN}E8&dx&uC z4C25QyXTtFp{t|Dg-Kn4HCB`|UDAR$;u5{1++Rpm^{*7AO)i3Yig^%d9&%*OIi|fs zqtl~9-f8-pvNv3<(vQwlMCcn&!e13Qc$zS63j4bPN6rxQtOCasm^S2CbdWt{rR|E7 zBWs5QppbnVDYjd&0~Hf!v6nRNB!4HN6yt6vruR|Iy(eO3LR9}FYVHYYAw+!_>Y}=$ zl(Ldq8pWc2c$5%!<==jz&Pj{K0BkgfN%)hTQl6izD!LOW2q-8K(Lha5A_{SxG=K`% zNzllkYckL_E1$4Jdn{W{}`dD!8nh^{44Mx>sIf{XLO)@^y9IK420N))=1sM_j0P*hl6RSQpM zWw6=l&{VVzR%aAvz}mz6j~!2ktT`)p1G_N;LRft4(8+_%9Qdj{@_<@s*PCOifksbV Q0#@Jz5KurZIQ0ep02>W1&Hw-a delta 1317 zcmZ8fZ){Ul6u<9vTU*BH-o~~^`P270T1x50>tp@12fU57Fk#^MGeDRyKoLQKu>tEC zuJxNSF^VsdkeEpLK=g~%AZ@Z-wsyB2eQjQdF^dKxLgK1K%ib6aVOqSE#1AIt=ALtZ z=lss^oZJu-VtBMVjvkF7Cqia~DiHD`>i- z;kxj_9rFD#={V684DIhzzKAIkF{&!9cv8y6nE0F@h3ujcGdB|EHGnSyBFKDC1=7mh zQ9cFP18GHb6MH$|9jH)orc_A5%uQ;bfKwX^Bov5r90B>Q>Iz7f~?$I1{uLiw;GJVV0@Pb1Ye&b|yzCP@QYTicjAZ z^?ZIZ-8xFO6~szan$OA2DQQHr&Sgokvrw5yjam}I6lDK~!`N#W%!j;sH?YsbTJtOn z^WX+u9Oj?GHP};drK`wH2Gi1>qHiq9{bWGvJ;PptgHgsC=BuHob`93<>id`@8V2&J z&B#|l=~6Khl!a=zCO^kJN2r4N5cg{rt>A3>XBI+X2qPLV5$1uxVTHRvEKA~@Gag!B{T^M1LNVILeh4SHrMt5S7}L2g zGe>%CWae4%z1jd~%&Uw+9K;hAxj|;AMRo%^i<@+~ z1=eN_c<%NAi-G&={JZT)9Fz8GJ>=J8(kI%Tj4P2GXTfj%t@D6h`EKmnI8#wOp3HUr z00{~x;W4RH*SOG?n39v@{n^+_!3eWW*LfrC&o;FOqKZrE(lrw<>9X$7;zAa6EKLJr zG*yXz5dB0cjw6Gtl*W-sGU+XjnG~ZJ9zu2o4%?OqPhd1rAqx*6KMn1Z(EJEujGuu5 zxDic|Qn$V%h~Yexe`hD5aX404YaEu76T%-bPo|qw%F6h?_5)^1<#-|>piYT47#x?xv~ZP~`1n_haE=~}+EeRJEIErV+Z4%k;b6#qOwHC^@& znD%;H4ZQO)XK$=?gH^!62c3PV4hF%whE+X>U+)dP=63a;KJv!dLtf9(GsoUM!ElY; zC*OX{aeRMWXS1++W&M*^A3iGE2by>%77zq`8&>GIJW%1PE~6t zLIp-uttc+4q&1zYx?sMxq?%M!ebpS@JXKZ84RcG?vL&X400*kN2%p8O-Ol)0Hn#6z z&N}OPmxHnSmNQ%H{q@X_;|F_AI~bmGHrDaZddA;#^z7kY0Wfy^wIy>8X|8q89Veua Xfh+$A6dAxRG6-UT0RU*Fn4$R}dYUXG diff --git a/roms/cbios_bank1.rom b/roms/cbios_bank1.rom index 124495fc590e9bad5cd4536eeb3536d7a0a787f0..2f22144a832ed5210c8c1a181c51158a03af531a 100644 GIT binary patch delta 55 zcmZn=Xb_lS!*cQE;X4~0!Wfz7m@!PA$*3xz$o{~r#B77M;Q#-{McQW8oA)qkvT-W@ GhXMdue;C~W delta 32 ocmZn=Xb_lS!?OS7;ZqwO!WfyY%@`-oWK`XJfl-}pasZPw0LLW?<^TWy diff --git a/roms/cbios_bank2.rom b/roms/cbios_bank2.rom index d9d18a50b09ec06ffb2844a2afa54dac00309a63..ff91f6e3f7910175396f029ce4d4c4a9e6012acc 100644 GIT binary patch delta 106 zcmZn=Xb_m-#Cw2Qkl})&#)Y>VUbAUT^iO3Cuwc3tFmY!jiw1+@jmct+`x(_IUt`n* zlB`S$KvIp#jZtHAE|ZdgdaVJY%GsT-o@&k6W58tRKY2cr0$A7P!%QZuoJ#+p002R% BCZYfU delta 100 zcmZn=Xb_m-#M{6w$Z$b1;KJJtuh{}7`lqrkuwc5jVB*e5mH-CD4U@$f_cQuWzQ(8r zBw3jhfTS9e8)LxaTqY#}|5^h^m9slvJ=L1C$AHOh{^a>g3SeEE4>OstPCmfS2>{1j BA+7)b diff --git a/roms/cbios_bank3.rom b/roms/cbios_bank3.rom index d8c61d0b9f18b9cbf25aea3143a2f807a4355980..826b852357e73813560599ff8dea50555131ad9a 100644 GIT binary patch delta 17 TcmZn=Xb{-&ot;zpKNJ7}Ofw4e delta 10 RcmZn=Xb{-&oqZAuCjb=S18x8S diff --git a/roms/cbios_bank4.rom b/roms/cbios_bank4.rom index e195147a7a302e4e9471825b973f689163763d26..33340d8b898ab4a6da43430ef1b506a9e94d8052 100644 GIT binary patch delta 17 TcmZn=Xb{-&ot;zVKNJ7}Ogswo delta 11 ScmZn=Xb{-&oqe(a3nu^=)dQaZ diff --git a/roms/monitor_1z-009b.rom b/roms/monitor_1z-009b.rom new file mode 100755 index 0000000000000000000000000000000000000000..50938026f4a1cabced4abd7f41ddc45ee956f9b9 GIT binary patch literal 4096 zcmaJ^dt4J&zCSZbCJB(oAqoe4Fhc}Ks2JHcq*TWOB5D;_#7En$dcAvZ-&cjU!4*>7 zZM$B(eXP~Gt=Q`B)w*>n+83==D~wns@l;V!)?!WC4{T``n}}Ii*betMJi6Wc#~sL- zbIzRK>wA8`-}xPRA(Fd|vehgTv&@_2DQ5W&v;2xl-fNPNo8;U$*{zqK)XN=uxnD1D zG02}WvPp-K?6J!$bh6hVcd_z8RzAVbjM#gZQOQVi<6J2!&yT+l!jU22QN$Qf?_oJI zbRj4s#0?2iJMFMZNi-2j>jl(7zcdRk=p;GUV^6=+F6ndM!1M%5%?SU6yGFeRiOJoK z1@w)VEP_cX3+V74Fx8<{hiVc3sxA~W)J5VPb)Gm)EfgoIPVqUlT&z_W`wtn_CH@sQ zb(ue4BW?6{rYCSyWaqcR^_hZz-BzTyzh=Wa(nQxFW}rs%G*@ zj#N-9NnIi)t3{$yEfI-YDcb2iMt%q3b$SxR?K%>X^n{gI`VvFVN|VSfD=MKMGBp>5 zq)iu8D+B$83#!uI5=(_8n!)_vqD^he7izcV<5oHu@iBlM7`C)`No?*O%rU6|%3W%! zn5UifIIayGm#!`mr5#`1dM8P-83vYyMdmGz9L2iXF0M$!SPgPf8W@;8`{0sc{W z7uUj>Qcs9xr_*Wg&vP^>&i0kgW#QUJ(VV{r&lYvl$UypDEbPHgPrX(%o=%wr8DPw5N#b%k4X6$llTa&zA> z6tjkTNA)FceZfgx;Rk10E%7F9z8O?O{P5tge!nHo{5nTw|~y*A!F) z6m<7HechXRHc!bn1#O-It#u99Z!{>emTp^#WO^A~t0}4o)i}QjKfBiF3?zLRm~0DY zt;b3qAeg%gOOf1qESx;h&|A@k!h$jAe!_h?ySggd9p^?)r+ZU&sqZL1xZxB2RyIP& zUFn|fZ2Ms<)YdepTrO}~5bDxsH)Z#&TsFAzUD4VAJbNoV_Hh0#98&Pf1Mt4igp@vk z3;JfP^37O2=pf-3C?V{^zUz#4guH9zG9XOJ&JKsFtAKlSP@%lpM`fK)sfD(Vun5I$ z@X#wd2#hGax={vC|f==N)cX>6H_?w`SHoR?>)@B~(lQtgX6B|GS zij1-RdaOoxW-zLZ7r8a`D;wDd0S3{YN3OQx3f-+Xg$|ji-=szqr0FvXN7DJpO8}CO zM`1k+YJ2?j9RqpmU)9qr8qx0~L*orZcWBl{b9_ODO?_XkALz-jx zFJgMc=8Y<_QS_)z8Acq%jRX!D%isKGU%Uw(fwbfzAkz=9T&d(nP)CfI1=sstcWs!4KLdvm ze>0Dq%gW;U#bu=nD$6SPnfFb1x$Z3F`K&Apf{+^%5HE4Ly5KDM*{{ppRuGL5f?bXe zgMsOo|YwTQYxv05pwNW#0BNJJQMNvKD-)?03v+%fa;LnhL^C2;=PE_w|$!a5Ae`eY5Cs8Vsc8t@Ay^)r_(P+B9#seS&9X8M7Jd`>$pL
(56q*I%VCljTi+-(?6pmkWjXo78`<#7t_V>!_k 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 diff --git a/tools/assemble_roms.sh b/tools/assemble_roms.sh index 62b5424..8b06831 100755 --- a/tools/assemble_roms.sh +++ b/tools/assemble_roms.sh @@ -14,6 +14,7 @@ ## History: August 2018 - Initial script written. ## March 2021 - Updated to compile different versions of Microsoft BASIC. ## February 2023 - Updated as RFS extracted into seperate repository. +## June 2023 - Updated to build KUMA version of monitor. ## ######################################################################################################### ## This source file is free software: you can redistribute it and#or modify @@ -34,6 +35,7 @@ ROOTDIR=`pwd | sed 's/\/tools//g'` TOOLDIR=${ROOTDIR}/tools JARDIR=${ROOTDIR}/tools ASM=glass.jar +# NB Kuma version of SA1510 monitor rom is enabled within the monitor_sa1510.asm or monitor_80c_sa1510.asm file. #BUILDROMLIST="MZ80AFI rfs rfs_mrom IPL monitor_SA1510 monitor_80c_SA1510 monitor_mz-1r12 quickdisk_mz-1e05 quickdisk_mz-1e14 monitor_1Z-013A monitor_80c_1Z-013A" BUILDROMLIST="monitor_sa1510_hiload monitor_80c_sa1510_hiload monitor_80c_sa1510 mz80afi monitor_sa1510 monitor_80c_sa1510 monitor_1z-013a monitor_80c_1z-013a ipl" #BUILDMZFLIST="hi-ramcheck sharpmz-test" @@ -62,19 +64,19 @@ do # Special handling for the 4 version of MS BASIC. if [[ ${SRCNAME} = "msbasic_mz80a" ]]; then ASMNAME="msbasic.asm" - echo "BUILD_VERSION EQU 0" > ${INCDIR}/MSBASIC_BuildVersion.asm + echo "BUILD_VERSION EQU 0" > ${INCDIR}/msbasic_buildversion.asm elif [[ ${SRCNAME} = "msbasic_rfs40" ]]; then ASMNAME="msbasic.asm" - echo "BUILD_VERSION EQU 1" > ${INCDIR}/MSBASIC_BuildVersion.asm + echo "BUILD_VERSION EQU 1" > ${INCDIR}/msbasic_buildversion.asm elif [[ ${SRCNAME} = "msbasic_rfs80" ]]; then ASMNAME="msbasic.asm" - echo "BUILD_VERSION EQU 2" > ${INCDIR}/MSBASIC_BuildVersion.asm + echo "BUILD_VERSION EQU 2" > ${INCDIR}/msbasic_buildversion.asm elif [[ ${SRCNAME} = "msbasic_rfstz" ]]; then ASMNAME="msbasic.asm" - echo "BUILD_VERSION EQU 3" > ${INCDIR}/MSBASIC_BuildVersion.asm + echo "BUILD_VERSION EQU 3" > ${INCDIR}/msbasic_buildversion.asm elif [[ ${SRCNAME} = "msbasic_tzfs" ]]; then ASMNAME="msbasic.asm" - echo "BUILD_VERSION EQU 4" > ${INCDIR}/MSBASIC_BuildVersion.asm + echo "BUILD_VERSION EQU 4" > ${INCDIR}/msbasic_buildversion.asm fi # Assemble the source. diff --git a/tools/make_roms.sh b/tools/make_roms.sh index 6f2b8db..5c22ef5 100755 --- a/tools/make_roms.sh +++ b/tools/make_roms.sh @@ -18,6 +18,7 @@ ## April 2021 - Removed the CPM ROM Drive functionality as it provided no benefit ## over SD card and SD cards are larger. ## February 2023 - Updated as RFS extracted into seperate repository. +## June 2023 - Updated to make the Kuma version of the monitor. ## ######################################################################################################### ## This source file is free software: you can redistribute it and#or modify