From 577d2a4af690453a63ac71cb84dd77e03c615e42 Mon Sep 17 00:00:00 2001 From: wayne Date: Wed, 6 Mar 2013 06:16:32 +0000 Subject: [PATCH] Round 2 of ANSI emulation work --- branches/wbw/Source/ansi.asm | 239 +++++++++++++++++++++++++++++++---- branches/wbw/Source/cvdu.asm | 4 +- 2 files changed, 215 insertions(+), 28 deletions(-) diff --git a/branches/wbw/Source/ansi.asm b/branches/wbw/Source/ansi.asm index f77f3e8d..85bf8bb4 100644 --- a/branches/wbw/Source/ansi.asm +++ b/branches/wbw/Source/ansi.asm @@ -214,6 +214,12 @@ ANSI_CTLDISP: JP Z,ANSI_CUP CP 'J' ; ED: ERASE IN DISPLAY JP Z,ANSI_ED + CP 'K' ; EL: ERASE IN LINE + JP Z,ANSI_EL + CP 'f' ; HVP: HORIZONTAL/VERTICAL POSITION + JP Z,ANSI_CUP + CP 'm' ; SGR: SELECT GRAPHIC RENDITION + JP Z,ANSI_SGR ; *DEBUG* PUSH AF PRTS("($") @@ -273,6 +279,7 @@ ANSI_COLLPAR: JR NZ,ANSI_COLLPAR1 ; NOPE, CONTINUE LD A,(ANSI_PARIDX) ; GET CURRENT PARM POS INDEX INC A ; INCREMENT + AND $0F ; 16 PARMS MAX!!! LD (ANSI_PARIDX),A ; SAVE IT RET ; DONE ; @@ -385,7 +392,7 @@ ANSI_LF: 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 + JP C,ANSI_XY ; NOT PAST END, ALL DONE 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 @@ -394,39 +401,21 @@ ANSI_LF: 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_CUP: ; CURSOR UPDATE - LD A,(ANSI_PARLST + 0) ; ROW PARM - LD D,A ; PUT IN D - LD A,(ANSI_PARLST + 1) ; COL PARM - LD E,A ; PUT IN E - LD (ANSI_POS),DE ; SAVE IT - JP ANSI_XY ; UPDATE CURSOR AND RETURN + JP ANSI_XY ; RESPOSITION CURSOR AND RETURN ; ; ; ANSI_ED: ; ERASE IN DISPLAY LD A,(ANSI_PARLST + 0) ; GET FIRST PARM - CP 2 ; ERASE FULL DISPLAY? - JR NZ,ANSI_ED1 ; NOPE -; - ; ERASE ALL, HOME CURSOR AND TREAT AS ERASE EOS - LD DE,0 ; PREPARE TO HOME CURSOR - LD (ANSI_POS),DE ; SAVE NEW CURSOR POSITION - CALL ANSI_XY ; EXECUTE - LD A,0 ; TREAT PARM AS 0 -; -ANSI_ED1: ; DETERMINE TYPE OF ERASE CP 0 ; ERASE CURSOR TO EOS - JR Z,ANSI_ED2 + JR Z,ANSI_ED1 CP 1 ; ERASE START THRU CURSOR + JR Z,ANSI_ED2 + CP 2 ; ERASE FULL DISPLAY? JR Z,ANSI_ED3 RET ; INVALID? ; -ANSI_ED2: ; ERASE CURSOR THRU EOL +ANSI_ED1: ; ERASE CURSOR THRU EOS LD DE,(ANSI_POS) ; GET CURSOR POSITION CALL ANSI_POS2IDX ; HL NOW HAS CURSOR INDEX PUSH HL ; SAVE IT @@ -440,7 +429,7 @@ ANSI_ED2: ; ERASE CURSOR THRU EOL LD B,BF_VDAFIL ; SET FUNCTION TO FILL JP EMU_VDADISP ; PERFORM FILL AND RETURN ; -ANSI_ED3: ; ERASE START THRU CURSOR +ANSI_ED2: ; ERASE START THRU CURSOR LD DE,0 ; CURSOR TO 0,0 FOR NOW LD B,BF_VDASCP ; SET FUNCTION TO SET CURSOR POSITION CALL EMU_VDADISP ; DO IT @@ -452,6 +441,201 @@ ANSI_ED3: ; ERASE START THRU CURSOR CALL EMU_VDADISP ; DO IT JP ANSI_XY ; RESTORE CURSOR AND RETURN ; +ANSI_ED3: ; ERASE FULL DISPLAY + LD DE,(ANSI_POS) ; GET CURSOR POS + PUSH DE ; SAVE IT + LD DE,0 ; PREPARE TO HOME CURSOR + LD (ANSI_POS),DE ; SAVE NEW CURSOR POSITION + CALL ANSI_XY ; EXECUTE + CALL ANSI_ED1 ; ERASE THRU EOS + POP DE ; RECOVER CURSOR POS + LD (ANSI_POS),DE ; SAVE IT + JP ANSI_XY ; UPDATE CURSOR AND RETURN +; +; +; +ANSI_EL: ; ERASE IN LINE + LD A,(ANSI_PARLST + 0) ; GET FIRST PARM + CP 0 ; ERASE CURSOR TO EOL + JR Z,ANSI_EL1 + CP 1 ; ERASE START THRU CURSOR + JR Z,ANSI_EL2 + CP 2 ; ERASE FULL LINE? + JR Z,ANSI_EL3 + RET ; INVALID? +; +ANSI_EL1: ; ERASE CURSOR THRU EOL + LD DE,(ANSI_POS) ; GET CURSOR POSITION + CALL ANSI_POS2IDX ; HL NOW HAS CURSOR INDEX + PUSH HL ; SAVE IT + LD DE,(ANSI_POS) ; GET CURSOR POSITION + LD E,0 ; COL POSITION := 0 + INC D ; ROW := ROW + 1 + CALL ANSI_POS2IDX ; HL NOW HAS EOL INDEX + POP DE ; RECOVER CURSOR POS INDEX + OR A ; CLEAR CARRY + SBC HL,DE ; SUBTRACT CURSOR INDEX FROM EOL INDEX + LD E,' ' ; FILL WITH BLANKS + LD B,BF_VDAFIL ; SET FUNCTION TO FILL + JP EMU_VDADISP ; PERFORM FILL AND RETURN +; +ANSI_EL2: ; ERASE START THRU CURSOR + LD DE,(ANSI_POS) ; GET CURSOR POS + LD E,0 ; COL := 0, START OF ROW + LD B,BF_VDASCP ; SET FUNCTION TO SET CURSOR POSITION + CALL EMU_VDADISP ; DO IT + LD HL,(ANSI_POS) ; GET ORIGINAL CURSOR POSITION + LD H,0 ; ONLY ERASE COLUMNS + INC HL ; ADD 1 POSITION TO ERASE THRU CURSOR POSITION + LD E,' ' ; FILL WITH BLANKS + LD B,BF_VDAFIL ; SET FUNCTION TO FILL + CALL EMU_VDADISP ; DO IT + JP ANSI_XY ; RESTORE CURSOR AND RETURN +; +ANSI_EL3: ; ERASE FULL LINE + LD DE,(ANSI_POS) ; GET CURSOR POS + PUSH DE ; SAVE IT + LD E,0 ; CURSOR TO START OF LINE + LD (ANSI_POS),DE ; SAVE NEW CURSOR POSITION + CALL ANSI_XY ; EXECUTE + CALL ANSI_EL1 ; ERASE THRU EOL + POP DE ; RECOVER CURSOR POS + LD (ANSI_POS),DE ; SAVE IT + JP ANSI_XY ; UPDATE CURSOR AND RETURN +; +; +; +ANSI_HVP: ; HORIZONTAL/VERTICAL POSITION +ANSI_CUP: ; CURSOR UPDATE +; + ; HANDLE ROW NUMBER + LD A,(ANSI_PARLST + 0) ; ROW PARM + DEC A ; ADJUST FOR ZERO OFFSET + JP P,ANSI_CUP1 ; 0 OR MORE, OK, CONTINUE + XOR A ; NEGATIVE, FIX IT +ANSI_CUP1: + LD HL,ANSI_ROWS ; HL POINTS TO ROW COUNT + CP (HL) ; COMPARE TO ROW COUNT + JR C,ANSI_CUP2 ; IN BOUNDS, CONTINUE + LD A,(HL) ; FIX IT, LOAD ROW COUNT + DEC A ; SET TO LAST ROW NUM +ANSI_CUP2: + LD D,A ; COMMIT ROW NUMBER TO D +; + ; HANDLE COL NUMBER + LD A,(ANSI_PARLST + 1) ; COL PARM + DEC A ; ADJUST FOR ZERO OFFSET + JP P,ANSI_CUP3 ; 0 OR MORE, OK, CONTINUE + XOR A ; NEGATIVE, FIX IT +ANSI_CUP3: + LD HL,ANSI_COLS ; HL POINTS TO COL COUNT + CP (HL) ; COMPARE TO COL COUNT + JR C,ANSI_CUP4 ; IN BOUNDS, CONTINUE + LD A,(HL) ; FIX IT, LOAD COL COUNT + DEC A ; SET TO LAST COL NUM +ANSI_CUP4: + LD E,A ; COMMIT COL NUMBER TO E +; + ; COMMIT THE NEW CURSOR POSITION AND RETURN + LD (ANSI_POS),DE ; SAVE IT + JP ANSI_XY ; UPDATE CURSOR AND RETURN +; +; +; +ANSI_SGR: ; SET GRAPHIC RENDITION + LD A,(ANSI_PARIDX) ; GET CURRENT PARM INDEX + INC A ; INC TO MAKE IT THE COUNT + LD B,A ; B IS NOW LOOP COUNTER + LD HL,ANSI_PARLST ; HL POINTS TO START OF PARM LIST +; +ANSI_SGR1: ; PROCESSING LOOP + PUSH BC ; PRESERVE BC + PUSH HL ; PRESERVE HL + LD A,(HL) + CALL ANSI_SGR2 ; HANDLE PARM + POP HL ; RESTORE HL + POP BC ; RESTORE BC + INC HL ; POINT TO NEXT PARM + DJNZ ANSI_SGR1 ; LOOP TILL DONE +; + ; NOW IMPLEMENT ALL CHANGES + LD A,(ANSI_ATTR) ; GET THE ATTRIBUTE VALUE + LD E,A ; MOVE TO E + LD B,BF_VDASAT ; SET ATTRIBUTE FUNCTION + CALL EMU_VDADISP ; CALL THE FUNCTION + LD A,(ANSI_COLOR) ; GET THE COLOR VALUE + LD E,A ; MOVE TO E + LD B,BF_VDASCO ; SET ATTRIBUTE FUNCTION + CALL EMU_VDADISP ; CALL THE FUNCTION + RET ; RETURN +; +ANSI_SGR2: ; HANDLE THE REQUEST CODE + CP 0 ; ALL OFF + JR Z,ANSI_SGR_OFF ; DO IT + CP 1 ; BOLD + JR Z,ANSI_SGR_BOLD ; DO IT + CP 4 ; UNDERLINE + JR Z,ANSI_SGR_UL ; DO IT + CP 7 ; REVERSE + JR Z,ANSI_SGR_REV ; DO IT + CP 30 ; START OF FOREGROUND + RET C ; OUT OF RANGE + CP 38 ; END OF RANGE + JR C,ANSI_SGR_FG ; SET FOREGROUND + CP 40 ; START OF BACKGROUND + RET C ; OUT OF RANGE + CP 48 ; END OF RANGE + JR C,ANSI_SGR_BG ; SET BACKGROUND + RET ; OTHERWISE OUT OF RANGE +; +ANSI_SGR_OFF: + XOR A ; ZERO ACCUM + LD (ANSI_ATTR),A ; CLEAR ATTRIBUTES + LD A,7 ; WHITE ON BLACK + LD (ANSI_COLOR),A ; RESET COLOR + RET +; +ANSI_SGR_BOLD: + LD A,(ANSI_COLOR) ; LOAD CURRENT COLOR + OR %00001000 ; SET BOLD BIT + LD (ANSI_COLOR),A ; SAVE IT + RET +; +ANSI_SGR_UL: + LD A,(ANSI_ATTR) ; LOAD CURRENT ATTRIBUTE + OR %00000010 ; SET UNDERLINE BIT + LD (ANSI_ATTR),A ; SAVE IT + RET +; +ANSI_SGR_REV: + LD A,(ANSI_ATTR) ; LOAD CURRENT ATTRIBUTE + OR %00000100 ; SET REVERSE BIT + LD (ANSI_ATTR),A ; SAVE IT + RET +; +ANSI_SGR_FG: + SUB 30 + LD E,A + LD A,(ANSI_COLOR) + AND %11111000 + OR E + LD (ANSI_COLOR),A + RET +; +ANSI_SGR_BG: + SUB 40 + RLCA + RLCA + RLCA + RLCA + LD E,A + LD A,(ANSI_COLOR) + AND %10001111 + OR E + LD (ANSI_COLOR),A + RET + +; ;================================================================================================== ; SUPPORT FUNCTIONS ;================================================================================================== @@ -494,4 +678,7 @@ ANSI_PRI .DB 0 ; PRIVATE CHARACTER RECORDED HERE ANSI_INT .DB 0 ; INTERMEDIATE CHARACTER RECORDED HERE ANSI_PARIDX .DB 0 ; NUMBER OF PARAMETERS RECORDED ANSI_PARLST .FILL 16,0 ; PARAMETER VALUE LIST (UP TO 16 BYTE VALUES) -ANSI_VARLEN .EQU $ - ANSI_VARS \ No newline at end of file +ANSI_VARLEN .EQU $ - ANSI_VARS +; +ANSI_ATTR .DB 0 ; CURRENT CHARACTER ATTRIBUTE +ANSI_COLOR .DB 7 ; CURRENT CHARACTER COLOR \ No newline at end of file diff --git a/branches/wbw/Source/cvdu.asm b/branches/wbw/Source/cvdu.asm index 1b78b339..d2963992 100644 --- a/branches/wbw/Source/cvdu.asm +++ b/branches/wbw/Source/cvdu.asm @@ -148,7 +148,7 @@ CVDU_VDASAT: LD A,(CVDU_ATTR) ; GET CURRENT ATTRIBUTE SETTING AND %10001111 ; CLEAR OUT OLD ATTRIBUTE BITS OR E ; STUFF IN THE NEW ONES - LD A,(CVDU_ATTR) ; AND SAVE THE RESULT + LD (CVDU_ATTR),A ; AND SAVE THE RESULT XOR A ; SIGNAL SUCCESS RET @@ -165,7 +165,7 @@ CVDU_VDASCO1: LD A,(CVDU_ATTR) ; GET CURRENT VALUE INTO A AND %11110000 ; CLEAR OUT OLD COLOR BITS OR E ; STUFF IN THE NEW ONES - LD A,(CVDU_ATTR) ; AND SAVE THE RESULT + LD (CVDU_ATTR),A ; AND SAVE THE RESULT XOR A ; SIGNAL SUCCESS RET