itty-bitty-vtty/vt100.cda.S

806 lines
8.2 KiB
ArmAsm
Raw Normal View History

lst off
rel
xc
xc
cas se
tbx on ; qasm
use apple2gs.equ
use vt.equ
2021-12-06 03:47:40 +00:00
use debug
* alternate character set
* $00-$1f = upper inverse ( asci value - $40)
* $20-$3f = special inverse (ascii value)
* $40-$4f = mouse text
* $60-$7f = lower inverse (= ascii value)
* $80-$9f = upper [redundant]
* $a0-$bf = special (high ascii)
* $c0-$df = upper (high ascii)
* $e0-$ff = lower (high ascii)
* 40-column control panel
* TODO - if 80 column set in preferences, draw centered in 80-column mode
dum 0
* cda direct page variables
ptr ds 2
dend
init_cda ent
php
rep #$30
psl #handle
_InstallCDA
plp
rts
handle adrl Header ; can use a fake handle for now, until we need to _RemoveCDA
Header
str 'Virtual Terminal'
adrl start
adrl shutdown
2021-12-06 03:47:40 +00:00
* variables.
page ds 2
pages dw variables
dw hexdump
dw ssc_registers
shutdown
mx %00
rtl
start
mx %00
phb
phd
phk
plb
sep #$30
sta TXTSET
sta CLR80VID
sta SETALTCHAR
rep #$30
2021-12-06 03:47:40 +00:00
stz page
jsr clear
jsr box
2021-12-06 03:47:40 +00:00
main
jsr clear_inner
ldx page
jsr (pages,x)
* jsr variables
* jsr hexdump
:keyloop
lda KBD
bpl :keyloop
sta KEYSTROBE
2021-12-06 03:47:40 +00:00
and #$7f
cmp #$1b
beq :exit
cmp #$08 ; left
beq :left
cmp #$15
beq :right
bra :keyloop
:exit
pld
plb
rtl
2021-12-06 03:47:40 +00:00
:left lda page
dec
dec
bpl :lok
lda #$04
:lok sta page
bra main
:right lda page
inc
inc
cmp #$04+1
bcc :rok
lda #0
:rok sta page
bra main
clear
ldx #23*2
lda #" "
:loop
ldy text,x
]offset equ 0
lup 20
sta |0+]offset,y
]offset equ ]offset+2
--^
dex
dex
bpl :loop
rts
2021-12-06 03:47:40 +00:00
clear_inner
* clear the inner contents.
ldx #16*2
lda #" "
:loop ldy text+8,x
]offset equ 4
lup 16
sta |0+]offset,y
]offset equ ]offset+2
--^
dex
dex
bpl :loop
rts
box
php
* top line
lda #"_ "
sta |line_0+38
lda #" _"
sta |line_0
lda #"__"
ldx #34
]loop sta |line_0+2,x
dex
dex
bpl ]loop
* bottom line.
* 'L' = $4c = _ but high
lda #'L '!$8000 ; keep ' ' high ascii.
sta |line_23+38
lda #' L'!$0080 ; keep ' ' high ascii.
sta |line_23
lda #'LL'
ldx #34
]loop sta |line_23+2,x
dex
dex
bpl ]loop
* sides
sep #$20
lda #'Z'
ldx #21*2 ; skip top/bottom lines.
]loop ldy text+2,x
sta |$0,y
dex
dex
bpl ]loop
sep #$20
lda #'_'
ldx #21*2 ; skip top/bottom lines.
]loop ldy text+2,x
sta |$0+39,y
dex
dex
bpl ]loop
2021-10-23 18:53:35 +00:00
rep #$20
* title
ldx #36
]loop lda :title,x
sta |line_1+1,x
2021-10-23 18:53:35 +00:00
dex
dex
bpl ]loop
lda #'LL'
ldx #36
]loop sta |line_2+1,x
2021-10-23 18:53:35 +00:00
dex
dex
bpl ]loop
* bottom instructions
ldx #:instr_len-2
]loop lda :instr,x
sta |line_22+1,x
2021-10-23 18:53:35 +00:00
dex
dex
bpl ]loop
plp
rts
2021-10-23 18:53:35 +00:00
:instr
asc " Select: ",'H'," ",'U'," ",'J'," ",'K'
asc " Cancel:Esc Save: ",'M'," "
:instr_len equ *-:instr
err :instr_len&1
:title
asc " Virtual Terminal "
ds 38-18,' '
* print variables.
2021-12-06 03:47:40 +00:00
variables
php
sep #$20
jsr decanm
jsr dectm
jsr decbm
jsr decom
jsr deckpam
jsr decckm
jsr decawm
jsr decscnm
jsr lnm
2021-12-06 03:47:40 +00:00
jsr sgr
plp
rts
decanm
mx %10
ldy #line_4+4
ldx #:str
jsr print_xy_str
2021-12-06 03:47:40 +00:00
lda DPAGE+DECANM
bmi :100
ldx #:vt52
jmp print_xy_str
:100 ldx #:vt100
jmp print_xy_str
:str asc "DECANM: ",00
:vt100 asc "vt100",00
:vt52 asc "vt52",00
dectm
mx %10
ldy #line_5+4
ldx #:str
jsr print_xy_str
lda DPAGE+DECTM
inc
jmp print_number
:str asc "DECTM: ",00
decbm
mx %10
ldy #line_6+4
ldx #:str
jsr print_xy_str
lda DPAGE+DECBM
inc
jmp print_number
:str asc "DECBM: ",00
decom
mx %10
ldy #line_7+4
ldx #:str
jsr print_xy_str
lda DPAGE+DECOM
2021-12-06 03:47:40 +00:00
jmp print_on_off
:str asc "DECOM: ",00
deckpam
mx %10
ldy #line_8+4
ldx #:str
jsr print_xy_str
lda DPAGE+DECKPAM
2021-12-06 03:47:40 +00:00
jmp print_on_off
:str asc "DECKPAM: ",00
decckm
mx %10
ldy #line_9+4
ldx #:str
jsr print_xy_str
lda DPAGE+DECCKM
2021-12-06 03:47:40 +00:00
jmp print_on_off
:str asc "DECCKM: ",00
decawm
mx %10
ldy #line_10+4
ldx #:str
jsr print_xy_str
lda DPAGE+DECAWM
2021-12-06 03:47:40 +00:00
jmp print_on_off
:str asc "DECAWM: ",00
decscnm
mx %10
2021-10-25 18:30:50 +00:00
ldy #line_11+4
ldx #:str
jsr print_xy_str
lda DPAGE+DECSCNM
2021-12-06 03:47:40 +00:00
jmp print_on_off
:str asc "DECSCNM: ",00
lnm
mx %10
ldy #line_12+4
ldx #:str
jsr print_xy_str
lda DPAGE+LNM
2021-12-06 03:47:40 +00:00
jmp print_on_off
:str asc "LNM: ",00
2021-12-06 03:47:40 +00:00
sgr
mx %10
ldy #line_12+4
ldx #:str
jsr print_xy_str
lda DPAGE+SGR
jmp print_binary
:str asc "SGR: ",00
print_xy_str
mx %10
:loop lda |$0,x
beq :end
sta |$0,y
inx
iny
bra :loop
:end
rts
2021-12-06 03:47:40 +00:00
print_on_off
mx %10
bmi :set
ldx #:off
jmp print_xy_str
:set ldx #:on
jmp print_xy_str
:on asc "on",00
:off asc "off",00
print_number
mx %10
cmp #20
bcs :2
cmp #10
bcs :1
:0 ora #"0"
sta |$0,y
iny
rts
:2 pha
lda #"2"
sta |$0,y
iny
pla
sec
sbc #20
bra :0
:1 pha
lda #"1"
sta |$0,y
iny
pla
sec
sbc #10
bra :0
2021-12-06 03:47:40 +00:00
print_binary
mx %10
* pha
* lda #"%"
* sta |$0,y
* iny
* pla
lup 8
asl
pha
lda #0
adc #"0"
sta |$0,y
iny
pla
--^
rts
print_hex
mx %10
xba
lda #0
xba
pha
lsr
lsr
lsr
lsr
tax
lda hex,x
sta |$0,y
iny
pla
and #$0f
tax
lda hex,x
sta |$0,y
iny
rts
hexdump
*
* $1e00 buffer
*
:screen equ 0
:screen2 equ 2
:offset equ 4
:ptr equ 6
:count equ 8
:row equ 10
:c equ 12
mx %00
debug hexdump
php
lda #0
sep #$20
ldx #4*2
stx :row
ldy #0
sty :offset
:one_row
ldx :row
ldy text,x
sty :screen
sty :screen2
lda #8
sta :count
:one_byte
ldx :offset
lda $1e00,x
sta :c
lsr
lsr
lsr
lsr
tax
lda hex,x
ldy :screen
sta |$04,y
iny
lda :c
and #$0f
tax
lda hex,x
sta |$04,y
iny
lda #" "
sta |$04,y
iny
sty :screen
* ascii
ldx #"."
lda :c
cmp #$20
blt :dot
cmp #$80
bcs :dot
ora #$80
tax
:dot
txa
ldy :screen2
sta |8*3+4,y
iny
sty :screen2
inc :offset
dec :count
bne :one_byte
ldx :row
inx
inx
stx :row
cpx #20*2
bcc :one_row
plp
rts
hex asc "0123456789abcdef"
ssc_registers
debug ssc_registers
*
* print SSC read registers. read reg 8 (incoming data byte) is skipped.
*
*
*SCCBREG equ $c038
*SCCAREG equ $c039
*SCCBDATA equ $c03a
*SCCADATA equ $c03b
* read everything at once.
php
sep #$34 ; short m/x, ints off
lda #0
xba
* sei
ldx #0
lda SCCBREG ; sync
lda SCCAREG ; sync
stx SCCBREG
lda SCCBREG
sta ssc_data+0
inx ;1
stx SCCBREG
lda SCCBREG
sta ssc_data+1
inx ;2 - A and B both needed.
stx SCCAREG
lda SCCAREG
sta ssc_data+2
stx SCCBREG
lda SCCBREG
sta ssc_data+3
inx ;3 - A only
stx SCCAREG
lda SCCAREG
sta ssc_data+4
ldx #10
stx SCCBREG
lda SCCBREG
sta ssc_data+5
ldx #12
stx SCCBREG
lda SCCBREG
sta ssc_data+6
inx ; 13
stx SCCBREG
lda SCCBREG
sta ssc_data+7
ldx #15
stx SCCBREG
lda SCCBREG
sta ssc_data+8
cli
rep #$10 ; long x
mx %10
jsr rr0
jsr rr1
jsr rr2a
jsr rr2b
jsr rr3 ; only exists in channel A.
jsr rr10
jsr rr12 ; baud low
* jsr rr13 ; baud high
jsr rr15
plp
rts
ssc_data ds 10
rr0
mx %10
ldy #line_5+4
ldx #:str
jsr print_xy_str
lda ssc_data+0
jmp print_binary
:str asc "reg 0: ",00
rr1
mx %10
ldy #line_6+4
ldx #:str
jsr print_xy_str
lda ssc_data+1
jmp print_binary
:str asc "reg 1: ",00
rr2a
mx %10
ldy #line_7+4
ldx #:str
jsr print_xy_str
lda ssc_data+2
jmp print_binary
:str asc "reg 2A: ",00
rr2b
mx %10
ldy #line_8+4
ldx #:str
jsr print_xy_str
lda ssc_data+3
jmp print_binary
:str asc "reg 2B: ",00
rr3
mx %10
ldy #line_9+4
ldx #:str
jsr print_xy_str
lda ssc_data+4
jmp print_binary
:str asc "reg 3: ",00
rr10
mx %10
ldy #line_10+4
ldx #:str
jsr print_xy_str
lda ssc_data+5
jmp print_binary
:str asc "reg 10: ",00
* 12/13 are baud
rr12
mx %10
ldy #line_11+4
ldx #:str
jsr print_xy_str
lda ssc_data+7
jsr print_hex
lda ssc_data+6
jmp print_hex
:str asc "reg 12/13: ",00
rr15
mx %10
ldy #line_12+4
ldx #:str
jsr print_xy_str
lda ssc_data+8
jmp print_binary
:str asc "reg 15: ",00
text
dw $0400
dw $0480
dw $0500
dw $0580
dw $0600
dw $0680
dw $0700
dw $0780
dw $0428
dw $04a8
dw $0528
dw $05a8
dw $0628
dw $06a8
dw $0728
dw $07a8
dw $0450
dw $04d0
dw $0550
dw $05d0
dw $0650
dw $06d0
dw $0750
dw $07d0
line_0 equ $0400
line_1 equ $0480
line_2 equ $0500
line_3 equ $0580
line_4 equ $0600
line_5 equ $0680
line_6 equ $0700
line_7 equ $0780
line_8 equ $0428
line_9 equ $04a8
line_10 equ $0528
line_11 equ $05a8
line_12 equ $0628
line_13 equ $06a8
line_14 equ $0728
line_15 equ $07a8
line_16 equ $0450
line_17 equ $04d0
line_18 equ $0550
line_19 equ $05d0
line_20 equ $0650
line_21 equ $06d0
line_22 equ $0750
line_23 equ $07d0
2021-10-23 18:53:35 +00:00
sav vt100.cda.L