mirror of https://github.com/wwarthen/RomWBW.git
26 changed files with 1743 additions and 828 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -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 |
||||
@ -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 |
||||
|
;__________________________________________________________________________________________________ |
||||
|
; |
||||
@ -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 |
||||
@ -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 |
||||
@ -1,6 +1,6 @@ |
|||||
#DEFINE RMJ 2 |
#DEFINE RMJ 2 |
||||
#DEFINE RMN 2 |
#DEFINE RMN 2 |
||||
#DEFINE RUP 0 |
#DEFINE RUP 0 |
||||
#DEFINE RTP 1 |
|
||||
#DEFINE BIOSVER "2.2 B1" |
|
||||
|
#DEFINE RTP 2 |
||||
|
#DEFINE BIOSVER "2.2 B2" |
||||
#DEFINE REVISION 1741 |
#DEFINE REVISION 1741 |
||||
|
|||||
Loading…
Reference in new issue