Browse Source

Round 2 of ANSI emulation work

import/raw
wayne 13 years ago
parent
commit
577d2a4af6
  1. 239
      branches/wbw/Source/ansi.asm
  2. 4
      branches/wbw/Source/cvdu.asm

239
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("<CTL>($")
@ -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
ANSI_VARLEN .EQU $ - ANSI_VARS
;
ANSI_ATTR .DB 0 ; CURRENT CHARACTER ATTRIBUTE
ANSI_COLOR .DB 7 ; CURRENT CHARACTER COLOR

4
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

Loading…
Cancel
Save