mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 14:11:48 -06:00
Reintegrate wbw -> trunk
This commit is contained in:
150
Source/ansi.asm
Normal file
150
Source/ansi.asm
Normal file
@@ -0,0 +1,150 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; ANSI EMULATION MODULE
|
||||
;==================================================================================================
|
||||
;
|
||||
ANSI_INIT:
|
||||
JR ANSI_INI
|
||||
;
|
||||
;
|
||||
;
|
||||
ANSI_DISPATCH:
|
||||
LD A,B ; GET REQUESTED FUNCTION
|
||||
AND $0F ; ISOLATE SUB-FUNCTION
|
||||
JR Z,ANSI_IN ; $30
|
||||
DEC A
|
||||
JR Z,ANSI_OUT ; $31
|
||||
DEC A
|
||||
JR Z,ANSI_IST ; $32
|
||||
DEC A
|
||||
JR Z,ANSI_OST ; $33
|
||||
DEC A
|
||||
JR Z,ANSI_CFG ; $34
|
||||
CP 8
|
||||
JR Z,ANSI_INI ; $38
|
||||
CP 9
|
||||
JR Z,ANSI_QRY ; $39
|
||||
CALL PANIC
|
||||
;
|
||||
;
|
||||
;
|
||||
ANSI_IN:
|
||||
LD B,BF_VDAKRD
|
||||
JP EMU_VDADISP
|
||||
;
|
||||
;
|
||||
;
|
||||
ANSI_OUT:
|
||||
CALL ANSI_DOCHAR
|
||||
XOR A
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
ANSI_IST:
|
||||
LD B,BF_VDAKST
|
||||
JP EMU_VDADISP
|
||||
;
|
||||
;
|
||||
;
|
||||
ANSI_OST:
|
||||
XOR A
|
||||
INC A
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
ANSI_CFG:
|
||||
XOR A
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
ANSI_INI:
|
||||
LD (ANSI_ROW),A
|
||||
LD (ANSI_COL),A
|
||||
LD B,BF_VDARES
|
||||
JP EMU_VDADISP ; RESET VDA
|
||||
;
|
||||
;
|
||||
;
|
||||
ANSI_QRY:
|
||||
XOR A
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
ANSI_DOCHAR:
|
||||
LD A,E ; CHARACTER TO PROCESS
|
||||
CP 8 ; BACKSPACE
|
||||
JR Z,ANSI_BS
|
||||
CP 12 ; FORMFEED
|
||||
JR Z,ANSI_FF
|
||||
CP 13 ; CARRIAGE RETURN
|
||||
JR Z,ANSI_CR
|
||||
CP 10 ; LINEFEED
|
||||
JR Z,ANSI_LF
|
||||
CP 32 ; COMPARE TO SPACE (FIRST PRINTABLE CHARACTER)
|
||||
RET C ; SWALLOW OTHER CONTROL CHARACTERS
|
||||
LD B,BF_VDAWRC
|
||||
CALL EMU_VDADISP ; SPIT OUT THE RAW CHARACTER
|
||||
LD A,(ANSI_COL) ; GET CUR COL
|
||||
INC A ; INCREMENT
|
||||
LD (ANSI_COL),A ; SAVE IT
|
||||
CP 80 ; COMPARE TO COLS IN LINE
|
||||
RET C ; NOT PAST END OF LINE, ALL DONE
|
||||
CALL ANSI_CR ; CARRIAGE RETURN
|
||||
JR ANSI_LF ; LINEFEED AND RETURN
|
||||
;
|
||||
ANSI_FF:
|
||||
LD DE,0 ; HOME CURSOR
|
||||
LD (ANSI_ROWCOL),DE ; SAVE IT
|
||||
CALL ANSI_XY ; EXECUTE
|
||||
LD E,' ' ; FILL SCREEN WITH BLANKS
|
||||
LD HL,80 * 24 ; NUMBER OF CHARACTER POSITIONS TO FILL
|
||||
LD B,BF_VDAFIL
|
||||
CALL EMU_VDADISP ; PERFORM FILL
|
||||
JR ANSI_XY ; HOME CURSOR AND RETURN
|
||||
;
|
||||
ANSI_BS:
|
||||
LD DE,(ANSI_ROWCOL) ; GET CURRENT ROW/COL IN DE
|
||||
LD A,E ; GET CURRENT COLUMN
|
||||
CP 1 ; COMPARE TO COLUMN 1
|
||||
RET C ; LESS THAN 1, NOTHING TO DO
|
||||
DEC E ; POINT TO PREVIOUS COLUMN
|
||||
LD (ANSI_ROWCOL),DE ; SAVE NEW COLUMN VALUE
|
||||
CALL ANSI_XY ; MOVE CURSOR TO NEW TARGET COLUMN
|
||||
LD E,' ' ; LOAD A SPACE CHARACTER
|
||||
LD B,BF_VDAWRC
|
||||
CALL EMU_VDADISP ; OVERWRITE WITH A SPACE CHARACTER
|
||||
JR ANSI_XY ; NEED TO MOVE CURSOR BACK TO NEW TARGET COLUMN
|
||||
;
|
||||
ANSI_CR:
|
||||
XOR A
|
||||
LD (ANSI_COL),A
|
||||
JR ANSI_XY
|
||||
;
|
||||
ANSI_LF:
|
||||
LD A,(ANSI_ROW)
|
||||
INC A
|
||||
LD (ANSI_ROW),A
|
||||
CP 24 ; COMPARE TO SCREEN ROWS
|
||||
JR C,ANSI_XY ; NOT PAST END, ALL DONE
|
||||
SUB 23 ; A WILL NOW HAVE NUM LINES TO SCROLL
|
||||
LD E,A ; LINES TO SCROLL -> E
|
||||
LD B,BF_VDASCR
|
||||
CALL EMU_VDADISP ; DO THE SCROLLING
|
||||
LD A,23 ; ROW 23
|
||||
LD (ANSI_ROW),A ; IS NOW CORRECT
|
||||
JR ANSI_XY ; RESPOSITION CURSOR AND RETURN
|
||||
;
|
||||
ANSI_XY:
|
||||
LD DE,(ANSI_ROWCOL)
|
||||
LD B,BF_VDASCP
|
||||
JP EMU_VDADISP
|
||||
;
|
||||
;
|
||||
;
|
||||
ANSI_ROWCOL:
|
||||
ANSI_COL .DB 0
|
||||
ANSI_ROW .DB 0
|
||||
376
Source/bnk1.asm
376
Source/bnk1.asm
@@ -34,15 +34,11 @@ INITSYS:
|
||||
;
|
||||
#IF (PLATFORM != PLT_N8)
|
||||
IN A,(RTC) ; RTC PORT, BIT 6 HAS STATE OF CONFIG JUMPER
|
||||
; LD A,40H ; *DEBUG* SIMULATE JUMPER OPEN
|
||||
; LD A,00H ; *DEBUG* SIMULATE JUMPER SHORTED
|
||||
AND 40H ; ISOLATE BIT 6
|
||||
JR Z,INITSYS1 ; IF BIT6=0, SHORTED, USE ALT CONSOLE
|
||||
LD A,DEFCON ; LOAD DEF CONSOLE DEVICE CODE
|
||||
JR INITSYS2 ; CONTINUE
|
||||
LD A,DEFCON ; ASSUME WE WANT DEFAULT CONSOLE
|
||||
BIT 6,A ; BIT 6 HAS CONFIG JUMPER STATE
|
||||
JR NZ,INITSYS1 ; IF NZ, JUMPER OPEN, DEF CON IS CORRECT
|
||||
LD A,ALTCON ; JUMPER SHORTED, USE ALTERNATE CONSOLE
|
||||
INITSYS1:
|
||||
LD A,ALTCON ; LOAD ALT CONSOLE DEVICE CODE
|
||||
INITSYS2:
|
||||
LD (CONDEV),A ; SET THE ACTIVE CONSOLE DEVICE
|
||||
#ENDIF
|
||||
;
|
||||
@@ -54,6 +50,9 @@ INITSYS2:
|
||||
#IF (VDUENABLE)
|
||||
CALL VDU_INIT
|
||||
#ENDIF
|
||||
#IF (N8VENABLE)
|
||||
CALL N8V_INIT
|
||||
#ENDIF
|
||||
#IF (PRPENABLE)
|
||||
CALL PRP_INIT
|
||||
#ENDIF
|
||||
@@ -78,6 +77,12 @@ INITSYS2:
|
||||
#IF (HDSKENABLE)
|
||||
CALL HDSK_INIT
|
||||
#ENDIF
|
||||
#IF (TTYENABLE)
|
||||
CALL TTY_INIT
|
||||
#ENDIF
|
||||
#IF (ANSIENABLE)
|
||||
CALL ANSI_INIT
|
||||
#ENDIF
|
||||
;
|
||||
LD DE,STR_BANNER
|
||||
CALL WRITESTR
|
||||
@@ -106,24 +111,29 @@ IDLE:
|
||||
;
|
||||
BIOS_DISPATCH:
|
||||
LD A,B ; REQUESTED FUNCTION IS IN B
|
||||
CP BF_CIO + $10
|
||||
CP BF_CIO + $10 ; $00-$0F: CHARACTER I/O
|
||||
JR C,CIO_DISPATCH
|
||||
CP BF_DIO + $10
|
||||
CP BF_DIO + $10 ; $10-$1F: DISK I/O
|
||||
JR C,DIO_DISPATCH
|
||||
CP BF_CLK + $10
|
||||
JR C,CLK_DISPATCH
|
||||
CP BF_VDU + $10
|
||||
JR C,CRT_DISPATCH
|
||||
CP BF_RTC + $10 ; $20-$2F: REAL TIME CLOCK (RTC)
|
||||
JR C,RTC_DISPATCH
|
||||
CP BF_EMU + $10 ; $30-$3F: EMULATION
|
||||
JP C,EMU_DISPATCH
|
||||
CP BF_VDA + $10 ; $40-$4F: VIDEO DISPLAY ADAPTER
|
||||
JP C,VDA_DISPATCH
|
||||
|
||||
CP BF_SYS ; SKIP TO BF_SYS VALUE AT $F0
|
||||
CALL C,PANIC ; PANIC IF LESS THAN BF_SYS
|
||||
JR SYS_DISPATCH ; OTHERWISE SYS CALL
|
||||
JP SYS_DISPATCH ; OTHERWISE SYS CALL
|
||||
CALL PANIC ; THIS SHOULD NEVER BE REACHED
|
||||
;
|
||||
; SETUP AND CALL CHARACTER DRIVER
|
||||
;==================================================================================================
|
||||
; CHARACTER I/O DEVICE DISPATCHER
|
||||
;==================================================================================================
|
||||
;
|
||||
; ROUTE CALL TO SPECIFIED CHARACTER I/O DRIVER
|
||||
; B: FUNCTION
|
||||
; C: DEVICE/UNIT
|
||||
; E: CHARACTER IN/OUT
|
||||
;
|
||||
CIO_DISPATCH:
|
||||
LD A,C ; REQUESTED DEVICE/UNIT IS IN C
|
||||
@@ -142,34 +152,50 @@ CIO_DISPATCH:
|
||||
#ENDIF
|
||||
#IF (VDUENABLE)
|
||||
CP CIODEV_VDU
|
||||
JP Z,VDU_DISPATCH
|
||||
JP Z,VDU_DISPCIO
|
||||
#ENDIF
|
||||
CP CIODEV_CRT
|
||||
JR Z,CIOEMU
|
||||
CALL PANIC
|
||||
;
|
||||
CIOEMU:
|
||||
LD A,B
|
||||
ADD A,BF_EMU - BF_CIO ; TRANSLATE FUNCTION CIOXXX -> EMUXXX
|
||||
LD B,A
|
||||
JP EMU_DISPATCH
|
||||
;
|
||||
;==================================================================================================
|
||||
; DISK I/O DEVICE DISPATCHER
|
||||
;==================================================================================================
|
||||
;
|
||||
; ROUTE CALL TO SPECIFIED DISK I/O DRIVER
|
||||
; B: FUNCTION
|
||||
; C: DEVICE/UNIT
|
||||
;
|
||||
DIO_DISPATCH:
|
||||
; GET THE REQUESTED FUNCTION TO SEE IF SPECIAL HANDLING
|
||||
; IS NEEDED
|
||||
LD A,B
|
||||
|
||||
; DIO FUNCTIONS STARTING AT $18 ARE COMMON
|
||||
; AND DO NOT DISPATCH TO DRIVERS
|
||||
CP $18
|
||||
JR NC,DIO_COMMON
|
||||
|
||||
; DISPATCH FUCNTION TO APPROPRIATE DRIVER
|
||||
AND $0F
|
||||
|
||||
;
|
||||
; DIO FUNCTIONS STARTING AT DIOGETBUF ARE COMMON FUNCTIONS
|
||||
; AND DO NOT DISPATCH TO DRIVERS (HANDLED GLOBALLY)
|
||||
CP BF_DIOGETBUF ; TEST FOR FIRST OF THE COMMON FUNCTIONS
|
||||
JR NC,DIO_COMMON ; IF >= DIOGETBUF HANDLE AS COMMON DIO FUNCTION
|
||||
;
|
||||
; HACK TO FILL IN HSTTRK AND HSTSEC
|
||||
; BUT ONLY FOR READ/WRITE FUNCTION CALLS
|
||||
; ULTIMATELY, HSTTRK AND HSTSEC ARE TO BE REMOVED
|
||||
CP 2
|
||||
JR NC,DIO_DISPATCH1
|
||||
LD (HSTTRK),HL
|
||||
LD (HSTSEC),DE
|
||||
CP BF_DIOST ; BEYOND READ/WRITE FUNCTIONS ?
|
||||
JR NC,DIO_DISPATCH1 ; YES, BYPASS
|
||||
LD (HSTTRK),HL ; RECORD TRACK
|
||||
LD (HSTSEC),DE ; RECORD SECTOR
|
||||
;
|
||||
DIO_DISPATCH1:
|
||||
LD A,C ; REQUESTED DEVICE/UNIT IS IN C
|
||||
; START OF THE ACTUAL DRIVER DISPATCHING LOGIC
|
||||
LD A,C ; GET REQUESTED DEVICE/UNIT FROM C
|
||||
LD (HSTDSK),A ; TEMP HACK TO FILL IN HSTDSK
|
||||
AND $F0 ; ISOLATE THE DEVICE PORTION
|
||||
;
|
||||
#IF (FDENABLE)
|
||||
CP DIODEV_FD
|
||||
JP Z,FD_DISPATCH
|
||||
@@ -203,49 +229,212 @@ DIO_DISPATCH1:
|
||||
; HANDLE COMMON DISK FUNCTIONS (NOT DEVICE DRIVER SPECIFIC)
|
||||
;
|
||||
DIO_COMMON:
|
||||
SUB $18
|
||||
JR Z,DIO_GBA
|
||||
DEC A
|
||||
JR Z,DIO_SBA
|
||||
CALL PANIC
|
||||
SUB BF_DIOGETBUF ; FUNCTION = DIOGETBUF?
|
||||
JR Z,DIO_GETBUF ; YES, HANDLE IT
|
||||
DEC A ; FUNCTION = DIOSETBUF?
|
||||
JR Z,DIO_SETBUF ; YES, HANDLE IT
|
||||
CALL PANIC ; INVALID FUNCTION SPECFIED
|
||||
;
|
||||
; DISK: GET BUFFER ADDRESS
|
||||
;
|
||||
DIO_GBA:
|
||||
LD HL,(DIOBUF)
|
||||
XOR A
|
||||
DIO_GETBUF:
|
||||
LD HL,(DIOBUF) ; HL = DISK BUFFER ADDRESS
|
||||
XOR A ; SIGNALS SUCCESS
|
||||
RET
|
||||
;
|
||||
; DISK: SET BUFFER ADDRESS
|
||||
;
|
||||
DIO_SBA:
|
||||
BIT 7,H ; IS HIGH ORDER BIT SET?
|
||||
CALL Z,PANIC ; IF NOT, ADR IS IN LOWER 32K, NOT ALLOWED!!!
|
||||
LD (DIOBUF),HL
|
||||
XOR A
|
||||
DIO_SETBUF:
|
||||
BIT 7,H ; IS HIGH ORDER BIT SET?
|
||||
CALL Z,PANIC ; IF NOT, ADR IS IN LOWER 32K, NOT ALLOWED!!!
|
||||
LD (DIOBUF),HL ; RECORD NEW DISK BUFFER ADDRESS
|
||||
XOR A ; SIGNALS SUCCESS
|
||||
RET
|
||||
;
|
||||
;==================================================================================================
|
||||
; REAL TIME CLOCK DEVICE DISPATCHER
|
||||
;==================================================================================================
|
||||
;
|
||||
; ROUTE CALL TO REAL TIME CLOCK DRIVER (NOT YET IMPLEMENTED)
|
||||
; B: FUNCTION
|
||||
;
|
||||
CLK_DISPATCH:
|
||||
RTC_DISPATCH:
|
||||
CALL PANIC
|
||||
;
|
||||
;==================================================================================================
|
||||
; EMULATION HANDLER DISPATCHER
|
||||
;==================================================================================================
|
||||
;
|
||||
; ROUTE CALL TO EMULATION HANDLER CURRENTLY ACTIVE
|
||||
; B: FUNCTION
|
||||
;
|
||||
CRT_DISPATCH:
|
||||
EMU_DISPATCH:
|
||||
; EMU FUNCTIONS STARTING AT EMUINI ARE COMMON
|
||||
; AND DO NOT DISPATCH TO DRIVERS
|
||||
LD A,B ; GET REQUESTED FUNCTION
|
||||
CP BF_EMUINI
|
||||
JR NC,EMU_COMMON
|
||||
;
|
||||
LD A,(CUREMU) ; GET ACTIVE EMULATION
|
||||
;
|
||||
#IF (TTYENABLE)
|
||||
DEC A ; 1 = TTY
|
||||
JP Z,TTY_DISPATCH
|
||||
#ENDIF
|
||||
#IF (ANSIENABLE)
|
||||
DEC A ; 2 = ANSI
|
||||
JP Z,ANSI_DISPATCH
|
||||
#ENDIF
|
||||
CALL PANIC ; INVALID
|
||||
;
|
||||
; HANDLE COMMON EMULATION FUNCTIONS (NOT HANDLER SPECIFIC)
|
||||
;
|
||||
EMU_COMMON:
|
||||
; REG A CONTAINS FUNCTION ON ENTRY
|
||||
CP BF_EMUINI
|
||||
JR Z,EMU_INI
|
||||
CP BF_EMUQRY
|
||||
JR Z,EMU_QRY
|
||||
CALL PANIC
|
||||
;
|
||||
; INITIALIZE EMULATION
|
||||
; C: VDA DEVICE/UNIT TO USE GOING FORWARD
|
||||
; E: EMULATION TYPE TO USE GOING FORWARD
|
||||
;
|
||||
EMU_INI:
|
||||
LD A,E ; LOAD REQUESTED EMULATION TYPE
|
||||
LD (CUREMU),A ; SAVE IT
|
||||
LD A,C ; LOAD REQUESTED VDA DEVICE/UNIT
|
||||
LD (CURVDA),A ; SAVE IT
|
||||
;
|
||||
; UPDATE EMULATION VDA DISPATCHING ADDRESS
|
||||
#IF (VDUENABLE)
|
||||
LD HL,VDU_DISPVDA
|
||||
CP VDADEV_VDU
|
||||
JR Z,EMU_INI1
|
||||
#ENDIF
|
||||
#IF (CVDUENABLE)
|
||||
LD HL,CVDU_DISPVDA
|
||||
CP VDADEV_CVDU
|
||||
JR Z,EMU_INI1
|
||||
#ENDIF
|
||||
#IF (UPD7220ENABLE)
|
||||
LD HL,UPD7220_DISPVDA
|
||||
CP VDADEV_7220
|
||||
JR Z,EMU_INI1
|
||||
#ENDIF
|
||||
#IF (N8VENABLE)
|
||||
LD HL,N8V_DISPVDA
|
||||
CP VDADEV_N8
|
||||
JR Z,EMU_INI1
|
||||
#ENDIF
|
||||
CALL PANIC
|
||||
;
|
||||
EMU_INI1:
|
||||
LD (EMU_VDADISPADR),HL ; RECORD NEW VDA DISPATCH ADDRESS
|
||||
JP EMU_VDADISP ; NOW LET EMULATOR INITIALIZE
|
||||
;
|
||||
; QUERY CURRENT EMULATION CONFIGURATION
|
||||
; RETURN CURRENT EMULATION TARGET VDA DEVICE/UNIT IN C
|
||||
; RETURN CURRENT EMULATION TYPE IN E
|
||||
;
|
||||
EMU_QRY:
|
||||
LD A,(CURVDA)
|
||||
LD C,A
|
||||
LD A,(CUREMU)
|
||||
LD E,A
|
||||
JP EMU_VDADISP ; NOW LET EMULATOR COMPLETE THE FUNCTION
|
||||
;
|
||||
;==================================================================================================
|
||||
; VDA DISPATCHING FOR EMULATION HANDLERS
|
||||
;==================================================================================================
|
||||
;
|
||||
; SINCE THE EMULATION HANDLERS WILL ONLY HAVE A SINGLE ACTIVE
|
||||
; VDA TARGET AT ANY TIME, THE FOLLOWING IMPLEMENTS A FAST DISPATCHING
|
||||
; MECHANISM THAT THE EMULATION HANDLERS CAN USE TO BYPASS SOME OF THE
|
||||
; VDA DISPATCHING LOGIC. EMU_VDADISP CAN BE CALLED TO DISPATCH DIRECTLY
|
||||
; TO THE CURRENT VDA EMULATION TARGET. IT IS A JUMP INSTRUCTION THAT
|
||||
; IS DYNAMICALLY MODIFIED TO POINT TO THE VDA DISPATCHER FOR THE
|
||||
; CURRENT EMULATION VDA TARGET.
|
||||
;
|
||||
; BELOW IS USED TO INITIALIZE THE EMULATION VDA DISPATCH TARGET
|
||||
; BASED ON THE DEFAULT VDA.
|
||||
;
|
||||
VDA_DISPADR .EQU 0
|
||||
#IF (VDUENABLE & (DEFVDA == VDADEV_VDU))
|
||||
VDA_DISPADR .SET VDU_DISPVDA
|
||||
#ENDIF
|
||||
#IF (CVDUENABLE & (DEFVDA == VDADEV_CVDU))
|
||||
VDA_DISPADR .SET CVDU_DISPATCH
|
||||
#ENDIF
|
||||
#IF (VDUENABLE & (DEFVDA == VDADEV_7220))
|
||||
VDA_DISPADR .SET UPD7220_DISPATCH
|
||||
#ENDIF
|
||||
#IF (N8VENABLE & (DEFVDA == VDADEV_N8))
|
||||
VDA_DISPADR .SET N8V_DISPVDA
|
||||
#ENDIF
|
||||
;
|
||||
; BELOW IS THE DYNAMICALLY MANAGED EMULATION VDA DISPATCH.
|
||||
; EMULATION HANDLERS CAN CALL EMU_VDADISP TO INVOKE A VDA
|
||||
; FUNCTION. EMU_VDADISPADR IS USED TO MARK THE LOCATION
|
||||
; OF THE VDA DISPATCH ADDRESS. THIS ALLOWS US TO MODIFY
|
||||
; THE CODE DYNAMICALLY WHEN EMULATION IS INITIALIZED AND
|
||||
; A NEW VDA TARGET IS SPECIFIED.
|
||||
;
|
||||
EMU_VDADISPADR .EQU $ + 1
|
||||
EMU_VDADISP:
|
||||
JP VDA_DISPADR
|
||||
;
|
||||
;==================================================================================================
|
||||
; VIDEO DISPLAY ADAPTER DEVICE DISPATCHER
|
||||
;==================================================================================================
|
||||
;
|
||||
; ROUTE CALL TO SPECIFIED VDA DEVICE DRIVER
|
||||
; B: FUNCTION
|
||||
; C: DEVICE/UNIT
|
||||
;
|
||||
VDA_DISPATCH:
|
||||
LD A,C ; REQUESTED DEVICE/UNIT IS IN C
|
||||
AND $F0 ; ISOLATE THE DEVICE PORTION
|
||||
#IF (VDUENABLE)
|
||||
CP VDADEV_VDU
|
||||
JP Z,VDU_DISPVDA
|
||||
#ENDIF
|
||||
#IF (CVDUENABLE)
|
||||
CP VDADEV_CVDU
|
||||
JP Z,CVDU_DISPATCH
|
||||
#ENDIF
|
||||
#IF (UPD7220ENABLE)
|
||||
CP VDADEV_7220
|
||||
JP Z,UPD7220_DISPATCH
|
||||
#ENDIF
|
||||
#IF (N8VENABLE)
|
||||
CP VDADEV_N8
|
||||
JP Z,N8V_DISPVDA
|
||||
#ENDIF
|
||||
CALL PANIC
|
||||
;
|
||||
;==================================================================================================
|
||||
; SYSTEM FUNCTION DISPATCHER
|
||||
;==================================================================================================
|
||||
;
|
||||
; B: FUNCTION
|
||||
;
|
||||
SYS_DISPATCH:
|
||||
LD A,B
|
||||
CP BF_SYSGETCFG
|
||||
JR Z,SYS_GETCFG
|
||||
CP BF_SYSSETCFG
|
||||
JR Z,SYS_SETCFG
|
||||
CP BF_SYSBNKCPY
|
||||
JR Z,SYS_BNKCPY
|
||||
CALL PANIC
|
||||
LD A,B ; GET REQUESTED FUNCTION
|
||||
AND $0F ; ISOLATE SUB-FUNCTION
|
||||
JR Z,SYS_GETCFG ; $F0
|
||||
DEC A
|
||||
JR Z,SYS_SETCFG ; $F1
|
||||
DEC A
|
||||
JR Z,SYS_BNKCPY ; $F2
|
||||
DEC A
|
||||
JR Z,SYS_GETVER ; $F3
|
||||
CALL PANIC ; INVALID
|
||||
;
|
||||
; GET ACTIVE CONFIGURATION
|
||||
; DE: DESTINATION TO RECEIVE CONFIGURATION DATA BLOCK
|
||||
; MUST BE IN UPPER 32K
|
||||
;
|
||||
SYS_GETCFG:
|
||||
LD HL,$0200 ; SETUP SOURCE OF CONFIG DATA
|
||||
@@ -253,6 +442,13 @@ SYS_GETCFG:
|
||||
LDIR ; COPY IT
|
||||
RET
|
||||
;
|
||||
; SET ACTIVE CONFIGURATION
|
||||
; DE: SOURCE OF NEW CONFIGURATION DATA BLOCK
|
||||
; MUST BE IN UPPER 32K
|
||||
;
|
||||
; HBIOS IS NOT REALLY SET UP TO DYNAMICALLY RECONFIGURE ITSELF!!!
|
||||
; THIS FUNCTION IS NOT USEFUL YET.
|
||||
;
|
||||
SYS_SETCFG:
|
||||
LD HL,$0200 ; SETUP SOURCE OF CONFIG DATA
|
||||
LD BC,$0100
|
||||
@@ -260,12 +456,32 @@ SYS_SETCFG:
|
||||
LDIR
|
||||
RET
|
||||
;
|
||||
; PERFORM A BANKED MEMORY COPY
|
||||
; C: BANK TO SWAP INTO LOWER 32K PRIOR TO COPY OPERATION
|
||||
; IX: COUNT OF BYTES TO COPY
|
||||
; HL: SOURCE ADDRESS FOR COPY
|
||||
; DE: DESTINATION ADDRESS FOR COPY
|
||||
;
|
||||
SYS_BNKCPY:
|
||||
LD A,C ; BANK SELECTION TO A
|
||||
PUSH IX
|
||||
POP BC ; BC = BYTE COUNT TO COPY
|
||||
JP HB_BNKCPY ; JUST PASS CONTROL TO HBIOS STUB IN UPPER MEMORY
|
||||
;
|
||||
; GET THE CURRENT HBIOS VERSION
|
||||
; RETURNS VERSION IN DE AS BCD
|
||||
; D: MAJOR VERION IN TOP 4 BITS, MINOR VERSION IN LOW 4 BITS
|
||||
; E: UPDATE VERION IN TOP 4 BITS, PATCH VERSION IN LOW 4 BITS
|
||||
;
|
||||
SYS_GETVER:
|
||||
LD DE,0 | (RMJ<<12) | (RMN<<8) | (RUP<<4) | RTP
|
||||
XOR A
|
||||
RET
|
||||
;
|
||||
;==================================================================================================
|
||||
; GLOBAL HBIOS FUNCTIONS
|
||||
;==================================================================================================
|
||||
;
|
||||
; COMMON ROUTINE THAT IS CALLED BY CHARACTER IO DRIVERS WHEN
|
||||
; AN IDLE CONDITION IS DETECTED (WAIT FOR INPUT/OUTPUT)
|
||||
;
|
||||
@@ -298,6 +514,15 @@ SIZ_VDU .EQU $ - ORG_VDU
|
||||
.ECHO " bytes.\n"
|
||||
#ENDIF
|
||||
;
|
||||
#IF (N8VENABLE)
|
||||
ORG_N8V .EQU $
|
||||
#INCLUDE "n8v.asm"
|
||||
SIZ_N8V .EQU $ - ORG_N8V
|
||||
.ECHO "N8V occupies "
|
||||
.ECHO SIZ_N8V
|
||||
.ECHO " bytes.\n"
|
||||
#ENDIF
|
||||
;
|
||||
#IF (PRPENABLE)
|
||||
ORG_PRP .EQU $
|
||||
#INCLUDE "prp.asm"
|
||||
@@ -360,6 +585,24 @@ SIZ_HDSK .EQU $ - ORG_HDSK
|
||||
.ECHO SIZ_HDSK
|
||||
.ECHO " bytes.\n"
|
||||
#ENDIF
|
||||
|
||||
#IF (TTYENABLE)
|
||||
ORG_TTY .EQU $
|
||||
#INCLUDE "tty.asm"
|
||||
SIZ_TTY .EQU $ - ORG_TTY
|
||||
.ECHO "TTY occupies "
|
||||
.ECHO SIZ_TTY
|
||||
.ECHO " bytes.\n"
|
||||
#ENDIF
|
||||
|
||||
#IF (ANSIENABLE)
|
||||
ORG_ANSI .EQU $
|
||||
#INCLUDE "ansi.asm"
|
||||
SIZ_ANSI .EQU $ - ORG_ANSI
|
||||
.ECHO "ANSI occupies "
|
||||
.ECHO SIZ_ANSI
|
||||
.ECHO " bytes.\n"
|
||||
#ENDIF
|
||||
;
|
||||
#DEFINE CIOMODE_CONSOLE
|
||||
#DEFINE DSKY_KBD
|
||||
@@ -377,6 +620,9 @@ HSTDSK .DB 0 ; DISK IN BUFFER
|
||||
HSTTRK .DW 0 ; TRACK IN BUFFER
|
||||
HSTSEC .DW 0 ; SECTOR IN BUFFER
|
||||
;
|
||||
CUREMU .DB DEFEMU ; CURRENT EMULATION
|
||||
CURVDA .DB DEFVDA ; CURRENT VDA TARGET FOR EMULATION
|
||||
;
|
||||
DIOBUF .DW $FD00 ; PTR TO 512 BYTE DISK XFR BUFFER
|
||||
;
|
||||
STR_BANNER .DB "N8VEM HBIOS v", BIOSVER, " ("
|
||||
@@ -465,22 +711,27 @@ HB_BNKCPY2:
|
||||
; ENTRY POINT FOR BIOS FUNCTIONS (TARGET OF RST 08)
|
||||
;
|
||||
HB_ENTRY:
|
||||
EX AF,AF' ; SAVE AF' SO WE CAN USE IT BELOW
|
||||
PUSH AF ; "
|
||||
|
||||
PGRAMF(1) ; MAP RAM PAGE 1 INTO LOWER 32K
|
||||
|
||||
LD (HB_STKSAV),SP ; SAVE ORIGINAL STACK FRAME
|
||||
LD SP,HB_STACK ; SETUP NEW STACK FRAME
|
||||
LD SP,8000H ; SETUP NEW STACK FRAME AT END OF BANK 1
|
||||
|
||||
CALL BIOS_DISPATCH ; CALL HBIOS FUNCTION DISPATCHER
|
||||
|
||||
PUSH AF ; SAVE AF
|
||||
EX AF,AF' ; SAVE AF IN AF'
|
||||
PGRAMF(0) ; MAP RAM PAGE 0 INTO LOWER 32K
|
||||
POP AF ; RESTORE AF
|
||||
|
||||
LD SP,(HB_STKSAV) ; RESTORE ORIGINAL STACK FRAME
|
||||
|
||||
POP AF ; RECOVER ORIGINAL AF'
|
||||
EX AF,AF' ; RESTORE AF' AND GET AF RETURNED FROM DISPATCH BACK
|
||||
|
||||
RET ; RETURN TO CALLER
|
||||
;
|
||||
HB_STKSAV .DW 0 ; PREVIOUS STACK POINTER (SEE PROXY)
|
||||
HB_STKSAV .DW 0 ; PREVIOUS STACK POINTER
|
||||
;
|
||||
HB_SLACK .EQU (HB_END - $)
|
||||
.ECHO "HBIOS space remaining: "
|
||||
@@ -488,11 +739,4 @@ HB_SLACK .EQU (HB_END - $)
|
||||
.ECHO " bytes.\n"
|
||||
;
|
||||
.FILL HB_SLACK,0FFH
|
||||
;
|
||||
;==================================================================================================
|
||||
; HBIOS STACK LIVES IN THE SLACK SPACE!!!
|
||||
;==================================================================================================
|
||||
;
|
||||
HB_STACK .EQU $ & 0FFFFH
|
||||
;
|
||||
.END
|
||||
|
||||
@@ -118,9 +118,9 @@ GOCPM:
|
||||
; SETUP DISK XFR BUFFER LOCATION
|
||||
LD HL,SECBUF
|
||||
LD (BUFADR),HL
|
||||
LD B,BF_DIOSBA
|
||||
LD B,BF_DIOSETBUF
|
||||
RST 08
|
||||
|
||||
|
||||
LD A,0C3H ; LOAD A WITH 'JP' INSTRUCTION (USED BELOW)
|
||||
|
||||
; CPU RESET / RST 0 -> WARM START CP/M
|
||||
@@ -1936,7 +1936,7 @@ DSK_CNT .EQU DPH_CNT
|
||||
; MAP LOGICAL TO PHYSICAL DEVICES
|
||||
;
|
||||
LD_TTY .EQU CIODEV_UART
|
||||
LD_CRT .EQU CIODEV_VDU
|
||||
LD_CRT .EQU CIODEV_CRT
|
||||
LD_BAT .EQU CIODEV_BAT
|
||||
LD_UC1 .EQU CIODEV_UART
|
||||
LD_PTR .EQU CIODEV_UART
|
||||
@@ -1953,7 +1953,10 @@ LD_UC1 .SET CIODEV_UART + 1
|
||||
#ENDIF
|
||||
;
|
||||
#IF (VDUENABLE)
|
||||
LD_CRT .SET CIODEV_VDU
|
||||
LD_CRT .SET CIODEV_CRT
|
||||
#ENDIF
|
||||
#IF (N8VENABLE)
|
||||
LD_CRT .SET CIODEV_CRT
|
||||
#ENDIF
|
||||
#IF (PRPENABLE & PRPCONENABLE)
|
||||
LD_CRT .SET CIODEV_PRPCON
|
||||
|
||||
@@ -9,10 +9,10 @@ CPUFREQ .EQU 20 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
|
||||
;
|
||||
PLATFORM .EQU PLT_N8 ; PLT_N8VEM, PLT_ZETA, PLT_N8
|
||||
;
|
||||
DIOPLT .EQU 0 ; DEPRECATED
|
||||
;
|
||||
DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON
|
||||
ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
|
||||
DEFVDA .EQU VDADEV_N8 ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_7220, VDADEV_N8)
|
||||
DEFEMU .EQU EMUTYP_TTY ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...)
|
||||
;
|
||||
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
|
||||
CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA)
|
||||
@@ -25,10 +25,10 @@ UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRU
|
||||
UARTFIFO .EQU TRUE ; TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
|
||||
UARTAFC .EQU FALSE ; TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
|
||||
;
|
||||
VDUENABLE .EQU FALSE ; TRUE FOR VDU SERVICES (YOU MUST HAVE THE HARDWARE!)
|
||||
VDUMODE .EQU VDUMODE_VDU ; VDUMODE_NONE, VDUMODE_VDU, VDUMODE_N8, VDUMODE_CVDU (ONLY VDUPLT_VDU IMPLEMENTED!)
|
||||
;
|
||||
BIOSSIZE .EQU 0100H ; AMOUNT OF SPACE WITHIN BIOS AREA TO RESERVE FOR DATA
|
||||
VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT
|
||||
CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT
|
||||
UPD7220ENABLE .EQU FALSE ; TRUE FOR uPD7220 BOARD SUPPORT
|
||||
N8VENABLE .EQU TRUE ; TRUE FOR N8 (TMS9918) VIDEO/KBD SUPPORT
|
||||
;
|
||||
DEFIOBYTE .EQU $00 ; DEFAULT INITIAL VALUE FOR CP/M IOBYTE, $00=TTY, $01=CRT (MUST HAVE CRT HARDWARE)
|
||||
ALTIOBYTE .EQU DEFIOBYTE ; ALT INITIAL VALUE (USED WHEN CONFIG JUMPER SHORTED)
|
||||
@@ -78,7 +78,10 @@ HDSKENABLE .EQU FALSE ; TRUE FOR SIMH HDSK SUPPORT
|
||||
HDSKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
|
||||
HDSKCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
|
||||
;
|
||||
BOOTTYPE: .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
TTYENABLE .EQU TRUE ; INCLUDE TTY EMULATION SUPPORT
|
||||
ANSIENABLE .EQU TRUE ; INCLUDE ANSI EMULATION SUPPORT
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
|
||||
@@ -9,10 +9,10 @@ CPUFREQ .EQU 20 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
|
||||
;
|
||||
PLATFORM .EQU PLT_N8 ; PLT_N8VEM, PLT_ZETA, PLT_N8
|
||||
;
|
||||
DIOPLT .EQU 0 ; DEPRECATED
|
||||
;
|
||||
DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON
|
||||
ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
|
||||
DEFVDA .EQU VDADEV_N8 ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_7220, VDADEV_N8)
|
||||
DEFEMU .EQU EMUTYP_TTY ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...)
|
||||
;
|
||||
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
|
||||
CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA)
|
||||
@@ -25,10 +25,10 @@ UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRU
|
||||
UARTFIFO .EQU TRUE ; TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
|
||||
UARTAFC .EQU FALSE ; TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
|
||||
;
|
||||
VDUENABLE .EQU FALSE ; TRUE FOR VDU SERVICES (YOU MUST HAVE THE HARDWARE!)
|
||||
VDUMODE .EQU VDUMODE_VDU ; VDUMODE_NONE, VDUMODE_VDU, VDUMODE_N8, VDUMODE_CVDU (ONLY VDUPLT_VDU IMPLEMENTED!)
|
||||
;
|
||||
BIOSSIZE .EQU 0100H ; AMOUNT OF SPACE WITHIN BIOS AREA TO RESERVE FOR DATA
|
||||
VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT
|
||||
CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT
|
||||
UPD7220ENABLE .EQU FALSE ; TRUE FOR uPD7220 BOARD SUPPORT
|
||||
N8VENABLE .EQU TRUE ; TRUE FOR N8 (TMS9918) VIDEO/KBD SUPPORT
|
||||
;
|
||||
DEFIOBYTE .EQU $00 ; DEFAULT INITIAL VALUE FOR CP/M IOBYTE, $00=TTY, $01=CRT (MUST HAVE CRT HARDWARE)
|
||||
ALTIOBYTE .EQU DEFIOBYTE ; ALT INITIAL VALUE (USED WHEN CONFIG JUMPER SHORTED)
|
||||
@@ -78,7 +78,10 @@ HDSKENABLE .EQU FALSE ; TRUE FOR SIMH HDSK SUPPORT
|
||||
HDSKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
|
||||
HDSKCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
|
||||
;
|
||||
BOOTTYPE: .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
TTYENABLE .EQU TRUE ; INCLUDE TTY EMULATION SUPPORT
|
||||
ANSIENABLE .EQU TRUE ; INCLUDE ANSI EMULATION SUPPORT
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
|
||||
@@ -9,10 +9,10 @@ CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
|
||||
;
|
||||
PLATFORM .EQU PLT_N8VEM ; PLT_N8VEM, PLT_ZETA, PLT_N8
|
||||
;
|
||||
DIOPLT .EQU 0 ; DEPRECATED
|
||||
;
|
||||
DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON
|
||||
ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
|
||||
DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_7220, VDADEV_N8)
|
||||
DEFEMU .EQU EMUTYP_TTY ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...)
|
||||
;
|
||||
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
|
||||
CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA)
|
||||
@@ -25,10 +25,10 @@ UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRU
|
||||
UARTFIFO .EQU TRUE ; TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
|
||||
UARTAFC .EQU FALSE ; TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
|
||||
;
|
||||
VDUENABLE .EQU FALSE ; TRUE FOR VDU SERVICES (YOU MUST HAVE THE HARDWARE!)
|
||||
VDUMODE .EQU VDUMODE_VDU ; VDUMODE_NONE, VDUMODE_VDU, VDUMODE_N8, VDUMODE_CVDU (ONLY VDUPLT_VDU IMPLEMENTED!)
|
||||
;
|
||||
BIOSSIZE .EQU 0100H ; AMOUNT OF SPACE WITHIN BIOS AREA TO RESERVE FOR DATA
|
||||
VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT
|
||||
CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT
|
||||
UPD7220ENABLE .EQU FALSE ; TRUE FOR uPD7220 BOARD SUPPORT
|
||||
N8VENABLE .EQU FALSE ; TRUE FOR N8 (TMS9918) VIDEO/KBD SUPPORT
|
||||
;
|
||||
DEFIOBYTE .EQU $00 ; DEFAULT INITIAL VALUE FOR CP/M IOBYTE, $00=TTY, $01=CRT (MUST HAVE CRT HARDWARE)
|
||||
ALTIOBYTE .EQU DEFIOBYTE ; ALT INITIAL VALUE (USED WHEN CONFIG JUMPER SHORTED)
|
||||
@@ -78,7 +78,10 @@ HDSKENABLE .EQU FALSE ; TRUE FOR SIMH HDSK SUPPORT
|
||||
HDSKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
|
||||
HDSKCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
|
||||
;
|
||||
BOOTTYPE: .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
TTYENABLE .EQU FALSE ; INCLUDE TTY EMULATION SUPPORT
|
||||
ANSIENABLE .EQU FALSE ; INCLUDE ANSI EMULATION SUPPORT
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
|
||||
@@ -9,10 +9,10 @@ CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
|
||||
;
|
||||
PLATFORM .EQU PLT_N8VEM ; PLT_N8VEM, PLT_ZETA, PLT_N8
|
||||
;
|
||||
DIOPLT .EQU 0 ; DEPRECATED
|
||||
;
|
||||
DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON
|
||||
ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
|
||||
DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_7220, VDADEV_N8)
|
||||
DEFEMU .EQU EMUTYP_TTY ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...)
|
||||
;
|
||||
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
|
||||
CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA)
|
||||
@@ -25,10 +25,10 @@ UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRU
|
||||
UARTFIFO .EQU TRUE ; TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
|
||||
UARTAFC .EQU FALSE ; TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
|
||||
;
|
||||
VDUENABLE .EQU FALSE ; TRUE FOR VDU SERVICES (YOU MUST HAVE THE HARDWARE!)
|
||||
VDUMODE .EQU VDUMODE_VDU ; VDUMODE_NONE, VDUMODE_VDU, VDUMODE_N8, VDUMODE_CVDU (ONLY VDUPLT_VDU IMPLEMENTED!)
|
||||
;
|
||||
BIOSSIZE .EQU 0100H ; AMOUNT OF SPACE WITHIN BIOS AREA TO RESERVE FOR DATA
|
||||
VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT
|
||||
CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT
|
||||
UPD7220ENABLE .EQU FALSE ; TRUE FOR uPD7220 BOARD SUPPORT
|
||||
N8VENABLE .EQU FALSE ; TRUE FOR N8 (TMS9918) VIDEO/KBD SUPPORT
|
||||
;
|
||||
DEFIOBYTE .EQU $00 ; DEFAULT INITIAL VALUE FOR CP/M IOBYTE, $00=TTY, $01=CRT (MUST HAVE CRT HARDWARE)
|
||||
ALTIOBYTE .EQU DEFIOBYTE ; ALT INITIAL VALUE (USED WHEN CONFIG JUMPER SHORTED)
|
||||
@@ -78,7 +78,10 @@ HDSKENABLE .EQU FALSE ; TRUE FOR SIMH HDSK SUPPORT
|
||||
HDSKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
|
||||
HDSKCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
|
||||
;
|
||||
BOOTTYPE: .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
TTYENABLE .EQU FALSE ; INCLUDE TTY EMULATION SUPPORT
|
||||
ANSIENABLE .EQU FALSE ; INCLUDE ANSI EMULATION SUPPORT
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
|
||||
@@ -9,10 +9,10 @@ CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
|
||||
;
|
||||
PLATFORM .EQU PLT_N8VEM ; PLT_N8VEM, PLT_ZETA, PLT_N8
|
||||
;
|
||||
DIOPLT .EQU 0 ; DEPRECATED
|
||||
;
|
||||
DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON
|
||||
ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
|
||||
DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_7220, VDADEV_N8)
|
||||
DEFEMU .EQU EMUTYP_TTY ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...)
|
||||
;
|
||||
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
|
||||
CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA)
|
||||
@@ -25,10 +25,10 @@ UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRU
|
||||
UARTFIFO .EQU TRUE ; TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
|
||||
UARTAFC .EQU FALSE ; TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
|
||||
;
|
||||
VDUENABLE .EQU FALSE ; TRUE FOR VDU SERVICES (YOU MUST HAVE THE HARDWARE!)
|
||||
VDUMODE .EQU VDUMODE_VDU ; VDUMODE_NONE, VDUMODE_VDU, VDUMODE_N8, VDUMODE_CVDU (ONLY VDUPLT_VDU IMPLEMENTED!)
|
||||
;
|
||||
BIOSSIZE .EQU 0100H ; AMOUNT OF SPACE WITHIN BIOS AREA TO RESERVE FOR DATA
|
||||
VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT
|
||||
CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT
|
||||
UPD7220ENABLE .EQU FALSE ; TRUE FOR uPD7220 BOARD SUPPORT
|
||||
N8VENABLE .EQU FALSE ; TRUE FOR N8 (TMS9918) VIDEO/KBD SUPPORT
|
||||
;
|
||||
DEFIOBYTE .EQU $00 ; DEFAULT INITIAL VALUE FOR CP/M IOBYTE, $00=TTY, $01=CRT (MUST HAVE CRT HARDWARE)
|
||||
ALTIOBYTE .EQU DEFIOBYTE ; ALT INITIAL VALUE (USED WHEN CONFIG JUMPER SHORTED)
|
||||
@@ -78,7 +78,10 @@ HDSKENABLE .EQU FALSE ; TRUE FOR SIMH HDSK SUPPORT
|
||||
HDSKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
|
||||
HDSKCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
|
||||
;
|
||||
BOOTTYPE: .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
TTYENABLE .EQU FALSE ; INCLUDE TTY EMULATION SUPPORT
|
||||
ANSIENABLE .EQU FALSE ; INCLUDE ANSI EMULATION SUPPORT
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
|
||||
@@ -9,10 +9,10 @@ CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
|
||||
;
|
||||
PLATFORM .EQU PLT_N8VEM ; PLT_N8VEM, PLT_ZETA, PLT_N8
|
||||
;
|
||||
DIOPLT .EQU 0 ; DEPRECATED
|
||||
;
|
||||
DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON
|
||||
ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
|
||||
DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_7220, VDADEV_N8)
|
||||
DEFEMU .EQU EMUTYP_TTY ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...)
|
||||
;
|
||||
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
|
||||
CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA)
|
||||
@@ -25,10 +25,10 @@ UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRU
|
||||
UARTFIFO .EQU TRUE ; TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
|
||||
UARTAFC .EQU FALSE ; TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
|
||||
;
|
||||
VDUENABLE .EQU FALSE ; TRUE FOR VDU SERVICES (YOU MUST HAVE THE HARDWARE!)
|
||||
VDUMODE .EQU VDUMODE_VDU ; VDUMODE_NONE, VDUMODE_VDU, VDUMODE_N8, VDUMODE_CVDU (ONLY VDUPLT_VDU IMPLEMENTED!)
|
||||
;
|
||||
BIOSSIZE .EQU 0100H ; AMOUNT OF SPACE WITHIN BIOS AREA TO RESERVE FOR DATA
|
||||
VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT
|
||||
CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT
|
||||
UPD7220ENABLE .EQU FALSE ; TRUE FOR uPD7220 BOARD SUPPORT
|
||||
N8VENABLE .EQU FALSE ; TRUE FOR N8 (TMS9918) VIDEO/KBD SUPPORT
|
||||
;
|
||||
DEFIOBYTE .EQU $00 ; DEFAULT INITIAL VALUE FOR CP/M IOBYTE, $00=TTY, $01=CRT (MUST HAVE CRT HARDWARE)
|
||||
ALTIOBYTE .EQU DEFIOBYTE ; ALT INITIAL VALUE (USED WHEN CONFIG JUMPER SHORTED)
|
||||
@@ -78,7 +78,10 @@ HDSKENABLE .EQU FALSE ; TRUE FOR SIMH HDSK SUPPORT
|
||||
HDSKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
|
||||
HDSKCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
|
||||
;
|
||||
BOOTTYPE: .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
TTYENABLE .EQU FALSE ; INCLUDE TTY EMULATION SUPPORT
|
||||
ANSIENABLE .EQU FALSE ; INCLUDE ANSI EMULATION SUPPORT
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
|
||||
@@ -9,10 +9,10 @@ CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
|
||||
;
|
||||
PLATFORM .EQU PLT_N8VEM ; PLT_N8VEM, PLT_ZETA, PLT_N8
|
||||
;
|
||||
DIOPLT .EQU 0 ; DEPRECATED
|
||||
;
|
||||
DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON
|
||||
ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
|
||||
DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_7220, VDADEV_N8)
|
||||
DEFEMU .EQU EMUTYP_TTY ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...)
|
||||
;
|
||||
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
|
||||
CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA)
|
||||
@@ -25,10 +25,10 @@ UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRU
|
||||
UARTFIFO .EQU TRUE ; TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
|
||||
UARTAFC .EQU FALSE ; TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
|
||||
;
|
||||
VDUENABLE .EQU FALSE ; TRUE FOR VDU SERVICES (YOU MUST HAVE THE HARDWARE!)
|
||||
VDUMODE .EQU VDUMODE_VDU ; VDUMODE_NONE, VDUMODE_VDU, VDUMODE_N8, VDUMODE_CVDU (ONLY VDUPLT_VDU IMPLEMENTED!)
|
||||
;
|
||||
BIOSSIZE .EQU 0100H ; AMOUNT OF SPACE WITHIN BIOS AREA TO RESERVE FOR DATA
|
||||
VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT
|
||||
CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT
|
||||
UPD7220ENABLE .EQU FALSE ; TRUE FOR uPD7220 BOARD SUPPORT
|
||||
N8VENABLE .EQU FALSE ; TRUE FOR N8 (TMS9918) VIDEO/KBD SUPPORT
|
||||
;
|
||||
DEFIOBYTE .EQU $00 ; DEFAULT INITIAL VALUE FOR CP/M IOBYTE, $00=TTY, $01=CRT (MUST HAVE CRT HARDWARE)
|
||||
ALTIOBYTE .EQU DEFIOBYTE ; ALT INITIAL VALUE (USED WHEN CONFIG JUMPER SHORTED)
|
||||
@@ -78,7 +78,10 @@ HDSKENABLE .EQU FALSE ; TRUE FOR SIMH HDSK SUPPORT
|
||||
HDSKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
|
||||
HDSKCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
|
||||
;
|
||||
BOOTTYPE: .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
TTYENABLE .EQU FALSE ; INCLUDE TTY EMULATION SUPPORT
|
||||
ANSIENABLE .EQU FALSE ; INCLUDE ANSI EMULATION SUPPORT
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
|
||||
@@ -9,10 +9,10 @@ CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
|
||||
;
|
||||
PLATFORM .EQU PLT_N8VEM ; PLT_N8VEM, PLT_ZETA, PLT_N8
|
||||
;
|
||||
DIOPLT .EQU 0 ; DEPRECATED
|
||||
;
|
||||
DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON
|
||||
ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
|
||||
DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_7220, VDADEV_N8)
|
||||
DEFEMU .EQU EMUTYP_TTY ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...)
|
||||
;
|
||||
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
|
||||
CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA)
|
||||
@@ -25,10 +25,10 @@ UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRU
|
||||
UARTFIFO .EQU TRUE ; TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
|
||||
UARTAFC .EQU FALSE ; TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
|
||||
;
|
||||
VDUENABLE .EQU FALSE ; TRUE FOR VDU SERVICES (YOU MUST HAVE THE HARDWARE!)
|
||||
VDUMODE .EQU VDUMODE_VDU ; VDUMODE_NONE, VDUMODE_VDU, VDUMODE_N8, VDUMODE_CVDU (ONLY VDUPLT_VDU IMPLEMENTED!)
|
||||
;
|
||||
BIOSSIZE .EQU 0100H ; AMOUNT OF SPACE WITHIN BIOS AREA TO RESERVE FOR DATA
|
||||
VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT
|
||||
CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT
|
||||
UPD7220ENABLE .EQU FALSE ; TRUE FOR uPD7220 BOARD SUPPORT
|
||||
N8VENABLE .EQU FALSE ; TRUE FOR N8 (TMS9918) VIDEO/KBD SUPPORT
|
||||
;
|
||||
DEFIOBYTE .EQU $00 ; DEFAULT INITIAL VALUE FOR CP/M IOBYTE, $00=TTY, $01=CRT (MUST HAVE CRT HARDWARE)
|
||||
ALTIOBYTE .EQU DEFIOBYTE ; ALT INITIAL VALUE (USED WHEN CONFIG JUMPER SHORTED)
|
||||
@@ -78,7 +78,10 @@ HDSKENABLE .EQU FALSE ; TRUE FOR SIMH HDSK SUPPORT
|
||||
HDSKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
|
||||
HDSKCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
|
||||
;
|
||||
BOOTTYPE: .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
TTYENABLE .EQU FALSE ; INCLUDE TTY EMULATION SUPPORT
|
||||
ANSIENABLE .EQU FALSE ; INCLUDE ANSI EMULATION SUPPORT
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
|
||||
@@ -9,10 +9,10 @@ CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
|
||||
;
|
||||
PLATFORM .EQU PLT_N8VEM ; PLT_N8VEM, PLT_ZETA, PLT_N8
|
||||
;
|
||||
DIOPLT .EQU 0 ; DEPRECATED
|
||||
;
|
||||
DEFCON .EQU CIODEV_PRPCON ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON
|
||||
ALTCON .EQU CIODEV_UART ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
|
||||
DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_7220, VDADEV_N8)
|
||||
DEFEMU .EQU EMUTYP_TTY ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...)
|
||||
;
|
||||
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
|
||||
CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA)
|
||||
@@ -25,10 +25,10 @@ UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRU
|
||||
UARTFIFO .EQU TRUE ; TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
|
||||
UARTAFC .EQU FALSE ; TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
|
||||
;
|
||||
VDUENABLE .EQU FALSE ; TRUE FOR VDU SERVICES (YOU MUST HAVE THE HARDWARE!)
|
||||
VDUMODE .EQU VDUMODE_VDU ; VDUMODE_NONE, VDUMODE_VDU, VDUMODE_N8, VDUMODE_CVDU (ONLY VDUPLT_VDU IMPLEMENTED!)
|
||||
;
|
||||
BIOSSIZE .EQU 0100H ; AMOUNT OF SPACE WITHIN BIOS AREA TO RESERVE FOR DATA
|
||||
VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT
|
||||
CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT
|
||||
UPD7220ENABLE .EQU FALSE ; TRUE FOR uPD7220 BOARD SUPPORT
|
||||
N8VENABLE .EQU FALSE ; TRUE FOR N8 (TMS9918) VIDEO/KBD SUPPORT
|
||||
;
|
||||
DEFIOBYTE .EQU $01 ; DEFAULT INITIAL VALUE FOR CP/M IOBYTE, $00=TTY, $01=CRT (MUST HAVE CRT HARDWARE)
|
||||
ALTIOBYTE .EQU $00 ; ALT INITIAL VALUE (USED WHEN CONFIG JUMPER SHORTED)
|
||||
@@ -78,7 +78,10 @@ HDSKENABLE .EQU FALSE ; TRUE FOR SIMH HDSK SUPPORT
|
||||
HDSKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
|
||||
HDSKCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
|
||||
;
|
||||
BOOTTYPE: .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
TTYENABLE .EQU FALSE ; INCLUDE TTY EMULATION SUPPORT
|
||||
ANSIENABLE .EQU FALSE ; INCLUDE ANSI EMULATION SUPPORT
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
|
||||
@@ -9,10 +9,10 @@ CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
|
||||
;
|
||||
PLATFORM .EQU PLT_N8VEM ; PLT_N8VEM, PLT_ZETA, PLT_N8
|
||||
;
|
||||
DIOPLT .EQU 0 ; DEPRECATED
|
||||
;
|
||||
DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON
|
||||
ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
|
||||
DEFVDA .EQU VDADEV_VDU ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_7220, VDADEV_N8)
|
||||
DEFEMU .EQU EMUTYP_TTY ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...)
|
||||
;
|
||||
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
|
||||
CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA)
|
||||
@@ -25,10 +25,10 @@ UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRU
|
||||
UARTFIFO .EQU TRUE ; TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
|
||||
UARTAFC .EQU FALSE ; TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
|
||||
;
|
||||
VDUENABLE .EQU TRUE ; TRUE FOR VDU SERVICES (YOU MUST HAVE THE HARDWARE!)
|
||||
VDUMODE .EQU VDUMODE_VDU ; VDUMODE_NONE, VDUMODE_VDU, VDUMODE_N8, VDUMODE_CVDU (ONLY VDUPLT_VDU IMPLEMENTED!)
|
||||
;
|
||||
BIOSSIZE .EQU 0100H ; AMOUNT OF SPACE WITHIN BIOS AREA TO RESERVE FOR DATA
|
||||
VDUENABLE .EQU TRUE ; TRUE FOR VDU BOARD SUPPORT
|
||||
CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT
|
||||
UPD7220ENABLE .EQU FALSE ; TRUE FOR uPD7220 BOARD SUPPORT
|
||||
N8VENABLE .EQU FALSE ; TRUE FOR N8 (TMS9918) VIDEO/KBD SUPPORT
|
||||
;
|
||||
DEFIOBYTE .EQU $00 ; DEFAULT INITIAL VALUE FOR CP/M IOBYTE, $00=TTY, $01=CRT (MUST HAVE CRT HARDWARE)
|
||||
ALTIOBYTE .EQU DEFIOBYTE ; ALT INITIAL VALUE (USED WHEN CONFIG JUMPER SHORTED)
|
||||
@@ -78,7 +78,10 @@ HDSKENABLE .EQU FALSE ; TRUE FOR SIMH HDSK SUPPORT
|
||||
HDSKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
|
||||
HDSKCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
|
||||
;
|
||||
BOOTTYPE: .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
TTYENABLE .EQU TRUE ; INCLUDE TTY EMULATION SUPPORT
|
||||
ANSIENABLE .EQU TRUE ; INCLUDE ANSI EMULATION SUPPORT
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
|
||||
@@ -9,10 +9,10 @@ CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
|
||||
;
|
||||
PLATFORM .EQU PLT_N8VEM ; PLT_N8VEM, PLT_ZETA, PLT_N8
|
||||
;
|
||||
DIOPLT .EQU 0 ; DEPRECATED
|
||||
;
|
||||
DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON
|
||||
ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
|
||||
DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_7220, VDADEV_N8)
|
||||
DEFEMU .EQU EMUTYP_TTY ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...)
|
||||
;
|
||||
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
|
||||
CLRRAMDISK .EQU CLR_ALWAYS ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA)
|
||||
@@ -25,10 +25,10 @@ UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRU
|
||||
UARTFIFO .EQU FALSE ; TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
|
||||
UARTAFC .EQU FALSE ; TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
|
||||
;
|
||||
VDUENABLE .EQU FALSE ; TRUE FOR VDU SERVICES (YOU MUST HAVE THE HARDWARE!)
|
||||
VDUMODE .EQU VDUMODE_VDU ; VDUMODE_NONE, VDUMODE_VDU, VDUMODE_N8, VDUMODE_CVDU (ONLY VDUPLT_VDU IMPLEMENTED!)
|
||||
;
|
||||
BIOSSIZE .EQU 0100H ; AMOUNT OF SPACE WITHIN BIOS AREA TO RESERVE FOR DATA
|
||||
VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT
|
||||
CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT
|
||||
UPD7220ENABLE .EQU FALSE ; TRUE FOR uPD7220 BOARD SUPPORT
|
||||
N8VENABLE .EQU FALSE ; TRUE FOR N8 (TMS9918) VIDEO/KBD SUPPORT
|
||||
;
|
||||
DEFIOBYTE .EQU $00 ; DEFAULT INITIAL VALUE FOR CP/M IOBYTE, $00=TTY, $01=CRT (MUST HAVE CRT HARDWARE)
|
||||
ALTIOBYTE .EQU DEFIOBYTE ; ALT INITIAL VALUE (USED WHEN CONFIG JUMPER SHORTED)
|
||||
@@ -78,7 +78,10 @@ HDSKENABLE .EQU TRUE ; TRUE FOR HDSK SUPPORT
|
||||
HDSKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
|
||||
HDSKCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
|
||||
;
|
||||
BOOTTYPE: .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
TTYENABLE .EQU FALSE ; INCLUDE TTY EMULATION SUPPORT
|
||||
ANSIENABLE .EQU FALSE ; INCLUDE ANSI EMULATION SUPPORT
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
|
||||
@@ -9,10 +9,10 @@ CPUFREQ .EQU 20 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
|
||||
;
|
||||
PLATFORM .EQU PLT_ZETA ; PLT_N8VEM, PLT_ZETA, PLT_N8
|
||||
;
|
||||
DIOPLT .EQU 0 ; DEPRECATED
|
||||
;
|
||||
DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON
|
||||
ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
|
||||
DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_7220, VDADEV_N8)
|
||||
DEFEMU .EQU EMUTYP_TTY ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...)
|
||||
;
|
||||
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
|
||||
CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA)
|
||||
@@ -25,10 +25,10 @@ UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRU
|
||||
UARTFIFO .EQU TRUE ; TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
|
||||
UARTAFC .EQU FALSE ; TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
|
||||
;
|
||||
VDUENABLE .EQU FALSE ; TRUE FOR VDU SERVICES (YOU MUST HAVE THE HARDWARE!)
|
||||
VDUMODE .EQU VDUMODE_VDU ; VDUMODE_NONE, VDUMODE_VDU, VDUMODE_N8, VDUMODE_CVDU (ONLY VDUPLT_VDU IMPLEMENTED!)
|
||||
;
|
||||
BIOSSIZE .EQU 0100H ; AMOUNT OF SPACE WITHIN BIOS AREA TO RESERVE FOR DATA
|
||||
VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT
|
||||
CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT
|
||||
UPD7220ENABLE .EQU FALSE ; TRUE FOR uPD7220 BOARD SUPPORT
|
||||
N8VENABLE .EQU FALSE ; TRUE FOR N8 (TMS9918) VIDEO/KBD SUPPORT
|
||||
;
|
||||
DEFIOBYTE .EQU $00 ; DEFAULT INITIAL VALUE FOR CP/M IOBYTE, $00=TTY, $01=CRT (MUST HAVE CRT HARDWARE)
|
||||
ALTIOBYTE .EQU DEFIOBYTE ; ALT INITIAL VALUE (USED WHEN CONFIG JUMPER SHORTED)
|
||||
@@ -78,7 +78,10 @@ HDSKENABLE .EQU FALSE ; TRUE FOR SIMH HDSK SUPPORT
|
||||
HDSKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
|
||||
HDSKCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
|
||||
;
|
||||
BOOTTYPE: .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
TTYENABLE .EQU FALSE ; INCLUDE TTY EMULATION SUPPORT
|
||||
ANSIENABLE .EQU FALSE ; INCLUDE ANSI EMULATION SUPPORT
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
|
||||
@@ -9,10 +9,10 @@ CPUFREQ .EQU 20 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
|
||||
;
|
||||
PLATFORM .EQU PLT_ZETA ; PLT_N8VEM, PLT_ZETA, PLT_N8
|
||||
;
|
||||
DIOPLT .EQU 0 ; DEPRECATED
|
||||
;
|
||||
DEFCON .EQU CIODEV_PPPCON ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON
|
||||
ALTCON .EQU CIODEV_UART ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
|
||||
DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_7220, VDADEV_N8)
|
||||
DEFEMU .EQU EMUTYP_TTY ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...)
|
||||
;
|
||||
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
|
||||
CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA)
|
||||
@@ -25,10 +25,10 @@ UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRU
|
||||
UARTFIFO .EQU TRUE ; TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
|
||||
UARTAFC .EQU FALSE ; TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
|
||||
;
|
||||
VDUENABLE .EQU FALSE ; TRUE FOR VDU SERVICES (YOU MUST HAVE THE HARDWARE!)
|
||||
VDUMODE .EQU VDUMODE_VDU ; VDUMODE_NONE, VDUMODE_VDU, VDUMODE_N8, VDUMODE_CVDU (ONLY VDUPLT_VDU IMPLEMENTED!)
|
||||
;
|
||||
BIOSSIZE .EQU 0100H ; AMOUNT OF SPACE WITHIN BIOS AREA TO RESERVE FOR DATA
|
||||
VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT
|
||||
CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT
|
||||
UPD7220ENABLE .EQU FALSE ; TRUE FOR uPD7220 BOARD SUPPORT
|
||||
N8VENABLE .EQU FALSE ; TRUE FOR N8 (TMS9918) VIDEO/KBD SUPPORT
|
||||
;
|
||||
DEFIOBYTE .EQU $01 ; DEFAULT INITIAL VALUE FOR CP/M IOBYTE, $00=TTY, $01=CRT (MUST HAVE CRT HARDWARE)
|
||||
ALTIOBYTE .EQU $00 ; ALT INITIAL VALUE (USED WHEN CONFIG JUMPER SHORTED)
|
||||
@@ -78,7 +78,10 @@ HDSKENABLE .EQU FALSE ; TRUE FOR SIMH HDSK SUPPORT
|
||||
HDSKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
|
||||
HDSKCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
|
||||
;
|
||||
BOOTTYPE: .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
TTYENABLE .EQU FALSE ; INCLUDE TTY EMULATION SUPPORT
|
||||
ANSIENABLE .EQU FALSE ; INCLUDE ANSI EMULATION SUPPORT
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
|
||||
124
Source/n8v.asm
Normal file
124
Source/n8v.asm
Normal file
@@ -0,0 +1,124 @@
|
||||
;__N8VDRIVER_______________________________________________________________________________________
|
||||
;
|
||||
; N8 VIDEO DRIVER FOR ROMWBW
|
||||
;
|
||||
;__________________________________________________________________________________________________
|
||||
;
|
||||
;__________________________________________________________________________________________________
|
||||
; DATA CONSTANTS
|
||||
;__________________________________________________________________________________________________
|
||||
;
|
||||
;__________________________________________________________________________________________________
|
||||
; BOARD INITIALIZATION
|
||||
;__________________________________________________________________________________________________
|
||||
;
|
||||
N8V_INIT:
|
||||
; INIT TMS9918 HERE...
|
||||
CALL PPK_INIT
|
||||
XOR A
|
||||
RET
|
||||
;
|
||||
;__________________________________________________________________________________________________
|
||||
; CHARACTER I/O (CIO) DISPATCHER
|
||||
;__________________________________________________________________________________________________
|
||||
;
|
||||
N8V_DISPCIO:
|
||||
LD A,B ; GET REQUESTED FUNCTION
|
||||
AND $0F ; ISOLATE SUB-FUNCTION
|
||||
JP Z,PPK_READ
|
||||
DEC A
|
||||
JR Z,N8V_CIOOUT
|
||||
DEC A
|
||||
JP Z,PPK_STAT
|
||||
DEC A
|
||||
JR Z,N8V_CIOOST
|
||||
CALL PANIC
|
||||
;
|
||||
N8V_CIOOUT:
|
||||
JP N8V_VDAWRC
|
||||
;
|
||||
N8V_CIOOST:
|
||||
XOR A
|
||||
INC A
|
||||
RET
|
||||
;
|
||||
;__________________________________________________________________________________________________
|
||||
; VIDEO DISPLAY ADAPTER (VDA) DISPATCHER
|
||||
;__________________________________________________________________________________________________
|
||||
;
|
||||
N8V_DISPVDA:
|
||||
LD A,B ; GET REQUESTED FUNCTION
|
||||
AND $0F ; ISOLATE SUB-FUNCTION
|
||||
|
||||
JR Z,N8V_VDAINI
|
||||
DEC A
|
||||
JR Z,N8V_VDAQRY
|
||||
DEC A
|
||||
JR Z,N8V_VDARES
|
||||
DEC A
|
||||
JR Z,N8V_VDASCS
|
||||
DEC A
|
||||
JR Z,N8V_VDASCP
|
||||
DEC A
|
||||
JR Z,N8V_VDASAT
|
||||
DEC A
|
||||
JR Z,N8V_VDASCO
|
||||
DEC A
|
||||
JR Z,N8V_VDAWRC
|
||||
DEC A
|
||||
JR Z,N8V_VDAFIL
|
||||
DEC A
|
||||
JR Z,N8V_VDASCR
|
||||
DEC A
|
||||
JP Z,PPK_STAT
|
||||
DEC A
|
||||
JP Z,PPK_FLUSH
|
||||
DEC A
|
||||
JP Z,PPK_READ
|
||||
CALL PANIC
|
||||
|
||||
N8V_VDAINI:
|
||||
XOR A
|
||||
RET
|
||||
|
||||
N8V_VDAQRY:
|
||||
CALL PANIC
|
||||
|
||||
N8V_VDARES:
|
||||
JR N8V_INIT
|
||||
|
||||
N8V_VDASCS:
|
||||
CALL PANIC
|
||||
|
||||
N8V_VDASCP:
|
||||
XOR A
|
||||
RET
|
||||
|
||||
N8V_VDASAT:
|
||||
CALL PANIC
|
||||
|
||||
N8V_VDASCO:
|
||||
CALL PANIC
|
||||
|
||||
N8V_VDAWRC:
|
||||
XOR A
|
||||
RET
|
||||
|
||||
N8V_VDAFIL:
|
||||
XOR A
|
||||
RET
|
||||
|
||||
N8V_VDASCR:
|
||||
XOR A
|
||||
RET
|
||||
;
|
||||
;__________________________________________________________________________________________________
|
||||
; IMBED COMMON PRALLEL PORT KEYBOARD DRIVER
|
||||
;__________________________________________________________________________________________________
|
||||
;
|
||||
#INCLUDE "ppk.asm"
|
||||
;
|
||||
;__________________________________________________________________________________________________
|
||||
; LOCAL DRIVER DATA
|
||||
;__________________________________________________________________________________________________
|
||||
;
|
||||
630
Source/ppk.asm
Normal file
630
Source/ppk.asm
Normal file
@@ -0,0 +1,630 @@
|
||||
;__________________________________________________________________________________________________
|
||||
;
|
||||
; PARALLEL PORT KEYBOARD DRIVER FOR N8VEM
|
||||
; SUPPORT KEYBOARD/MOUSE ON VDU AND N8
|
||||
;
|
||||
; ORIGINAL CODE BY DR JAMES MOXHAM
|
||||
; ROMWBW ADAPTATION BY WAYNE WARTHEN
|
||||
;__________________________________________________________________________________________________
|
||||
;
|
||||
;__________________________________________________________________________________________________
|
||||
; DATA CONSTANTS
|
||||
;__________________________________________________________________________________________________
|
||||
;
|
||||
#IF (PLATFORM == PLT_N8)
|
||||
PPK_PPI .EQU PPI2 ; PPI PORT BASE FOR N8
|
||||
#ELSE
|
||||
PPK_PPI .EQU 0F4H ; PPI PORT BASE FOR VDU
|
||||
#ENDIF
|
||||
|
||||
PPK_PPIA .EQU PPK_PPI + 0 ; KEYBOARD PPI PORT A
|
||||
PPK_PPIB .EQU PPK_PPI + 1 ; KEYBOARD PPI PORT B
|
||||
PPK_PPIC .EQU PPK_PPI + 2 ; KEYBOARD PPI PORT C
|
||||
PPK_PPIX .EQU PPK_PPI + 3 ; KEYBOARD PPI CONTROL PORT
|
||||
;
|
||||
;__________________________________________________________________________________________________
|
||||
; KEYBOARD INITIALIZATION
|
||||
;__________________________________________________________________________________________________
|
||||
;
|
||||
PPK_INIT:
|
||||
CALL PPK_SETPORTC ; SETS PORT C SO CAN INPUT AND OUTPUT
|
||||
CALL PPK_RESET ; RESET TO THE KEYBOARD
|
||||
LD A,200 ; 1 SECOND DELAY AS KEYBOARD SENDS STUFF BACK WHEN RESET
|
||||
CALL PPK_DELAY ; IGNORE ANYTHING BACK AFTER A RESET
|
||||
LD A,0 ; EMPTY KB QUEUE
|
||||
LD (PPK_QLEN),A
|
||||
XOR A
|
||||
RET
|
||||
;
|
||||
;__________________________________________________________________________________________________
|
||||
; KEYBOARD STATUS
|
||||
;__________________________________________________________________________________________________
|
||||
;
|
||||
PPK_STAT:
|
||||
CALL PPK_PROCESS ; CALL KEYBOARD ROUTINE
|
||||
LD A,(PPK_QLEN) ; ASK IF KEYBOARD HAS KEY WAITING
|
||||
OR A ; SET FLAGS
|
||||
JP Z,CIO_IDLE ; NO DATA, EXIT VIA IDLE PROCESSING
|
||||
LD A,$FF ; SIGNAL DATA PENDING
|
||||
RET
|
||||
;
|
||||
;__________________________________________________________________________________________________
|
||||
; KEYBOARD READ
|
||||
;__________________________________________________________________________________________________
|
||||
;
|
||||
PPK_READ:
|
||||
CALL PPK_STAT ; CHECK TO SEE IF KEY READY
|
||||
JR Z,PPK_READ ; IF NOT, LOOP
|
||||
CALL PPK_GETKEY ; GET IT
|
||||
LD E,A ; PUT KEY WHERE IT BELONGS
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
;
|
||||
;__________________________________________________________________________________________________
|
||||
; KEYBOARD FLUSH
|
||||
;__________________________________________________________________________________________________
|
||||
;
|
||||
PPK_FLUSH:
|
||||
LD A,0 ; EMPTY KB QUEUE
|
||||
LD (PPK_QLEN),A ; SAVE IT
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
;__PPK_GETKEY______________________________________________________________________________________
|
||||
;
|
||||
; GET KEY PRESS VALUE
|
||||
;__________________________________________________________________________________________________
|
||||
PPK_GETKEY:
|
||||
LD A,(PPK_QLEN) ; GET QUEUE POINTER
|
||||
OR A
|
||||
RET Z ; ABORT IF QUEUE EMPTY
|
||||
PUSH BC ; STORE BC
|
||||
LD B,A ; STORE QUEUE COUNT FOR LATER
|
||||
PUSH HL ; STORE HL
|
||||
LD A,(PPK_QUEUE) ; GET TOP BYTE FROM QUEUE
|
||||
PUSH AF ; STORE IT
|
||||
LD HL,PPK_QUEUE ; GET POINTER TO QUEUE
|
||||
PPK_GETKEY1: ;
|
||||
INC HL ; POINT TO NEXT VALUE IN QUEUE
|
||||
LD A,(HL) ; GET VALUE
|
||||
DEC HL ;
|
||||
LD (HL),A ; MOVE IT UP ONE
|
||||
INC HL ;
|
||||
DJNZ PPK_GETKEY1 ; LOOP UNTIL DONE
|
||||
LD A,(PPK_QLEN) ; DECREASE QUEUE POINTER BY ONE
|
||||
DEC A ;
|
||||
LD (PPK_QLEN),A
|
||||
POP AF ; RESTORE VALUE
|
||||
POP HL ; RESTORE HL
|
||||
POP BC ; RESTORE BC
|
||||
RET
|
||||
|
||||
;__PPK_RESET________________________________________________________________________________________
|
||||
;
|
||||
; RESET THE KEYBOARD
|
||||
;__________________________________________________________________________________________________
|
||||
PPK_RESET:
|
||||
CALL PPK_DATAHIGH ;
|
||||
CALL PPK_CLOCKHIGH ;
|
||||
LD B,255 ;
|
||||
SF1: DJNZ SF1 ;
|
||||
CALL PPK_CLOCKLOW ; STEP 1
|
||||
LD B,255 ;
|
||||
SF2: DJNZ SF2 ;
|
||||
CALL PPK_DATALOW ; STEP 2
|
||||
CALL PPK_CLOCKHIGH ; STEP 3
|
||||
CALL PPK_WAITCLOCKLOW ; STEP 4
|
||||
LD B,9 ; 8 DATA BITS + 1 PARITY BIT LOW
|
||||
SF3: PUSH BC ;
|
||||
CALL PPK_DATAHIGH ; STEP 5
|
||||
CALL PPK_WAITCLOCKHIGH ; STEP 6
|
||||
CALL PPK_WAITCLOCKLOW ; STEP 7
|
||||
POP BC ;
|
||||
DJNZ SF3 ;
|
||||
CALL PPK_DATAHIGH ; STEP9
|
||||
CALL PPK_WAITCLOCKLOW ; STEP 10 COULD READ THE ACK BIT HERE IF WANT TO
|
||||
CALL PPK_WAITCLOCKHIGH ; STEP 11
|
||||
LD B,255 ;
|
||||
SF4: DJNZ SF4 ; FINISH UP DELAY
|
||||
RET
|
||||
|
||||
;__PPK_SETPORTC_____________________________________________________________________________________
|
||||
;
|
||||
; SETUP PORT C OF 8255 FOR KEYBOARD
|
||||
;__________________________________________________________________________________________________
|
||||
PPK_SETPORTC:
|
||||
LD A,10000010B ; A=OUT B=IN, C HIGH=OUT, CLOW=OUT
|
||||
OUT (PPK_PPIX),A ; PPI CONTROL PORT
|
||||
LD A,00000000B ; PORT A TO ZERO AS NEED THIS FOR COMMS TO WORK
|
||||
OUT (PPK_PPIA),A ; PPI PORT A
|
||||
CALL PPK_DATAHIGH ;
|
||||
CALL PPK_CLOCKHIGH ;
|
||||
LD A,0 ;
|
||||
LD (CAPSLOCK),A ; SET CAPSLOCK OFF TO START
|
||||
LD (CTRL),A ; CONTROL OFF
|
||||
LD (NUMLOCK),A ; NUMLOCK OFF
|
||||
RET
|
||||
;_________________________________________________________________________________________________
|
||||
;
|
||||
; PORT C BIT ROUTINES
|
||||
;__________________________________________________________________________________________________
|
||||
PPK_PORTCBIT0HIGH: ;
|
||||
LD A,01110001B ; SEE THE 8255 DATA SHEET
|
||||
JP PPK_SETBITS ;
|
||||
PPK_PORTCBIT1HIGH: ;
|
||||
LD A,01110011B ; SEE THE 8255 DATA SHEET
|
||||
JP PPK_SETBITS ;
|
||||
PPK_PORTCBIT2HIGH: ;
|
||||
LD A,01110101B ; SEE THE 8255 DATA SHEET
|
||||
JP PPK_SETBITS ;
|
||||
PPK_PORTCBIT3HIGH: ;
|
||||
LD A,01110111B ; SEE THE 8255 DATA SHEET
|
||||
JP PPK_SETBITS ;
|
||||
PPK_PORTCBIT0LOW: ;
|
||||
LD A,01110000B ; SEE THE 8255 DATA SHEET
|
||||
JP PPK_SETBITS ;
|
||||
PPK_PORTCBIT1LOW: ;
|
||||
LD A,01110010B ; SEE THE 8255 DATA SHEET
|
||||
JP PPK_SETBITS ;
|
||||
PPK_PORTCBIT2LOW: ;
|
||||
LD A,01110100B ; SEE THE 8255 DATA SHEET
|
||||
JP PPK_SETBITS ;
|
||||
PPK_PORTCBIT3LOW: ;
|
||||
LD A,01110110B ; SEE THE 8255 DATA SHEET
|
||||
JP PPK_SETBITS ;
|
||||
PPK_DATAHIGH:
|
||||
PPK_PORTCBIT4HIGH: ;
|
||||
LD A,01111001B ; SEE THE 8255 DATA SHEET
|
||||
JP PPK_SETBITS ;
|
||||
PPK_DATALOW: ;
|
||||
PPK_PORTCBIT4LOW: ;
|
||||
LD A,01111000B ; SEE THE 8255 DATA SHEET
|
||||
JP PPK_SETBITS ;
|
||||
PPK_CLOCKHIGH: ;
|
||||
PPK_PORTCBIT5HIGH: ;
|
||||
LD A,01111011B ; BIT 5 HIGH
|
||||
JP PPK_SETBITS ;
|
||||
PPK_CLOCKLOW: ;
|
||||
PORTCBIT5LOW: ;
|
||||
LD A,01111010B ;
|
||||
PPK_SETBITS: ;
|
||||
OUT (PPK_PPIX),A ;
|
||||
RET ;
|
||||
|
||||
;__PPK_WAITCLOCKLOW_________________________________________________________________________________
|
||||
;
|
||||
; WAITCLOCKLOW SAMPLES DATA BIT 0, AND WAITS TILL
|
||||
; IT GOES LOW, THEN RETURNS
|
||||
; ALSO TIMES OUT AFTER 0 001 SECONDS
|
||||
; USES A, CHANGES B
|
||||
;__________________________________________________________________________________________________
|
||||
PPK_WAITCLOCKLOW:
|
||||
LD B,255 ; FOR TIMEOUT COUNTER
|
||||
PPK_WAITCLOCKLOW1:
|
||||
IN A,(PPK_PPIB) ; GET A BYTE FROM PORT B
|
||||
BIT 1,A ; TEST THE CLOCK BIT
|
||||
RET Z ; EXIT IF IT WENT LOW
|
||||
DJNZ PPK_WAITCLOCKLOW1 ; LOOP B TIMES
|
||||
RET
|
||||
|
||||
;__PPK_WAITCLOCKHIGH_________________________________________________________________________________
|
||||
;
|
||||
; WAITCLOCKHIGH SAMPLES DATA BIT 0, AND WAITS TILL
|
||||
; IT GOES HIGH, THEN RETURNS
|
||||
; ALSO TIMES OUT AFTER 0 001 SECONDS
|
||||
; USES A, CHANGES B
|
||||
;__________________________________________________________________________________________________
|
||||
PPK_WAITCLOCKHIGH:
|
||||
LD B,255 ; FOR TIMEOUT COUNTER
|
||||
PPK_WAITCLOCKHIGH1:
|
||||
IN A,(PPK_PPIB) ; GET A BYTE FROM PORT B
|
||||
BIT 1,A ; TEST THE CLOCK BIT
|
||||
RET NZ ; EXIT IF IT WENT HIGH
|
||||
DJNZ PPK_WAITCLOCKHIGH1 ; LOOP B TIMES
|
||||
RET
|
||||
|
||||
;__PPK_DELAY________________________________________________________________________________________
|
||||
;
|
||||
; PASS A - DELAY IS B*0 005 SECONDS, BCDEHL ALL PRESERVED
|
||||
;__________________________________________________________________________________________________
|
||||
PPK_DELAY:
|
||||
PUSH BC ; STORE ALL VARIABLES
|
||||
PUSH DE ;
|
||||
PUSH HL ;
|
||||
LD B,A ; PUT THE VARIABLE DELAY IN B
|
||||
LD DE,1 ;
|
||||
PPK_DELAY1:
|
||||
LD HL,740 ; ADJUST THIS VALUE FOR YOUR CLOCK 1481=3 68MHZ, 3219=8MHZ (TEST WITH A=1000=10 SECS)
|
||||
PPK_DELAY2:
|
||||
SBC HL,DE ; HL-1
|
||||
JR NZ,PPK_DELAY2
|
||||
DJNZ PPK_DELAY1
|
||||
POP HL ; RESTORE VARIABLES
|
||||
POP DE ;
|
||||
POP BC ;
|
||||
RET ;
|
||||
|
||||
;__PPK_PROCESS______________________________________________________________________________________
|
||||
;
|
||||
; A=0 IF WANT TO KNOW IF A BYTE IS AVAILABLE, AND A=1 TO ASK FOR THE BYTE
|
||||
;__________________________________________________________________________________________________
|
||||
PPK_PROCESS:
|
||||
CALL PPK_SKIP ; DON'T TEST EVERY ONE AS TAKES TIME
|
||||
OR A ; IS IT ZERO
|
||||
RET Z ; RETURN IF ZERO
|
||||
CALL PPK_WAITBYTE ; TEST KEYBOARD TIMES OUT AFTER A BIT
|
||||
CALL PPK_DECODECHAR ; RETURNS CHAR OR 0 FOR THINGS LIKE KEYUP, SOME RETURN DIRECTLY TO CP/M
|
||||
RET ; RETURN TO CP/M
|
||||
|
||||
;-----------------------------------------------
|
||||
; CPM CALLS THE KEYBOARD QUITE FREQUENTLY IF A KEYBOARD WAS LIKE A UART WHICH CAN BE CHECKED
|
||||
; WITH ONE INSTRUCTION, THAT WOULD BE FINE BUT CHECKING A KEYBOARD INVOLVES PUTTING THE CLOCK LINE LOW
|
||||
; THEN WAITING SOME TIME FOR A POSSIBLE REPLY, THEN READING IN BITS WITH TIMEOUTS AND THEN RETURNING
|
||||
; THIS SLOWS DOWN A LOT OF CP/M PROCESSES, EG TRY TYPE MYPROG AND PRINTING OUT TEXT
|
||||
PPK_SKIP:
|
||||
LD B,0 ;
|
||||
LD A,(SKIPCOUNT) ;
|
||||
DEC A ; SUBTRACT 1
|
||||
LD (SKIPCOUNT),A ; STORE IT BACK
|
||||
CP 0 ;
|
||||
JP NZ,PPK_SKIP1 ; WORDSTAR IS VERY SLOW EVEN TRIED A VALUE OF 5 TO 200 HERE
|
||||
LD A,200 ; ONLY ACT ON EVERY N CALLS - BIGGER=BETTER BECAUSE THIS SUB IS QUICKER THAN READBITS
|
||||
LD (SKIPCOUNT),A ; RESET COUNTER
|
||||
LD B,1 ; FLAG TO SAY RESET COUNTER
|
||||
PPK_SKIP1: ;
|
||||
LD A,B ; RETURN THE VALUE IN A
|
||||
RET
|
||||
|
||||
;__PPK_DECODECHAR____________________________________________________________________________________
|
||||
;
|
||||
; DECODE CHARACTER PASS A AND PRINTS OUT THE CHAR
|
||||
; ON THE LCD SCREEN
|
||||
;__________________________________________________________________________________________________
|
||||
PPK_DECODECHAR:
|
||||
CP 0 ; IS IT ZERO
|
||||
RET Z ; RETURN IF A ZERO - NO NEED TO DO ANYTHING
|
||||
CP 0F0H ; IS A KEY UP (NEED TO DO SPECIAL CODE FOR SHIFT)
|
||||
JP Z,DECKEYUP ; IGNORE CHAR UP
|
||||
CP 0E0H ; TWO BYTE KEYPRESSES
|
||||
JP Z,TWOBYTE ;
|
||||
CP 058H ; CAPS LOCK SO TOGGLE
|
||||
JP Z,CAPSTOG ;
|
||||
CP 12H ; SHIFT (DOWN, BECAUSE UP WOULD BE TRAPPED BY 0F ABOVE)
|
||||
JP Z,SHIFTDOWN ;
|
||||
CP 59H ; OTHER SHIFT KEY
|
||||
JP Z,SHIFTDOWN ;
|
||||
CP 014H ; CONTROL KEY
|
||||
JP Z,CONTROLDOWN ;
|
||||
CP 05AH ; ENTER KEY
|
||||
JP Z,RETURN ;
|
||||
CP 066H ; BACKSPACE KEY
|
||||
JP Z,BACKSPACE ;
|
||||
CP 0DH ; TAB KEY
|
||||
JP Z,TABKEY ;
|
||||
CP 076H ; ESCAPE KEY
|
||||
JP Z,ESCAPE ;
|
||||
LD C,A ;
|
||||
LD B,0 ; ADD BC TO HL
|
||||
LD HL,PPK_KEYMAP ; OFFSET TO ADD
|
||||
ADD HL,BC ;
|
||||
JP TESTCONTROL ; IS THE CONTROL KEY DOWN?
|
||||
DC1: LD A,(CAPSLOCK) ;
|
||||
CP 0 ; IS IT 0, IF SO THEN DON'T ADD THE CAPS OFFSET
|
||||
JR Z,DC2 ;
|
||||
LD C,080H ; ADD ANOTHER 50H TO SMALLS TO GET CAPS
|
||||
ADD HL,BC ;
|
||||
DC2: LD A,(HL) ;
|
||||
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
|
||||
RET ;
|
||||
TESTCONTROL:
|
||||
LD A,(CTRL) ;
|
||||
CP 0 ; IS CONTROL BEING HELD DOWN?
|
||||
JP Z,DC1 ; NO SO GO BACK TO TEST CAPS LOCK ON
|
||||
LD A,(HL) ; GET THE LETTER, SHOULD BE SMALLS
|
||||
SUB 96 ; A=97 SO SUBTRACT 96 A=1=^A
|
||||
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
|
||||
RET ; RETURN INSTEAD OF THE RET AFTER DC2
|
||||
TABKEY: ;
|
||||
LD A,9 ;
|
||||
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
|
||||
RET ;TAB
|
||||
BACKSPACE: ;
|
||||
LD A,8 ; BACKSPACE
|
||||
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
|
||||
RET ;
|
||||
ESCAPE: ;
|
||||
LD A,27 ;
|
||||
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
|
||||
RET ;
|
||||
RETURN: ;
|
||||
LD A,13 ; CARRIAGE RETURN
|
||||
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
|
||||
RET ;
|
||||
DECKEYUP:
|
||||
CALL PPK_WAITBYTE ; IGNORE KEY UP THROW AWAY THE CHARACTER UNLESS A SHIFT
|
||||
CP 012H ; IS IT A SHIFT
|
||||
JP Z,SHIFTUP ;
|
||||
CP 59H ; OTHER SHIFT KEY
|
||||
JP Z,SHIFTUP ;
|
||||
CP 014H ; CONTROL UP
|
||||
JP Z,CONTROLUP ; CONTROL UP
|
||||
LD A,0 ; NOTHING CAPTURED SO SEND BACK A ZERO
|
||||
RET
|
||||
TWOBYTE:; ALREADY GOT EO SO GET THE NEXT CHARACTER
|
||||
CALL PPK_WAITBYTE
|
||||
CP 0F0H ; SEE THE NOTES - KEYUP FOR E0 KEYS IS EO F0 NN NOT F0 EO!!
|
||||
JP Z,TWOBYTEUP ;
|
||||
CP 071H ; DELETE
|
||||
JP Z,DELETEKEY ;
|
||||
CP 05AH ; RETURN ON NUMBER PAD
|
||||
JP Z,RETURNKEY ;
|
||||
CP 072H ;
|
||||
JP Z,DOWNARROW ;
|
||||
CP 074H ;
|
||||
JP Z,RIGHTARROW ;
|
||||
CP 06BH ;
|
||||
JP Z,LEFTARROW ;
|
||||
CP 075H ;
|
||||
JP Z,UPARROW ;
|
||||
CP 070H ;
|
||||
JP Z,INSERT ;
|
||||
CP 07DH ;
|
||||
JP Z,PAGEUP ;
|
||||
CP 07AH ;
|
||||
JP Z,PAGEDOWN ;
|
||||
CP 06CH ;
|
||||
JP Z,HOME ;
|
||||
CP 069H ;
|
||||
JP Z,END ;
|
||||
LD A,0 ; RETURNS NOTHING
|
||||
RET
|
||||
TWOBYTEUP: ;EXPECT A BYTE AND IGNORE IT
|
||||
CALL PPK_WAITBYTE ;
|
||||
LD A,0 ;
|
||||
RET ;
|
||||
HOME: ;
|
||||
LD A,1BH ; ESC
|
||||
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
|
||||
LD A,'?' ; ?
|
||||
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
|
||||
LD A,'W' ; W
|
||||
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
|
||||
RET ;
|
||||
END: ;
|
||||
LD A,1BH ; ESC
|
||||
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
|
||||
LD A,'?' ; ?
|
||||
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
|
||||
LD A,'Q' ; Q
|
||||
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
|
||||
RET ;
|
||||
DOWNARROW: ;
|
||||
LD A,1BH ; ESC
|
||||
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
|
||||
LD A,'B' ; B
|
||||
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
|
||||
RET ;
|
||||
RIGHTARROW: ;
|
||||
LD A,1BH ; ESC
|
||||
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
|
||||
LD A,'C' ; C
|
||||
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
|
||||
RET ;
|
||||
LEFTARROW: ;
|
||||
LD A,1BH ; ESC
|
||||
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
|
||||
LD A,'D' ; D
|
||||
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
|
||||
RET ;
|
||||
UPARROW: ;
|
||||
LD A,1BH ; ESC
|
||||
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
|
||||
LD A,'A' ; A
|
||||
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
|
||||
RET ;
|
||||
INSERT: ;
|
||||
LD A,1BH ; ESC
|
||||
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
|
||||
LD A,'?' ; ?
|
||||
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
|
||||
LD A,'P' ; P
|
||||
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
|
||||
RET ;
|
||||
PAGEUP: ;
|
||||
LD A,1BH ; ESC
|
||||
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
|
||||
LD A,'?' ; ?
|
||||
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
|
||||
LD A,'Y' ; Y
|
||||
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
|
||||
RET ;
|
||||
PAGEDOWN: ;
|
||||
LD A,1BH ; ESC
|
||||
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
|
||||
LD A,'?' ; ?
|
||||
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
|
||||
LD A,'S' ; S
|
||||
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
|
||||
RET ;
|
||||
CONTROLDOWN: ; SAME CODE AS SHIFTDOWN BUT DIFF LOCATION
|
||||
LD A,0FFH ;
|
||||
LD (CTRL),A ; CONTROL DOWN
|
||||
LD A,0 ;
|
||||
RET ;
|
||||
CONTROLUP: ; CONTROL KEY UP SEE SHIFT FOR EXPLANATION
|
||||
LD A,0 ;
|
||||
LD (CTRL),A ;
|
||||
LD A,0 ;
|
||||
RET ;
|
||||
RETURNKEY: ;
|
||||
LD A,13 ;
|
||||
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
|
||||
RET ;
|
||||
DELETEKEY: ;
|
||||
LD A,07FH ; DELETE KEY VALUE THAT CP/M USES
|
||||
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
|
||||
RET ;
|
||||
CAPSTOG: ;
|
||||
LD A,(CAPSLOCK) ;
|
||||
XOR 11111111B ; SWAP ALL THE BITS
|
||||
LD (CAPSLOCK),A ;
|
||||
LD A,0 ; RETURNS NOTHING
|
||||
RET ;
|
||||
SHIFTDOWN: ; SHIFT IS SPECIAL - HOLD IT DOWN AND IT AUTOREPEATS
|
||||
; SO ONCE IT IS DOWN, TURN CAPS ON AND IGNORE ALL FURTHER SHIFTS
|
||||
; ONLY AN F0+SHIFT TURNS CAPS LOCK OFF AGAIN
|
||||
LD A,0FFH ;
|
||||
LD (CAPSLOCK),A ;
|
||||
LD A,0 ; RETURNS NOTHING
|
||||
RET ;
|
||||
SHIFTUP: ; SHIFTUP TURNS OFF CAPS LOCK DEFINITELY
|
||||
LD A,0 ;
|
||||
LD (CAPSLOCK),A ;
|
||||
LD A,0 ; RETURNS NOTHING
|
||||
RET ;
|
||||
|
||||
;__PPK_ENQUEUE______________________________________________________________________________________
|
||||
;
|
||||
; STORE A BYTE IN THE KEYBOARD QUEUE
|
||||
; A: BYTE TO ENQUEUE
|
||||
;__________________________________________________________________________________________________
|
||||
PPK_ENQUEUE:
|
||||
PUSH DE ; STORE DE
|
||||
PUSH HL ; STORE HL
|
||||
PUSH AF ; STORE VALUE
|
||||
LD A,(PPK_QLEN) ; PUT QUEUE POINTER IN A
|
||||
CP 15 ; IS QUEUE FULL
|
||||
JP P,PPK_ENQUEUE1 ; YES, ABORT
|
||||
LD HL,PPK_QUEUE ; GET QUEUE POINTER
|
||||
PUSH HL ; MOVE HL TO BC
|
||||
POP BC ;
|
||||
LD H,0 ; ZERO OUT H
|
||||
LD L,A ; PLACE QUEUE POINTER IN L
|
||||
ADD HL,BC ; POINT HL AT THE NEXT LOACTION TO ADD VALUE
|
||||
POP AF ; RESTORE VALUE
|
||||
LD (HL),A ; ENQUEUE VALUE
|
||||
LD A,(PPK_QLEN) ; GET QUEUE POINTER
|
||||
INC A ; INC IT
|
||||
LD (PPK_QLEN),A ;STORE QUEUE POINTER
|
||||
PPK_ENQUEUE1:
|
||||
POP HL ; RESTORE HL
|
||||
POP DE ; RESTORE DE
|
||||
RET
|
||||
|
||||
|
||||
;__PPK_WAITBYTE_____________________________________________________________________________________
|
||||
;
|
||||
; WAIT FOR A BYTE - TESTS A NUMBER OF TIMES IF THERE IS A KEYBOARD INPUT,
|
||||
; OVERWRITES ALL REGISTERS, RETURNS BYTE IN A
|
||||
;__________________________________________________________________________________________________
|
||||
PPK_WAITBYTE:
|
||||
CALL PPK_CLOCKHIGH ; TURN ON KEYBOARD
|
||||
LD HL,500 ; NUMBER OF TIMES TO CHECK 200=SLOW TYPE
|
||||
; 10=ERROR, 25 ?ERROR 50 OK -
|
||||
; THIS DELAY HAS TO BE THERE OTHERWISE WEIRD KEYUP ERRORS
|
||||
PPK_WAITBYTE1:
|
||||
PUSH HL ; STORE COUNTER
|
||||
CALL PPK_READBITS ; TEST FOR A LOW ON THE CLOCK LINE
|
||||
POP HL ; GET THE COUNTER BACK
|
||||
CP 0 ; TEST FOR A ZERO BACK FROM READBITS
|
||||
JR NZ,PPK_WAITBYTE2 ; IF NOT A ZERO THEN MUST HAVE A BYTE IE A KEYBOARD PRESS
|
||||
LD DE,1 ; LOAD WITH 1
|
||||
SBC HL,DE ; SUBTRACT 1
|
||||
JR NZ,PPK_WAITBYTE1 ; LOOP WAITING FOR A RESPONSE
|
||||
PPK_WAITBYTE2:
|
||||
PUSH AF ; STORE THE VALUE IN A
|
||||
CALL PPK_CLOCKLOW ; TURN OFF KEYBOARD
|
||||
POP AF ; GET BACK BYTE AS CLOCKLOW ERASED IT
|
||||
RET
|
||||
|
||||
;__PPK_READBITS_____________________________________________________________________________________
|
||||
;
|
||||
; READBITS READS 11 BITS IN FROM THE KEYBOARD
|
||||
; FIRST BIT IS A START BIT THEN 8 BITS FOR THE BYTE
|
||||
; THEN A PARITY BIT AND A STOP BIT
|
||||
; RETURNS AFTER ONE MACHINE CYCLE IF NOT LOW
|
||||
; USES A, B,D, E
|
||||
; RETURNS A=0 IF NO DATA, A= SCANCODE (OR PART THEREOF)
|
||||
;__________________________________________________________________________________________________
|
||||
PPK_READBITS:
|
||||
IN A,(PPK_PPIB)
|
||||
BIT 1,A ; TEST THE CLOCK BIT
|
||||
JR Z,PPK_READBITS1 ; IF LOW THEN START THE CAPTURE
|
||||
LD A,0 ; RETURNS A=0 IF NOTHING
|
||||
RET
|
||||
PPK_READBITS1:
|
||||
CALL PPK_WAITCLOCKHIGH ; IF GETS TO HERE THEN MUST BE LOW SO WAIT TILL HIGH
|
||||
LD B,8 ; SAMPLE 8 TIMES
|
||||
LD E,0 ; START WITH E=0
|
||||
PPK_READBITS2:
|
||||
LD D,B ; STORE BECAUSE WAITCLOCKHIGH DESTROYS
|
||||
CALL PPK_WAITCLOCKLOW ; WAIT TILL CLOCK GOES LOW
|
||||
IN A,(PPK_PPIB) ; SAMPLE THE DATA LINE
|
||||
RRA ; MOVE THE DATA BIT INTO THE CARRY REGISTER
|
||||
LD A,E ; GET THE BYTE WE ARE BUILDING IN E
|
||||
RRA ; MOVE THE CARRY BIT INTO BIT 7 AND SHIFT RIGHT
|
||||
LD E,A ; STORE IT BACK AFTER 8 CYCLES 1ST BIT READ WILL BE IN B0
|
||||
CALL PPK_WAITCLOCKHIGH ; WAIT TILL GOES HIGH
|
||||
LD B,D ; RESTORE FOR LOOP
|
||||
DJNZ PPK_READBITS2 ; DO THIS 8 TIMES
|
||||
CALL PPK_WAITCLOCKLOW ; GET THE PARITY BIT
|
||||
CALL PPK_WAITCLOCKHIGH
|
||||
CALL PPK_WAITCLOCKLOW ; GET THE STOP BIT
|
||||
CALL PPK_WAITCLOCKHIGH
|
||||
LD A,E ; RETURNS WITH ANSWER IN A
|
||||
RET
|
||||
|
||||
PPK_KEYMAP:
|
||||
; THE TI CHARACTER CODES, OFFSET FROM LABEL BY KEYBOARD SCAN CODE
|
||||
.DB $00, $00, $00, $00, $00, $00, $00, $00
|
||||
.DB $00, $00, $00, $00, $00, $09, "`", $00 ; $09=TAB
|
||||
.DB $00, $00, $00, $00, $00, "q", "1", $00
|
||||
.DB $00, $00, "z", "s", "a", "w", "2", $00
|
||||
.DB $00, "c", "x", "d", "e", "4", "3", $00
|
||||
.DB $00, " ", "v", "f", "t", "r", "5", $00
|
||||
.DB $00, "n", "b", "h", "g", "y", "6", $00
|
||||
.DB $00, $00, "m", "j", "u", "7", "8", $00
|
||||
.DB $00, ",", "k", "i", "o", "0", "9", $00
|
||||
.DB $00, ".", "/", "l", ";", "p", "-", $00
|
||||
.DB $00, $00, $27, $00, "[", "=", $00, $00 ; $27=APOSTROPHE
|
||||
.DB $00, $00, $00, "]", $00, $5C, $00, $00 ; $5C=BACKSLASH
|
||||
.DB $00, $00, $00, $00, $00, $00, $00, $00
|
||||
.DB $00, "1", $00, "4", "7", $00, $00, $00
|
||||
.DB "0", ".", "2", "5", "6", "8", $00, $00
|
||||
.DB $00, "+", "3", "-", "*", "9", $00, $00
|
||||
|
||||
PPK_SHIFTKEYMAP:
|
||||
.DB $00, $00, $00, $00, $00, $00, $00, $00
|
||||
.DB $00, $00, $00, $00, $00, $09, "~", $00 ; $09=TAB
|
||||
.DB $00, $00, $00, $00, $00, "Q", "!", $00
|
||||
.DB $00, $00, "Z", "S", "A", "W", "@", $00
|
||||
.DB $00, "C", "X", "D", "E", "$", "#", $00
|
||||
.DB $00, " ", "V", "F", "T", "R", "%", $00
|
||||
.DB $00, "N", "B", "H", "G", "Y", "^", $00
|
||||
.DB $00, $00, "M", "J", "U", "&", "*", $00
|
||||
.DB $00, "<", "K", "I", "O", ")", "(", $00
|
||||
.DB $00, ">", "?", "L", ":", "P", "_", $00
|
||||
.DB $00, $00, $22, $00, "{", "+", $00, $00 ; $22=DBLQUOTE
|
||||
.DB $00, $00, $00, "}", $00, "|", $00, $00
|
||||
.DB $00, $00, $00, $00, $00, $00, $00, $00
|
||||
.DB $00, "1", $00, "4", "7", $00, $00, $00
|
||||
.DB "0", ".", "2", "5", "6", "8", $00, $00
|
||||
.DB $00, "+", "3", "-", "*", "9", $00, $00
|
||||
;
|
||||
;==================================================================================================
|
||||
; PARALLEL PORT KEYBOARD DRIVER - DATA
|
||||
;==================================================================================================
|
||||
;
|
||||
CAPSLOCK .DB 0 ; CAPS LOCK TOGGLED FLAG, $00=NO, $FF=YES
|
||||
CTRL .DB 0 ; CTRL KEY PRESSED FLAG, $00=NO, $FF=YES
|
||||
NUMLOCK .DB 0 ; NUM LOCK TOGGLED FLAG, $00=NO, $FF=YES
|
||||
SKIPCOUNT .DB 0 ; SKIP COUNTER (SEE CODE COMMENTS)
|
||||
PPK_QUEUE .FILL 16,0 ; 16 BYTE KB QUEUE
|
||||
PPK_QLEN .DB 0 ; COUNT OF BYTES CURRENTLY IN QUEUE
|
||||
@@ -19,8 +19,14 @@
|
||||
;
|
||||
;---------------------------------------------------------------------------------------------------
|
||||
;
|
||||
TRUE: .EQU 1
|
||||
FALSE: .EQU 0
|
||||
TRUE .EQU 1
|
||||
FALSE .EQU 0
|
||||
;
|
||||
; DEPRECATED STUFF!!!
|
||||
;
|
||||
DIOPLT .EQU 0 ; DEPRECATED!!!
|
||||
VDUMODE .EQU 0 ; DEPRECATED!!!
|
||||
BIOSSIZE .EQU 0100H ; DEPRECATED!!!
|
||||
;
|
||||
; PRIMARY HARDWARE PLATFORMS
|
||||
;
|
||||
@@ -33,11 +39,13 @@ PLT_N8 .EQU 3 ; N8 (HOME COMPUTER) Z180 SBC
|
||||
BT_MENU .EQU 1 ; WAIT FOR MENU SELECTION AT LOADER PROMPT
|
||||
BT_AUTO .EQU 2 ; AUTO SELECT BOOT_DEFAULT AFTER BOOT_TIMEOUT
|
||||
;
|
||||
; VDU MODE SELECTIONS
|
||||
; VDA DEVICES (VIDEO DISPLAY ADAPTER)
|
||||
;
|
||||
VDUMODE_VDU .EQU 1 ; ORIGINAL ECB VDU (6545 CHIP)
|
||||
VDUMODE_CVDU .EQU 2 ; ECB VDU COLOR (PENDING HARDWARE DEVELOPMENT)
|
||||
VDUMODE_N8 .EQU 3 ; N8 ONBOARD VIDEO SUBSYSTEM (NOT IMPLEMENTED)
|
||||
VDADEV_NONE .EQU $00 ; NO VDA DEVICE
|
||||
VDADEV_VDU .EQU $10 ; ECB VDU - 6545 CHIP
|
||||
VDADEV_CVDU .EQU $20 ; ECB COLOR VDU - 8563 CHIP (NOT IMPLEMENTED)
|
||||
VDADEV_7220 .EQU $30 ; ECB uP7220 (NOT IMPLEMENTED)
|
||||
VDADEV_N8 .EQU $40 ; N8 ONBOARD VDA SUBSYSTEM (NOT IMPLEMENTED)
|
||||
;
|
||||
; CHARACTER DEVICES
|
||||
;
|
||||
@@ -46,6 +54,7 @@ CIODEV_PRPCON .EQU $10
|
||||
CIODEV_VDU .EQU $20
|
||||
CIODEV_CVDU .EQU $30
|
||||
CIODEV_PPPCON .EQU $40
|
||||
CIODEV_CRT .EQU $80
|
||||
CIODEV_BAT .EQU $E0
|
||||
CIODEV_NUL .EQU $F0
|
||||
;
|
||||
@@ -116,13 +125,13 @@ IDEMODE_DIDE .EQU 2 ; DUAL IDE
|
||||
;
|
||||
PPIDEMODE_STD .EQU 1 ; STANDARD N8VEM PARALLEL PORT
|
||||
PPIDEMODE_DIO3 .EQU 2 ; DISKIO V3 PARALLEL PORT
|
||||
;
|
||||
; CONSOLE DEVICE CHOICES FOR LDRCON AND DBGCON IN CONFIG SETTINGS
|
||||
;
|
||||
CON_UART .EQU 1
|
||||
CON_VDU .EQU 2
|
||||
CON_PRP .EQU 3
|
||||
CON_PPP .EQU 4
|
||||
;;
|
||||
;; CONSOLE DEVICE CHOICES FOR LDRCON AND DBGCON IN CONFIG SETTINGS
|
||||
;;
|
||||
;CON_UART .EQU 1
|
||||
;CON_VDU .EQU 2
|
||||
;CON_PRP .EQU 3
|
||||
;CON_PPP .EQU 4
|
||||
;
|
||||
; CONSOLE TERMINAL TYPE CHOICES
|
||||
;
|
||||
@@ -131,6 +140,12 @@ TERM_ANSI .EQU 1
|
||||
TERM_WYSE .EQU 2
|
||||
TERM_VT52 .EQU 3
|
||||
;
|
||||
; EMULATION TYPES
|
||||
;
|
||||
EMUTYP_NONE .EQU 0
|
||||
EMUTYP_TTY .EQU 1
|
||||
EMUTYP_ANSI .EQU 2
|
||||
;
|
||||
; SYSTEM GENERATION SETTINGS
|
||||
;
|
||||
SYS_CPM .EQU 1 ; CPM (IMPLIES BDOS + CCP)
|
||||
@@ -333,6 +348,7 @@ BF_CIOIN .EQU BF_CIO + 0 ; CHARACTER INPUT
|
||||
BF_CIOOUT .EQU BF_CIO + 1 ; CHARACTER OUTPUT
|
||||
BF_CIOIST .EQU BF_CIO + 2 ; CHARACTER INPUT STATUS
|
||||
BF_CIOOST .EQU BF_CIO + 3 ; CHARACTER OUTPUT STATUS
|
||||
BF_CIOCFG .EQU BF_CIO + 4 ; CHARACTER I/O CONFIG
|
||||
;
|
||||
BF_DIO .EQU $10
|
||||
BF_DIORD .EQU BF_DIO + 0 ; DISK READ
|
||||
@@ -340,24 +356,46 @@ BF_DIOWR .EQU BF_DIO + 1 ; DISK WRITE
|
||||
BF_DIOST .EQU BF_DIO + 2 ; DISK STATUS
|
||||
BF_DIOMED .EQU BF_DIO + 3 ; DISK MEDIA
|
||||
BF_DIOID .EQU BF_DIO + 4 ; DISK IDENTIFY
|
||||
BF_DIOGBA .EQU BF_DIO + 8 ; DISK GET BUFFER ADR
|
||||
BF_DIOSBA .EQU BF_DIO + 9 ; DISK SET BUFFER ADR
|
||||
BF_DIOGETBUF .EQU BF_DIO + 8 ; DISK GET BUFFER ADR
|
||||
BF_DIOSETBUF .EQU BF_DIO + 9 ; DISK SET BUFFER ADR
|
||||
;
|
||||
BF_CLK .EQU $20
|
||||
BF_CLKRD .EQU BF_CLK + 0
|
||||
BF_CLKWR .EQU BF_CLK + 1
|
||||
BF_RTC .EQU $20
|
||||
BF_RTCGETTIM .EQU BF_RTC + 0 ; GET TIME
|
||||
BF_RTCSETTIM .EQU BF_RTC + 1 ; SET TIME
|
||||
BF_RTCGETBYT .EQU BF_RTC + 2 ; GET NVRAM BYTE BY INDEX
|
||||
BF_RTCSETBYT .EQU BF_RTC + 3 ; SET NVRAM BYTE BY INDEX
|
||||
BF_RTCGETBLK .EQU BF_RTC + 4 ; GET NVRAM DATA BLOCK
|
||||
BF_RTCSETBLK .EQU BF_RTC + 5 ; SET NVRAM DATA BLOCK
|
||||
;
|
||||
BF_VDU .EQU $30
|
||||
BF_VDUIN .EQU BF_VDU + 0 ; VDU CHARACTER INPUT
|
||||
BF_VDUOUT .EQU BF_VDU + 1 ; VDU CHARACTER OUTPUT
|
||||
BF_VDUIST .EQU BF_VDU + 2 ; VDU CHARACTER INPUT STATUS
|
||||
BF_VDUOST .EQU BF_VDU + 3 ; VDU CHARACTER OUTPUT STATUS
|
||||
BF_VDUXY .EQU BF_VDU + 4 ; VDU CURSOR POSITION X/Y
|
||||
BF_EMU .EQU $30
|
||||
BF_EMUIN .EQU BF_EMU + 0 ; EMULATOR CHARACTER INPUT
|
||||
BF_EMUOUT .EQU BF_EMU + 1 ; EMULATOR CHARACTER OUTPUT
|
||||
BF_EMUIST .EQU BF_EMU + 2 ; EMULATOR CHARACTER INPUT STATUS
|
||||
BF_EMUOST .EQU BF_EMU + 3 ; EMULATOR CHARACTER OUTPUT STATUS
|
||||
BF_EMUCFG .EQU BF_EMU + 4 ; EMULATOR CHARACTER I/O CONFIG
|
||||
BF_EMUINI .EQU BF_EMU + 8 ; INITIALIZE EMULATION
|
||||
BF_EMUQRY .EQU BF_EMU + 9 ; QUERY EMULATION STATUS
|
||||
;
|
||||
BF_VDA .EQU $40
|
||||
BF_VDAINI .EQU BF_VDA + 0 ; INITIALIZE VDU
|
||||
BF_VDAQRY .EQU BF_VDA + 1 ; QUERY VDU STATUS
|
||||
BF_VDARES .EQU BF_VDA + 2 ; SOFT RESET VDU
|
||||
BF_VDASCS .EQU BF_VDA + 3 ; SET CURSOR STYLE
|
||||
BF_VDASCP .EQU BF_VDA + 4 ; SET CURSOR POSITION
|
||||
BF_VDASAT .EQU BF_VDA + 5 ; SET CHARACTER ATTRIBUTE
|
||||
BF_VDASCO .EQU BF_VDA + 6 ; SET CHARACTER COLOR
|
||||
BF_VDAWRC .EQU BF_VDA + 7 ; WRITE CHARACTER
|
||||
BF_VDAFIL .EQU BF_VDA + 8 ; FILL
|
||||
BF_VDASCR .EQU BF_VDA + 9 ; SCROLL
|
||||
BF_VDAKST .EQU BF_VDA + 10 ; GET KEYBOARD STATUS
|
||||
BF_VDAKFL .EQU BF_VDA + 11 ; FLUSH KEYBOARD BUFFER
|
||||
BF_VDAKRD .EQU BF_VDA + 12 ; READ KEYBOARD
|
||||
;
|
||||
BF_SYS .EQU $F0
|
||||
BF_SYSGETCFG .EQU BF_SYS + 0 ; GET CONFIGURATION DATA BLOCK
|
||||
BF_SYSSETCFG .EQU BF_SYS + 1 ; SET CONFIGURATION DATA BLOCK
|
||||
BF_SYSBNKCPY .EQU BF_SYS + 2 ; COPY TO/FROM RAM/ROM MEMORY BANK
|
||||
BF_SYSGETVER .EQU BF_SYS + 3 ; GET VERSION OF HBIOS
|
||||
;
|
||||
;
|
||||
; MEMORY LAYOUT
|
||||
|
||||
150
Source/tty.asm
Normal file
150
Source/tty.asm
Normal file
@@ -0,0 +1,150 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; TTY EMULATION MODULE
|
||||
;==================================================================================================
|
||||
;
|
||||
TTY_INIT:
|
||||
JR TTY_INI
|
||||
;
|
||||
;
|
||||
;
|
||||
TTY_DISPATCH:
|
||||
LD A,B ; GET REQUESTED FUNCTION
|
||||
AND $0F ; ISOLATE SUB-FUNCTION
|
||||
JR Z,TTY_IN ; $30
|
||||
DEC A
|
||||
JR Z,TTY_OUT ; $31
|
||||
DEC A
|
||||
JR Z,TTY_IST ; $32
|
||||
DEC A
|
||||
JR Z,TTY_OST ; $33
|
||||
DEC A
|
||||
JR Z,TTY_CFG ; $34
|
||||
CP 8
|
||||
JR Z,TTY_INI ; $38
|
||||
CP 9
|
||||
JR Z,TTY_QRY ; $39
|
||||
CALL PANIC
|
||||
;
|
||||
;
|
||||
;
|
||||
TTY_IN:
|
||||
LD B,BF_VDAKRD
|
||||
JP EMU_VDADISP
|
||||
;
|
||||
;
|
||||
;
|
||||
TTY_OUT:
|
||||
CALL TTY_DOCHAR
|
||||
XOR A
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
TTY_IST:
|
||||
LD B,BF_VDAKST
|
||||
JP EMU_VDADISP
|
||||
;
|
||||
;
|
||||
;
|
||||
TTY_OST:
|
||||
XOR A
|
||||
INC A
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
TTY_CFG:
|
||||
XOR A
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
TTY_INI:
|
||||
LD (TTY_ROW),A
|
||||
LD (TTY_COL),A
|
||||
LD B,BF_VDARES
|
||||
JP EMU_VDADISP ; RESET VDA
|
||||
;
|
||||
;
|
||||
;
|
||||
TTY_QRY:
|
||||
XOR A
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
TTY_DOCHAR:
|
||||
LD A,E ; CHARACTER TO PROCESS
|
||||
CP 8 ; BACKSPACE
|
||||
JR Z,TTY_BS
|
||||
CP 12 ; FORMFEED
|
||||
JR Z,TTY_FF
|
||||
CP 13 ; CARRIAGE RETURN
|
||||
JR Z,TTY_CR
|
||||
CP 10 ; LINEFEED
|
||||
JR Z,TTY_LF
|
||||
CP 32 ; COMPARE TO SPACE (FIRST PRINTABLE CHARACTER)
|
||||
RET C ; SWALLOW OTHER CONTROL CHARACTERS
|
||||
LD B,BF_VDAWRC
|
||||
CALL EMU_VDADISP ; SPIT OUT THE RAW CHARACTER
|
||||
LD A,(TTY_COL) ; GET CUR COL
|
||||
INC A ; INCREMENT
|
||||
LD (TTY_COL),A ; SAVE IT
|
||||
CP 80 ; COMPARE TO COLS IN LINE
|
||||
RET C ; NOT PAST END OF LINE, ALL DONE
|
||||
CALL TTY_CR ; CARRIAGE RETURN
|
||||
JR TTY_LF ; LINEFEED AND RETURN
|
||||
;
|
||||
TTY_FF:
|
||||
LD DE,0 ; HOME CURSOR
|
||||
LD (TTY_ROWCOL),DE ; SAVE IT
|
||||
CALL TTY_XY ; EXECUTE
|
||||
LD E,' ' ; FILL SCREEN WITH BLANKS
|
||||
LD HL,80 * 24 ; NUMBER OF CHARACTER POSITIONS TO FILL
|
||||
LD B,BF_VDAFIL
|
||||
CALL EMU_VDADISP ; PERFORM FILL
|
||||
JR TTY_XY ; HOME CURSOR AND RETURN
|
||||
;
|
||||
TTY_BS:
|
||||
LD DE,(TTY_ROWCOL) ; GET CURRENT ROW/COL IN DE
|
||||
LD A,E ; GET CURRENT COLUMN
|
||||
CP 1 ; COMPARE TO COLUMN 1
|
||||
RET C ; LESS THAN 1, NOTHING TO DO
|
||||
DEC E ; POINT TO PREVIOUS COLUMN
|
||||
LD (TTY_ROWCOL),DE ; SAVE NEW COLUMN VALUE
|
||||
CALL TTY_XY ; MOVE CURSOR TO NEW TARGET COLUMN
|
||||
LD E,' ' ; LOAD A SPACE CHARACTER
|
||||
LD B,BF_VDAWRC
|
||||
CALL EMU_VDADISP ; OVERWRITE WITH A SPACE CHARACTER
|
||||
JR TTY_XY ; NEED TO MOVE CURSOR BACK TO NEW TARGET COLUMN
|
||||
;
|
||||
TTY_CR:
|
||||
XOR A
|
||||
LD (TTY_COL),A
|
||||
JR TTY_XY
|
||||
;
|
||||
TTY_LF:
|
||||
LD A,(TTY_ROW)
|
||||
INC A
|
||||
LD (TTY_ROW),A
|
||||
CP 24 ; COMPARE TO SCREEN ROWS
|
||||
JR C,TTY_XY ; NOT PAST END, ALL DONE
|
||||
SUB 23 ; A WILL NOW HAVE NUM LINES TO SCROLL
|
||||
LD E,A ; LINES TO SCROLL -> E
|
||||
LD B,BF_VDASCR
|
||||
CALL EMU_VDADISP ; DO THE SCROLLING
|
||||
LD A,23 ; ROW 23
|
||||
LD (TTY_ROW),A ; IS NOW CORRECT
|
||||
JR TTY_XY ; RESPOSITION CURSOR AND RETURN
|
||||
;
|
||||
TTY_XY:
|
||||
LD DE,(TTY_ROWCOL)
|
||||
LD B,BF_VDASCP
|
||||
JP EMU_VDADISP
|
||||
;
|
||||
;
|
||||
;
|
||||
TTY_ROWCOL:
|
||||
TTY_COL .DB 0
|
||||
TTY_ROW .DB 0
|
||||
819
Source/vdu.asm
819
Source/vdu.asm
@@ -10,15 +10,11 @@
|
||||
;__________________________________________________________________________________________________
|
||||
; DATA CONSTANTS
|
||||
;__________________________________________________________________________________________________
|
||||
;IDE REGISTER IO PORT ; FUNCTION
|
||||
;
|
||||
READR .EQU 0F0h ; READ VDU
|
||||
WRITR .EQU 0F1h ; WRITE VDU
|
||||
SY6545S .EQU 0F2h ; VDU STATUS/REGISTER
|
||||
SY6545D .EQU 0F3h ;
|
||||
VPPIA .EQU 0F4h ; PPI PORT A
|
||||
VPPIB .EQU 0F5h ; PPI PORT B
|
||||
VPPIC .EQU 0F6h ; PPI PORT C
|
||||
VPPICONT .EQU 0F7h ; PPI CONTROL PORT
|
||||
|
||||
STATE_NORMAL .EQU 00H ; NORMAL TERMINAL OPS
|
||||
STATE_ESC .EQU 01H ; ESC MODE
|
||||
@@ -26,56 +22,186 @@ STATE_DIR_L .EQU 02H ; ESC-Y X *
|
||||
STATE_DIR_C .EQU 03H ; ESC-Y * X
|
||||
|
||||
ESC_KEY .EQU 1BH ; ESCAPE CODE
|
||||
;
|
||||
;__________________________________________________________________________________________________
|
||||
; BOARD INITIALIZATION
|
||||
;__________________________________________________________________________________________________
|
||||
;
|
||||
VDU_INIT:
|
||||
CALL INITVDU
|
||||
CALL PPK_INIT
|
||||
XOR A
|
||||
RET
|
||||
;
|
||||
;__________________________________________________________________________________________________
|
||||
; FUNCTION JUMP TABLE
|
||||
;__________________________________________________________________________________________________
|
||||
;
|
||||
VDU_DISPATCH:
|
||||
VDU_DISPCIO:
|
||||
LD A,B ; GET REQUESTED FUNCTION
|
||||
AND $0F ; ISOLATE SUB-FUNCTION
|
||||
JR Z,VDU_IN
|
||||
JR Z,VDU_CIOIN
|
||||
DEC A
|
||||
JR Z,VDU_OUT
|
||||
JR Z,VDU_CIOOUT
|
||||
DEC A
|
||||
JR Z,VDU_IST
|
||||
JR Z,VDU_CIOIST
|
||||
DEC A
|
||||
JR Z,VDU_OST
|
||||
JR Z,VDU_CIOOST
|
||||
CALL PANIC
|
||||
;
|
||||
VDU_CIOIN:
|
||||
JP PPK_READ
|
||||
;
|
||||
VDU_INIT:
|
||||
CALL INITVDU
|
||||
VDU_CIOIST:
|
||||
JP PPK_STAT
|
||||
;
|
||||
VDU_CIOOUT:
|
||||
JP VDU_VDAWRC
|
||||
;
|
||||
VDU_CIOOST:
|
||||
XOR A
|
||||
INC A
|
||||
RET
|
||||
;
|
||||
VDU_IN:
|
||||
CALL GET_KEY
|
||||
LD E,A
|
||||
RET
|
||||
;__________________________________________________________________________________________________
|
||||
; NEW FUNCTION JUMP TABLE
|
||||
;__________________________________________________________________________________________________
|
||||
;
|
||||
VDU_IST:
|
||||
CALL IS_KBHIT
|
||||
RET
|
||||
;
|
||||
VDU_OUT:
|
||||
LD C,E
|
||||
CALL CHARIN
|
||||
RET
|
||||
;
|
||||
VDU_OST:
|
||||
|
||||
VDU_DISPVDA:
|
||||
LD A,B ; GET REQUESTED FUNCTION
|
||||
AND $0F ; ISOLATE SUB-FUNCTION
|
||||
|
||||
JR Z,VDU_VDAINI
|
||||
DEC A
|
||||
JR Z,VDU_VDAQRY
|
||||
DEC A
|
||||
JR Z,VDU_VDARES
|
||||
DEC A
|
||||
JR Z,VDU_VDASCS
|
||||
DEC A
|
||||
JR Z,VDU_VDASCP
|
||||
DEC A
|
||||
JR Z,VDU_VDASAT
|
||||
DEC A
|
||||
JR Z,VDU_VDASCO
|
||||
DEC A
|
||||
JR Z,VDU_VDAWRC
|
||||
DEC A
|
||||
JR Z,VDU_VDAFIL
|
||||
DEC A
|
||||
JR Z,VDU_VDASCR
|
||||
DEC A
|
||||
JP Z,PPK_STAT
|
||||
DEC A
|
||||
JP Z,PPK_FLUSH
|
||||
DEC A
|
||||
JP Z,PPK_READ
|
||||
CALL PANIC
|
||||
|
||||
VDU_VDAINI:
|
||||
CALL INITVDU
|
||||
XOR A
|
||||
RET
|
||||
|
||||
VDU_VDAQRY:
|
||||
CALL PANIC
|
||||
|
||||
VDU_VDARES:
|
||||
JR VDU_INIT
|
||||
|
||||
VDU_VDASCS:
|
||||
CALL PANIC
|
||||
|
||||
VDU_VDASCP:
|
||||
LD A,E
|
||||
LD (TERM_X),A
|
||||
LD A,D
|
||||
LD (TERM_Y),A
|
||||
CALL GOTO_XY
|
||||
XOR A
|
||||
RET
|
||||
|
||||
VDU_VDASAT:
|
||||
; FIX: NOT IMPLEMENTED!!!
|
||||
CALL PANIC
|
||||
|
||||
VDU_VDASCO:
|
||||
; NOT SUPPORTED!!!
|
||||
CALL PANIC
|
||||
|
||||
VDU_VDAWRC:
|
||||
; PUSH CHARACTER OUT AT CURRENT POSITION
|
||||
LD A,31 ; PREP VDU FOR DATA R/W
|
||||
OUT (SY6545S),A
|
||||
CALL VDU_WAITRDY ; WAIT FOR VDU TO BE READY
|
||||
LD A,E
|
||||
OUT (WRITR),A ; OUTPUT CHAR TO VDU
|
||||
|
||||
; UPDATE CURSOR POSITION TO FOLLOW CHARACTERS
|
||||
LD HL,(VDU_DISPLAYPOS) ; GET CURRENT DISPLAY POSITION
|
||||
INC HL ; INCREMENT IT
|
||||
LD (VDU_DISPLAYPOS),HL ; STORE NEW DISPLAY POSITION
|
||||
LD DE,(VDU_DISPLAY_START) ; GET DISPLAY START
|
||||
ADD HL,DE ; ADD IT TO DISPLAY POSITION
|
||||
LD A,14 ; UPDATE CURSOR POSITION
|
||||
CALL VDU_HL2WREG_A ; SEND IT
|
||||
|
||||
; RETURN WITH SUCCESS
|
||||
XOR A
|
||||
RET
|
||||
|
||||
VDU_VDAFIL:
|
||||
LD A, 31 ; PREP VDU FOR DATA R/W
|
||||
OUT (SY6545S),A
|
||||
VDU_VDAFIL1:
|
||||
LD A,H ; CHECK NUMBER OF FILL CHARS LEFT
|
||||
OR L
|
||||
JR Z,VDU_VDAFIL2 ; ALL DONE, GO TO COMPLETION
|
||||
CALL VDU_WAITRDY ; WAIT FOR VDU TO BE READY
|
||||
LD A,E
|
||||
OUT (WRITR), A ; OUTPUT CHAR TO VDU
|
||||
DEC HL ; DECREMENT COUNT
|
||||
JR VDU_VDAFIL1 ; LOOP AS NEEDED
|
||||
VDU_VDAFIL2:
|
||||
CALL GOTO_XY ; YES, MOVE CURSOR BACK TO ORIGINAL POSITION
|
||||
XOR A ; RESULT = 0
|
||||
RET
|
||||
|
||||
VDU_VDASCR:
|
||||
; FIX: IMPLEMENT REVERSE SCROLLING!!!
|
||||
LD A,E
|
||||
OR A
|
||||
RET Z
|
||||
PUSH DE
|
||||
CALL DO_SCROLL
|
||||
POP DE
|
||||
DEC E
|
||||
JR VDU_VDASCR
|
||||
;
|
||||
VDU_WAITRDY:
|
||||
IN A,(SY6545S) ; READ STATUS
|
||||
OR A ; SET FLAGS
|
||||
RET M ; IF BIT 7 SET, THEN READY!
|
||||
JR VDU_WAITRDY ; KEEP CHECKING
|
||||
;__________________________________________________________________________________________________
|
||||
; IMBED COMMON PARALLEL PORT KEYBOARD DRIVER
|
||||
;__________________________________________________________________________________________________
|
||||
;
|
||||
#INCLUDE "ppk.asm"
|
||||
;
|
||||
;__________________________________________________________________________________________________
|
||||
; INITIALIZATION
|
||||
;__________________________________________________________________________________________________
|
||||
INITVDU:
|
||||
CALL VDUINIT ; INIT VDU
|
||||
CALL KB_INITIALIZE ; INIT KB
|
||||
; CALL KB_INITIALIZE ; INIT KB
|
||||
; CALL PR_INITIALIZE ; INIT PR
|
||||
|
||||
; CALL DSPMATRIX ; DISPLAY INIT MATRIX SCREEN
|
||||
; CALL WAIT_KBHIT ; WAIT FOR A KEYSTROKE
|
||||
LD A,0 ; EMPTY KB QUEUE
|
||||
LD (KB_QUEUE_PTR),A ;
|
||||
; LD A,0 ; EMPTY KB QUEUE
|
||||
; LD (KB_QUEUE_PTR),A ;
|
||||
|
||||
CALL PERF_ERASE_EOS ; CLEAR SCREEN
|
||||
CALL PERF_CURSOR_HOME ; CURSOR HOME
|
||||
@@ -446,12 +572,12 @@ PERF_ERASE_EOS_LOOP:
|
||||
; PERFORM TERMINAL IDENTIFY FUNCTION
|
||||
;__________________________________________________________________________________________________
|
||||
PERF_IDENTIFY:
|
||||
LD A,ESC_KEY ;
|
||||
CALL KB_ENQUEUE ; STORE ON KB QUEUE
|
||||
LD A,'/' ;
|
||||
CALL KB_ENQUEUE ; STORE ON KB QUEUE
|
||||
LD A,'K' ;
|
||||
CALL KB_ENQUEUE ; STORE ON KB QUEUE
|
||||
; LD A,ESC_KEY ;
|
||||
; CALL KB_ENQUEUE ; STORE ON KB QUEUE
|
||||
; LD A,'/' ;
|
||||
; CALL KB_ENQUEUE ; STORE ON KB QUEUE
|
||||
; LD A,'K' ;
|
||||
; CALL KB_ENQUEUE ; STORE ON KB QUEUE
|
||||
CALL SET_STATE_NORMAL ; SET NORMAL STATE
|
||||
RET
|
||||
|
||||
@@ -590,66 +716,6 @@ REVERSE_SCROLL:
|
||||
POP HL ; RESTORE HL
|
||||
POP AF ; RESTORE AF
|
||||
RET ;
|
||||
|
||||
|
||||
|
||||
;__IS_KBHIT________________________________________________________________________________________
|
||||
;
|
||||
; WAS A KEY PRESSED?
|
||||
;__________________________________________________________________________________________________
|
||||
IS_KBHIT:
|
||||
CALL KB_PROCESS ; CALL KEYBOARD ROUTINE
|
||||
LD A,(KB_QUEUE_PTR) ; ASK IF KEYBOARD HAS KEY WAITING
|
||||
OR A
|
||||
JP Z,CIO_IDLE
|
||||
LD A,$FF ; SIGNAL DATA PENDING
|
||||
RET
|
||||
|
||||
|
||||
;__WAIT_KBHIT______________________________________________________________________________________
|
||||
;
|
||||
; WAIT FOR A KEY PRESS
|
||||
;__________________________________________________________________________________________________
|
||||
WAIT_KBHIT:
|
||||
CALL IS_KBHIT
|
||||
JR Z,WAIT_KBHIT
|
||||
RET
|
||||
|
||||
|
||||
;__GET_KEY_________________________________________________________________________________________
|
||||
;
|
||||
; GET KEY PRESS VALUE
|
||||
;__________________________________________________________________________________________________
|
||||
GET_KEY:
|
||||
CALL WAIT_KBHIT ; WAIT FOR A KEY
|
||||
LD A,(KB_QUEUE_PTR) ; GET QUEUE POINTER
|
||||
OR A ;
|
||||
RET Z ; ABORT IF QUEUE EMPTY
|
||||
PUSH BC ; STORE BC
|
||||
LD B,A ; STORE QUEUE COUNT FOR LATER
|
||||
PUSH HL ; STORE HL
|
||||
LD A,(KB_QUEUE) ; GET TOP BYTE FROM QUEUE
|
||||
PUSH AF ; STORE IT
|
||||
LD HL,KB_QUEUE ; GET POINTER TO QUEUE
|
||||
GET_KEY_LOOP: ;
|
||||
INC HL ; POINT TO NEXT VALUE IN QUEUE
|
||||
LD A,(HL) ; GET VALUE
|
||||
DEC HL ;
|
||||
LD (HL),A ; MOVE IT UP ONE
|
||||
INC HL ;
|
||||
DJNZ GET_KEY_LOOP ; LOOP UNTIL DONE
|
||||
LD A,(KB_QUEUE_PTR) ; DECREASE QUEUE POINTER BY ONE
|
||||
DEC A ;
|
||||
LD (KB_QUEUE_PTR),A ;
|
||||
POP AF ; RESTORE VALUE
|
||||
POP HL ; RESTORE HL
|
||||
POP BC ; RESTORE BC
|
||||
RET
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
;__VDUINIT__________________________________________________________________________________________
|
||||
;
|
||||
@@ -746,20 +812,20 @@ VDU_CRTSPACELOOP: ;
|
||||
; HL: WORD VALUE TO WRITE
|
||||
;__________________________________________________________________________________________________
|
||||
VDU_HL2WREG_A:
|
||||
PUSH BC ; STORE BC
|
||||
PUSH AF ; STORE AF
|
||||
CALL VDU_UPDATECHECK ; WAIT FOR VDU TO BE READY
|
||||
POP AF ; RESTORE AF
|
||||
LD C, SY6545S ; ADDRESS REGISTER
|
||||
OUT (C), A ; SELECT REGISTER (A)
|
||||
INC C ; NEXT WRITE IN REGISTER
|
||||
OUT (C), H ; WRITE H TO SELECTED REGISTER
|
||||
DEC C ; NEXT WRITE SELECT REGISTER
|
||||
INC A ; INCREASE REGISTER NUMBER
|
||||
OUT (C), A ; SELECT REGISTER (A+1)
|
||||
INC C ; NEXT WRITE IN REGISTER
|
||||
OUT (C), L ; WRITE L TO SELECTED REGISTER
|
||||
POP BC ; RESTORE BC
|
||||
PUSH BC ; STORE BC
|
||||
; PUSH AF ; STORE AF
|
||||
; CALL VDU_UPDATECHECK ; WAIT FOR VDU TO BE READY
|
||||
; POP AF ; RESTORE AF
|
||||
LD C, SY6545S ; ADDRESS REGISTER
|
||||
OUT (C), A ; SELECT REGISTER (A)
|
||||
INC C ; NEXT WRITE IN REGISTER
|
||||
OUT (C), H ; WRITE H TO SELECTED REGISTER
|
||||
DEC C ; NEXT WRITE SELECT REGISTER
|
||||
INC A ; INCREASE REGISTER NUMBER
|
||||
OUT (C), A ; SELECT REGISTER (A+1)
|
||||
INC C ; NEXT WRITE IN REGISTER
|
||||
OUT (C), L ; WRITE L TO SELECTED REGISTER
|
||||
POP BC ; RESTORE BC
|
||||
RET
|
||||
|
||||
;__VDU_UPDATECHECK_________________________________________________________________________________
|
||||
@@ -767,9 +833,9 @@ VDU_HL2WREG_A:
|
||||
; WAIT FOR VDU TO BE READY
|
||||
;__________________________________________________________________________________________________
|
||||
VDU_UPDATECHECK:
|
||||
IN A,(SY6545S) ; READ ADDRESS/STATUS REGISTER
|
||||
IN A,(SY6545S) ; READ ADDRESS/STATUS REGISTER
|
||||
BIT 7,A ; IF BIT 7 = 1 THAN AN UPDATE STROBE HAS OCCURED
|
||||
RET NZ ;
|
||||
RET NZ
|
||||
JR VDU_UPDATECHECK ; WAIT FOR READY
|
||||
|
||||
VDU_INIT6845:
|
||||
@@ -784,7 +850,7 @@ VDU_INIT6845:
|
||||
.DB 01EH ; R4 VERTICAL TOTAL (TOTAL CHARS IN A FRAME -1)
|
||||
.DB 002H ; R5 VERTICAL TOTAL ADJUST (
|
||||
.DB 018H ; R6 VERTICAL DISPLAYED (24 ROWS)
|
||||
.DB 01CH ; R7 VERTICAL SYNC
|
||||
.DB 01AH ; R7 VERTICAL SYNC
|
||||
.DB 078H ; R8 MODE B7=0 TRANSPARENT UPDATE DURING BLANKING
|
||||
; B6=1 PIN 34 IS UPDATE STROBE
|
||||
; B5=1 DELAY CURSOR 1 CHARACTER
|
||||
@@ -1000,529 +1066,6 @@ VDU_PUTCHAR1: ;
|
||||
; RET
|
||||
|
||||
|
||||
;__KB_INITIALIZE___________________________________________________________________________________
|
||||
;
|
||||
; INITIALISE - CLEAR SOME LOCATIONS AND SEND A RESET TO THE KEYBOARD
|
||||
;__________________________________________________________________________________________________
|
||||
KB_INITIALIZE:
|
||||
CALL KB_SETPORTC ; SETS PORT C SO CAN INPUT AND OUTPUT
|
||||
CALL KB_RESET ; RESET TO THE KEYBOARD
|
||||
LD A,200 ; 1 SECOND DELAY AS KEYBOARD SENDS STUFF BACK WHEN RESET
|
||||
CALL KB_DELAY ; IGNORE ANYTHING BACK AFTER A RESET
|
||||
LD A,0 ; EMPTY KB QUEUE
|
||||
LD (KB_QUEUE_PTR),A ;
|
||||
RET
|
||||
|
||||
|
||||
;__KB_RESET________________________________________________________________________________________
|
||||
;
|
||||
; RESET THE KEYBOARD
|
||||
;__________________________________________________________________________________________________
|
||||
KB_RESET:
|
||||
CALL KB_DATAHIGH ;
|
||||
CALL KB_CLOCKHIGH ;
|
||||
LD B,255 ;
|
||||
SF1: DJNZ SF1 ;
|
||||
CALL KB_CLOCKLOW ; STEP 1
|
||||
LD B,255 ;
|
||||
SF2: DJNZ SF2 ;
|
||||
CALL KB_DATALOW ; STEP 2
|
||||
CALL KB_CLOCKHIGH ; STEP 3
|
||||
CALL KB_WAITCLOCKLOW ; STEP 4
|
||||
LD B,9 ; 8 DATA BITS + 1 PARITY BIT LOW
|
||||
SF3: PUSH BC ;
|
||||
CALL KB_DATAHIGH ; STEP 5
|
||||
CALL KB_WAITCLOCKHIGH ; STEP 6
|
||||
CALL KB_WAITCLOCKLOW ; STEP 7
|
||||
POP BC ;
|
||||
DJNZ SF3 ;
|
||||
CALL KB_DATAHIGH ; STEP9
|
||||
CALL KB_WAITCLOCKLOW ; STEP 10 COULD READ THE ACK BIT HERE IF WANT TO
|
||||
CALL KB_WAITCLOCKHIGH ; STEP 11
|
||||
LD B,255 ;
|
||||
SF4: DJNZ SF4 ; FINISH UP DELAY
|
||||
RET
|
||||
|
||||
;__KB_SETPORTC_____________________________________________________________________________________
|
||||
;
|
||||
; SETUP PORT C OF 8255 FOR KEYBOARD
|
||||
;__________________________________________________________________________________________________
|
||||
KB_SETPORTC:
|
||||
LD A,10000010B ; A=OUT B=IN, C HIGH=OUT, CLOW=OUT
|
||||
OUT (VPPICONT),A ; PPI CONTROL PORT
|
||||
LD A,00000000B ; PORT A TO ZERO AS NEED THIS FOR COMMS TO WORK
|
||||
OUT (VPPIA),A ; PPI PORT A
|
||||
CALL KB_DATAHIGH ;
|
||||
CALL KB_CLOCKHIGH ;
|
||||
LD A,0 ;
|
||||
LD (CAPSLOCK),A ; SET CAPSLOCK OFF TO START
|
||||
LD (CTRL),A ; CONTROL OFF
|
||||
LD (NUMLOCK),A ; NUMLOCK OFF
|
||||
RET
|
||||
;_________________________________________________________________________________________________
|
||||
;
|
||||
; PORT C BIT ROUTINES
|
||||
;__________________________________________________________________________________________________
|
||||
KB_PORTCBIT0HIGH: ;
|
||||
LD A,01110001B ; SEE THE 8255 DATA SHEET
|
||||
JP KB_SETBITS ;
|
||||
KB_PORTCBIT1HIGH: ;
|
||||
LD A,01110011B ; SEE THE 8255 DATA SHEET
|
||||
JP KB_SETBITS ;
|
||||
KB_PORTCBIT2HIGH: ;
|
||||
LD A,01110101B ; SEE THE 8255 DATA SHEET
|
||||
JP KB_SETBITS ;
|
||||
KB_PORTCBIT3HIGH: ;
|
||||
LD A,01110111B ; SEE THE 8255 DATA SHEET
|
||||
JP KB_SETBITS ;
|
||||
KB_PORTCBIT0LOW: ;
|
||||
LD A,01110000B ; SEE THE 8255 DATA SHEET
|
||||
JP KB_SETBITS ;
|
||||
KB_PORTCBIT1LOW: ;
|
||||
LD A,01110010B ; SEE THE 8255 DATA SHEET
|
||||
JP KB_SETBITS ;
|
||||
KB_PORTCBIT2LOW: ;
|
||||
LD A,01110100B ; SEE THE 8255 DATA SHEET
|
||||
JP KB_SETBITS ;
|
||||
KB_PORTCBIT3LOW: ;
|
||||
LD A,01110110B ; SEE THE 8255 DATA SHEET
|
||||
JP KB_SETBITS ;
|
||||
KB_DATAHIGH:
|
||||
KB_PORTCBIT4HIGH: ;
|
||||
LD A,01111001B ; SEE THE 8255 DATA SHEET
|
||||
JP KB_SETBITS ;
|
||||
KB_DATALOW: ;
|
||||
KB_PORTCBIT4LOW: ;
|
||||
LD A,01111000B ; SEE THE 8255 DATA SHEET
|
||||
JP KB_SETBITS ;
|
||||
KB_CLOCKHIGH: ;
|
||||
KB_PORTCBIT5HIGH: ;
|
||||
LD A,01111011B ; BIT 5 HIGH
|
||||
JP KB_SETBITS ;
|
||||
KB_CLOCKLOW: ;
|
||||
PORTCBIT5LOW: ;
|
||||
LD A,01111010B ;
|
||||
KB_SETBITS: ;
|
||||
OUT (VPPICONT),A ;
|
||||
RET ;
|
||||
|
||||
|
||||
|
||||
;__KB_WAITCLOCKLOW_________________________________________________________________________________
|
||||
;
|
||||
; WAITCLOCKLOW SAMPLES DATA BIT 0, AND WAITS TILL
|
||||
; IT GOES LOW, THEN RETURNS
|
||||
; ALSO TIMES OUT AFTER 0 001 SECONDS
|
||||
; USES A, CHANGES B
|
||||
;__________________________________________________________________________________________________
|
||||
KB_WAITCLOCKLOW:
|
||||
LD B,255 ; FOR TIMEOUT COUNTER
|
||||
WL1: IN A,(VPPIB) ; GET A BYTE FROM PORT B
|
||||
BIT 1,A ; TEST THE CLOCK BIT
|
||||
RET Z ; EXIT IF IT WENT LOW
|
||||
DJNZ WL1 ; LOOP B TIMES
|
||||
RET
|
||||
|
||||
|
||||
;__KB_WAITCLOCKHIGH_________________________________________________________________________________
|
||||
;
|
||||
; WAITCLOCKHIGH SAMPLES DATA BIT 0, AND WAITS TILL
|
||||
; IT GOES HIGH, THEN RETURNS
|
||||
; ALSO TIMES OUT AFTER 0 001 SECONDS
|
||||
; USES A, CHANGES B
|
||||
;__________________________________________________________________________________________________
|
||||
KB_WAITCLOCKHIGH:
|
||||
LD B,255 ; FOR TIMEOUT COUNTER
|
||||
WH1: IN A,(VPPIB) ; GET A BYTE FROM PORT B
|
||||
BIT 1,A ; TEST THE CLOCK BIT
|
||||
RET NZ ; EXIT IF IT WENT HIGH
|
||||
DJNZ WH1 ; LOOP B TIMES
|
||||
RET
|
||||
|
||||
;__KB_DELAY________________________________________________________________________________________
|
||||
;
|
||||
; PASS A - DELAY IS B*0 005 SECONDS, BCDEHL ALL PRESERVED
|
||||
;__________________________________________________________________________________________________
|
||||
KB_DELAY:
|
||||
PUSH BC ; STORE ALL VARIABLES
|
||||
PUSH DE ;
|
||||
PUSH HL ;
|
||||
LD B,A ; PUT THE VARIABLE DELAY IN B
|
||||
LD DE,1 ;
|
||||
LOOP1: LD HL,740 ; ADJUST THIS VALUE FOR YOUR CLOCK 1481=3 68MHZ, 3219=8MHZ (TEST WITH A=1000=10 SECS)
|
||||
LOOP2: SBC HL,DE ; HL-1
|
||||
JR NZ,LOOP2 ;
|
||||
DJNZ LOOP1 ;
|
||||
POP HL ; RESTORE VARIABLES
|
||||
POP DE ;
|
||||
POP BC ;
|
||||
RET ;
|
||||
|
||||
|
||||
;__KB_PROCESS______________________________________________________________________________________
|
||||
;
|
||||
; A=0 IF WANT TO KNOW IF A BYTE IS AVAILABLE, AND A=1 TO ASK FOR THE BYTE
|
||||
;__________________________________________________________________________________________________
|
||||
KB_PROCESS:
|
||||
CALL SKIP ; DON'T TEST EVERY ONE AS TAKES TIME
|
||||
OR A ; IS IT ZERO
|
||||
RET Z ; RETURN IF ZERO
|
||||
CALL KB_WAITBYTE ; TEST KEYBOARD TIMES OUT AFTER A BIT
|
||||
CALL KB_DECODECHAR ; RETURNS CHAR OR 0 FOR THINGS LIKE KEYUP, SOME RETURN DIRECTLY TO CP/M
|
||||
RET ; RETURN TO CP/M
|
||||
|
||||
|
||||
;-----------------------------------------------
|
||||
; CPM CALLS THE KEYBOARD QUITE FREQUENTLY IF A KEYBOARD WAS LIKE A UART WHICH CAN BE CHECKED
|
||||
; WITH ONE INSTRUCTION, THAT WOULD BE FINE BUT CHECKING A KEYBOARD INVOLVES PUTTING THE CLOCK LINE LOW
|
||||
; THEN WAITING SOME TIME FOR A POSSIBLE REPLY, THEN READING IN BITS WITH TIMEOUTS AND THEN RETURNING
|
||||
; THIS SLOWS DOWN A LOT OF CP/M PROCESSES, EG TRY TYPE MYPROG AND PRINTING OUT TEXT
|
||||
SKIP:
|
||||
LD B,0 ;
|
||||
LD A,(SKIPCOUNT) ;
|
||||
DEC A ; SUBTRACT 1
|
||||
LD (SKIPCOUNT),A ; STORE IT BACK
|
||||
CP 0 ;
|
||||
JP NZ,SK1 ; WORDSTAR IS VERY SLOW EVEN TRIED A VALUE OF 5 TO 200 HERE
|
||||
LD A,200 ; ONLY ACT ON EVERY N CALLS - BIGGER=BETTER BECAUSE THIS SUB IS QUICKER THAN READBITS
|
||||
LD (SKIPCOUNT),A ; RESET COUNTER
|
||||
LD B,1 ; FLAG TO SAY RESET COUNTER
|
||||
SK1: ;
|
||||
LD A,B ; RETURN THE VALUE IN A
|
||||
RET
|
||||
|
||||
|
||||
;__KB_DECODECHAR____________________________________________________________________________________
|
||||
;
|
||||
; DECODE CHARACTER PASS A AND PRINTS OUT THE CHAR
|
||||
; ON THE LCD SCREEN
|
||||
;__________________________________________________________________________________________________
|
||||
KB_DECODECHAR:
|
||||
CP 0 ; IS IT ZERO
|
||||
RET Z ; RETURN IF A ZERO - NO NEED TO DO ANYTHING
|
||||
CP 0F0H ; IS A KEY UP (NEED TO DO SPECIAL CODE FOR SHIFT)
|
||||
JP Z,DECKEYUP ; IGNORE CHAR UP
|
||||
CP 0E0H ; TWO BYTE KEYPRESSES
|
||||
JP Z,TWOBYTE ;
|
||||
CP 058H ; CAPS LOCK SO TOGGLE
|
||||
JP Z,CAPSTOG ;
|
||||
CP 12H ; SHIFT (DOWN, BECAUSE UP WOULD BE TRAPPED BY 0F ABOVE)
|
||||
JP Z,SHIFTDOWN ;
|
||||
CP 59H ; OTHER SHIFT KEY
|
||||
JP Z,SHIFTDOWN ;
|
||||
CP 014H ; CONTROL KEY
|
||||
JP Z,CONTROLDOWN ;
|
||||
CP 05AH ; ENTER KEY
|
||||
JP Z,RETURN ;
|
||||
CP 066H ; BACKSPACE KEY
|
||||
JP Z,BACKSPACE ;
|
||||
CP 0DH ; TAB KEY
|
||||
JP Z,TABKEY ;
|
||||
CP 076H ; ESCAPE KEY
|
||||
JP Z,ESCAPE ;
|
||||
LD C,A ;
|
||||
LD B,0 ; ADD BC TO HL
|
||||
LD HL,NORMALKEYS ; OFFSET TO ADD
|
||||
ADD HL,BC ;
|
||||
JP TESTCONTROL ; IS THE CONTROL KEY DOWN?
|
||||
DC1: LD A,(CAPSLOCK) ;
|
||||
CP 0 ; IS IT 0, IF SO THEN DON'T ADD THE CAPS OFFSET
|
||||
JR Z,DC2 ;
|
||||
LD C,080H ; ADD ANOTHER 50H TO SMALLS TO GET CAPS
|
||||
ADD HL,BC ;
|
||||
DC2: LD A,(HL) ;
|
||||
CALL KB_ENQUEUE ; STORE ON KB QUEUE
|
||||
RET ;
|
||||
TESTCONTROL:
|
||||
LD A,(CTRL) ;
|
||||
CP 0 ; IS CONTROL BEING HELD DOWN?
|
||||
JP Z,DC1 ; NO SO GO BACK TO TEST CAPS LOCK ON
|
||||
LD A,(HL) ; GET THE LETTER, SHOULD BE SMALLS
|
||||
SUB 96 ; A=97 SO SUBTRACT 96 A=1=^A
|
||||
CALL KB_ENQUEUE ; STORE ON KB QUEUE
|
||||
RET ; RETURN INSTEAD OF THE RET AFTER DC2
|
||||
TABKEY: ;
|
||||
LD A,9 ;
|
||||
CALL KB_ENQUEUE ; STORE ON KB QUEUE
|
||||
RET ;TAB
|
||||
BACKSPACE: ;
|
||||
LD A,8 ; BACKSPACE
|
||||
CALL KB_ENQUEUE ; STORE ON KB QUEUE
|
||||
RET ;
|
||||
ESCAPE: ;
|
||||
LD A,27 ;
|
||||
CALL KB_ENQUEUE ; STORE ON KB QUEUE
|
||||
RET ;
|
||||
RETURN: ;
|
||||
LD A,13 ; CARRIAGE RETURN
|
||||
CALL KB_ENQUEUE ; STORE ON KB QUEUE
|
||||
RET ;
|
||||
DECKEYUP:
|
||||
CALL KB_WAITBYTE ; IGNORE KEY UP THROW AWAY THE CHARACTER UNLESS A SHIFT
|
||||
CP 012H ; IS IT A SHIFT
|
||||
JP Z,SHIFTUP ;
|
||||
CP 59H ; OTHER SHIFT KEY
|
||||
JP Z,SHIFTUP ;
|
||||
CP 014H ; CONTROL UP
|
||||
JP Z,CONTROLUP ; CONTROL UP
|
||||
LD A,0 ; NOTHING CAPTURED SO SEND BACK A ZERO
|
||||
RET
|
||||
TWOBYTE:; ALREADY GOT EO SO GET THE NEXT CHARACTER
|
||||
CALL KB_WAITBYTE
|
||||
CP 0F0H ; SEE THE NOTES - KEYUP FOR E0 KEYS IS EO F0 NN NOT F0 EO!!
|
||||
JP Z,TWOBYTEUP ;
|
||||
CP 071H ; DELETE
|
||||
JP Z,DELETEKEY ;
|
||||
CP 05AH ; RETURN ON NUMBER PAD
|
||||
JP Z,RETURNKEY ;
|
||||
CP 072H ;
|
||||
JP Z,DOWNARROW ;
|
||||
CP 074H ;
|
||||
JP Z,RIGHTARROW ;
|
||||
CP 06BH ;
|
||||
JP Z,LEFTARROW ;
|
||||
CP 075H ;
|
||||
JP Z,UPARROW ;
|
||||
CP 070H ;
|
||||
JP Z,INSERT ;
|
||||
CP 07DH ;
|
||||
JP Z,PAGEUP ;
|
||||
CP 07AH ;
|
||||
JP Z,PAGEDOWN ;
|
||||
CP 06CH ;
|
||||
JP Z,HOME ;
|
||||
CP 069H ;
|
||||
JP Z,END ;
|
||||
LD A,0 ; RETURNS NOTHING
|
||||
RET
|
||||
TWOBYTEUP: ;EXPECT A BYTE AND IGNORE IT
|
||||
CALL KB_WAITBYTE ;
|
||||
LD A,0 ;
|
||||
RET ;
|
||||
HOME: ;
|
||||
LD A,1BH ; ESC
|
||||
CALL KB_ENQUEUE ; STORE ON KB QUEUE
|
||||
LD A,'?' ; ?
|
||||
CALL KB_ENQUEUE ; STORE ON KB QUEUE
|
||||
LD A,'W' ; W
|
||||
CALL KB_ENQUEUE ; STORE ON KB QUEUE
|
||||
RET ;
|
||||
END: ;
|
||||
LD A,1BH ; ESC
|
||||
CALL KB_ENQUEUE ; STORE ON KB QUEUE
|
||||
LD A,'?' ; ?
|
||||
CALL KB_ENQUEUE ; STORE ON KB QUEUE
|
||||
LD A,'Q' ; Q
|
||||
CALL KB_ENQUEUE ; STORE ON KB QUEUE
|
||||
RET ;
|
||||
DOWNARROW: ;
|
||||
LD A,1BH ; ESC
|
||||
CALL KB_ENQUEUE ; STORE ON KB QUEUE
|
||||
LD A,'B' ; B
|
||||
CALL KB_ENQUEUE ; STORE ON KB QUEUE
|
||||
RET ;
|
||||
RIGHTARROW: ;
|
||||
LD A,1BH ; ESC
|
||||
CALL KB_ENQUEUE ; STORE ON KB QUEUE
|
||||
LD A,'C' ; C
|
||||
CALL KB_ENQUEUE ; STORE ON KB QUEUE
|
||||
RET ;
|
||||
LEFTARROW: ;
|
||||
LD A,1BH ; ESC
|
||||
CALL KB_ENQUEUE ; STORE ON KB QUEUE
|
||||
LD A,'D' ; D
|
||||
CALL KB_ENQUEUE ; STORE ON KB QUEUE
|
||||
RET ;
|
||||
UPARROW: ;
|
||||
LD A,1BH ; ESC
|
||||
CALL KB_ENQUEUE ; STORE ON KB QUEUE
|
||||
LD A,'A' ; A
|
||||
CALL KB_ENQUEUE ; STORE ON KB QUEUE
|
||||
RET ;
|
||||
INSERT: ;
|
||||
LD A,1BH ; ESC
|
||||
CALL KB_ENQUEUE ; STORE ON KB QUEUE
|
||||
LD A,'?' ; ?
|
||||
CALL KB_ENQUEUE ; STORE ON KB QUEUE
|
||||
LD A,'P' ; P
|
||||
CALL KB_ENQUEUE ; STORE ON KB QUEUE
|
||||
RET ;
|
||||
PAGEUP: ;
|
||||
LD A,1BH ; ESC
|
||||
CALL KB_ENQUEUE ; STORE ON KB QUEUE
|
||||
LD A,'?' ; ?
|
||||
CALL KB_ENQUEUE ; STORE ON KB QUEUE
|
||||
LD A,'Y' ; Y
|
||||
CALL KB_ENQUEUE ; STORE ON KB QUEUE
|
||||
RET ;
|
||||
PAGEDOWN: ;
|
||||
LD A,1BH ; ESC
|
||||
CALL KB_ENQUEUE ; STORE ON KB QUEUE
|
||||
LD A,'?' ; ?
|
||||
CALL KB_ENQUEUE ; STORE ON KB QUEUE
|
||||
LD A,'S' ; S
|
||||
CALL KB_ENQUEUE ; STORE ON KB QUEUE
|
||||
RET ;
|
||||
CONTROLDOWN: ; SAME CODE AS SHIFTDOWN BUT DIFF LOCATION
|
||||
LD A,0FFH ;
|
||||
LD (CTRL),A ; CONTROL DOWN
|
||||
LD A,0 ;
|
||||
RET ;
|
||||
CONTROLUP: ; CONTROL KEY UP SEE SHIFT FOR EXPLANATION
|
||||
LD A,0 ;
|
||||
LD (CTRL),A ;
|
||||
LD A,0 ;
|
||||
RET ;
|
||||
RETURNKEY: ;
|
||||
LD A,13 ;
|
||||
CALL KB_ENQUEUE ; STORE ON KB QUEUE
|
||||
RET ;
|
||||
DELETEKEY: ;
|
||||
LD A,07FH ; DELETE KEY VALUE THAT CP/M USES
|
||||
CALL KB_ENQUEUE ; STORE ON KB QUEUE
|
||||
RET ;
|
||||
CAPSTOG: ;
|
||||
LD A,(CAPSLOCK) ;
|
||||
XOR 11111111B ; SWAP ALL THE BITS
|
||||
LD (CAPSLOCK),A ;
|
||||
LD A,0 ; RETURNS NOTHING
|
||||
RET ;
|
||||
SHIFTDOWN: ; SHIFT IS SPECIAL - HOLD IT DOWN AND IT AUTOREPEATS
|
||||
; SO ONCE IT IS DOWN, TURN CAPS ON AND IGNORE ALL FURTHER SHIFTS
|
||||
; ONLY AN F0+SHIFT TURNS CAPS LOCK OFF AGAIN
|
||||
LD A,0FFH ;
|
||||
LD (CAPSLOCK),A ;
|
||||
LD A,0 ; RETURNS NOTHING
|
||||
RET ;
|
||||
SHIFTUP: ; SHIFTUP TURNS OFF CAPS LOCK DEFINITELY
|
||||
LD A,0 ;
|
||||
LD (CAPSLOCK),A ;
|
||||
LD A,0 ; RETURNS NOTHING
|
||||
RET ;
|
||||
|
||||
;__KB_ENQUEUE______________________________________________________________________________________
|
||||
;
|
||||
; STORE A BYTE IN THE KEYBOARD QUEUE
|
||||
; A: BYTE TO ENQUEUE
|
||||
;__________________________________________________________________________________________________
|
||||
KB_ENQUEUE:
|
||||
PUSH DE ; STORE DE
|
||||
PUSH HL ; STORE HL
|
||||
PUSH AF ; STORE VALUE
|
||||
LD A,(KB_QUEUE_PTR); PUT QUEUE POINTER IN A
|
||||
CP 15 ; IS QUEUE FULL
|
||||
JP P,KB_ENQUEUE_AB ; YES, ABORT
|
||||
LD HL,KB_QUEUE ; GET QUEUE POINTER
|
||||
PUSH HL ; MOVE HL TO BC
|
||||
POP BC ;
|
||||
LD H,0 ; ZERO OUT H
|
||||
LD L,A ; PLACE QUEUE POINTER IN L
|
||||
ADD HL,BC ; POINT HL AT THE NEXT LOACTION TO ADD VALUE
|
||||
POP AF ; RESTORE VALUE
|
||||
LD (HL),A ; ENQUEUE VALUE
|
||||
LD A,(KB_QUEUE_PTR); GET QUEUE POINTER
|
||||
INC A ; INC IT
|
||||
LD (KB_QUEUE_PTR),A ;STORE QUEUE POINTER
|
||||
KB_ENQUEUE_AB:
|
||||
POP HL ; RESTORE HL
|
||||
POP DE ; RESTORE DE
|
||||
RET
|
||||
|
||||
|
||||
;__KB_WAITBYTE_____________________________________________________________________________________
|
||||
;
|
||||
; WAIT FOR A BYTE - TESTS A NUMBER OF TIMES IF THERE IS A KEYBOARD INPUT,
|
||||
; OVERWRITES ALL REGISTERS, RETURNS BYTE IN A
|
||||
;__________________________________________________________________________________________________
|
||||
KB_WAITBYTE:
|
||||
CALL KB_CLOCKHIGH ; TURN ON KEYBOARD
|
||||
LD HL,500 ; NUMBER OF TIMES TO CHECK 200=SLOW TYPE
|
||||
; 10=ERROR, 25 ?ERROR 50 OK -
|
||||
; THIS DELAY HAS TO BE THERE OTHERWISE WEIRD KEYUP ERRORS
|
||||
WB1: PUSH HL ; STORE COUNTER
|
||||
CALL KB_READBITS ; TEST FOR A LOW ON THE CLOCK LINE
|
||||
POP HL ; GET THE COUNTER BACK
|
||||
CP 0 ; TEST FOR A ZERO BACK FROM READBITS
|
||||
JR NZ,WB2 ; IF NOT A ZERO THEN MUST HAVE A BYTE IE A KEYBOARD PRESS
|
||||
LD DE,1 ; LOAD WITH 1
|
||||
SBC HL,DE ; SUBTRACT 1
|
||||
JR NZ,WB1 ; LOOP WAITING FOR A RESPONSE
|
||||
WB2: PUSH AF ; STORE THE VALUE IN A
|
||||
CALL KB_CLOCKLOW ; TURN OFF KEYBOARD
|
||||
POP AF ; GET BACK BYTE AS CLOCKLOW ERASED IT
|
||||
RET
|
||||
|
||||
;__KB_READBITS_____________________________________________________________________________________
|
||||
;
|
||||
; READBITS READS 11 BITS IN FROM THE KEYBOARD
|
||||
; FIRST BIT IS A START BIT THEN 8 BITS FOR THE BYTE
|
||||
; THEN A PARITY BIT AND A STOP BIT
|
||||
; RETURNS AFTER ONE MACHINE CYCLE IF NOT LOW
|
||||
; USES A, B,D, E
|
||||
; RETURNS A=0 IF NO DATA, A= SCANCODE (OR PART THEREOF)
|
||||
;__________________________________________________________________________________________________
|
||||
KB_READBITS:
|
||||
IN A,(VPPIB)
|
||||
BIT 1,A ; TEST THE CLOCK BIT
|
||||
JR Z,R1 ; IF LOW THEN START THE CAPTURE
|
||||
LD A,0 ; RETURNS A=0 IF NOTHING
|
||||
RET ;
|
||||
R1: CALL KB_WAITCLOCKHIGH; IF GETS TO HERE THEN MUST BE LOW SO WAIT TILL HIGH
|
||||
LD B,8 ; SAMPLE 8 TIMES
|
||||
LD E,0 ; START WITH E=0
|
||||
R2: LD D,B ; STORE BECAUSE WAITCLOCKHIGH DESTROYS
|
||||
CALL KB_WAITCLOCKLOW ; WAIT TILL CLOCK GOES LOW
|
||||
IN A,(VPPIB) ; SAMPLE THE DATA LINE
|
||||
RRA ; MOVE THE DATA BIT INTO THE CARRY REGISTER
|
||||
LD A,E ; GET THE BYTE WE ARE BUILDING IN E
|
||||
RRA ; MOVE THE CARRY BIT INTO BIT 7 AND SHIFT RIGHT
|
||||
LD E,A ; STORE IT BACK AFTER 8 CYCLES 1ST BIT READ WILL BE IN B0
|
||||
CALL KB_WAITCLOCKHIGH; WAIT TILL GOES HIGH
|
||||
LD B,D ; RESTORE FOR LOOP
|
||||
DJNZ R2 ; DO THIS 8 TIMES
|
||||
CALL KB_WAITCLOCKLOW ; GET THE PARITY BIT
|
||||
CALL KB_WAITCLOCKHIGH;
|
||||
CALL KB_WAITCLOCKLOW ; GET THE STOP BIT
|
||||
CALL KB_WAITCLOCKHIGH;
|
||||
LD A,E ; RETURNS WITH ANSWER IN A
|
||||
RET
|
||||
|
||||
NORMALKEYS:
|
||||
; THE TI CHARACTER CODES, OFFSET FROM LABEL BY KEYBOARD SCAN CODE
|
||||
.DB $00, $00, $00, $00, $00, $00, $00, $00
|
||||
.DB $00, $00, $00, $00, $00, $09, "`", $00 ; $09=TAB
|
||||
.DB $00, $00, $00, $00, $00, "q", "1", $00
|
||||
.DB $00, $00, "z", "s", "a", "w", "2", $00
|
||||
.DB $00, "c", "x", "d", "e", "4", "3", $00
|
||||
.DB $00, " ", "v", "f", "t", "r", "5", $00
|
||||
.DB $00, "n", "b", "h", "g", "y", "6", $00
|
||||
.DB $00, $00, "m", "j", "u", "7", "8", $00
|
||||
.DB $00, ",", "k", "i", "o", "0", "9", $00
|
||||
.DB $00, ".", "/", "l", ";", "p", "-", $00
|
||||
.DB $00, $00, $27, $00, "[", "=", $00, $00 ; $27=APOSTROPHE
|
||||
.DB $00, $00, $00, "]", $00, $5C, $00, $00 ; $5C=BACKSLASH
|
||||
.DB $00, $00, $00, $00, $00, $00, $00, $00
|
||||
.DB $00, "1", $00, "4", "7", $00, $00, $00
|
||||
.DB "0", ".", "2", "5", "6", "8", $00, $00
|
||||
.DB $00, "+", "3", "-", "*", "9", $00, $00
|
||||
|
||||
SHIFTKEYS:
|
||||
.DB $00, $00, $00, $00, $00, $00, $00, $00
|
||||
.DB $00, $00, $00, $00, $00, 009, "~", $00 ; $09=TAB
|
||||
.DB $00, $00, $00, $00, $00, "Q", "!", $00
|
||||
.DB $00, $00, "Z", "S", "A", "W", "@", $00
|
||||
.DB $00, "C", "X", "D", "E", "$", "#", $00
|
||||
.DB $00, " ", "V", "F", "T", "R", "%", $00
|
||||
.DB $00, "N", "B", "H", "G", "Y", "^", $00
|
||||
.DB $00, $00, "M", "J", "U", "&", "*", $00
|
||||
.DB $00, "<", "K", "I", "O", ")", "(", $00
|
||||
.DB $00, ">", "?", "L", ":", "P", "_", $00
|
||||
.DB $00, $00, 034, $00, "{", "+", $00, $00 ; $22=DBLQUOTE
|
||||
.DB $00, $00, $00, "}", $00, "|", $00, $00
|
||||
.DB $00, $00, $00, $00, $00, $00, $00, $00
|
||||
.DB $00, "1", $00, "4", "7", $00, $00, $00
|
||||
.DB "0", ".", "2", "5", "6", "8", $00, $00
|
||||
.DB $00, "+", "3", "-", "*", "9", $00, $00
|
||||
;
|
||||
;==================================================================================================
|
||||
; VDU DRIVER - DATA
|
||||
@@ -1537,9 +1080,3 @@ TERMSTATE .DB 0 ; TERMINAL STATE
|
||||
; 1 = ESC RCVD
|
||||
VDU_DISPLAYPOS .DW 0 ; CURRENT DISPLAY POSITION
|
||||
VDU_DISPLAY_START .DW 0 ; CURRENT DISPLAY POSITION
|
||||
CAPSLOCK .DB 0 ; location for caps lock, either 00000000 or 11111111
|
||||
CTRL .DB 0 ; location for ctrl on or off 00000000 or 11111111
|
||||
NUMLOCK .DB 0 ; location for num lock
|
||||
SKIPCOUNT .DB 0 ; only check some calls, speeds up a lot of cp/m
|
||||
KB_QUEUE .FILL 16,0 ; 16 BYTE KB QUEUE
|
||||
KB_QUEUE_PTR .DB 0 ; POINTER TO QUEUE
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#DEFINE RMJ 2
|
||||
#DEFINE RMN 2
|
||||
#DEFINE RUP 0
|
||||
#DEFINE RTP 1
|
||||
#DEFINE BIOSVER "2.2 B1"
|
||||
#DEFINE RTP 2
|
||||
#DEFINE BIOSVER "2.2 B2"
|
||||
#DEFINE REVISION 1741
|
||||
|
||||
Reference in New Issue
Block a user