From 5d923411895f43d802f4aaa1683287189fb01e2a Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Thu, 5 Dec 2024 20:41:03 +0800 Subject: [PATCH 1/8] PS2 Interrupt driven keyboard for Duo For keyboard interface on I/O Multi board. Default is disabled. Requires interrupt #2 jumper set on I/O Multiboard, which is pin 11-12 in P5. Has limitations around port settings. Do not have a video card on my Duo so have been forcing a video driver to load and testing with PIP CON:=UR2: . Let me know what you think. --- Source/HBIOS/cfg_MASTER.asm | 1 + Source/HBIOS/fv.asm | 6 +- Source/HBIOS/hbios.asm | 4 +- Source/HBIOS/hbios.inc | 2 +- Source/HBIOS/kbd.asm | 83 ++++++------ Source/HBIOS/ps2iface.inc | 246 ++++++++++++++++++++++++++++++++++++ Source/HBIOS/std.asm | 1 + Source/HBIOS/vrc.asm | 4 +- 8 files changed, 293 insertions(+), 54 deletions(-) create mode 100644 Source/HBIOS/ps2iface.inc diff --git a/Source/HBIOS/cfg_MASTER.asm b/Source/HBIOS/cfg_MASTER.asm index 61ac19ae..367a234d 100644 --- a/Source/HBIOS/cfg_MASTER.asm +++ b/Source/HBIOS/cfg_MASTER.asm @@ -64,6 +64,7 @@ CPUSPDCAP .EQU SPD_FIXED ; CPU SPEED CHANGE CAPABILITY SPD_FIXED|SPD_HILO CPUSPDDEF .EQU SPD_HIGH ; CPU SPEED DEFAULT SPD_UNSUP|SPD_HIGH|SPD_LOW CPUOSC .EQU 1000000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) +INTPS2KBD .EQU FALSE ; USE INTERRUPTS FOR PS2 KEYBOARD DEFSERCFG .EQU SER_9600_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) diff --git a/Source/HBIOS/fv.asm b/Source/HBIOS/fv.asm index 57041386..97ff6a82 100644 --- a/Source/HBIOS/fv.asm +++ b/Source/HBIOS/fv.asm @@ -1,6 +1,6 @@ ;====================================================================== ; VIDEO DRIVER FOR FPGA VGA -; http://s100computers.com/My%20System%20Pages/FPGA%20Z80%20SBC/FPGA%20Z80%20SBC.htm +; http://s100computers.com/My%20System%20Pages/FPGA%20Z80%20SBC/FPGA%20Z80%20SBC.htm ; ; WRITTEN BY: WAYNE WARTHEN -- 9/2/2024 ;====================================================================== @@ -36,8 +36,8 @@ FV_CTL .EQU FV_BASE+2 ; VGA CONTROL PORT ; FV_BUFCTL .EQU $08 ; -FV_KBDDATA .EQU $03 -FV_KBDST .EQU $02 +FV_KBDDATA .EQU $03 ; KBD CTLR DATA PORT +FV_KBDST .EQU $02 ; KBD CTLR STATUS/CMD PORT ; FV_ROWS .EQU 40 FV_COLS .EQU 80 diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index d2f8c154..9bad42c7 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -1137,7 +1137,7 @@ HBX_INTSTK .EQU $ ; --- -------------- -------------- -------------- -------------- -------------- ; 0 CTC0A INT1 -+ -+ -+ HCCARCV -+ ; 1 CTC0B INT2 | | | HCCASND | -; 2 CTC0C TIM0 | | IM2 | IM2 NABUKB | IM2 +; 2 CTC0C TIM0 | | IM2 PS2KBD | IM2 NABUKB | IM2 ; 3 CTC0D TIM1 | | INT | INT VDP | INT ; 4 UART0 DMA0 | Z180 UART0 | VEC UART0 | VEC OPTCRD0 | VEC ; 5 UART1 DMA1 | CPU UART1 | GEN UART1 | GEN OPTCRD1 | GEN @@ -2361,7 +2361,7 @@ HB_CPU1: CALL SN76489_PREINIT #ENDIF #IF (DSRTCENABLE) - ; THE DSRTC NEEDS TO BE INITIALIZED IN ORDER TO PERFROM THE + ; THE DSRTC NEEDS TO BE INITIALIZED IN ORDER TO PERFORM THE ; CPU SPEED DETECTION BELOW. CALL DSRTC_PREINIT #ENDIF diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index bac1c903..d355a474 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -347,7 +347,7 @@ NVSW_AUTOBOOT .EQU 3 ; Auto Boot NVRAM Switch ; ; AUTO BOOT MASKS ABOOT_AUTO .EQU %00100000 ; AUTO=1/MANUAL=0 BOOT -ABOOT_TIMEOUT .EQU %00001111 ; MENU TIMEOUT IN SECONDS, 0=IMMEDIAGE +ABOOT_TIMEOUT .EQU %00001111 ; MENU TIMEOUT IN SECONDS, 0=IMMEDIATE ; DEFAULT BOOT MASKS DBOOT_ROM .EQU %10000000 ; ROM=1/DISK=0 FLAG DBOOT_UNIT .EQU %01111111 ; DISK UNIT diff --git a/Source/HBIOS/kbd.asm b/Source/HBIOS/kbd.asm index 75171cb0..0665f3e7 100644 --- a/Source/HBIOS/kbd.asm +++ b/Source/HBIOS/kbd.asm @@ -4,6 +4,13 @@ ; ; ORIGINAL CODE BY DR JAMES MOXHAM ; ROMWBW ADAPTATION BY WAYNE WARTHEN +; INTERUPT DRIVER ADDITION BY PHIL SUMMERS +; +; +; IN DEBUG MODE: +: >>nn SHOWS HEX COMMAND nn BEING WRITTEN TO THE COMMAND PORT +; >nn SHOWS HEX VALUE nn BEING WRITTEN TO THE DATA PORT +; = 2) PUSH AF CALL PC_SPACE @@ -300,7 +291,7 @@ KBD_RESET0: JR NZ,KBD_RESET1 ; GOT A BYTE? IF SO, GET OUT OF LOOP DJNZ KBD_RESET0 ; LOOP TILL COUNTER EXHAUSTED KBD_RESET1: - LD A,B +; LD A,B XOR A ; SIGNAL SUCCESS (RESPONSE IS IGNORED...) RET ; DONE ; @@ -312,7 +303,7 @@ KBD_SETLEDS: LD A,$ED ; SET/RESET LED'S COMMAND CALL KBD_PUTDATA ; SEND THE COMMAND CALL KBD_GETDATA ; READ THE RESPONSE - CP $FA ; MAKE SURE WE GET ACK + CP KBD_ACK ; MAKE SURE WE GET ACK RET NZ ; ABORT IF NO ACK LD A,(KBD_STATE) ; LOAD THE STATE BYTE RRCA ; ROTATE TOGGLE KEY BITS AS NEEDED @@ -333,7 +324,7 @@ KBD_SETRPT: LD A,$F3 ; COMMAND = SET TYPEMATIC RATE/DELAY CALL KBD_PUTDATA ; SEND IT CALL KBD_GETDATA ; GET THE ACK - CP $FA ; MAKE SURE WE GET ACK + CP KBD_ACK ; MAKE SURE WE GET ACK RET NZ ; ABORT IF NO ACK LD A,(KBD_REPEAT) ; LOAD THE CURRENT RATE/DELAY BYTE CALL KBD_PUTDATA ; SEND IT diff --git a/Source/HBIOS/ps2iface.inc b/Source/HBIOS/ps2iface.inc new file mode 100644 index 00000000..73a90916 --- /dev/null +++ b/Source/HBIOS/ps2iface.inc @@ -0,0 +1,246 @@ +;__________________________________________________________________________________________________ +; HARDWARE INTERFACE FOR POLLED AND INTERRUPT DRIVEN PS2 KEYBOARD. +; +; IN POLLED MODE THE KEYBOARD DEVICE IS IDENTIFIED BY THE TABLE POINTED TO BY IY +; IN INTERRUPT MODE THE KEYBOARD DEVICE IS UNKNOWN SO PREDEFINED PORT VALUES ARE USED. +; +; REQUIRES INTERRUPT JUMPER TO BE SET +;__________________________________________________________________________________________________ +; +#IF ((INTMODE == 2) & INTPS2KBD)) + +#IF (TMSENABLE) +KBDPORTD .DB TMS_KBDDATA ; KBD CTLR DATA PORT +KBDPORTS .DB TMS_KBDST ; KBD CTLR STATUS/CMD PORT +#ELSE + +#IF (GDCENABLE) +KBDPORTD .DB GDC_KBDDATA ; KBD CTLR DATA PORT +KBDPORTS .DB GDC_KBDST ; KBD CTLR STATUS/CMD PORT +#ELSE + +#IF (CVDUENABLE) +KBDPORTD .DB CVDU_KBDDATA ; KBD CTLR DATA PORT +KBDPORTS .DB CVDU_KBDST ; KBD CTLR STATUS/CMD PORT +#ELSE + +#IF (VRCENABLE) +KBDPORTD .DB VRC_KBDDATA ; KBD CTLR DATA PORT +KBDPORTS .DB VRC_KBDST ; KBD CTLR STATUS/CMD PORT +#ELSE + +#IF (VGAENABLE) +KBDPORTD .DB VGA_KBDDATA ; KBD CTLR DATA PORT +KBDPORTS .DB VGA_KBDST ; KBD CTLR STATUS/CMD PORT +#ENDIF + +#ENDIF +#ENDIF +#ENDIF +#ENDIF +; +;__________________________________________________________________________________________________ +; KEYBOARD QUEUE FOR INTERRUPTS +;__________________________________________________________________________________________________ +; +; +KBDQSIZ .EQU 16 ; MUST BE POWER OF TWO, <=128 +KBDQGETX .DB 0 ; QUEUE INDEX +KBDQPUTX .DB 0 ; QUEUE INDEX + .DB $55 ; GUARD BYTE FOR DEBUGGING +KBDQ .FILL KBDQSIZ,0 ; CIRCULAR KEYBOARD BUFFER + .DB $AA ; GUARD BYTE FOR DEBUGGING + +;__________________________________________________________________________________________________ +; RESET THE QUEUE TO EMPTY +;__________________________________________________________________________________________________ +; +KBDQINIT: + XOR A + LD (KBDQGETX),A + LD (KBDQPUTX),A + RET +; +;__________________________________________________________________________________________________ +; KEYBOARD INTERRUPT VECTOR +;__________________________________________________________________________________________________ +; +KBD_INT: +; CALL KBDQDBG + LD A,(KBDPORTS) ; READ CONTROLLER STATUS + LD C,A + IN A,(C) + AND 1 + RET Z + LD A,(KBDPORTD) ; GET THE RESPONSE + LD C,A + IN A,(C) +; CALL KBDQPUSH ; SAVE KEYBOARD SCAN CODE +; RET +; +;__________________________________________________________________________________________________ +; ADD A BYTE TO THE KEYBOARD QUEUE +;__________________________________________________________________________________________________ +; +KBDQPUSH: ; ADD A SCAN CODE TO THE QUEUE + PUSH AF + CALL KBDQFULL + JR Z,KBDQISF ; EXIT IF THE QUEUE IS FULL +; + LD HL,KBDQPUTX + LD A,(HL) ; CREATE QUEUE INDEX + AND KBDQSIZ-1 + INC (HL) ; UPDATE INDEX +; + LD HL,KBDQ ; INDEX INTO THE QUEUE + LD B,0 + LD C,A + ADD HL,BC + POP AF + LD (HL),A ; SAVE THE CHARACTER IN THE QUEUE +; CALL KBDQDBG +; + RET +; +KBDQISF:POP AF + RET + +KBDQFULL: ; RETURN Z IF QUEUE IS FULL + CALL KBDQLEN ; RETURN NZ IF STILL SPACE IN QUEUE + SUB KBDQSIZ + RET +#ENDIF +;__________________________________________________________________________________________________ +; KEYBOARD READ +;__________________________________________________________________________________________________ +; +#IF ((INTMODE == 2) & INTPS2KBD)) +; +; RETURN A BYTE TO FROM KEYBOARD QUEUE +; NOTE THE QUEUE INDEX'S NEVER DECREASE IN SIZE. +; +KBD_IN: +KBDQPOP: + CALL KBDQLEN + RET Z ; EXIT IF THE QUEUE IS EMPTY +; + LD HL,KBDQGETX + LD A,(HL) ; CREATE QUEUE INDEX + AND KBDQSIZ-1 + INC (HL) ; UPDATE INDEX +; + LD HL,KBDQ ; INDEX INTO THE QUEUE + LD B,0 + LD C,A + ADD HL,BC + LD A,(HL) ; GET THE CHARACTER FROM THE QUEUE +; LD (HL),B ; DEBUG - CLEAN QUEUE +; + RET +; +#ELSE +; +; RETURN A BYTE FROM THE KEYBOARD PORT +; +KBD_IN: + IN A,(C) ; GET THE DATA VALUE + LD C,(IY+KBD_DAT) ; DATA PORT + EZ80_IO + IN A,(C) ; GET THE DATA VALUE + RET +#ENDIF +; +;__________________________________________________________________________________________________ +; KEYBOARD INPUT STATUS +;__________________________________________________________________________________________________ +; +#IF ((INTMODE == 2) & INTPS2KBD)) +KBD_IST: +KBDQLEN: ; EXIT WITH NUMBER OF CHARACTERS IN QUEUE + LD A,(KBDQPUTX) ; Z STATUS AND ZERO IF NONE + LD HL,KBDQGETX + SUB (HL) + RET +#ELSE +KBD_IST: ; A=0, Z SET FOR NOTHING PENDING, OTHERWISE DATA PENDING + LD C,(IY+KBD_ST) ; STATUS PORT + EZ80_IO + IN A,(C) ; GET STATUS + AND $01 ; ISOLATE INPUT PENDING BIT + RET +#ENDIF +; +;__________________________________________________________________________________________________ +; OUTPUT TO KEYBOARD COMMAND PORT +;__________________________________________________________________________________________________ +; +KBD_CMDOUT: + LD C,(IY+KBD_CMD) ; COMMAND PORT + EZ80_IO + OUT (C),A + RET +;__________________________________________________________________________________________________ +; OUTPUT TO KEYBOARD COMMAND DATA +;__________________________________________________________________________________________________ +; +KBD_DTAOUT: + LD C,(IY+KBD_DAT) ; DATA PORT + EZ80_IO + OUT (C),A + RET +;__________________________________________________________________________________________________ +; KEYBOARD OUTPUT STATUS - A=0, Z SET FOR NOT READY, OTHERWISE READY TO WRITE +;__________________________________________________________________________________________________ +; +KBD_OST: + LD C,(IY+KBD_ST) ; STATUS PORT + EZ80_IO + IN A,(C) ; GET STATUS + AND $02 ; ISOLATE OUTPUT EMPTY BIT + XOR $02 ; FLIP IT FOR APPROPRIATE RETURN VALUES + RET +; +;__________________________________________________________________________________________________ +; DEBUG QUEUE +;__________________________________________________________________________________________________ +; +#IF ((INTMODE == 2) & INTPS2KBD & 0) +KBDQDBG: + PUSH HL + PUSH DE + PUSH BC + PUSH AF + + CALL NEWLINE ; PRINT QUEUE CONTENTS WITH PRE AND POST GUARD BYTES + LD B,KBDQSIZ+2 + LD HL,KBDQ-1 +KBDQPRT: + LD A,(HL) + CALL PRTHEXBYTE + INC HL + DJNZ KBDQPRT + + LD A,' ' ; PRINT QUEUE INDEX + CALL COUT + LD A,(KBDQGETX) + AND KBDQSIZ-1 + CALL PRTHEXBYTE + + LD A,' ' ; PRINT QUEUE INDEX + CALL COUT + LD A,(KBDQPUTX) + AND KBDQSIZ-1 + CALL PRTHEXBYTE + + LD A,' ' ; PRINT # SCAN CODES IN QUEUE + CALL COUT + CALL KBDQLEN + CALL PRTHEXBYTE + CALL NEWLINE + + POP AF + POP BC + POP DE + POP HL + RET +#ENDIF diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index 0e5903c7..cea7dfaa 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -971,6 +971,7 @@ INT_CTC0D .EQU 15 ; ZILOG CTC 0, CHANNEL D ; ; DUO Z80 IM2 INTERRUPTS ; +INT_PS2KB .EQU 2 ; KEYBOARD RECEIVE INT_UART0 .EQU 4 ; UART 0 INT_UART1 .EQU 5 ; UART 1 INT_SIO0 .EQU 8 ; ZILOG SIO 0, CHANNEL A & B diff --git a/Source/HBIOS/vrc.asm b/Source/HBIOS/vrc.asm index 73b748ce..98b12a59 100644 --- a/Source/HBIOS/vrc.asm +++ b/Source/HBIOS/vrc.asm @@ -15,8 +15,8 @@ VRC_BASE .EQU $00 ; FIRST CHAR DATA PORT VRC_FONTBASE .EQU VRC_BASE + $0C ; FIRST FONT PORT VRC_SCROLLIO .EQU $F5 ; SCROLL REG PORT ; -VRC_KBDDATA .EQU $F4 -VRC_KBDST .EQU $F5 +VRC_KBDDATA .EQU $F4 ; KBD CTLR DATA PORT +VRC_KBDST .EQU $F5 ; KBD CTLR STATUS/CMD PORT ; VRC_ROWS .EQU 48 VRC_COLS .EQU 64 From ce98947d0722d81d11b9bb6e579d02d3bba7ffa8 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Thu, 5 Dec 2024 20:50:17 +0800 Subject: [PATCH 2/8] Cleanup --- Source/HBIOS/kbd.asm | 2 +- Source/HBIOS/ps2iface.inc | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Source/HBIOS/kbd.asm b/Source/HBIOS/kbd.asm index 0665f3e7..696935d8 100644 --- a/Source/HBIOS/kbd.asm +++ b/Source/HBIOS/kbd.asm @@ -106,7 +106,7 @@ KBD_INIT: CP $55 ; IS IT THERE? JR Z,KBD_INIT1 ; IF SO, CONTINUE PRTS(" NOT PRESENT$") ; DIAGNOSE PROBLEM -INT_RET:RET ; BAIL OUT + RET ; BAIL OUT ; KBD_INIT1: PRTS(" MODE=$") ; TAG diff --git a/Source/HBIOS/ps2iface.inc b/Source/HBIOS/ps2iface.inc index 73a90916..8d21761d 100644 --- a/Source/HBIOS/ps2iface.inc +++ b/Source/HBIOS/ps2iface.inc @@ -4,7 +4,8 @@ ; IN POLLED MODE THE KEYBOARD DEVICE IS IDENTIFIED BY THE TABLE POINTED TO BY IY ; IN INTERRUPT MODE THE KEYBOARD DEVICE IS UNKNOWN SO PREDEFINED PORT VALUES ARE USED. ; -; REQUIRES INTERRUPT JUMPER TO BE SET +; REQUIRES AN APPROPRIATE INTERRUPT JUMPER TO BE SET. +; CURRENTLY CONFIGURED FOR INT #2 ON DUODYNE WITH I/O MULTI BOARD. ;__________________________________________________________________________________________________ ; #IF ((INTMODE == 2) & INTPS2KBD)) From 64dbf4ff353f4f32d7a8fd99b44ad4c664967f34 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Fri, 6 Dec 2024 05:39:57 +0800 Subject: [PATCH 3/8] EZZ80_IO fixes --- Source/HBIOS/ps2iface.inc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Source/HBIOS/ps2iface.inc b/Source/HBIOS/ps2iface.inc index 8d21761d..2c9a285b 100644 --- a/Source/HBIOS/ps2iface.inc +++ b/Source/HBIOS/ps2iface.inc @@ -70,11 +70,13 @@ KBD_INT: ; CALL KBDQDBG LD A,(KBDPORTS) ; READ CONTROLLER STATUS LD C,A + EZ80_IO IN A,(C) AND 1 RET Z LD A,(KBDPORTD) ; GET THE RESPONSE LD C,A + EZ80_IO IN A,(C) ; CALL KBDQPUSH ; SAVE KEYBOARD SCAN CODE ; RET @@ -144,6 +146,7 @@ KBDQPOP: ; RETURN A BYTE FROM THE KEYBOARD PORT ; KBD_IN: + EZ80_IO IN A,(C) ; GET THE DATA VALUE LD C,(IY+KBD_DAT) ; DATA PORT EZ80_IO From 1a73a9614b1cd4546b47805ade7e5fc4f8bfbe04 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Fri, 6 Dec 2024 19:31:52 +0800 Subject: [PATCH 4/8] Initialize interrupt vector after kbd controller detected --- Source/HBIOS/kbd.asm | 43 ++++++++++++++++++++++++++++++++------- Source/HBIOS/ps2iface.inc | 18 ++++++++-------- 2 files changed, 46 insertions(+), 15 deletions(-) diff --git a/Source/HBIOS/kbd.asm b/Source/HBIOS/kbd.asm index 696935d8..2030e570 100644 --- a/Source/HBIOS/kbd.asm +++ b/Source/HBIOS/kbd.asm @@ -75,11 +75,6 @@ KBD_IDLE .DB 0 ; IDLE COUNT ;__________________________________________________________________________________________________ ; KBD_INIT: -#IF ((INTMODE == 2) & INTPS2KBD) - CALL KBDQINIT ; INITIALIZE QUEUE - LD HL,KBD_INT ; INSTALL VECTOR - LD (IVT(INT_PS2KB)),HL ; IVT INDEX -#ENDIF CALL NEWLINE ; FORMATTING PRTS("KBD: IO=0x$") ; DISPLAY LD A,(IY+KBD_DAT) ; PORT SETTING @@ -101,7 +96,7 @@ KBD_INIT: ; LD A,$AA ; CONTROLLER SELF TEST CALL KBD_PUTCMD ; SEND IT - CALL KBD_GETDATA ; CONTROLLER SHOULD RESPOND WITH $55 (ACK) + CALL KBD_GETDATA_P ; CONTROLLER SHOULD RESPOND WITH $55 (ACK) ; CP $55 ; IS IT THERE? JR Z,KBD_INIT1 ; IF SO, CONTINUE @@ -120,6 +115,12 @@ KBD_INIT1: LD DE,KBD_STR_MODEUNK KBD_INIT2: CALL WRITESTR +; +#IF ((INTMODE == 2) & INTPS2KBD) +; CALL KBDQINIT ; INITIALIZE QUEUE + LD HL,KBD_INT ; INSTALL VECTOR + LD (IVT(INT_PS2KB)),HL ; IVT INDEX +#ENDIF ; LD A,$60 ; SET COMMAND REGISTER CALL KBD_PUTCMD ; SEND IT @@ -244,7 +245,9 @@ KBD_PUTDATA2: ;__________________________________________________________________________________________________ KBD_GETDATA: ; -; GET A RAW DATA BYTE FROM KEYBOARD INTERFACE INTO A WITH TIMEOUT +; GET A RAW DATA BYTE FROM KEYBOARD INTERFACE INTO A WITH TIMEOUT. +; DEPENDING ON ASSEMBLY CONFIGURATION KBD_GETDATA READS A BYTE FROM +; EITHER THE INTERRUPT QUEUE OR FROM THE KEYBOARD CONTROLLER PORT. ; LD B,KBD_WAITTO ; SETUP TO LOOP KBD_GETDATA0: @@ -267,6 +270,32 @@ KBD_GETDATA1: RET ; ;__________________________________________________________________________________________________ +KBD_GETDATA_P: +; +; GET A RAW DATA BYTE FROM KEYBOARD INTERFACE INTO A WITH TIMEOUT. +; KBD_GETDATA_P ALWAYS READS A BYTE FROM THE KEYBOARD CONTROLLER PORT. +; + LD B,KBD_WAITTO ; SETUP TO LOOP +KBD_GETDATA0_P: + CALL KBD_IST_P ; GET INPUT REGISTER STATUS + JR NZ,KBD_GETDATA1_P ; BYTE PENDING, GO GET IT + CALL DELAY ; WAIT A BIT + DJNZ KBD_GETDATA0_P ; LOOP UNTIL COUNTER EXHAUSTED + XOR A ; NO DATA, RETURN ZERO + RET +KBD_GETDATA1_P: + CALL KBD_IN_P ; GET A KEY +#IF (KBDTRACE >= 2) + PUSH AF + CALL PC_SPACE + CALL PC_LT + CALL PRTHEXBYTE + POP AF +#ENDIF + OR A ; SET FLAGS + RET +; +;__________________________________________________________________________________________________ KBD_GETDATAX: ; ; GET A RAW DATA BYTE FROM KEYBOARD INTERFACE INTO A WITH NOTIMEOUT diff --git a/Source/HBIOS/ps2iface.inc b/Source/HBIOS/ps2iface.inc index 2c9a285b..498eda69 100644 --- a/Source/HBIOS/ps2iface.inc +++ b/Source/HBIOS/ps2iface.inc @@ -56,11 +56,11 @@ KBDQ .FILL KBDQSIZ,0 ; CIRCULAR KEYBOARD BUFFER ; RESET THE QUEUE TO EMPTY ;__________________________________________________________________________________________________ ; -KBDQINIT: - XOR A - LD (KBDQGETX),A - LD (KBDQPUTX),A - RET +;KBDQINIT: +; XOR A +; LD (KBDQGETX),A +; LD (KBDQPUTX),A +; RET ; ;__________________________________________________________________________________________________ ; KEYBOARD INTERRUPT VECTOR @@ -146,13 +146,14 @@ KBDQPOP: ; RETURN A BYTE FROM THE KEYBOARD PORT ; KBD_IN: +#ENDIF +KBD_IN_P: EZ80_IO IN A,(C) ; GET THE DATA VALUE LD C,(IY+KBD_DAT) ; DATA PORT EZ80_IO IN A,(C) ; GET THE DATA VALUE RET -#ENDIF ; ;__________________________________________________________________________________________________ ; KEYBOARD INPUT STATUS @@ -166,13 +167,14 @@ KBDQLEN: ; EXIT WITH NUMBER OF CHARACTERS IN QUEUE SUB (HL) RET #ELSE -KBD_IST: ; A=0, Z SET FOR NOTHING PENDING, OTHERWISE DATA PENDING +KBD_IST: +#ENDIF +KBD_IST_P: ; A=0, Z SET FOR NOTHING PENDING, OTHERWISE DATA PENDING LD C,(IY+KBD_ST) ; STATUS PORT EZ80_IO IN A,(C) ; GET STATUS AND $01 ; ISOLATE INPUT PENDING BIT RET -#ENDIF ; ;__________________________________________________________________________________________________ ; OUTPUT TO KEYBOARD COMMAND PORT From 7a663e2a3cd591fdb453711633ca42ea72ad3368 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Fri, 6 Dec 2024 22:32:24 +0800 Subject: [PATCH 5/8] Use IY to retrieve status and data port values from idat tables. --- Source/HBIOS/ps2iface.inc | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/Source/HBIOS/ps2iface.inc b/Source/HBIOS/ps2iface.inc index 498eda69..ffab23de 100644 --- a/Source/HBIOS/ps2iface.inc +++ b/Source/HBIOS/ps2iface.inc @@ -9,30 +9,27 @@ ;__________________________________________________________________________________________________ ; #IF ((INTMODE == 2) & INTPS2KBD)) - +; +; SETUP POINTER TO KEYBOARD PORT +; #IF (TMSENABLE) -KBDPORTD .DB TMS_KBDDATA ; KBD CTLR DATA PORT -KBDPORTS .DB TMS_KBDST ; KBD CTLR STATUS/CMD PORT +KBDIDAT .EQU TMS_IDAT ; KBD INSTANCE DATA TABLE #ELSE #IF (GDCENABLE) -KBDPORTD .DB GDC_KBDDATA ; KBD CTLR DATA PORT -KBDPORTS .DB GDC_KBDST ; KBD CTLR STATUS/CMD PORT +KBDIDAT .EQU GDC_IDAT ; KBD INSTANCE DATA TABLE #ELSE #IF (CVDUENABLE) -KBDPORTD .DB CVDU_KBDDATA ; KBD CTLR DATA PORT -KBDPORTS .DB CVDU_KBDST ; KBD CTLR STATUS/CMD PORT +KBDIDAT .EQU CVDU_IDAT ; KBD INSTANCE DATA TABLE #ELSE #IF (VRCENABLE) -KBDPORTD .DB VRC_KBDDATA ; KBD CTLR DATA PORT -KBDPORTS .DB VRC_KBDST ; KBD CTLR STATUS/CMD PORT +KBDIDAT .EQU VRC_IDAT ; KBD INSTANCE DATA TABLE #ELSE #IF (VGAENABLE) -KBDPORTD .DB VGA_KBDDATA ; KBD CTLR DATA PORT -KBDPORTS .DB VGA_KBDST ; KBD CTLR STATUS/CMD PORT +KBDIDAT .EQU VGA_IDAT ; KBD INSTANCE DATA TABLE #ENDIF #ENDIF @@ -68,14 +65,13 @@ KBDQ .FILL KBDQSIZ,0 ; CIRCULAR KEYBOARD BUFFER ; KBD_INT: ; CALL KBDQDBG - LD A,(KBDPORTS) ; READ CONTROLLER STATUS - LD C,A + LD IY,KBDIDAT + LD C,(IY+KBD_ST) ; READ CONTROLLER STATUS EZ80_IO IN A,(C) AND 1 RET Z - LD A,(KBDPORTD) ; GET THE RESPONSE - LD C,A + LD C,(IY+KBD_DAT) ; GET THE RESPONSE EZ80_IO IN A,(C) ; CALL KBDQPUSH ; SAVE KEYBOARD SCAN CODE @@ -148,8 +144,6 @@ KBDQPOP: KBD_IN: #ENDIF KBD_IN_P: - EZ80_IO - IN A,(C) ; GET THE DATA VALUE LD C,(IY+KBD_DAT) ; DATA PORT EZ80_IO IN A,(C) ; GET THE DATA VALUE From cfa86a9f2a1b6daa79d27980f0710c04a6481722 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sat, 7 Dec 2024 11:28:24 +0800 Subject: [PATCH 6/8] Spurious interrupt fix. --- Source/HBIOS/kbd.asm | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/Source/HBIOS/kbd.asm b/Source/HBIOS/kbd.asm index 2030e570..339ffa30 100644 --- a/Source/HBIOS/kbd.asm +++ b/Source/HBIOS/kbd.asm @@ -94,16 +94,28 @@ KBD_INIT: CP KBDMODE_VRC ; VRC? JR Z,KBD_INIT1 ; IF SO, MUST ASSUME PRESENT ; +#IF ((INTMODE == 2) & INTPS2KBD) + HB_DI ; DISABLE INTERRUPTS WHILE WE PROBE +#ENDIF LD A,$AA ; CONTROLLER SELF TEST CALL KBD_PUTCMD ; SEND IT CALL KBD_GETDATA_P ; CONTROLLER SHOULD RESPOND WITH $55 (ACK) ; CP $55 ; IS IT THERE? JR Z,KBD_INIT1 ; IF SO, CONTINUE +#IF ((INTMODE == 2) & INTPS2KBD) + HB_EI ; RESTORE INTERRUPTS +#ENDIF PRTS(" NOT PRESENT$") ; DIAGNOSE PROBLEM RET ; BAIL OUT ; KBD_INIT1: +#IF ((INTMODE == 2) & INTPS2KBD) +; CALL KBDQINIT ; INITIALIZE QUEUE + LD HL,KBD_INT ; INSTALL VECTOR + LD (IVT(INT_PS2KB)),HL ; IVT INDEX + HB_EI ; ENABLE INTERUPTS +#ENDIF PRTS(" MODE=$") ; TAG LD A,(IY+KBD_MODE) ; GET MODE VALUE LD DE,KBD_STR_MODEPS2 @@ -115,12 +127,6 @@ KBD_INIT1: LD DE,KBD_STR_MODEUNK KBD_INIT2: CALL WRITESTR -; -#IF ((INTMODE == 2) & INTPS2KBD) -; CALL KBDQINIT ; INITIALIZE QUEUE - LD HL,KBD_INT ; INSTALL VECTOR - LD (IVT(INT_PS2KB)),HL ; IVT INDEX -#ENDIF ; LD A,$60 ; SET COMMAND REGISTER CALL KBD_PUTCMD ; SEND IT From 2d1811dcb4f3e214043619d6e106c87b97c579d3 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sat, 7 Dec 2024 19:11:48 +0800 Subject: [PATCH 7/8] Typos --- Source/HBIOS/hbios.asm | 4 ++-- Source/HBIOS/hbios.inc | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index e4bfa101..97135665 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -467,7 +467,7 @@ CB_HEAPTOP .DW 0 CB_SWITCHES .DB 0 ; this byte is set during init ; ; Byte 0: (L) -; Bit 7-0 DISK BOOT SLice Number to Boot -> default = 0 +; Bit 7-0 DISK BOOT Slice Number to Boot -> default = 0 ; Bit 7-0 ROM BOOT (alpha character) Application to boot -> default = "H" ; Byte 1: (H) ; Bit 7 - ROM/DISK - Rom or Disk Boot -> Default=ROM=1 (AUTO_CMD is Numeric/Alpha) @@ -7595,7 +7595,7 @@ Z2DMAADR2: #ENDIF ; ;-------------------------------------------------------------------------------------------------- -; ROUTINES FOR NON VOLITILE (NVRAM) SWITCHES +; ROUTINES FOR NON VOLATILE (NVRAM) SWITCHES ;-------------------------------------------------------------------------------------------------- ; ; RESET CONTENTS OF NVRAM, STORING INTO diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index f0f0ae32..b0e9cfbd 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -121,7 +121,7 @@ BF_SYSGET_VDAFN .EQU $41 ; GET VDA UNIT FN/DATA ADR BF_SYSGET_SNDCNT .EQU $50 ; GET VDA UNIT COUNT BF_SYSGET_SNDFN .EQU $51 ; GET SND UNIT FN/DATA ADR ; -BF_SYSGET_SWITCH .EQU $C0 ; GET NON VOLITILE SWITCH VALUE +BF_SYSGET_SWITCH .EQU $C0 ; GET NON VOLATILE SWITCH VALUE BF_SYSGET_TIMER .EQU $D0 ; GET CURRENT TIMER VALUE BF_SYSGET_SECS .EQU $D1 ; GET CURRENT SECONDS VALUE BF_SYSGET_BOOTINFO .EQU $E0 ; GET BOOT INFORMATION @@ -132,7 +132,7 @@ BF_SYSGET_CPUSPD .EQU $F3 ; GET CLOCK SPEED & WAIT STATES BF_SYSGET_PANEL .EQU $F4 ; GET FRONT PANEL SWITCHES VAL BF_SYSGET_APPBNKS .EQU $F5 ; GET APP BANK INFORMATION ; -BF_SYSSET_SWITCH .EQU $C0 ; SET NON VOLITILE SWITCH VALUE +BF_SYSSET_SWITCH .EQU $C0 ; SET NON VOLATILE SWITCH VALUE BF_SYSSET_TIMER .EQU $D0 ; SET TIMER VALUE BF_SYSSET_SECS .EQU $D1 ; SET SECONDS VALUE BF_SYSSET_BOOTINFO .EQU $E0 ; SET BOOT INFORMATION @@ -339,7 +339,7 @@ SW_OPT .EQU %00000111 ; SLICE/ROM APP ; ; NVRAM SWITCHES ; -; used for identifying Non Volitile Switches +; used for identifying Non Volatile Switches NVSW_BOOTOPTS .EQU 1 ; Boot Options NVRAM Switch NVSW_AUTOBOOT .EQU 3 ; Auto Boot NVRAM Switch ; From 9d7adbec6350ec1870bd6f2be2965bec9855dec3 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sat, 7 Dec 2024 19:22:06 +0800 Subject: [PATCH 8/8] Spelling --- Source/HBIOS/kbd.asm | 2 +- Source/HBIOS/mky.asm | 2 +- Source/HBIOS/pio_ps.asm | 2 +- Source/HBIOS/s100mon.z80 | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Source/HBIOS/kbd.asm b/Source/HBIOS/kbd.asm index 339ffa30..bbd7cfa8 100644 --- a/Source/HBIOS/kbd.asm +++ b/Source/HBIOS/kbd.asm @@ -4,7 +4,7 @@ ; ; ORIGINAL CODE BY DR JAMES MOXHAM ; ROMWBW ADAPTATION BY WAYNE WARTHEN -; INTERUPT DRIVER ADDITION BY PHIL SUMMERS +; INTERRUPT DRIVER ADDITION BY PHIL SUMMERS ; ; ; IN DEBUG MODE: diff --git a/Source/HBIOS/mky.asm b/Source/HBIOS/mky.asm index 3d32c00e..27fba67e 100644 --- a/Source/HBIOS/mky.asm +++ b/Source/HBIOS/mky.asm @@ -1035,7 +1035,7 @@ MKY_SCNKEY: .FILL MATRIX_ROW_COUNT, $FF ; 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 +; F3F6: VDP-INTERRUPT 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 diff --git a/Source/HBIOS/pio_ps.asm b/Source/HBIOS/pio_ps.asm index d0c9f7ff..bbad9971 100644 --- a/Source/HBIOS/pio_ps.asm +++ b/Source/HBIOS/pio_ps.asm @@ -416,7 +416,7 @@ SETPIO2: LD A,(IY+5) ; SET I/O DIRECTION OUT (C),A ; FOR MODE 3 -SETPIO3:; INTERUPT HANDLING +SETPIO3:; INTERRUPT HANDLING JP SETPIO4 diff --git a/Source/HBIOS/s100mon.z80 b/Source/HBIOS/s100mon.z80 index bed974d1..49000945 100644 --- a/Source/HBIOS/s100mon.z80 +++ b/Source/HBIOS/s100mon.z80 @@ -550,7 +550,7 @@ TBL: DW FLUSH ;"@" SEND FF to LaserJet printer BEGIN: DI ;No interrupts - XOR A ;SET INTERUPT TO PAGE 0H + XOR A ;SET INTERRUPT TO PAGE 0H LD I,A ;Z80 Interrupt page 0 SETUP_STACK: