From 99358a7aaf6d670ab745e03716c01540685247a8 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Sat, 24 Oct 2020 21:19:37 +1100 Subject: [PATCH 01/18] Initial commit for RP5C01 RTC driver --- Source/HBIOS/cfg_dyno.asm | 2 + Source/HBIOS/cfg_ezz80.asm | 2 + Source/HBIOS/cfg_master.asm | 2 + Source/HBIOS/cfg_mk4.asm | 2 + Source/HBIOS/cfg_n8.asm | 2 + Source/HBIOS/cfg_rcz180.asm | 2 + Source/HBIOS/cfg_rcz280.asm | 2 + Source/HBIOS/cfg_rcz80.asm | 2 + Source/HBIOS/cfg_sbc.asm | 2 + Source/HBIOS/cfg_scz180.asm | 2 + Source/HBIOS/cfg_zeta.asm | 2 + Source/HBIOS/cfg_zeta2.asm | 2 + Source/HBIOS/hbios.asm | 61 ++++++----- Source/HBIOS/hbios.inc | 3 +- Source/HBIOS/rp5rtc.asm | 203 ++++++++++++++++++++++++++++++++++++ 15 files changed, 265 insertions(+), 26 deletions(-) create mode 100644 Source/HBIOS/rp5rtc.asm diff --git a/Source/HBIOS/cfg_dyno.asm b/Source/HBIOS/cfg_dyno.asm index 43255017..e5f3174d 100644 --- a/Source/HBIOS/cfg_dyno.asm +++ b/Source/HBIOS/cfg_dyno.asm @@ -82,6 +82,8 @@ BQRTC_BASE .EQU $50 ; BQRTC: I/O BASE ADDRESS ; INTRTCENABLE .EQU FALSE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) ; +RP5RTCENABLE .EQU FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM) +; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; diff --git a/Source/HBIOS/cfg_ezz80.asm b/Source/HBIOS/cfg_ezz80.asm index b247529f..0cfa36dc 100644 --- a/Source/HBIOS/cfg_ezz80.asm +++ b/Source/HBIOS/cfg_ezz80.asm @@ -83,6 +83,8 @@ BQRTC_BASE .EQU $50 ; BQRTC: I/O BASE ADDRESS ; INTRTCENABLE .EQU FALSE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) ; +RP5RTCENABLE .EQU FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM) +; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; diff --git a/Source/HBIOS/cfg_master.asm b/Source/HBIOS/cfg_master.asm index 3b0b428b..0618dadb 100644 --- a/Source/HBIOS/cfg_master.asm +++ b/Source/HBIOS/cfg_master.asm @@ -114,6 +114,8 @@ BQRTC_BASE .EQU $50 ; BQRTC: I/O BASE ADDRESS ; INTRTCENABLE .EQU FALSE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) ; +RP5RTCENABLE .EQU FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM) +; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; diff --git a/Source/HBIOS/cfg_mk4.asm b/Source/HBIOS/cfg_mk4.asm index 892f05bc..7bfb167c 100644 --- a/Source/HBIOS/cfg_mk4.asm +++ b/Source/HBIOS/cfg_mk4.asm @@ -89,6 +89,8 @@ BQRTC_BASE .EQU $50 ; BQRTC: I/O BASE ADDRESS ; INTRTCENABLE .EQU FALSE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) ; +RP5RTCENABLE .EQU FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM) +; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; diff --git a/Source/HBIOS/cfg_n8.asm b/Source/HBIOS/cfg_n8.asm index 3948fc0e..3e70cf78 100644 --- a/Source/HBIOS/cfg_n8.asm +++ b/Source/HBIOS/cfg_n8.asm @@ -92,6 +92,8 @@ BQRTC_BASE .EQU $50 ; BQRTC: I/O BASE ADDRESS ; INTRTCENABLE .EQU FALSE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) ; +RP5RTCENABLE .EQU FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM) +; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; diff --git a/Source/HBIOS/cfg_rcz180.asm b/Source/HBIOS/cfg_rcz180.asm index a2f45aad..5715c783 100644 --- a/Source/HBIOS/cfg_rcz180.asm +++ b/Source/HBIOS/cfg_rcz180.asm @@ -85,6 +85,8 @@ BQRTC_BASE .EQU $50 ; BQRTC: I/O BASE ADDRESS ; INTRTCENABLE .EQU FALSE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) ; +RP5RTCENABLE .EQU FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM) +; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; diff --git a/Source/HBIOS/cfg_rcz280.asm b/Source/HBIOS/cfg_rcz280.asm index bd0e0281..653e282a 100644 --- a/Source/HBIOS/cfg_rcz280.asm +++ b/Source/HBIOS/cfg_rcz280.asm @@ -90,6 +90,8 @@ BQRTC_BASE .EQU $50 ; BQRTC: I/O BASE ADDRESS ; INTRTCENABLE .EQU FALSE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) ; +RP5RTCENABLE .EQU FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM) +; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; diff --git a/Source/HBIOS/cfg_rcz80.asm b/Source/HBIOS/cfg_rcz80.asm index 5c2a0c7a..e529f743 100644 --- a/Source/HBIOS/cfg_rcz80.asm +++ b/Source/HBIOS/cfg_rcz80.asm @@ -84,6 +84,8 @@ BQRTC_BASE .EQU $50 ; BQRTC: I/O BASE ADDRESS ; INTRTCENABLE .EQU FALSE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) ; +RP5RTCENABLE .EQU FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM) +; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; diff --git a/Source/HBIOS/cfg_sbc.asm b/Source/HBIOS/cfg_sbc.asm index 967b196d..de34c10f 100644 --- a/Source/HBIOS/cfg_sbc.asm +++ b/Source/HBIOS/cfg_sbc.asm @@ -84,6 +84,8 @@ BQRTC_BASE .EQU $50 ; BQRTC: I/O BASE ADDRESS ; INTRTCENABLE .EQU FALSE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) ; +RP5RTCENABLE .EQU FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM) +; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; diff --git a/Source/HBIOS/cfg_scz180.asm b/Source/HBIOS/cfg_scz180.asm index b6fe1c51..74976cdf 100644 --- a/Source/HBIOS/cfg_scz180.asm +++ b/Source/HBIOS/cfg_scz180.asm @@ -80,6 +80,8 @@ BQRTC_BASE .EQU $50 ; BQRTC: I/O BASE ADDRESS ; INTRTCENABLE .EQU FALSE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) ; +RP5RTCENABLE .EQU FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM) +; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; diff --git a/Source/HBIOS/cfg_zeta.asm b/Source/HBIOS/cfg_zeta.asm index 6eca0583..e5eff0d2 100644 --- a/Source/HBIOS/cfg_zeta.asm +++ b/Source/HBIOS/cfg_zeta.asm @@ -72,6 +72,8 @@ BQRTC_BASE .EQU $50 ; BQRTC: I/O BASE ADDRESS ; INTRTCENABLE .EQU FALSE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) ; +RP5RTCENABLE .EQU FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM) +; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; diff --git a/Source/HBIOS/cfg_zeta2.asm b/Source/HBIOS/cfg_zeta2.asm index 5be06627..cec7ef24 100644 --- a/Source/HBIOS/cfg_zeta2.asm +++ b/Source/HBIOS/cfg_zeta2.asm @@ -83,6 +83,8 @@ BQRTC_BASE .EQU $50 ; BQRTC: I/O BASE ADDRESS ; INTRTCENABLE .EQU FALSE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) ; +RP5RTCENABLE .EQU FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM) +; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index f214d920..b4e0c6c5 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -327,13 +327,13 @@ HBX_INVOKE: ; LD A,(HB_CURBNK) ; GET CURRENT BANK LD (HB_INVBNK),A ; SAVE INVOCATION BANK -; +; LD A,BID_BIOS ; HBIOS BANK LD (HB_CURBNK),A ; SET AS CURRENT BANK ; .DB $ED,$71 ; SC .DW HB_DISPATCH ; SC PARAMETER -; +; PUSH AF LD A,(HB_INVBNK) LD (HB_CURBNK),A @@ -788,7 +788,7 @@ HBX_INT: ; COMMON INTERRUPT ROUTING CODE ; SYSTEM OR USER MODE WAS ACTIVE AT THE TIME OF THE INTERRUPT. ; EX (SP),HL ; SAVE HL AND GET INT JP TABLE OFFSET - + ; SAVE STATE (HL SAVED PREVIOUSLY ON ORIGINAL STACK FRAME) PUSH AF ; SAVE AF PUSH BC ; SAVE BC @@ -814,7 +814,7 @@ HBX_INT: ; COMMON INTERRUPT ROUTING CODE CALL HBX_RETI ; RETI FOR Z80 PERIPHERALS RETIL ; -HBX_RETI: +HBX_RETI: RETI ; #ELSE @@ -859,7 +859,7 @@ HBX_INT_SP .EQU $ - 2 RETI ; AND RETURN ; #ENDIF - + #ENDIF ; ; SMALL TEMPORARY STACK FOR USE BY HBX_BNKCPY @@ -1095,13 +1095,13 @@ Z280_BOOTPDRTBL: ; Z280_INITZ: ; - #ENDIF + #ENDIF ; ; RESTORE I/O PAGE TO $00 LD L,$00 ; NORMAL I/O REG IS $00 LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER LDCTL (C),HL -; +; #ENDIF ; #IF (CPUFAM == CPU_Z180) @@ -1152,7 +1152,7 @@ Z280_INITZ: ; ; SET DEFAULT CSIO SPEED (INTERNAL CLOCK, SLOW AS POSSIBLE) LD A,Z180_CNTR_DEF ; DIV 1280, 14KHZ @ 18MHZ CLK - OUT0 (Z180_CNTR),A + OUT0 (Z180_CNTR),A #ENDIF ; #ENDIF @@ -1738,7 +1738,7 @@ NOT_REC_M0: ; XOR A ; FAILSAFE VALUE FOR BOOT CONSOLE DEVICE LD (CB_CONDEV),A ; SAVE IT -; +; LD A,(CIO_CNT) ; GET COUNT OF CHAR DEVICES CP BOOTCON + 1 ; COUNT - (DEVICE + 1) JR C,HB_CONRDY ; IF TOO HIGH, JUST USE FAILSAFE @@ -1881,7 +1881,7 @@ HB_Z280BUS1: ; DISPLAY CPU CONFIG ; CALL NEWLINE - + #IF (CPUFAM == CPU_Z280) LD A,Z280_MEMLOWAIT CALL PRTDECB @@ -2285,6 +2285,9 @@ HB_INITTBL: .DW PCF8584_INIT .DW DS7RTC_INIT #ENDIF +#IF (RP5RTCENABLE) + .DW RP5RTC_INIT +#ENDIF #IF (VDUENABLE) .DW VDU_INIT #ENDIF @@ -2963,7 +2966,7 @@ SYS_RESINT: ; SYS_RESWARM: CALL SYS_RESINT -; +; #IF (MEMMGR == MM_Z280) JP INITSYS4 #ELSE @@ -3909,13 +3912,13 @@ Z280_PRIVINST: LD (HB_MSRSAV),HL ; SAVE IT POP HL ; RECOVER HL, POP STACK EX (SP),HL ; GET ADR, SAVE HL -; +; PUSH AF PUSH BC PUSH DE -; +; .DB $ED,$96 ; LDUP A,(HL) -; +; ; HANDLE DI CP $F3 ; DI? JR NZ,Z280_PRIVINST2 @@ -4251,7 +4254,7 @@ Z280_BNKSEL: PUSH HL ; SAVE IT LD L,$FF ; NEW I/O PAGE LDCTL (C),HL -; +; ; CONVERT BANK ID TO TOP 12 BITS OF PHYSICAL ADDRESS ; WITH $0A IN THE LOW ORDER NIBBLE: ; BANK ID: R000 BBBB @@ -4263,7 +4266,7 @@ Z280_BNKSEL: JR Z,Z280_BNKSEL2 ; IF NOT, ALL DONE RES 6,H ; OTHERWISE, MOVE RAM BIT SET RAMLOC-16,H ; HL=0000 RBBB B000 0000 -; +; Z280_BNKSEL2: ; ; SET LOW NIBBLE @@ -4332,19 +4335,19 @@ Z280_BNKCPY: ; PUSH BC ; SAVE COUNT PUSH HL ; SAVE SOURCE ADDRESS -; +; ; SELECT I/O PAGE $FF LD C,Z280_IOPR ; I/O PAGE REGISTER LDCTL HL,(C) ; GET CURRENT I/O PAGE LD (IOPRVAL),HL ; SAVE IT LD L,$FF ; I/O PAGE $FF LDCTL (C),HL -; +; LD C,Z280_DMA0_DSTL ; START WITH DEST REG LO ; LD A,(HB_DSTBNK) ; DEST BANK TO ACCUM CALL Z2DMAADR ; SETUP DEST ADR REGS -; +; POP DE ; SRC ADR TO DE LD A,(HB_SRCBNK) ; DEST BANK TO ACCUM CALL Z2DMAADR ; SETUP SOURCE ADR REGS @@ -4399,7 +4402,7 @@ Z2DMAADR1: LD A,$0F ; A=0000 1111 OR L ; A=BAAA 1111 LD L,A ; L=BAAA 1111 -; +; ; MOVE THE RAM/ROM BIT. ; RC2014 DMA HI=0000 RBBB BAAA 1111 LO=1111 AAAA AAAA AAAA ; ZZ80MB DMA HI=R000 0BBB BAAA 1111 LO=1111 AAAA AAAA AAAA @@ -4425,7 +4428,7 @@ Z2DMAADR2: POP HL ; RECOVER THE HI VAL OUTW (C),HL INC C ; BUMP TO NEXT REG -; +; RET #ENDIF ; @@ -4499,6 +4502,14 @@ SIZ_INTRTC .EQU $ - ORG_INTRTC .ECHO " bytes.\n" #ENDIF ; +#IF (RP5RTCENABLE) +ORG_RP5RTC .EQU $ + #INCLUDE "rp5rtc.asm" +SIZ_RP5RTC .EQU $ - ORG_RP5RTC + .ECHO "RP5RTC occupies " + .ECHO SIZ_RP5RTC + .ECHO " bytes.\n" +#ENDIF #IF (ASCIENABLE) ORG_ASCI .EQU $ #INCLUDE "asci.asm" @@ -4944,7 +4955,7 @@ SYSCHK: CP DL_ERROR ; >= ERROR LEVEL JR C,SYSCHK1 ; IF NOT, GO HOME POP AF ; RESTORE INCOMING AF VALUE -; +; ; DISPLAY SYSCHK MESSAGE PUSH DE ; PRESERVE DE VALUE LD DE,STR_SYSCHK ; POINT TO PREFIX STRING @@ -5151,7 +5162,7 @@ PS_PRTDC: CP 5 ; RAM DISK? JR Z,PS_PRTDC1 ; PRINT CAPACITY IN KB CP 7 ; FLASH DISK? - JR Z,PS_PRTDC1 ; PRINT CAPACITY IN KB + JR Z,PS_PRTDC1 ; PRINT CAPACITY IN KB ; ; PRINT HARD DISK STORAGE SIZE IN MB LD B,BF_DIOCAP ; HBIOS FUNC: GET CAPACTIY @@ -5416,8 +5427,8 @@ PS_SOUND: PRTS(" $") ; PAD TO NEXT COLUMN ; DEVICE COLUMN - - PUSH BC ; + + PUSH BC ; LD E,C XOR A LD DE,PS_SDSND ; POINT TO DEVICE TYPE NAME TABLE diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index b52536d8..78678921 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -131,7 +131,7 @@ ERR_RANGE .EQU -6 ; PARAMETER OUT OF RANGE ERR_NOMEDIA .EQU -7 ; MEDIA NOT PRESENT ERR_NOHW .EQU -8 ; HARDWARE NOT PRESENT ERR_IO .EQU -9 ; I/O ERROR -ERR_READONLY .EQU -10 ; WRITE REQUEST TO READ-ONLY MEDIA +ERR_READONLY .EQU -10 ; WRITE REQUEST TO READ-ONLY MEDIA ERR_TIMEOUT .EQU -11 ; DEVICE TIMEOUT ERR_BADCFG .EQU -12 ; INVALID CONFIGURATION ERR_INTERNAL .EQU -13 ; INTERNAL ERROR @@ -191,6 +191,7 @@ RTCDEV_BQ .EQU $10 ; BQ4845P RTCDEV_SIMH .EQU $20 ; SIMH RTCDEV_INT .EQU $30 ; PERIODIC INT TIMER RTCDEV_DS7 .EQU $40 ; DS1302 (I2C) +RTCDEV_RP5 .EQU $50 ; RP5C01 ; ; VIDEO DEVICE IDS ; diff --git a/Source/HBIOS/rp5rtc.asm b/Source/HBIOS/rp5rtc.asm new file mode 100644 index 00000000..f4b83abf --- /dev/null +++ b/Source/HBIOS/rp5rtc.asm @@ -0,0 +1,203 @@ +; +;================================================================================================== +; RP5C01 CLOCK DRIVER +;================================================================================================== +; +RP5RTC_BUFSIZ .EQU 6 ; SIX BYTE BUFFER (YYMMDDHHMMSS) +; +; RTC DEVICE INITIALIZATION ENTRY +; + +RP5RTC_REG .EQU $B4 +RP5RTC_DAT .EQU $B5 + +REG_1SEC .EQU $00 +REG_10SEC .EQU $01 +REG_MODE .EQU $0D +REG_TEST .EQU $0E + +MD_TIM .EQU 8 +MD_ALM .EQU 4 + +RP5RTC_INIT: + LD A,(RTC_DISPACT) ; RTC DISPATCHER ALREADY SET? + OR A ; SET FLAGS + RET NZ ; IF ALREADY ACTIVE, ABORT +; + CALL NEWLINE ; FORMATTING + PRTS("RP5C01 RTC: $") +; + +; ENSURE DEVICE IS RESET AND NOT IN TEST MODE + LD A, REG_TEST ; SELECT TEST REGISTER + OUT (RP5RTC_REG), A + CALL DLY16 + XOR A + OUT (RP5RTC_DAT), A ; TURN OFF ALL TEST MODE BITS + + CALL RP5RTC_RDTIM + + ; DISPLAY CURRENT TIME + LD HL, RP5RTC_BCDBUF ; POINT TO BCD BUF + CALL PRTDT +; + LD BC, RP5RTC_DISPATCH + CALL RTC_SETDISP +; + XOR A ; SIGNAL SUCCESS + RET +; +; RTC DEVICE FUNCTION DISPATCH ENTRY +; A: RESULT (OUT), 0=OK, Z=OK, NZ=ERR +; B: FUNCTION (IN) +; +RP5RTC_DISPATCH: + LD A,B ; GET REQUESTED FUNCTION + AND $0F ; ISOLATE SUB-FUNCTION + JP Z,RP5RTC_GETTIM ; GET TIME + DEC A + JP Z,RP5RTC_SETTIM ; SET TIME + DEC A + JP Z,RP5RTC_GETBYT ; GET NVRAM BYTE VALUE + DEC A + JP Z,RP5RTC_SETBYT ; SET NVRAM BYTE VALUE + DEC A + JP Z,RP5RTC_GETBLK ; GET NVRAM DATA BLOCK VALUES + DEC A + JP Z,RP5RTC_SETBLK ; SET NVRAM DATA BLOCK VALUES + DEC A + JP Z,RP5RTC_GETALM ; GET ALARM + DEC A + JP Z,RP5RTC_SETALM ; SET ALARM + DEC A + JP Z,RP5RTC_DEVICE ; REPORT RTC DEVICE INFO + CALL SYSCHK + LD A,ERR_NOFUNC + OR A + RET +; +; NVRAM FUNCTIONS ARE NOT AVAILABLE IN SIMULATOR +; +RP5RTC_GETBYT: +RP5RTC_SETBYT: +RP5RTC_GETBLK: +RP5RTC_SETBLK: +RP5RTC_GETALM: +RP5RTC_SETALM: + CALL SYSCHK + LD A,ERR_NOTIMPL + OR A + RET +; +; RTC GET TIME +; A: RESULT (OUT), 0=OK, Z=OK, NZ=ERR +; HL: DATE/TIME BUFFER (OUT) +; BUFFER FORMAT IS BCD: YYMMDDHHMMSS +; 24 HOUR TIME FORMAT IS ASSUMED +; +RP5RTC_GETTIM: + ; GET THE TIME INTO TEMP BUF + PUSH HL ; SAVE PTR TO CALLERS BUFFER +; + CALL RP5RTC_RDTIM + + ; NOW COPY TO REAL DESTINATION (INTERBANK SAFE) + LD A,BID_BIOS ; COPY FROM BIOS BANK + LD (HB_SRCBNK),A ; SET IT + LD A,(HB_INVBNK) ; COPY TO CURRENT USER BANK + LD (HB_DSTBNK),A ; SET IT + LD HL,RP5RTC_BCDBUF ; SOURCE ADR + POP DE ; DEST ADR + LD BC,RP5RTC_BUFSIZ ; LENGTH + CALL HB_BNKCPY ; COPY THE CLOCK DATA + + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN +; +; +; RTC SET TIME +; A: RESULT (OUT), 0=OK, Z=OK, NZ=ERR +; HL: DATE/TIME BUFFER (IN) +; BUFFER FORMAT IS BCD: YYMMDDHHMMSSWW +; 24 HOUR TIME FORMAT IS ASSUMED +; +RP5RTC_SETTIM: + ; COPY TO BCD BUF + LD A,(HB_INVBNK) ; COPY FROM CURRENT USER BANK + LD (HB_SRCBNK),A ; SET IT + LD A,BID_BIOS ; COPY TO BIOS BANK + LD (HB_DSTBNK),A ; SET IT + LD DE,RP5RTC_BCDBUF ; DEST ADR + LD BC,RP5RTC_BUFSIZ ; LENGTH + CALL HB_BNKCPY ; COPY THE CLOCK DATA +; + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN +; +; REPORT RTC DEVICE INFO +; +RP5RTC_DEVICE: + LD D,RTCDEV_RP5 ; D := DEVICE TYPE + LD E,0 ; E := PHYSICAL DEVICE NUMBER + LD H,0 ; H := 0, DRIVER HAS NO MODES + LD L,0 ; L := 0, NO I/O ADDRESS + XOR A ; SIGNAL SUCCESS + RET + +; +; READ OUT THE TIME +RP5RTC_RDTIM: + LD A, REG_MODE ; SELECT MODE REGISTER + OUT (RP5RTC_REG), A + ; CALL DLY32 + LD A, MD_TIM | !MD_ALM | 0 ; TURN ON TIME AND TURN OFF ALARM + OUT (RP5RTC_DAT), A ; AND SET MODE 0 (REGISTER BANK 0) + ; CALL DLY32 + + LD A, REG_1SEC ; SELECT 1 SECOND REGISTER + OUT (RP5RTC_REG), A + ; CALL DLY32 + IN A, (RP5RTC_DAT) + AND $0F ; RETRIEVE 1 SECOND NIBBLE + LD L, A + + LD A, REG_10SEC ; SELECT 1 SECOND REGISTER + OUT (RP5RTC_REG), A + ; CALL DLY32 + IN A, (RP5RTC_DAT) + AND $0F + rlca + rlca + rlca + rlca ; MOVE TO TOP NIBBLE + OR L ; MERGE IN LOW NIBBLE + LD H, A + ; A = SECONDS AS BCD + LD (RP5RTC_SS), A + + RET + +; +; WORKING VARIABLES +; +RP5RTC_BCDBUF: ; ALL IN BINARY +RP5RTC_YR .DB 20 +RP5RTC_MO .DB 01 +RP5RTC_DT .DB 01 +RP5RTC_HH .DB 00 +RP5RTC_MM .DB 00 +RP5RTC_SS .DB 00 +;; +RP5RTC_MONTBL: ; DAYS IN MONTH + 1 + .DB 32 ; JANUARY + .DB 29 ; FEBRUARY (NON-LEAP) + .DB 32 ; MARCH + .DB 31 ; APRIL + .DB 32 ; MAY + .DB 31 ; JUNE + .DB 32 ; JULY + .DB 32 ; AUGUST + .DB 31 ; SEPTEMBER + .DB 32 ; OCTOBER + .DB 31 ; NOVEMBER + .DB 32 ; DECEMBER From 8981a255a7997153905fa54be8ba73960b84dcf2 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Sat, 24 Oct 2020 22:48:05 +1100 Subject: [PATCH 02/18] RP5C01: Added support for assign date/time --- Source/HBIOS/rp5rtc.asm | 168 ++++++++++++++++++++++++++++++++-------- 1 file changed, 134 insertions(+), 34 deletions(-) diff --git a/Source/HBIOS/rp5rtc.asm b/Source/HBIOS/rp5rtc.asm index f4b83abf..fec5fc63 100644 --- a/Source/HBIOS/rp5rtc.asm +++ b/Source/HBIOS/rp5rtc.asm @@ -13,11 +13,30 @@ RP5RTC_DAT .EQU $B5 REG_1SEC .EQU $00 REG_10SEC .EQU $01 +REG_1MIN .EQU $02 +REG_10MIN .EQU $03 +REG_1HR .EQU $04 +REG_10HR .EQU $05 +REG_DAYWEEK .EQU $06 +REG_1DAY .EQU $07 +REG_10DAY .EQU $08 +REG_1MNTH .EQU $09 +REG_10MNTH .EQU $0A +REG_1YEAR .EQU $0B +REG_10YEAR .EQU $0C REG_MODE .EQU $0D REG_TEST .EQU $0E +REG_RESET .EQU $0F -MD_TIM .EQU 8 -MD_ALM .EQU 4 +REG_12_24 .EQU $0A + +MODE_TIMEST .EQU 0 +MODE_ALRMST .EQU 1 +MODE_RAM0 .EQU 2 +MODE_RAM1 .EQU 3 + +MD_TIME .EQU 8 +MD_ALRM .EQU 4 RP5RTC_INIT: LD A,(RTC_DISPACT) ; RTC DISPATCHER ALREADY SET? @@ -35,6 +54,16 @@ RP5RTC_INIT: XOR A OUT (RP5RTC_DAT), A ; TURN OFF ALL TEST MODE BITS + + LD B, MODE_ALRMST + CALL RP5RTC_SETMD + + LD A, REG_12_24 ; SET TO 24 HOUR CLOCK + OUT (RP5RTC_REG), A + LD A, 1 + OUT (RP5RTC_DAT), A + + CALL RP5RTC_RDTIM ; DISPLAY CURRENT TIME @@ -131,6 +160,33 @@ RP5RTC_SETTIM: LD BC,RP5RTC_BUFSIZ ; LENGTH CALL HB_BNKCPY ; COPY THE CLOCK DATA ; + LD B, MODE_TIMEST + CALL RP5RTC_SETMD + + LD B, REG_1SEC + LD A, (RP5RTC_SS) + CALL RP5RTC_WRVL + + LD B, REG_1MIN + LD A, (RP5RTC_MM) + CALL RP5RTC_WRVL + + LD B, REG_1HR + LD A, (RP5RTC_HH) + CALL RP5RTC_WRVL + + LD B, REG_1DAY + LD A, (RP5RTC_DT) + CALL RP5RTC_WRVL + + LD B, REG_1MNTH + LD A, (RP5RTC_MO) + CALL RP5RTC_WRVL + + LD B, REG_1YEAR + LD A, (RP5RTC_YR) + CALL RP5RTC_WRVL + XOR A ; SIGNAL SUCCESS RET ; AND RETURN ; @@ -147,57 +203,101 @@ RP5RTC_DEVICE: ; ; READ OUT THE TIME RP5RTC_RDTIM: + LD B, MODE_TIMEST + CALL RP5RTC_SETMD + + LD B, REG_1SEC + CALL RP5RTC_RDVL + LD (RP5RTC_SS), A + + LD B, REG_1MIN + CALL RP5RTC_RDVL + LD (RP5RTC_MM), A + + LD B, REG_1HR + CALL RP5RTC_RDVL + LD (RP5RTC_HH), A + + LD B, REG_1DAY + CALL RP5RTC_RDVL + LD (RP5RTC_DT), A + + LD B, REG_1MNTH + CALL RP5RTC_RDVL + LD (RP5RTC_MO), A + + LD B, REG_1YEAR + CALL RP5RTC_RDVL + LD (RP5RTC_YR), A + + RET + +; SET MODE +; MODE IN B (MODE_TIMEST, MODE_ALRMST, MODE_RAM0, MODE_RAM1) +RP5RTC_SETMD: LD A, REG_MODE ; SELECT MODE REGISTER OUT (RP5RTC_REG), A - ; CALL DLY32 - LD A, MD_TIM | !MD_ALM | 0 ; TURN ON TIME AND TURN OFF ALARM - OUT (RP5RTC_DAT), A ; AND SET MODE 0 (REGISTER BANK 0) - ; CALL DLY32 - LD A, REG_1SEC ; SELECT 1 SECOND REGISTER + IN A, (RP5RTC_DAT) + AND MD_TIME | MD_ALRM + OR B + OUT (RP5RTC_DAT), A ; ASSIGN MODE + RET + + +; READ OUT 2 REGISTERS - 2 NIBBLES TO 1 BYTE +; REGISTER IN B +RP5RTC_RDVL: + LD A, B ; SELECT UNIT REGISTER OUT (RP5RTC_REG), A - ; CALL DLY32 IN A, (RP5RTC_DAT) - AND $0F ; RETRIEVE 1 SECOND NIBBLE + AND $0F ; RETRIEVE UNIT NIBBLE LD L, A - LD A, REG_10SEC ; SELECT 1 SECOND REGISTER + INC B + LD A, B ; SELECT TENS REGISTER OUT (RP5RTC_REG), A - ; CALL DLY32 IN A, (RP5RTC_DAT) AND $0F - rlca - rlca - rlca - rlca ; MOVE TO TOP NIBBLE + RLCA + RLCA + RLCA + RLCA ; MOVE TO TOP NIBBLE OR L ; MERGE IN LOW NIBBLE - LD H, A - ; A = SECONDS AS BCD - LD (RP5RTC_SS), A + LD H, A ; A = VALUE AS BCD RET +; WRITE OUT 2 REGISTERS - 1 BYTE TO 2 NIBBLES +; REGISTER IN B (B+1) +; VALUE IN A +RP5RTC_WRVL: + LD C, A + LD A, B ; SELECT UNIT REGISTER + OUT (RP5RTC_REG), A + + LD A, C ; WRITE C (ONLY LOW NIBBLE WILL BE USED) + OUT (RP5RTC_DAT), A + + INC B + LD A, B ; SELECT TENS REGISTER + OUT (RP5RTC_REG), A + + LD A, C ; SHIFT TOP NIBBLE TO LOW NIBBLE + RRCA + RRCA + RRCA + RRCA + OUT (RP5RTC_DAT), A ; WRITE IT + + RET ; -; WORKING VARIABLES +; REGISTER EXTRACTED VALUES ; -RP5RTC_BCDBUF: ; ALL IN BINARY +RP5RTC_BCDBUF: RP5RTC_YR .DB 20 RP5RTC_MO .DB 01 RP5RTC_DT .DB 01 RP5RTC_HH .DB 00 RP5RTC_MM .DB 00 RP5RTC_SS .DB 00 -;; -RP5RTC_MONTBL: ; DAYS IN MONTH + 1 - .DB 32 ; JANUARY - .DB 29 ; FEBRUARY (NON-LEAP) - .DB 32 ; MARCH - .DB 31 ; APRIL - .DB 32 ; MAY - .DB 31 ; JUNE - .DB 32 ; JULY - .DB 32 ; AUGUST - .DB 31 ; SEPTEMBER - .DB 32 ; OCTOBER - .DB 31 ; NOVEMBER - .DB 32 ; DECEMBER From 9aef5b0977bbc389480e0b822e615abbe1f8882b Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Wed, 28 Oct 2020 10:24:29 +1100 Subject: [PATCH 03/18] RPC501: Added leap year support --- Source/HBIOS/rp5rtc.asm | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/Source/HBIOS/rp5rtc.asm b/Source/HBIOS/rp5rtc.asm index fec5fc63..6e8acae6 100644 --- a/Source/HBIOS/rp5rtc.asm +++ b/Source/HBIOS/rp5rtc.asm @@ -8,6 +8,15 @@ RP5RTC_BUFSIZ .EQU 6 ; SIX BYTE BUFFER (YYMMDDHHMMSS) ; RTC DEVICE INITIALIZATION ENTRY ; +; TODO: +; set the day of week register +; read from nvram +; write to nvram +; read block of nvram +; write block of nvram +; set alarm/get alarm???? + + RP5RTC_REG .EQU $B4 RP5RTC_DAT .EQU $B5 @@ -17,7 +26,7 @@ REG_1MIN .EQU $02 REG_10MIN .EQU $03 REG_1HR .EQU $04 REG_10HR .EQU $05 -REG_DAYWEEK .EQU $06 +REG_DAYWEEK .EQU $06 ; NOT USED BY THIS DRIVER REG_1DAY .EQU $07 REG_10DAY .EQU $08 REG_1MNTH .EQU $09 @@ -28,7 +37,9 @@ REG_MODE .EQU $0D REG_TEST .EQU $0E REG_RESET .EQU $0F + REG_12_24 .EQU $0A +REG_LEAPYR .EQU $0B MODE_TIMEST .EQU 0 MODE_ALRMST .EQU 1 @@ -187,6 +198,15 @@ RP5RTC_SETTIM: LD A, (RP5RTC_YR) CALL RP5RTC_WRVL + LD B, MODE_ALRMST + CALL RP5RTC_SETMD + + LD A, (RP5RTC_YR) + CALL BCD2BYTE + AND 3 + LD B, REG_LEAPYR + CALL RP5RTC_WRVL + XOR A ; SIGNAL SUCCESS RET ; AND RETURN ; @@ -301,3 +321,6 @@ RP5RTC_DT .DB 01 RP5RTC_HH .DB 00 RP5RTC_MM .DB 00 RP5RTC_SS .DB 00 + +RP5RTC_DW .DB 00 ; THE DAY OF THE WEEK +RP5RTC_LP .DB 00 ; 1 IF IS LEAP YEAR, OTHERWISE 0 From 0c4f82c8813bc15580a9dd5fe2395cfc444c1e7c Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Wed, 28 Oct 2020 14:29:47 +1100 Subject: [PATCH 04/18] RP5C01: Added support for read/write nvram byte and detect board present --- Source/HBIOS/rp5rtc.asm | 172 +++++++++++++++++++++++++++++++++------- 1 file changed, 142 insertions(+), 30 deletions(-) diff --git a/Source/HBIOS/rp5rtc.asm b/Source/HBIOS/rp5rtc.asm index 6e8acae6..6b67b9e6 100644 --- a/Source/HBIOS/rp5rtc.asm +++ b/Source/HBIOS/rp5rtc.asm @@ -10,12 +10,18 @@ RP5RTC_BUFSIZ .EQU 6 ; SIX BYTE BUFFER (YYMMDDHHMMSS) ; TODO: ; set the day of week register -; read from nvram -; write to nvram ; read block of nvram ; write block of nvram ; set alarm/get alarm???? +;; NOTES FOR USING DRIVER IN Z-DOS +; First load the LDDS datestamper +; A:LDDS +; next prepare and drives with datestamper info: +; eg: a:putds -d=g: -V +; then view date time of files with: +; a:filedate + RP5RTC_REG .EQU $B4 RP5RTC_DAT .EQU $B5 @@ -46,35 +52,46 @@ MODE_ALRMST .EQU 1 MODE_RAM0 .EQU 2 MODE_RAM1 .EQU 3 -MD_TIME .EQU 8 -MD_ALRM .EQU 4 +MD_TIME .EQU 8 +MD_ALRM .EQU 4 RP5RTC_INIT: - LD A,(RTC_DISPACT) ; RTC DISPATCHER ALREADY SET? + LD A, (RTC_DISPACT) ; RTC DISPATCHER ALREADY SET? OR A ; SET FLAGS RET NZ ; IF ALREADY ACTIVE, ABORT -; - CALL NEWLINE ; FORMATTING + + CALL NEWLINE ; FORMATTING PRTS("RP5C01 RTC: $") -; + ; PRINT RTC LATCH PORT ADDRESS + PRTS("IO=0x$") ; LABEL FOR IO ADDRESS + LD A,RP5RTC_REG ; GET IO ADDRESS + CALL PRTHEXBYTE ; PRINT IT + CALL PC_SPACE ; FORMATTING + + ; CHECK PRESENCE STATUS + CALL RP5RTC_DETECT ; HARDWARE DETECTION + JR Z, RP5RTC_INIT1 ; IF ZERO, ALL GOOD + PRTS("NOT PRESENT$") ; NOT ZERO, H/W NOT PRESENT + OR $FF ; SIGNAL FAILURE + RET ; BAIL OUT + +RP5RTC_INIT1: ; ENSURE DEVICE IS RESET AND NOT IN TEST MODE - LD A, REG_TEST ; SELECT TEST REGISTER + LD A, REG_TEST ; SELECT TEST REGISTER OUT (RP5RTC_REG), A CALL DLY16 XOR A - OUT (RP5RTC_DAT), A ; TURN OFF ALL TEST MODE BITS - + OUT (RP5RTC_DAT), A ; TURN OFF ALL TEST MODE BITS LD B, MODE_ALRMST CALL RP5RTC_SETMD - LD A, REG_12_24 ; SET TO 24 HOUR CLOCK + LD A, REG_12_24 ; SET TO 24 HOUR CLOCK OUT (RP5RTC_REG), A LD A, 1 OUT (RP5RTC_DAT), A - CALL RP5RTC_RDTIM ; DISPLAY CURRENT TIME @@ -84,7 +101,36 @@ RP5RTC_INIT: LD BC, RP5RTC_DISPATCH CALL RTC_SETDISP ; - XOR A ; SIGNAL SUCCESS + XOR A ; SIGNAL SUCCESS + RET +; +; DETECT RTC HARDWARE PRESENCE +; +RP5RTC_DETECT: + LD C, 0 ; NVRAM INDEX 0 + CALL RP5RTC_GETBYT ; GET VALUE + LD A, E ; TO ACCUM + LD L, A ; SAVE IT + XOR $FF ; FLIP ALL BITS + LD E, A ; TO E + LD C, 0 ; NVRAM INDEX 0 + CALL RP5RTC_SETBYT ; WRITE IT + LD C, 0 ; NVRAM INDEX 0 + CALL RP5RTC_GETBYT ; GET VALUE + LD A, L ; GET SAVED VALUE + XOR $FF ; FLIP ALL BITS + CP E ; COMPARE WITH VALUE READ + LD A, 0 ; ASSUME OK + JR Z, RP5RTC_DETECT1 ; IF MATCH, GO AHEAD + LD A, $FF ; ELSE STATUS IS ERROR + +RP5RTC_DETECT1: + PUSH AF ; SAVE STATUS + LD A, L ; GET SAVED VALUE + LD C, 0 ; NVRAM INDEX 0 + CALL RP5RTC_SETBYT ; SAVE IT + POP AF ; RECOVER STATUS + OR A ; SET FLAGS RET ; ; RTC DEVICE FUNCTION DISPATCH ENTRY @@ -92,40 +138,108 @@ RP5RTC_INIT: ; B: FUNCTION (IN) ; RP5RTC_DISPATCH: - LD A,B ; GET REQUESTED FUNCTION - AND $0F ; ISOLATE SUB-FUNCTION - JP Z,RP5RTC_GETTIM ; GET TIME + LD A,B ; GET REQUESTED FUNCTION + AND $0F ; ISOLATE SUB-FUNCTION + JP Z,RP5RTC_GETTIM ; GET TIME DEC A - JP Z,RP5RTC_SETTIM ; SET TIME + JP Z,RP5RTC_SETTIM ; SET TIME DEC A - JP Z,RP5RTC_GETBYT ; GET NVRAM BYTE VALUE + JP Z,RP5RTC_GETBYT ; GET NVRAM BYTE VALUE DEC A - JP Z,RP5RTC_SETBYT ; SET NVRAM BYTE VALUE + JP Z,RP5RTC_SETBYT ; SET NVRAM BYTE VALUE DEC A - JP Z,RP5RTC_GETBLK ; GET NVRAM DATA BLOCK VALUES + JP Z,RP5RTC_GETBLK ; GET NVRAM DATA BLOCK VALUES DEC A - JP Z,RP5RTC_SETBLK ; SET NVRAM DATA BLOCK VALUES + JP Z,RP5RTC_SETBLK ; SET NVRAM DATA BLOCK VALUES DEC A - JP Z,RP5RTC_GETALM ; GET ALARM + JP Z,RP5RTC_GETALM ; GET ALARM DEC A - JP Z,RP5RTC_SETALM ; SET ALARM + JP Z,RP5RTC_SETALM ; SET ALARM DEC A - JP Z,RP5RTC_DEVICE ; REPORT RTC DEVICE INFO + JP Z,RP5RTC_DEVICE ; REPORT RTC DEVICE INFO CALL SYSCHK - LD A,ERR_NOFUNC + LD A, ERR_NOFUNC OR A RET ; -; NVRAM FUNCTIONS ARE NOT AVAILABLE IN SIMULATOR +; RTC GET NVRAM BYTE +; C: INDEX +; E: VALUE (OUTPUT) +; A:0 IF OK, ERR_RANGE IF OUT OF RANGE ; RP5RTC_GETBYT: + LD A, C + CP $0D + JR NC, RP5RTC_BADIDX + + LD B, MODE_RAM0 + CALL RP5RTC_SETMD + LD A, C ; SELECT NVRAM INDEX + OUT (RP5RTC_REG), A + IN A, (RP5RTC_DAT) + AND $0F ; RETRIEVE UNIT NIBBLE + LD E, A + + LD B, MODE_RAM1 + CALL RP5RTC_SETMD + LD A, C ; SELECT NVRAM INDEX + OUT (RP5RTC_REG), A + IN A, (RP5RTC_DAT) + AND $0F ; RETRIEVE UNIT NIBBLE + RLCA + RLCA + RLCA + RLCA + OR E + LD E, A + + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN + +RP5RTC_BADIDX: + LD E, 00 + LD A, ERR_RANGE + RET +; +; RTC SET NVRAM BYTE +; C: INDEX +; E: VALUE +; A:0 IF OK, ERR_RANGE IF OUT OF RANGE +; RP5RTC_SETBYT: + LD A, C + CP $0D + JR NC, RP5RTC_BADIDX + + LD B, MODE_RAM0 + CALL RP5RTC_SETMD + LD A, C ; SELECT NVRAM INDEX + OUT (RP5RTC_REG), A + LD A, E + AND $0F + OUT (RP5RTC_DAT), A + + LD B, MODE_RAM1 + CALL RP5RTC_SETMD + LD A, C ; SELECT NVRAM INDEX + OUT (RP5RTC_REG), A + LD A, E + AND $F0 + RRCA + RRCA + RRCA + RRCA + OUT (RP5RTC_DAT), A + + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN + RP5RTC_GETBLK: RP5RTC_SETBLK: RP5RTC_GETALM: RP5RTC_SETALM: + LD A, ERR_NOTIMPL CALL SYSCHK - LD A,ERR_NOTIMPL OR A RET ; @@ -322,5 +436,3 @@ RP5RTC_HH .DB 00 RP5RTC_MM .DB 00 RP5RTC_SS .DB 00 -RP5RTC_DW .DB 00 ; THE DAY OF THE WEEK -RP5RTC_LP .DB 00 ; 1 IF IS LEAP YEAR, OTHERWISE 0 From 83529a7f769882123bb076b8074d555ab0e80731 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Tue, 10 Nov 2020 18:02:08 +1100 Subject: [PATCH 05/18] RP5RTC: Fixed issue with clock not enabled --- Source/HBIOS/rp5rtc.asm | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Source/HBIOS/rp5rtc.asm b/Source/HBIOS/rp5rtc.asm index 6b67b9e6..4fe0a677 100644 --- a/Source/HBIOS/rp5rtc.asm +++ b/Source/HBIOS/rp5rtc.asm @@ -87,6 +87,8 @@ RP5RTC_INIT1: LD B, MODE_ALRMST CALL RP5RTC_SETMD + CALL RP5RTC_ENTIME + LD A, REG_12_24 ; SET TO 24 HOUR CLOCK OUT (RP5RTC_REG), A LD A, 1 @@ -321,6 +323,8 @@ RP5RTC_SETTIM: LD B, REG_LEAPYR CALL RP5RTC_WRVL + CALL RP5RTC_ENTIME + XOR A ; SIGNAL SUCCESS RET ; AND RETURN ; @@ -378,6 +382,10 @@ RP5RTC_SETMD: OUT (RP5RTC_DAT), A ; ASSIGN MODE RET +; ENABLE THE TIME COUNTER +RP5RTC_ENTIME: + LD B, MD_TIME + JP RP5RTC_SETMD ; READ OUT 2 REGISTERS - 2 NIBBLES TO 1 BYTE ; REGISTER IN B From a9192923869f6d8c9ae0806b61d3d6098f78f534 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Thu, 5 Nov 2020 15:46:43 +1100 Subject: [PATCH 06/18] Added msx compatible keyboard driver for use in MSX --- Source/HBIOS/cfg_dyno.asm | 2 + Source/HBIOS/cfg_ezz80.asm | 2 + Source/HBIOS/cfg_master.asm | 3 + Source/HBIOS/cfg_mk4.asm | 3 + Source/HBIOS/cfg_n8.asm | 3 + Source/HBIOS/cfg_rcz180.asm | 2 + Source/HBIOS/cfg_rcz280.asm | 2 + Source/HBIOS/cfg_rcz80.asm | 3 + Source/HBIOS/cfg_sbc.asm | 3 + Source/HBIOS/cfg_scz180.asm | 2 + Source/HBIOS/cfg_zeta.asm | 2 + Source/HBIOS/cfg_zeta2.asm | 2 + Source/HBIOS/hbios.asm | 9 + Source/HBIOS/msxkeyb.asm | 1168 +++++++++++++++++++++++++++++++++++ Source/HBIOS/tms.asm | 17 + 15 files changed, 1223 insertions(+) create mode 100644 Source/HBIOS/msxkeyb.asm diff --git a/Source/HBIOS/cfg_dyno.asm b/Source/HBIOS/cfg_dyno.asm index e5f3174d..6f19b7e7 100644 --- a/Source/HBIOS/cfg_dyno.asm +++ b/Source/HBIOS/cfg_dyno.asm @@ -186,3 +186,5 @@ AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 AYMODE .EQU AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) + +MSKENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) diff --git a/Source/HBIOS/cfg_ezz80.asm b/Source/HBIOS/cfg_ezz80.asm index 0cfa36dc..79ab1aac 100644 --- a/Source/HBIOS/cfg_ezz80.asm +++ b/Source/HBIOS/cfg_ezz80.asm @@ -220,3 +220,5 @@ AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 AYMODE .EQU AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) + +MSKENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) diff --git a/Source/HBIOS/cfg_master.asm b/Source/HBIOS/cfg_master.asm index 0618dadb..7de68192 100644 --- a/Source/HBIOS/cfg_master.asm +++ b/Source/HBIOS/cfg_master.asm @@ -104,6 +104,7 @@ PPKTRACE .EQU 1 ; PPK DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) KBDTRACE .EQU 1 ; KBD DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPKKBLOUT .EQU KBD_US ; PPK KEYBOARD LANGUAGE: KBD_[US|DE] KBDKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] +MKYKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] ; DSRTCENABLE .EQU FALSE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) DSRTCMODE .EQU DSRTCMODE_STD ; DSRTC: OPERATING MODE: DSRTC_[STD|MFPIC] @@ -288,3 +289,5 @@ AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) + +MSKENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) diff --git a/Source/HBIOS/cfg_mk4.asm b/Source/HBIOS/cfg_mk4.asm index 7bfb167c..d4e51cfb 100644 --- a/Source/HBIOS/cfg_mk4.asm +++ b/Source/HBIOS/cfg_mk4.asm @@ -79,6 +79,7 @@ PPKTRACE .EQU 1 ; PPK DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) KBDTRACE .EQU 1 ; KBD DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPKKBLOUT .EQU KBD_US ; PPK KEYBOARD LANGUAGE: KBD_[US|DE] KBDKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] +MKYKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] ; DSRTCENABLE .EQU TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) DSRTCMODE .EQU DSRTCMODE_STD ; DSRTC: OPERATING MODE: DSRTC_[STD|MFPIC] @@ -220,3 +221,5 @@ AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 AYMODE .EQU AYMODE_SCG ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) + +MSKENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) diff --git a/Source/HBIOS/cfg_n8.asm b/Source/HBIOS/cfg_n8.asm index 3e70cf78..4b620372 100644 --- a/Source/HBIOS/cfg_n8.asm +++ b/Source/HBIOS/cfg_n8.asm @@ -82,6 +82,7 @@ PPKTRACE .EQU 1 ; PPK DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) KBDTRACE .EQU 1 ; KBD DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPKKBLOUT .EQU KBD_US ; PPK KEYBOARD LANGUAGE: KBD_[US|DE] KBDKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] +MKYKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] ; DSRTCENABLE .EQU TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) DSRTCMODE .EQU DSRTCMODE_STD ; DSRTC: OPERATING MODE: DSRTC_[STD|MFPIC] @@ -220,3 +221,5 @@ AY38910ENABLE .EQU TRUE ; AY: AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 AYMODE .EQU AYMODE_N8 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) + +MSKENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) diff --git a/Source/HBIOS/cfg_rcz180.asm b/Source/HBIOS/cfg_rcz180.asm index 5715c783..873d2ea6 100644 --- a/Source/HBIOS/cfg_rcz180.asm +++ b/Source/HBIOS/cfg_rcz180.asm @@ -233,3 +233,5 @@ AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 AYMODE .EQU AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) + +MSKENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) diff --git a/Source/HBIOS/cfg_rcz280.asm b/Source/HBIOS/cfg_rcz280.asm index 653e282a..8d0bb0e5 100644 --- a/Source/HBIOS/cfg_rcz280.asm +++ b/Source/HBIOS/cfg_rcz280.asm @@ -249,3 +249,5 @@ AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU 7372800 / 4 ; DEFAULT TO CPUOSC / 4 AYMODE .EQU AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) + +MSKENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) diff --git a/Source/HBIOS/cfg_rcz80.asm b/Source/HBIOS/cfg_rcz80.asm index e529f743..7cf06c0f 100644 --- a/Source/HBIOS/cfg_rcz80.asm +++ b/Source/HBIOS/cfg_rcz80.asm @@ -74,6 +74,7 @@ BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +MKYKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] ; DSRTCENABLE .EQU TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) DSRTCMODE .EQU DSRTCMODE_STD ; DSRTC: OPERATING MODE: DSRTC_[STD|MFPIC] @@ -238,3 +239,5 @@ AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 AYMODE .EQU AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) + +MSKENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) diff --git a/Source/HBIOS/cfg_sbc.asm b/Source/HBIOS/cfg_sbc.asm index de34c10f..5f57e0b4 100644 --- a/Source/HBIOS/cfg_sbc.asm +++ b/Source/HBIOS/cfg_sbc.asm @@ -74,6 +74,7 @@ PPKTRACE .EQU 1 ; PPK DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) KBDTRACE .EQU 1 ; KBD DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPKKBLOUT .EQU KBD_US ; PPK KEYBOARD LANGUAGE: KBD_[US|DE] KBDKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] +MKYKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] ; DSRTCENABLE .EQU TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) DSRTCMODE .EQU DSRTCMODE_STD ; DSRTC: OPERATING MODE: DSRTC_[STD|MFPIC] @@ -221,3 +222,5 @@ AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 AYMODE .EQU AYMODE_SCG ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) + +MSKENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) diff --git a/Source/HBIOS/cfg_scz180.asm b/Source/HBIOS/cfg_scz180.asm index 74976cdf..883750bf 100644 --- a/Source/HBIOS/cfg_scz180.asm +++ b/Source/HBIOS/cfg_scz180.asm @@ -228,3 +228,5 @@ AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 AYMODE .EQU AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) + +MSKENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) diff --git a/Source/HBIOS/cfg_zeta.asm b/Source/HBIOS/cfg_zeta.asm index e5eff0d2..9fcc1fe3 100644 --- a/Source/HBIOS/cfg_zeta.asm +++ b/Source/HBIOS/cfg_zeta.asm @@ -163,3 +163,5 @@ AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) + +MSKENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) diff --git a/Source/HBIOS/cfg_zeta2.asm b/Source/HBIOS/cfg_zeta2.asm index cec7ef24..4cdd909f 100644 --- a/Source/HBIOS/cfg_zeta2.asm +++ b/Source/HBIOS/cfg_zeta2.asm @@ -174,3 +174,5 @@ AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) + +MSKENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index b4e0c6c5..bcca366c 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -4668,6 +4668,15 @@ SIZ_PPK .EQU $ - ORG_PPK .ECHO " bytes.\n" #ENDIF ; +#IF (MSKENABLE) +ORG_MSXKEYB .EQU $ + #INCLUDE "msxkeyb.asm" +SIZ_MSXKEYB .EQU $ - ORG_MSXKEYB + .ECHO "MSXKEYB occupies " + .ECHO SIZ_MSXKEYB + .ECHO " bytes.\n" +#ENDIF +; #IF (PRPENABLE) ORG_PRP .EQU $ #INCLUDE "prp.asm" diff --git a/Source/HBIOS/msxkeyb.asm b/Source/HBIOS/msxkeyb.asm new file mode 100644 index 00000000..8bf0f892 --- /dev/null +++ b/Source/HBIOS/msxkeyb.asm @@ -0,0 +1,1168 @@ +;====================================================================== +; MSX 8255 PPI KEYBOARD COMPATIBLE DRIVER +; +; CREATED BY: DEAN NETHERTON +; KBD.ASM DRIVER USED AS TEMPLATE +; +; +;====================================================================== +; USAGE: +; THIS DRIVER IS CAN BE ACTIVED WITHIN THE TMS VIDEO DRIVER +; ADD THE OPTION TO YOUR BUILD CONFIGURATION TO ACTIVATE THE KEYBOARD +; DRIVER: +; MSKENABLE .SET TRUE +; +;====================================================================== +; +; TODO: +; IMPLEMENT MULTIBYTE SCAN CODES (ARROW KEYS, ETC) +; +;====================================================================== +; DRIVER - CONSTANTS +;====================================================================== +; +MKY_REGA .EQU $A8 +MKY_REGB .EQU $A9 +MKY_REGC .EQU $AA +MKY_REGCMD .EQU $AB + +PPICMD_CLOW_IN .EQU 1 +PPICMD_CLOW_OUT .EQU 0 +PPICMD_B_IN .EQU 2 +PPICMD_B_OUT .EQU 0 +PPICMD_GB_MODE_0 .EQU 0 +PPICMD_GB_MODE_1 .EQU 4 +PPICMD_CHIGH_IN .EQU 8 +PPICMD_CHIGH_OUT .EQU 0 +PPICMD_A_IN .EQU 16 +PPICMD_A_OUT .EQU 0 +PPICMD_GA_MODE_0 .EQU 0 +PPICMD_GA_MODE_1 .EQU 32 +PPICMD_GA_MODE_2 .EQU 64 +PPICMD_COMMAND .EQU 128 + +; COUNT FOR PERIOD TO START REPEATING CHARACTERS +KEY_REPEAT_INIT: .EQU 20 + +; COUNT FOR PERIOD BETWEEN AUTO REPEATING CHARACTERS +KEY_REPEAT_PERIOD: .EQU 5 + +; COUNT FOR INTERRUPT HANDLER TO TRIGGER KEYBOARD SCANNER (EG: SCAN KEYBOARD ONLY EVERY 3RD INTERRUPT (3/60)) +SCAN_INT_PERIOD: .EQU 3 + +; NUMBER OF ROWS SUPPORTED BY THE KEYBOARD +MATRIX_ROW_COUNT: .EQU 9 + +; ASSEMBLER SEEMS TO HAVE WEIRD PROBLEM WITH "'" +SINGLE_QUOTE .EQU 39 + +; SPECIAL MADE UP VALUE TO MAP FOR CAPS LOCK +CAPS_CODE: .EQU $D8 + +; TIMING CONSTANTS +; +MKY_WAITTO .EQU 0 ; 0 IS MAX WAIT (256) +; +; STATUS BITS (FOR MKY_STATUS) +; +MKY_EXT .EQU 01H ; BIT 0, EXTENDED SCANCODE ACTIVE +MKY_BREAK .EQU 02H ; BIT 1, THIS IS A KEY UP (BREAK) EVENT +MKY_KEYRDY .EQU 80H ; BIT 7, INDICATES A DECODED KEYCODE IS READY +; +; STATE BITS (FOR MKY_STATE, MKY_LSTATE, MKY_RSTATE) +; +MKY_SHIFT .EQU 01H ; BIT 0, SHIFT ACTIVE (PRESSED) +MKY_CTRL .EQU 02H ; BIT 1, CONTROL ACTIVE (PRESSED) +MKY_ALT .EQU 04H ; BIT 2, ALT ACTIVE (PRESSED) +MKY_WIN .EQU 08H ; BIT 3, WIN ACTIVE (PRESSED) +MKY_SCRLCK .EQU 10H ; BIT 4, CAPS LOCK ACTIVE (TOGGLED ON) +MKY_NUMLCK .EQU 20H ; BIT 5, NUM LOCK ACTIVE (TOGGLED ON) +MKY_CAPSLCK .EQU 40H ; BIT 6, SCROLL LOCK ACTIVE (TOGGLED ON) +MKY_NUMPAD .EQU 80H ; BIT 7, NUM PAD KEY (KEY PRESSED IS ON NUM PAD) +; +MKY_DEFRPT .EQU $40 ; DEFAULT REPEAT RATE (.5 SEC DELAY, 30CPS) +MKY_DEFSTATE .EQU MKY_NUMLCK ; DEFAULT STATE (NUM LOCK ON) + +; --------------.----------------------- +; SCAN CODE TABL.ES + +S_A .EQU $1C +S_B .EQU $32 +S_C .EQU $21 +S_D .EQU $23 +S_E .EQU $24 +S_F .EQU $2B +S_G .EQU $34 +S_H .EQU $33 +S_I .EQU $43 +S_J .EQU $3B +S_K .EQU $42 +S_L .EQU $4B +S_M .EQU $3A +S_N .EQU $31 +S_O .EQU $44 +S_P .EQU $4D +S_Q .EQU $15 +S_R .EQU $2D +S_S .EQU $1B +S_T .EQU $2C +S_U .EQU $3C +S_V .EQU $2A +S_W .EQU $1D +S_X .EQU $22 +S_Y .EQU $35 +S_Z .EQU $1A +S_0 .EQU $45 +S_1 .EQU $16 +S_2 .EQU $1E +S_3 .EQU $26 +S_4 .EQU $25 +S_5 .EQU $2E +S_6 .EQU $36 +S_7 .EQU $3D +S_8 .EQU $3E +S_9 .EQU $46 +S_SEMICOLON .EQU $4C +S_RBRACKET .EQU $5B +S_LBRACKET .EQU $54 +S_BSLASH .EQU $5D +S_EQUALS .EQU $55 +S_MINUS .EQU $4E +S_SLASH .EQU $4A +S_PERIOD .EQU $49 +S_COMMA .EQU $41 +S_TILDA .EQU $0E +S_QUOTE .EQU $52 +S_SHIFT .EQU $12 +S_CTRL .EQU $14 +S_CAPSLOCK .EQU $58 +S_DEAD .EQU $00 +S_GRAPH .EQU $00 +S_CODE .EQU $00 ; perhaps can be mapped to RIGHT ALT +S_F1 .EQU $05 +S_F2 .EQU $06 +S_F3 .EQU $04 +S_F4 .EQU $0C +S_F5 .EQU $03 +S_ESC .EQU $76 +S_TAB .EQU $0D +S_STOP .EQU $00 ; MAKE -> E0 69, BREAK -> E0 F0 69 +S_BACKSPACE .EQU $66 +S_SELECT .EQU $00 +S_RETURN .EQU $5A + +S_RIGHT .EQU $00 ; E0 74 --- E0 F0 74 +S_DOWN .EQU $00 ; E0 72 --- E0 F0 72 +S_UP .EQU $00 ; E0 75 --- E0 F0 75 +S_LEFT .EQU $00 ; E0 6B --- E0 F0 6B +S_DELETE .EQU $00 ; E0 71 --- E0 F0 71 +S_INSERT .EQU $00 ; E0 70 --- E0 F0 70 +S_HOME .EQU $00 ; E0 6C --- E0 F0 6C +S_SPACE .EQU $29 + +SCANCODE_TBL: + .DB S_7, S_6, S_5, S_4, S_3, S_2, S_1, S_0 ; 00 + .DB S_SEMICOLON, S_RBRACKET, S_LBRACKET, S_BSLASH, S_EQUALS, S_MINUS, S_9, S_8 ; 01 + .DB S_B, S_A, S_DEAD, S_SLASH, S_PERIOD, S_COMMA, S_TILDA, S_QUOTE ; 02 + .DB S_J, S_I, S_H, S_G, S_F, S_E, S_D, S_C ; 03 + .DB S_R, S_Q, S_P, S_O, S_N, S_M, S_L, S_K ; 04 + .DB S_Z, S_Y, S_X, S_W, S_V, S_U, S_T, S_S ; 05 + .DB S_F3, S_F2, S_F1, S_CODE, S_CAPSLOCK, S_GRAPH, S_CTRL, S_SHIFT ; 06 + .DB S_RETURN, S_SELECT, S_BACKSPACE, S_STOP, S_TAB, S_ESC, S_F5, S_F4 ; 07 + .DB S_RIGHT, S_DOWN, S_UP, S_LEFT, S_DELETE, S_INSERT, S_HOME, S_SPACE ; 08 + +;__________________________________________________________________________________________________ +; KEYBOARD INITIALIZATION +;__________________________________________________________________________________________________ +; + +MKY_INIT: + CALL NEWLINE ; FORMATTING + PRTS("MSXKYB: IO=0x$") + LD A, MKY_REGA + CALL PRTHEXBYTE + CALL PC_SPACE ; FORMATTING + +#IF (MKYKBLOUT == KBD_US) + PRTS("US LAYOUT$") +#ELSE +#IF (MKYKBLOUT == KBD_DE) + PRTS("GERMAN LAYOUT$") +#ELSE + FAIL !!! + UKNOWN KEYBOARD TYPE +#ENDIF +#ENDIF + + ; CONFIGURE 8255 PPI PORTS + ; A - INPUT (NOT USED) + ; B - INPUT (COLUMN LINES) + ; C - OUTPUT (ROW LINE SELECTION) + + LD A, PPICMD_COMMAND | PPICMD_GA_MODE_0 | PPICMD_GB_MODE_0 | PPICMD_A_IN | PPICMD_B_IN | PPICMD_CLOW_OUT | PPICMD_CHIGH_OUT + OUT (MKY_REGCMD), A + + LD A, 64 ; CAPS OFF + OUT (MKY_REGC), A + + RET +; +;__________________________________________________________________________________________________ +; KEYBOARD FLUSH +;__________________________________________________________________________________________________ +; +MKY_FLUSH: + XOR A ; A = 0 + LD (MKY_STATUS),A ; CLEAR STATUS + RET +; +;__________________________________________________________________________________________________ +; KEYBOARD STATUS +;__________________________________________________________________________________________________ +; +MKY_STAT: + CALL MKY_DECODE ; CHECK THE KEYBOARD + JP Z,CIO_IDLE ; RET VIA IDLE PROCESSING IF NO KEY + RET +; +;__________________________________________________________________________________________________ +; KEYBOARD READ +; +; RETURNS ASCII VALUE IN E. SEE END OF FILE FOR VALUES RETURNED FOR SPECIAL KEYS +; LIKE PGUP, ARROWS, FUNCTION KEYS, ETC. +;__________________________________________________________________________________________________ +; +MKY_READ: + CALL MKY_STAT ; KEY READY? +; + JR Z, MKY_READ ; NOT READY, KEEP TRYING + LD A,(MKY_STATE) ; GET STATE + AND $01 ; ISOLATE EXTENDED SCANCODE BIT + RRCA ; ROTATE IT TO HIGH ORDER BIT + LD E,A ; SAVE IT IN E FOR NOW + LD A,(MKY_SCANCODE) ; GET SCANCODE + OR E ; COMBINE WITH EXTENDED BIT + LD C,A ; STORE IT IN C FOR RETURN + LD A,(MKY_KEYCODE) ; GET KEYCODE + LD E,A ; SAVE IT IN E + LD A,(MKY_STATE) ; GET STATE FLAGS + LD D,A ; SAVE THEM IN D + XOR A ; SIGNAL SUCCESS + LD (MKY_STATUS),A ; CLEAR STATUS TO INDICATE BYTE RECEIVED + RET +; +;__________________________________________________________________________________________________ +; RETRIEVE THE NEXT SCAN BYTES AVAILABLE +; +; RETURNS +; ; SUCUESS/FAILURE IN A +; ; NUMBER OF BYTES RETURNED IN B (ZERO IF NO SCAN CODES AVAILABLE) +; ; SCAN CODE BYTES IN D, E, H, L, C +; +;__________________________________________________________________________________________________ +MKY_RDSCAN: + LD A, (MKY_SCANBUFFLEN) + LD B, A + LD A, (MKY_SCANBUFF) + LD D, A + LD A, (MKY_SCANBUFF+1) + LD E, A + LD A, (MKY_SCANBUFF+2) + LD H, A + LD A, (MKY_SCANBUFF+3) + LD L, A + LD A, (MKY_SCANBUFF+4) + LD C, A + + XOR A + LD (MKY_SCANBUFFLEN), A + RET +; +;__________________________________________________________________________________________________ +; HARDWARE INTERFACE +; +; +; KEYBOARD INPUT STATUS +; A=0, Z SET FOR NOTHING PENDING, OTHERWISE DATA PENDING +; +MKY_IST: + LD A, (MKY_SCANBUFFLEN) + OR A + RET +;__________________________________________________________________________________________________ +; +; GET A RAW DATA BYTE FROM KEYBOARD INTERFACE INTO A WITH TIMEOUT +; +MKY_GETDATA: + LD B,MKY_WAITTO ; SETUP TO LOOP +MKY_GETDATA0: + CALL MKY_IST ; GET INPUT REGISTER STATUS + JR NZ,MKY_GETDATA1 ; BYTE PENDING, GO GET IT + CALL DELAY ; WAIT A BIT + DJNZ MKY_GETDATA0 ; LOOP UNTIL COUNTER EXHAUSTED + XOR A ; NO DATA, RETURN ZERO + RET +MKY_GETDATA1: + CALL MKY_READBYT + OR A ; SET FLAGS + RET +;__________________________________________________________________________________________________ +; +; GET A RAW DATA BYTE FROM KEYBOARD INTERFACE INTO A WITH NOTIMEOUT +; +MKY_GETDATAX: + CALL MKY_IST ; GET INPUT REGISTER STATUS + RET Z ; NOTHING THERE, DONE + JR MKY_GETDATA1 ; GO GET IT + +;__________________________________________________________________________________________________ +; UPDATE KEYBOARD LEDS BASED ON CURRENT TOGGLE FLAGS +;__________________________________________________________________________________________________ +; +MKY_SETLEDS: + LD A,(MKY_STATE) ; LOAD THE STATE FLAGS + AND MKY_CAPSLCK ; CHECK CAPS LOCK + JP Z, MKY_LEDCAPSOFF + JP MKY_LEDCAPSON + +;__________________________________________________________________________________________________ +; DECODING ENGINE +;__________________________________________________________________________________________________ +MKY_DECODE: +; +; RUN THE DECODING ENGINE UNTIL EITHER: 1) NO MORE SCANCODES ARE AVAILABLE +; FROM THE KEYBOARD, OR 2) A DECODED KEY VALUE IS AVAILABLE +; +; RETURNS A=0 AND Z SET IF NO KEYCODE READY, OTHERWISE A DECODED KEY VALUE IS AVAILABLE. +; THE DECODED KEY VALUE AND KEY STATE IS STORED IN MKY_KEYCODE AND MKY_STATE. +; +; MKY_STATUS IS NOT CLEARED AT START. IT IS THE CALLER'S RESPONSIBILITY +; TO CLEAR MKY_STATUS WHEN IT HAS RETRIEVED A PENDING VALUE. IF DECODE IS CALLED +; WITH A KEYCODE STILL PENDING, IT WILL JUST RETURN WITHOUT DOING ANYTHING. +; +; Step 0: Check keycode buffer +; if status[keyrdy] +; return +; +; Step 1: Get scancode +; if no scancode ready +; return +; read scancode +; +; Step 2: Detect and handle special keycodes +; if scancode == $AA +; *** handle hot insert somehow *** +; +; Step 3: Detect and handle scancode prefixes +; if scancode == $E0 +; set status[extended] +; goto Step 1 +; +; if scancode == $E1 +; *** handle pause key somehow *** +; +; Step 4: Detect and flag break event +; *** scancode set #1 variation *** +; set status[break] = high bit of scancode +; clear high order bit +; continue to Step 5 +; *** scancode set #2 variation *** +; if scancode == $F0 +; set status[break] +; goto Step 1 +; +; Step 5: Map scancode to keycode +; if status[extended] +; apply extended-map[scancode] -> keycode +; else if state[shifted] +; apply shifted-map[scancode] -> keycode +; else +; apply normal-map[scancode] -> keycode +; +; Step 6: Handle modifier keys +; if keycode is modifier (shift, ctrl, alt, win) +; set (l/r)state[] = not status[break] +; clear modifier bits in state +; set state = (lstate OR rstate OR state) +; goto New Key +; +; Step 7: Complete procesing of key break events +; if status[break] +; goto New Key +; +; Step 8: Handle toggle keys +; if keycode is toggle (capslock, numlock, scrolllock) +; invert (XOR) state[] +; update keyboard LED's +; goto New Key +; +; Step 9: Adjust keycode for control modifier +; if state[ctrl] +; if keycode is 'a'-'z' +; subtract 20 (clear bit 5) from keycode +; if keycode is '@'-'_' +; subtract 40 (clear bit 6) from keycode +; +; Step 10: Adjust keycode for caps lock +; if state[capslock] +; if keycode is 'a'-'z' OR 'A'-'Z' +; toggle (XOR) bit 5 of keycode +; +; Step 11: Handle num pad keys +; clear state[numpad] +; if keycode is numpad +; set state[numpad] +; if state[numlock] +; toggle (XOR) bit 4 of keycode +; apply numpad-map[keycode] -> keycode +; +; Step 12: Detect unknown/invalid keycodes +; if keycode == $FF +; goto New Key +; +; Step 13: Done +; set status[keyrdy] +; return +; +; New Key: +; clear status +; goto Step 1 +; +MKY_DEC0: ; CHECK KEYCODE BUFFER + LD A,(MKY_STATUS) ; GET CURRENT STATUS + AND MKY_KEYRDY ; ISOLATE KEY READY FLAG + RET NZ ; ABORT IF KEY IS ALREADY PENDING + +MKY_DEC1: ; PROCESS NEXT SCANCODE + CALL MKY_GETDATAX ; GET THE SCANCODE + RET Z ; NO KEY READY, RETURN WITH A=0, Z SET + LD (MKY_SCANCODE),A ; SAVE SCANCODE + +MKY_DEC2: ; DETECT AND HANDLE SPECIAL KEYCODES + LD A,(MKY_SCANCODE) ; GET THE CURRENT SCANCODE + CP $AA ; KEYBOARD INSERTION? + JR NZ,MKY_DEC3 ; NOPE, BYPASS + CALL MKY_SETLEDS ; SET LEDS + JP MKY_DECNEW ; RESTART THE ENGINE + +MKY_DEC3: ; DETECT AND HANDLE SCANCODE PREFIXES + LD A,(MKY_SCANCODE) ; GET THE CURRENT SCANCODE + +MKY_DEC3A: ; HANDLE SCANCODE PREFIX $E0 (EXTENDED SCANCODE FOLLOWS) + CP $E0 ; EXTENDED KEY PREFIX $E0? + JR NZ,MKY_DEC3B ; NOPE MOVE ON + LD A,(MKY_STATUS) ; GET STATUS + OR MKY_EXT ; SET EXTENDED BIT + LD (MKY_STATUS),A ; SAVE STATUS + JR MKY_DEC1 ; LOOP TO DO NEXT SCANCODE + +MKY_DEC3B: ; HANDLE SCANCODE PREFIX $E1 (PAUSE KEY) + CP $E1 ; EXTENDED KEY PREFIX $E1 + JR NZ,MKY_DEC4 ; NOPE MOVE ON + LD A,$EE ; MAP TO KEYCODE $EE + LD (MKY_KEYCODE),A ; SAVE IT + ; SWALLOW NEXT 7 SCANCODES + LD B,7 ; LOOP 5 TIMES +MKY_DEC3B1: + PUSH BC + CALL MKY_GETDATA ; RETRIEVE NEXT SCANCODE + POP BC + DJNZ MKY_DEC3B1 ; LOOP AS NEEDED + JP MKY_DEC6 ; RESUME AFTER MAPPING + +MKY_DEC4: ; DETECT AND FLAG BREAK EVENT + CP $F0 ; BREAK (KEY UP) PREFIX? + JR NZ,MKY_DEC5 ; NOPE MOVE ON + LD A,(MKY_STATUS) ; GET STATUS + OR MKY_BREAK ; SET BREAK BIT + LD (MKY_STATUS),A ; SAVE STATUS + JR MKY_DEC1 ; LOOP TO DO NEXT SCANCODE + +MKY_DEC5: ; MAP SCANCODE TO KEYCODE + LD A,(MKY_STATUS) ; GET STATUS + AND MKY_EXT ; EXTENDED BIT SET? + JR Z,MKY_DEC5C ; NOPE, MOVE ON + + ; PERFORM EXTENDED KEY MAPPING + LD A,(MKY_SCANCODE) ; GET SCANCODE + LD E,A ; STASH IT IN E + LD HL,MKY_MAPEXT ; POINT TO START OF EXT MAP TABLE +MKY_DEC5A: + LD A,(HL) ; GET FIRST BYTE OF PAIR + CP $00 ; END OF TABLE? + JP Z,MKY_DECNEW ; UNKNOWN OR BOGUS, START OVER + INC HL ; INC HL FOR FUTURE + CP E ; DOES MATCH BYTE EQUAL SCANCODE? + JR Z,MKY_DEC5B ; YES! JUMP OUT + INC HL ; BUMP TO START OF NEXT PAIR + JR MKY_DEC5A ; LOOP TO CHECK NEXT TABLE ENTRY +MKY_DEC5B: + LD A,(HL) ; GET THE KEYCODE VIA MAPPING TABLE + LD (MKY_KEYCODE),A ; SAVE IT + JR MKY_DEC6 + +MKY_DEC5C: ; PERFORM REGULAR KEY (NOT EXTENDED) KEY MAPPING + LD A,(MKY_SCANCODE) ; GET THE SCANCODE + CP MKY_MAPSIZ ; COMPARE TO SIZE OF TABLE + JR NC,MKY_DEC6 ; PAST END, SKIP OVER LOOKUP + + ; SETUP POINTER TO MAPPING TABLE BASED ON SHIFTED OR UNSHIFTED STATE + LD A,(MKY_STATE) ; GET STATE + AND MKY_SHIFT ; SHIFT ACTIVE? + LD HL,MKY_MAPSTD ; LOAD ADDRESS OF NON-SHIFTED MAPPING TABLE + JR Z,MKY_DEC5D ; NON-SHIFTED, MOVE ON + LD HL,MKY_MAPSHIFT ; LOAD ADDRESS OF SHIFTED MAPPING TABLE +MKY_DEC5D: + LD A,(MKY_SCANCODE) ; GET THE SCANCODE + LD E,A ; SCANCODE TO E FOR TABLE OFFSET + LD D,0 ; D -> 0 + ADD HL,DE ; COMMIT THE TABLE OFFSET TO HL + LD A,(HL) ; GET THE KEYCODE VIA MAPPING TABLE + LD (MKY_KEYCODE),A ; SAVE IT + +MKY_DEC6: ; HANDLE MODIFIER KEYS + LD A,(MKY_KEYCODE) ; MAKE SURE WE HAVE KEYCODE + CP $B8 ; END OF MODIFIER KEYS + JR NC,MKY_DEC7 ; BYPASS MODIFIER KEY CHECKING + CP $B0 ; START OF MODIFIER KEYS + JR C,MKY_DEC7 ; BYPASS MODIFIER KEY CHECKING + + LD B,4 ; LOOP COUNTER TO LOOP THRU 4 MODIFIER BITS + LD E,$80 ; SETUP E TO ROATE THROUGH MODIFIER STATE BITS + SUB $B0 - 1 ; SETUP A TO DECREMENT THROUGH MODIFIER VALUES + +MKY_DEC6A: + RLC E ; SHIFT TO NEXT MODIFIER STATE BIT + DEC A ; L-MODIFIER? + JR Z,MKY_DEC6B ; YES, HANDLE L-MODIFIER MAKE/BREAK + DEC A ; R-MODIFIER? + JR Z,MKY_DEC6C ; YES, HANDLE R-MODIFIER MAKE/BREAK + DJNZ MKY_DEC6A ; LOOP THRU 4 MODIFIER BITS + JR MKY_DEC7 ; FAILSAFE, SHOULD NEVER GET HERE! + +MKY_DEC6B: ; LEFT STATE KEY MAKE/BREAK (STATE BIT TO SET/CLEAR IN E) + LD HL,MKY_LSTATE ; POINT TO LEFT STATE BYTE + JR MKY_DEC6D ; CONTINUE + +MKY_DEC6C: ; RIGHT STATE KEY MAKE/BREAK (STATE BIT TO SET/CLEAR IN E) + LD HL,MKY_RSTATE ; POINT TO RIGHT STATE BYTE + JR MKY_DEC6D ; CONTINUE + +MKY_DEC6D: ; BRANCH BASED ON WHETHER THIS IS A MAKE OR BREAK EVENT + LD A,(MKY_STATUS) ; GET STATUS FLAGS + AND MKY_BREAK ; BREAK EVENT? + JR Z,MKY_DEC6E ; NO, HANDLE A MODIFIER KEY MAKE EVENT + JR MKY_DEC6F ; YES, HANDLE A MODIFIER BREAK EVENT + +MKY_DEC6E: ; HANDLE STATE KEY MAKE EVENT + LD A,E ; GET THE BIT TO SET + OR (HL) ; OR IN THE CURRENT BITS + LD (HL),A ; SAVE THE RESULT + JR MKY_DEC6G ; CONTINUE + +MKY_DEC6F: ; HANDLE STATE KEY BREAK EVENT + LD A,E ; GET THE BIT TO CLEAR + XOR $FF ; FLIP ALL BITS TO SETUP FOR A CLEAR OPERATION + AND (HL) ; AND IN THE FLIPPED BITS TO CLEAR DESIRED BIT + LD (HL),A ; SAVE THE RESULT + JR MKY_DEC6G ; CONTINUE + +MKY_DEC6G: ; COALESCE L/R STATE FLAGS + LD A,(MKY_STATE) ; GET EXISTING STATE BITS + AND $F0 ; GET RID OF OLD MODIFIER BITS + LD DE,(MKY_LSTATE) ; LOAD BOTH L/R STATE BYTES IN D/E + OR E ; MERGE IN LEFT STATE BITS + OR D ; MERGE IN RIGHT STATE BITS + LD (MKY_STATE),A ; SAVE IT + JP MKY_DECNEW ; DONE WITH CURRENT KEYSTROKE + +MKY_DEC7: ; COMPLETE PROCESSING OF EXTENDED AND KEY BREAK EVENTS + LD A,(MKY_STATUS) ; GET CURRENT STATUS FLAGS + AND MKY_BREAK ; IS THIS A KEY BREAK EVENT? + JP NZ,MKY_DECNEW ; PROCESS NEXT KEY + +MKY_DEC8: ; HANDLE TOGGLE KEYS + LD A,(MKY_KEYCODE) ; GET THE CURRENT KEYCODE INTO A + LD E,MKY_CAPSLCK ; SETUP E WITH CAPS LOCK STATE BIT + CP $BC ; IS THIS THE CAPS LOCK KEY? + JR Z,MKY_DEC8A ; YES, GO TO BIT SET ROUTINE + LD E,MKY_NUMLCK ; SETUP E WITH NUM LOCK STATE BIT + CP $BD ; IS THIS THE NUM LOCK KEY? + JR Z,MKY_DEC8A ; YES, GO TO BIT SET ROUTINE + LD E,MKY_SCRLCK ; SETUP E WITH SCROLL LOCK STATE BIT + CP $BE ; IS THIS THE SCROLL LOCK KEY? + JR Z,MKY_DEC8A ; YES, GO TO BIT SET ROUTINE + JR MKY_DEC9 ; NOT A TOGGLE KEY, CONTINUE + +MKY_DEC8A: ; RECORD THE TOGGLE + LD A,(MKY_STATE) ; GET THE CURRENT STATE FLAGS + XOR E ; SET THE TOGGLE KEY BIT FROM ABOVE + LD (MKY_STATE),A ; SAVE IT + CALL MKY_SETLEDS ; UPDATE LED LIGHTS ON KBD + JP MKY_DECNEW ; RESTART DECODER FOR A NEW KEY + +MKY_DEC9: ; ADJUST KEYCODE FOR CONTROL MODIFIER + LD A,(MKY_STATE) ; GET THE CURRENT STATE BITS + AND MKY_CTRL ; CHECK THE CONTROL BIT + JR Z,MKY_DEC10 ; CONTROL KEY NOT PRESSED, MOVE ON + LD A,(MKY_KEYCODE) ; GET CURRENT KEYCODE IN A + CP 'a' ; COMPARE TO LOWERCASE A + JR C,MKY_DEC9A ; BELOW IT, BYPASS + CP 'z' + 1 ; COMPARE TO LOWERCASE Z + JR NC,MKY_DEC9A ; ABOVE IT, BYPASS + RES 5,A ; KEYCODE IN LOWERCASE A-Z RANGE CLEAR BIT 5 TO MAKE IT UPPERCASE +MKY_DEC9A: + CP '@' ; COMPARE TO @ + JR C,MKY_DEC10 ; BELOW IT, BYPASS + CP '_' + 1 ; COMPARE TO _ + JR NC,MKY_DEC10 ; ABOVE IT, BYPASS + RES 6,A ; CONVERT TO CONTROL VALUE BY CLEARING BIT 6 + LD (MKY_KEYCODE),A ; UPDATE KEYCODE TO CONTROL VALUE + +MKY_DEC10: ; ADJUST KEYCODE FOR CAPS LOCK + LD A,(MKY_STATE) ; LOAD THE STATE FLAGS + AND MKY_CAPSLCK ; CHECK CAPS LOCK + JR Z,MKY_DEC11 ; CAPS LOCK NOT ACTIVE, MOVE ON + LD A,(MKY_KEYCODE) ; GET THE CURRENT KEYCODE VALUE + CP 'a' ; COMPARE TO LOWERCASE A + JR C,MKY_DEC10A ; BELOW IT, BYPASS + CP 'z' + 1 ; COMPARE TO LOWERCASE Z + JR NC,MKY_DEC10A ; ABOVE IT, BYPASS + JR MKY_DEC10B ; IN RANGE LOWERCASE A-Z, GO TO CASE SWAPPING LOGIC +MKY_DEC10A: + CP 'A' ; COMPARE TO UPPERCASE A + JR C,MKY_DEC11 ; BELOW IT, BYPASS + CP 'Z' + 1 ; COMPARE TO UPPERCASE Z + JR NC,MKY_DEC11 ; ABOVE IT, BYPASS + JR MKY_DEC10B ; IN RANGE UPPERCASE A-Z, GO TO CASE SWAPPING LOGIC +MKY_DEC10B: + LD A,(MKY_KEYCODE) ; GET THE CURRENT KEYCODE + XOR $20 ; FLIP BIT 5 TO SWAP UPPER/LOWER CASE + LD (MKY_KEYCODE),A ; SAVE IT + +MKY_DEC11: ; HANDLE NUM PAD KEYS + LD A,(MKY_STATE) ; GET THE CURRENT STATE FLAGS + AND $7F;~MKY_NUMPAD ; ASSUME NOT A NUMPAD KEY, CLEAR THE NUMPAD BIT + LD (MKY_STATE),A ; SAVE IT + + LD A,(MKY_KEYCODE) ; GET THE CURRENT KEYCODE + AND 11100000B ; ISOLATE TOP 3 BITS + CP 11000000B ; IS IN NUMPAD RANGE? + JR NZ,MKY_DEC12 ; NOPE, GET OUT + + LD A,(MKY_STATE) ; LOAD THE CURRENT STATE FLAGS + OR MKY_NUMPAD ; TURN ON THE NUMPAD BIT + LD (MKY_STATE),A ; SAVE IT + + AND MKY_NUMLCK ; IS NUM LOCK BIT SET? + JR Z,MKY_DEC11A ; NO, SKIP NUMLOCK PROCESSING + LD A,(MKY_KEYCODE) ; GET THE KEYCODE + XOR $10 ; FLIP VALUES FOR NUMLOCK + LD (MKY_KEYCODE),A ; SAVE IT + +MKY_DEC11A: ; APPLY NUMPAD MAPPING + LD A,(MKY_KEYCODE) ; GET THE CURRENT KEYCODE + LD HL,MKY_MAPNUMPAD ; LOAD THE START OF THE MAPPING TABLE + SUB $C0 ; KEYCODES START AT $C0 + LD E,A ; INDEX TO E + LD D,0 ; D IS ZERO + ADD HL,DE ; POINT TO RESULT OF MAPPING + LD A,(HL) ; GET IT IN A + LD (MKY_KEYCODE),A ; SAVE IT + +MKY_DEC12: ; DETECT UNKNOWN/INVALID KEYCODES + LD A,(MKY_KEYCODE) ; GET THE FINAL KEYCODE + CP $FF ; IS IT $FF (UNKNOWN/INVALID) + JP Z,MKY_DECNEW ; IF SO, JUST RESTART THE ENGINE + +MKY_DEC13: ; DONE - RECORD RESULTS + LD A,(MKY_STATUS) ; GET CURRENT STATUS + OR MKY_KEYRDY ; SET KEY READY BIT + LD (MKY_STATUS),A ; SAVE IT + XOR A ; A=0 + INC A ; SIGNAL SUCCESS WITH A=1 + RET + +MKY_DECNEW: ; START NEW KEYPRESS (CLEAR ALL STATUS BITS) + XOR A ; A = 0 + LD (MKY_STATUS),A ; CLEAR STATUS + JP MKY_DEC1 ; RESTART THE ENGINE + +; +;__________________________________________________________________________________________________ +; INTERRUPT HANDLER +; +; IF MKY_SCANBUFFF HAS CONTENT, DO NOTHING +; OTHERWISE, SCAN KEYBOARD AND IF A KEY EVENT IS DETECTED +; WRITE SCANCODES TO MKY_SCANBUFFF +; +; ALSO GENERATE KEY REPEAT EVENTS, IF KEY HELD DOWN +;__________________________________________________________________________________________________ +; +MKY_INT: + PUSH BC + PUSH DE + PUSH IX + + LD A, (SCNCNT) ; SCAN THE KEYBOARD EVERY 'SCAN_INT_PERIOD' INTERRUPTS. + DEC A + LD (SCNCNT), A + JR NZ, MKY_INT_END + + LD A, SCAN_INT_PERIOD + LD (SCNCNT), A + + LD A, (MKY_SCANBUFFLEN) ; SKIP SCANNING UNTIL CODE BUFFER IS EMPTY + OR A + JR NZ, MKY_INT_END + + CALL MKY_SCAN + CALL MKY_GENSCODE + +MKY_INT_END: + CALL MKY_RPTGEN + POP IX + POP DE + POP BC + RET +; +; SCAN KEYBOARD AND STORE ALL COLUMN RESULTS PER ROW AT NEWKEY +; +MKY_SCAN: + IN A, (MKY_REGC) ; READ AND MASK THE CURRENT STATE OF PPI PORT C + AND $F0 + LD C, A + LD B, MATRIX_ROW_COUNT ; PREPARE TO LOOP THRU THE SCAN ROWS + LD HL, NEWKEY + +MKY_SCAN_LP: + LD A, C + OUT (MKY_REGC), A ; SET ACTIVE ROW + IN A, (MKY_REGB) ; READ ACTIVE COLUMN DATA + LD (HL), A ; STORE COLUMN READ VALUE + INC HL + INC C + DJNZ MKY_SCAN_LP ; LOOP UNTIL ALL ROWS READ + RET +; +;__________________________________________________________________________________________________ +; COMPARE OLDKEY TO NEWKEY +; GENERATE SCAN CODES +; +; FOR EACH BIT IN OLDKEY AND NEWKEY +; IF BOTH = 1, THEN NO KEY PRESS - NOTHING CHANGED +; IF BOTH = 0, THEN KEY WAS AND IS STILL PRESSED - NOTHING CHANGED +; IF OLD = 1 AND NEW = 0, KEY WAS PRESSED +; IF OLD = 0 AND NEW = 1, KEY WAS RELEASED +; STOP OF FIRST CHANGE - STORE IN BUFFER - THEN NOTHING HAPPENS, +; UNTIL MKY_RDSCAN IS CALLED AND CLEARS THE SCAN BUFFER +; ALSO RESET MKY_RPTACTIVE IS A KEY IS HELD DOWN +MKY_GENSCODE: + XOR A + LD (MKY_RPTACTIVE), A ; CLEAR FLAG TO INDICATE A KEYHOLD STATE + + LD HL, OLDKEY + LD DE, NEWKEY + LD A, 0 + EX AF, AF' ; ROW COUNT IN A' + +MKY_GENSCODE_LPR: + LD B, 8 ; 8 COLUMN BITS + LD C, (HL) + LD A, (DE) + +MKY_GENSCODE_LPC: + RRCA ; ROTATE NEW COLUMN BIT INTO CARRY + JR NC, MKY_NEWDWN ; IS KEY DOWN? + + ; KEY IS UP + RRC C ; ROTATE OLD COLUMN BIT INTO CARRY + JR C, MKY_GENSCODENXT ; BOTH KEYS DOWN? + + ; NEW KEY IS UP, OLD KEY WAS DOWN + JP MKY_KEYUP ; STORE NEW KEY RELEASE IN BUFF (A' IF ROW, B IS COLUMN) + ; JR MKY_GENSCODENXT + +MKY_NEWDWN: + RRC C ; ROTATE OLD COLUMN BIT INTO CARRY + JR NC, MKY_KEYHOLD ; BOTH KEYS DOWN? + + ; NEW KEY IS DOWN, OLD KEY WAS UP + JP MKY_KEYDOWN ; STORE NEW KEY PRESS IN BUFF (A' IF ROW, B IS COLUMN) + +MKY_GENSCODENXT: + DJNZ MKY_GENSCODE_LPC + + EX AF, AF' + INC A + CP MATRIX_ROW_COUNT + RET Z + EX AF, AF' + + INC HL + INC DE + JR MKY_GENSCODE_LPR + + RET + + ; KEY IS PRESSED - TEST FOR REPEAT +MKY_KEYHOLD: + PUSH AF + + EX AF, AF' ; GET ROW COUNT + CP 6 + JR NC, MKY_NORPT ; IF >=6 THEN WE DONT REPEAT + + LD (MKY_NRPTROW), A + EX AF, AF' + + LD A, B + LD (MKY_NRPTCOL), A + + LD A, $FF + LD (MKY_RPTACTIVE), A + + POP AF + JR MKY_GENSCODENXT + +MKY_NORPT: + EX AF, AF' + POP AF + JR MKY_GENSCODENXT + +MKY_KEYDOWN: + CALL MKY_RESOLDBIT + CALL MKY_SCANADDR + LD A, (HL) + OR A ; IF NO SCANCODE - IGNORE IT + RET Z + LD (MKY_SCANBUFF), A + LD A, 1 + LD (MKY_SCANBUFFLEN), A + RET + +MKY_KEYUP: + CALL MKY_SETOLDBIT + CALL MKY_SCANADDR + + LD A, (HL) + OR A ; IF NO SCANCODE - IGNORE IT + RET Z + LD (MKY_SCANBUFF+1), A + LD A, $F0 + LD (MKY_SCANBUFF), A + LD A, 2 + LD (MKY_SCANBUFFLEN), A + RET + +MKY_RPTGEN: + LD A, (MKY_SCANBUFFLEN) ; IF ALREADY A CODE IN BUFFER + OR A ; THEN WE CANT GENERATE A REPEAT + JR NZ, MKY_RPTCLR + + LD A, (MKY_RPTACTIVE) ; NO KEY IS HELD + OR A + JR Z, MKY_RPTCLR + + LD A, (MKY_RPTCNT) + DEC A + JR Z, MKY_RPTADD + LD (MKY_RPTCNT), A + RET + +MKY_RPTADD: + LD A, KEY_REPEAT_PERIOD + LD (MKY_RPTCNT), A + LD A, (MKY_NRPTCOL) + LD B, A + LD A, (MKY_NRPTROW) + EX AF, AF' + JR MKY_KEYDOWN + +MKY_RPTCLR: + LD A, KEY_REPEAT_INIT + LD (MKY_RPTCNT), A + XOR A + LD (MKY_NRPTCOL), A + LD (MKY_NRPTROW), A + RET +; +;__________________________________________________________________________________________________ +; +; RETRIEVE ADDRESS AND BIT MASK WITHIN OLDKEY ARRAY +; +; INPUT: +; B = 1 TO 8 - COLUMN COUNT +; A' IS ROW COUNT - 0 TO MATRIX_ROW_COUNT +; OUTPUT: +; HL = BYTE WITHIN OLDKEY ARRAY +; A = BIT MASK FOR COLUMN COUNT (EG: B = 3, A = 8) +; PROTECTS: +; A' IS UNCHANGED +; B IS UNCHANGED +MKY_GETKEYIDX: + LD A, $80 + LD D, B ; SAVE B (COLUMN COUNT - 1 TO 8) +MKY_SETOLDBIT_LP: + DEC B + JR Z, SKIP + RRCA + JR MKY_SETOLDBIT_LP + +SKIP: + LD HL, OLDKEY + + EX AF, AF' ; RETRIEVE ROW COUNT + LD C, A + EX AF, AF' + LD B, 0 + ADD HL, BC + LD B, D ; RETORE B (COLUMN COUNT) + RET +; +;__________________________________________________________________________________________________ +; +; SET BIT WITHIN THE KEY MATRIX ARRAY +; HL -> ADDRESS WITHIN OLDKEY OR NEWKEY ARRAY +; C BIT MASK TO BE OR'ED +; +MKY_SETOLDBIT: + CALL MKY_GETKEYIDX + LD C, (HL) + OR C + LD (HL), A + RET +; +;__________________________________________________________________________________________________ +; +; RESET BIT WITHIN THE KEY MATRIX ARRAY +; HL -> ADDRESS WITHIN OLDKEY OR NEWKEY ARRAY +; C CPL BIT MASK TO BE AND'ED +; +MKY_RESOLDBIT: + CALL MKY_GETKEYIDX + LD C, (HL) + CPL + AND C + LD (HL), A + RET +; +;__________________________________________________________________________________________________ +; +; CALCULATE THE ADDRESS WITHIN THE SCANCODE_TABLE FOR A SPECIFIC KEY +; +MKY_SCANADDR: + ; ASSUMING SINGLE BYTE CODE CODE + EX AF, AF' ; RETRIVE ROW COUNT + + ; CODE ADDR = SCANCODE_TBL + (A * 8) + B - 1 + LD L, A + LD H, 0 + ADD HL, HL + ADD HL, HL + ADD HL, HL + DEC B + LD C, B + LD B, 0 + ADD HL, BC + LD DE, SCANCODE_TBL + ADD HL, DE + RET +; +;__________________________________________________________________________________________________ +; READ A SINGLE BYTE FROM THE SCANCODE BUFFER +; RETURNED IN A +; +MKY_READBYT: + ld a, (MKY_SCANBUFFLEN) + or a + ret z + + LD A, (MKY_SCANBUFF) + LD DE, MKY_SCANBUFF + LD HL, MKY_SCANBUFF + 1 + LD BC, 4 + LDIR + LD C, A + LD A, (MKY_SCANBUFFLEN) + DEC A + LD (MKY_SCANBUFFLEN), A + LD A, C + RET +; +;__________________________________________________________________________________________________ +; +; TURN THE CAPS LED LIGHT ON +; +MKY_LEDCAPSON: + IN A, (MKY_REGC) + RES 6, A + OUT (MKY_REGC), A + RET +; +;__________________________________________________________________________________________________ +; +; TURN THE CAPS LED LIGHT OFF +; +MKY_LEDCAPSOFF: + IN A, (MKY_REGC) + SET 6, A + OUT (MKY_REGC), A + RET + +; DYNAMIC DATA STORAGE: +; +; STORAGE OF KEYBOARD MATRIX, USED FOR DETECTING KEY REPETITION +OLDKEY: .FILL MATRIX_ROW_COUNT, $FF +; +; CURRENT STATE OF THE KEYBOARD MATRIX +NEWKEY: .FILL MATRIX_ROW_COUNT, $FF +; +; F3F6: VDP-INTERUPT COUNTER THAT COUNTS FROM SCAN_INT_PERIOD TO 0, WHEN IT REACHES ZERO, THE +; KEYBOARD MATRIX IS SCANNED, AND THE COUNTERS IS RESET AT SCAN_INT_PERIOD +SCNCNT: .DB SCAN_INT_PERIOD +; +MKY_NRPTCOL: .DB 0 +MKY_NRPTROW: .DB 0 +MKY_RPTCOL: .DB 0 +MKY_RPTROW: .DB 0 +MKY_RPTACTIVE: .DB 0 +MKY_RPTCNT: .DB KEY_REPEAT_INIT + +MKY_SCANBUFF: .FILL 5, 0 +MKY_SCANBUFFLEN: .DB 0 + +MKY_SCANCODE: .DB 0 ; RAW SCANCODE +MKY_KEYCODE: .DB 0 ; RESULTANT KEYCODE AFTER DECODING +MKY_STATE: .DB 0 ; STATE BITS (SEE ABOVE) +MKY_LSTATE: .DB 0 ; STATE BITS FOR "LEFT" KEYS +MKY_RSTATE: .DB 0 ; STATE BITS FOR "RIGHT" KEYS +MKY_STATUS: .DB 0 ; CURRENT STATUS BITS (SEE ABOVE) +MKY_REPEAT: .DB 0 ; CURRENT REPEAT RATE +MKY_IDLE: .DB 0 ; IDLE COUNT + +#IF (MKYKBLOUT == KBD_US) +;__________________________________________________________________________________________________ +; +; MAPPING TABLES US/ENGLISH +;__________________________________________________________________________________________________ +MKY_MAPSTD: ; SCANCODE IS INDEX INTO TABLE TO RESULTANT LOOKUP KEYCODE + .DB $FF,$E8,$FF,$E4,$E2,$E0,$E1,$EB,$FF,$E9,$E7,$E5,$E3,$09,'`',$FF + .DB $FF,$B4,$B0,$FF,$B2,'q','1',$FF,$FF,$FF,'z','s','a','w','2',$FF + .DB $FF,'c','x','d','e','4','3',$FF,$FF,' ','v','f','t','r','5',$FF + .DB $FF,'n','b','h','g','y','6',$FF,$FF,$FF,'m','j','u','7','8',$FF + .DB $FF,',','k','i','o','0','9',$FF,$FF,'.','/','l',';','p','-',$FF + .DB $FF,$FF,$27,$FF,'[','=',$FF,$FF,$BC,$B1,$0D,']',$FF,'\',$FF,$FF + .DB $FF,$FF,$FF,$FF,$FF,$FF,$08,$FF,$FF,$C0,$FF,$C3,$C6,$FF,$FF,$FF + .DB $C9,$CA,$C1,$C4,$C5,$C7,$1B,$BD,$FA,$CE,$C2,$CD,$CC,$C8,$BE,$FF + .DB $FF,$FF,$FF,$E6,$EC +; +MKY_MAPSIZ .EQU ($ - MKY_MAPSTD) +; +MKY_MAPSHIFT: ; SCANCODE IS INDEX INTO TABLE TO RESULTANT LOOKUP KEYCODE WHEN SHIFT ACTIVE + .DB $FF,$E8,$FF,$E4,$E2,$E0,$E1,$EB,$FF,$E9,$E7,$E5,$E3,$09,'~',$FF + .DB $FF,$B4,$B0,$FF,$B2,'Q','!',$FF,$FF,$FF,'Z','S','A','W','@',$FF + .DB $FF,'C','X','D','E','$','#',$FF,$FF,' ','V','F','T','R','%',$FF + .DB $FF,'N','B','H','G','Y','^',$FF,$FF,$FF,'M','J','U','&','*',$FF + .DB $FF,'<','K','I','O',')','(',$FF,$FF,'>','?','L',':','P','_',$FF + .DB $FF,$FF,$22,$FF,'{','+',$FF,$FF,$BC,$B1,$0D,'}',$FF,'|',$FF,$FF + .DB $FF,$FF,$FF,$FF,$FF,$FF,$08,$FF,$FF,$D0,$FF,$D3,$D6,$FF,$FF,$FF + .DB $D9,$DA,$D1,$D4,$D5,$D7,$1B,$BD,$FA,$DE,$D2,$DD,$DC,$D8,$BE,$FF + .DB $FF,$FF,$FF,$E6,$EC +; +MKY_MAPEXT: ; PAIRS ARE [SCANCODE,KEYCODE] FOR EXTENDED SCANCODES + .DB $11,$B5, $14,$B3, $1F,$B6, $27,$B7 + .DB $2F,$EF, $37,$FA, $3F,$FB, $4A,$CB + .DB $5A,$CF, $5E,$FC, $69,$F3, $6B,$F8 + .DB $6C,$F2, $70,$F0, $71,$F1, $72,$F7 + .DB $74,$F9, $75,$F6, $7A,$F5, $7C,$ED + .DB $7D,$F4, $7E,$FD, $00,$00 +; +MKY_MAPNUMPAD: ; KEYCODE TRANSLATION FROM NUMPAD RANGE TO STD ASCII/KEYCODES + .DB $F3,$F7,$F5,$F8,$FF,$F9,$F2,$F6,$F4,$F0,$F1,$2F,$2A,$2D,$2B,$0D + .DB $31,$32,$33,$34,$35,$36,$37,$38,$39,$30,$2E,$2F,$2A,$2D,$2B,$0D +#ENDIF +#IF (MKYKBLOUT == KBD_DE) +;__________________________________________________________________________________________________ +; +; MAPPING TABLES GERMAN +;__________________________________________________________________________________________________ +; +MKY_MAPSTD: ; SCANCODE IS INDEX INTO TABLE TO RESULTANT LOOKUP KEYCODE ROW + +; Column 0 1 2 3 4 5 6 7 8 9 A B C D E F ; Special adjustments listed below + .DB $FF,$E8,$FF,$E4,$E2,$E0,$E1,$EB,$FF,$E9,$E7,$E5,$E3,$09,'^',$FF ;0 for German keyboard keys that give + .DB $FF,$B4,$B0,$FF,$B2,'q','1',$FF,$FF,$FF,'y','s','a','w','2',$FF ;1 different characters than are printed + .DB $FF,'c','x','d','e','4','3',$FF,$FF,' ','v','f','t','r','5',$FF ;2 on the keys. + .DB $FF,'n','b','h','g','z','6',$FF,$FF,$FF,'m','j','u','7','8',$FF ;3 'german key' --> 'new occupied with' + .DB $FF,',','k','i','o','0','9',$FF,$FF,'.','-','l','[','p',$5C,$FF ;4 Assembler ERROR: '\'-->$5C ; 'ö'-->'[' + .DB $FF,$FF,'@',$FF,']','|',$FF,$FF,$BC,$B1,$0D,'+',$FF,'#',$FF,$FF ;5 'ä'-->'@' ; 'ü'-->']' + .DB $FF,'<',$FF,$FF,$FF,$FF,$08,$FF,$FF,$C0,$FF,$C3,$C6,'<',$FF,$FF ;6 + .DB $C9,$CA,$C1,$C4,$C5,$C7,$1B,$BD,$FA,$CE,$C2,$CD,$CC,$C8,$BE,$FF ;7 + .DB $FF,$FF,$FF,$E6,$EC ;8 + +MKY_MAPSIZ .EQU ($ - MKY_MAPSTD) +; +MKY_MAPSHIFT: ; SCANCODE IS INDEX INTO TABLE TO RESULTANT LOOKUP KEYCODE WHEN SHIFT ACTIVE + + .DB $FF,$E8,$FF,$E4,$E2,$E0,$E1,$EB,$FF,$E9,$E7,$E5,$E3,$09,'~',$FF ; '°' --> '~' + .DB $FF,$B4,$B0,$FF,$B2,'Q','!',$FF,$FF,$FF,'Y','S','A','W',$22,$FF + .DB $FF,'C','X','D','E','$',$20,$FF,$FF,' ','V','F','T','R','%',$FF ; '§'-->$20; '§'=Paragraph not used in CP/M + .DB $FF,'N','B','H','G','Z','&',$FF,$FF,$FF,'M','J','U','/','(',$FF + .DB $FF,';','K','I','O','=',')',$FF,$FF,':','_','L','{','P','?',$FF ; 'Ö'-->'{' + .DB $FF,$FF,'@',$FF,'}','`',$FF,$FF,$BC,$B1,$0D,'*',$FF,$27,$FF,$FF ; 'Ä'-->'@' ; 'Ü'-->'}' + .DB $FF,'>',$FF,$FF,$FF,$FF,$08,$FF,$FF,$D0,$FF,$D3,$D6,'>',$FF,$FF + .DB $D9,$DA,$D1,$D4,$D5,$D7,$1B,$BD,$FA,$DE,$D2,$DD,$DC,$D8,$BE,$FF + .DB $FF,$FF,$FF,$E6,$EC + +MKY_MAPEXT: ; PAIRS ARE [SCANCODE,KEYCODE] FOR EXTENDED SCANCODES + .DB $11,$B5, $14,$B3, $1F,$B6, $27,$B7 + .DB $2F,$EF, $37,$FA, $3F,$FB, $4A,$CB ; All keys listed below are customized for Wordstar. + .DB $5A,$CF, $5E,$FC, $69,$06, $6B,$13 ; n.a , n.a , word right , n.a. + .DB $6C,$01, $70,$16, $71,$07, $72,$18 ; Word left , Toggle Insert/Overwrite , Del Char , Cursor down + .DB $74,$04, $75,$05, $7A,$1A, $7C,$ED ; Cursor right , Cursor up , Page down + .DB $7D,$17, $7E,$FD, $00,$00 ; Page up , n.a. , END MKY_MAPEXT (Pairs end) +; +MKY_MAPNUMPAD: ; KEYCODE TRANSLATION FROM NUMPAD RANGE TO STD ASCII/KEYCODES + + .DB $F3,$F7,$F5,$F8,$FF,$F9,$F2,$F6,$F4,$F0,$F1,$2F,$2A,$2D,$2B,$0D + .DB $31,$32,$33,$34,$35,$36,$37,$38,$39,$30,$2E,$2F,$2A,$2D,$2B,$0D +; +#ENDIF +; +;__________________________________________________________________________________________________ +; KEYCODE VALUES RETURNED BY THE DECODER +;__________________________________________________________________________________________________ +; +; VALUES 0-127 ARE STANDARD ASCII, SPECIAL KEYS WILL HAVE THE FOLLOWING VALUES: +; +; F1 $E0 +; F2 $E1 +; F3 $E2 +; F4 $E3 +; F5 $E4 +; F6 $E5 +; F7 $E6 +; F8 $E7 +; F9 $E8 +; F10 $E9 +; F11 $EA +; F12 $EB +; SYSRQ $EC +; PRTSC $ED +; PAUSE $EE +; APP $EF +; INS $F0 +; DEL $F1 +; HOME $F2 +; END $F3 +; PGUP $F4 +; PGDN $F5 +; UP $F6 +; DOWN $F7 +; LEFT $F8 +; RIGHT $F9 +; POWER $FA +; SLEEP $FB +; WAKE $FC +; BREAK $FD diff --git a/Source/HBIOS/tms.asm b/Source/HBIOS/tms.asm index 9a97ec8c..62aab029 100644 --- a/Source/HBIOS/tms.asm +++ b/Source/HBIOS/tms.asm @@ -118,7 +118,12 @@ TMS_INIT1: CALL TMS_VDARES1 #IF (TMSMODE == TMSMODE_N8) CALL PPK_INIT ; INITIALIZE KEYBOARD DRIVER +#ELSE +#IF MSKENABLE + CALL MKY_INIT +#ENDIF #ENDIF + #IF (INTMODE == 1 & TMSTIMENABLE) ; ADD IM1 INT CALL LIST ENTRY LD HL, TMS_TSTINT ; GET INT VECTOR @@ -172,11 +177,18 @@ TMS_FNTBL: .DW PPK_STAT .DW PPK_FLUSH .DW PPK_READ +#ELSE +#IF MSKENABLE + .DW MKY_STAT + .DW MKY_FLUSH + .DW MKY_READ + #ELSE .DW TMS_STAT .DW TMS_FLUSH .DW TMS_READ #ENDIF +#ENDIF #IF (($ - TMS_FNTBL) != (VDA_FNCNT * 2)) .ECHO "*** INVALID TMS FUNCTION TABLE ***\n" !!!!! @@ -803,6 +815,11 @@ TMS_TSTINT: RET TMS_INTHNDL: + +#IF MSKENABLE + CALL MKY_INT +#ENDIF + CALL HB_TIMINT ; RETURN NZ - HANDLED OR $FF RET From 8173414bf53b013f10052fe242735e1e20e15ef9 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Wed, 11 Nov 2020 19:36:59 +1100 Subject: [PATCH 07/18] MSX-KEYBOARD: some optimisation of interrupt handler --- Source/HBIOS/msxkeyb.asm | 267 ++++++++++++++++++++------------------- 1 file changed, 135 insertions(+), 132 deletions(-) diff --git a/Source/HBIOS/msxkeyb.asm b/Source/HBIOS/msxkeyb.asm index 8bf0f892..fc1ec30d 100644 --- a/Source/HBIOS/msxkeyb.asm +++ b/Source/HBIOS/msxkeyb.asm @@ -16,6 +16,10 @@ ; ; TODO: ; IMPLEMENT MULTIBYTE SCAN CODES (ARROW KEYS, ETC) +; OPTIMISE INTERRUPT HANDLER - HAS NEGATIVE IMPACT ON SERIAL IO AT 115200 FOR CPU @ 8MHZ +; BACKSPACE DOES NOT AUTO-REPEAT +; AUTO DETECT PPI +; ; ;====================================================================== ; DRIVER - CONSTANTS @@ -42,10 +46,10 @@ PPICMD_GA_MODE_2 .EQU 64 PPICMD_COMMAND .EQU 128 ; COUNT FOR PERIOD TO START REPEATING CHARACTERS -KEY_REPEAT_INIT: .EQU 20 +KEY_REPEAT_INIT: .EQU 10 ; COUNT FOR PERIOD BETWEEN AUTO REPEATING CHARACTERS -KEY_REPEAT_PERIOD: .EQU 5 +KEY_REPEAT_PERIOD: .EQU 2 ; COUNT FOR INTERRUPT HANDLER TO TRIGGER KEYBOARD SCANNER (EG: SCAN KEYBOARD ONLY EVERY 3RD INTERRUPT (3/60)) SCAN_INT_PERIOD: .EQU 3 @@ -221,6 +225,8 @@ MKY_FLUSH: ;__________________________________________________________________________________________________ ; MKY_STAT: + LD A, $FF + LD (MKY_SCANON), A CALL MKY_DECODE ; CHECK THE KEYBOARD JP Z,CIO_IDLE ; RET VIA IDLE PROCESSING IF NO KEY RET @@ -322,8 +328,27 @@ MKY_GETDATAX: MKY_SETLEDS: LD A,(MKY_STATE) ; LOAD THE STATE FLAGS AND MKY_CAPSLCK ; CHECK CAPS LOCK - JP Z, MKY_LEDCAPSOFF - JP MKY_LEDCAPSON + JR Z, MKY_LEDCAPSOFF +; +;__________________________________________________________________________________________________ +; +; TURN THE CAPS LED LIGHT ON +; +MKY_LEDCAPSON: + IN A, (MKY_REGC) + RES 6, A + OUT (MKY_REGC), A + RET +; +;__________________________________________________________________________________________________ +; +; TURN THE CAPS LED LIGHT OFF +; +MKY_LEDCAPSOFF: + IN A, (MKY_REGC) + SET 6, A + OUT (MKY_REGC), A + RET ;__________________________________________________________________________________________________ ; DECODING ENGINE @@ -409,12 +434,7 @@ MKY_DECODE: ; toggle (XOR) bit 5 of keycode ; ; Step 11: Handle num pad keys -; clear state[numpad] -; if keycode is numpad -; set state[numpad] -; if state[numlock] -; toggle (XOR) bit 4 of keycode -; apply numpad-map[keycode] -> keycode +; REMOVED ; ; Step 12: Detect unknown/invalid keycodes ; if keycode == $FF @@ -622,7 +642,7 @@ MKY_DEC9A: MKY_DEC10: ; ADJUST KEYCODE FOR CAPS LOCK LD A,(MKY_STATE) ; LOAD THE STATE FLAGS AND MKY_CAPSLCK ; CHECK CAPS LOCK - JR Z,MKY_DEC11 ; CAPS LOCK NOT ACTIVE, MOVE ON + JR Z,MKY_DEC12 ; CAPS LOCK NOT ACTIVE, MOVE ON LD A,(MKY_KEYCODE) ; GET THE CURRENT KEYCODE VALUE CP 'a' ; COMPARE TO LOWERCASE A JR C,MKY_DEC10A ; BELOW IT, BYPASS @@ -631,44 +651,44 @@ MKY_DEC10: ; ADJUST KEYCODE FOR CAPS LOCK JR MKY_DEC10B ; IN RANGE LOWERCASE A-Z, GO TO CASE SWAPPING LOGIC MKY_DEC10A: CP 'A' ; COMPARE TO UPPERCASE A - JR C,MKY_DEC11 ; BELOW IT, BYPASS + JR C,MKY_DEC12 ; BELOW IT, BYPASS CP 'Z' + 1 ; COMPARE TO UPPERCASE Z - JR NC,MKY_DEC11 ; ABOVE IT, BYPASS + JR NC,MKY_DEC12 ; ABOVE IT, BYPASS JR MKY_DEC10B ; IN RANGE UPPERCASE A-Z, GO TO CASE SWAPPING LOGIC MKY_DEC10B: LD A,(MKY_KEYCODE) ; GET THE CURRENT KEYCODE XOR $20 ; FLIP BIT 5 TO SWAP UPPER/LOWER CASE LD (MKY_KEYCODE),A ; SAVE IT -MKY_DEC11: ; HANDLE NUM PAD KEYS - LD A,(MKY_STATE) ; GET THE CURRENT STATE FLAGS - AND $7F;~MKY_NUMPAD ; ASSUME NOT A NUMPAD KEY, CLEAR THE NUMPAD BIT - LD (MKY_STATE),A ; SAVE IT - - LD A,(MKY_KEYCODE) ; GET THE CURRENT KEYCODE - AND 11100000B ; ISOLATE TOP 3 BITS - CP 11000000B ; IS IN NUMPAD RANGE? - JR NZ,MKY_DEC12 ; NOPE, GET OUT - - LD A,(MKY_STATE) ; LOAD THE CURRENT STATE FLAGS - OR MKY_NUMPAD ; TURN ON THE NUMPAD BIT - LD (MKY_STATE),A ; SAVE IT - - AND MKY_NUMLCK ; IS NUM LOCK BIT SET? - JR Z,MKY_DEC11A ; NO, SKIP NUMLOCK PROCESSING - LD A,(MKY_KEYCODE) ; GET THE KEYCODE - XOR $10 ; FLIP VALUES FOR NUMLOCK - LD (MKY_KEYCODE),A ; SAVE IT - -MKY_DEC11A: ; APPLY NUMPAD MAPPING - LD A,(MKY_KEYCODE) ; GET THE CURRENT KEYCODE - LD HL,MKY_MAPNUMPAD ; LOAD THE START OF THE MAPPING TABLE - SUB $C0 ; KEYCODES START AT $C0 - LD E,A ; INDEX TO E - LD D,0 ; D IS ZERO - ADD HL,DE ; POINT TO RESULT OF MAPPING - LD A,(HL) ; GET IT IN A - LD (MKY_KEYCODE),A ; SAVE IT +; MKY_DEC11: ; HANDLE NUM PAD KEYS +; LD A,(MKY_STATE) ; GET THE CURRENT STATE FLAGS +; AND $7F;~MKY_NUMPAD ; ASSUME NOT A NUMPAD KEY, CLEAR THE NUMPAD BIT +; LD (MKY_STATE),A ; SAVE IT + +; LD A,(MKY_KEYCODE) ; GET THE CURRENT KEYCODE +; AND 11100000B ; ISOLATE TOP 3 BITS +; CP 11000000B ; IS IN NUMPAD RANGE? +; JR NZ,MKY_DEC12 ; NOPE, GET OUT + +; LD A,(MKY_STATE) ; LOAD THE CURRENT STATE FLAGS +; OR MKY_NUMPAD ; TURN ON THE NUMPAD BIT +; LD (MKY_STATE),A ; SAVE IT + +; AND MKY_NUMLCK ; IS NUM LOCK BIT SET? +; JR Z,MKY_DEC11A ; NO, SKIP NUMLOCK PROCESSING +; LD A,(MKY_KEYCODE) ; GET THE KEYCODE +; XOR $10 ; FLIP VALUES FOR NUMLOCK +; LD (MKY_KEYCODE),A ; SAVE IT + +; MKY_DEC11A: ; APPLY NUMPAD MAPPING +; LD A,(MKY_KEYCODE) ; GET THE CURRENT KEYCODE +; LD HL,MKY_MAPNUMPAD ; LOAD THE START OF THE MAPPING TABLE +; SUB $C0 ; KEYCODES START AT $C0 +; LD E,A ; INDEX TO E +; LD D,0 ; D IS ZERO +; ADD HL,DE ; POINT TO RESULT OF MAPPING +; LD A,(HL) ; GET IT IN A +; LD (MKY_KEYCODE),A ; SAVE IT MKY_DEC12: ; DETECT UNKNOWN/INVALID KEYCODES LD A,(MKY_KEYCODE) ; GET THE FINAL KEYCODE @@ -697,59 +717,62 @@ MKY_DECNEW: ; START NEW KEYPRESS (CLEAR ALL STATUS BITS) ; WRITE SCANCODES TO MKY_SCANBUFFF ; ; ALSO GENERATE KEY REPEAT EVENTS, IF KEY HELD DOWN +; +; NB: THIS HANDLER IS QUITE EXPENSIVE IN TIME +; AND CAN IMPACT SERIAL OPERATION FOR 115200 BAUD RATE FOR CPU AT 8MHZ ;__________________________________________________________________________________________________ ; MKY_INT: - PUSH BC - PUSH DE - PUSH IX + LD A, (MKY_SCANON) ; OPTIMISATION - ONLY SCAN IF REQUIRED + OR A + RET Z - LD A, (SCNCNT) ; SCAN THE KEYBOARD EVERY 'SCAN_INT_PERIOD' INTERRUPTS. + LD A, (MKY_SCNCNT) ; SCAN THE KEYBOARD EVERY 'SCAN_INT_PERIOD' INTERRUPTS. DEC A - LD (SCNCNT), A - JR NZ, MKY_INT_END + LD (MKY_SCNCNT), A + RET NZ LD A, SCAN_INT_PERIOD - LD (SCNCNT), A + LD (MKY_SCNCNT), A LD A, (MKY_SCANBUFFLEN) ; SKIP SCANNING UNTIL CODE BUFFER IS EMPTY OR A - JR NZ, MKY_INT_END + RET NZ - CALL MKY_SCAN - CALL MKY_GENSCODE - -MKY_INT_END: - CALL MKY_RPTGEN - POP IX - POP DE - POP BC - RET + EX AF, AF' + PUSH AF ; -; SCAN KEYBOARD AND STORE ALL COLUMN RESULTS PER ROW AT NEWKEY +; SCAN KEYBOARD AND STORE ALL COLUMN RESULTS PER ROW AT MKY_NEWKEY ; -MKY_SCAN: +; MKY_SCAN: IN A, (MKY_REGC) ; READ AND MASK THE CURRENT STATE OF PPI PORT C AND $F0 - LD C, A + LD D, A LD B, MATRIX_ROW_COUNT ; PREPARE TO LOOP THRU THE SCAN ROWS - LD HL, NEWKEY - + LD HL, MKY_NEWKEY + LD C, MKY_REGC MKY_SCAN_LP: - LD A, C - OUT (MKY_REGC), A ; SET ACTIVE ROW + OUT (C), D ; SET ACTIVE ROW IN A, (MKY_REGB) ; READ ACTIVE COLUMN DATA LD (HL), A ; STORE COLUMN READ VALUE INC HL - INC C + INC D DJNZ MKY_SCAN_LP ; LOOP UNTIL ALL ROWS READ + + CALL MKY_GENSCODE + +MKY_INT_END: + CALL MKY_RPTGEN + POP AF + EX AF, AF' RET + ; ;__________________________________________________________________________________________________ -; COMPARE OLDKEY TO NEWKEY +; COMPARE MKY_OLDKEY O MKY_NEWKEY ; GENERATE SCAN CODES ; -; FOR EACH BIT IN OLDKEY AND NEWKEY +; FOR EACH BIT IN MKY_OLDKEY ND MKY_NEWKEY ; IF BOTH = 1, THEN NO KEY PRESS - NOTHING CHANGED ; IF BOTH = 0, THEN KEY WAS AND IS STILL PRESSED - NOTHING CHANGED ; IF OLD = 1 AND NEW = 0, KEY WAS PRESSED @@ -761,38 +784,44 @@ MKY_GENSCODE: XOR A LD (MKY_RPTACTIVE), A ; CLEAR FLAG TO INDICATE A KEYHOLD STATE - LD HL, OLDKEY - LD DE, NEWKEY - LD A, 0 + LD HL, MKY_OLDKEY + LD DE, MKY_NEWKEY + XOR A EX AF, AF' ; ROW COUNT IN A' MKY_GENSCODE_LPR: - LD B, 8 ; 8 COLUMN BITS LD C, (HL) LD A, (DE) + AND C + CP $FF + JR Z, MKY_GENSCODENXT1 ; ALL KEYS ARE UP AND WERE UP? + + LD B, 8 ; 8 COLUMN BITS + LD A, (DE) + MKY_GENSCODE_LPC: RRCA ; ROTATE NEW COLUMN BIT INTO CARRY JR NC, MKY_NEWDWN ; IS KEY DOWN? ; KEY IS UP RRC C ; ROTATE OLD COLUMN BIT INTO CARRY - JR C, MKY_GENSCODENXT ; BOTH KEYS DOWN? + JR C, MKY_GENSCODENXT ; BOTH KEYS UP? ; NEW KEY IS UP, OLD KEY WAS DOWN - JP MKY_KEYUP ; STORE NEW KEY RELEASE IN BUFF (A' IF ROW, B IS COLUMN) - ; JR MKY_GENSCODENXT + JR MKY_KEYUP ; STORE NEW KEY RELEASE IN BUFF (A' IF ROW, B IS COLUMN) MKY_NEWDWN: RRC C ; ROTATE OLD COLUMN BIT INTO CARRY JR NC, MKY_KEYHOLD ; BOTH KEYS DOWN? ; NEW KEY IS DOWN, OLD KEY WAS UP - JP MKY_KEYDOWN ; STORE NEW KEY PRESS IN BUFF (A' IF ROW, B IS COLUMN) + JR MKY_KEYDOWN ; STORE NEW KEY PRESS IN BUFF (A' IF ROW, B IS COLUMN) MKY_GENSCODENXT: DJNZ MKY_GENSCODE_LPC +MKY_GENSCODENXT1: EX AF, AF' INC A CP MATRIX_ROW_COUNT @@ -803,12 +832,8 @@ MKY_GENSCODENXT: INC DE JR MKY_GENSCODE_LPR - RET - - ; KEY IS PRESSED - TEST FOR REPEAT + ; KEY IS PRESSED MKY_KEYHOLD: - PUSH AF - EX AF, AF' ; GET ROW COUNT CP 6 JR NC, MKY_NORPT ; IF >=6 THEN WE DONT REPEAT @@ -816,18 +841,18 @@ MKY_KEYHOLD: LD (MKY_NRPTROW), A EX AF, AF' + PUSH AF LD A, B LD (MKY_NRPTCOL), A - LD A, $FF - LD (MKY_RPTACTIVE), A + LD A, $FF ; RECORD FACT THAT A KEY HAS BEEN HELD - FOR LATER TESTING + LD (MKY_RPTACTIVE), A ; OF REPEAT FUNCTION POP AF JR MKY_GENSCODENXT MKY_NORPT: EX AF, AF' - POP AF JR MKY_GENSCODENXT MKY_KEYDOWN: @@ -856,9 +881,9 @@ MKY_KEYUP: RET MKY_RPTGEN: - LD A, (MKY_SCANBUFFLEN) ; IF ALREADY A CODE IN BUFFER + LD A, (MKY_SCANBUFFLEN) ; IF ALREADY A CODE IN BUFFER OR A ; THEN WE CANT GENERATE A REPEAT - JR NZ, MKY_RPTCLR + RET NZ LD A, (MKY_RPTACTIVE) ; NO KEY IS HELD OR A @@ -882,20 +907,17 @@ MKY_RPTADD: MKY_RPTCLR: LD A, KEY_REPEAT_INIT LD (MKY_RPTCNT), A - XOR A - LD (MKY_NRPTCOL), A - LD (MKY_NRPTROW), A RET ; ;__________________________________________________________________________________________________ ; -; RETRIEVE ADDRESS AND BIT MASK WITHIN OLDKEY ARRAY +; RETRIEVE ADDRESS AND BIT MASK WITHIN MKY_OLDKEY RRAY ; ; INPUT: ; B = 1 TO 8 - COLUMN COUNT ; A' IS ROW COUNT - 0 TO MATRIX_ROW_COUNT ; OUTPUT: -; HL = BYTE WITHIN OLDKEY ARRAY +; HL = BYTE WITHIN MKY_OLDKEY RRAY ; A = BIT MASK FOR COLUMN COUNT (EG: B = 3, A = 8) ; PROTECTS: ; A' IS UNCHANGED @@ -910,8 +932,7 @@ MKY_SETOLDBIT_LP: JR MKY_SETOLDBIT_LP SKIP: - LD HL, OLDKEY - + LD HL, MKY_OLDKEY EX AF, AF' ; RETRIEVE ROW COUNT LD C, A EX AF, AF' @@ -923,7 +944,7 @@ SKIP: ;__________________________________________________________________________________________________ ; ; SET BIT WITHIN THE KEY MATRIX ARRAY -; HL -> ADDRESS WITHIN OLDKEY OR NEWKEY ARRAY +; HL -> ADDRESS WITHIN MKY_OLDKEY R MKY_NEWKEY ARRAY ; C BIT MASK TO BE OR'ED ; MKY_SETOLDBIT: @@ -936,7 +957,7 @@ MKY_SETOLDBIT: ;__________________________________________________________________________________________________ ; ; RESET BIT WITHIN THE KEY MATRIX ARRAY -; HL -> ADDRESS WITHIN OLDKEY OR NEWKEY ARRAY +; HL -> ADDRESS WITHIN MKY_OLDKEY R MKY_NEWKEY ARRAY ; C CPL BIT MASK TO BE AND'ED ; MKY_RESOLDBIT: @@ -974,9 +995,9 @@ MKY_SCANADDR: ; RETURNED IN A ; MKY_READBYT: - ld a, (MKY_SCANBUFFLEN) - or a - ret z + LD A, (MKY_SCANBUFFLEN) + OR A + RET Z LD A, (MKY_SCANBUFF) LD DE, MKY_SCANBUFF @@ -989,43 +1010,27 @@ MKY_READBYT: LD (MKY_SCANBUFFLEN), A LD A, C RET -; -;__________________________________________________________________________________________________ -; -; TURN THE CAPS LED LIGHT ON -; -MKY_LEDCAPSON: - IN A, (MKY_REGC) - RES 6, A - OUT (MKY_REGC), A - RET -; -;__________________________________________________________________________________________________ -; -; TURN THE CAPS LED LIGHT OFF -; -MKY_LEDCAPSOFF: - IN A, (MKY_REGC) - SET 6, A - OUT (MKY_REGC), A - RET ; DYNAMIC DATA STORAGE: ; ; STORAGE OF KEYBOARD MATRIX, USED FOR DETECTING KEY REPETITION -OLDKEY: .FILL MATRIX_ROW_COUNT, $FF +MKY_OLDKEY: .FILL MATRIX_ROW_COUNT, $FF ; ; CURRENT STATE OF THE KEYBOARD MATRIX -NEWKEY: .FILL MATRIX_ROW_COUNT, $FF +MKY_NEWKEY: .FILL MATRIX_ROW_COUNT, $FF ; ; F3F6: VDP-INTERUPT COUNTER THAT COUNTS FROM SCAN_INT_PERIOD TO 0, WHEN IT REACHES ZERO, THE ; KEYBOARD MATRIX IS SCANNED, AND THE COUNTERS IS RESET AT SCAN_INT_PERIOD -SCNCNT: .DB SCAN_INT_PERIOD +MKY_SCNCNT: .DB SCAN_INT_PERIOD + +; INITIALL SET TO FALSE, AND THUS DISABLING INTERRUPT HANDLER'S SCAN FUNCTION +; AS SOON AT THE KEY REQUEST FUNCTIONS (STATUS, READ), THIS IS SET AND INTERRUPT HANDLER +; IS PERMANETLY ON. +MKY_SCANON: .DB 0 + ; MKY_NRPTCOL: .DB 0 MKY_NRPTROW: .DB 0 -MKY_RPTCOL: .DB 0 -MKY_RPTROW: .DB 0 MKY_RPTACTIVE: .DB 0 MKY_RPTCNT: .DB KEY_REPEAT_INIT @@ -1038,8 +1043,6 @@ MKY_STATE: .DB 0 ; STATE BITS (SEE ABOVE) MKY_LSTATE: .DB 0 ; STATE BITS FOR "LEFT" KEYS MKY_RSTATE: .DB 0 ; STATE BITS FOR "RIGHT" KEYS MKY_STATUS: .DB 0 ; CURRENT STATUS BITS (SEE ABOVE) -MKY_REPEAT: .DB 0 ; CURRENT REPEAT RATE -MKY_IDLE: .DB 0 ; IDLE COUNT #IF (MKYKBLOUT == KBD_US) ;__________________________________________________________________________________________________ @@ -1078,9 +1081,9 @@ MKY_MAPEXT: ; PAIRS ARE [SCANCODE,KEYCODE] FOR EXTENDED SCANCODES .DB $74,$F9, $75,$F6, $7A,$F5, $7C,$ED .DB $7D,$F4, $7E,$FD, $00,$00 ; -MKY_MAPNUMPAD: ; KEYCODE TRANSLATION FROM NUMPAD RANGE TO STD ASCII/KEYCODES - .DB $F3,$F7,$F5,$F8,$FF,$F9,$F2,$F6,$F4,$F0,$F1,$2F,$2A,$2D,$2B,$0D - .DB $31,$32,$33,$34,$35,$36,$37,$38,$39,$30,$2E,$2F,$2A,$2D,$2B,$0D +; MKY_MAPNUMPAD: ; KEYCODE TRANSLATION FROM NUMPAD RANGE TO STD ASCII/KEYCODES +; .DB $F3,$F7,$F5,$F8,$FF,$F9,$F2,$F6,$F4,$F0,$F1,$2F,$2A,$2D,$2B,$0D +; .DB $31,$32,$33,$34,$35,$36,$37,$38,$39,$30,$2E,$2F,$2A,$2D,$2B,$0D #ENDIF #IF (MKYKBLOUT == KBD_DE) ;__________________________________________________________________________________________________ @@ -1123,10 +1126,10 @@ MKY_MAPEXT: ; PAIRS ARE [SCANCODE,KEYCODE] FOR EXTENDED SCANCODES .DB $74,$04, $75,$05, $7A,$1A, $7C,$ED ; Cursor right , Cursor up , Page down .DB $7D,$17, $7E,$FD, $00,$00 ; Page up , n.a. , END MKY_MAPEXT (Pairs end) ; -MKY_MAPNUMPAD: ; KEYCODE TRANSLATION FROM NUMPAD RANGE TO STD ASCII/KEYCODES +; MKY_MAPNUMPAD: ; KEYCODE TRANSLATION FROM NUMPAD RANGE TO STD ASCII/KEYCODES - .DB $F3,$F7,$F5,$F8,$FF,$F9,$F2,$F6,$F4,$F0,$F1,$2F,$2A,$2D,$2B,$0D - .DB $31,$32,$33,$34,$35,$36,$37,$38,$39,$30,$2E,$2F,$2A,$2D,$2B,$0D +; .DB $F3,$F7,$F5,$F8,$FF,$F9,$F2,$F6,$F4,$F0,$F1,$2F,$2A,$2D,$2B,$0D +; .DB $31,$32,$33,$34,$35,$36,$37,$38,$39,$30,$2E,$2F,$2A,$2D,$2B,$0D ; #ENDIF ; From ea1081093480bd0721c5fd6f552cb2abc9371a8a Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Thu, 19 Nov 2020 16:02:52 +1100 Subject: [PATCH 08/18] MSX-KEYBOARD: optimised interrupt handler --- Source/HBIOS/msxkeyb.asm | 257 ++++++++++++++++++--------------------- 1 file changed, 118 insertions(+), 139 deletions(-) diff --git a/Source/HBIOS/msxkeyb.asm b/Source/HBIOS/msxkeyb.asm index fc1ec30d..847d3557 100644 --- a/Source/HBIOS/msxkeyb.asm +++ b/Source/HBIOS/msxkeyb.asm @@ -4,10 +4,9 @@ ; CREATED BY: DEAN NETHERTON ; KBD.ASM DRIVER USED AS TEMPLATE ; -; ;====================================================================== ; USAGE: -; THIS DRIVER IS CAN BE ACTIVED WITHIN THE TMS VIDEO DRIVER +; THIS DRIVER CAN BE ACTIVED WITHIN THE TMS VIDEO DRIVER ; ADD THE OPTION TO YOUR BUILD CONFIGURATION TO ACTIVATE THE KEYBOARD ; DRIVER: ; MSKENABLE .SET TRUE @@ -16,11 +15,9 @@ ; ; TODO: ; IMPLEMENT MULTIBYTE SCAN CODES (ARROW KEYS, ETC) -; OPTIMISE INTERRUPT HANDLER - HAS NEGATIVE IMPACT ON SERIAL IO AT 115200 FOR CPU @ 8MHZ ; BACKSPACE DOES NOT AUTO-REPEAT ; AUTO DETECT PPI ; -; ;====================================================================== ; DRIVER - CONSTANTS ;====================================================================== @@ -46,10 +43,10 @@ PPICMD_GA_MODE_2 .EQU 64 PPICMD_COMMAND .EQU 128 ; COUNT FOR PERIOD TO START REPEATING CHARACTERS -KEY_REPEAT_INIT: .EQU 10 +KEY_REPEAT_INIT: .EQU 30 ; COUNT FOR PERIOD BETWEEN AUTO REPEATING CHARACTERS -KEY_REPEAT_PERIOD: .EQU 2 +KEY_REPEAT_PERIOD: .EQU 3 ; COUNT FOR INTERRUPT HANDLER TO TRIGGER KEYBOARD SCANNER (EG: SCAN KEYBOARD ONLY EVERY 3RD INTERRUPT (3/60)) SCAN_INT_PERIOD: .EQU 3 @@ -69,20 +66,20 @@ MKY_WAITTO .EQU 0 ; 0 IS MAX WAIT (256) ; ; STATUS BITS (FOR MKY_STATUS) ; -MKY_EXT .EQU 01H ; BIT 0, EXTENDED SCANCODE ACTIVE -MKY_BREAK .EQU 02H ; BIT 1, THIS IS A KEY UP (BREAK) EVENT -MKY_KEYRDY .EQU 80H ; BIT 7, INDICATES A DECODED KEYCODE IS READY +MKY_EXT .EQU 01H ; BIT 0, EXTENDED SCANCODE ACTIVE +MKY_BREAK .EQU 02H ; BIT 1, THIS IS A KEY UP (BREAK) EVENT +MKY_KEYRDY .EQU 80H ; BIT 7, INDICATES A DECODED KEYCODE IS READY ; ; STATE BITS (FOR MKY_STATE, MKY_LSTATE, MKY_RSTATE) ; -MKY_SHIFT .EQU 01H ; BIT 0, SHIFT ACTIVE (PRESSED) -MKY_CTRL .EQU 02H ; BIT 1, CONTROL ACTIVE (PRESSED) -MKY_ALT .EQU 04H ; BIT 2, ALT ACTIVE (PRESSED) -MKY_WIN .EQU 08H ; BIT 3, WIN ACTIVE (PRESSED) -MKY_SCRLCK .EQU 10H ; BIT 4, CAPS LOCK ACTIVE (TOGGLED ON) -MKY_NUMLCK .EQU 20H ; BIT 5, NUM LOCK ACTIVE (TOGGLED ON) -MKY_CAPSLCK .EQU 40H ; BIT 6, SCROLL LOCK ACTIVE (TOGGLED ON) -MKY_NUMPAD .EQU 80H ; BIT 7, NUM PAD KEY (KEY PRESSED IS ON NUM PAD) +MKY_SHIFT .EQU 01H ; BIT 0, SHIFT ACTIVE (PRESSED) +MKY_CTRL .EQU 02H ; BIT 1, CONTROL ACTIVE (PRESSED) +MKY_ALT .EQU 04H ; BIT 2, ALT ACTIVE (PRESSED) +MKY_WIN .EQU 08H ; BIT 3, WIN ACTIVE (PRESSED) +MKY_SCRLCK .EQU 10H ; BIT 4, CAPS LOCK ACTIVE (TOGGLED ON) +MKY_NUMLCK .EQU 20H ; BIT 5, NUM LOCK ACTIVE (TOGGLED ON) +MKY_CAPSLCK .EQU 40H ; BIT 6, SCROLL LOCK ACTIVE (TOGGLED ON) +MKY_NUMPAD .EQU 80H ; BIT 7, NUM PAD KEY (KEY PRESSED IS ON NUM PAD) ; MKY_DEFRPT .EQU $40 ; DEFAULT REPEAT RATE (.5 SEC DELAY, 30CPS) MKY_DEFSTATE .EQU MKY_NUMLCK ; DEFAULT STATE (NUM LOCK ON) @@ -205,10 +202,8 @@ MKY_INIT: LD A, PPICMD_COMMAND | PPICMD_GA_MODE_0 | PPICMD_GB_MODE_0 | PPICMD_A_IN | PPICMD_B_IN | PPICMD_CLOW_OUT | PPICMD_CHIGH_OUT OUT (MKY_REGCMD), A - - LD A, 64 ; CAPS OFF + LD A, 64 ; CAPS OFF OUT (MKY_REGC), A - RET ; ;__________________________________________________________________________________________________ @@ -225,10 +220,9 @@ MKY_FLUSH: ;__________________________________________________________________________________________________ ; MKY_STAT: - LD A, $FF - LD (MKY_SCANON), A - CALL MKY_DECODE ; CHECK THE KEYBOARD - JP Z,CIO_IDLE ; RET VIA IDLE PROCESSING IF NO KEY + CALL MKY_SCAN ; SCAN AND SET SCANCODE FOR DETECTED KEY EVENT + CALL MKY_DECODE ; DECODE THE SCANCODE INTO A KEYCODE + JP Z, CIO_IDLE ; RET VIA IDLE PROCESSING IF NO KEY RET ; ;__________________________________________________________________________________________________ @@ -242,19 +236,19 @@ MKY_READ: CALL MKY_STAT ; KEY READY? ; JR Z, MKY_READ ; NOT READY, KEEP TRYING - LD A,(MKY_STATE) ; GET STATE + LD A, (MKY_STATE) ; GET STATE AND $01 ; ISOLATE EXTENDED SCANCODE BIT RRCA ; ROTATE IT TO HIGH ORDER BIT - LD E,A ; SAVE IT IN E FOR NOW - LD A,(MKY_SCANCODE) ; GET SCANCODE + LD E, A ; SAVE IT IN E FOR NOW + LD A, (MKY_SCANCODE) ; GET SCANCODE OR E ; COMBINE WITH EXTENDED BIT - LD C,A ; STORE IT IN C FOR RETURN - LD A,(MKY_KEYCODE) ; GET KEYCODE - LD E,A ; SAVE IT IN E - LD A,(MKY_STATE) ; GET STATE FLAGS - LD D,A ; SAVE THEM IN D + LD C, A ; STORE IT IN C FOR RETURN + LD A, (MKY_KEYCODE) ; GET KEYCODE + LD E, A ; SAVE IT IN E + LD A, (MKY_STATE) ; GET STATE FLAGS + LD D, A ; SAVE THEM IN D XOR A ; SIGNAL SUCCESS - LD (MKY_STATUS),A ; CLEAR STATUS TO INDICATE BYTE RECEIVED + LD (MKY_STATUS), A ; CLEAR STATUS TO INDICATE BYTE RECEIVED RET ; ;__________________________________________________________________________________________________ @@ -264,9 +258,11 @@ MKY_READ: ; ; SUCUESS/FAILURE IN A ; ; NUMBER OF BYTES RETURNED IN B (ZERO IF NO SCAN CODES AVAILABLE) ; ; SCAN CODE BYTES IN D, E, H, L, C -; +; WORK - IN - PROGRESS ;__________________________________________________________________________________________________ MKY_RDSCAN: + LD A, (MKY_SCANBUFFLEN) + CALL Z, MKY_GENSCODE LD A, (MKY_SCANBUFFLEN) LD B, A LD A, (MKY_SCANBUFF) @@ -283,6 +279,36 @@ MKY_RDSCAN: XOR A LD (MKY_SCANBUFFLEN), A RET + +MKY_SCAN: + LD A, (MKY_SCANNED) ; NEED TO WAIT UNTIL A NEW SCAN HAS COMPLETED (MKY_INT) + OR A + RET Z + + DI ; CAPTURE THE LATEST KEYBOARD SCANNED STATE + XOR A ; CLEAR SCANNED STATE + LD (MKY_SCANNED), A + + LD DE, MKY_SCNKEY ; COPY NEWKEY TO SCNKEY + LD HL, MKY_NEWKEY ; AND RESET NEWKEY TO $FF + LD B, MATRIX_ROW_COUNT + LD C, 255 +MKY_SCAN_LP1: + LD A, (HL) + LD (DE), A + LD (HL), C + INC HL + INC DE + DJNZ MKY_SCAN_LP1 + EI + + EX AF, AF' + PUSH AF + CALL MKY_GENSCODE + CALL MKY_RPTGEN + POP AF + EX AF, AF' + RET ; ;__________________________________________________________________________________________________ ; HARDWARE INTERFACE @@ -291,19 +317,16 @@ MKY_RDSCAN: ; KEYBOARD INPUT STATUS ; A=0, Z SET FOR NOTHING PENDING, OTHERWISE DATA PENDING ; -MKY_IST: - LD A, (MKY_SCANBUFFLEN) - OR A - RET +#define MKY_IST LD A, (MKY_SCANBUFFLEN) \ OR A ;__________________________________________________________________________________________________ ; ; GET A RAW DATA BYTE FROM KEYBOARD INTERFACE INTO A WITH TIMEOUT ; MKY_GETDATA: - LD B,MKY_WAITTO ; SETUP TO LOOP + LD B, MKY_WAITTO ; SETUP TO LOOP MKY_GETDATA0: - CALL MKY_IST ; GET INPUT REGISTER STATUS - JR NZ,MKY_GETDATA1 ; BYTE PENDING, GO GET IT + MKY_IST ; GET INPUT REGISTER STATUS + JR NZ, MKY_GETDATA1 ; BYTE PENDING, GO GET IT CALL DELAY ; WAIT A BIT DJNZ MKY_GETDATA0 ; LOOP UNTIL COUNTER EXHAUSTED XOR A ; NO DATA, RETURN ZERO @@ -317,7 +340,7 @@ MKY_GETDATA1: ; GET A RAW DATA BYTE FROM KEYBOARD INTERFACE INTO A WITH NOTIMEOUT ; MKY_GETDATAX: - CALL MKY_IST ; GET INPUT REGISTER STATUS + MKY_IST ; GET INPUT REGISTER STATUS RET Z ; NOTHING THERE, DONE JR MKY_GETDATA1 ; GO GET IT @@ -660,36 +683,6 @@ MKY_DEC10B: XOR $20 ; FLIP BIT 5 TO SWAP UPPER/LOWER CASE LD (MKY_KEYCODE),A ; SAVE IT -; MKY_DEC11: ; HANDLE NUM PAD KEYS -; LD A,(MKY_STATE) ; GET THE CURRENT STATE FLAGS -; AND $7F;~MKY_NUMPAD ; ASSUME NOT A NUMPAD KEY, CLEAR THE NUMPAD BIT -; LD (MKY_STATE),A ; SAVE IT - -; LD A,(MKY_KEYCODE) ; GET THE CURRENT KEYCODE -; AND 11100000B ; ISOLATE TOP 3 BITS -; CP 11000000B ; IS IN NUMPAD RANGE? -; JR NZ,MKY_DEC12 ; NOPE, GET OUT - -; LD A,(MKY_STATE) ; LOAD THE CURRENT STATE FLAGS -; OR MKY_NUMPAD ; TURN ON THE NUMPAD BIT -; LD (MKY_STATE),A ; SAVE IT - -; AND MKY_NUMLCK ; IS NUM LOCK BIT SET? -; JR Z,MKY_DEC11A ; NO, SKIP NUMLOCK PROCESSING -; LD A,(MKY_KEYCODE) ; GET THE KEYCODE -; XOR $10 ; FLIP VALUES FOR NUMLOCK -; LD (MKY_KEYCODE),A ; SAVE IT - -; MKY_DEC11A: ; APPLY NUMPAD MAPPING -; LD A,(MKY_KEYCODE) ; GET THE CURRENT KEYCODE -; LD HL,MKY_MAPNUMPAD ; LOAD THE START OF THE MAPPING TABLE -; SUB $C0 ; KEYCODES START AT $C0 -; LD E,A ; INDEX TO E -; LD D,0 ; D IS ZERO -; ADD HL,DE ; POINT TO RESULT OF MAPPING -; LD A,(HL) ; GET IT IN A -; LD (MKY_KEYCODE),A ; SAVE IT - MKY_DEC12: ; DETECT UNKNOWN/INVALID KEYCODES LD A,(MKY_KEYCODE) ; GET THE FINAL KEYCODE CP $FF ; IS IT $FF (UNKNOWN/INVALID) @@ -712,21 +705,21 @@ MKY_DECNEW: ; START NEW KEYPRESS (CLEAR ALL STATUS BITS) ;__________________________________________________________________________________________________ ; INTERRUPT HANDLER ; -; IF MKY_SCANBUFFF HAS CONTENT, DO NOTHING -; OTHERWISE, SCAN KEYBOARD AND IF A KEY EVENT IS DETECTED -; WRITE SCANCODES TO MKY_SCANBUFFF +; SCAN KEYBOARD AND IN THE NEWKEY SCAN STATS ; -; ALSO GENERATE KEY REPEAT EVENTS, IF KEY HELD DOWN -; -; NB: THIS HANDLER IS QUITE EXPENSIVE IN TIME -; AND CAN IMPACT SERIAL OPERATION FOR 115200 BAUD RATE FOR CPU AT 8MHZ ;__________________________________________________________________________________________________ ; MKY_INT: - LD A, (MKY_SCANON) ; OPTIMISATION - ONLY SCAN IF REQUIRED + LD A, (MKY_RPTACTIVE) ; NO REPEAT KEY IS HELD? OR A - RET Z + JR Z, MKY_INTSCAN1 + LD A, (MKY_RPTCNT) ; DECREMENT REPEAT COUNTER + DEC A ; DOWN TO ZERO + CP $FF + JR Z, MKY_INTSCAN1 + LD (MKY_RPTCNT), A +MKY_INTSCAN1: LD A, (MKY_SCNCNT) ; SCAN THE KEYBOARD EVERY 'SCAN_INT_PERIOD' INTERRUPTS. DEC A LD (MKY_SCNCNT), A @@ -735,16 +728,8 @@ MKY_INT: LD A, SCAN_INT_PERIOD LD (MKY_SCNCNT), A - LD A, (MKY_SCANBUFFLEN) ; SKIP SCANNING UNTIL CODE BUFFER IS EMPTY - OR A - RET NZ - - EX AF, AF' - PUSH AF -; ; SCAN KEYBOARD AND STORE ALL COLUMN RESULTS PER ROW AT MKY_NEWKEY ; -; MKY_SCAN: IN A, (MKY_REGC) ; READ AND MASK THE CURRENT STATE OF PPI PORT C AND $F0 LD D, A @@ -759,12 +744,8 @@ MKY_SCAN_LP: INC D DJNZ MKY_SCAN_LP ; LOOP UNTIL ALL ROWS READ - CALL MKY_GENSCODE - -MKY_INT_END: - CALL MKY_RPTGEN - POP AF - EX AF, AF' + LD A, $FF ; NOTE THAT A SCAN HAS BEEN DONE + LD (MKY_SCANNED), A RET ; @@ -772,20 +753,20 @@ MKY_INT_END: ; COMPARE MKY_OLDKEY O MKY_NEWKEY ; GENERATE SCAN CODES ; -; FOR EACH BIT IN MKY_OLDKEY ND MKY_NEWKEY +; FOR EACH BIT IN MKY_OLDKEY CP WITH CORRESPONDING BIT IN MKY_SCNKEY ; IF BOTH = 1, THEN NO KEY PRESS - NOTHING CHANGED ; IF BOTH = 0, THEN KEY WAS AND IS STILL PRESSED - NOTHING CHANGED -; IF OLD = 1 AND NEW = 0, KEY WAS PRESSED -; IF OLD = 0 AND NEW = 1, KEY WAS RELEASED -; STOP OF FIRST CHANGE - STORE IN BUFFER - THEN NOTHING HAPPENS, -; UNTIL MKY_RDSCAN IS CALLED AND CLEARS THE SCAN BUFFER -; ALSO RESET MKY_RPTACTIVE IS A KEY IS HELD DOWN +; IF OLD = 1 AND SCN = 0, KEY WAS PRESSED +; IF OLD = 0 AND SCN = 1, KEY WAS RELEASED +; STOP OF FIRST CHANGE - STORE IN BUFFER, AND RESET/CLEAR BIT IN MKY_OLDKEY +; ALSO SET MKY_RPTACTIVE. NZ -> A KEY IS HELD DOWN, ZERO -> NO KEYS HELD DOWN +; MKY_GENSCODE: XOR A LD (MKY_RPTACTIVE), A ; CLEAR FLAG TO INDICATE A KEYHOLD STATE LD HL, MKY_OLDKEY - LD DE, MKY_NEWKEY + LD DE, MKY_SCNKEY XOR A EX AF, AF' ; ROW COUNT IN A' @@ -856,11 +837,18 @@ MKY_NORPT: JR MKY_GENSCODENXT MKY_KEYDOWN: + PUSH AF + LD A, KEY_REPEAT_INIT ; SET COUNTER FOR REPEAT TRIGGER + LD (MKY_RPTCNT), A + POP AF + +MKY_KEYDOWN_RPT: CALL MKY_RESOLDBIT CALL MKY_SCANADDR LD A, (HL) OR A ; IF NO SCANCODE - IGNORE IT RET Z + LD (MKY_SCANBUFF), A LD A, 1 LD (MKY_SCANBUFFLEN), A @@ -887,27 +875,20 @@ MKY_RPTGEN: LD A, (MKY_RPTACTIVE) ; NO KEY IS HELD OR A - JR Z, MKY_RPTCLR + RET Z LD A, (MKY_RPTCNT) - DEC A - JR Z, MKY_RPTADD - LD (MKY_RPTCNT), A - RET + OR A + RET NZ -MKY_RPTADD: + ; GENERATE THE KEY DOWN SCAN CODE FOR THE REPEATING KEY LD A, KEY_REPEAT_PERIOD LD (MKY_RPTCNT), A LD A, (MKY_NRPTCOL) LD B, A LD A, (MKY_NRPTROW) EX AF, AF' - JR MKY_KEYDOWN - -MKY_RPTCLR: - LD A, KEY_REPEAT_INIT - LD (MKY_RPTCNT), A - RET + JR MKY_KEYDOWN_RPT ; ;__________________________________________________________________________________________________ ; @@ -917,14 +898,16 @@ MKY_RPTCLR: ; B = 1 TO 8 - COLUMN COUNT ; A' IS ROW COUNT - 0 TO MATRIX_ROW_COUNT ; OUTPUT: -; HL = BYTE WITHIN MKY_OLDKEY RRAY +; HL = BYTE WITHIN MKY_OLDKEY ARRAY ; A = BIT MASK FOR COLUMN COUNT (EG: B = 3, A = 8) ; PROTECTS: ; A' IS UNCHANGED ; B IS UNCHANGED + MKY_GETKEYIDX: + LD HL, MKY_OLDKEY LD A, $80 - LD D, B ; SAVE B (COLUMN COUNT - 1 TO 8) + LD C, B ; SAVE B (COLUMN COUNT - 1 TO 8) MKY_SETOLDBIT_LP: DEC B JR Z, SKIP @@ -932,39 +915,36 @@ MKY_SETOLDBIT_LP: JR MKY_SETOLDBIT_LP SKIP: - LD HL, MKY_OLDKEY EX AF, AF' ; RETRIEVE ROW COUNT - LD C, A + LD E, A EX AF, AF' - LD B, 0 - ADD HL, BC - LD B, D ; RETORE B (COLUMN COUNT) + LD D, 0 + LD B, C ; RETORE B (COLUMN COUNT) + ADD HL, DE RET ; ;__________________________________________________________________________________________________ ; ; SET BIT WITHIN THE KEY MATRIX ARRAY -; HL -> ADDRESS WITHIN MKY_OLDKEY R MKY_NEWKEY ARRAY +; HL -> ADDRESS WITHIN MKY_OLDKEY ARRAY ; C BIT MASK TO BE OR'ED ; MKY_SETOLDBIT: CALL MKY_GETKEYIDX - LD C, (HL) - OR C + OR (HL) LD (HL), A RET ; ;__________________________________________________________________________________________________ ; ; RESET BIT WITHIN THE KEY MATRIX ARRAY -; HL -> ADDRESS WITHIN MKY_OLDKEY R MKY_NEWKEY ARRAY +; HL -> ADDRESS WITHIN MKY_OLDKEY ARRAY ; C CPL BIT MASK TO BE AND'ED ; MKY_RESOLDBIT: CALL MKY_GETKEYIDX - LD C, (HL) CPL - AND C + AND (HL) LD (HL), A RET ; @@ -1014,19 +994,26 @@ MKY_READBYT: ; DYNAMIC DATA STORAGE: ; ; STORAGE OF KEYBOARD MATRIX, USED FOR DETECTING KEY REPETITION -MKY_OLDKEY: .FILL MATRIX_ROW_COUNT, $FF +MKY_OLDKEY: .FILL MATRIX_ROW_COUNT, $FF ; ; CURRENT STATE OF THE KEYBOARD MATRIX -MKY_NEWKEY: .FILL MATRIX_ROW_COUNT, $FF +MKY_NEWKEY: .FILL MATRIX_ROW_COUNT, $FF +; +; COPY OF MKY_NEWKEY FOR USE IN GENERATING SCANCODE +MKY_SCNKEY: .FILL MATRIX_ROW_COUNT, $FF +; +; SET TO NZ WHEN A SCAN IS COMPLETED +; SET TO ZERO AFTER A SCAN CODE CONVERSION +MKY_SCANNED: .DB 0 ; ; F3F6: VDP-INTERUPT COUNTER THAT COUNTS FROM SCAN_INT_PERIOD TO 0, WHEN IT REACHES ZERO, THE ; KEYBOARD MATRIX IS SCANNED, AND THE COUNTERS IS RESET AT SCAN_INT_PERIOD -MKY_SCNCNT: .DB SCAN_INT_PERIOD +MKY_SCNCNT: .DB SCAN_INT_PERIOD ; INITIALL SET TO FALSE, AND THUS DISABLING INTERRUPT HANDLER'S SCAN FUNCTION ; AS SOON AT THE KEY REQUEST FUNCTIONS (STATUS, READ), THIS IS SET AND INTERRUPT HANDLER ; IS PERMANETLY ON. -MKY_SCANON: .DB 0 +; MKY_SCANON: .DB 0 ; MKY_NRPTCOL: .DB 0 @@ -1081,9 +1068,6 @@ MKY_MAPEXT: ; PAIRS ARE [SCANCODE,KEYCODE] FOR EXTENDED SCANCODES .DB $74,$F9, $75,$F6, $7A,$F5, $7C,$ED .DB $7D,$F4, $7E,$FD, $00,$00 ; -; MKY_MAPNUMPAD: ; KEYCODE TRANSLATION FROM NUMPAD RANGE TO STD ASCII/KEYCODES -; .DB $F3,$F7,$F5,$F8,$FF,$F9,$F2,$F6,$F4,$F0,$F1,$2F,$2A,$2D,$2B,$0D -; .DB $31,$32,$33,$34,$35,$36,$37,$38,$39,$30,$2E,$2F,$2A,$2D,$2B,$0D #ENDIF #IF (MKYKBLOUT == KBD_DE) ;__________________________________________________________________________________________________ @@ -1126,11 +1110,6 @@ MKY_MAPEXT: ; PAIRS ARE [SCANCODE,KEYCODE] FOR EXTENDED SCANCODES .DB $74,$04, $75,$05, $7A,$1A, $7C,$ED ; Cursor right , Cursor up , Page down .DB $7D,$17, $7E,$FD, $00,$00 ; Page up , n.a. , END MKY_MAPEXT (Pairs end) ; -; MKY_MAPNUMPAD: ; KEYCODE TRANSLATION FROM NUMPAD RANGE TO STD ASCII/KEYCODES - -; .DB $F3,$F7,$F5,$F8,$FF,$F9,$F2,$F6,$F4,$F0,$F1,$2F,$2A,$2D,$2B,$0D -; .DB $31,$32,$33,$34,$35,$36,$37,$38,$39,$30,$2E,$2F,$2A,$2D,$2B,$0D -; #ENDIF ; ;__________________________________________________________________________________________________ From 3e0771acf39f8ab46f97397b3a81ef61c54043fa Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Wed, 25 Nov 2020 23:18:49 +1100 Subject: [PATCH 09/18] V9958: Updated TMS driver to support V9958 --- Source/HBIOS/hbios.asm | 3 +- Source/HBIOS/hbios.inc | 1 + Source/HBIOS/std.asm | 5 +-- Source/HBIOS/tms.asm | 78 ++++++++++++++++++++++++++++++++---------- 4 files changed, 66 insertions(+), 21 deletions(-) diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index bcca366c..72d55f97 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -5635,13 +5635,14 @@ PIO_MODE_STR: .TEXT "Output$" ; VIDEO DEVICE STRINGS ; PS_VDSTRREF: - .DW PS_VDVDU, PS_VDCVDU, PS_VDNEC, PS_VDTMS, PS_VDVGA + .DW PS_VDVDU, PS_VDCVDU, PS_VDNEC, PS_VDTMS, PS_VDVGA, PS_VDV9958 ; PS_VDVDU .TEXT "VDU$" PS_VDCVDU .TEXT "CVDU$" PS_VDNEC .TEXT "NEC$" PS_VDTMS .TEXT "TMS$" PS_VDVGA .TEXT "VGA$" +PS_VDV9958 .TEXT "V9958-$" ; ; VIDEO TYPE STRINGS ; diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index 78678921..ffb6bb9d 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -200,6 +200,7 @@ VDADEV_CVDU .EQU $10 ; ECB COLOR VDU - MOS 8563 VDADEV_NEC .EQU $20 ; ECB UPD7220 - NEC UPD7220 VDADEV_TMS .EQU $30 ; N8 ONBOARD VDA SUBSYSTEM - TMS 9918 VDADEV_VGA .EQU $40 ; ECB VGA3 - HITACHI HD6445 +VDADEV_V9958 .EQU $50 ; V9958 VDU ; ; SOUND DEVICE IDS ; diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index f31412a2..c8e09bf9 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -199,7 +199,8 @@ AYMODE_MSX .EQU 5 ; RC2014 SOUND MODULE REV6 BY ED BRINDLEY ON Z80/Z180 AT MSX TMSMODE_NONE .EQU 0 TMSMODE_SCG .EQU 1 ; SCG ECB BOARD TMSMODE_N8 .EQU 2 ; N8 BUILT-IN VIDEO -TMSMODE_RC .EQU 3 ; RC2014 BUILT-IN VIDEO +TMSMODE_RC .EQU 3 ; RC2014 TMS9918 VIDEO BOARD +TMSMODE_RCV9958 .EQU 4 ; RC2014 V9958 VIDEO BOARD ; ; SERIAL DEVICE CONFIGURATION CONSTANTS ; @@ -427,7 +428,7 @@ SYSTIM .SET TM_CTC #IF (TMSENABLE & (INTMODE == 1)) #IF (TMSTIMENABLE) SYSTIM .SET TM_TMS - .ECHO " TMS9918" + .ECHO " TMS9918/V9958" #ENDIF #ENDIF ; diff --git a/Source/HBIOS/tms.asm b/Source/HBIOS/tms.asm index 62aab029..44d21d83 100644 --- a/Source/HBIOS/tms.asm +++ b/Source/HBIOS/tms.asm @@ -1,5 +1,5 @@ ;====================================================================== -; N8 VDU DRIVER FOR SBC PROJECT +; TM9918 AND V9958 VDU DRIVER ; ; WRITTEN BY: DOUGLAS GOODALL ; UPDATED BY: WAYNE WARTHEN -- 4/7/2013 @@ -19,10 +19,10 @@ TMSCTRL1: .EQU 1 ; CONTROL BITS TMSINTEN: .EQU 5 ; INTERRUPT ENABLE BIT #IF TMSTIMENABLE - .ECHO "TMS INTERRUPTS ENABLED\n" + .ECHO "TMS/V9958 INTERRUPTS ENABLED\n" #ENDIF -#IF (TMSMODE == TMSMODE_RC) +#IF ((TMSMODE == TMSMODE_RC) | (TMSMODE == TMSMODE_RCV9958)) TMS_DATREG .EQU $98 ; READ/WRITE DATA TMS_CMDREG .EQU $99 ; READ STATUS / WRITE REG SEL TMS_PPIA .EQU 0 ; PPI PORT A @@ -58,14 +58,21 @@ TMS_PPIX .EQU 0 ; PPI CONTROL PORT #ENDIF ; TMS_ROWS .EQU 24 + +#IF (TMSMODE == TMSMODE_RCV9958) +TMS_FNTVADDR .EQU $1000 ; VRAM ADDRESS OF FONT DATA +TMS_COLS .EQU 80 +#ELSE +TMS_FNTVADDR .EQU $0800 ; VRAM ADDRESS OF FONT DATA TMS_COLS .EQU 40 +#ENDIF ; #DEFINE USEFONT8X8 #DEFINE TMS_FONT FONT8X8 ; TERMENABLE .SET TRUE ; INCLUDE TERMINAL PSEUDODEVICE DRIVER ; -; TMS_IODELAY IS USED TO ADD RECOVERY TIME TO TMS9918 ACCESSES +; TMS_IODELAY IS USED TO ADD RECOVERY TIME TO TMS9918/V9958 ACCESSES ; IF YOU SEE SCREEN CORRUPTION, ADJUST THIS!!! ; #IF (CPUFAM == CPU_Z180) @@ -73,7 +80,11 @@ TERMENABLE .SET TRUE ; INCLUDE TERMINAL PSEUDODEVICE DRIVER #DEFINE TMS_IODELAY EX (SP),HL \ EX (SP),HL ; 38 W/S #ELSE ; BELOW WAS TUNED FOR SBC AT 8MHZ -#DEFINE TMS_IODELAY NOP \ NOP ; 8 W/S +#IF (TMSMODE == TMSMODE_RCV9958) +#DEFINE TMS_IODELAY NOP \ NOP \ NOP \ NOP \ NOP \ NOP \ NOP ; V9958 NEEDS AT WORST CASE, APPROX 4us (28T) DELAY BETWEEN I/O (WHEN IN TEXT MODE) +#ELSE +#DEFINE TMS_IODELAY NOP \ NOP ; 8 W/S +#ENDIF #ENDIF ; ;====================================================================== @@ -101,7 +112,11 @@ TMS_INIT: LD IY,TMS_IDAT ; POINTER TO INSTANCE DATA ; CALL NEWLINE ; FORMATTING +#IF (TMSMODE == TMSMODE_RCV9958) + PRTS("V9958: IO=0x$") +#ELSE PRTS("TMS: IO=0x$") +#ENDIF LD A,TMS_DATREG CALL PRTHEXBYTE CALL TMS_PROBE ; CHECK FOR HW EXISTENCE @@ -149,12 +164,6 @@ TMS_INIT1: ; XOR A ; SIGNAL SUCCESS RET - -#IF TMSTIMENABLE - ; DISABLE INTERRUPT -TMS_INT_DIS: - -#ENDIF ; ;====================================================================== ; TMS DRIVER - VIDEO DISPLAY ADAPTER (VDA) FUNCTIONS @@ -230,7 +239,11 @@ TMS_VDARES1: ; ENTRY POINT TO AVOID TMS_Z180IO RECURSION RET TMS_VDADEV: +#IF (TMSMODE == TMSMODE_RCV9958) + LD D, VDADEV_V9958 +#ELSE LD D,VDADEV_TMS ; D := DEVICE TYPE +#ENDIF LD E,0 ; E := PHYSICAL UNIT IS ALWAYS ZERO LD H,TMSMODE ; H := MODE LD L,TMS_DATREG ; L := BASE I/O ADDRESS @@ -366,6 +379,14 @@ TMS_SET: ;---------------------------------------------------------------------- ; TMS_WR: +#IF (TMSMODE == TMSMODE_RCV9958) + ; CLEAR R#14 FOR V9958 + XOR A + OUT (TMS_CMDREG), A + LD A, $80 | 14 + OUT (TMS_CMDREG), A +#ENDIF + PUSH HL SET 6,H ; SET WRITE BIT CALL TMS_RD @@ -450,8 +471,8 @@ TMS_CRTINIT2: ;---------------------------------------------------------------------- ; TMS_LOADFONT: - ; SET WRITE ADDRESS TO $800 - LD HL,$800 + ; SET WRITE ADDRESS TO TMS_FNTVADDR + LD HL,TMS_FNTVADDR CALL TMS_WR #IF USELZSA2 @@ -470,8 +491,8 @@ TMS_LOADFONT: LD HL,TMS_FONT ; START OF FONT DATA #ENDIF ; - ; FILL $800 BYTES FROM FONTDATA - LD DE,$800 + ; FILL TMS_FNTVADDR BYTES FROM FONTDATA + LD DE,TMS_FNTVADDR TMS_LOADFONT1: LD A,(HL) OUT (TMS_DATREG),A @@ -532,7 +553,7 @@ TMS_SETCUR0: ; MULT BY 8 FOR FONT INDEX SLA L ; SHIFT LSB INTO CARRY RL H ; SHFT MSB FROM CARRY DJNZ TMS_SETCUR0 ; LOOP 3 TIMES - LD DE,$800 ; OFFSET TO START OF FONT TABLE + LD DE,TMS_FNTVADDR ; OFFSET TO START OF FONT TABLE ADD HL,DE ; ADD TO FONT INDEX CALL TMS_RD ; SETUP TO READ GLYPH LD B,8 ; 8 BYTES @@ -545,7 +566,7 @@ TMS_SETCUR1: ; READ GLYPH LOOP DJNZ TMS_SETCUR1 ; LOOP FOR 8 BYTES ; ; NOW WRITE INVERTED GLYPH INTO FONT INDEX 255 - LD HL,$800 + (255 * 8) ; LOC OF GLPYPH DATA FOR CHAR 255 + LD HL,TMS_FNTVADDR + (255 * 8) ; LOC OF GLPYPH DATA FOR CHAR 255 CALL TMS_WR ; SETUP TO WRITE THE INVERTED GLYPH LD B,8 ; 8 BYTES PER GLYPH LD HL,TMS_BUF ; POINT TO BUFFER @@ -891,16 +912,33 @@ TMS_PORTS: ; 5S Fifth sprite (not displayed) detected. Value in FS* is valid. ; INT Set at each screen update, used for interrupts. ; +#IF (TMSMODE == TMSMODE_RCV9958) TMS_INIT9918: + .DB $04 ; REG 0 - NO EXTERNAL VID, SET M4 = 1 +TMS_INIT9918_REG_1: + .DB $50 ; REG 1 - ENABLE SCREEN, SET MODE 1 + .DB $03 ; REG 2 - PATTERN NAME TABLE := 0 + .DB $00 ; REG 3 - NO COLOR TABLE + .DB $02 ; REG 4 - SET PATTERN GENERATOR TABLE TO (TMS_FNTVADDR -> $1000) + .DB $00 ; REG 5 - SPRITE ATTRIBUTE IRRELEVANT + .DB $00 ; REG 6 - NO SPRITE GENERATOR TABLE + .DB $F0 ; REG 7 - WHITE ON BLACK + + .DB $88 ; REG 8 - COLOUR BUS INPUT, DRAM 64K + .DB $00 ; REG 9 + .DB $00 ; REG 10 - COLOUR TABLE A14-A16 (TMS_FNTVADDR - $1000) + +#ELSE ; TMS REGISTER SET .DB $00 ; REG 0 - NO EXTERNAL VID TMS_INIT9918_REG_1: .DB $50 ; REG 1 - ENABLE SCREEN, SET MODE 1 .DB $00 ; REG 2 - PATTERN NAME TABLE := 0 .DB $00 ; REG 3 - NO COLOR TABLE - .DB $01 ; REG 4 - SET PATTERN GENERATOR TABLE TO $800 + .DB $01 ; REG 4 - SET PATTERN GENERATOR TABLE TO (TMS_FNTVADDR -> $0800) .DB $00 ; REG 5 - SPRITE ATTRIBUTE IRRELEVANT .DB $00 ; REG 6 - NO SPRITE GENERATOR TABLE .DB $F0 ; REG 7 - WHITE ON BLACK +#ENDIF ; TMS_INIT9918LEN .EQU $ - TMS_INIT9918 ; @@ -909,6 +947,10 @@ TMS_INIT9918LEN .EQU $ - TMS_INIT9918 TMS_DCNTL .DB $00 ; SAVE Z180 DCNTL AS NEEDED #ENDIF +#IF (TMSMODE == TMSMODE_RCV9958) + .ECHO "V9958 instance data occupies " +#ELSE .ECHO "TMS instance data occupies " +#ENDIF .ECHO $ - TMS_IDAT .ECHO " bytes\n" From 53d4f657af84f9d1cbc8b711dae4a48a0c09da6e Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Sat, 22 May 2021 15:57:54 +1000 Subject: [PATCH 10/18] V9958/KEYBOARD: Added disabled entries in RCZ80_std.asm for the V9958, MSX-KEYBOARD and RP5C01 RTC modules --- Source/HBIOS/Config/RCZ80_std.asm | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Source/HBIOS/Config/RCZ80_std.asm b/Source/HBIOS/Config/RCZ80_std.asm index c0380d6b..efd68211 100644 --- a/Source/HBIOS/Config/RCZ80_std.asm +++ b/Source/HBIOS/Config/RCZ80_std.asm @@ -45,3 +45,14 @@ IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) ; PRPENABLE .SET FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) + + +TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918/V9958 VIDEO/KBD DRIVER (TMS.ASM) +TMSMODE .SET TMSMODE_RCV9958 ; TMS: DRIVER MODE: TMSMODE_[RC/RCV9958] +TMSTIMENABLE .SET FALSE ; MS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) +CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP +VDAEMU .SET EMUTYP_TTY ; VDA EMULATION: EMUTYP_[TTY|ANSI] + +RP5RTCENABLE .SET FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM) + +MSKENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) From 31b09f4ab9f5cedbd6893f8b9dfe3698c98d2dd7 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Mon, 24 May 2021 11:26:10 -0700 Subject: [PATCH 11/18] Update fd.asm - Improve FDC hardware detection. --- Source/HBIOS/fd.asm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Source/HBIOS/fd.asm b/Source/HBIOS/fd.asm index 45ed35a9..f4680b98 100644 --- a/Source/HBIOS/fd.asm +++ b/Source/HBIOS/fd.asm @@ -743,6 +743,8 @@ FD_INIT0: ; DOES NOT ATTEMPT TO DETERMINE THE ACTUAL VARIANT. ; FD_DETECT: + IN A,(FDC_MSR) ; IGNORE FIRST READ + CALL DLY32 ; WAIT A BIT FOR FDC IN A,(FDC_MSR) ; READ MSR CP $80 JR Z,FD_DETECT1 ; $80 IS OK @@ -751,6 +753,7 @@ FD_DETECT: RET ; NOPE, ABORT WITH ZF=NZ ; FD_DETECT1: + CALL DLY32 ; WAIT A BIT FOR FDC IN A,(FDC_MSR) ; READ MSR AGAIN CP $80 RET ; $80 OK, ELSE NOT PRESENT From ef6b9acbb42053f6a3dfcb98419db0362fee124d Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Mon, 24 May 2021 11:36:32 -0700 Subject: [PATCH 12/18] Update tms.asm - Fix minor build issue. --- Source/HBIOS/tms.asm | 1 + 1 file changed, 1 insertion(+) diff --git a/Source/HBIOS/tms.asm b/Source/HBIOS/tms.asm index 44d21d83..48bceabf 100644 --- a/Source/HBIOS/tms.asm +++ b/Source/HBIOS/tms.asm @@ -929,6 +929,7 @@ TMS_INIT9918_REG_1: .DB $00 ; REG 10 - COLOUR TABLE A14-A16 (TMS_FNTVADDR - $1000) #ELSE ; TMS REGISTER SET +TMS_INIT9918: .DB $00 ; REG 0 - NO EXTERNAL VID TMS_INIT9918_REG_1: .DB $50 ; REG 1 - ENABLE SCREEN, SET MODE 1 From b9d1cb12fe33694dfc85ef915c913f3ffc981452 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Wed, 26 May 2021 14:40:30 -0700 Subject: [PATCH 13/18] Misc. Cleanup - No functional changes --- Doc/ChangeLog.txt | 3 ++ Source/HBIOS/Config/RCZ80_std.asm | 14 ++----- Source/HBIOS/cfg_dyno.asm | 10 ++--- Source/HBIOS/cfg_ezz80.asm | 11 +++--- Source/HBIOS/cfg_master.asm | 8 ++-- Source/HBIOS/cfg_mk4.asm | 10 ++--- Source/HBIOS/cfg_n8.asm | 12 +++--- Source/HBIOS/cfg_rcz180.asm | 11 +++--- Source/HBIOS/cfg_rcz280.asm | 15 +++---- Source/HBIOS/cfg_rcz80.asm | 10 ++--- Source/HBIOS/cfg_sbc.asm | 8 ++-- Source/HBIOS/cfg_scz180.asm | 9 +++-- Source/HBIOS/cfg_zeta.asm | 8 +--- Source/HBIOS/cfg_zeta2.asm | 8 +--- Source/HBIOS/hbios.asm | 15 ++++--- Source/HBIOS/hbios.inc | 2 +- Source/HBIOS/{msxkeyb.asm => mky.asm} | 0 Source/HBIOS/tms.asm | 57 ++++++++++++++------------- Source/ver.inc | 2 +- Source/ver.lib | 2 +- 20 files changed, 103 insertions(+), 112 deletions(-) rename Source/HBIOS/{msxkeyb.asm => mky.asm} (100%) diff --git a/Doc/ChangeLog.txt b/Doc/ChangeLog.txt index 0ed87fd8..8c17158f 100644 --- a/Doc/ChangeLog.txt +++ b/Doc/ChangeLog.txt @@ -30,6 +30,9 @@ Version 3.1.1 - J?C: Added FIND application from Jay Cotton - PMS: Preliminary support for I2C-based DS1307 clock - WBW: FD driver auto hardware detect (thanks Alan Cox) +- D?N: Added support for TMS V9958 VDU +- D?N: Added support for MSX keyboard +- D?N: Added support for RP5C01 RTC Version 3.1 ----------- diff --git a/Source/HBIOS/Config/RCZ80_std.asm b/Source/HBIOS/Config/RCZ80_std.asm index efd68211..669bdd3e 100644 --- a/Source/HBIOS/Config/RCZ80_std.asm +++ b/Source/HBIOS/Config/RCZ80_std.asm @@ -36,6 +36,7 @@ SIOENABLE .SET TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) ; TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSTIMENABLE .SET FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) +TMSMODE .SET TMSMODE_RCV9958 ; TMS: DRIVER MODE: TMSMODE_[RC/RCV9958] ; FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] @@ -45,14 +46,7 @@ IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) ; PRPENABLE .SET FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) - - -TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918/V9958 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .SET TMSMODE_RCV9958 ; TMS: DRIVER MODE: TMSMODE_[RC/RCV9958] -TMSTIMENABLE .SET FALSE ; MS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) -CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP -VDAEMU .SET EMUTYP_TTY ; VDA EMULATION: EMUTYP_[TTY|ANSI] - +; RP5RTCENABLE .SET FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM) - -MSKENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) +; +MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) diff --git a/Source/HBIOS/cfg_dyno.asm b/Source/HBIOS/cfg_dyno.asm index 6f19b7e7..639a9e4b 100644 --- a/Source/HBIOS/cfg_dyno.asm +++ b/Source/HBIOS/cfg_dyno.asm @@ -72,6 +72,7 @@ BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +MKYENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) ; DSRTCENABLE .EQU FALSE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) DSRTCMODE .EQU DSRTCMODE_STD ; DSRTC: OPERATING MODE: DSRTC_[STD|MFPIC] @@ -178,13 +179,12 @@ PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP ; UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) ; -AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER +AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 - +; AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 -AYMODE .EQU AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +; SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) - -MSKENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) diff --git a/Source/HBIOS/cfg_ezz80.asm b/Source/HBIOS/cfg_ezz80.asm index 79ab1aac..35aa287c 100644 --- a/Source/HBIOS/cfg_ezz80.asm +++ b/Source/HBIOS/cfg_ezz80.asm @@ -73,6 +73,8 @@ BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +MKYENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) +MKYKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] ; DSRTCENABLE .EQU TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) DSRTCMODE .EQU DSRTCMODE_STD ; DSRTC: OPERATING MODE: DSRTC_[STD|MFPIC] @@ -212,13 +214,12 @@ PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP ; UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) ; -AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER +AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 - +; AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 -AYMODE .EQU AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +; SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) - -MSKENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) diff --git a/Source/HBIOS/cfg_master.asm b/Source/HBIOS/cfg_master.asm index 7de68192..15f4185f 100644 --- a/Source/HBIOS/cfg_master.asm +++ b/Source/HBIOS/cfg_master.asm @@ -104,6 +104,7 @@ PPKTRACE .EQU 1 ; PPK DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) KBDTRACE .EQU 1 ; KBD DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPKKBLOUT .EQU KBD_US ; PPK KEYBOARD LANGUAGE: KBD_[US|DE] KBDKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] +MKYENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) MKYKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] ; DSRTCENABLE .EQU FALSE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) @@ -281,13 +282,12 @@ PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) UFBASE .EQU $0C ; UF: REGISTERS BASE ADR ; -AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER +AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 - +; AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +; SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) - -MSKENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) diff --git a/Source/HBIOS/cfg_mk4.asm b/Source/HBIOS/cfg_mk4.asm index d4e51cfb..7c06ca84 100644 --- a/Source/HBIOS/cfg_mk4.asm +++ b/Source/HBIOS/cfg_mk4.asm @@ -79,6 +79,7 @@ PPKTRACE .EQU 1 ; PPK DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) KBDTRACE .EQU 1 ; KBD DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPKKBLOUT .EQU KBD_US ; PPK KEYBOARD LANGUAGE: KBD_[US|DE] KBDKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] +MKYENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) MKYKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] ; DSRTCENABLE .EQU TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) @@ -213,13 +214,12 @@ PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) UFBASE .EQU $0C ; UF: REGISTERS BASE ADR ; -AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER +AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 - +; AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 -AYMODE .EQU AYMODE_SCG ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +; SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) - -MSKENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) diff --git a/Source/HBIOS/cfg_n8.asm b/Source/HBIOS/cfg_n8.asm index 4b620372..a7fd8cfa 100644 --- a/Source/HBIOS/cfg_n8.asm +++ b/Source/HBIOS/cfg_n8.asm @@ -82,6 +82,7 @@ PPKTRACE .EQU 1 ; PPK DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) KBDTRACE .EQU 1 ; KBD DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPKKBLOUT .EQU KBD_US ; PPK KEYBOARD LANGUAGE: KBD_[US|DE] KBDKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] +MKYENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) MKYKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] ; DSRTCENABLE .EQU TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) @@ -213,13 +214,12 @@ PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) FIFO_BASE .EQU $0C ; UF: REGISTERS BASE ADR ; -AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER +AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 - -AY38910ENABLE .EQU TRUE ; AY: AY-3-8910 / YM2149 SOUND DRIVER +; +AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 -AYMODE .EQU AYMODE_N8 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +; SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) - -MSKENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) diff --git a/Source/HBIOS/cfg_rcz180.asm b/Source/HBIOS/cfg_rcz180.asm index 873d2ea6..efc57567 100644 --- a/Source/HBIOS/cfg_rcz180.asm +++ b/Source/HBIOS/cfg_rcz180.asm @@ -75,6 +75,8 @@ BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +MKYENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) +MKYKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] ; DSRTCENABLE .EQU TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) DSRTCMODE .EQU DSRTCMODE_STD ; DSRTC: OPERATING MODE: DSRTC_[STD|MFPIC] @@ -225,13 +227,12 @@ PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP ; UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) ; -AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER +AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 - +; AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 -AYMODE .EQU AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +; SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) - -MSKENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) diff --git a/Source/HBIOS/cfg_rcz280.asm b/Source/HBIOS/cfg_rcz280.asm index 8d0bb0e5..d6f505f0 100644 --- a/Source/HBIOS/cfg_rcz280.asm +++ b/Source/HBIOS/cfg_rcz280.asm @@ -80,6 +80,8 @@ BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +MKYENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) +MKYKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] ; DSRTCENABLE .EQU TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) DSRTCMODE .EQU DSRTCMODE_STD ; DSRTC: OPERATING MODE: DSRTC_[STD|MFPIC] @@ -241,13 +243,12 @@ PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP ; UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) ; -AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER -SN7CLK .EQU 7372800 / 4 ; DEFAULT TO CPUOSC / 4 - +AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER +SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 +; AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER -AY_CLK .EQU 7372800 / 4 ; DEFAULT TO CPUOSC / 4 -AYMODE .EQU AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 +AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +; SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) - -MSKENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) diff --git a/Source/HBIOS/cfg_rcz80.asm b/Source/HBIOS/cfg_rcz80.asm index 7cf06c0f..7368a2bf 100644 --- a/Source/HBIOS/cfg_rcz80.asm +++ b/Source/HBIOS/cfg_rcz80.asm @@ -74,6 +74,7 @@ BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +MKYENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) MKYKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] ; DSRTCENABLE .EQU TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) @@ -231,13 +232,12 @@ PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP ; UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) ; -AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER +AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 - +; AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 -AYMODE .EQU AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +; SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) - -MSKENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) diff --git a/Source/HBIOS/cfg_sbc.asm b/Source/HBIOS/cfg_sbc.asm index 5f57e0b4..423d37f8 100644 --- a/Source/HBIOS/cfg_sbc.asm +++ b/Source/HBIOS/cfg_sbc.asm @@ -74,6 +74,7 @@ PPKTRACE .EQU 1 ; PPK DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) KBDTRACE .EQU 1 ; KBD DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPKKBLOUT .EQU KBD_US ; PPK KEYBOARD LANGUAGE: KBD_[US|DE] KBDKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] +MKYENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) MKYKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] ; DSRTCENABLE .EQU TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) @@ -214,13 +215,12 @@ PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) UFBASE .EQU $0C ; UF: REGISTERS BASE ADR ; -AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER +AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 ; AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 -AYMODE .EQU AYMODE_SCG ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +; SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) - -MSKENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) diff --git a/Source/HBIOS/cfg_scz180.asm b/Source/HBIOS/cfg_scz180.asm index 883750bf..81a9e06b 100644 --- a/Source/HBIOS/cfg_scz180.asm +++ b/Source/HBIOS/cfg_scz180.asm @@ -70,6 +70,8 @@ BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +MKYENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) +MKYKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] ; DSRTCENABLE .EQU TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) DSRTCMODE .EQU DSRTCMODE_STD ; DSRTC: OPERATING MODE: DSRTC_[STD|MFPIC] @@ -220,13 +222,12 @@ PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP ; UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) ; -AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER +AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 - +; AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 AYMODE .EQU AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +; SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) - -MSKENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) diff --git a/Source/HBIOS/cfg_zeta.asm b/Source/HBIOS/cfg_zeta.asm index 9fcc1fe3..fd8b94a3 100644 --- a/Source/HBIOS/cfg_zeta.asm +++ b/Source/HBIOS/cfg_zeta.asm @@ -62,6 +62,7 @@ BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +MKYENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) ; DSRTCENABLE .EQU TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) DSRTCMODE .EQU DSRTCMODE_STD ; DSRTC: OPERATING MODE: DSRTC_[STD|MFPIC] @@ -155,13 +156,6 @@ PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP ; UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) ; -AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER -SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 - AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER -AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 -AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) - -MSKENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) diff --git a/Source/HBIOS/cfg_zeta2.asm b/Source/HBIOS/cfg_zeta2.asm index 4cdd909f..6271ca31 100644 --- a/Source/HBIOS/cfg_zeta2.asm +++ b/Source/HBIOS/cfg_zeta2.asm @@ -73,6 +73,7 @@ BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +MKYENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) ; DSRTCENABLE .EQU TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) DSRTCMODE .EQU DSRTCMODE_STD ; DSRTC: OPERATING MODE: DSRTC_[STD|MFPIC] @@ -166,13 +167,6 @@ PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP ; UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) ; -AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER -SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 - AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER -AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 -AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) - -MSKENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 72d55f97..cff99f0a 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -4668,12 +4668,12 @@ SIZ_PPK .EQU $ - ORG_PPK .ECHO " bytes.\n" #ENDIF ; -#IF (MSKENABLE) -ORG_MSXKEYB .EQU $ - #INCLUDE "msxkeyb.asm" -SIZ_MSXKEYB .EQU $ - ORG_MSXKEYB - .ECHO "MSXKEYB occupies " - .ECHO SIZ_MSXKEYB +#IF (MKYENABLE) +ORG_MKY .EQU $ + #INCLUDE "mky.asm" +SIZ_MKY .EQU $ - ORG_MKY + .ECHO "MKY occupies " + .ECHO SIZ_MKY .ECHO " bytes.\n" #ENDIF ; @@ -5635,14 +5635,13 @@ PIO_MODE_STR: .TEXT "Output$" ; VIDEO DEVICE STRINGS ; PS_VDSTRREF: - .DW PS_VDVDU, PS_VDCVDU, PS_VDNEC, PS_VDTMS, PS_VDVGA, PS_VDV9958 + .DW PS_VDVDU, PS_VDCVDU, PS_VDNEC, PS_VDTMS, PS_VDVGA ; PS_VDVDU .TEXT "VDU$" PS_VDCVDU .TEXT "CVDU$" PS_VDNEC .TEXT "NEC$" PS_VDTMS .TEXT "TMS$" PS_VDVGA .TEXT "VGA$" -PS_VDV9958 .TEXT "V9958-$" ; ; VIDEO TYPE STRINGS ; diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index ffb6bb9d..897cc8cc 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -200,7 +200,7 @@ VDADEV_CVDU .EQU $10 ; ECB COLOR VDU - MOS 8563 VDADEV_NEC .EQU $20 ; ECB UPD7220 - NEC UPD7220 VDADEV_TMS .EQU $30 ; N8 ONBOARD VDA SUBSYSTEM - TMS 9918 VDADEV_VGA .EQU $40 ; ECB VGA3 - HITACHI HD6445 -VDADEV_V9958 .EQU $50 ; V9958 VDU +;VDADEV_V9958 .EQU $50 ; V9958 VDU ; ; SOUND DEVICE IDS ; diff --git a/Source/HBIOS/msxkeyb.asm b/Source/HBIOS/mky.asm similarity index 100% rename from Source/HBIOS/msxkeyb.asm rename to Source/HBIOS/mky.asm diff --git a/Source/HBIOS/tms.asm b/Source/HBIOS/tms.asm index 48bceabf..87ede8dd 100644 --- a/Source/HBIOS/tms.asm +++ b/Source/HBIOS/tms.asm @@ -3,6 +3,7 @@ ; ; WRITTEN BY: DOUGLAS GOODALL ; UPDATED BY: WAYNE WARTHEN -- 4/7/2013 +; UPDATED BY: DEAN NETHERTON -- 5/26/2021 - V9958 SUPPORT ;====================================================================== ; ; TODO: @@ -19,7 +20,7 @@ TMSCTRL1: .EQU 1 ; CONTROL BITS TMSINTEN: .EQU 5 ; INTERRUPT ENABLE BIT #IF TMSTIMENABLE - .ECHO "TMS/V9958 INTERRUPTS ENABLED\n" + .ECHO "TMS INTERRUPTS ENABLED\n" #ENDIF #IF ((TMSMODE == TMSMODE_RC) | (TMSMODE == TMSMODE_RCV9958)) @@ -93,9 +94,9 @@ TERMENABLE .SET TRUE ; INCLUDE TERMINAL PSEUDODEVICE DRIVER ; TMS_PREINIT: ; DISABLE INTERRUPT GENERATION - LD A, (TMS_INIT9918_REG_1) + LD A, (TMS_INITVDU_REG_1) RES TMSINTEN, A ; RESET INTERRUPT ENABLE BIT - LD (TMS_INIT9918_REG_1), A + LD (TMS_INITVDU_REG_1), A LD C, TMSCTRL1 JP TMS_SET ; @@ -112,11 +113,21 @@ TMS_INIT: LD IY,TMS_IDAT ; POINTER TO INSTANCE DATA ; CALL NEWLINE ; FORMATTING + PRTS("TMS: MODE=$") +#IF (TMSMODE == TMSMODE_SCG) + PRTS("SCG$") +#ENDIF +#IF (TMSMODE == TMSMODE_N8) + PRTS("N8$") +#ENDIF +#IF (TMSMODE == TMSMODE_RC) + PRTS("RC$") +#ENDIF #IF (TMSMODE == TMSMODE_RCV9958) - PRTS("V9958: IO=0x$") -#ELSE - PRTS("TMS: IO=0x$") + PRTS("RC_V9958$") #ENDIF +; + PRTS(" IO=0x$") LD A,TMS_DATREG CALL PRTHEXBYTE CALL TMS_PROBE ; CHECK FOR HW EXISTENCE @@ -134,7 +145,7 @@ TMS_INIT1: #IF (TMSMODE == TMSMODE_N8) CALL PPK_INIT ; INITIALIZE KEYBOARD DRIVER #ELSE -#IF MSKENABLE +#IF MKYENABLE CALL MKY_INIT #ENDIF #ENDIF @@ -144,9 +155,9 @@ TMS_INIT1: LD HL, TMS_TSTINT ; GET INT VECTOR CALL HB_ADDIM1 ; ADD TO IM1 CALL LIST - LD A, (TMS_INIT9918_REG_1) + LD A, (TMS_INITVDU_REG_1) SET TMSINTEN, A ; SET INTERRUPT ENABLE BIT - LD (TMS_INIT9918_REG_1), A + LD (TMS_INITVDU_REG_1), A LD C, TMSCTRL1 CALL TMS_SET #ENDIF @@ -187,7 +198,7 @@ TMS_FNTBL: .DW PPK_FLUSH .DW PPK_READ #ELSE -#IF MSKENABLE +#IF MKYENABLE .DW MKY_STAT .DW MKY_FLUSH .DW MKY_READ @@ -239,11 +250,7 @@ TMS_VDARES1: ; ENTRY POINT TO AVOID TMS_Z180IO RECURSION RET TMS_VDADEV: -#IF (TMSMODE == TMSMODE_RCV9958) - LD D, VDADEV_V9958 -#ELSE LD D,VDADEV_TMS ; D := DEVICE TYPE -#ENDIF LD E,0 ; E := PHYSICAL UNIT IS ALWAYS ZERO LD H,TMSMODE ; H := MODE LD L,TMS_DATREG ; L := BASE I/O ADDRESS @@ -456,8 +463,8 @@ TMS_CRTINIT1: ; ; INITIALIZE VDU REGISTERS LD C,0 ; START WITH REGISTER 0 - LD B,TMS_INIT9918LEN ; NUMBER OF REGISTERS TO INIT - LD HL,TMS_INIT9918 ; HL = POINTER TO THE DEFAULT VALUES + LD B,TMS_INITVDULEN ; NUMBER OF REGISTERS TO INIT + LD HL,TMS_INITVDU ; HL = POINTER TO THE DEFAULT VALUES TMS_CRTINIT2: LD A,(HL) ; GET VALUE CALL TMS_SET ; WRITE IT @@ -837,7 +844,7 @@ TMS_TSTINT: TMS_INTHNDL: -#IF MSKENABLE +#IF MKYENABLE CALL MKY_INT #ENDIF @@ -913,9 +920,9 @@ TMS_PORTS: ; INT Set at each screen update, used for interrupts. ; #IF (TMSMODE == TMSMODE_RCV9958) -TMS_INIT9918: +TMS_INITVDU: .DB $04 ; REG 0 - NO EXTERNAL VID, SET M4 = 1 -TMS_INIT9918_REG_1: +TMS_INITVDU_REG_1: .DB $50 ; REG 1 - ENABLE SCREEN, SET MODE 1 .DB $03 ; REG 2 - PATTERN NAME TABLE := 0 .DB $00 ; REG 3 - NO COLOR TABLE @@ -929,9 +936,9 @@ TMS_INIT9918_REG_1: .DB $00 ; REG 10 - COLOUR TABLE A14-A16 (TMS_FNTVADDR - $1000) #ELSE ; TMS REGISTER SET -TMS_INIT9918: +TMS_INITVDU: .DB $00 ; REG 0 - NO EXTERNAL VID -TMS_INIT9918_REG_1: +TMS_INITVDU_REG_1: .DB $50 ; REG 1 - ENABLE SCREEN, SET MODE 1 .DB $00 ; REG 2 - PATTERN NAME TABLE := 0 .DB $00 ; REG 3 - NO COLOR TABLE @@ -941,17 +948,13 @@ TMS_INIT9918_REG_1: .DB $F0 ; REG 7 - WHITE ON BLACK #ENDIF ; -TMS_INIT9918LEN .EQU $ - TMS_INIT9918 +TMS_INITVDULEN .EQU $ - TMS_INITVDU ; ; #IF (CPUFAM == CPU_Z180) TMS_DCNTL .DB $00 ; SAVE Z180 DCNTL AS NEEDED #ENDIF - -#IF (TMSMODE == TMSMODE_RCV9958) - .ECHO "V9958 instance data occupies " -#ELSE +; .ECHO "TMS instance data occupies " -#ENDIF .ECHO $ - TMS_IDAT .ECHO " bytes\n" diff --git a/Source/ver.inc b/Source/ver.inc index a6c0fe1e..e347547d 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,4 +2,4 @@ #DEFINE RMN 1 #DEFINE RUP 1 #DEFINE RTP 0 -#DEFINE BIOSVER "3.1.1-pre.77" +#DEFINE BIOSVER "3.1.1-pre.78" diff --git a/Source/ver.lib b/Source/ver.lib index e259b3c2..a7aeb093 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 1 rup equ 1 rtp equ 0 biosver macro - db "3.1.1-pre.77" + db "3.1.1-pre.78" endm From c7e4978d4495edc162b62f9cb70656f37791d673 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Mon, 31 May 2021 17:32:39 -0700 Subject: [PATCH 14/18] ZCPRD&J and UNZIPZ4 Contributions from Lars Nelson: - ZCPRD&J has been slightly enhanced and a couple minor bugs fixed. - UNZIPZ4 generally handles modern ZIP compression algorithms. --- Doc/ChangeLog.txt | 2 + Source/Images/d_bp/u0/UNZIP154.COM | Bin 5248 -> 0 bytes Source/Images/d_bp/u0/UNZIP186.COM | Bin 8576 -> 0 bytes Source/Images/d_bp/u0/UNZIPZ4.COM | Bin 8704 -> 8704 bytes Source/Images/d_cpm22/u0/UNZIP154.COM | Bin 5248 -> 0 bytes Source/Images/d_cpm22/u0/UNZIP186.COM | Bin 8576 -> 0 bytes Source/Images/d_cpm22/u0/UNZIPZ4.COM | Bin 8704 -> 8704 bytes Source/Images/d_zsdos/u0/UNZIP154.COM | Bin 5248 -> 0 bytes Source/Images/d_zsdos/u0/UNZIP186.COM | Bin 8576 -> 0 bytes Source/Images/d_zsdos/u0/UNZIPZ4.COM | Bin 8704 -> 8704 bytes Source/ZCPR-DJ/Build.cmd | 2 +- Source/ZCPR-DJ/zcpr.mac | 262 +++++++++++++++----------- Source/ver.inc | 2 +- Source/ver.lib | 2 +- 14 files changed, 154 insertions(+), 116 deletions(-) delete mode 100644 Source/Images/d_bp/u0/UNZIP154.COM delete mode 100644 Source/Images/d_bp/u0/UNZIP186.COM delete mode 100644 Source/Images/d_cpm22/u0/UNZIP154.COM delete mode 100644 Source/Images/d_cpm22/u0/UNZIP186.COM delete mode 100644 Source/Images/d_zsdos/u0/UNZIP154.COM delete mode 100644 Source/Images/d_zsdos/u0/UNZIP186.COM diff --git a/Doc/ChangeLog.txt b/Doc/ChangeLog.txt index 8c17158f..fd951ca1 100644 --- a/Doc/ChangeLog.txt +++ b/Doc/ChangeLog.txt @@ -33,6 +33,8 @@ Version 3.1.1 - D?N: Added support for TMS V9958 VDU - D?N: Added support for MSX keyboard - D?N: Added support for RP5C01 RTC +- L?N: Slightly enhanced ZCPRD&J w/ a couple bug fixes +- L?N: UNZIPZ4 which handles most modern ZIP file compression algorithms Version 3.1 ----------- diff --git a/Source/Images/d_bp/u0/UNZIP154.COM b/Source/Images/d_bp/u0/UNZIP154.COM deleted file mode 100644 index f0572630f7ed298de0b9d21d22ece18683407269..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5248 zcmZu!30xCb8h?|Egb+wfnVCQ-Z%Cyf6icI`jS}n8vfc+OUGRz!VmJ~xY!ortb*;8m zdstW9-P*(2+IA}_Vn7r@MTv2$LGX??*3h*ywODCuTVTIQuaD_nU+0q2F7zurDYbI6+b;>c*-!Gf+x(#kcA`teAI_e zw@39o1z*gX{$~`d(;1jGvRqMwVszU`-O6b8^C+f)B&0|g(}y)wSD;#7gq--1NEItY zqeC*ZXl&XTwftAT3Cv+BlRYuPgbXuuX2do{DdwTbC{7kPn6?)i!~2( zq2*hOOb`l919zIO9Gk4RW#%Qg*i>vQUBLk7IO6gcXUxN87PHk@zO2-QE!O|hy~a)y zDyk2tDr<2&OjEFA@L+tJ)$!=gloT9Zc|m{=vn4$G51O$T z`1TKcJk9=&7LjOx;bRTL2OpP6{7@X|E=48D#2|Kvkl9Wuc8~;vmIkU7mC@R_$V#V% z&-8P=E+9ZjyMPEkpr(DBgm0jNmPpJJ!kE4xm{5xNFlAnnD^8I_ID#s#jMjNbr>2-~ ziBfDM2TC|pB;}knkTKKL%Dyogp}W2w3*_DOLZ&jB#X=|)&a;`yxC$2=%X60?TJex$ zT5c&TFXO6-p%7NC*vrdHjk)C(s~KZdMQ^Iot(NP-EuIQOlSKHNeK=^YSR@3)= z0FB!YXRCiz9O?rzeeuF;lTt9 zF-Os zhS?HPAZMdo<#2(z)zWOom16lpgDa^4_0 zUz%$kT49#Um@1tzoPCyB_Gl%%jLRDqncq+`!?wd1o4 zwd2!;>bZf;vt(dAOS%m4y3KNfM0b>8`iX=liXn)EV-({ap*RDO;*|ud37#RXKTyrM zsS`Uyy?sqK~rUVElvWFN+aE-s2u8#Mr&OZmgvFgy8>+k)x{tJwxHA`h(s0S z*Ko}wV-F*vA9}DVr zKsfG01M!E22EmyF6Q(|5o+-p zL~Mt^=dpMAqZ!uDJ}=2|YGnQvgBZxoKD%1}gRePRe$lm%M9k}eSluj&*~0y1Qo&`e z(q&P)xfDA@99l4Tl*Ea{g6j0}V2i&i4mEg{I}SS5OxaR2UxHNnkA$siv^yPE|1*Jt zwF92!P~hL8n?u?3S(Fn;tm=CMYYYTgQ;8Qs%;9r)DYL=FKO(Ry1L1!UD=Y(yanz-F(XHR|t?- z<@NXadL^Mh?E*m3IIn}>+sGf8h{e4Qp0|;g`e>%tfqHr!$ZJR4y>{eP_o}0DR|OcM z1zuIJDj9Ndd42l%Q1+eld*BN^PMzTOdy{;jKb8R{)3IuyV4_o_U!NADoxZJoqPk!~KfD!!A@WmE36x*W<2cmyz? zXbESYMPBCYD0X0WevEe+@|F|qHVJ!G!cGc@VgdA_7Slvx_cO1{f9?5wmTd1<+hZ$g zu+PPn0BX^z8kfDe04g8E9VPt(?z(%N5GHIC%^p>kzz5;irIH;%J&zg+v=x8rbr5gk z&U6>Y!v~>Y4LH2lK^(#YsHE$EWUmEfFVJnlHelZhy(F4O1Dc&0l|GwtY9w5q>@VT8 zFo*#Tp;z?tD3I`bne$_S!@US5=TJ%V-ew8Vpb$Y?-xw_R2X#Eq7C97&R1>E9)PP!g zM}m>^2lM;skNNqW8bA${tD;YyDy?bN8YvYF`dnvJmMbBb3S^q7z<4vo*eJzPDs);4 zOg6*TmP^H~*F*t*oh_Ak+%ejYp?#Fn<@@m03_^Z_Kr1dNQdJ-zktEMeUf@$D`Ma1m z;i*hr8bROmY0Xqp(uAp66E%CjQkn+GH^4-Kg@U8FHkXpXfuo?M2Nc!^9YBbI%tA_8 znq1Zma_MkZOrq~66jPud$SI@(lZ&Z}_p(;Lzi>a75r_D|_+kK`CXUOl2Fn6D77DbL zflLb(3tGWEPc)aPm;WfY^C24O0=&*;5OVEhOC%C%sL)(jO9h+lq+q%TDYnU%*Qb&# z9R@zP2~HECF2=o0VsBOo=+3I?%lnk6kug9C23-Qg06Zw9I|wCW<07;*l)jc)H@)%; zlmYY>KO^12c1l>=`_eS?4;7Lu3# zP8Rx_K>$|ZW6o#Rj=9=4nhc$L;gdKoOkDvKe&b=G+Z61}M zx%dufGUAmb{?7fiB) zWOPJ2)1lQWfZwelzhYXyZxdStILs7yn*qLE0Ew>np zg7-Q&DI3d7dE9M-V~t&GD=jzWq2rebt%QIRr{02eE28x)kgg)yrC$+E^Ys)u-WpW$@*k4;4*B4+vUKm$dorEr~ntG|K{d$*CI&DXwAb#aG?S* zE+ZZajeZzw(3<$wW8$O2L_&dFF$jsnB%*MkR1m?J@gj*RJ`x}y5}`08MiLZ`q)3LM zkOC&#&V8FYaFMuJ0f#7V3LZ-vO ztPBjQ5QCmZW04WPgqjgSyaZYVpAZltLQF&ua)Kr>kxD#EEaJ>^COLCLp-2=KCKgL1 z;o(wgM1)M%pM#3{X;%*x2mjfD$)4gbHWrWKH2;3ZT#!1_A4=6x4gwOYuoRgT6cc!-0elmragsu755kSe(N&5I(;7T$mJqYZf<(i zFFi8xrdDhnwLor}a%=3Oj?xnI2cBE}(HZT6$-V1jZH2YryMNhJJG^N7{&5#v4OgGN zfB0Wt6|d#u6ZPo&%r!GFwvxtkM{DmLVALmS=I+>f=xo&P zBXv9LcpC8r;lllwBThbkTe@$3rR^!jlqD~G7H4cuPsu;{#@K5wib}2$hjH6>t-RyT zE9>@^#Md4a?Y?#N-J$Ju|Ng)gwtU!q6t#Je;5!G|@aKZpzZm9q5Mx1x? z#FQ)1KUAK7%`~O`*B6ZYr+zWBR$q<|@4A`V&^~tejY$``UP>=M;rZ~_dl$|Z+_sGW z?Xq>)^Bc^cpQ~GRr7T4-!5_yTx^PPPr>;twcXWwx#;0R>Psruc#+Pw~YjEw7teSN; zENRcLfA^O0i^%)e7i@Q3PDIjcnm@lJJ1}I_yd%!fiw-s6wRM4mHAnv* zaq}Sm?``|apULR>rpn&-PITf`!CLZK*&u1|SAQLq_qL&+Shgp-ph9{!^42^3k}Xf{ zMdAB)hOL^gCF=XOUE=ji?h=pn9TQpRXD$B8Z8ohbNh?x)Eh@CW7~9_WW%Bt~vMa90 z&rI@~Z8z%g-@ntid3>Xj>eyVp=-<08TySjhyno`@rIEAl-k9EPZt$414u9ko)sC5* zw*OC8l4X~s#D-V>IEkOOs6sII_?<;J=G-vvxwF~&^omBy^RLwy-7#zP55L!D8=Q7? z$*isRh%@{QX+u59OL!_#IHz&cp%#tw$o{vo4a^!%CG|NcfjYN4GvwQFn81^1hWLV-H6B zV{_YEvc?X-^Uk$O=EhZNd)xV!$K7o2{<+4x#JcuMJWDpdl#^Khqt9M#vu8Nz&TR39 zr3F#_r$>qM=Sc}g|4!5Emc5IAKHpzxeC})!x%_7Md*8LmF3w&nn0Bm&|BNxw{P9oZ zqH|L-EEBKVt%gYjp1s$yFI>)--gx%=QI|$!?mhfT%g%=DtIzJwxZPiy`sm#wM_xU4 z=yd9qn#_-O9e7-rcJ9y?(M2{X>-y}Y=F93K75O!FlZ+>Lu}kK^oov&NXp|m!e{;m~ Q*c-y^O?P-HF%QOn0LHJoq5uE@ diff --git a/Source/Images/d_bp/u0/UNZIP186.COM b/Source/Images/d_bp/u0/UNZIP186.COM deleted file mode 100644 index c750ff5224cc2547a4f1a4fa6ad37bd41c09fc2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8576 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 diff --git a/Source/Images/d_bp/u0/UNZIPZ4.COM b/Source/Images/d_bp/u0/UNZIPZ4.COM index 6b701a70d4984925decfb78c2e64ff7b298e460e..9da369ff7dda1919d27c90d74e498740a763e066 100644 GIT binary patch delta 5887 zcmZu#4|p5JmEYB0%d%vx6wFGt?Ah7HtR*mJae~=O3J`NXFu{B=#RmpLjsz2+F{Gh( z5?gY=UYc@nKq?ac|2qnl2C6{Frz8An6vxIJF$5(zK#C};E4Sb-MJ-BVlF0XVWv*QB zarGr?B4PcUt58=L)*!2|I$mAUe$GFm?F#lq+}qW1{nUL z`I^1{(Gv#wda8uPuj=QVh?uGLT#vk(>X6q{U9y8tqRR9jqAyObNAzWb((8D=v>S7` zQ&DM(=V?2|yn)pn@(-xeIijhAkb|zIxHmBKX1tr`E*Z!2Do~B=+_jhDRaE3ksgD9% zuD$e1v|{Z|x2*orDulv_lCPusUO{b=Eitm$m>ncIR0>cZDgKqMq zmD%x{cW4(nM{ClCq`C~5$wemicZ^}aGi+iHYGeoKZ0}#Qsu>|fy#p#{4fU}T28&}1 zL{qNWJiN63Oe#M)X0gmub0lv4_Fu77%u|64=n6Bzb3Tgv#LE4FXYxGFQFo|2m41;V%X+@i1db!&ZWMdz@1E2Ar3h1E2QbAT*eWhkZ zdn`t1av!)EvjF~wc#LDITCmu)ncl#@(qhr`w&;Q-b>Fu7jyu3_4rV{Z=eBdyz_I|`~*!kKn z?x1^5tCElox2ldq`f%}6&e1C92k?#(6I7bozlW@jgMQd>k zR@vWZO%>Aqw6~$H!u5Ijf`)_VTCqu3(XU9?TRY0E-PW#eS=Xoi4K5WJk}TCQ|GTkY z0f33lq-gh;zgcaajt%f^Of?^0gm`v#XqS6p9<>@gzZ%*#p<_767GZkrKX-edA|G-? z4bjbw`1Y{ecTj_@5Qo-?PZ`=3#D{rgu2s7~;<>y#y1B(Oz>HA&avT;wDM;o}RkXFg zky2y5Q*Lim0kMEp$QR{l_b>Vi%+{cHAje~?P=x%p25bV4Z9<{gMUoYPBY@LSAjyLG zNO=;i^D0zLZF)UeK`r!~TN?jY=#yfNG>##xJ!@C5TZMG|0`g-81!4mcWCS`!E%K>5 z5|TwIfQHsJjTBQYcp)6GW9B-FwLl4iK#xs2(Q*J(CN*lN)~lU%;l)O(zp05i;PI-x z4k7x>E}AfyZT&~`wI9)~^ep0Mm0 z3hzQqz%rCXU!5&l&VIM9lKmrhcd#{Da&Qz9D>#~J3Zs)jn2LQ5ZwWRrTRXi`{`pua z5Dy}o3|g($z^32~N6}C+TbjTWuf`BURpmjocT`3zNLU+YVZ9) zungoyo6j=|c4pYW1nvz2!e_X-2B5c{r3=)X+3isgU7HTXXv5+v7@qx+wX&fZ-TlNm96Zx@71&~v@0p9hu zTq@}LP$@!qm#tcP*G==qt+2d?;{FK0mL3qe8STAA&_kY(whGdN0(r2ULwm@p_9Ti~ zb%pFgJ>hHY<#bP^{gA(Xr}v*Neg2h4Ne)MQ%;6VYhV{3d%rRSfl z0-RffR8qaTg|1DdH;ByOE21MoOjVGWu%Fr4nVG>?CLp!{vj-v$@G(^Z@z1c=f)S}q zPSKVh|Dv+CB5Vy6BPQrL?2X*xLb@&O1xe{KA)9ARRMwl#pUR!GmHz^d$FH(C#~u?{ zQ`URR8-%%(Y)*a*Jni8A&7HQ^vVwlNztZFNA7g6W*sS7?2gEf3c!)ia!+)_h*nEG z9}${dr&2bcfjK&@v=~+7b(stR<`JQW^0qI{@eoe-5&YD(LSBd5u=Bf?0pxN?(ZKVN zP8&+D7W>YLz*B-3e(d|x)jbM+Mo_z-g|haXz`ZOmzZS}eAGPy20KzkZZ?jmY2h&;r<@cE2ci)&_rA0KRZiG&Zrbc)I}dYVV7J+PPiW@O00{XO_RJ znXRElU9w#mjJ+cIwKeQS4z>3M0mMCO_X|QTi0P}@m%5W5Jn9-Sf;oU*v`LAWA+baK zjWjL@<+k)UK?9_9+|&gJ^1rwTUvH@yn~WH>x^RVsn&D;z+d#@=Vy6>bgC$Rk(+3pY z>N`E>m{=8h%mt0Kha%590|i0;o3N>C=sl_f=wo^Af<|(?b7RScPKy`-^{SI)L2qi@ z*pnFG?Wdt{*t(J%c_LOA^jCXhplnm4+F20F+L&3v%b0_p6pYhIUkk&piC#SAmX8Wj z-Yp*&B(oqN6C{(s9dfsFo3!~hgm+GqA+{ljEE_d2P5Yr zFu{{Y^g7E=N zhU)g_z4A$1YB`ekCL{$*ALB`N$s0IQ1s{jxCqAba93f5NTr`PH@)Qn*r9-%@p3->K z?zgb!)!$$^$mrZdyY?5ndbWO`9d>QdoYA{k%or)y1%DUQ8$g@PGggiATb#-9@^5j; zbWrt%LLFqOPx=H8ONVhFi-E2YhNaIiXQs-UKg3Q{KL=I?2p-^47z)TDineO!aWj<- zz@qN;i5{H7S*Y!!@H9#LaMs4wWNk1K6RZEvkS0)#$8>>rbb$#hAI8c3r@W-cr*?jb z8!7qsxZj4sFO}t$$~oLc`h6DN5fOWt7;%)}$-PBz<`FFI$MPq*Bap^pYA?a$9N*sW z{luFellSAz+Rs9DsTb2XQZ|jyv3c`I2q-otg=gprSWhYkdpT%PFpP(!{qYs-f`$8W z$$0Q{uj?uK2!^i;urmz4l0OE9kMZbHmZr-lIlnb!)+-;1|B5{;rr>Z9BG^?=|Np@& zsGR@|uoHZk4P>w~nIE%M`L<2RP__1nB>xV-9idtbk-20lmr)}0=5!r^Y*ukn@@KdM zO!%)h(*srPtdxUmh2LW(@Bzke0o=fAF6s4{2B)QpQ(^!rW=hFM>EuK$GO)vwTGpkv|73)AnZi_R^x^RqkkUmG+9}x> zVvl>rTVQFx&m6~--~=Ma_xNPT<#nuywAOiC-(*N@+*;e?I*FYv;L+h^WKN`qq!aNq zwSLD(b!7u0z8R8>KU~`y+vxYWW+TmHqu*lm!4rCgOiCG>EW+Ib=ZBFI7=e~X^-af0 zXx|7h6_qi|T)x=2k}UBzR>Fhy_zSs|(meOzSuH33t#3GqDs~JVk08;M7;otSB|}Pa z2>d&&MF~#Ezw`sGP>hk6^oCNLj1ATB5w#nVbAu?7}a zXqi%oyPiEpeD&;KNku)Yk_+l%?4NXbWm1FLOpz?EFU(|=ylmnFHhwf%pPy8F?L2GI z-VT0j^qTs7z|6}AezFJ7BW7}}{^*=$Ti|q_{TvXd_F8!#d`pvmt(T2Fsc1Mlr(qIE z$H~ficIJ$;eV*h*=?u|cx(*q9l^$>dtNJ|To_M!^iEqTeihagOv(_PaR5+<2%Sw{1 zw^WjBe21T1FyeR8gBb;8uHrR$EeGPC_))C6A>}~FbKp4A+Tc2&I6YHS4s-&1SHw0N z?w(BWsqMw5@EEk)qb06wah`E#rFIVUQHkQ=LGuihQ^vs4MyN9uCm91xIe89u+0>^k zCcR5Lv=UT+6YRN5$`GOx;AA-I--6(J#5;dIQpugqlj~8WTeOn@z@j12F2VhZ=DxCG?JC7e zVpzlpCC{ACJ6D4)>3e)elY2RSPD4%TqdNH3J$JZ-+8RqOZI;r7Z5)engoj*!A(-d% zQoHEc6h?> z#_FcDL91w<;zR5g-l-gU9^cq8yc%9zkh?J0a>6@Io{xXtz{f7+@kM-OZj$_n%ZSa1 zNixP|kcB+XC0H~mU&w3a9=-{^Gl7eEx*9y2iOd0ym<5*o3vnW(NK1GkW4OAjz#*W> zOW?lA$@OB!MtRe3JL`cy+Kidr@<0e+Ia{^ z5wsVQ$m!&OF^M?h#J^^%wP_}xIpD+^xk#FE0r-(2q$CuW46Zn!Yl$U(3KdZS6+qJ? z-BvxAM0Pk@!_`nbUQh@r@JcA;u{voVpBR0yPTm)<=e|e(EPgHc@@Mgl-1YwrdN#!9 delta 5895 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 diff --git a/Source/Images/d_cpm22/u0/UNZIP154.COM b/Source/Images/d_cpm22/u0/UNZIP154.COM deleted file mode 100644 index f0572630f7ed298de0b9d21d22ece18683407269..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5248 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 Q*c-y^O?P-HF%QOn0LHJoq5uE@ diff --git a/Source/Images/d_cpm22/u0/UNZIP186.COM b/Source/Images/d_cpm22/u0/UNZIP186.COM deleted file mode 100644 index c750ff5224cc2547a4f1a4fa6ad37bd41c09fc2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8576 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 diff --git a/Source/Images/d_cpm22/u0/UNZIPZ4.COM b/Source/Images/d_cpm22/u0/UNZIPZ4.COM index 6b701a70d4984925decfb78c2e64ff7b298e460e..9da369ff7dda1919d27c90d74e498740a763e066 100644 GIT binary patch delta 5887 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 delta 5895 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 diff --git a/Source/Images/d_zsdos/u0/UNZIP154.COM b/Source/Images/d_zsdos/u0/UNZIP154.COM deleted file mode 100644 index f0572630f7ed298de0b9d21d22ece18683407269..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5248 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 Q*c-y^O?P-HF%QOn0LHJoq5uE@ diff --git a/Source/Images/d_zsdos/u0/UNZIP186.COM b/Source/Images/d_zsdos/u0/UNZIP186.COM deleted file mode 100644 index c750ff5224cc2547a4f1a4fa6ad37bd41c09fc2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8576 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 diff --git a/Source/Images/d_zsdos/u0/UNZIPZ4.COM b/Source/Images/d_zsdos/u0/UNZIPZ4.COM index 6b701a70d4984925decfb78c2e64ff7b298e460e..9da369ff7dda1919d27c90d74e498740a763e066 100644 GIT binary patch delta 5887 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 delta 5895 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 diff --git a/Source/ZCPR-DJ/Build.cmd b/Source/ZCPR-DJ/Build.cmd index b9842ca4..b07546ee 100644 --- a/Source/ZCPR-DJ/Build.cmd +++ b/Source/ZCPR-DJ/Build.cmd @@ -11,5 +11,5 @@ set ZXBINDIR=%TOOLS%/cpm/bin/ set ZXLIBDIR=%TOOLS%/cpm/lib/ set ZXINCDIR=%TOOLS%/cpm/include/ -zx M80 -=zcpr +zx M80 -=zcpr/l zx L80 -zcpr,zcpr.bin/n/e \ No newline at end of file diff --git a/Source/ZCPR-DJ/zcpr.mac b/Source/ZCPR-DJ/zcpr.mac index 11709ab6..04b54040 100644 --- a/Source/ZCPR-DJ/zcpr.mac +++ b/Source/ZCPR-DJ/zcpr.mac @@ -1,6 +1,8 @@ - TITLE ZCPR Console Command Processor - Version D&J - SUBTTL Last Modified: 5 March 1994 +; DATE 05/17/21 08:34:00 ; +; TITLE ZCPR Console Command Processor - Version D&J +; SUBTTL Last Modified: 10 August 1997 + ; CP/M Z80 Command Processor Replacement (CPR) Version 1.0 ; CCPZ CREATED AND CUSTOMIZED FOR ARIES-II BY RLC ; FURTHER MODIFIED BY RGF AS V2.0 @@ -66,6 +68,13 @@ ; ; Added PEEK 30 August 1993. ; +; Added CLS 10 August 1997 and fixed two bugs. One caused the system to +; hang if the command to log into another drive was given while logged +; into a drive from which the disk had been removed. The other caused +; a warm boot to return to the prior user area if the new user number +; had been selected using the USER command (although not if the user area +; had been changed using the du: command). +; ;******** Structure Notes ******** ; ; This CPR is divided into a number of major sections. The following @@ -86,39 +95,40 @@ ; ; 3 Utilities ; CRLF PRINTC PRINT PRINTS BELL -; CONOUT BREAK CHKETX ABORT READF -; READ WRITE DEFDMA DMASET SEARF -; SEARDE SEARN OPENF OPEN CLOSE -; CREATE BDOSFN SUBKIL DELETE TLOGIN -; DLOGIN LOGIN NEWUSR RSTUSR SETUSR -; BDOSEA BDOSJP BDOSBC BDOSDE +; CLS CONOUT BREAK CHKETX ABORT +; READF READ WRITE DEFDMA DMASET +; SEARF SEARDE SEARN OPENF OPEN +; CLOSE CREATE BDOSFN SUBKIL DELETE +; TLOGIN DLOGIN LOGIN NEWUSR RSTUSR +; SETUSR BDOSEA BDOSJP BDOSBC BDOSDE ; ; 4 CPR Utilities ; PROMPT REDBUF CNVBUF UCASE SDELM ; ADVAN SBLANK ADDAH NUMBER A2NUM ; HEXNUM USRNUM ERROR DIRPTR ULOGIN -; SCANER SCANT SCANF CMDSER SETUDB +; SCANER SCANT SCANF CMDSER ; ; 5 CPR-Resident Commands and Functions ; 5A DIR DIRPR PRFN ; 5B ERA ; 5C ERAQ PRNNF ; 5D SAK REPLY -; 5E BELL -; 5F LIST -; 5G TYPE PAGER -; 5H EJECT -; 5I SAVE -; 5J REN -; 5K USER SUSER -; 5L DFU -; 5M SCL -; 5N PEEK -; 5O POKE -; 5P JUMP -; 5Q COM -; 5R GO CLLPRG ERRLOG ERRJMP -; 5S GET MEMLD PRNLE +; 5E CLS +; 5F BELL +; 5G LIST +; 5H TYPE PAGER +; 5I EJECT +; 5J SAVE +; 5K REN +; 5L USER SUSER +; 5M DFU +; 5N SCL +; 5O PEEK +; 5P POKE +; 5Q JUMP +; 5R COM UPDATE +; 5S GO CLLPRG ERRLOG ERRJMP +; 5T GET MEMLD PRNLE ; BIOS BOOT ; ; @@ -148,8 +158,8 @@ REL EQU FALSE ;SET TO TRUE FOR MOVCPM INTEGRATION ;LEAVE ALL FALSE FOR SYSGEN IMAGE ; BASE EQU 0 ;BASE OF CP/M SYSTEM -;P2DOS EQU 0E400H ;BASE OF BDOS/P2DOS -P2DOS EQU 0D800H ;BASE OF BDOS/P2DOS +;P2DOS EQU 0E400H ;BASE OF BDOS/P2DOS (original) +P2DOS EQU 0D800H ;BASE OF BDOS/P2DOS (Retro-Brew) ZCPRSZ EQU 00800H ;SIZE OF ZCPR P2DOSSZ EQU 00E00H ;SIZE OF P2DOS BIOS EQU P2DOS+P2DOSSZ ;BASE OF BIOS @@ -244,7 +254,7 @@ SOFLG EQU 'S' ;LIST $SYS ONLY ; ; List and Type command customization equates ; -NLINES EQU 20 ;NUMBER OF LINES ON CRT PAGE +NLINES EQU 22 ;NUMBER OF LINES ON CRT PAGE NLINEP EQU 60 ;NUMBER OF LINES ON LIST DEVICE FFKILL EQU TRUE ;TRUE SUPPRESSES FF UNTIL FIRST CHARACTER PGDFLG EQU 'P' ;TYPE AND LIST COMMAND DEFAULT TOGGLE @@ -255,14 +265,17 @@ NOSTAT EQU FALSE ;SET TO TRUE IF BIOS LISTST NOT IMPLEMENTED BUFLEN EQU 80 ;SIZE OF COMMAND INPUT BUFFER MAXUSR EQU 15 ;MAXIMUM USER NUMBER ACCESSIBLE DEFUSR EQU 0 ;DEFAULT USER NUMBER FOR COM FILES +DEFDRV EQU 'A' ;DEFAULT DRIVE FOR COM FILES SPRMPT EQU '$' ;CPR PROMPT INDICATING SUBMIT COMMAND -COMCHR EQU ';' ;BEGIN COMMENT CHARACTER +COMCHR EQU '%' ;BEGIN COMMENT CHARACTER CMDCHR EQU ';' ;BEGIN NEXT COMMAND CHARACTER NUMBASE EQU 'H' ;CHARACTER USED TO SPECIFY HEXIDECIMAL BASE RECFLG EQU 'R' ;CHARACTER FOR SAVE COMMAND TO SAVE RECORDS SUPRES EQU TRUE ;TRUE TO SUPPRESS USER NUMBER FOR USER 0 MULTPL EQU TRUE ;TRUE TO ALLOW MULTIPLE COMMANDS ON ONE LINE REBOOT EQU TRUE ;TRUE TO INCLUDE BOOT COMMAND +CLSCHR EQU 1AH ;CHARACTER TO CLEAR TERMINAL SCREEN +ESC EQU 1BH ;VT100 LEAD-IN CHAR. (FOR 'CLS') ; IF TEST CPRMPT EQU '<' ;CPR PROMPT INDICATING TEST MODE @@ -300,7 +313,7 @@ TPA EQU BASE+0100H ;BASE OF TPA IF COMLD OR TEST LD HL,BGNXFR LD DE,CPRLOC - LD BC,ENDLD-CPRLOC + LD BC,ENDLD-BGNXFR LDIR LD BC,(UDFLAG) JP CPRLOC @@ -369,15 +382,26 @@ ENTRY: ; warm boot reloads ZCPR and destroys the contents of the command buffer. ; The multiple command feature may be turned off with the SCL command. ; -MBUFF: DEFB BUFLEN ;MAXIMUM BUFFER LENGTH +;MBUFF: DEFB BUFLEN ;MAXIMUM BUFFER LENGTH +MBUFF: DEFB BUFEND-CIBUFF ;MAXIMUM BUFFER LENGTH CBUFF: DEFB 0 ;NUMBER OF CHARACTERS IN COMMAND LINE -CIBUFF: DEFB ' ' ;DEFAULT (COLD BOOT) COMMAND - DEFB 0 ;COMMAND STRING TERMINATOR - DEFB ' ZCPR-D&J of 5 March 1994 ' - DEFB 0 ;TERMINATOR FOR DUMP IDENTIFICATION - DEFS BUFLEN-($-CIBUFF)+1 - DEFW 0 ;SENTINEL FOR STACK END - DEFS 24 ;STACK AREA +CIBUFF: DB ' ' ;DEFAULT (COLD BOOT) COMMAND 13 + DEFB 0 ;COMMAND STRING TERMINATOR 14 + DEFB ' ZCPR-D&J of 17 May 2021 ' ;44 + DEFB 0 ;TERMINATOR FOR DUMP IDENTIFICATION 45 +; DEFS BUFLEN-($-CIBUFF)+1 + db 0,0,0,0,0,0,0,0 ;53 + db 0,0,0,0,0,0,0,0 ;61 + db 0,0,0,0,0,0,0,0 ;69 + db 0,0,0,0,0,0,0,0 ;77 + db 0,0,0,0,0,0,0,0 ;85 + db 0,0,0,0,0,0,0,0 ;93 + db 0,0,0,0,0,0,0,0 ;101 + db 0,0,0,0,0,0,0,0 ;109 +BUFEND EQU $ +; DEFW 0 ;SENTINEL FOR STACK END + db 0,0 +; DEFS 24 ;STACK AREA STACK EQU $ ;TOP OF STACK ; ; SUBMIT FILE CONTROL BLOCK @@ -394,22 +418,23 @@ SUBCR EQU SUBDN+32 ;CURRENT RECORD NUMBER ; ; COMMAND FILE CONTROL BLOCK ; -FCBDN: DEFS 1 ;DISK DRIVE -FCBFN: DEFS 8 ;FILE NAME -FCBFT: DEFS 3 ;FILE TYPE -FCBEX: DEFS 1 ;EXTENT NUMBER -FCBS1: DEFS 1 ;S1 -FCBS2: DEFS 1 ;S2 -FCBRC: DEFS 1 ;RECORD COUNT -FCBDM: DEFS 16 ;DISK GROUP MAP +FCBDN: db 0 ;DISK DRIVE +FCBFN: db 0,0,0,0,0,0,0,0 ;FILE NAME +FCBFT: db 0,0,0 ;FILE TYPE +FCBEX: db 0 ;EXTENT NUMBER +FCBS1: db 0 ;S1 +FCBS2: db 0 ;S2 +FCBRC: db 0 ;RECORD COUNT +FCBDM: db 0,0,0,0,0,0,0,0 ;DISK GROUP MAP + db 0,0,0,0,0,0,0,0 FCBCR: DEFS 1 ;CURRENT RECORD NUMBER ; ; Type and List Variables ; -CHRCNT: DEFS 1 ;CHARACTER COUNT FOR TYPE AND LIST -LNCNT: DEFS 1 ;LINE COUNT FOR TYPE AND LIST -TYPLST: DEFS 1 ;FLAG FOR TYPE OR LIST -TABCNT: DEFS 1 ;TAB COUNT FOR TYPE AND LIST +CHRCNT: db 0 ;CHARACTER COUNT FOR TYPE AND LIST +LNCNT: db 0 ;LINE COUNT FOR TYPE AND LIST +TYPLST: db 0 ;FLAG FOR TYPE OR LIST +TABCNT: db 0 ;TAB COUNT FOR TYPE AND LIST SYSTST: DEFB 0 ;LIST SYSTEM FILES IN DIRECTORY FLAG ; ; General Variables @@ -417,7 +442,7 @@ SYSTST: DEFB 0 ;LIST SYSTEM FILES IN DIRECTORY FLAG CIBPTR: DEFW CIBUFF ;POINTER TO COMMAND INPUT BUFFER CIPTR: DEFW CIBUFF ;POINTER TO CURRENT CMD FOR ERROR REPORTING TMPUSR: DEFB 0 ;TEMPORARY USER NUMBER -TDRIVE: DEFB 0 ;DEFAULT DRIVE +TDRIVE: DEFB 0 ;TEMPORARY DRIVE DFUSR: DEFB DEFUSR ;DEFAULT USER LDADR: DEFW TPA ;MEMORY LOAD ADDRESS ; @@ -435,11 +460,13 @@ CMDTBL: DEFW USER DC 'DFU' DEFW DFU - DC 'PAGE' + DC 'FF' ; was 'PAGE' DEFW EJECT DC 'BELL' DEFW RING - DC 'SAK' + DC 'CLS' + DEFW CLS + DC 'WAIT' ; was 'SAK' ("strike any key") DEFW SAK DC 'GO' DEFW GO @@ -459,7 +486,7 @@ CMDTBL: DEFW PEEK DC 'POKE' DEFW POKE -NCMNDS DEFL 17 ;NUMBER OF COMMANDS +NCMNDS DEFL 18 ;NUMBER OF COMMANDS ; IF MULTPL DC 'SCL' @@ -516,14 +543,11 @@ RS3: JR Z,RESTRT ;YES, SKIP REST OF LINE CALL SCANER ;PARSE COMMAND NAME FROM COMMAND LINE JR NZ,RS4 ;ERROR IF NAME CONTAINS A "?" - CALL DEFDMA ;SET TBUFF TO DMA ADDRESS - CALL DLOGIN ;ASSURE PROPER DRIVE - CALL RSTUSR ;ASSURE PROPER USER NUMBER - CALL SETUDB ;SET UD BYTE TO MATCH USER/DRIVE - CALL CMDSER ;SCAN FOR CPR-RESIDENT COMMAND + CALL CMDSER ;SCAN FOR COMMAND ; ; ENTRY POINT FOR CONTINUED SCAN OF COMMAND LINE ; + CALL UPDATE ;UPDATE BDOS/SYSTEM PARAMETERS CALL ADVAN ;GET ANY CHARACTER JR Z,RESTRT ;NONE, END OF LINE LD (CIPTR),DE ;UPDATE START OF LINE IN CASE ERROR @@ -1024,7 +1048,7 @@ SCAN4: LD (HL),B ;SAVE DRIVE LD B,8 ;MAX OF 8 CHARACTERS XOR A ;CLEAR '?' COUNT - EX AF,AF ;AND SAVE + EX AF,AF' ;AND SAVE CALL SCANF ;GET POSSIBLE NAME CALL SCANT ;AND POSSIBLE TYPE ; @@ -1044,7 +1068,7 @@ SCAN4: ; SCAN COMPLETE -- DE POINTS TO DELIMITER BYTE AFTER TOKEN ; LD (CIBPTR),DE - EX AF,AF ;GET NUMBER OF '?' IN FILENAME.TYP + EX AF,AF' ;GET NUMBER OF '?' IN FILENAME.TYP RET ; ; EXTRACT FILE TYPE FROM POSSIBLE FILENAME.TYP @@ -1069,9 +1093,9 @@ SCAN12: SCAN13: CP '?' ;QUESTION MARK? JR NZ,SCAN14 ;NO, JUST STORE CHARACTER - EX AF,AF ;GET QUESTION MARK COUNT + EX AF,AF' ;GET QUESTION MARK COUNT INC A ;COUNT IT - EX AF,AF ;AND SAVE COUNT + EX AF,AF' ;AND SAVE COUNT SCAN14: INC DE ;POINT TO NEXT CHARACTER IN COMMAND LINE LD (HL),A ;STORE CHARACTER IN FCBDN @@ -1097,15 +1121,6 @@ CMDSER: LD A,(HL) ;LOOK FOR DRIVE SPEC DEC A ;ADJUST FOR LOG IN CALL P,TLOGIN ;LOG IN DRIVE -SETUDB: - LD A,(TMPUSR) ;GET CURRENT USER NUMBER - ADD A,A ;PLACE IT IN HIGH NIBBLE - ADD A,A - ADD A,A - ADD A,A - LD HL,TDRIVE ;ADD DEFAULT DRIVE NUMBER (LOW NIBBLE) - OR (HL) - LD (UDFLAG),A ;UPDATE USER/DRIVE BYTE RET CMS0: OR (HL) ;DRIVE OR USER NUMBER @@ -1125,11 +1140,10 @@ CMS2: LD A,(DE) ;NEXT CHARACTER IN INPUT COMMAND MUST BE CP ' ' JR NZ,CMS4 - LD A,(HL) ;FOUND COMMAND, + LD E,(HL) ;FOUND COMMAND, INC HL ;LOAD ADDRESS, - LD H,(HL) ;AND - LD L,A ;JUMP TO IT - JP (HL) ;COMMAND IS CPR-RESIDENT + LD D,(HL) ;AND + JR CMS6 ;UPDATE SYSTEM DATA AND EXECUTE CMS3: BIT 7,(HL) ;END OF TABLE ENTRY? INC HL @@ -1139,7 +1153,10 @@ CMS4: INC HL DJNZ CMS1 ;NOT TO END OF TABLE YET CMS5: - JP COM ;COMMAND MAY BE DISK-RESIDENT + LD DE,COM ;LOAD DESTINATION AND UPDATE +CMS6: + PUSH DE ;PLACE ROUTINE ADDRESS ON STACK + JP UPDATE ;UPDATE SYSTEM DATA AND EXECUTE ; ;**** Section 5 **** ; CPR-Resident Commands @@ -1411,6 +1428,21 @@ REPL2: RET ; ;Section 5E +;Command: CLS +;Function: To clear screen. +;Forms: +; CLS +; +CLS: +; LD A,CLSCHR ; Load clear screen character +; DEFB 21H ; and skip next instruction + ; If a multi-character string is + ; required to clear screen use: + CALL PRINT + DB ESC,'[2','J'+128 + RET +; +;Section 5F ;Command: BELL ;Function: To ring terminal bell. ;Forms: @@ -1420,7 +1452,7 @@ RING: LD A,BELL ; load bell into A JP CONOUT ; and output it ; -;Section 5F +;Section 5G ;Command: LIST ;Function: To print specified file on list device. ;Forms: @@ -1437,7 +1469,7 @@ LIST: ; JR TYPE1 ; -;Section 5G +;Section 5H ;Command: TYPE ;Function: To display specified file on console. ;Forms: @@ -1560,8 +1592,8 @@ PAGER: PAGE2: JP BDOSJP ; return via bdos ; -;Section 5H -;Command: PAGE +;Section 5I +;Command: FF (was PAGE) ;Function: To eject a page on list device via a form feed. ;Forms: ; PAGE @@ -1579,7 +1611,7 @@ EJECT: LD C,05H ; list output JP BDOS ; output character and return via bdos ; -;Section 5I +;Section 5J ;Command: SAVE ;Function: To save the contents of TPA onto disk as a file. Number of ; pages or records is in decimal. Saved area begins at 100H. @@ -1628,7 +1660,7 @@ SAVE3: SAVE4: JP PRNLE ;PRINT 'NO SPACE' ERROR ; -;Section 5J +;Section 5K ;Command: REN ;Function: To change the name of an existing file. ;Forms: @@ -1670,7 +1702,7 @@ NAMERR: REN2: JP ABORT ; -;Section 5K +;Section 5L ;Command: USER ;Function: To change current user number; new user number is in decimal. ;Forms: @@ -1680,7 +1712,7 @@ USER: CALL USRNUM ;EXTRACT USER NUMBER FROM COMMAND LINE JP NEWUSR ;SET NEW USER NUMBER ; -;Section 5L +;Section 5M ;Command: DFU ;Function: To set the Default User Number for the command/file scanner; new ; default user number is in decimal. @@ -1692,7 +1724,7 @@ DFU: LD (DFUSR),A ;PUT IT AWAY RET ; -;Section 5M +;Section 5N ;Command: SCL ;Function: To force ZCPR to parse only a single command per line; reset ; to multiple command format at the next ^C. @@ -1709,7 +1741,7 @@ SINGLE: ENDIF ; ; -;Section 5N +;Section 5O ;Command: PEEK ;Function: To display hex values beginning at a specified address. ;Forms: @@ -1756,7 +1788,7 @@ PRHEX: JP CONOUT ; go display value ; ; -;Section 5O +;Section 5P ;Command: POKE ;Function: To poke a string of hex values into a set of consecutive addresses. ;Forms: @@ -1777,7 +1809,7 @@ POKE1: JR POKE1 ; go for more ; ; -;Section 5P +;Section 5Q ;Command: JUMP ;Function: To call the program (subroutine) at the specified address ; without loading from disk. @@ -1788,7 +1820,7 @@ JUMP: CALL HEXNUM ;GET LOAD ADDRESS IN HL JR CLLPRG ;PERFORM CALL ; -;Section 5Q +;Section 5R ;Command: COM file processing ;Function: To load the specified COM file from disk and execute it. ;Forms: @@ -1808,7 +1840,7 @@ COM: CALL MEMLD ;LOAD MEMORY WITH FILE SPECIFIED ;(NO RETURN IF ERROR OR TOO BIG) ; -;Section 5R +;Section 5S ;Command: GO ;Function: To call the program in the TPA without loading from disk. ; Same as JUMP 100H, but more convenient, especially when @@ -1869,14 +1901,24 @@ COM3: ; RUN LOADED TRANSIENT PROGRAM ; CALL CRLF ;NEW LINE - CALL DEFDMA ;SET DMA TO 0080 - CALL RSTUSR ;RESET TO PROPER USER NUMBER +UPDATE: + CALL DEFDMA ;SET DMA TO DEFAULT VALUE + CALL DLOGIN ;ASSURE PROPER DRIVE + CALL RSTUSR ;ASSURE PROPER USER NUMBER + LD A,E ;GET CURRENT USER NUMBER + ADD A,A ;PLACE IT IN HIGH NIBBLE + ADD A,A + ADD A,A + ADD A,A + LD HL,TDRIVE ;ADD DEFAULT DRIVE NUMBER (LOW NIBBLE) + OR (HL) + LD (UDFLAG),A ;UPDATE USER/DRIVE BYTE ; -; EXECUTION (CALL) OF PROGRAM (SUBROUTINE) OCCURS HERE +; EXECUTION (CALL) OF PROGRAM/SUBROUTINE/COMMAND OCCURS HERE ; RET ;CALL TRANSIENT ; -;Section 5S +;Section 5T ;Command: GET ;Function: To load the specified file from disk to the specified address ;Forms: @@ -1897,9 +1939,9 @@ MEMLD: LD (LDADR),HL ;SET LOAD ADDRESS ; ; MLA is a reentry point for a non-standard CP/M Modification -; This is the return point when the .COM (or GET) file is not found the -; first time, the Default User is selected for the second attempt -; and Drive A is selected for the final attempt. +; This is the return point when the .COM (or GET) file was not found +; so the Default Drive & User are selected for the final attempt +; to find the file. ; MLA: CALL ULOGIN ;LOG ANY USER @@ -1907,29 +1949,22 @@ MLA: CALL OPENF ;OPEN COMMAND.COM FILE JR NZ,MLA1 ;FILE FOUND - LOAD IT ; -; FILE NOT FOUND - SELECT DEFAULT USER +; FILE NOT FOUND - SELECT DEFAULT COM USER ; - LD A,L ;GET FCB USER - AND A ;DEFAULT USER? - JR NZ,MLA0 ;NO - LD HL,TMPUSR ;CURRENT USER SAME AS DEFAULT? LD A,(DFUSR) ;GET DEFAULT USER - CP (HL) SET 7,A ;MAKE INTO VALID USER NUMBER LD (FCBS1),A ;PUT USER INTO FCB - JR NZ,MLA ;AND TRY AGAIN ; -; FILE NOT FOUND - SELECT DRIVE A IF DEFAULT WAS SOME OTHER DRIVE +; AND SELECT DEFAULT COM DRIVE. IF DEFAULT COM DRIVE ALREADY +; SELECTED, GIVE UP AND PRINT ERROR MESSAGE ; MLA0: - LD A,(TDRIVE) ;DRIVE A DEFAULT? - AND A + LD A,DEFDRV-'@' ;A<= DEFAULT COM DRIVE + LD HL,FCBDN ;POINT TO DRIVE IN FCB + CP (HL) ;THE SAME? JR Z,MLA3 ;YES, ERROR - XOR A - LD HL,FCBDN ;POINT AT DRIVE IN FCB - OR (HL) ;DRIVE ALREADY SPECIFIED? - LD (HL),1 ;SELECT DRIVE A - JR Z,MLA ;NO, GO GIVE IT A TRY + LD (HL),A ;PUT DEFAULT COM DRIVE IN FCB + JR MLA ;GO GIVE IT A TRY MLA3: CALL PRNNF ;CAN'T FIND FILE JR PRNLE1 @@ -1962,6 +1997,7 @@ PRNLE1: IF (($-ENTRY) GT ZCPRSZ) *ZCPR too large!!* ENDIF + .DEPHASE ; IF TEST LISTST: @@ -1978,4 +2014,4 @@ ENDLD EQU $ END - PUSH HL ;SAVE POI \ No newline at end of file + \ No newline at end of file diff --git a/Source/ver.inc b/Source/ver.inc index e347547d..ce8c0e8f 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,4 +2,4 @@ #DEFINE RMN 1 #DEFINE RUP 1 #DEFINE RTP 0 -#DEFINE BIOSVER "3.1.1-pre.78" +#DEFINE BIOSVER "3.1.1-pre.79" diff --git a/Source/ver.lib b/Source/ver.lib index a7aeb093..14085a15 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 1 rup equ 1 rtp equ 0 biosver macro - db "3.1.1-pre.78" + db "3.1.1-pre.79" endm From 8e4ea799af252db359da2bf31e582412aad3bd23 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Tue, 1 Jun 2021 15:44:16 -0700 Subject: [PATCH 15/18] FDC Detection Improvement - Some FDC modules startup with the FDC reset signal active. This fix ensures that reset is not asserted when FDC hardware prove is performed. --- Source/HBIOS/fd.asm | 13 ++++++++++--- Source/ver.inc | 2 +- Source/ver.lib | 2 +- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/Source/HBIOS/fd.asm b/Source/HBIOS/fd.asm index f4680b98..f2470378 100644 --- a/Source/HBIOS/fd.asm +++ b/Source/HBIOS/fd.asm @@ -743,9 +743,14 @@ FD_INIT0: ; DOES NOT ATTEMPT TO DETERMINE THE ACTUAL VARIANT. ; FD_DETECT: - IN A,(FDC_MSR) ; IGNORE FIRST READ - CALL DLY32 ; WAIT A BIT FOR FDC + ; BLINDLY RESET FDC (WHICH MAY OR MAY NOT EXIST) + LD A,DOR_INIT ; MAKE SURE INITIAL DOR VALUE IS SETUP + LD (FST_DOR),A ; AND PUT IN SHADOW REGISTER + CALL FC_RESETFDC ; RESET FDC + IN A,(FDC_MSR) ; READ MSR + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* CP $80 JR Z,FD_DETECT1 ; $80 IS OK CP $D0 @@ -755,6 +760,8 @@ FD_DETECT: FD_DETECT1: CALL DLY32 ; WAIT A BIT FOR FDC IN A,(FDC_MSR) ; READ MSR AGAIN + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* CP $80 RET ; $80 OK, ELSE NOT PRESENT ; @@ -1312,7 +1319,7 @@ FC_SETUPSPECIFY: ; ; SET FST_DOR ; -FC_SETDOR +FC_SETDOR: LD (FST_DOR),A OUT (FDC_DOR),A #IF (FDTRACE >= 3) diff --git a/Source/ver.inc b/Source/ver.inc index ce8c0e8f..07caab2b 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,4 +2,4 @@ #DEFINE RMN 1 #DEFINE RUP 1 #DEFINE RTP 0 -#DEFINE BIOSVER "3.1.1-pre.79" +#DEFINE BIOSVER "3.1.1-pre.80" diff --git a/Source/ver.lib b/Source/ver.lib index 14085a15..bd153311 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 1 rup equ 1 rtp equ 0 biosver macro - db "3.1.1-pre.79" + db "3.1.1-pre.80" endm From 226c24d66636e453cc27d9033d4b699b6c0ff309 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Wed, 9 Jun 2021 20:01:31 -0700 Subject: [PATCH 16/18] Move KIO Support to Dedicated Module --- Source/HBIOS/hbios.asm | 14 ++++++- Source/HBIOS/kio.asm | 92 ++++++++++++++++++++++++++++++++++++++++++ Source/ver.inc | 2 +- Source/ver.lib | 2 +- 4 files changed, 106 insertions(+), 4 deletions(-) create mode 100644 Source/HBIOS/kio.asm diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index cff99f0a..d7b066c3 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -1588,8 +1588,7 @@ HB_CPU2: #ENDIF ; #IF (KIOENABLE) - LD A,%11111001 ; RESET ALL DEVICES, SET DAISYCHAIN - OUT (KIOBASE+$0E),A ; DO IT + CALL KIO_PREINIT #ENDIF ; #IF (CTCENABLE) @@ -2239,6 +2238,9 @@ HB_PCINITTBLLEN .EQU (($ - HB_PCINITTBL) / 2) ;================================================================================================== ; HB_INITTBL: +#IF (KIOENABLE) + .DW KIO_INIT +#ENDIF #IF (CTCENABLE) .DW CTC_INIT #ENDIF @@ -4794,6 +4796,14 @@ SIZ_UF .EQU $ - ORG_UF .ECHO SIZ_UF .ECHO " bytes.\n" #ENDIF +#IF (KIOENABLE) +ORG_KIO .EQU $ + #INCLUDE "kio.asm" +SIZ_KIO .EQU $ - ORG_KIO + .ECHO "KIO occupies " + .ECHO SIZ_KIO + .ECHO " bytes.\n" +#ENDIF #IF (CTCENABLE) ORG_CTC .EQU $ #INCLUDE "ctc.asm" diff --git a/Source/HBIOS/kio.asm b/Source/HBIOS/kio.asm new file mode 100644 index 00000000..8c7867c7 --- /dev/null +++ b/Source/HBIOS/kio.asm @@ -0,0 +1,92 @@ +;___KIO________________________________________________________________________________________________________________ +; +; Z80 KIO +; +; DISPLAY CONFIGURATION DETAILS +;______________________________________________________________________________________________________________________ +; +; +; +KIO_PIOADAT .EQU KIOBASE + $00 +KIO_PIOACMD .EQU KIOBASE + $01 +KIO_PIOBDAT .EQU KIOBASE + $02 +KIO_PIOBCMD .EQU KIOBASE + $03 +KIO_CTC0 .EQU KIOBASE + $04 +KIO_CTC1 .EQU KIOBASE + $05 +KIO_CTC2 .EQU KIOBASE + $06 +KIO_CTC3 .EQU KIOBASE + $07 +KIO_SIOADAT .EQU KIOBASE + $08 +KIO_SIOACMD .EQU KIOBASE + $09 +KIO_SIOBDAT .EQU KIOBASE + $0A +KIO_SIOBCMD .EQU KIOBASE + $0B +KIO_PIACDAT .EQU KIOBASE + $0C +KIO_PIACCMD .EQU KIOBASE + $0D +KIO_KIOCMD .EQU KIOBASE + $0E +KIO_KIOCMDB .EQU KIOBASE + $0F +; +; +; +KIO_PREINIT: + CALL KIO_DETECT + RET NZ +; + ; RECORD PRESENCE + LD A,$FF + LD (KIO_EXISTS),A + ; INITIALIZE KIO + LD A,%11111001 ; RESET ALL DEVICES, SET DAISYCHAIN + OUT (KIO_KIOCMD),A ; DO IT +; + XOR A + RET +; +; +; +KIO_INIT: + ; ANNOUNCE PORT + CALL NEWLINE ; FORMATTING + PRTS("KIO:$") ; FORMATTING +; + PRTS(" IO=0x$") ; FORMATTING + LD A,KIOBASE ; GET BASE PORT + CALL PRTHEXBYTE ; PRINT BASE PORT +; + LD A,(KIO_EXISTS) + OR A + JR Z,KIO_INIT2 +; + PRTS(" ENABLED$") ; DISPLAY ENABLED + XOR A ; SIGNAL SUCCESS + RET ; DONE +; +KIO_INIT2: + PRTS(" NOT PRESENT$") ; NOT ZERO, H/W NOT PRESENT + OR $FF ; SIGNAL FAILURE + RET ; BAIL OUT +; +; +; +KIO_DETECT: + LD C,KIO_SIOBCMD ; USE SIOB COMMAND PORT + LD B,2 ; SIO REG 2 +; + OUT (C),B + XOR A ; ZERO + OUT (C),A ; WRITE IT + OUT (C),B + IN A,(C) + AND $F0 ; TOP NIBBLE ONLY + RET NZ ; FAIL IF NOT ZERO +; + OUT (C),B + LD A,$FF ; $FF + OUT (C),A ; WRITE IT + OUT (C),B + IN A,(C) + AND $F0 ; TOP NIBBLE ONLY + CP $F0 ; COMPARE + RET ; DONE, Z IF FOUND, NZ IF MISCOMPARE +; +; +; +KIO_EXISTS .DB 0 diff --git a/Source/ver.inc b/Source/ver.inc index 07caab2b..3a709f3a 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,4 +2,4 @@ #DEFINE RMN 1 #DEFINE RUP 1 #DEFINE RTP 0 -#DEFINE BIOSVER "3.1.1-pre.80" +#DEFINE BIOSVER "3.1.1-pre.81" diff --git a/Source/ver.lib b/Source/ver.lib index bd153311..e7006998 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 1 rup equ 1 rtp equ 0 biosver macro - db "3.1.1-pre.80" + db "3.1.1-pre.81" endm From e463959fee431da2de3da962bd70cb0c556ffaed Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Sun, 13 Jun 2021 15:18:08 -0700 Subject: [PATCH 17/18] Minor MKY Driver Enhancements - Allow any system timer to drive MKY interrupt, not just the TMS driver interrupt. - Add a build check to ensure that when MKY is enabled, a system timer is also enabled. --- Source/HBIOS/cfg_master.asm | 2 +- Source/HBIOS/cfg_mk4.asm | 2 +- Source/HBIOS/cfg_n8.asm | 2 +- Source/HBIOS/cfg_rcz180.asm | 2 +- Source/HBIOS/cfg_rcz280.asm | 2 +- Source/HBIOS/cfg_rcz80.asm | 2 +- Source/HBIOS/cfg_sbc.asm | 2 +- Source/HBIOS/cfg_scz180.asm | 2 +- Source/HBIOS/hbios.asm | 4 ++++ Source/HBIOS/mky.asm | 7 ++++++- Source/HBIOS/tms.asm | 6 +++--- Source/ZCPR-DJ/Clean.cmd | 1 + Source/ver.inc | 2 +- Source/ver.lib | 2 +- 14 files changed, 24 insertions(+), 14 deletions(-) diff --git a/Source/HBIOS/cfg_master.asm b/Source/HBIOS/cfg_master.asm index 15f4185f..5119a04f 100644 --- a/Source/HBIOS/cfg_master.asm +++ b/Source/HBIOS/cfg_master.asm @@ -196,7 +196,7 @@ VDUSIZ .EQU V80X25 ; VDU: DISPLAY FORMAT [V80X24|V80X25|V80X30] CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG/N8] +TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG/N8/RC/RCV9958] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43] diff --git a/Source/HBIOS/cfg_mk4.asm b/Source/HBIOS/cfg_mk4.asm index 7c06ca84..55818ad2 100644 --- a/Source/HBIOS/cfg_mk4.asm +++ b/Source/HBIOS/cfg_mk4.asm @@ -130,7 +130,7 @@ VDUSIZ .EQU V80X25 ; VDU: DISPLAY FORMAT [V80X24|V80X25|V80X30] CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_SCG ; TMS: DRIVER MODE: TMSMODE_[SCG/N8] +TMSMODE .EQU TMSMODE_SCG ; TMS: DRIVER MODE: TMSMODE_[SCG/N8/RC/RCV9958] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43] diff --git a/Source/HBIOS/cfg_n8.asm b/Source/HBIOS/cfg_n8.asm index a7fd8cfa..c0162e17 100644 --- a/Source/HBIOS/cfg_n8.asm +++ b/Source/HBIOS/cfg_n8.asm @@ -133,7 +133,7 @@ VDUSIZ .EQU V80X25 ; VDU: DISPLAY FORMAT [V80X24|V80X25|V80X30] CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) TMSENABLE .EQU TRUE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_N8 ; TMS: DRIVER MODE: TMSMODE_[SCG/N8] +TMSMODE .EQU TMSMODE_N8 ; TMS: DRIVER MODE: TMSMODE_[SCG/N8/RC/RCV9958] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43] diff --git a/Source/HBIOS/cfg_rcz180.asm b/Source/HBIOS/cfg_rcz180.asm index efc57567..d61400ef 100644 --- a/Source/HBIOS/cfg_rcz180.asm +++ b/Source/HBIOS/cfg_rcz180.asm @@ -150,7 +150,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_RC ; TMS: DRIVER MODE: TMSMODE_[SCG/N8] +TMSMODE .EQU TMSMODE_RC ; TMS: DRIVER MODE: TMSMODE_[SCG/N8/RC/RCV9958] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) ; diff --git a/Source/HBIOS/cfg_rcz280.asm b/Source/HBIOS/cfg_rcz280.asm index d6f505f0..bab1fb6f 100644 --- a/Source/HBIOS/cfg_rcz280.asm +++ b/Source/HBIOS/cfg_rcz280.asm @@ -166,7 +166,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_RC ; TMS: DRIVER MODE: TMSMODE_[SCG/N8] +TMSMODE .EQU TMSMODE_RC ; TMS: DRIVER MODE: TMSMODE_[SCG/N8/RC/RCV9958] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) ; diff --git a/Source/HBIOS/cfg_rcz80.asm b/Source/HBIOS/cfg_rcz80.asm index 7368a2bf..1ae6e7ff 100644 --- a/Source/HBIOS/cfg_rcz80.asm +++ b/Source/HBIOS/cfg_rcz80.asm @@ -155,7 +155,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_RC ; TMS: DRIVER MODE: TMSMODE_[SCG/N8] +TMSMODE .EQU TMSMODE_RC ; TMS: DRIVER MODE: TMSMODE_[SCG/N8/RC/RCV9958] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) ; diff --git a/Source/HBIOS/cfg_sbc.asm b/Source/HBIOS/cfg_sbc.asm index 423d37f8..2af4528c 100644 --- a/Source/HBIOS/cfg_sbc.asm +++ b/Source/HBIOS/cfg_sbc.asm @@ -132,7 +132,7 @@ VDUSIZ .EQU V80X25 ; VDU: DISPLAY FORMAT [V80X24|V80X25|V80X30] CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_SCG ; TMS: DRIVER MODE: TMSMODE_[SCG/N8] +TMSMODE .EQU TMSMODE_SCG ; TMS: DRIVER MODE: TMSMODE_[SCG/N8/RC/RCV9958] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43] diff --git a/Source/HBIOS/cfg_scz180.asm b/Source/HBIOS/cfg_scz180.asm index 81a9e06b..ec4aa57a 100644 --- a/Source/HBIOS/cfg_scz180.asm +++ b/Source/HBIOS/cfg_scz180.asm @@ -145,7 +145,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_RC ; TMS: DRIVER MODE: TMSMODE_[SCG/N8] +TMSMODE .EQU TMSMODE_RC ; TMS: DRIVER MODE: TMSMODE_[SCG/N8/RC/RCV9958] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) ; diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index d7b066c3..e038cac3 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -3757,6 +3757,10 @@ HB_TICK1: ; PULSE WATCHDOG OUT (WDOGIO),A ; VALUE IS IRRELEVANT #ENDIF +; +#IF MKYENABLE + CALL MKY_INT +#ENDIF ; OR $FF ; NZ SET TO INDICATE INT HANDLED RET diff --git a/Source/HBIOS/mky.asm b/Source/HBIOS/mky.asm index 847d3557..0a86dd16 100644 --- a/Source/HBIOS/mky.asm +++ b/Source/HBIOS/mky.asm @@ -9,7 +9,7 @@ ; THIS DRIVER CAN BE ACTIVED WITHIN THE TMS VIDEO DRIVER ; ADD THE OPTION TO YOUR BUILD CONFIGURATION TO ACTIVATE THE KEYBOARD ; DRIVER: -; MSKENABLE .SET TRUE +; MKYENABLE .SET TRUE ; ;====================================================================== ; @@ -18,6 +18,11 @@ ; BACKSPACE DOES NOT AUTO-REPEAT ; AUTO DETECT PPI ; +#IF (SYSTIM == TM_NONE) + .ECHO "*** ERROR: MKY REQUIRES SYSTEM TIMER -- NONE CONFIGURED!!!\n" + !!! ; FORCE AN ASSEMBLY ERROR +#ENDIF +; ;====================================================================== ; DRIVER - CONSTANTS ;====================================================================== diff --git a/Source/HBIOS/tms.asm b/Source/HBIOS/tms.asm index 87ede8dd..dcacd838 100644 --- a/Source/HBIOS/tms.asm +++ b/Source/HBIOS/tms.asm @@ -844,9 +844,9 @@ TMS_TSTINT: TMS_INTHNDL: -#IF MKYENABLE - CALL MKY_INT -#ENDIF +;#IF MKYENABLE +; CALL MKY_INT +;#ENDIF CALL HB_TIMINT ; RETURN NZ - HANDLED OR $FF diff --git a/Source/ZCPR-DJ/Clean.cmd b/Source/ZCPR-DJ/Clean.cmd index 53fa501a..9a57c248 100644 --- a/Source/ZCPR-DJ/Clean.cmd +++ b/Source/ZCPR-DJ/Clean.cmd @@ -4,3 +4,4 @@ setlocal if exist *.bin del *.bin if exist *.lst del *.lst if exist *.rel del *.rel +if exist *.prn del *.prn diff --git a/Source/ver.inc b/Source/ver.inc index 3a709f3a..a7c448fd 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,4 +2,4 @@ #DEFINE RMN 1 #DEFINE RUP 1 #DEFINE RTP 0 -#DEFINE BIOSVER "3.1.1-pre.81" +#DEFINE BIOSVER "3.1.1-pre.82" diff --git a/Source/ver.lib b/Source/ver.lib index e7006998..dc13c2c4 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 1 rup equ 1 rtp equ 0 biosver macro - db "3.1.1-pre.81" + db "3.1.1-pre.82" endm From 86e55f796808921051c55efabdcdb2c0b1d05d4f Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Mon, 21 Jun 2021 13:28:56 -0700 Subject: [PATCH 18/18] Preliminary Support for MBC - Added new memory manager to support Andrew Lynch's MBC system. --- Doc/ChangeLog.txt | 1 + Source/HBIOS/Config/SBC_mbc.asm | 33 +++++++++++++++++++++++++++++++ Source/HBIOS/Makefile | 3 ++- Source/HBIOS/cfg_dyno.asm | 4 ++-- Source/HBIOS/cfg_ezz80.asm | 4 ++-- Source/HBIOS/cfg_master.asm | 4 ++-- Source/HBIOS/cfg_mk4.asm | 4 ++-- Source/HBIOS/cfg_n8.asm | 4 ++-- Source/HBIOS/cfg_rcz180.asm | 4 ++-- Source/HBIOS/cfg_rcz280.asm | 4 ++-- Source/HBIOS/cfg_rcz80.asm | 4 ++-- Source/HBIOS/cfg_sbc.asm | 4 ++-- Source/HBIOS/cfg_scz180.asm | 4 ++-- Source/HBIOS/cfg_una.asm | 2 +- Source/HBIOS/cfg_zeta.asm | 4 ++-- Source/HBIOS/cfg_zeta2.asm | 4 ++-- Source/HBIOS/hbios.asm | 35 +++++++++++++++++++++++++++++++-- Source/HBIOS/std.asm | 1 + Source/HBIOS/tms.asm | 6 ++++-- Source/ver.inc | 2 +- Source/ver.lib | 2 +- 21 files changed, 101 insertions(+), 32 deletions(-) create mode 100644 Source/HBIOS/Config/SBC_mbc.asm diff --git a/Doc/ChangeLog.txt b/Doc/ChangeLog.txt index fd951ca1..4c990851 100644 --- a/Doc/ChangeLog.txt +++ b/Doc/ChangeLog.txt @@ -35,6 +35,7 @@ Version 3.1.1 - D?N: Added support for RP5C01 RTC - L?N: Slightly enhanced ZCPRD&J w/ a couple bug fixes - L?N: UNZIPZ4 which handles most modern ZIP file compression algorithms +- AJL: Preliminary support for MBC systems Version 3.1 ----------- diff --git a/Source/HBIOS/Config/SBC_mbc.asm b/Source/HBIOS/Config/SBC_mbc.asm new file mode 100644 index 00000000..1baa71aa --- /dev/null +++ b/Source/HBIOS/Config/SBC_mbc.asm @@ -0,0 +1,33 @@ +; +;================================================================================================== +; MBC CONFIGURATION +;================================================================================================== +; +; THE COMPLETE SET OF DEFAULT CONFIGURATION SETTINGS FOR THIS PLATFORM ARE FOUND IN THE +; CFG_.ASM INCLUDED FILE WHICH IS FOUND IN THE PARENT DIRECTORY. THIS FILE CONTAINS +; COMMON CONFIGURATION SETTINGS THAT OVERRIDE THE DEFAULTS. IT IS INTENDED THAT YOU MAKE +; YOUR CUSTOMIZATIONS IN THIS FILE AND JUST INHERIT ALL OTHER SETTINGS FROM THE DEFAULTS. +; EVEN BETTER, YOU CAN MAKE A COPY OF THIS FILE WITH A NAME LIKE _XXX.ASM AND SPECIFY +; YOUR FILE IN THE BUILD PROCESS. +; +; THE SETTINGS BELOW ARE THE SETTINGS THAT ARE MOST COMMONLY MODIFIED FOR THIS PLATFORM. +; MANY OF THEM ARE EQUAL TO THE SETTINGS IN THE INCLUDED FILE, SO THEY DON'T REALLY DO +; ANYTHING AS IS. THEY ARE LISTED HERE TO MAKE IT EASY FOR YOU TO ADJUST THE MOST COMMON +; SETTINGS. +; +; N.B., SINCE THE SETTINGS BELOW ARE REDEFINING VALUES ALREADY SET IN THE INCLUDED FILE, +; TASM INSISTS THAT YOU USE THE .SET OPERATOR AND NOT THE .EQU OPERATOR BELOW. ATTEMPTING +; TO REDEFINE A VALUE WITH .EQU BELOW WILL CAUSE TASM ERRORS! +; +; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO +; DIRECTORIES ABOVE THIS ONE). +; +#DEFINE PLATFORM_NAME "SBC" +#DEFINE BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT +; +#include "cfg_sbc.asm" +; +INTMODE .SET 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) +MEMMGR .SET MM_MBC ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC] +; +PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) diff --git a/Source/HBIOS/Makefile b/Source/HBIOS/Makefile index e9e362a4..d98c460f 100644 --- a/Source/HBIOS/Makefile +++ b/Source/HBIOS/Makefile @@ -22,8 +22,9 @@ else OBJECTS += RCZ80_std.rom RCZ80_std.com RCZ80_std.upd OBJECTS += RCZ80_skz.rom RCZ80_skz.com RCZ80_skz.upd OBJECTS += RCZ80_zrc.rom RCZ80_zrc.com RCZ80_zrc.upd - OBJECTS += SBC_simh.rom SBC_simh.com SBC_simh.upd OBJECTS += SBC_std.rom SBC_std.com SBC_std.upd + OBJECTS += SBC_simh.rom SBC_simh.com SBC_simh.upd + OBJECTS += SBC_mbc.rom SBC_mbc.com SBC_mbc.upd OBJECTS += SCZ180_126.rom SCZ180_126.com SCZ180_126.upd OBJECTS += SCZ180_130.rom SCZ180_130.com SCZ180_130.upd OBJECTS += SCZ180_131.rom SCZ180_131.com SCZ180_131.upd diff --git a/Source/HBIOS/cfg_dyno.asm b/Source/HBIOS/cfg_dyno.asm index 639a9e4b..35aad31c 100644 --- a/Source/HBIOS/cfg_dyno.asm +++ b/Source/HBIOS/cfg_dyno.asm @@ -24,13 +24,13 @@ TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE ; CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ -INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 +INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) RAM_RESERVE .EQU 0 ; RESERVE FIRST N KB OF RAM (USUALLY 0) ROM_RESERVE .EQU 0 ; RESERVE FIRST N KB OR ROM (USUALLY 0) -MEMMGR .EQU MM_Z180 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280] +MEMMGR .EQU MM_Z180 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC] RAMLOC .EQU 19 ; START OF RAM AS POWER OF 2 (2^N) IN PHYSICAL ADDRESS SPACE RAMBIAS .EQU (1 << (RAMLOC - 10)) ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE MPGSEL_0 .EQU $78 ; Z2 MEM MGR BANK 0 PAGE SELECT REG (WRITE ONLY) diff --git a/Source/HBIOS/cfg_ezz80.asm b/Source/HBIOS/cfg_ezz80.asm index 35aa287c..853e2f3f 100644 --- a/Source/HBIOS/cfg_ezz80.asm +++ b/Source/HBIOS/cfg_ezz80.asm @@ -24,13 +24,13 @@ TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE ; CPUOSC .EQU 10000000 ; CPU OSC FREQ IN MHZ -INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 +INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) DEFSERCFG .EQU SER_115200_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) RAM_RESERVE .EQU 0 ; RESERVE FIRST N KB OF RAM (USUALLY 0) ROM_RESERVE .EQU 0 ; RESERVE FIRST N KB OR ROM (USUALLY 0) -MEMMGR .EQU MM_Z2 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280] +MEMMGR .EQU MM_Z2 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC] MPGSEL_0 .EQU $78 ; Z2 MEM MGR BANK 0 PAGE SELECT REG (WRITE ONLY) MPGSEL_1 .EQU $79 ; Z2 MEM MGR BANK 1 PAGE SELECT REG (WRITE ONLY) MPGSEL_2 .EQU $7A ; Z2 MEM MGR BANK 2 PAGE SELECT REG (WRITE ONLY) diff --git a/Source/HBIOS/cfg_master.asm b/Source/HBIOS/cfg_master.asm index 5119a04f..15f4c167 100644 --- a/Source/HBIOS/cfg_master.asm +++ b/Source/HBIOS/cfg_master.asm @@ -21,13 +21,13 @@ TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE ; CPUOSC .EQU 8000000 ; CPU OSC FREQ IN MHZ -INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 +INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) RAM_RESERVE .EQU 0 ; RESERVE FIRST N KB OF RAM (USUALLY 0) ROM_RESERVE .EQU 0 ; RESERVE FIRST N KB OR ROM (USUALLY 0) -MEMMGR .EQU MM_NONE ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280] +MEMMGR .EQU MM_NONE ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC] RAMLOC .EQU 19 ; START OF RAM AS POWER OF 2 (2^N) IN PHYSICAL ADDRESS SPACE RAMBIAS .EQU (1 << (RAMLOC - 10)) ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE MPCL_RAM .EQU $78 ; SBC MEM MGR RAM PAGE SELECT REG (WRITE ONLY) diff --git a/Source/HBIOS/cfg_mk4.asm b/Source/HBIOS/cfg_mk4.asm index 55818ad2..11dee64f 100644 --- a/Source/HBIOS/cfg_mk4.asm +++ b/Source/HBIOS/cfg_mk4.asm @@ -24,13 +24,13 @@ TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE ; CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ -INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 +INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) RAM_RESERVE .EQU 0 ; RESERVE FIRST N KB OF RAM (USUALLY 0) ROM_RESERVE .EQU 0 ; RESERVE FIRST N KB OR ROM (USUALLY 0) -MEMMGR .EQU MM_Z180 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280] +MEMMGR .EQU MM_Z180 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC] RAMLOC .EQU 19 ; START OF RAM AS POWER OF 2 (2^N) IN PHYSICAL ADDRESS SPACE RAMBIAS .EQU (1 << (RAMLOC - 10)) ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE ; diff --git a/Source/HBIOS/cfg_n8.asm b/Source/HBIOS/cfg_n8.asm index c0162e17..85c47a57 100644 --- a/Source/HBIOS/cfg_n8.asm +++ b/Source/HBIOS/cfg_n8.asm @@ -24,13 +24,13 @@ TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE ; CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ -INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 +INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) RAM_RESERVE .EQU 0 ; RESERVE FIRST N KB OF RAM (USUALLY 0) ROM_RESERVE .EQU 0 ; RESERVE FIRST N KB OR ROM (USUALLY 0) -MEMMGR .EQU MM_N8 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280] +MEMMGR .EQU MM_N8 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC] RAMBIAS .EQU 0 ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE RAMLOC .EQU 0 ; START OF RAM AS POWER OF 2 (2^N) IN PHYSICAL ADDRESS SPACE ; diff --git a/Source/HBIOS/cfg_rcz180.asm b/Source/HBIOS/cfg_rcz180.asm index d61400ef..3bfccfcc 100644 --- a/Source/HBIOS/cfg_rcz180.asm +++ b/Source/HBIOS/cfg_rcz180.asm @@ -24,13 +24,13 @@ TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE ; CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ -INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 +INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) DEFSERCFG .EQU SER_115200_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) RAM_RESERVE .EQU 0 ; RESERVE FIRST N KB OF RAM (USUALLY 0) ROM_RESERVE .EQU 0 ; RESERVE FIRST N KB OR ROM (USUALLY 0) -MEMMGR .EQU MM_Z180 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280] +MEMMGR .EQU MM_Z180 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC] RAMLOC .EQU 19 ; START OF RAM AS POWER OF 2 (2^N) IN PHYSICAL ADDRESS SPACE RAMBIAS .EQU (1 << (RAMLOC - 10)) ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE MPGSEL_0 .EQU $78 ; Z2 MEM MGR BANK 0 PAGE SELECT REG (WRITE ONLY) diff --git a/Source/HBIOS/cfg_rcz280.asm b/Source/HBIOS/cfg_rcz280.asm index bab1fb6f..9313f04b 100644 --- a/Source/HBIOS/cfg_rcz280.asm +++ b/Source/HBIOS/cfg_rcz280.asm @@ -24,13 +24,13 @@ TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE ; CPUOSC .EQU 24000000 ; CPU OSC FREQ IN MHZ -INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 +INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) DEFSERCFG .EQU SER_115200_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) RAM_RESERVE .EQU 0 ; RESERVE FIRST N KB OF RAM (USUALLY 0) ROM_RESERVE .EQU 0 ; RESERVE FIRST N KB OR ROM (USUALLY 0) -MEMMGR .EQU MM_Z2 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280] +MEMMGR .EQU MM_Z2 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC] RAMLOC .EQU 19 ; START OF RAM AS POWER OF 2 (2^N) IN PHYSICAL ADDRESS SPACE RAMBIAS .EQU (1 << (RAMLOC - 10)) ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE MPGSEL_0 .EQU $78 ; Z2 MEM MGR BANK 0 PAGE SELECT REG (WRITE ONLY) diff --git a/Source/HBIOS/cfg_rcz80.asm b/Source/HBIOS/cfg_rcz80.asm index 1ae6e7ff..d57b3e13 100644 --- a/Source/HBIOS/cfg_rcz80.asm +++ b/Source/HBIOS/cfg_rcz80.asm @@ -24,13 +24,13 @@ TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE ; CPUOSC .EQU 7372800 ; CPU OSC FREQ IN MHZ -INTMODE .EQU 1 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 +INTMODE .EQU 1 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) DEFSERCFG .EQU SER_115200_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) RAM_RESERVE .EQU 0 ; RESERVE FIRST N KB OF RAM (USUALLY 0) ROM_RESERVE .EQU 0 ; RESERVE FIRST N KB OR ROM (USUALLY 0) -MEMMGR .EQU MM_Z2 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280] +MEMMGR .EQU MM_Z2 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC] MPGSEL_0 .EQU $78 ; Z2 MEM MGR BANK 0 PAGE SELECT REG (WRITE ONLY) MPGSEL_1 .EQU $79 ; Z2 MEM MGR BANK 1 PAGE SELECT REG (WRITE ONLY) MPGSEL_2 .EQU $7A ; Z2 MEM MGR BANK 2 PAGE SELECT REG (WRITE ONLY) diff --git a/Source/HBIOS/cfg_sbc.asm b/Source/HBIOS/cfg_sbc.asm index 2af4528c..6736e21f 100644 --- a/Source/HBIOS/cfg_sbc.asm +++ b/Source/HBIOS/cfg_sbc.asm @@ -24,13 +24,13 @@ TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE ; CPUOSC .EQU 8000000 ; CPU OSC FREQ IN MHZ -INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 +INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) RAM_RESERVE .EQU 0 ; RESERVE FIRST N KB OF RAM (USUALLY 0) ROM_RESERVE .EQU 0 ; RESERVE FIRST N KB OR ROM (USUALLY 0) -MEMMGR .EQU MM_SBC ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280] +MEMMGR .EQU MM_SBC ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC] MPCL_RAM .EQU $78 ; SBC MEM MGR RAM PAGE SELECT REG (WRITE ONLY) MPCL_ROM .EQU $7C ; SBC MEM MGR ROM PAGE SELECT REG (WRITE ONLY) ; diff --git a/Source/HBIOS/cfg_scz180.asm b/Source/HBIOS/cfg_scz180.asm index ec4aa57a..1ccc3846 100644 --- a/Source/HBIOS/cfg_scz180.asm +++ b/Source/HBIOS/cfg_scz180.asm @@ -24,13 +24,13 @@ TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE ; CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ -INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 +INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) DEFSERCFG .EQU SER_115200_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) RAM_RESERVE .EQU 0 ; RESERVE FIRST N KB OF RAM (USUALLY 0) ROM_RESERVE .EQU 0 ; RESERVE FIRST N KB OR ROM (USUALLY 0) -MEMMGR .EQU MM_Z180 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280] +MEMMGR .EQU MM_Z180 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC] RAMLOC .EQU 19 ; START OF RAM AS POWER OF 2 (2^N) IN PHYSICAL ADDRESS SPACE RAMBIAS .EQU (1 << (RAMLOC - 10)) ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE ; diff --git a/Source/HBIOS/cfg_una.asm b/Source/HBIOS/cfg_una.asm index b815f41b..8f589937 100644 --- a/Source/HBIOS/cfg_una.asm +++ b/Source/HBIOS/cfg_una.asm @@ -19,7 +19,7 @@ BIOS .EQU BIOS_UNA ; HARDWARE BIOS: BIOS_[WBW|UNA] BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE ; CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ -INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 +INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) RAM_RESERVE .EQU 0 ; RESERVE FIRST N KB OF RAM (USUALLY 0) diff --git a/Source/HBIOS/cfg_zeta.asm b/Source/HBIOS/cfg_zeta.asm index fd8b94a3..127a24b0 100644 --- a/Source/HBIOS/cfg_zeta.asm +++ b/Source/HBIOS/cfg_zeta.asm @@ -24,13 +24,13 @@ TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE ; CPUOSC .EQU 20000000 ; CPU OSC FREQ IN MHZ -INTMODE .EQU 0 ; INTERRUPT MODE: 0=NONE, 1=MODE 1, 2=MODE 2 +INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) RAM_RESERVE .EQU 0 ; RESERVE FIRST N KB OF RAM (USUALLY 0) ROM_RESERVE .EQU 0 ; RESERVE FIRST N KB OR ROM (USUALLY 0) -MEMMGR .EQU MM_SBC ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280] +MEMMGR .EQU MM_SBC ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC] MPCL_RAM .EQU $78 ; SBC MEM MGR RAM PAGE SELECT REG (WRITE ONLY) MPCL_ROM .EQU $7C ; SBC MEM MGR ROM PAGE SELECT REG (WRITE ONLY) ; diff --git a/Source/HBIOS/cfg_zeta2.asm b/Source/HBIOS/cfg_zeta2.asm index 6271ca31..7bd79fc7 100644 --- a/Source/HBIOS/cfg_zeta2.asm +++ b/Source/HBIOS/cfg_zeta2.asm @@ -24,13 +24,13 @@ TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE ; CPUOSC .EQU 20000000 ; CPU OSC FREQ IN MHZ -INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 +INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) RAM_RESERVE .EQU 0 ; RESERVE FIRST N KB OF RAM (USUALLY 0) ROM_RESERVE .EQU 0 ; RESERVE FIRST N KB OR ROM (USUALLY 0) -MEMMGR .EQU MM_Z2 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280] +MEMMGR .EQU MM_Z2 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC] MPGSEL_0 .EQU $78 ; Z2 MEM MGR BANK 0 PAGE SELECT REG (WRITE ONLY) MPGSEL_1 .EQU $79 ; Z2 MEM MGR BANK 1 PAGE SELECT REG (WRITE ONLY) MPGSEL_2 .EQU $7A ; Z2 MEM MGR BANK 2 PAGE SELECT REG (WRITE ONLY) diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index e038cac3..81761114 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -116,8 +116,6 @@ MODCNT .SET MODCNT + 1 #IF (INTMODE == 3) ; Z280 MODE 3 INTERRUPT HANDLING (INTA, C/T 0, & UART RCVR ENABLED) #DEFINE HB_DI DI -;#DEFINE HB_DI .DB $ED,$77,$7F -;#DEFINE HB_EI EI #DEFINE HB_EI .DB $ED,$7F,$0B #ELSE ; Z280 MODE 1/2 INTERRUPT HANDLING @@ -486,6 +484,39 @@ HBX_ROM: RET ; DONE #ENDIF ; +#IF (MEMMGR == MM_MBC) +; + #IF (INTMODE == 1) + LD (HBX_MMA),A ; SAVE ACCUM + LD A,I ; GET INT CTL REG + HB_DI ; DISABLE INTS + PUSH AF ; SAVE INT CTL REG + LD A,(HBX_MMA) ; RESTORE ACCUM + #ENDIF +; + OR A ; SET FLAGS + JP P,HBX_ROM ; BIT 7 INDICATES RAM + OUT (MPCL_ROM),A ; ENSURE ROM PAGE OUT OF MEMORY BEFORE SWITCH + OUT (MPCL_RAM),A ; SET RAM PAGE SELECTOR + JR HBX_RAMX +HBX_ROM: + OUT (MPCL_RAM),A ; ENSURE RAM PAGE OUT OF MEMORY BEFORE SWITCH + OUT (MPCL_ROM),A ; SET ROM PAGE SELECTOR + +HBX_RAMX: +; + #IF (INTMODE == 1) + POP AF ; RESTORE INT CTL REG + JP PO,$+4 ; WERE INTS DISABLED AT ENTRY? + EI ; *** DO NOT USE HB_EI HERE *** + LD A,(HBX_MMA) ; RESTORE INCOMING ACCUM + #ENDIF +; + RET +; +HBX_MMA .DB 0 ; TEMPORARY STORAGE FOR REG A +#ENDIF +; ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ; Copy Data - Possibly between banks. This resembles CP/M 3, but ; usage of the HL and DE registers is reversed. diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index c8e09bf9..467d5d9f 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -84,6 +84,7 @@ MM_N8 .EQU 3 ; Z180 CUSTOMIZED FOR N8 MEMORY EXTENSIONS MM_Z180 .EQU 4 ; Z180 NATIVE MEMORY MANAGER MM_Z280 .EQU 5 ; Z280 NATIVE MEMORY MANAGER MM_ZRC .EQU 6 ; ZRC BANK SWITCHING +MM_MBC .EQU 7 ; MBC MEMORY MANAGER ; ; BOOT STYLE ; diff --git a/Source/HBIOS/tms.asm b/Source/HBIOS/tms.asm index dcacd838..09345ed4 100644 --- a/Source/HBIOS/tms.asm +++ b/Source/HBIOS/tms.asm @@ -381,8 +381,8 @@ TMS_SET: ; ;---------------------------------------------------------------------- ; SET TMS9918 READ/WRITE ADDRESS -; TMS_WR SETS TMS9918 TO BEGIN WRITING TO ADDRESS SPECIFIED IN HL -; TMS_RD SETS TMS9918 TO BEGIN READING TO ADDRESS SPECIFIED IN HL +; TMS_WR SETS TMS9918 TO BEGIN WRITING AT VDU ADDRESS SPECIFIED IN HL +; TMS_RD SETS TMS9918 TO BEGIN READING AT VDU ADDRESS SPECIFIED IN HL ;---------------------------------------------------------------------- ; TMS_WR: @@ -390,8 +390,10 @@ TMS_WR: ; CLEAR R#14 FOR V9958 XOR A OUT (TMS_CMDREG), A + TMS_IODELAY LD A, $80 | 14 OUT (TMS_CMDREG), A + TMS_IODELAY #ENDIF PUSH HL diff --git a/Source/ver.inc b/Source/ver.inc index a7c448fd..7094aff8 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,4 +2,4 @@ #DEFINE RMN 1 #DEFINE RUP 1 #DEFINE RTP 0 -#DEFINE BIOSVER "3.1.1-pre.82" +#DEFINE BIOSVER "3.1.1-pre.83" diff --git a/Source/ver.lib b/Source/ver.lib index dc13c2c4..245126b1 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 1 rup equ 1 rtp equ 0 biosver macro - db "3.1.1-pre.82" + db "3.1.1-pre.83" endm