mirror of
https://github.com/ksherlock/marlene.git
synced 2024-12-21 22:29:28 +00:00
add FillChar routine to support ESC #8
This commit is contained in:
parent
5c0764e5b9
commit
58ab674589
137
ansi.asm
137
ansi.asm
@ -1,8 +1,14 @@
|
||||
case on
|
||||
mcopy ansi.mac
|
||||
|
||||
dummy start
|
||||
end
|
||||
|
||||
RDMAINRAM gequ $E0C002 ; Read from main memory
|
||||
RDCARDRAM gequ $E0C003 ; Read from auxiliary memory
|
||||
WRMAINRAM gequ $E0C004 ; Write to main memory
|
||||
WRCARDRAM gequ $E0C005 ; Write to auxiliary memory
|
||||
|
||||
tables privdata
|
||||
|
||||
;
|
||||
@ -641,6 +647,137 @@ exit anop
|
||||
end
|
||||
|
||||
|
||||
; FillChar(char, andMask, xorMask)
|
||||
gen on
|
||||
FillChar START
|
||||
|
||||
using tables
|
||||
|
||||
subroutine (2:char,2:andMask,2:xorMask),(16:cdata)
|
||||
|
||||
xx equ andMask
|
||||
yy equ xorMask
|
||||
|
||||
lda <char
|
||||
cmp #$7f
|
||||
bcs space
|
||||
sec
|
||||
sbc #$20
|
||||
bmi space
|
||||
asl a ; x2
|
||||
asl a ; x4
|
||||
asl a ; x8
|
||||
asl a ; x16
|
||||
tax
|
||||
bra ok
|
||||
|
||||
|
||||
space anop
|
||||
ldx #0 ; char
|
||||
|
||||
ok anop
|
||||
|
||||
; pre-calc the char mask to data.
|
||||
|
||||
lda CHAR_SPACE,x
|
||||
eor <xorMask
|
||||
and <andMask
|
||||
sta cdata
|
||||
|
||||
lda CHAR_SPACE+2,x
|
||||
eor <xorMask
|
||||
and <andMask
|
||||
sta cdata+2
|
||||
|
||||
lda CHAR_SPACE+4,x
|
||||
eor <xorMask
|
||||
and <andMask
|
||||
sta cdata+4
|
||||
|
||||
lda CHAR_SPACE+6,x
|
||||
eor <xorMask
|
||||
and <andMask
|
||||
sta cdata+6
|
||||
|
||||
lda CHAR_SPACE+8,x
|
||||
eor <xorMask
|
||||
and <andMask
|
||||
sta cdata+8
|
||||
|
||||
lda CHAR_SPACE+10,x
|
||||
eor <xorMask
|
||||
and <andMask
|
||||
sta cdata+10
|
||||
|
||||
lda CHAR_SPACE+12,x
|
||||
eor <xorMask
|
||||
and <andMask
|
||||
sta cdata+12
|
||||
|
||||
lda CHAR_SPACE+14,x
|
||||
eor <xorMask
|
||||
and <andMask
|
||||
sta cdata+14
|
||||
|
||||
|
||||
pea $e1e1
|
||||
plb
|
||||
plb
|
||||
|
||||
|
||||
lda #24
|
||||
sta yy
|
||||
|
||||
ldx #0*8*160+4*160+$2000
|
||||
yloop anop
|
||||
|
||||
lda cdata+0
|
||||
jsr one_line
|
||||
|
||||
lda cdata+2
|
||||
jsr one_line
|
||||
|
||||
lda cdata+4
|
||||
jsr one_line
|
||||
|
||||
lda cdata+6
|
||||
jsr one_line
|
||||
|
||||
lda cdata+8
|
||||
jsr one_line
|
||||
|
||||
lda cdata+10
|
||||
jsr one_line
|
||||
|
||||
lda cdata+12
|
||||
jsr one_line
|
||||
|
||||
lda cdata+14
|
||||
jsr one_line
|
||||
|
||||
dec yy
|
||||
bne yloop
|
||||
|
||||
exit anop
|
||||
|
||||
return
|
||||
|
||||
end
|
||||
|
||||
one_line private
|
||||
; a = character data
|
||||
; x = memory address
|
||||
|
||||
ldy #80
|
||||
loop anop
|
||||
sta |$0000,x
|
||||
inx
|
||||
inx
|
||||
dey
|
||||
bne loop
|
||||
rts
|
||||
end
|
||||
|
||||
HideCursor start
|
||||
using cursor_data
|
||||
|
||||
|
245
ansi.mac
Normal file
245
ansi.mac
Normal file
@ -0,0 +1,245 @@
|
||||
macro
|
||||
&l _ldy &r
|
||||
&l anop
|
||||
aif "&r"="@a",.a
|
||||
aif "&r"="@x",.x
|
||||
aif "&r"="@y",.y
|
||||
ldy &r
|
||||
ago .y
|
||||
.a
|
||||
tay
|
||||
ago .y
|
||||
.x
|
||||
txy
|
||||
ago .y
|
||||
.y
|
||||
mend
|
||||
macro
|
||||
&l subroutine &parms,&locals
|
||||
&l anop
|
||||
gbla &totallen
|
||||
gbla &worklen
|
||||
gbla &returnlen
|
||||
&worklen seta 0
|
||||
&totallen seta 0
|
||||
&returnlen seta 4
|
||||
lclc &len
|
||||
lclc &p
|
||||
lcla &i
|
||||
|
||||
phb
|
||||
|
||||
aif c:&locals=0,.doparms
|
||||
.dolocals
|
||||
&i seta 1
|
||||
.bb
|
||||
&p setc &locals(&i)
|
||||
&len amid &p,2,1
|
||||
aif "&len"=":",.cc
|
||||
&len amid &p,1,2
|
||||
&p amid &p,4,l:&p-3
|
||||
ago .dd
|
||||
.cc
|
||||
&len amid &p,1,1
|
||||
&p amid &p,3,l:&p-2
|
||||
.dd
|
||||
&p equ &worklen+1
|
||||
&worklen seta &worklen+&len
|
||||
&i seta &i+1
|
||||
aif &i<=c:&locals,^bb
|
||||
.doparms
|
||||
|
||||
aif c:&parms=0,.e
|
||||
&i seta 1
|
||||
.b
|
||||
&p setc &parms(&i)
|
||||
&len amid &p,2,1
|
||||
aif "&len"=":",.c
|
||||
&len amid &p,1,2
|
||||
&p amid &p,4,l:&p-3
|
||||
ago .d
|
||||
.c
|
||||
&len amid &p,1,1
|
||||
&p amid &p,3,l:&p-2
|
||||
.d
|
||||
&p equ &totallen+&returnlen+1+&worklen
|
||||
&totallen seta &totallen+&len
|
||||
&i seta &i+1
|
||||
aif &i<=c:&parms,^b
|
||||
.e
|
||||
tsc
|
||||
aif &worklen=0,.f
|
||||
sec
|
||||
sbc #&worklen
|
||||
tcs
|
||||
.f
|
||||
phd
|
||||
tcd
|
||||
mend
|
||||
|
||||
|
||||
macro
|
||||
&l lsubroutine &parms,&locals
|
||||
&l anop
|
||||
gbla &totallen
|
||||
gbla &worklen
|
||||
gbla &returnlen
|
||||
&worklen seta 0
|
||||
&totallen seta 0
|
||||
&returnlen seta 2
|
||||
lclc &len
|
||||
lclc &p
|
||||
lcla &i
|
||||
|
||||
aif c:&locals=0,.doparms
|
||||
.dolocals
|
||||
&i seta 1
|
||||
.bb
|
||||
&p setc &locals(&i)
|
||||
&len amid &p,2,1
|
||||
aif "&len"=":",.cc
|
||||
&len amid &p,1,2
|
||||
&p amid &p,4,l:&p-3
|
||||
ago .dd
|
||||
.cc
|
||||
&len amid &p,1,1
|
||||
&p amid &p,3,l:&p-2
|
||||
.dd
|
||||
&p equ &worklen+1
|
||||
&worklen seta &worklen+&len
|
||||
&i seta &i+1
|
||||
aif &i<=c:&locals,^bb
|
||||
.doparms
|
||||
aif c:&parms=0,.e
|
||||
&i seta 1
|
||||
.b
|
||||
&p setc &parms(&i)
|
||||
&len amid &p,2,1
|
||||
aif "&len"=":",.c
|
||||
&len amid &p,1,2
|
||||
&p amid &p,4,l:&p-3
|
||||
ago .d
|
||||
.c
|
||||
&len amid &p,1,1
|
||||
&p amid &p,3,l:&p-2
|
||||
.d
|
||||
&p equ &totallen+&return+1+&worklen
|
||||
&totallen seta &totallen+&len
|
||||
&i seta &i+1
|
||||
aif &i<=c:&parms,^b
|
||||
.e
|
||||
tsc
|
||||
aif &worklen=0,.f
|
||||
sec
|
||||
sbc #&worklen
|
||||
tcs
|
||||
.f
|
||||
phd
|
||||
tcd
|
||||
mend
|
||||
|
||||
macro
|
||||
&l return &r
|
||||
&l anop
|
||||
lclc &len
|
||||
aif c:&r,.a
|
||||
lclc &r
|
||||
&r setc 0
|
||||
&len setc 0
|
||||
ago .h
|
||||
.a
|
||||
&len amid &r,2,1
|
||||
aif "&len"=":",.b
|
||||
&len amid &r,1,2
|
||||
&r amid &r,4,l:&r-3
|
||||
ago .c
|
||||
.b
|
||||
&len amid &r,1,1
|
||||
&r amid &r,3,l:&r-2
|
||||
.c
|
||||
aif &len<>2,.d
|
||||
_ldy &r
|
||||
ago .h
|
||||
.d
|
||||
aif &len<>4,.e
|
||||
ldx &r+2
|
||||
ldy &r
|
||||
ago .h
|
||||
.e
|
||||
aif &len<>10,.g
|
||||
ldy #&r
|
||||
ldx #^&r
|
||||
ago .h
|
||||
.g
|
||||
mnote 'Not a valid return length',16
|
||||
mexit
|
||||
.h
|
||||
aif &totallen=0,.i
|
||||
lda &worklen+3
|
||||
sta &worklen+&totallen+3
|
||||
lda &worklen+1
|
||||
sta &worklen+&totallen+1
|
||||
.i
|
||||
pld
|
||||
tsc
|
||||
clc
|
||||
adc #&worklen+&totallen
|
||||
tcs
|
||||
aif &len=0,.j
|
||||
tya
|
||||
.j
|
||||
plb
|
||||
rtl
|
||||
mend
|
||||
|
||||
macro
|
||||
&l lreturn &r
|
||||
&l anop
|
||||
lclc &len
|
||||
aif c:&r,.a
|
||||
lclc &r
|
||||
&r setc 0
|
||||
&len setc 0
|
||||
ago .h
|
||||
.a
|
||||
&len amid &r,2,1
|
||||
aif "&len"=":",.b
|
||||
&len amid &r,1,2
|
||||
&r amid &r,4,l:&r-3
|
||||
ago .c
|
||||
.b
|
||||
&len amid &r,1,1
|
||||
&r amid &r,3,l:&r-2
|
||||
.c
|
||||
aif &len<>2,.d
|
||||
_ldy &r
|
||||
ago .h
|
||||
.d
|
||||
aif &len<>4,.e
|
||||
ldx &r+2
|
||||
ldy &r
|
||||
ago .h
|
||||
.e
|
||||
aif &len<>10,.g
|
||||
ldy #&r
|
||||
ldx #^&r
|
||||
ago .h
|
||||
.g
|
||||
mnote 'Not a valid return length',16
|
||||
mexit
|
||||
.h
|
||||
aif &totallen=0,.i
|
||||
lda &worklen+1
|
||||
sta &worklen+&totallen+1
|
||||
.i
|
||||
pld
|
||||
tsc
|
||||
clc
|
||||
adc #&worklen+&totallen
|
||||
tcs
|
||||
aif &len=0,.j
|
||||
tya
|
||||
.j
|
||||
rts
|
||||
mend
|
||||
|
4
vt100.c
4
vt100.c
@ -21,6 +21,7 @@ extern unsigned buffer_size;
|
||||
extern void ReverseScrollRegion(unsigned, unsigned);
|
||||
extern void ScrollRegion(unsigned, unsigned);
|
||||
extern void PrintChar(unsigned x, unsigned y, unsigned the_char, unsigned andMask, unsigned eorMask);
|
||||
extern void FillChar(unsigned the_char, unsigned andMask, unsigned eorMask);
|
||||
|
||||
extern void ClearScreen(void);
|
||||
extern void ClearScreen2(unsigned start, unsigned end);
|
||||
@ -547,6 +548,9 @@ void vt100_process(const unsigned char *buffer, unsigned buffer_size) {
|
||||
|
||||
case st_pound:
|
||||
/* #8 -> fill with Es */
|
||||
if (c == '8') {
|
||||
FillChar('E', 0xffff, 0x0000);
|
||||
}
|
||||
state = st_text; break;
|
||||
case st_lparen:
|
||||
case st_rparen:
|
||||
|
Loading…
Reference in New Issue
Block a user