mirror of
https://github.com/ksherlock/itty-bitty-vtty.git
synced 2024-06-10 10:29:39 +00:00
Compare commits
24 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
a687a08b0b | ||
|
90e807ba46 | ||
|
2c432b3fc1 | ||
|
dcbafc2999 | ||
|
80edada6e9 | ||
|
04113c4725 | ||
|
1f7e3b3b4c | ||
|
18daf26568 | ||
|
60259531d5 | ||
|
22d1c744bb | ||
|
c15ae6ac4c | ||
|
9dfc3cc7c9 | ||
|
71993497ea | ||
|
acfe94a4c7 | ||
|
9cf52cb34e | ||
|
186d71de47 | ||
|
4eb578b94e | ||
|
c2d3ee0f28 | ||
|
900dccb3d1 | ||
|
ea6ee76a9d | ||
|
1cc501e72a | ||
|
f486bbfb1b | ||
|
8fa8d8d1fa | ||
|
02c6e1271c |
12
vt.equ.S
12
vt.equ.S
|
@ -36,6 +36,7 @@ DECOM ds 2 ; origin
|
||||||
DECSCNM ds 2 ; screen mode
|
DECSCNM ds 2 ; screen mode
|
||||||
DECAWM ds 2 ; wrap
|
DECAWM ds 2 ; wrap
|
||||||
DECARM ds 2 ; auto repeat
|
DECARM ds 2 ; auto repeat
|
||||||
|
DECCOLM ds 2 ; character per line (80/132)
|
||||||
|
|
||||||
|
|
||||||
LNM ds 2 ; new line
|
LNM ds 2 ; new line
|
||||||
|
@ -46,7 +47,6 @@ SGR ds 2 ; graphics, bit 1 = bold, 4 = underscore, 5 = blink, 7 = inverse
|
||||||
*CHARSET ds 2 ;
|
*CHARSET ds 2 ;
|
||||||
*GRAPHICS ds 2 ;
|
*GRAPHICS ds 2 ;
|
||||||
|
|
||||||
*DECCOLM ds 2 ; character per line (80/132)
|
|
||||||
*DECINLM ds 2 ; interlace
|
*DECINLM ds 2 ; interlace
|
||||||
*DECSCLM ds 2 ; scroll mode
|
*DECSCLM ds 2 ; scroll mode
|
||||||
|
|
||||||
|
@ -83,6 +83,16 @@ mod ds 2
|
||||||
saved_x ds 2
|
saved_x ds 2
|
||||||
saved_y ds 2
|
saved_y ds 2
|
||||||
saved_decom ds 2
|
saved_decom ds 2
|
||||||
|
saved_sgr ds 2
|
||||||
|
|
||||||
|
|
||||||
|
* async read/write pointers.
|
||||||
|
*
|
||||||
|
read_q_head ds 2
|
||||||
|
read_q_tail ds 2
|
||||||
|
write_q_head ds 2
|
||||||
|
write_q_tail ds 2
|
||||||
|
|
||||||
|
|
||||||
do *>256
|
do *>256
|
||||||
err "too big"
|
err "too big"
|
||||||
|
|
304
vt100.cda.S
304
vt100.cda.S
|
@ -34,14 +34,57 @@ ptr ds 2
|
||||||
dend
|
dend
|
||||||
|
|
||||||
|
|
||||||
init_cda ent
|
*
|
||||||
|
* rom 0/1 doesn't include _RemoveCDA in ROM so it can't be removed.
|
||||||
|
* additionally, _InstallCDA has bugs.
|
||||||
|
* so, for now, disable on ROM 1.
|
||||||
|
|
||||||
|
cda_startup ent
|
||||||
php
|
php
|
||||||
rep #$30
|
rep #$30
|
||||||
|
|
||||||
|
jsr $fe1f ; idroutine. y = rom
|
||||||
|
cpy #3
|
||||||
|
bcc :nope
|
||||||
|
|
||||||
|
*
|
||||||
|
* rom 1 IIgs InstallCDA clobbers $3c-$43 on the direct page
|
||||||
|
*
|
||||||
|
|
||||||
|
phd
|
||||||
|
pea #0
|
||||||
|
pld
|
||||||
|
|
||||||
psl #handle
|
psl #handle
|
||||||
_InstallCDA
|
_InstallCDA
|
||||||
|
|
||||||
|
pld
|
||||||
|
|
||||||
|
:nope
|
||||||
plp
|
plp
|
||||||
rts
|
rts
|
||||||
|
|
||||||
|
cda_shutdown ent
|
||||||
|
mx %00
|
||||||
|
|
||||||
|
jsr $fe1f ; idroutine. y = rom
|
||||||
|
cpy #3
|
||||||
|
bcc :nope
|
||||||
|
|
||||||
|
phd
|
||||||
|
pea #0
|
||||||
|
pld
|
||||||
|
|
||||||
|
|
||||||
|
psl #handle
|
||||||
|
_RemoveCDA
|
||||||
|
|
||||||
|
pld
|
||||||
|
|
||||||
|
:nope
|
||||||
|
rts
|
||||||
|
|
||||||
|
|
||||||
handle adrl Header ; can use a fake handle for now, until we need to _RemoveCDA
|
handle adrl Header ; can use a fake handle for now, until we need to _RemoveCDA
|
||||||
Header
|
Header
|
||||||
str 'Virtual Terminal'
|
str 'Virtual Terminal'
|
||||||
|
@ -51,8 +94,10 @@ Header
|
||||||
page ds 2
|
page ds 2
|
||||||
|
|
||||||
|
|
||||||
|
MAX_PAGE equ 8
|
||||||
pages dw variables
|
pages dw variables
|
||||||
dw hexdump
|
dw hexdump_r
|
||||||
|
dw hexdump_w
|
||||||
dw ssc_registers
|
dw ssc_registers
|
||||||
|
|
||||||
shutdown
|
shutdown
|
||||||
|
@ -83,14 +128,15 @@ main
|
||||||
jsr clear_inner
|
jsr clear_inner
|
||||||
ldx page
|
ldx page
|
||||||
jsr (pages,x)
|
jsr (pages,x)
|
||||||
* jsr variables
|
|
||||||
* jsr hexdump
|
|
||||||
|
|
||||||
|
|
||||||
:keyloop
|
:keyloop
|
||||||
|
sep #$30
|
||||||
lda KBD
|
lda KBD
|
||||||
bpl :keyloop
|
bpl :keyloop
|
||||||
sta KEYSTROBE
|
sta KEYSTROBE
|
||||||
|
rep #$30
|
||||||
|
|
||||||
and #$7f
|
and #$7f
|
||||||
|
|
||||||
|
@ -112,14 +158,14 @@ main
|
||||||
dec
|
dec
|
||||||
dec
|
dec
|
||||||
bpl :lok
|
bpl :lok
|
||||||
lda #$04
|
lda #MAX_PAGE-2
|
||||||
:lok sta page
|
:lok sta page
|
||||||
bra main
|
bra main
|
||||||
|
|
||||||
:right lda page
|
:right lda page
|
||||||
inc
|
inc
|
||||||
inc
|
inc
|
||||||
cmp #$04+1
|
cmp #MAX_PAGE
|
||||||
bcc :rok
|
bcc :rok
|
||||||
lda #0
|
lda #0
|
||||||
:rok sta page
|
:rok sta page
|
||||||
|
@ -263,23 +309,37 @@ box
|
||||||
variables
|
variables
|
||||||
php
|
php
|
||||||
sep #$20
|
sep #$20
|
||||||
|
jsr local
|
||||||
jsr decanm
|
jsr decanm
|
||||||
jsr dectm
|
|
||||||
jsr decbm
|
|
||||||
jsr decom
|
jsr decom
|
||||||
jsr deckpam
|
jsr deckpam
|
||||||
jsr decckm
|
jsr decckm
|
||||||
jsr decawm
|
jsr decawm
|
||||||
|
jsr decarm
|
||||||
jsr decscnm
|
jsr decscnm
|
||||||
|
jsr deccolm
|
||||||
jsr lnm
|
jsr lnm
|
||||||
jsr sgr
|
jsr sgr
|
||||||
|
jsr dectm
|
||||||
|
jsr decbm
|
||||||
|
jsr decx
|
||||||
|
jsr decy
|
||||||
plp
|
plp
|
||||||
rts
|
rts
|
||||||
|
|
||||||
|
local
|
||||||
|
mx %10
|
||||||
|
ldy #line_4+4
|
||||||
|
ldx #:str
|
||||||
|
jsr print_xy_str
|
||||||
|
lda DPAGE+LOCAL
|
||||||
|
jmp print_on_off
|
||||||
|
|
||||||
|
:str asc "LOCAL: ",00
|
||||||
|
|
||||||
decanm
|
decanm
|
||||||
mx %10
|
mx %10
|
||||||
ldy #line_4+4
|
ldy #line_5+4
|
||||||
ldx #:str
|
ldx #:str
|
||||||
jsr print_xy_str
|
jsr print_xy_str
|
||||||
lda DPAGE+DECANM
|
lda DPAGE+DECANM
|
||||||
|
@ -295,32 +355,10 @@ decanm
|
||||||
:vt52 asc "vt52",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
|
decom
|
||||||
mx %10
|
mx %10
|
||||||
ldy #line_7+4
|
ldy #line_6+4
|
||||||
ldx #:str
|
ldx #:str
|
||||||
jsr print_xy_str
|
jsr print_xy_str
|
||||||
lda DPAGE+DECOM
|
lda DPAGE+DECOM
|
||||||
|
@ -330,7 +368,7 @@ decom
|
||||||
|
|
||||||
deckpam
|
deckpam
|
||||||
mx %10
|
mx %10
|
||||||
ldy #line_8+4
|
ldy #line_7+4
|
||||||
ldx #:str
|
ldx #:str
|
||||||
jsr print_xy_str
|
jsr print_xy_str
|
||||||
lda DPAGE+DECKPAM
|
lda DPAGE+DECKPAM
|
||||||
|
@ -340,7 +378,7 @@ deckpam
|
||||||
|
|
||||||
decckm
|
decckm
|
||||||
mx %10
|
mx %10
|
||||||
ldy #line_9+4
|
ldy #line_8+4
|
||||||
ldx #:str
|
ldx #:str
|
||||||
jsr print_xy_str
|
jsr print_xy_str
|
||||||
lda DPAGE+DECCKM
|
lda DPAGE+DECCKM
|
||||||
|
@ -351,7 +389,7 @@ decckm
|
||||||
|
|
||||||
decawm
|
decawm
|
||||||
mx %10
|
mx %10
|
||||||
ldy #line_10+4
|
ldy #line_9+4
|
||||||
ldx #:str
|
ldx #:str
|
||||||
jsr print_xy_str
|
jsr print_xy_str
|
||||||
lda DPAGE+DECAWM
|
lda DPAGE+DECAWM
|
||||||
|
@ -359,6 +397,15 @@ decawm
|
||||||
|
|
||||||
:str asc "DECAWM: ",00
|
:str asc "DECAWM: ",00
|
||||||
|
|
||||||
|
decarm
|
||||||
|
mx %10
|
||||||
|
ldy #line_10+4
|
||||||
|
ldx #:str
|
||||||
|
jsr print_xy_str
|
||||||
|
lda DPAGE+DECARM
|
||||||
|
jmp print_on_off
|
||||||
|
|
||||||
|
:str asc "DECARM: ",00
|
||||||
|
|
||||||
decscnm
|
decscnm
|
||||||
mx %10
|
mx %10
|
||||||
|
@ -371,11 +418,22 @@ decscnm
|
||||||
:str asc "DECSCNM: ",00
|
:str asc "DECSCNM: ",00
|
||||||
|
|
||||||
|
|
||||||
lnm
|
deccolm
|
||||||
mx %10
|
mx %10
|
||||||
ldy #line_12+4
|
ldy #line_12+4
|
||||||
ldx #:str
|
ldx #:str
|
||||||
jsr print_xy_str
|
jsr print_xy_str
|
||||||
|
lda DPAGE+DECCOLM
|
||||||
|
jmp print_on_off
|
||||||
|
|
||||||
|
:str asc "DECCOLM: ",00
|
||||||
|
|
||||||
|
|
||||||
|
lnm
|
||||||
|
mx %10
|
||||||
|
ldy #line_13+4
|
||||||
|
ldx #:str
|
||||||
|
jsr print_xy_str
|
||||||
lda DPAGE+LNM
|
lda DPAGE+LNM
|
||||||
jmp print_on_off
|
jmp print_on_off
|
||||||
|
|
||||||
|
@ -384,16 +442,62 @@ lnm
|
||||||
|
|
||||||
sgr
|
sgr
|
||||||
mx %10
|
mx %10
|
||||||
ldy #line_13+4
|
ldy #line_14+4
|
||||||
ldx #:str
|
ldx #:str
|
||||||
jsr print_xy_str
|
jsr print_xy_str
|
||||||
lda DPAGE+SGR
|
lda DPAGE+SGR
|
||||||
jmp print_binary
|
jmp print_binary
|
||||||
|
|
||||||
|
|
||||||
:str asc "SGR: ",00
|
:str asc "SGR: ",00
|
||||||
|
|
||||||
|
|
||||||
|
dectm
|
||||||
|
mx %10
|
||||||
|
ldy #line_15+4
|
||||||
|
ldx #:str
|
||||||
|
jsr print_xy_str
|
||||||
|
lda DPAGE+DECTM
|
||||||
|
inc
|
||||||
|
jmp print_number
|
||||||
|
|
||||||
|
:str asc "DECTM: ",00
|
||||||
|
|
||||||
|
decbm
|
||||||
|
mx %10
|
||||||
|
ldy #line_16+4
|
||||||
|
ldx #:str
|
||||||
|
jsr print_xy_str
|
||||||
|
lda DPAGE+DECBM
|
||||||
|
inc
|
||||||
|
jmp print_number
|
||||||
|
|
||||||
|
:str asc "DECBM: ",00
|
||||||
|
|
||||||
|
|
||||||
|
decx
|
||||||
|
mx %10
|
||||||
|
ldy #line_17+4
|
||||||
|
ldx #:str
|
||||||
|
jsr print_xy_str
|
||||||
|
lda DPAGE+x
|
||||||
|
and #$7f
|
||||||
|
inc
|
||||||
|
jmp print_number
|
||||||
|
|
||||||
|
:str asc "X: ",00
|
||||||
|
|
||||||
|
decy
|
||||||
|
mx %10
|
||||||
|
ldy #line_18+4
|
||||||
|
ldx #:str
|
||||||
|
jsr print_xy_str
|
||||||
|
lda DPAGE+y
|
||||||
|
inc
|
||||||
|
jmp print_number
|
||||||
|
|
||||||
|
:str asc "Y: ",00
|
||||||
|
|
||||||
|
|
||||||
print_xy_str
|
print_xy_str
|
||||||
mx %10
|
mx %10
|
||||||
:loop lda |$0,x
|
:loop lda |$0,x
|
||||||
|
@ -417,34 +521,64 @@ print_on_off
|
||||||
:off asc "off",00
|
:off asc "off",00
|
||||||
|
|
||||||
print_number
|
print_number
|
||||||
|
debug print_number
|
||||||
|
*
|
||||||
|
* print a base-10 number, 0-255
|
||||||
|
* a = #
|
||||||
mx %10
|
mx %10
|
||||||
cmp #20
|
|
||||||
bcs :2
|
|
||||||
|
ldx #0
|
||||||
|
|
||||||
|
:100
|
||||||
|
cmp #100
|
||||||
|
bcc :10x
|
||||||
|
inx
|
||||||
|
* sec
|
||||||
|
sbc #100
|
||||||
|
bra :100
|
||||||
|
|
||||||
|
:10x
|
||||||
|
cpx #0
|
||||||
|
beq :10
|
||||||
|
|
||||||
|
pha
|
||||||
|
txa
|
||||||
|
* clc
|
||||||
|
* adc #"0"
|
||||||
|
ora #"0"
|
||||||
|
sta |$0,y
|
||||||
|
iny
|
||||||
|
pla
|
||||||
|
ldx #0
|
||||||
|
|
||||||
|
:10
|
||||||
cmp #10
|
cmp #10
|
||||||
bcs :1
|
bcc :1x
|
||||||
:0 ora #"0"
|
inx
|
||||||
|
sbc #10
|
||||||
|
bra :10
|
||||||
|
|
||||||
|
:1x
|
||||||
|
cpx #0
|
||||||
|
beq :1
|
||||||
|
pha
|
||||||
|
txa
|
||||||
|
* clc
|
||||||
|
* adc #"0"
|
||||||
|
ora #"0"
|
||||||
|
sta |$0,y
|
||||||
|
iny
|
||||||
|
pla
|
||||||
|
|
||||||
|
:1
|
||||||
|
* clc
|
||||||
|
* adc #"0"
|
||||||
|
ora #"0"
|
||||||
sta |$0,y
|
sta |$0,y
|
||||||
iny
|
iny
|
||||||
rts
|
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
|
|
||||||
|
|
||||||
|
|
||||||
print_binary
|
print_binary
|
||||||
mx %10
|
mx %10
|
||||||
* pha
|
* pha
|
||||||
|
@ -486,32 +620,66 @@ print_hex
|
||||||
iny
|
iny
|
||||||
rts
|
rts
|
||||||
|
|
||||||
hexdump
|
|
||||||
|
hexdump_r
|
||||||
*
|
*
|
||||||
* $1e00 buffer
|
* $1e00 buffer
|
||||||
*
|
*
|
||||||
|
|
||||||
|
mx %00
|
||||||
|
|
||||||
|
lda DPAGE+read_q_tail
|
||||||
|
sec
|
||||||
|
sbc #8*16
|
||||||
|
and #$00ff
|
||||||
|
ora #$1e00
|
||||||
|
jmp hexdump_common
|
||||||
|
|
||||||
|
|
||||||
|
hexdump_w
|
||||||
|
*
|
||||||
|
* $1d00 buffer
|
||||||
|
*
|
||||||
|
mx %00
|
||||||
|
|
||||||
|
|
||||||
|
lda DPAGE+write_q_tail
|
||||||
|
sec
|
||||||
|
sbc #8*16
|
||||||
|
and #$00ff
|
||||||
|
ora #$1d00
|
||||||
|
jmp hexdump_common
|
||||||
|
|
||||||
|
|
||||||
|
hexdump_common
|
||||||
|
*
|
||||||
|
* a = address to start.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
:screen equ 0
|
:screen equ 0
|
||||||
:screen2 equ 2
|
:screen2 equ 2
|
||||||
:offset equ 4
|
*:offset equ 4
|
||||||
:ptr equ 6
|
:ptr equ 6
|
||||||
:count equ 8
|
:count equ 8
|
||||||
:row equ 10
|
:row equ 10
|
||||||
:c equ 12
|
:c equ 12
|
||||||
|
|
||||||
|
|
||||||
mx %00
|
mx %00
|
||||||
debug hexdump
|
debug hexdump
|
||||||
|
|
||||||
|
|
||||||
php
|
php
|
||||||
|
sta :ptr
|
||||||
lda #0
|
lda #0
|
||||||
|
|
||||||
|
* stz :offset
|
||||||
|
|
||||||
sep #$20
|
sep #$20
|
||||||
|
|
||||||
ldx #4*2
|
ldx #4*2
|
||||||
stx :row
|
stx :row
|
||||||
|
|
||||||
ldy #0
|
|
||||||
sty :offset
|
|
||||||
|
|
||||||
:one_row
|
:one_row
|
||||||
|
|
||||||
|
@ -527,8 +695,8 @@ hexdump
|
||||||
|
|
||||||
:one_byte
|
:one_byte
|
||||||
|
|
||||||
ldx :offset
|
lda (:ptr)
|
||||||
lda $1e00,x
|
inc :ptr
|
||||||
|
|
||||||
sta :c
|
sta :c
|
||||||
lsr
|
lsr
|
||||||
|
@ -569,7 +737,6 @@ hexdump
|
||||||
sty :screen2
|
sty :screen2
|
||||||
|
|
||||||
|
|
||||||
inc :offset
|
|
||||||
dec :count
|
dec :count
|
||||||
bne :one_byte
|
bne :one_byte
|
||||||
|
|
||||||
|
@ -584,6 +751,7 @@ hexdump
|
||||||
plp
|
plp
|
||||||
rts
|
rts
|
||||||
|
|
||||||
|
|
||||||
hex asc "0123456789abcdef"
|
hex asc "0123456789abcdef"
|
||||||
|
|
||||||
|
|
||||||
|
|
92
vt100.csi.S
92
vt100.csi.S
|
@ -16,8 +16,9 @@
|
||||||
ext recalc_cursor,recalc_cursor_x,recalc_cursor_y
|
ext recalc_cursor,recalc_cursor_x,recalc_cursor_y
|
||||||
ext erase_line_0,erase_line_1,erase_line_2
|
ext erase_line_0,erase_line_1,erase_line_2
|
||||||
ext erase_screen_0,erase_screen_1,erase_screen_2
|
ext erase_screen_0,erase_screen_1,erase_screen_2
|
||||||
|
ext update_sgr
|
||||||
|
|
||||||
ext write_modem
|
ext write_modem,write_modem_str
|
||||||
|
|
||||||
|
|
||||||
vt100_csi ent
|
vt100_csi ent
|
||||||
|
@ -261,7 +262,7 @@ vt100_csi_2 ent
|
||||||
dw :rts ; u
|
dw :rts ; u
|
||||||
dw :rts ; v
|
dw :rts ; v
|
||||||
dw :rts ; w
|
dw :rts ; w
|
||||||
dw :rts ; x
|
dw csi_x ; x
|
||||||
dw csi_y ; y
|
dw csi_y ; y
|
||||||
|
|
||||||
:modifier
|
:modifier
|
||||||
|
@ -353,7 +354,7 @@ mode_common
|
||||||
dw :rts ; error
|
dw :rts ; error
|
||||||
dw mode_DECCKM
|
dw mode_DECCKM
|
||||||
dw mode_DECANM
|
dw mode_DECANM
|
||||||
dw :rts ; DECCOLM
|
dw mode_DECCOLM ; DECCOLM
|
||||||
dw :rts ; DECSCLM
|
dw :rts ; DECSCLM
|
||||||
dw mode_DECSCNM
|
dw mode_DECSCNM
|
||||||
dw mode_DECOM
|
dw mode_DECOM
|
||||||
|
@ -395,10 +396,33 @@ mode_DECANM
|
||||||
:rts rts
|
:rts rts
|
||||||
|
|
||||||
|
|
||||||
*mode_DECCOLM
|
mode_DECCOLM
|
||||||
* sty DECCOLM
|
* 80/132 mode.
|
||||||
* rts
|
* vt102 guide states:
|
||||||
|
* NOTE: When you change the number of columns per line, the screen is erased.
|
||||||
|
* This also sets the scrolling region for full screen (24 lines).
|
||||||
|
*
|
||||||
|
* based on testing, this always clears the screen and resets x/y, regardless of current mode.
|
||||||
|
*
|
||||||
|
|
||||||
|
bit pmod
|
||||||
|
bpl :rts
|
||||||
|
|
||||||
|
sty DECCOLM
|
||||||
|
|
||||||
|
lda #0
|
||||||
|
sta DECTM
|
||||||
|
lda #23
|
||||||
|
sta DECBM
|
||||||
|
stz x
|
||||||
|
stz y
|
||||||
|
|
||||||
|
phy
|
||||||
|
jsr recalc_cursor
|
||||||
|
jsr erase_screen_2
|
||||||
|
ply
|
||||||
|
|
||||||
|
:rts rts
|
||||||
|
|
||||||
mode_DECSCNM
|
mode_DECSCNM
|
||||||
bit pmod
|
bit pmod
|
||||||
|
@ -472,12 +496,8 @@ csi_m
|
||||||
cpx pcount
|
cpx pcount
|
||||||
blt :loop
|
blt :loop
|
||||||
|
|
||||||
* now update - bit 7 indicates inverse.
|
jmp update_sgr
|
||||||
lda SGR
|
|
||||||
and #$80
|
|
||||||
sta draw_inverse
|
|
||||||
|
|
||||||
:rts rts
|
|
||||||
|
|
||||||
|
|
||||||
:and db $00,$ff,$ff,$ff,$ff,$ff,$ff,$ff
|
:and db $00,$ff,$ff,$ff,$ff,$ff,$ff,$ff
|
||||||
|
@ -835,23 +855,45 @@ write_digit
|
||||||
:table db 0,10,20,30,40,50,60,70,80
|
:table db 0,10,20,30,40,50,60,70,80
|
||||||
|
|
||||||
csi_c ; what are you?
|
csi_c ; what are you?
|
||||||
lda #ESC
|
* DA - Device Attributes
|
||||||
jsr write_modem
|
|
||||||
lda #'['
|
mx %11
|
||||||
jsr write_modem
|
|
||||||
lda #'?'
|
php
|
||||||
jsr write_modem
|
rep #$10 ; long x/y
|
||||||
lda #'1'
|
ldy #:response
|
||||||
jsr write_modem
|
jsr write_modem_str
|
||||||
lda #'?'
|
plp
|
||||||
jsr write_modem
|
rts
|
||||||
lda #'0'
|
|
||||||
jsr write_modem
|
:response asc 1b,'[?1;0c',00 ; No options.
|
||||||
lda #'c'
|
|
||||||
jmp write_modem
|
|
||||||
|
|
||||||
csi_y ; invoke confidence test
|
csi_y ; invoke confidence test
|
||||||
* ???
|
* ???
|
||||||
rts
|
rts
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
csi_x ; request terminal parameters
|
||||||
|
* DECREQTPARM – Request Terminal Parameters
|
||||||
|
|
||||||
|
mx %11
|
||||||
|
|
||||||
|
lda parms
|
||||||
|
cmp #2
|
||||||
|
bcs :rts
|
||||||
|
inc
|
||||||
|
inc
|
||||||
|
ora #'0'
|
||||||
|
sta :response+2
|
||||||
|
|
||||||
|
php
|
||||||
|
rep #$10 ; long x/y
|
||||||
|
ldy #:response
|
||||||
|
jsr write_modem_str
|
||||||
|
plp
|
||||||
|
:rts rts
|
||||||
|
|
||||||
|
:response asc 1b,'[x;1;1;112;112;1;0x',00 ; no parity, 8-bits, 9600/9600, 16x multiplier, no stp flags.
|
||||||
|
|
||||||
sav vt100.csi.L
|
sav vt100.csi.L
|
||||||
|
|
|
@ -109,8 +109,11 @@ xoff
|
||||||
rts
|
rts
|
||||||
can
|
can
|
||||||
sub
|
sub
|
||||||
|
ext draw_char_raw
|
||||||
* cancel esc sequence and display error character
|
* cancel esc sequence and display error character
|
||||||
stz state
|
stz state
|
||||||
|
lda #$57 ; mouse text block
|
||||||
|
jmp draw_char_raw
|
||||||
rts
|
rts
|
||||||
|
|
||||||
esc
|
esc
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
ext recalc_cursor,recalc_cursor_x,recalc_cursor_y
|
ext recalc_cursor,recalc_cursor_x,recalc_cursor_y
|
||||||
ext scroll_up,scroll_down
|
ext scroll_up,scroll_down
|
||||||
ext reset
|
ext reset
|
||||||
|
ext update_sgr
|
||||||
|
|
||||||
vt100_esc ent
|
vt100_esc ent
|
||||||
* #[()=>cH78DEM
|
* #[()=>cH78DEM
|
||||||
|
@ -141,6 +142,8 @@ esc_7 ; save cursor position, graphic rendition, and character set.
|
||||||
sta saved_y
|
sta saved_y
|
||||||
lda DECOM
|
lda DECOM
|
||||||
sta saved_decom
|
sta saved_decom
|
||||||
|
lda SGR
|
||||||
|
sta saved_sgr
|
||||||
|
|
||||||
rts
|
rts
|
||||||
esc_8 ; restore cursor position, graphic rendition, and character set.
|
esc_8 ; restore cursor position, graphic rendition, and character set.
|
||||||
|
@ -151,7 +154,10 @@ esc_8 ; restore cursor position, graphic rendition, and character set.
|
||||||
sta y
|
sta y
|
||||||
lda saved_decom
|
lda saved_decom
|
||||||
sta DECOM
|
sta DECOM
|
||||||
|
lda saved_sgr
|
||||||
|
sta SGR
|
||||||
|
|
||||||
|
jsr update_sgr
|
||||||
jmp recalc_cursor
|
jmp recalc_cursor
|
||||||
|
|
||||||
esc_eq ; enter alternate keypad mode
|
esc_eq ; enter alternate keypad mode
|
||||||
|
|
183
vt100.key.S
183
vt100.key.S
|
@ -4,13 +4,16 @@
|
||||||
xc
|
xc
|
||||||
xc
|
xc
|
||||||
|
|
||||||
|
tbx on
|
||||||
|
|
||||||
use vt.equ
|
use vt.equ
|
||||||
use apple2gs.equ
|
use apple2gs.equ
|
||||||
use debug
|
use debug
|
||||||
|
|
||||||
mx %11
|
mx %11
|
||||||
|
|
||||||
ext dispatch
|
* ext dispatch
|
||||||
|
ext write_modem
|
||||||
|
|
||||||
|
|
||||||
kmShift equ %0000_0001
|
kmShift equ %0000_0001
|
||||||
|
@ -22,22 +25,58 @@ kmUpdateMod equ %0010_0000
|
||||||
kmOption equ %0100_0000
|
kmOption equ %0100_0000
|
||||||
kmCommand equ %1000_0000
|
kmCommand equ %1000_0000
|
||||||
|
|
||||||
|
|
||||||
|
*
|
||||||
|
* The vt100 has a delete key and a backspace key.
|
||||||
|
* delete sends 0x7f. backspace sends 0x08.
|
||||||
|
* stty is general set so 0x7f is the erase character.
|
||||||
|
* termcaps generally claim 0x08 is the backspace character.
|
||||||
|
*
|
||||||
|
* emacs, by default, thinks 0x08 ( ^H ) means you want help.
|
||||||
|
*
|
||||||
|
* so, backspace will send 0x7f. control-H or command-backspace
|
||||||
|
* will send 0x08.
|
||||||
|
|
||||||
|
*
|
||||||
|
* TODO - keys
|
||||||
|
* command-L -> local/online mode?
|
||||||
|
* command-Q -> quit
|
||||||
|
* command-K -> clear screen?
|
||||||
|
* command-R -> reset settings
|
||||||
|
*
|
||||||
|
|
||||||
|
|
||||||
|
dispatch
|
||||||
|
jmp write_modem
|
||||||
|
|
||||||
keypress ent
|
keypress ent
|
||||||
debug keypress
|
debug keypress
|
||||||
lda KBD
|
lda KBD
|
||||||
bmi :key
|
bmi :key
|
||||||
rts
|
:rts rts
|
||||||
:key
|
:key
|
||||||
and #$7f
|
and #$7f
|
||||||
sta key
|
sta key
|
||||||
lda KEYMOD
|
lda KEYMOD
|
||||||
sta mod
|
sta mod
|
||||||
sta KEYSTROBE
|
sta KEYSTROBE
|
||||||
|
|
||||||
|
* if DECARM is clear, skip repeat characters.
|
||||||
|
*
|
||||||
|
* a REAL vt100 will never auto-repeat ESC, TAB, RETURN, or if Control is also pressed.
|
||||||
|
*
|
||||||
|
bit DECARM
|
||||||
|
bpl :arm
|
||||||
|
bit #kmRepeat
|
||||||
|
bne :rts
|
||||||
|
:arm
|
||||||
|
|
||||||
|
|
||||||
bit #kmOption!kmCommand
|
bit #kmOption!kmCommand
|
||||||
bne :command
|
bne command
|
||||||
|
|
||||||
bit #kmKeypad
|
bit #kmKeypad
|
||||||
bne keypad
|
jne keypad
|
||||||
bit #kmControl
|
bit #kmControl
|
||||||
bne :ctrl
|
bne :ctrl
|
||||||
|
|
||||||
|
@ -55,22 +94,35 @@ keypress ent
|
||||||
|
|
||||||
:ctrl
|
:ctrl
|
||||||
lda key
|
lda key
|
||||||
|
and #$1f ; control-space should generate 0, not $20.
|
||||||
bra :send
|
bra :send
|
||||||
|
|
||||||
:notctrl
|
:notctrl
|
||||||
cmp #$7f ; delete - special case
|
* cmp #$7f ; delete - special case
|
||||||
bne :send
|
* bne :send
|
||||||
lda #$08
|
* lda #$08
|
||||||
:send jmp dispatch
|
:send jmp dispatch
|
||||||
|
|
||||||
:command ; or option
|
command ; or option
|
||||||
rts
|
|
||||||
|
|
||||||
|
* apple-return -> linefeed
|
||||||
keypad
|
* apple-backspace -> delete
|
||||||
* todo - keypad enters honors LNM?
|
|
||||||
|
|
||||||
lda key
|
lda key
|
||||||
|
cmp #$7f
|
||||||
|
beq :bs
|
||||||
|
cmp #$0d
|
||||||
|
beq :lf
|
||||||
|
|
||||||
|
cmp #'a'
|
||||||
|
bcc :0
|
||||||
|
cmp #'z'+1
|
||||||
|
bcs :0
|
||||||
|
|
||||||
|
and #$df ; ~ $20
|
||||||
|
|
||||||
|
:0
|
||||||
cmp #:MIN
|
cmp #:MIN
|
||||||
blt :rts
|
blt :rts
|
||||||
cmp #:MAX+1
|
cmp #:MAX+1
|
||||||
|
@ -83,6 +135,104 @@ keypad
|
||||||
|
|
||||||
:rts rts
|
:rts rts
|
||||||
|
|
||||||
|
|
||||||
|
:bs lda #$08
|
||||||
|
jmp dispatch ;
|
||||||
|
:lf lda #$0a
|
||||||
|
jmp dispatch
|
||||||
|
|
||||||
|
ext enable_modem,disable_modem
|
||||||
|
:local
|
||||||
|
bit LOCAL
|
||||||
|
bmi :online
|
||||||
|
lda #$80
|
||||||
|
sta LOCAL
|
||||||
|
jmp disable_modem
|
||||||
|
|
||||||
|
:online
|
||||||
|
stz LOCAL
|
||||||
|
jmp enable_modem
|
||||||
|
|
||||||
|
:quit
|
||||||
|
ext quit
|
||||||
|
jmp quit
|
||||||
|
rts
|
||||||
|
|
||||||
|
:reset
|
||||||
|
* TODO
|
||||||
|
rts
|
||||||
|
|
||||||
|
:clear
|
||||||
|
* TODO
|
||||||
|
rts
|
||||||
|
|
||||||
|
|
||||||
|
:MIN equ 49
|
||||||
|
:MAX equ 82
|
||||||
|
|
||||||
|
:table
|
||||||
|
dw pf1 ; 1
|
||||||
|
dw pf2 ; 2
|
||||||
|
dw pf3 ; 3
|
||||||
|
dw pf4 ; 4
|
||||||
|
dw :rts ; 5
|
||||||
|
dw :rts ; 6
|
||||||
|
dw :rts ; 7
|
||||||
|
dw :rts ; 8
|
||||||
|
dw :rts ; 9
|
||||||
|
dw :rts ; :
|
||||||
|
dw :rts ; ;
|
||||||
|
dw :rts ; <
|
||||||
|
dw :rts ; =
|
||||||
|
dw :rts ; >
|
||||||
|
dw :rts ; ?
|
||||||
|
dw :rts ; @
|
||||||
|
dw :rts ; A
|
||||||
|
dw :rts ; B
|
||||||
|
dw :rts ; C
|
||||||
|
dw :rts ; D
|
||||||
|
dw :rts ; E
|
||||||
|
dw :rts ; F
|
||||||
|
dw :rts ; G
|
||||||
|
dw :rts ; H
|
||||||
|
dw :rts ; I
|
||||||
|
dw :rts ; J
|
||||||
|
dw :clear ; K
|
||||||
|
dw :local ; L
|
||||||
|
dw :rts ; M
|
||||||
|
dw :rts ; N
|
||||||
|
dw :rts ; O
|
||||||
|
dw :rts ; P
|
||||||
|
dw :quit ; Q
|
||||||
|
dw :reset ; R
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
keypad
|
||||||
|
|
||||||
|
lda key
|
||||||
|
cmp #:MIN
|
||||||
|
blt :rts
|
||||||
|
cmp #:MAX+1
|
||||||
|
bcs :other
|
||||||
|
sec
|
||||||
|
sbc #:MIN
|
||||||
|
asl
|
||||||
|
tax
|
||||||
|
jmp (:table,x)
|
||||||
|
|
||||||
|
:other
|
||||||
|
|
||||||
|
* keypad delete key ($75 aka 'u') will send as backspace ($08)
|
||||||
|
*
|
||||||
|
cmp #'u'
|
||||||
|
bne :rts
|
||||||
|
lda #$08
|
||||||
|
jmp dispatch
|
||||||
|
|
||||||
|
|
||||||
|
:rts rts
|
||||||
|
|
||||||
:MIN equ 13
|
:MIN equ 13
|
||||||
:MAX equ 61
|
:MAX equ 61
|
||||||
:table
|
:table
|
||||||
|
@ -118,7 +268,7 @@ keypad
|
||||||
dw pf4 ; *
|
dw pf4 ; *
|
||||||
dw comma ; +
|
dw comma ; +
|
||||||
dw :rts ; ,
|
dw :rts ; ,
|
||||||
dw dash ; -
|
dw dash ; -
|
||||||
dw dot ; .
|
dw dot ; .
|
||||||
dw pf3 ; / PF3 -> ESC R
|
dw pf3 ; / PF3 -> ESC R
|
||||||
dw digit ; 0
|
dw digit ; 0
|
||||||
|
@ -131,9 +281,9 @@ keypad
|
||||||
dw digit ; 7
|
dw digit ; 7
|
||||||
dw digit ; 8
|
dw digit ; 8
|
||||||
dw digit ; 9
|
dw digit ; 9
|
||||||
dw $0 ; :
|
dw :rts ; :
|
||||||
dw $0 ; ;
|
dw :rts ; ;
|
||||||
dw $0 ; <
|
dw :rts ; <
|
||||||
dw pf2 ; = PF2 -> ESC Q
|
dw pf2 ; = PF2 -> ESC Q
|
||||||
|
|
||||||
|
|
||||||
|
@ -195,6 +345,7 @@ digit
|
||||||
lda #'?'
|
lda #'?'
|
||||||
jsr dispatch
|
jsr dispatch
|
||||||
lda key
|
lda key
|
||||||
|
ora #$40
|
||||||
jmp dispatch
|
jmp dispatch
|
||||||
|
|
||||||
|
|
||||||
|
|
166
vt100.main.S
166
vt100.main.S
|
@ -4,6 +4,8 @@
|
||||||
xc
|
xc
|
||||||
xc
|
xc
|
||||||
|
|
||||||
|
tbx on ; qasm
|
||||||
|
|
||||||
mx %11
|
mx %11
|
||||||
use vt.equ
|
use vt.equ
|
||||||
use apple2gs.equ
|
use apple2gs.equ
|
||||||
|
@ -11,13 +13,14 @@
|
||||||
|
|
||||||
ext scroll_down
|
ext scroll_down
|
||||||
ext recalc_cursor,recalc_cursor_x,recalc_cursor_y
|
ext recalc_cursor,recalc_cursor_x,recalc_cursor_y
|
||||||
ext write_modem,read_modem,init_modem,modem_vector,reset_modem_buffer
|
ext modem_io,modem_vector,reset_modem_buffer
|
||||||
|
ext modem_startup,modem_shutdown
|
||||||
ext keypress
|
ext keypress
|
||||||
ext disable_cursor,enable_cursor,cursor_vector
|
ext disable_cursor,enable_cursor,cursor_vector
|
||||||
ext erase_screen,fill_screen
|
ext erase_screen,fill_screen
|
||||||
ext init_tabs
|
ext init_tabs
|
||||||
ext init_audio
|
ext init_audio
|
||||||
ext init_cda
|
ext cda_startup,cda_shutdown
|
||||||
|
|
||||||
main debug main
|
main debug main
|
||||||
|
|
||||||
|
@ -37,18 +40,17 @@ main debug main
|
||||||
stz SCANINT ; reset 1-sec interrupt
|
stz SCANINT ; reset 1-sec interrupt
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
loop
|
loop
|
||||||
bit LOCAL
|
jsr keypress ; check for a keypress, write data to out buffer.
|
||||||
bmi :kb
|
jsr modem_io ;
|
||||||
jsr read_modem
|
bcc :nope
|
||||||
bcc :kb
|
|
||||||
pha
|
pha
|
||||||
jsr disable_cursor
|
jsr disable_cursor
|
||||||
pla
|
pla
|
||||||
jsr vt100
|
jsr vt100
|
||||||
:kb
|
bra loop
|
||||||
jsr keypress
|
|
||||||
|
:nope ; no modem data, re-enable the cursor.
|
||||||
jsr enable_cursor
|
jsr enable_cursor
|
||||||
bra loop
|
bra loop
|
||||||
|
|
||||||
|
@ -63,6 +65,9 @@ init
|
||||||
sta SETALTCHAR
|
sta SETALTCHAR
|
||||||
rep #$30
|
rep #$30
|
||||||
|
|
||||||
|
jsr init_mem
|
||||||
|
|
||||||
|
|
||||||
ldx #254
|
ldx #254
|
||||||
:zloop stz 0,x
|
:zloop stz 0,x
|
||||||
dex
|
dex
|
||||||
|
@ -107,19 +112,78 @@ init
|
||||||
sta DECBM
|
sta DECBM
|
||||||
lda #$80
|
lda #$80
|
||||||
* sta LOCAL
|
* sta LOCAL
|
||||||
sta DECANM
|
sta DECANM ; ANSI (vt100) on
|
||||||
|
sta DECARM ; key repeat on
|
||||||
|
|
||||||
* lda #st_vt52
|
* lda #st_vt52
|
||||||
lda #st_vt100
|
lda #st_vt100
|
||||||
sta state
|
sta state
|
||||||
|
|
||||||
* jsr erase_screen
|
* jsr erase_screen
|
||||||
jsr init_modem
|
jsr modem_startup
|
||||||
jsr init_tabs
|
jsr init_tabs
|
||||||
jsr init_audio
|
jsr init_audio
|
||||||
jsr init_cda
|
jsr cda_startup
|
||||||
rts
|
rts
|
||||||
|
|
||||||
|
|
||||||
|
MasterID dw 0
|
||||||
|
init_mem
|
||||||
|
*
|
||||||
|
* see prodos technote #27
|
||||||
|
*
|
||||||
|
* _InstallCDA uses the memory manager ; otherwise I wouldn't bother
|
||||||
|
* This is here to prevent MM from stomping on our memory.
|
||||||
|
*
|
||||||
|
|
||||||
|
mx %00
|
||||||
|
|
||||||
|
stz MasterID
|
||||||
|
_TLStartUp
|
||||||
|
pha
|
||||||
|
_MMStartUp
|
||||||
|
pla
|
||||||
|
bcs :p8
|
||||||
|
rts
|
||||||
|
:p8
|
||||||
|
_MTStartUp
|
||||||
|
pea #0
|
||||||
|
pea #$1000
|
||||||
|
_GetNewID
|
||||||
|
pla
|
||||||
|
sta MasterID
|
||||||
|
|
||||||
|
* bank 0
|
||||||
|
pha
|
||||||
|
pha
|
||||||
|
pea #$0000
|
||||||
|
pea #$b800
|
||||||
|
lda MasterID
|
||||||
|
pha
|
||||||
|
pea #$c013
|
||||||
|
pea #0000
|
||||||
|
pea #0800
|
||||||
|
_NewHandle
|
||||||
|
pla
|
||||||
|
pla
|
||||||
|
|
||||||
|
* bank 1
|
||||||
|
pha
|
||||||
|
pha
|
||||||
|
pea #$0000
|
||||||
|
pea #$b800
|
||||||
|
lda MasterID
|
||||||
|
pha
|
||||||
|
pea #$c013
|
||||||
|
pea #$0001
|
||||||
|
pea #$0800
|
||||||
|
_NewHandle
|
||||||
|
pla
|
||||||
|
pla
|
||||||
|
|
||||||
|
rts
|
||||||
|
|
||||||
|
|
||||||
reset ent
|
reset ent
|
||||||
mx %11
|
mx %11
|
||||||
php
|
php
|
||||||
|
@ -165,7 +229,8 @@ reset ent
|
||||||
lda #23
|
lda #23
|
||||||
sta DECBM
|
sta DECBM
|
||||||
lda #$80
|
lda #$80
|
||||||
sta DECANM
|
sta DECANM ; ansi mode
|
||||||
|
sta DECARM ; key repeat on
|
||||||
|
|
||||||
lda #st_vt100
|
lda #st_vt100
|
||||||
sta state
|
sta state
|
||||||
|
@ -183,16 +248,60 @@ reset ent
|
||||||
rts
|
rts
|
||||||
|
|
||||||
|
|
||||||
dispatch ent
|
quit ent
|
||||||
mx %11
|
|
||||||
* a = character to xmit
|
* need to disable modem interrupts
|
||||||
bit LOCAL
|
|
||||||
bmi :local
|
|
||||||
jmp write_modem
|
sep #$30
|
||||||
:local
|
lda #4
|
||||||
|
trb VGCINT ; disable 1-sec interrupt.
|
||||||
|
stz SCANINT ; reset 1-sec interrupt
|
||||||
|
|
||||||
|
jsr modem_shutdown
|
||||||
|
|
||||||
|
rep #$30
|
||||||
|
|
||||||
|
jsr cda_shutdown
|
||||||
|
|
||||||
|
lda MasterID
|
||||||
|
beq :e
|
||||||
|
|
||||||
pha
|
pha
|
||||||
jsr disable_cursor
|
pha
|
||||||
pla
|
_DisposeAll
|
||||||
|
_DeleteID
|
||||||
|
|
||||||
|
:e
|
||||||
|
pea #0
|
||||||
|
pld
|
||||||
|
|
||||||
|
sec
|
||||||
|
xce
|
||||||
|
mx %00
|
||||||
|
inc $3f4 ; invalidate power-up bit
|
||||||
|
jsr $bf00
|
||||||
|
db $65
|
||||||
|
dw :parms
|
||||||
|
brk $ea
|
||||||
|
|
||||||
|
:parms db 4
|
||||||
|
db 0
|
||||||
|
dw 0
|
||||||
|
db 0
|
||||||
|
dw 0
|
||||||
|
|
||||||
|
|
||||||
|
*dispatch ent
|
||||||
|
* mx %11
|
||||||
|
** a = character to xmit
|
||||||
|
* bit LOCAL
|
||||||
|
* bmi :local
|
||||||
|
* jmp write_modem
|
||||||
|
*:local
|
||||||
|
* pha
|
||||||
|
* jsr disable_cursor
|
||||||
|
* pla
|
||||||
|
|
||||||
* fall through
|
* fall through
|
||||||
|
|
||||||
|
@ -215,7 +324,7 @@ vt100
|
||||||
ext vt100_esc,vt100_csi,vt100_csi_2
|
ext vt100_esc,vt100_csi,vt100_csi_2
|
||||||
ext vt100_esc_pound,vt100_esc_lparen,vt100_esc_rparen
|
ext vt100_esc_pound,vt100_esc_lparen,vt100_esc_rparen
|
||||||
ext vt100_esc_bad,vt100_csi_bad
|
ext vt100_esc_bad,vt100_csi_bad
|
||||||
ext draw_char
|
ext draw_char,draw_char_raw
|
||||||
|
|
||||||
dw draw_char
|
dw draw_char
|
||||||
dw vt52_esc
|
dw vt52_esc
|
||||||
|
@ -291,7 +400,16 @@ ctrl_18
|
||||||
ctrl_1a
|
ctrl_1a
|
||||||
* vt100 - abort current escape sequence
|
* vt100 - abort current escape sequence
|
||||||
* and display error character.
|
* and display error character.
|
||||||
* TODO - display error character (mouse text)
|
*
|
||||||
|
* based on testing, this applies to vt52 and vt100;
|
||||||
|
* cancel character is drawn regardless of current state.
|
||||||
|
|
||||||
|
lda x
|
||||||
|
and #$1
|
||||||
|
ora #$56 ; $56 or $57
|
||||||
|
* lda #$57
|
||||||
|
jsr draw_char_raw
|
||||||
|
|
||||||
bit DECANM
|
bit DECANM
|
||||||
bpl :vt52
|
bpl :vt52
|
||||||
lda #st_vt100
|
lda #st_vt100
|
||||||
|
|
217
vt100.modem.S
217
vt100.modem.S
|
@ -6,7 +6,8 @@
|
||||||
|
|
||||||
mx %11
|
mx %11
|
||||||
cas se
|
cas se
|
||||||
* use vt.equ
|
use vt.equ
|
||||||
|
use debug
|
||||||
|
|
||||||
SCCBREG equ $c038
|
SCCBREG equ $c038
|
||||||
SCCAREG equ $c039
|
SCCAREG equ $c039
|
||||||
|
@ -29,19 +30,22 @@ SerFlag equ $e10104 ;
|
||||||
*
|
*
|
||||||
* see IIgs TN #18 - Do-It-Yourself SCC Access
|
* see IIgs TN #18 - Do-It-Yourself SCC Access
|
||||||
|
|
||||||
init_modem ent
|
modem_startup ent
|
||||||
|
enable_modem ent
|
||||||
* sep #$30
|
* sep #$30
|
||||||
|
|
||||||
php
|
php
|
||||||
sei
|
sei
|
||||||
|
|
||||||
stz q_head
|
stz read_q_head
|
||||||
stz q_tail
|
stz read_q_tail
|
||||||
|
stz write_q_head
|
||||||
|
stz write_q_tail
|
||||||
|
|
||||||
|
|
||||||
* zero out the buffer [for CDA debugger]
|
* zero out the buffer [for CDA debugger]
|
||||||
ldx #0
|
ldx #0
|
||||||
]loop stz buffer,x
|
]loop stz read_buffer,x
|
||||||
inx
|
inx
|
||||||
bne ]loop
|
bne ]loop
|
||||||
|
|
||||||
|
@ -86,7 +90,50 @@ init_modem ent
|
||||||
db 9,%00_0_0_1_0_1_0 ; master interrupts enabled.
|
db 9,%00_0_0_1_0_1_0 ; master interrupts enabled.
|
||||||
db -1,-1
|
db -1,-1
|
||||||
|
|
||||||
write_modem ent
|
|
||||||
|
disable_modem ent
|
||||||
|
* local mode
|
||||||
|
mx %11
|
||||||
|
php
|
||||||
|
sei
|
||||||
|
|
||||||
|
lda SCCBREG ; sync access
|
||||||
|
lda #9
|
||||||
|
sta SCCBREG
|
||||||
|
lda #%01_0_1_0_0_0_1 ; reset channel B.
|
||||||
|
sta SCCBREG
|
||||||
|
|
||||||
|
stz read_q_head
|
||||||
|
stz read_q_tail
|
||||||
|
stz write_q_head
|
||||||
|
stz write_q_tail
|
||||||
|
|
||||||
|
plp
|
||||||
|
rts
|
||||||
|
|
||||||
|
|
||||||
|
modem_shutdown ent
|
||||||
|
|
||||||
|
mx %11
|
||||||
|
php
|
||||||
|
sei
|
||||||
|
|
||||||
|
lda SCCBREG ; sync access
|
||||||
|
lda #9
|
||||||
|
sta SCCBREG
|
||||||
|
lda #%01_0_1_0_0_0_1 ; reset channel B.
|
||||||
|
sta SCCBREG
|
||||||
|
|
||||||
|
|
||||||
|
lda >SerFlag
|
||||||
|
and #%11_111_000 ; channel B interrupts.
|
||||||
|
sta >SerFlag
|
||||||
|
|
||||||
|
plp
|
||||||
|
rts
|
||||||
|
|
||||||
|
|
||||||
|
write_modem_sync ent
|
||||||
mx %11
|
mx %11
|
||||||
* a: byte to send
|
* a: byte to send
|
||||||
tay ; save
|
tay ; save
|
||||||
|
@ -108,6 +155,7 @@ write_modem ent
|
||||||
plp
|
plp
|
||||||
rts
|
rts
|
||||||
|
|
||||||
|
|
||||||
read_modem_sync ent
|
read_modem_sync ent
|
||||||
* c set if data read
|
* c set if data read
|
||||||
* v set if overrun
|
* v set if overrun
|
||||||
|
@ -144,7 +192,8 @@ read_modem_sync ent
|
||||||
:rts rts
|
:rts rts
|
||||||
|
|
||||||
|
|
||||||
buffer equ $1e00
|
write_buffer equ $1d00
|
||||||
|
read_buffer equ $1e00
|
||||||
|
|
||||||
modem_vector ent
|
modem_vector ent
|
||||||
jml modem_int
|
jml modem_int
|
||||||
|
@ -158,12 +207,18 @@ modem_int
|
||||||
* doesn't access direct page.
|
* doesn't access direct page.
|
||||||
|
|
||||||
* check/clear overrun?
|
* check/clear overrun?
|
||||||
|
|
||||||
|
*
|
||||||
|
* n.b. - vt100 would drop $00 and $7f characters here - I drop them later.
|
||||||
|
*
|
||||||
|
|
||||||
mx %11
|
mx %11
|
||||||
|
|
||||||
phb
|
phb
|
||||||
phk
|
phk
|
||||||
plb
|
plb
|
||||||
|
|
||||||
|
lda SCCBREG ; sync
|
||||||
stz SCCBREG
|
stz SCCBREG
|
||||||
lda SCCBREG
|
lda SCCBREG
|
||||||
and #%0000_0001 ; rx ready.
|
and #%0000_0001 ; rx ready.
|
||||||
|
@ -171,9 +226,9 @@ modem_int
|
||||||
|
|
||||||
:read
|
:read
|
||||||
lda SCCBDATA
|
lda SCCBDATA
|
||||||
ldx q_tail
|
ldx DPAGE+read_q_head
|
||||||
sta buffer,x
|
sta read_buffer,x
|
||||||
inc q_tail
|
inc DPAGE+read_q_head
|
||||||
|
|
||||||
* more?
|
* more?
|
||||||
stz SCCBREG
|
stz SCCBREG
|
||||||
|
@ -200,6 +255,130 @@ modem_int
|
||||||
plb
|
plb
|
||||||
rtl
|
rtl
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
modem_io ent
|
||||||
|
debug modem_io
|
||||||
|
|
||||||
|
mx %11
|
||||||
|
php
|
||||||
|
sei
|
||||||
|
bit LOCAL
|
||||||
|
bmi :local
|
||||||
|
|
||||||
|
:write
|
||||||
|
* send any outbound data...
|
||||||
|
|
||||||
|
:mask = %0010_0100 ; tx buffer empty, clear to send
|
||||||
|
ldx write_q_tail
|
||||||
|
cpx write_q_head
|
||||||
|
beq :read
|
||||||
|
|
||||||
|
lda SCCBREG ; sync
|
||||||
|
stz SCCBREG
|
||||||
|
lda SCCBREG
|
||||||
|
and #:mask
|
||||||
|
cmp #:mask
|
||||||
|
bne :read
|
||||||
|
|
||||||
|
* ldx write_q_tail
|
||||||
|
lda write_buffer,x
|
||||||
|
sta SCCBDATA
|
||||||
|
inc write_q_tail
|
||||||
|
:read
|
||||||
|
ldx read_q_tail
|
||||||
|
cpx read_q_head
|
||||||
|
beq :nope
|
||||||
|
lda read_buffer,x
|
||||||
|
inc read_q_tail
|
||||||
|
|
||||||
|
* $00 and $7f dropped here.
|
||||||
|
and #$7f
|
||||||
|
beq :read
|
||||||
|
cmp #$7f
|
||||||
|
beq :read
|
||||||
|
|
||||||
|
plp
|
||||||
|
sec
|
||||||
|
rts
|
||||||
|
|
||||||
|
:nope
|
||||||
|
plp
|
||||||
|
clc
|
||||||
|
rts
|
||||||
|
|
||||||
|
|
||||||
|
:local
|
||||||
|
ldx write_q_tail
|
||||||
|
cpx write_q_head
|
||||||
|
beq :nope
|
||||||
|
lda write_buffer,x
|
||||||
|
inc write_q_tail
|
||||||
|
plp
|
||||||
|
sec
|
||||||
|
rts
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
write_modem ent
|
||||||
|
write_modem_async ent
|
||||||
|
|
||||||
|
mx %11
|
||||||
|
php
|
||||||
|
sei
|
||||||
|
|
||||||
|
* bit LOCAL
|
||||||
|
* bmi :local
|
||||||
|
|
||||||
|
ldx write_q_head
|
||||||
|
sta write_buffer,x
|
||||||
|
inc write_q_head
|
||||||
|
plp
|
||||||
|
rts
|
||||||
|
*:local
|
||||||
|
* ldx read_q_head
|
||||||
|
* sta read_buffer,x
|
||||||
|
* inc read_q_head
|
||||||
|
* plp
|
||||||
|
* rts
|
||||||
|
|
||||||
|
|
||||||
|
write_modem_str ent
|
||||||
|
|
||||||
|
; y = address of string (0-terminated)
|
||||||
|
; inc write_q_head vs inx
|
||||||
|
; because it wraps at $ff
|
||||||
|
|
||||||
|
mx %10
|
||||||
|
php
|
||||||
|
sei
|
||||||
|
* bit LOCAL
|
||||||
|
* bmi :local
|
||||||
|
|
||||||
|
:loop lda |$0000,y
|
||||||
|
beq :fini
|
||||||
|
ldx write_q_head
|
||||||
|
sta write_buffer,x
|
||||||
|
inc write_q_head
|
||||||
|
iny
|
||||||
|
bra :loop
|
||||||
|
|
||||||
|
*:local lda |$0000,y
|
||||||
|
* beq :fini
|
||||||
|
* ldx read_q_head
|
||||||
|
* sta read_buffer,x
|
||||||
|
* inc read_q_head
|
||||||
|
* iny
|
||||||
|
* bra :local
|
||||||
|
|
||||||
|
|
||||||
|
:fini
|
||||||
|
plp
|
||||||
|
rts
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
read_modem ent
|
read_modem ent
|
||||||
read_modem_async ent
|
read_modem_async ent
|
||||||
|
|
||||||
|
@ -207,12 +386,12 @@ read_modem_async ent
|
||||||
|
|
||||||
php
|
php
|
||||||
sei
|
sei
|
||||||
ldx q_head
|
ldx read_q_tail
|
||||||
cpx q_tail
|
cpx read_q_head
|
||||||
beq :nope
|
beq :nope
|
||||||
|
|
||||||
lda buffer,x
|
lda read_buffer,x
|
||||||
inc q_head
|
inc read_q_tail
|
||||||
plp
|
plp
|
||||||
sec
|
sec
|
||||||
rts
|
rts
|
||||||
|
@ -226,13 +405,15 @@ reset_modem_buffer ent
|
||||||
mx %11
|
mx %11
|
||||||
php
|
php
|
||||||
sei
|
sei
|
||||||
stz q_head
|
|
||||||
stz q_tail
|
stz read_q_head
|
||||||
|
stz read_q_tail
|
||||||
|
stz write_q_head
|
||||||
|
stz write_q_tail
|
||||||
|
|
||||||
plp
|
plp
|
||||||
rts
|
rts
|
||||||
|
|
||||||
q_head ds 2
|
|
||||||
q_tail ds 2
|
|
||||||
*buffer ds 256
|
*buffer ds 256
|
||||||
|
|
||||||
sav vt100.modem.L
|
sav vt100.modem.L
|
||||||
|
|
|
@ -21,6 +21,17 @@
|
||||||
* cursor_state - $80 = disabled, $40 = on
|
* cursor_state - $80 = disabled, $40 = on
|
||||||
|
|
||||||
|
|
||||||
|
update_sgr ent
|
||||||
|
|
||||||
|
stz draw_inverse
|
||||||
|
lda SGR
|
||||||
|
beq :rts
|
||||||
|
lda #$80
|
||||||
|
sta draw_inverse
|
||||||
|
|
||||||
|
:rts rts
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
text
|
text
|
||||||
dw $0400
|
dw $0400
|
||||||
|
@ -236,16 +247,20 @@ draw_char ent
|
||||||
bpl :normal
|
bpl :normal
|
||||||
; invert it.
|
; invert it.
|
||||||
cmp #$60 ; `, first lowercase
|
cmp #$60 ; `, first lowercase
|
||||||
bge :draw ; nothing to do for lowercase
|
bge draw_char_raw ; nothing to do for lowercase
|
||||||
cmp #$40 ; @, first uppercase
|
cmp #$40 ; @, first uppercase
|
||||||
bcc :draw ; nothing to do for special
|
bcc draw_char_raw ; nothing to do for special
|
||||||
|
|
||||||
:uc and #%10111111 ; ~ $40
|
:uc and #%10111111 ; ~ $40
|
||||||
bra :draw
|
bra draw_char_raw
|
||||||
|
|
||||||
|
|
||||||
:normal ora #$80
|
:normal ora #$80
|
||||||
:draw
|
|
||||||
|
draw_char_raw ent
|
||||||
|
* entry point for writing character to screen w/o processing it
|
||||||
|
|
||||||
|
|
||||||
* sta cursor_saved_char
|
* sta cursor_saved_char
|
||||||
|
|
||||||
* with DECAWM, x = 79, will CR LF (with scroll) before drawing character.
|
* with DECAWM, x = 79, will CR LF (with scroll) before drawing character.
|
||||||
|
@ -280,8 +295,6 @@ draw_char ent
|
||||||
rts
|
rts
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
:wrap
|
:wrap
|
||||||
stz x
|
stz x
|
||||||
ldy y
|
ldy y
|
||||||
|
@ -295,7 +308,7 @@ draw_char ent
|
||||||
jsr recalc_cursor
|
jsr recalc_cursor
|
||||||
pla
|
pla
|
||||||
sta [cursor_base] ; offset 0
|
sta [cursor_base] ; offset 0
|
||||||
rts
|
jmp advance_x
|
||||||
|
|
||||||
:scroll
|
:scroll
|
||||||
pha ; save
|
pha ; save
|
||||||
|
@ -304,7 +317,7 @@ draw_char ent
|
||||||
jsr recalc_cursor_x
|
jsr recalc_cursor_x
|
||||||
pla
|
pla
|
||||||
sta [cursor_base] ; offset 0
|
sta [cursor_base] ; offset 0
|
||||||
rts
|
jmp advance_x
|
||||||
|
|
||||||
|
|
||||||
* erase screen commands are not affected by origin or scrolling region.
|
* erase screen commands are not affected by origin or scrolling region.
|
||||||
|
|
Loading…
Reference in New Issue
Block a user