Duodyne PS/2 Keyboard

- Enable PS/2 keyboard input for Duodyne Media I/O board video terminal.
- Minor cleanup in TUNE to properly handle Duodyne ACR values.
This commit is contained in:
Wayne Warthen
2024-02-23 14:43:50 -08:00
parent d572a7ca32
commit 792e76b069
7 changed files with 99 additions and 54 deletions

View File

@@ -35,7 +35,7 @@ AY_ACR .EQU $9C
AY_RSEL .EQU $9C
AY_RDAT .EQU $9D
AY_RIN .EQU AY_RSEL
AY_ACR .EQU N8_DEFACR
AY_ACR .EQU N8_ACR
.ECHO "N8"
#ENDIF
;
@@ -74,6 +74,7 @@ AY_RIN .EQU AY_RSEL
AY_ACR .EQU $A2
.ECHO "MBC"
#ENDIF
;
#IF (AYMODE == AYMODE_DUO)
AY_RSEL .EQU $A4
AY_RDAT .EQU $A5
@@ -169,6 +170,7 @@ AY38910_INIT:
#IF (AYMODE == AYMODE_MBC)
PRTS(" MODE=MBC$")
#ENDIF
;
#IF (AYMODE == AYMODE_DUO)
PRTS(" MODE=DUO$")
#ENDIF
@@ -185,6 +187,7 @@ AY38910_INIT:
LD A,$FF ; ACTIVATE DEVICE BIT 4 IS AY RESET CONTROL, BIT 3 IS ACTIVE LED
OUT (AY_ACR),A ; SET INIT AUX CONTROL REG
#ENDIF
;
#IF ((AYMODE == AYMODE_DUO))
LD A,$FE ;
OUT (AY_ACR),A ; SET INIT AUX CONTROL REG

View File

@@ -25,7 +25,7 @@ TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ)
;
BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE
BOOT_DELAY .EQU 0 ; FIXED BOOT DELAY IN SECONDS PRIOR TO CONSOLE OUTPUT
AUTOCON .EQU TRUE ; ENABLE CONSOLE TAKEOVER AT LOADER PROMPT
AUTOCON .EQU FALSE ; ENABLE CONSOLE TAKEOVER AT LOADER PROMPT
;
CPUSPDCAP .EQU SPD_FIXED ; CPU SPEED CHANGE CAPABILITY SPD_FIXED|SPD_HILO
CPUSPDDEF .EQU SPD_UNSUP ; CPU SPEED DEFAULT SPD_UNSUP|SPD_HIGH|SPD_LOW
@@ -82,7 +82,7 @@ LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC]
LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS
LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED
;
DSKYENABLE .EQU TRUE ; ENABLES DSKY FUNCTIONALITY
DSKYENABLE .EQU FALSE ; ENABLES DSKY FUNCTIONALITY
DSKYDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON DSKY DISPLAY
ICMENABLE .EQU FALSE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218)
ICMPPIBASE .EQU $88 ; BASE I/O ADDRESS OF ICM PPI

View File

@@ -65,6 +65,23 @@
; - [xio|mio].asm
; - unlzsa2s.asm
;
; AUXILIARY CONTROL REGISTER
; --------------------------
;
; SBC/MK4 N8 MBC VDP MBC PSG RPH DUO
; ------------ ------------ ------------ ------------ ------------ ------------
; D7 ~ROM_ENABLE ~ROM_ENABLE
; D6 TTL1_RTS TTL1_RTS
; D5 PSG_GPIO PSG_GPIO PSG_GPIO ~STATUS_LED PSG_GPIO
; D4 ~PSG_RES ~PSG_RES ~PSG_RES ROM_A19 ~PSG_RES
; D3 STATUS_LED STATUS_LED VDP_LED PSG_LED ROM_A18 PSG_LED
; D2 VDP_A14 VDP_A14 ROM_A17 VDP_LED
; D1 ~VDP_SYN ~VDP_SYN ROM_A16
; D0 ~VDP_RES ~VDP_RES VDP_RES ROM_A15 VDP_RES
;
; PORT SCG:0x9C 0x94 VDP:0x92 PSG:0xA2 0x80 MEDIA:0xA6
;
;
; INCLUDE GENERIC STUFF
;
#INCLUDE "std.asm"
@@ -2671,6 +2688,11 @@ HB_Z280BUS1:
CALL PRTDEC
CALL PRTSTRD
.TEXT "KB RAM$"
;
CALL PRTSTRD
.TEXT ", HEAP=0x$"
LD HL,BNKTOP - HB_END
CALL PRTHEXWORDHL
;
#IFDEF TESTING
;
@@ -5853,6 +5875,13 @@ HB_ADDENT:
; - DWORD: ADDRESS WHERE ALLOC WAS CALLED (VALUE ON TOP OF STACK AT CALL)
;
HB_ALLOC:
;
#IFDEF MEMDBG
CALL PRTSTRD
.TEXT "\r\n>>> ALLOC SIZE=0x$")
CALL PRTHEXWORDHL
#ENDIF
;
; SAVE ALLOC SIZE AND REFERENCE ADR FOR SUBSEQUENT HEADER CONSTRUCTION
LD (HB_TMPSZ),HL ; SAVE INCOMING SIZE REQUESTED
; USE EX (SP),HL INSTEAD????
@@ -5876,6 +5905,12 @@ HB_ALLOC:
; SAVE NEW HEAP TOP
LD DE,(CB_HEAPTOP) ; GET ORIGINAL HEAP TOP
LD (CB_HEAPTOP),HL ; SAVE NEW HEAP TOP
;
#IFDEF MEMDBG
CALL PRTSTRD
.TEXT " TOP=0x$")
CALL PRTHEXWORDHL
#ENDIF
;
; SET HEADER VALUES
EX DE,HL ; HEADER ADR TO HL
@@ -8001,14 +8036,21 @@ SLACK .EQU BNKTOP - $
.ECHO "HBIOS space remaining: "
.ECHO SLACK
.ECHO " bytes.\n"
;
; DIAGNOSE HBIOS BANK OVERFLOW
;
#IF (SLACK<0)
.ECHO "*** ERROR: HBIOS too big.\n"
.ECHO "*** ERROR: HBIOS too big!!!\n"
!!! ; FORCE AN ASSEMBLY ERROR
#ENDIF
;
#IF (CCP_SIZ > SLACK)
.ECHO "*** ERROR: Insufficient space for CCP cache.\n"
; CHECK TO SEE IF WE HAVE ENOUGH HEAP TO CACHE THE CP/M CCP
; AND ONE DISK SECTOR. ALTHOUGH SOME OPERATING SYSTEMS OR APPS
; MAY NOT NEED THIS, THE MOST COMMON ONES DO. CREATING AN HBIOS
; WITHOUT SPACE FOR THIS WILL NOT BE USEFUL.
;
#IF ((CCP_SIZ + 512) > SLACK)
.ECHO "*** ERROR: Insufficient HEAP space!!!\n"
!!! ; FORCE AN ASSEMBLY ERROR
#ENDIF
;

