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 ffee3df5..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) @@ -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 @@ -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 b4096cea..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 ; @@ -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 BOPTS_ROM .EQU %10000000 ; ROM=1/DISK=0 FLAG BOPTS_UNIT .EQU %01111111 ; DISK UNIT diff --git a/Source/HBIOS/kbd.asm b/Source/HBIOS/kbd.asm index 75171cb0..bbd7cfa8 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 +; INTERRUPT 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 + CALL PC_LT + CALL PRTHEXBYTE + POP AF +#ENDIF + OR A ; SET FLAGS + 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 @@ -300,7 +326,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 +338,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 +359,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/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/ps2iface.inc b/Source/HBIOS/ps2iface.inc new file mode 100644 index 00000000..ffab23de --- /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 AN APPROPRIATE INTERRUPT JUMPER TO BE SET. +; CURRENTLY CONFIGURED FOR INT #2 ON DUODYNE WITH I/O MULTI BOARD. +;__________________________________________________________________________________________________ +; +#IF ((INTMODE == 2) & INTPS2KBD)) +; +; SETUP POINTER TO KEYBOARD PORT +; +#IF (TMSENABLE) +KBDIDAT .EQU TMS_IDAT ; KBD INSTANCE DATA TABLE +#ELSE + +#IF (GDCENABLE) +KBDIDAT .EQU GDC_IDAT ; KBD INSTANCE DATA TABLE +#ELSE + +#IF (CVDUENABLE) +KBDIDAT .EQU CVDU_IDAT ; KBD INSTANCE DATA TABLE +#ELSE + +#IF (VRCENABLE) +KBDIDAT .EQU VRC_IDAT ; KBD INSTANCE DATA TABLE +#ELSE + +#IF (VGAENABLE) +KBDIDAT .EQU VGA_IDAT ; KBD INSTANCE DATA TABLE +#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 IY,KBDIDAT + LD C,(IY+KBD_ST) ; READ CONTROLLER STATUS + EZ80_IO + IN A,(C) + AND 1 + RET Z + LD C,(IY+KBD_DAT) ; GET THE RESPONSE + EZ80_IO + 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: +#ENDIF +KBD_IN_P: + LD C,(IY+KBD_DAT) ; DATA PORT + EZ80_IO + IN A,(C) ; GET THE DATA VALUE + RET +; +;__________________________________________________________________________________________________ +; 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: +#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 +; +;__________________________________________________________________________________________________ +; 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/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: 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