From e984d5899f6aa92760fef3140ede893e8ab968d9 Mon Sep 17 00:00:00 2001 From: wayne Date: Sun, 25 Nov 2012 20:13:42 +0000 Subject: [PATCH] Reintegrate wbw -> trunk --- Source/ansi.asm | 98 +++++++++++++++++++++++++++++-------------------- Source/tty.asm | 97 ++++++++++++++++++++++++++++-------------------- 2 files changed, 115 insertions(+), 80 deletions(-) diff --git a/Source/ansi.asm b/Source/ansi.asm index 4c64aa7b..b6a989b4 100644 --- a/Source/ansi.asm +++ b/Source/ansi.asm @@ -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 \ No newline at end of file diff --git a/Source/tty.asm b/Source/tty.asm index 09ece0d4..cefa8f39 100644 --- a/Source/tty.asm +++ b/Source/tty.asm @@ -3,8 +3,11 @@ ; TTY EMULATION MODULE ;================================================================================================== ; +; TODO: +; - SOME FUNCTIONS ARE NOT IMPLEMENTED!!! +; TTY_INIT: - JR TTY_INI + JR TTY_INI ; REUSE THE INI FUNCTION BELOW ; ; ; @@ -29,47 +32,51 @@ TTY_DISPATCH: ; ; TTY_IN: - LD B,BF_VDAKRD - JP EMU_VDADISP + LD B,BF_VDAKRD ; SET FUNCTION TO KEYBOARD READ + JP EMU_VDADISP ; CHAIN TO VDA DISPATCHER ; ; ; TTY_OUT: - CALL TTY_DOCHAR - XOR A + CALL TTY_DOCHAR ; HANDLE THE CHARACTER (EMULATION ENGINE) + XOR A ; SIGNAL SUCCESS RET ; ; ; TTY_IST: - LD B,BF_VDAKST - JP EMU_VDADISP + LD B,BF_VDAKST ; SET FUNCTION TO KEYBOARD STATUS + JP EMU_VDADISP ; CHAIN TO VDA DISPATCHER ; ; ; TTY_OST: - XOR A - INC A + XOR A ; ZERO ACCUM + INC A ; A := $FF TO SIGNAL OUTPUT BUFFER READY RET ; ; ; TTY_CFG: - XOR A + XOR A ; SIGNAL SUCCESS RET ; ; ; TTY_INI: - LD (TTY_ROW),A - LD (TTY_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 (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 + LD B,BF_VDARES ; SET FUNCTION TO RESET + JP EMU_VDADISP ; RESET VDA AND RETURN ; ; ; TTY_QRY: - XOR A + XOR A ; SIGNAL SUCCESS RET ; ; @@ -91,60 +98,70 @@ TTY_DOCHAR: LD A,(TTY_COL) ; GET CUR COL INC A ; INCREMENT LD (TTY_COL),A ; SAVE IT - CP 80 ; COMPARE TO COLS IN LINE + 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 ; HOME CURSOR - LD (TTY_ROWCOL),DE ; SAVE IT + 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 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 TTY_XY ; HOME CURSOR AND RETURN ; TTY_BS: - LD DE,(TTY_ROWCOL) ; GET CURRENT ROW/COL IN DE + LD DE,(TTY_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 (TTY_ROWCOL),DE ; SAVE NEW COLUMN VALUE + LD (TTY_POS),DE ; SAVE NEW COLUMN VALUE CALL TTY_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 TTY_XY ; NEED TO MOVE CURSOR BACK TO NEW TARGET COLUMN ; TTY_CR: - XOR A - LD (TTY_COL),A - JR TTY_XY + XOR A ; ZERO ACCUM + LD (TTY_COL),A ; COL := 0 + JR TTY_XY ; REPOSITION CURSOR AND RETURN ; TTY_LF: - LD A,(TTY_ROW) - INC A - LD (TTY_ROW),A - CP 24 ; COMPARE TO SCREEN ROWS + LD A,(TTY_ROW) ; GET CURRENT ROW + INC A ; BUMP TO NEXT + LD (TTY_ROW),A ; SAVE IT + LD DE,(TTY_DIM) ; GET SCREEN DIMENSIONS + CP D ; COMPARE TO SCREEN ROWS JR C,TTY_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 (TTY_ROW),A ; IS NOW CORRECT + LD A,(TTY_ROWS) ; GET SCREEN ROW COUNT + DEC A ; A NOW HAS LAST ROW + LD (TTY_ROW),A ; SAVE IT JR TTY_XY ; RESPOSITION CURSOR AND RETURN ; TTY_XY: - LD DE,(TTY_ROWCOL) - LD B,BF_VDASCP - JP EMU_VDADISP + LD DE,(TTY_POS) ; GET THE DESIRED CURSOR POSITION + LD B,BF_VDASCP ; SET FUNCTIONT TO SET CURSOR POSITION + JP EMU_VDADISP ; REPOSITION CURSOR +; ; ; +TTY_POS: +TTY_COL .DB 0 ; CURRENT COLUMN - 0 BASED +TTY_ROW .DB 0 ; CURRENT ROW - 0 BASED ; -TTY_ROWCOL: -TTY_COL .DB 0 -TTY_ROW .DB 0 +TTY_DIM: +TTY_COLS .DB 80 ; NUMBER OF COLUMNS ON SCREEN +TTY_ROWS .DB 24 ; NUMBER OF ROWS ON SCREEN \ No newline at end of file