View File

@@ -121,9 +121,9 @@ TMS_PPIA .EQU 0 ; PPI PORT A
TMS_PPIB .EQU 0 ; PPI PORT B
TMS_PPIC .EQU 0 ; PPI PORT C
TMS_PPIX .EQU 0 ; PPI CONTROL PORT
TMS_KBDDATA .EQU $E2 ; KBD CTLR DATA PORT
TMS_KBDST .EQU $E3 ; KBD CTLR STATUS/CMD PORT
.ECHO "MBC"
TMS_KBDDATA .EQU $4C ; KBD CTLR DATA PORT
TMS_KBDST .EQU $4D ; KBD CTLR STATUS/CMD PORT
.ECHO "DUO"
#ENDIF
;
.ECHO ", IO="
@@ -158,8 +158,8 @@ TERMENABLE .SET TRUE ; INCLUDE TERMINAL PSEUDODEVICE DRIVER
PPKENABLE .SET TRUE ; INCLUDE PPK KEYBOARD SUPPORT
#ENDIF
;
#IF ((TMSMODE == TMSMODE_MSXKBD) | (TMSMODE == TMSMODE_MBC))
PPKENABLE .SET TRUE ; INCLUDE KBD KEYBOARD SUPPORT
#IF ((TMSMODE == TMSMODE_MSXKBD) | (TMSMODE == TMSMODE_MBC) | (TMSMODE == TMSMODE_DUO))
KBDENABLE .SET TRUE ; INCLUDE KBD KEYBOARD SUPPORT
#ENDIF
;
; TMS_IODELAY IS USED TO ADD RECOVERY TIME TO TMS9918/V9958 ACCESSES
@@ -205,10 +205,9 @@ TMS_INIT:
#IF ((TMSMODE == TMSMODE_MBC) | (TMSMODE == TMSMODE_DUO))
LD A,$FE
OUT (TMS_ACR),A ; INIT AUX CONTROL REG
OUT (TMS_ACR),A ; CLEAR VDP RESET
#ENDIF
;
LD IY,TMS_IDAT ; POINTER TO INSTANCE DATA
;
#IF (TMSMODE == TMSMODE_SCG)
@@ -254,7 +253,7 @@ TMS_INIT1:
#IF (TMSMODE == TMSMODE_N8)
CALL PPK_INIT ; INITIALIZE PPI KEYBOARD DRIVER
#ENDIF
#IF ((TMSMODE == TMSMODE_MSXKBD) | (TMSMODE == TMSMODE_MBC))
#IF ((TMSMODE == TMSMODE_MSXKBD) | (TMSMODE == TMSMODE_MBC) | (TMSMODE == TMSMODE_DUO))
CALL KBD_INIT ; INITIALIZE 8242 KEYBOARD DRIVER
#ENDIF
#IF MKYENABLE
@@ -309,7 +308,7 @@ TMS_FNTBL:
.DW PPK_FLUSH
.DW PPK_READ
#ELSE
#IF ((TMSMODE == TMSMODE_MSXKBD) | (TMSMODE == TMSMODE_MBC) )
#IF ((TMSMODE == TMSMODE_MSXKBD) | (TMSMODE == TMSMODE_MBC) | (TMSMODE == TMSMODE_DUO))
.DW KBD_STAT
.DW KBD_FLUSH
.DW KBD_READ