; ;================================================================================================== ; 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 24 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