|
|
|
@ -3,8 +3,12 @@ |
|
|
|
; ANSI EMULATION MODULE |
|
|
|
;================================================================================================== |
|
|
|
; |
|
|
|
; TODO: |
|
|
|
; - THIS IS CURRENTLY JUST A CLONE OF TTY.ASM! NEEDS A REAL IMPLEMENTATION! |
|
|
|
; - SOME FUNCTIONS ARE NOT IMPLEMENTED! |
|
|
|
; |
|
|
|
ANSI_INIT: |
|
|
|
JR ANSI_INI |
|
|
|
JR ANSI_INI ; REUSE THE INI FUNCTION BELOW |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
@ -29,47 +33,51 @@ ANSI_DISPATCH: |
|
|
|
; |
|
|
|
; |
|
|
|
ANSI_IN: |
|
|
|
LD B,BF_VDAKRD |
|
|
|
JP EMU_VDADISP |
|
|
|
LD B,BF_VDAKRD ; SET FUNCTION TO KEYBOARD READ |
|
|
|
JP EMU_VDADISP ; CHAIN TO VDA DISPATCHER |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
ANSI_OUT: |
|
|
|
CALL ANSI_DOCHAR |
|
|
|
XOR A |
|
|
|
CALL ANSI_DOCHAR ; HANDLE THE CHARACTER (EMULATION ENGINE) |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
ANSI_IST: |
|
|
|
LD B,BF_VDAKST |
|
|
|
JP EMU_VDADISP |
|
|
|
LD B,BF_VDAKST ; SET FUNCTION TO KEYBOARD STATUS |
|
|
|
JP EMU_VDADISP ; CHAIN TO VDA DISPATCHER |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
ANSI_OST: |
|
|
|
XOR A |
|
|
|
INC A |
|
|
|
XOR A ; ZERO ACCUM |
|
|
|
INC A ; A := $FF TO SIGNAL OUTPUT BUFFER READY |
|
|
|
RET |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
ANSI_CFG: |
|
|
|
XOR A |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
ANSI_INI: |
|
|
|
LD (ANSI_ROW),A |
|
|
|
LD (ANSI_COL),A |
|
|
|
LD B,BF_VDARES |
|
|
|
JP EMU_VDADISP ; RESET VDA |
|
|
|
LD B,BF_VDAQRY ; FUNCTION IS QUERY |
|
|
|
LD HL,0 ; WE DO NOT WANT A COPY OF THE CHARACTER BITMAP DATA |
|
|
|
CALL EMU_VDADISP ; PERFORM THE QUERY FUNCTION |
|
|
|
LD (ANSI_DIM),DE ; SAVE THE SCREEN DIMENSIONS RETURNED |
|
|
|
LD DE,0 ; DE := 0, CURSOR TO HOME POSITION 0,0 |
|
|
|
LD (ANSI_POS),DE ; SAVE CURSOR POSITION |
|
|
|
LD B,BF_VDARES ; SET FUNCTION TO RESET |
|
|
|
JP EMU_VDADISP ; RESET VDA AND RETURN |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
ANSI_QRY: |
|
|
|
XOR A |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET |
|
|
|
; |
|
|
|
; |
|
|
|
@ -91,60 +99,70 @@ ANSI_DOCHAR: |
|
|
|
LD A,(ANSI_COL) ; GET CUR COL |
|
|
|
INC A ; INCREMENT |
|
|
|
LD (ANSI_COL),A ; SAVE IT |
|
|
|
CP 80 ; COMPARE TO COLS IN LINE |
|
|
|
LD DE,(ANSI_DIM) ; GET SCREEN DIMENSIONS |
|
|
|
CP E ; 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 |
|
|
|
LD DE,0 ; PREPARE TO HOME CURSOR |
|
|
|
LD (ANSI_POS),DE ; SAVE NEW CURSOR POSITION |
|
|
|
CALL ANSI_XY ; EXECUTE |
|
|
|
LD DE,(ANSI_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 HL,80 * 24 ; NUMBER OF CHARACTER POSITIONS TO FILL |
|
|
|
LD B,BF_VDAFIL |
|
|
|
LD B,BF_VDAFIL ; SET FUNCTION TO FILL |
|
|
|
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 DE,(ANSI_POS) ; 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 |
|
|
|
LD (ANSI_POS),DE ; SAVE NEW COLUMN VALUE |
|
|
|
CALL ANSI_XY ; MOVE CURSOR TO NEW TARGET COLUMN |
|
|
|
LD E,' ' ; LOAD A SPACE CHARACTER |
|
|
|
LD B,BF_VDAWRC |
|
|
|
LD B,BF_VDAWRC ; SET FUNCTION TO WRITE CHARACTER |
|
|
|
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 |
|
|
|
XOR A ; ZERO ACCUM |
|
|
|
LD (ANSI_COL),A ; COL := 0 |
|
|
|
JR ANSI_XY ; REPOSITION CURSOR AND RETURN |
|
|
|
; |
|
|
|
ANSI_LF: |
|
|
|
LD A,(ANSI_ROW) |
|
|
|
INC A |
|
|
|
LD (ANSI_ROW),A |
|
|
|
CP 24 ; COMPARE TO SCREEN ROWS |
|
|
|
LD A,(ANSI_ROW) ; GET CURRENT ROW |
|
|
|
INC A ; BUMP TO NEXT |
|
|
|
LD (ANSI_ROW),A ; SAVE IT |
|
|
|
LD DE,(ANSI_DIM) ; GET SCREEN DIMENSIONS |
|
|
|
CP D ; COMPARE TO SCREEN ROWS |
|
|
|
JR C,ANSI_XY ; NOT PAST END, ALL DONE |
|
|
|
SUB 23 ; A WILL NOW HAVE NUM LINES TO SCROLL |
|
|
|
DEC D ; D NOW HAS MAX ROW NUM (ROWS - 1) |
|
|
|
SUB D ; A WILL NOW HAVE NUM LINES TO SCROLL |
|
|
|
LD E,A ; LINES TO SCROLL -> E |
|
|
|
LD B,BF_VDASCR |
|
|
|
LD B,BF_VDASCR ; SET FUNCTION TO SCROLL |
|
|
|
CALL EMU_VDADISP ; DO THE SCROLLING |
|
|
|
LD A,23 ; ROW 24 |
|
|
|
LD (ANSI_ROW),A ; IS NOW CORRECT |
|
|
|
LD A,(ANSI_ROWS) ; GET SCREEN ROW COUNT |
|
|
|
DEC A ; A NOW HAS LAST ROW |
|
|
|
LD (ANSI_ROW),A ; SAVE IT |
|
|
|
JR ANSI_XY ; RESPOSITION CURSOR AND RETURN |
|
|
|
; |
|
|
|
ANSI_XY: |
|
|
|
LD DE,(ANSI_ROWCOL) |
|
|
|
LD B,BF_VDASCP |
|
|
|
JP EMU_VDADISP |
|
|
|
LD DE,(ANSI_POS) ; GET THE DESIRED CURSOR POSITION |
|
|
|
LD B,BF_VDASCP ; SET FUNCTIONT TO SET CURSOR POSITION |
|
|
|
JP EMU_VDADISP ; REPOSITION CURSOR |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
ANSI_POS: |
|
|
|
ANSI_COL .DB 0 ; CURRENT COLUMN - 0 BASED |
|
|
|
ANSI_ROW .DB 0 ; CURRENT ROW - 0 BASED |
|
|
|
; |
|
|
|
ANSI_ROWCOL: |
|
|
|
ANSI_COL .DB 0 |
|
|
|
ANSI_ROW .DB 0 |
|
|
|
ANSI_DIM: |
|
|
|
ANSI_COLS .DB 80 ; NUMBER OF COLUMNS ON SCREEN |
|
|
|
ANSI_ROWS .DB 24 ; NUMBER OF ROWS ON SCREEN |