You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

197 lines
4.8 KiB

;
;==================================================================================================
; TTY EMULATION MODULE
;==================================================================================================
;
; TODO:
; - SOME FUNCTIONS ARE NOT IMPLEMENTED!!!
;
; INITIALIZATION OF EMULATION MODULE CALLED BY PARENT VDA DRIVER
; ON ENTRY:
; C: CIO UNIT NUMBER OF CALLING VDA DRIVER
; DE: DISPATCH ADDRESS OF CALLING VDA DRIVER
; RETURNS:
; DE: OUR CIO DISPATCH ADDRESS
;
TTY_INIT:
; SAVE CALLING VDA DRIVER'S CIO UNIT NUMBER AND VDA DISPATCH ADDRESS
LD C,A ; VDA DRIVER'S DEVICE TYPE
LD (TTY_DEVTYPE),A ; ... SAVED LOCALLY
LD (TTY_VDADISPADR),DE ; ALSO SAVE VDA DRIVER'S DISPATCH ADDRESS
LD DE,TTY_DISPATCH ; RETURN OUR DISPATCH ADDRESS
XOR A ; SIGNAL SUCCESS
RET ; RETURN
;
TTY_RESET:
; QUERY THE VIDEO DRIVER FOR SCREEN DIMENSIONS
LD B,BF_VDAQRY ; FUNCTION IS QUERY
LD HL,0 ; WE DO NOT WANT A COPY OF THE CHARACTER BITMAP DATA
CALL TTY_VDADISP ; PERFORM THE QUERY FUNCTION
LD (TTY_DIM),DE ; SAVE THE SCREEN DIMENSIONS RETURNED
;
LD DE,0 ; DE := 0, CURSOR TO HOME POSITION 0,0
LD (TTY_POS),DE ; SAVE CURSOR POSITION
;
RET ; DONE
;
;
;
TTY_VDADISP:
JP PANIC
TTY_VDADISPADR .EQU $ - 2
;
;
;
TTY_DISPATCH:
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JR Z,TTY_CIOIN ; $30
DEC A
JR Z,TTY_CIOOUT ; $31
DEC A
JR Z,TTY_CIOIST ; $32
DEC A
JR Z,TTY_CIOOST ; $33
DEC A
JR Z,TTY_CIOINIT ; $34
DEC A
JR Z,TTY_CIOQUERY ; $35
DEC A
JR Z,TTY_CIODEVICE ; $36
CALL PANIC
;
;
;
TTY_CIOIN:
LD B,BF_VDAKRD ; SET FUNCTION TO KEYBOARD READ
JP TTY_VDADISP ; CHAIN TO VDA DISPATCHER
;
;
;
TTY_CIOOUT:
CALL TTY_DOCHAR ; HANDLE THE CHARACTER (EMULATION ENGINE)
XOR A ; SIGNAL SUCCESS
RET
;
;
;
TTY_CIOIST:
LD B,BF_VDAKST ; SET FUNCTION TO KEYBOARD STATUS
JP TTY_VDADISP ; CHAIN TO VDA DISPATCHER
;
;
;
TTY_CIOOST:
XOR A ; ZERO ACCUM
INC A ; A := $FF TO SIGNAL OUTPUT BUFFER READY
RET
;
;
;
TTY_CIOINIT:
; SETUP AND FORWARD CALL TO PARENT VDA DRIVER'S VDAINIT FUNCTION
LD B,BF_VDAINI ; WE ARE FORWARDING TO VDAINIT FUNCTION
LD A,(TTY_DEVTYPE) ; GET DEVICE TYPE WE ARE EMULATING FOR
LD C,A ; AND PUT IT IN C
LD D,L ; TERMTYPE TO D
LD E,0 ; VIDEO MODE = 0
LD HL,0 ; NO BITMAP, LEAVE IT ALONG
JP TTY_VDADISP ; LET VDA DRIVER HANDLE IT FROM HERE
;
;
;
TTY_CIOQUERY:
LD DE,0
LD HL,0
XOR A
RET
;
;
;
TTY_CIODEVICE:
LD A,(TTY_DEVTYPE) ; GET DEVICE TYPE WE ARE EMULATING FOR
LD D,A ; AND PASS BACK IN D
LD E,C ; E := DEVICE NUMBER
XOR A ; SIGNAL SUCCESS
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 TTY_VDADISP ; SPIT OUT THE RAW CHARACTER
LD A,(TTY_COL) ; GET CUR COL
INC A ; INCREMENT
LD (TTY_COL),A ; SAVE IT
LD DE,(TTY_DIM) ; GET SCREEN DIMENSIONS
CP E ; 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 ; PREPARE TO HOME CURSOR
LD (TTY_POS),DE ; SAVE NEW CURSOR POSITION
CALL TTY_XY ; EXECUTE
LD DE,(TTY_DIM) ; GET SCREEN DIMENSIONS
LD H,D ; SET UP TO MULTIPLY ROWS BY COLS
CALL MULT8 ; HL := H * E TO GET TOTAL SCREEN POSITIONS
LD E,' ' ; FILL SCREEN WITH BLANKS
LD B,BF_VDAFIL ; SET FUNCTION TO FILL
CALL TTY_VDADISP ; PERFORM FILL
JR TTY_XY ; HOME CURSOR AND RETURN
;
TTY_BS:
LD A,(TTY_COL) ; GET CURRENT COLUMN
DEC A ; BACK IT UP BY ONE
RET C ; IF CARRY, MARGIN EXCEEDED, ABORT
LD (TTY_COL),A ; SAVE NEW COLUMN
JP TTY_XY ; UDPATE CUSROR AND RETURN
;
TTY_CR:
XOR A ; ZERO ACCUM
LD (TTY_COL),A ; COL := 0
JR TTY_XY ; REPOSITION CURSOR AND RETURN
;
TTY_LF: ; LINEFEED (FORWARD INDEX)
LD A,(TTY_ROW) ; GET CURRENT ROW
LD DE,(TTY_DIM) ; GET SCREEN DIMENSIONS
DEC D ; D := MAX ROW NUM
CP D ; >= LAST ROW?
JR NC,TTY_LF1 ; IF SO, NEED TO SCROLL
INC A ; BUMP TO NEXT ROW
LD (TTY_ROW),A ; SAVE IT
JP TTY_XY ; UPDATE CURSOR AND RETURN
;
TTY_LF1: ; SCROLL
LD E,1 ; SCROLL FORWARD 1 LINE
LD B,BF_VDASCR ; SET FUNCTION TO SCROLL
JP TTY_VDADISP ; DO THE SCROLLING AND RETURN
;
TTY_XY:
LD DE,(TTY_POS) ; GET THE DESIRED CURSOR POSITION
LD B,BF_VDASCP ; SET FUNCTIONT TO SET CURSOR POSITION
JP TTY_VDADISP ; REPOSITION CURSOR
;
;
;
TTY_POS:
TTY_COL .DB 0 ; CURRENT COLUMN - 0 BASED
TTY_ROW .DB 0 ; CURRENT ROW - 0 BASED
;
TTY_DIM:
TTY_COLS .DB 80 ; NUMBER OF COLUMNS ON SCREEN
TTY_ROWS .DB 24 ; NUMBER OF ROWS ON SCREEN
;
TTY_DEVTYPE .DB $FF ; DEVICE TYPE OF PARENT VDA'S CIO DEVICE