mirror of
https://github.com/bobbimanners/emailler.git
synced 2024-11-11 23:04:56 +00:00
902e4e5e6e
git-svn-id: http://svn.code.sf.net/p/netboot65/code@236 93682198-c243-4bdb-bd91-e943c89aac3b
2125 lines
47 KiB
ArmAsm
2125 lines
47 KiB
ArmAsm
; vt100 emulation for C64
|
|
; vt100 emulation for C64
|
|
; originally from CaTer - Copyright Lars Stollenwerk 2003
|
|
; CaTer homepage is http://formica.nusseis.de/Cater/
|
|
; converted for use with ip65 by Jonno Downes, 2009.
|
|
; this version is for C64 only
|
|
; CaTer originally licensed under GPL
|
|
; Lars Stollenwerk has agreed to relicense the code in this file under MPL (Oct 2009)
|
|
;
|
|
; to use:
|
|
; 1) call vt100_init_terminal
|
|
; 2) for every 'inbound' data (received from remote host), call "vt100_process_inbound_char" - this will update the screen
|
|
; 3) pass every keypress into vt100_transform_outbound_char. on return from this call,
|
|
; Y = 0 means don't send anything as a result of this keypress
|
|
; Y = 1 means A contains single character to send to remote host
|
|
; Y = 2 means AX points at null terminated string to send to remote host (e.g. an ANSI escape sequence)
|
|
|
|
|
|
|
|
.include "../inc/common.i"
|
|
|
|
.export vt100_init_terminal
|
|
.export vt100_process_inbound_char
|
|
.export vt100_transform_outbound_char
|
|
|
|
.import beep
|
|
|
|
; --- colour values ---
|
|
col_black = $00
|
|
col_white = $01
|
|
col_red = $02
|
|
col_cyan = $03
|
|
col_purple = $04
|
|
col_green = $05
|
|
col_blue = $06
|
|
col_yellow = $07
|
|
col_orange = $08
|
|
col_brown = $09
|
|
col_light_red = $0a
|
|
col_gray_1 = $0b
|
|
col_gray_2 = $0c
|
|
col_light_green = $0d
|
|
col_light_blue = $0e
|
|
col_gray_3 = $0f
|
|
|
|
; --- colours ---
|
|
; vanilla f bold 1
|
|
; underline e 3
|
|
; blink 5 d
|
|
; blink uline a 7
|
|
charmode_vanilla = $0f
|
|
charmode_bold = $01
|
|
charmode_underline = $0e
|
|
charmode_underline_bold = $03
|
|
charmode_blink = $05
|
|
charmode_blink_bold = $0d
|
|
charmode_blink_underline = $0a
|
|
charmode_blink_underline_bold = $07
|
|
|
|
; text background
|
|
text_background_colour = col_black
|
|
|
|
|
|
.segment "APP_SCRATCH"
|
|
escape_buffer: .res $100
|
|
|
|
|
|
.zeropage
|
|
|
|
; --- esc mode ---
|
|
; $00 = normal
|
|
; $0f = esc mode
|
|
; $ff = esc [ mode
|
|
; $f0 = ignore one char
|
|
escape_mode: .res 1
|
|
|
|
; --- Vector ---
|
|
; four vectors in zeropage
|
|
; for temporary use
|
|
temp_ptr_z: .res 2
|
|
temp_ptr_y: .res 2
|
|
temp_ptr_x: .res 2
|
|
temp_ptr_w: .res 2
|
|
|
|
escape_buffer_length: .res 1 ; points to first free position
|
|
escape_parameter: .res 1 ; numeric parameter in esc sequence
|
|
scroll_region_start: .res 1
|
|
scroll_region_end: .res 1
|
|
|
|
|
|
; font_mode contains three bits
|
|
; bit 0 = bold
|
|
; bit 1 = underline
|
|
; bit 2 = blink
|
|
; bit 7 = direct ANSI ESC colour
|
|
font_mode: .res 1
|
|
|
|
direct_colour: .res 1
|
|
|
|
; --- crsr save area ---
|
|
; here is crsr info saved with
|
|
; ESC 7 and restored from with
|
|
; ESC 8
|
|
|
|
saved_font_mode: .res 1
|
|
saved_reverse_mode: .res 1
|
|
saved_row: .res 1
|
|
saved_column: .res 1
|
|
|
|
print_ptr: .res 2 ;temp vector for printing to screen
|
|
|
|
|
|
|
|
|
|
|
|
; -------------------------------------
|
|
; memory map
|
|
;
|
|
; -------------------------------------
|
|
|
|
; --- screen ---
|
|
; $0400 - $07ff
|
|
Screen = $0400
|
|
|
|
; --- escape buffer ---
|
|
; $0800 - $0bff
|
|
|
|
; --- char ---
|
|
; $2000 - $27ff
|
|
font_table = $2000
|
|
|
|
; -------------------------------------
|
|
; constant declaration
|
|
;
|
|
; -------------------------------------
|
|
|
|
esc = $1b
|
|
brace = $5b
|
|
|
|
.code
|
|
|
|
;intialize VT100 emulation state
|
|
;inputs: none
|
|
;outputs: none
|
|
vt100_init_terminal:
|
|
|
|
jsr initialise_variables ; init memory variables
|
|
jsr initialise_font; init font
|
|
jsr initialise_screen ; init screen
|
|
rts
|
|
|
|
;process incoming character
|
|
;inputs:
|
|
; A is inbound character
|
|
;outputs:
|
|
; none, but screen and/or terminal state is updated.
|
|
|
|
vt100_process_inbound_char:
|
|
tay
|
|
lda escape_mode ; handle esc mode
|
|
beq :+ ; to far for branch to escape
|
|
jmp handle_escape_char
|
|
:
|
|
lda ascii_to_petscii,y ; ASCII to PETSCII
|
|
beq @done ; ignore non-printing chars
|
|
cmp #$01 ; something special?
|
|
beq handle_special_char
|
|
jsr print_to_screen ; print to screen
|
|
@done:
|
|
rts
|
|
|
|
|
|
|
|
do_cr:
|
|
ldx $d6 ; get row
|
|
ldy #$00 ; set col=0
|
|
jsr cursor_plot ; set crsr
|
|
rts
|
|
|
|
do_line_feed:
|
|
ldx $d6 ; crsr line
|
|
cpx scroll_region_end ; end scroll region?
|
|
bne down_one_line ; no -> go on
|
|
jsr cursor_off
|
|
jsr scroll_up_scrollregion ; yes -> scroll up
|
|
jsr cursor_on
|
|
rts
|
|
|
|
handle_special_char:
|
|
tya ; restore original char
|
|
cmp #$0d ; CR?
|
|
beq do_cr
|
|
|
|
cmp #$08 ; BS?
|
|
bne @not_bs
|
|
ldy $d3 ; get col
|
|
beq @bs_done ; stop at left margin
|
|
dey ; dec column
|
|
ldx $d6 ; get row
|
|
jsr cursor_plot ; set crsr
|
|
@bs_done:
|
|
rts
|
|
@not_bs:
|
|
cmp #$1b ; esc?
|
|
bne @not_escape
|
|
lda #$0f ; set esc mode
|
|
sta escape_mode
|
|
rts
|
|
@not_escape:
|
|
cmp #$07 ; BEL?
|
|
bne @not_bell
|
|
jsr beep
|
|
rts
|
|
@not_bell:
|
|
cmp #$0a ; LF?
|
|
beq do_line_feed
|
|
|
|
@not_lf:
|
|
cmp #$09 ; TAB?
|
|
bne @not_tab
|
|
lda $d3 ; crsr col
|
|
and #$f8 ; (col DIV 8) * 8
|
|
clc ; col + 8
|
|
adc #$08
|
|
cmp #$28 ; col=40?
|
|
bne @not_last_col ; no -> skip
|
|
lda #$27 ; yes -> col=39
|
|
@not_last_col:
|
|
tay ; col to y
|
|
ldx $d6 ; line to x
|
|
jsr cursor_plot ; set crsr
|
|
rts
|
|
|
|
@not_tab:
|
|
rts
|
|
|
|
down_one_line:
|
|
cpx #$18 ; end of screen?
|
|
bne @not_end_of_screen ; no -> go on
|
|
rts ; yes -> do nothing
|
|
@not_end_of_screen:
|
|
inx ; next line
|
|
ldy $d3 ; get col
|
|
jsr cursor_plot ; set crsr
|
|
rts
|
|
|
|
|
|
; esc mode
|
|
; data in Y
|
|
; escape_mode <> $00 in A
|
|
handle_escape_char:
|
|
tax ; save escape_mode
|
|
and #$0f ; escape_mode = $0f?
|
|
bne @not_discard_mode
|
|
|
|
; --- discard mode --- escape_mode = $f0
|
|
;discard char
|
|
lda #$00 ; reset escape_mode
|
|
sta escape_mode
|
|
rts
|
|
|
|
@not_discard_mode:
|
|
txa ; restore escape_mode
|
|
and #$f0 ; escape_mode = $ff?
|
|
beq @short_escape_mode ; no -> short Emode
|
|
jmp long_escape_mode ; yes -> long Emode
|
|
|
|
; short esc mode
|
|
; escape_mode = $0f
|
|
; process first char
|
|
@short_escape_mode:
|
|
tya ; restore char
|
|
; --- [ ---
|
|
cmp #brace ; [ ?
|
|
bne @not_brace
|
|
lda #$ff ; set esc [ mode
|
|
sta escape_mode
|
|
rts
|
|
; --- ( ---
|
|
@not_brace:
|
|
cmp #$28 ; ( ?
|
|
bne :+
|
|
jmp set_discard_mode
|
|
; --- ) ---
|
|
:
|
|
cmp #$29 ; ) ?
|
|
bne :+
|
|
jmp set_discard_mode
|
|
; --- # ---
|
|
:
|
|
cmp #$23 ; # ?
|
|
bne :+
|
|
jmp set_discard_mode
|
|
; --- D --- index
|
|
:
|
|
cmp #$44 ; D ?
|
|
bne :+
|
|
jsr do_line_feed ; same as LF
|
|
jmp done_escape
|
|
; --- M --- reverse index
|
|
:
|
|
cmp #$4d ; M ?
|
|
bne @not_M
|
|
ldx $d6 ; get crsr row
|
|
cpx scroll_region_start ; top of scroll reg?
|
|
bne :+
|
|
jsr cursor_off ; yes -> scroll down
|
|
jsr scroll_down_scrollregion
|
|
jsr cursor_on
|
|
jmp done_escape
|
|
:
|
|
cpx #$00 ; top of screen?
|
|
bne :+
|
|
jmp done_escape ; yes -> do nothing
|
|
:
|
|
dex ; one line up
|
|
ldy $d3 ; get crsr col
|
|
jsr cursor_plot ; set crsr
|
|
jmp done_escape
|
|
|
|
@not_M:
|
|
; --- E --- next line
|
|
cmp #$45 ; E ?
|
|
bne :+
|
|
jsr do_cr
|
|
jsr do_line_feed
|
|
jmp done_escape
|
|
:
|
|
; --- 7 --- save crsr
|
|
cmp #$37 ; 7?
|
|
bne :+
|
|
lda font_mode ; save font
|
|
sta saved_font_mode
|
|
lda $c7 ; save reverse mode
|
|
sta saved_reverse_mode
|
|
ldx $d6 ; save position
|
|
ldy $d3
|
|
stx saved_row
|
|
sty saved_column
|
|
jmp done_escape
|
|
:
|
|
; --- 8 --- restore crsr
|
|
cmp #$38 ; 8?
|
|
bne :+
|
|
ldx saved_row ; restore pos
|
|
ldy saved_column
|
|
jsr cursor_plot
|
|
lda saved_reverse_mode ; restore ..
|
|
sta $c7 ; .. reverse mode
|
|
ldx saved_font_mode ; restore font
|
|
stx font_mode
|
|
lda font_attribute_table,x
|
|
sta $0286 ; set colour
|
|
jmp done_escape
|
|
|
|
; --- unknown ---
|
|
:
|
|
; --- reset ESC mode ---
|
|
done_escape:
|
|
lda #$00 ; reset escape_mode
|
|
sta escape_mode
|
|
rts
|
|
|
|
; --- set Discard mode ---
|
|
set_discard_mode:
|
|
lda #$f0 ; set esc mode $f0
|
|
sta escape_mode
|
|
rts
|
|
|
|
|
|
; -------------------------------------
|
|
; [ esc mode
|
|
;
|
|
; escape_mode = $ff
|
|
; -------------------------------------
|
|
|
|
long_escape_mode:
|
|
tya ; restore char
|
|
ldy escape_buffer_length
|
|
sta escape_buffer,y ; store char
|
|
iny
|
|
sty escape_buffer_length ; inc esc buffer
|
|
jsr test_if_letter ; test letter
|
|
bcs :+ ; process command
|
|
rts
|
|
|
|
; --- process esc command ---
|
|
; A = last char
|
|
; Y = escape_buffer_length
|
|
; X counts processed command chars
|
|
:
|
|
ldx #$00 ; first char
|
|
|
|
; --- A --- crsr up
|
|
cmp #$41 ; A?
|
|
bne @not_A
|
|
jsr get_number_from_esc_seq ; get argument
|
|
lda escape_parameter ; escape_parameter = 0...
|
|
bne :+
|
|
inc escape_parameter ; .. means 1
|
|
:
|
|
lda $d6 ; get crsr row
|
|
sec
|
|
sbc escape_parameter ; row = row - up
|
|
cmp scroll_region_start ; stop at top of ..
|
|
bpl :+ ; ..scroll region
|
|
lda scroll_region_start
|
|
:
|
|
tax ; x is row
|
|
ldy $d3 ; y is col
|
|
jsr cursor_plot ; set crsr
|
|
jmp @end_escape_seq
|
|
|
|
; --- B --- crsr down
|
|
@not_A:
|
|
cmp #$42 ; B?
|
|
bne @not_B
|
|
jsr get_number_from_esc_seq ; get argument
|
|
lda escape_parameter ; escape_parameter = 0...
|
|
bne :+
|
|
inc escape_parameter ; .. means 1
|
|
:
|
|
lda $d6 ; get crsr row
|
|
clc
|
|
adc escape_parameter ; row = row + down
|
|
cmp scroll_region_end ; outside scrregion?
|
|
bcs :+ ; yes -> branch
|
|
tax ; x is row
|
|
jmp @skip
|
|
:
|
|
ldx scroll_region_end ; x = row = scroll_region_end
|
|
@skip:
|
|
ldy $d3 ; y is col
|
|
jsr cursor_plot ; set crsr
|
|
jmp @end_escape_seq
|
|
|
|
; --- C --- crsr right
|
|
@not_B:
|
|
cmp #$43 ; C?
|
|
bne @not_C
|
|
jsr get_number_from_esc_seq ; get argument
|
|
lda escape_parameter ; escape_parameter = 0...
|
|
bne :+
|
|
inc escape_parameter ; .. means 1
|
|
:
|
|
lda $d3 ; get crsr col
|
|
clc
|
|
adc escape_parameter ; col = col + right
|
|
cmp #$27 ; outside screen?
|
|
bcs :+ ; yes -> branch
|
|
tay
|
|
jmp @skip2
|
|
:
|
|
ldy #$27 ; y=col=left margin
|
|
@skip2:
|
|
ldx $d6 ; x is row
|
|
jsr cursor_plot ; set crsr
|
|
jmp @end_escape_seq
|
|
|
|
; --- D --- crsr left
|
|
@not_C:
|
|
cmp #$44 ; D?
|
|
bne @not_D
|
|
jsr get_number_from_esc_seq ; get argument
|
|
lda escape_parameter ; escape_parameter = 0...
|
|
bne :+
|
|
inc escape_parameter ; .. means 1
|
|
:
|
|
lda $d3 ; get crsr col
|
|
sec
|
|
sbc escape_parameter ; col = col - left
|
|
bpl :+ ; stop at left..
|
|
lda #$00 ; ..margin
|
|
:
|
|
tay ; y is col
|
|
ldx $d6 ; x is row
|
|
jsr cursor_plot ; set crsr
|
|
jmp @end_escape_seq
|
|
|
|
; --- m --- font attributes
|
|
@not_D:
|
|
cmp #$6d ; m?
|
|
bne @not_m
|
|
@next_font_attribute:
|
|
jsr get_number_from_esc_seq
|
|
pha ; save nondigit char
|
|
lda escape_parameter ; parameter to A
|
|
; -- 0 --
|
|
bne :+ ; 0?
|
|
sta font_mode ; set font = vanilla
|
|
sta $c7 ; reverse off
|
|
jmp @end_font_attribute ; jmp next par
|
|
; -- 1 -- bold
|
|
:
|
|
cmp #$01
|
|
bne :+
|
|
lda font_mode ; set bold
|
|
ora #$01
|
|
sta font_mode
|
|
jmp @end_font_attribute ; next char
|
|
; -- 4 -- underline
|
|
:
|
|
cmp #$04
|
|
bne :+
|
|
lda font_mode ; set u_line
|
|
ora #$02
|
|
sta font_mode
|
|
jmp @end_font_attribute ; next char
|
|
; -- 5 -- blink
|
|
:
|
|
cmp #$05
|
|
bne :+
|
|
lda font_mode ; set blink
|
|
ora #$04
|
|
sta font_mode
|
|
jmp @end_font_attribute ; next char
|
|
; -- 7 -- reverse
|
|
:
|
|
cmp #$07
|
|
bne :+
|
|
lda #$01 ; set revers
|
|
sta $c7
|
|
jmp @end_font_attribute ; next char
|
|
:
|
|
; -- 30 - 37 --
|
|
cmp #38 ; >= 38?
|
|
bcs @end_font_attribute
|
|
cmp #30 ; < 30?
|
|
bcc @end_font_attribute
|
|
sbc #30 ; pointer for table
|
|
sta direct_colour
|
|
lda #$80 ; set direct colour
|
|
sta font_mode
|
|
|
|
@end_font_attribute: ; -- next char --
|
|
pla ; get nondigit char
|
|
cmp #$3b ; is semicolon?
|
|
beq @next_font_attribute ; then next cahr
|
|
; -- set colour --
|
|
lda font_mode ;
|
|
bmi :+ ; bit 7->direct col
|
|
tax ; font to colour
|
|
lda font_attribute_table,x
|
|
sta $0286 ; set colour
|
|
jmp @end_escape_seq
|
|
:
|
|
; -- set direct colour --
|
|
ldx direct_colour ; colour maping
|
|
lda direct_colour_table,x
|
|
sta $0286 ; set colour
|
|
jmp @end_escape_seq
|
|
|
|
; --- K --- erase line
|
|
@not_m:
|
|
cmp #$4b ; K?
|
|
bne @not_K
|
|
jsr get_number_from_esc_seq ; get parameter
|
|
lda escape_parameter ; in A
|
|
; -- 0 -- crsr to end of line
|
|
bne :+
|
|
jsr erase_to_end_of_line ; erase end line
|
|
jmp @end_escape_seq
|
|
; -- 1 -- begin to crsr
|
|
:
|
|
cmp #$01
|
|
bne :+
|
|
jsr erase_line_to_cursor ; erase beg line
|
|
jmp @end_escape_seq
|
|
; -- 2 -- whole line
|
|
:
|
|
cmp #$02
|
|
bne :+ ; par undefined
|
|
ldx $d6 ; line in X
|
|
jsr erase_line_by_number ; erase line
|
|
sta $ce ; del char ..
|
|
; ..under crsr
|
|
:
|
|
jmp @end_escape_seq
|
|
|
|
; --- f --- same as H
|
|
@not_K:
|
|
cmp #$66
|
|
bne @not_f
|
|
jmp @set_cursor_position ; same as H
|
|
|
|
; --- H --- cursor position
|
|
@not_f:
|
|
cmp #$48
|
|
bne @not_H
|
|
@set_cursor_position:
|
|
cpy #$01 ; no par means home
|
|
bne :+
|
|
; -- home --
|
|
ldx #$00
|
|
ldy #$00
|
|
jsr cursor_plot ; set crsr
|
|
jmp @end_escape_seq
|
|
; -- row, col --
|
|
:
|
|
jsr get_number_from_esc_seq
|
|
cmp #$3b ; is ;?
|
|
bne @end_set_cursor_position ; no -> error
|
|
; -- prepare row --
|
|
ldy escape_parameter ; get row
|
|
bne :+ ; 0 means 1
|
|
iny
|
|
:
|
|
dey ; line 1 -> line 0
|
|
cpy #$19 ; >= 25?..
|
|
bcs @end_set_cursor_position ; ..error!
|
|
sty temp_ptr_x ; save row
|
|
; -- prepare col
|
|
jsr get_number_from_esc_seq
|
|
ldy escape_parameter ; get col
|
|
bne :+ ; 0 means 1
|
|
iny
|
|
:
|
|
dey ; line 1 -> line 0
|
|
cpy #$28 ; >= 40?..
|
|
bcs @end_set_cursor_position ; ..error!
|
|
ldx temp_ptr_x ; restore row to X
|
|
jsr cursor_plot ; set crsr
|
|
@end_set_cursor_position:
|
|
jmp @end_escape_seq
|
|
|
|
|
|
; --- J --- erase screen
|
|
@not_H:
|
|
cmp #$4a ;J?
|
|
bne @not_J
|
|
jsr get_number_from_esc_seq ; get parameter
|
|
lda escape_parameter ; in A
|
|
; -- 0 -- crsr to end
|
|
bne @not_cursor_to_end
|
|
jsr erase_to_end_of_line ; del rest of line
|
|
ldx $d6 ; get crsr line
|
|
@erase_next_line:
|
|
inx ; next line
|
|
cpx #$19 ; line 25?
|
|
bcs @end_escape_seq ; then end
|
|
txa
|
|
pha ; save X
|
|
jsr erase_line_by_number ; erase line
|
|
pla
|
|
tax ; restore X
|
|
jmp @erase_next_line ; next line
|
|
; -- 1 -- beg of screen to crsr
|
|
@not_cursor_to_end:
|
|
cmp #$01
|
|
bne @not_start_to_cursor
|
|
jsr erase_line_to_cursor ; del start of ln
|
|
ldx $d6 ; get crsr line
|
|
:
|
|
dex ; previous line
|
|
bmi @end_escape_seq ; neg line -> end
|
|
txa
|
|
pha ; save X
|
|
jsr erase_line_by_number ; erase line
|
|
pla
|
|
tax ; restore X
|
|
jmp :-
|
|
; -- 2 -- del screen
|
|
@not_start_to_cursor:
|
|
cmp #$02 ; unknown?
|
|
bne @end_escape_seq ; then ingnore
|
|
ldx #$18 ; start at ln 24
|
|
:
|
|
txa
|
|
pha ; save X
|
|
jsr erase_line_by_number ; erase line
|
|
pla
|
|
tax ; restore X
|
|
dex ; previous line
|
|
bpl :-
|
|
jmp @end_escape_seq
|
|
|
|
|
|
; --- r --- set scroll region
|
|
@not_J:
|
|
cmp #$72 ; r?
|
|
bne @not_r
|
|
; -- prepare top --
|
|
jsr get_number_from_esc_seq
|
|
cmp #$3b ; is ;?
|
|
bne @error_in_escape_seq ; no -> error
|
|
ldy escape_parameter ; get top
|
|
dey ; line 1 -> line 0
|
|
cpy #$19 ; >=25?..
|
|
bcs @error_in_escape_seq ; ..error!
|
|
sty temp_ptr_x ; save top
|
|
; -- prepare bottom --
|
|
jsr get_number_from_esc_seq
|
|
ldy escape_parameter ; get bottom
|
|
dey ; line 1 -> line 0
|
|
cpy #$19 ; >=25?..
|
|
bcs @error_in_escape_seq ; ..error!
|
|
sty temp_ptr_y ; save bottom
|
|
; -- validate lines --
|
|
lda temp_ptr_x ; restore top
|
|
cmp temp_ptr_y ; >= bottom?..
|
|
bcs @error_in_escape_seq ; ..error!
|
|
sta scroll_region_start ; top -> SRStart
|
|
sty scroll_region_end ; bottom -> SREnd
|
|
; -- home crsr
|
|
ldx #$00
|
|
ldy #$00
|
|
jsr cursor_plot
|
|
@error_in_escape_seq:
|
|
jmp @end_escape_seq
|
|
|
|
|
|
@not_r:
|
|
; --- unknown ---
|
|
@end_escape_seq:
|
|
lda #$00
|
|
sta escape_buffer_length ; reset esc buffer
|
|
sta escape_mode ; reset esc mode
|
|
rts
|
|
|
|
|
|
|
|
; -------------------------------------
|
|
; Test letter
|
|
;
|
|
; char in A
|
|
; returns carry = 1 for A = letter
|
|
; -------------------------------------
|
|
test_if_letter:
|
|
cmp #$41 ; smaller then A?
|
|
bcs :+ ; no -> go on
|
|
rts ; return no letter
|
|
:
|
|
cmp #$5b ; smaller then Z+1?
|
|
bcs :+ ; no -> go on
|
|
sec ; return letter
|
|
rts
|
|
:
|
|
cmp #$61 ; smaller then a?
|
|
bcs :+ ; no -> go on
|
|
rts ; return no letter
|
|
:
|
|
cmp #$7b ; smaller then z+1?
|
|
bcs :+ ; no -> go on
|
|
sec ; return letter
|
|
rts
|
|
:
|
|
clc ; return no letter
|
|
rts
|
|
|
|
|
|
|
|
; -------------------------------------
|
|
; test digit
|
|
;
|
|
; char in A
|
|
; returns carry = 1 for A = digit
|
|
; -------------------------------------
|
|
|
|
test_if_digit:
|
|
cmp #$30 ; smaller then 0?
|
|
bcs :+ ; no -> go on
|
|
rts ; return no digit
|
|
:
|
|
cmp #$3a ; smaller then 9+1?
|
|
bcs :+ ; no -> go on
|
|
sec ; return digit
|
|
rts
|
|
:
|
|
clc ; return no digit
|
|
rts
|
|
|
|
|
|
; -------------------------------------
|
|
; get decimal number from esc sequence
|
|
;
|
|
; esc sequence in escape_buffer
|
|
; first index to process in X
|
|
; returns: number escape_parameter
|
|
; first non digit char in A
|
|
; -------------------------------------
|
|
get_number_from_esc_seq:
|
|
lda #$00 ; assume $00
|
|
sta escape_parameter
|
|
@next_digit:
|
|
lda escape_buffer,x ; get next char
|
|
inx
|
|
jsr test_if_digit ; digit?
|
|
bcc @done ; no -> return
|
|
sbc #$30 ; ascii to #
|
|
pha ; save digit
|
|
; old value * 10
|
|
; 10a = ( 4a + a ) * 2
|
|
lda escape_parameter
|
|
asl
|
|
asl ; ( 4a
|
|
clc
|
|
adc escape_parameter ; + a )
|
|
asl ; *2
|
|
sta escape_parameter ; = 10a
|
|
; add new digit
|
|
pla ; resore new digit
|
|
clc
|
|
adc escape_parameter
|
|
sta escape_parameter
|
|
jmp @next_digit ; next char
|
|
@done:
|
|
rts
|
|
|
|
|
|
|
|
; *************************************
|
|
; *
|
|
; * outgoing data
|
|
; *
|
|
; *************************************
|
|
; -------------------------------------
|
|
; given a single char (read from keyboard)
|
|
; work out what data should be sent to the remote host.
|
|
; input:
|
|
; A = keypress
|
|
; output:
|
|
; Y=0 - no data to be sent (i.e. ignore keypress)
|
|
; Y=1 - A contains single byte to send
|
|
; Y=2 - AX points to null terminated string to send
|
|
; -------------------------------------
|
|
|
|
;Y=0 nothing to send
|
|
;Y=1 A = char to send
|
|
;Y=2 AX=pointer to asciiz string to send
|
|
|
|
vt100_transform_outbound_char:
|
|
tay
|
|
lda petscii_to_ascii,y ; PETSCII to ASCII
|
|
bne :+
|
|
ldy #0 ; ignore key
|
|
rts
|
|
:
|
|
cmp #$ff
|
|
beq output_string
|
|
cmp #$fe
|
|
beq command_key ; command key
|
|
;default - send (possibly transformed) single char
|
|
ldy #1 ;means A contains single byte to send
|
|
@done:
|
|
rts
|
|
|
|
|
|
|
|
; -------------------------------------
|
|
; create an ansi control sequence
|
|
; -------------------------------------
|
|
|
|
|
|
output_string:
|
|
tya ; restore original key
|
|
|
|
; --- crsr U ---
|
|
cmp #$91 ; test crsr U
|
|
bne @not_U
|
|
ldax #ansi_cursor_up
|
|
ldy #2
|
|
rts
|
|
; --- crsr L ---
|
|
@not_U:
|
|
cmp #$9d ; test crsr L
|
|
bne @not_L
|
|
ldax #ansi_cursor_left
|
|
ldy #2
|
|
rts
|
|
@not_L:
|
|
cmp #$0d ;test CR
|
|
bne @not_CR
|
|
ldax #crlf
|
|
ldy #2
|
|
rts
|
|
|
|
@not_CR:
|
|
ldy #0 ;must be some kind of error
|
|
rts
|
|
|
|
|
|
; -------------------------------------
|
|
; keypress was a command key
|
|
; -------------------------------------
|
|
|
|
command_key:
|
|
tya ; restore character
|
|
|
|
; --- crsr R ---
|
|
; --- ^] ---
|
|
; both events send $1d
|
|
cmp #$1d
|
|
bne @not_crsr_R
|
|
lda #$04 ; test control Key
|
|
bit $028d
|
|
beq @cursor_right ; not pressed
|
|
; control ] is pressed
|
|
tya ; send ^]
|
|
ldy #1
|
|
rts
|
|
|
|
; crsr R
|
|
@cursor_right:
|
|
ldax #ansi_cursor_right
|
|
ldy #2
|
|
rts
|
|
|
|
; --- crsr D ---
|
|
; --- ^Q ---
|
|
; both events send char $11
|
|
@not_crsr_R:
|
|
cmp #$11 ;^Q / crsr down
|
|
bne @not_crsr_D
|
|
lda #$04 ; test control Key
|
|
bit $028d
|
|
beq @cursor_down ; not pressed
|
|
; control Q is pressed
|
|
tya ; send ^Q
|
|
ldy #1
|
|
rts
|
|
|
|
; crsr down is pressed
|
|
@cursor_down:
|
|
ldax #ansi_cursor_down
|
|
ldy #2
|
|
rts
|
|
|
|
; --- HOME key ---
|
|
; --- ^S ---
|
|
; both events send char $13
|
|
@not_crsr_D:
|
|
cmp #$13 ;^S / HOME
|
|
bne @not_home
|
|
lda #$04 ; test control Key
|
|
bit $028d
|
|
beq @home ; not pressed
|
|
; control S is pressed
|
|
tya ; send ^S
|
|
ldy #1
|
|
rts
|
|
|
|
@home:
|
|
lda #$09 ; send TAB
|
|
ldy #1
|
|
rts
|
|
|
|
; --- DEL key ---
|
|
; --- ^T ---
|
|
; both events send char $14
|
|
@not_home:
|
|
cmp #$14 ;^T / DEL
|
|
bne @not_del
|
|
lda #$04 ; test control Key
|
|
bit $028d
|
|
beq @del ; not pressed
|
|
; control T is pressed
|
|
tya ; send ^T
|
|
ldy #1
|
|
rts
|
|
|
|
; send DEL
|
|
@del:
|
|
lda #$08
|
|
ldy #1
|
|
rts
|
|
|
|
|
|
; --- unknown C=-Key ---
|
|
@not_del:
|
|
ldy #0 ;means don't send anything
|
|
rts
|
|
|
|
; *************************************
|
|
; *
|
|
; * screen handling
|
|
; *
|
|
; *************************************
|
|
|
|
; --- these variables become updated ---
|
|
; on crsr movement.
|
|
;
|
|
; $d1 $d2 start of screen line
|
|
; $d3 crsr column
|
|
; $d6 crsr row
|
|
; $f3 $f4 start of colour line
|
|
; $0286 colour
|
|
|
|
; --- these variables become updated ---
|
|
; on crsr switching.
|
|
;
|
|
; $cc crsr flag, 0 = on
|
|
; $cd crsr blink counter
|
|
; $ce char under crsr
|
|
; $cf crsr blink phase, 0 normal
|
|
; $0287 colour under crsr
|
|
|
|
|
|
|
|
; -------------------------------------
|
|
; switch curser off and restore char.
|
|
; this has to be done before every crsr
|
|
; movement.
|
|
; After movement there has to be a jump
|
|
; to cursor_on.
|
|
; -------------------------------------
|
|
cursor_off:
|
|
pha ; save registers
|
|
tya
|
|
pha
|
|
|
|
ldy #$01 ; crsr of
|
|
sty $cc
|
|
lda $cf ; crsr revers?
|
|
beq :+ ; no -> return
|
|
dey ; set normal phase
|
|
sty $cf
|
|
ldy $d3 ; get column
|
|
lda $ce ; restore char
|
|
sta ($d1),y
|
|
lda $0287 ; restore colour
|
|
sta ($f3),y
|
|
|
|
:
|
|
pla ; restore registers
|
|
tay
|
|
pla
|
|
rts
|
|
|
|
; -------------------------------------
|
|
; opposite of cursor_off
|
|
; -------------------------------------
|
|
|
|
cursor_on:
|
|
pha
|
|
tya
|
|
pha
|
|
|
|
ldy $d3 ; get column
|
|
lda ($d1),y ; save chr
|
|
sta $ce
|
|
eor #$80 ; reverse char
|
|
sta ($d1),y
|
|
lda ($f3),y ; save colour
|
|
sta $0287
|
|
lda $0286 ; set crsr colour
|
|
sta ($f3),y
|
|
inc $cf ; set reverse phase
|
|
lda #$14 ; set crsr counter..
|
|
sta $cd ; ..to max
|
|
lda #$00 ; cursor on
|
|
sta $cc
|
|
|
|
pla
|
|
tay
|
|
pla
|
|
rts
|
|
|
|
|
|
|
|
; -------------------------------------
|
|
; moves the crsr to column Y
|
|
; and line X
|
|
; the crsr ist turned off during
|
|
; operation
|
|
; destroys all registers
|
|
; -------------------------------------
|
|
cursor_plot:
|
|
jsr cursor_off
|
|
|
|
stx $d6 ; set row
|
|
sty $d3 ; set col
|
|
jsr set_line_vectors
|
|
ldx temp_ptr_x ; set screen line
|
|
ldy temp_ptr_x+1
|
|
stx $d1
|
|
sty $d2
|
|
ldx temp_ptr_y ; set color line
|
|
ldy temp_ptr_y+1
|
|
stx $f3
|
|
sty $f4
|
|
|
|
jsr cursor_on
|
|
rts
|
|
|
|
|
|
; -------------------------------------
|
|
; Print char in A to screen
|
|
; being aware of the crsr state
|
|
; -------------------------------------
|
|
|
|
print_to_screen:
|
|
jsr cursor_off
|
|
jsr plot_char
|
|
jsr cursor_on
|
|
rts
|
|
|
|
; -------------------------------------
|
|
; print char to screen
|
|
; char = $ff means no output
|
|
; chr in A
|
|
; X and Y unaffected
|
|
; -------------------------------------
|
|
|
|
plot_char:
|
|
sta temp_ptr_x ; save char
|
|
txa ; save registers
|
|
pha
|
|
tya
|
|
pha
|
|
lda temp_ptr_x ; restore char
|
|
|
|
; PETSCII to ScreenCode (SC)
|
|
; --- $c0-$ff --- - illegal -
|
|
cmp #$c0
|
|
bcc :+
|
|
jmp end_plot_char ; no output
|
|
; --- $a0-$bf --- C=(latin-1) chars
|
|
:
|
|
cmp #$a0
|
|
bcc :+
|
|
sbc #$40 ; SC = PET - $40
|
|
jmp @check_for_reverse
|
|
; --- $80-$9f --- - illegal -
|
|
:
|
|
cmp #$80
|
|
bcc :+
|
|
jmp end_plot_char ; no output
|
|
; --- $60-$7f --- kapital letters
|
|
:
|
|
cmp #$60
|
|
bcc :+
|
|
sbc #$20 ; SC = PET - $20
|
|
jmp @check_for_reverse
|
|
; --- $40-$5f --- small letters
|
|
:
|
|
cmp #$40
|
|
bcc :+
|
|
sbc #$40 ; SC = PET - $40
|
|
jmp @check_for_reverse
|
|
; --- $20-$3f --- interpunction
|
|
:
|
|
cmp #$20
|
|
bcc :+
|
|
jmp @check_for_reverse ; SC = PET
|
|
; --- $00-$1f --- - illegal -
|
|
:
|
|
jmp end_plot_char ; no output
|
|
|
|
; --- handle reverse mode---
|
|
@check_for_reverse:
|
|
ldx $c7 ; reverse mode?
|
|
beq @put_char
|
|
ora #$80 ; reverse char
|
|
|
|
; --- put char to screen ---
|
|
@put_char:
|
|
ldy $d3 ; get crsr col
|
|
cpy #$28 ;col = 40
|
|
bcc @no_line_wrap
|
|
;the only way we end up trying to write to column 40 should
|
|
;be if we skipped the normal line wrap after writing to col 39
|
|
;because we are at the end of the scroll region
|
|
;that means we should do a scroll up and then write this char at col 0
|
|
pha
|
|
jsr scroll_up_scrollregion
|
|
pla
|
|
ldy #$00 ; begin of line
|
|
sty $d3
|
|
@no_line_wrap:
|
|
sta ($d1),y ; char to screen
|
|
lda $0286 ; get colour
|
|
sta ($f3),y ; set colour
|
|
|
|
; --- move on crsr ---
|
|
|
|
ldx $d6 ; get crsr row
|
|
cpx scroll_region_end ; end of scroll reg?
|
|
beq @dont_scroll_yet ; we don't want to trigger a scroll of the whole screen unless
|
|
; we are actually writing a char. we shouldn't scroll just when
|
|
; writing to the bottom right hand screen (else e.g. the title bar
|
|
; in 'nano' gets pushed off the top of the screen.
|
|
;
|
|
cpy #$27 ; col = 39?
|
|
beq move_to_next_line ; yes -> new line
|
|
@dont_scroll_yet:
|
|
iny ; move on
|
|
sty $d3
|
|
|
|
end_plot_char:
|
|
pla ; restore registers
|
|
tay
|
|
pla
|
|
tax
|
|
rts
|
|
|
|
; -------------------------------------
|
|
; subtask of plot_char
|
|
; ends at end_plot_char
|
|
; -------------------------------------
|
|
move_to_next_line:
|
|
ldx $d6 ; get crsr row
|
|
cpx scroll_region_end ; end of scroll reg?
|
|
beq @scroll_up ; yes -> branche
|
|
cpx #$18 ; line 24?
|
|
beq end_plot_char ; yes -> crsr stays
|
|
; --- normal wrap ---
|
|
inx ; increase line
|
|
stx $d6
|
|
ldy #$00 ; begin of line
|
|
sty $d3
|
|
jsr set_line_vectors
|
|
ldx temp_ptr_x ; set screen line
|
|
ldy temp_ptr_x+1
|
|
stx $d1
|
|
sty $d2
|
|
ldx temp_ptr_y ; set colour line
|
|
ldy temp_ptr_y+1
|
|
stx $f3
|
|
sty $f4
|
|
jmp end_plot_char
|
|
; --- scroll up ---
|
|
@scroll_up:
|
|
jsr scroll_up_scrollregion
|
|
ldy #$00 ; begin of line
|
|
sty $d3
|
|
jmp end_plot_char
|
|
|
|
|
|
|
|
scroll_up_scrollregion:
|
|
ldx scroll_region_start ; get first line
|
|
@scroll_one_line:
|
|
; -- new line: --
|
|
; -- temp_ptr_z and temp_ptr_w --
|
|
jsr set_line_vectors
|
|
lda temp_ptr_x ; screen line
|
|
ldy temp_ptr_x+1
|
|
sta temp_ptr_z
|
|
sty temp_ptr_z+1
|
|
lda temp_ptr_y ; colour line
|
|
ldy temp_ptr_y+1
|
|
sta temp_ptr_w
|
|
sty temp_ptr_w+1
|
|
; -- old line: --
|
|
; -- temp_ptr_x and temp_ptr_y
|
|
inx ; old line
|
|
jsr set_line_vectors
|
|
; -- copy chars and colours --
|
|
ldy #$27 ; col 39
|
|
@scroll_one_char:
|
|
lda (temp_ptr_x),y ; copy char
|
|
sta (temp_ptr_z),y
|
|
lda (temp_ptr_y),y ; copy colour
|
|
sta (temp_ptr_w),y
|
|
dey
|
|
bpl @scroll_one_char
|
|
cpx scroll_region_end ; last line?
|
|
bne @scroll_one_line ; no -> go on
|
|
jsr erase_line_by_vector ; del last line
|
|
|
|
rts
|
|
|
|
|
|
scroll_down_scrollregion:
|
|
ldx scroll_region_end ; get last line
|
|
@scroll_one_line:
|
|
jsr set_line_vectors
|
|
lda temp_ptr_x ; screen line
|
|
ldy temp_ptr_x+1
|
|
sta temp_ptr_z
|
|
sty temp_ptr_z+1
|
|
lda temp_ptr_y ; colour line
|
|
ldy temp_ptr_y+1
|
|
sta temp_ptr_w
|
|
sty temp_ptr_w+1
|
|
; -- old line: --
|
|
; -- temp_ptr_x and temp_ptr_y
|
|
dex ; old line
|
|
jsr set_line_vectors
|
|
; -- copy chars ond colours --
|
|
ldy #$27 ; col 39
|
|
@scroll_one_char:
|
|
lda (temp_ptr_x),y ; copy char
|
|
sta (temp_ptr_z),y
|
|
lda (temp_ptr_y),y ; copy colour
|
|
sta (temp_ptr_w),y
|
|
dey
|
|
bpl @scroll_one_char
|
|
cpx scroll_region_start ; first line?
|
|
bne @scroll_one_line ; no -> go on
|
|
jsr erase_line_by_vector ; del first line
|
|
|
|
rts
|
|
|
|
|
|
; -------------------------------------
|
|
; print string to screen
|
|
; string: chars, terminated by $00
|
|
; start lo in x
|
|
; start hi in y
|
|
; affects A
|
|
; takes care of crsr
|
|
; the string must be smaller
|
|
; than 255 chrs
|
|
; -------------------------------------
|
|
|
|
|
|
plot_string:
|
|
stx print_ptr ; store start vector
|
|
sty print_ptr+1
|
|
jsr cursor_off
|
|
ldy #$00
|
|
@next_char:
|
|
lda (print_ptr),y
|
|
beq @end_string ; $00 terminates string
|
|
jsr plot_char
|
|
iny
|
|
jmp @next_char
|
|
|
|
@end_string:
|
|
jsr cursor_on
|
|
rts
|
|
|
|
|
|
|
|
; -------------------------------------
|
|
; delete screen line
|
|
; (Erase Line)
|
|
;
|
|
; line number in X
|
|
;
|
|
; erase_line_by_vector needs line vectors in temp_ptr_x
|
|
; and temp_ptr_y
|
|
;
|
|
; destroys all registers
|
|
; returns $20 (space) in A
|
|
; -------------------------------------
|
|
|
|
erase_line_by_number:
|
|
jsr set_line_vectors ; line start in temp_ptr_x
|
|
; col start in temp_ptr_y
|
|
|
|
; erase chars
|
|
erase_line_by_vector:
|
|
ldy #$27 ; col 39
|
|
lda #$20 ; load space
|
|
:
|
|
sta (temp_ptr_x),y ; clear char
|
|
dey
|
|
bpl :-
|
|
|
|
; set colour
|
|
ldy #$27 ; col 39
|
|
lda #charmode_vanilla ; load vanilla
|
|
:
|
|
sta (temp_ptr_y),y ; clear char
|
|
dey
|
|
bpl :-
|
|
|
|
rts
|
|
|
|
|
|
|
|
; -------------------------------------
|
|
; delete screen line from crsr to end
|
|
; (Erase End of Line)
|
|
; destroys all registers
|
|
; -------------------------------------
|
|
|
|
erase_to_end_of_line:
|
|
jsr cursor_off
|
|
; erase chars
|
|
ldy $d3 ; get crsr col
|
|
lda #$20 ; load space
|
|
:
|
|
sta ($d1),y ; clear char
|
|
iny
|
|
cpy #$28 ; pos 40?
|
|
bne :- ; next char
|
|
sta $ce ; del char ..
|
|
; ..under crsr
|
|
; set colour
|
|
ldy $d3 ; get crsr col
|
|
lda #charmode_vanilla ; load vanilla
|
|
:
|
|
sta ($f3),y ; set colour
|
|
iny
|
|
cpy #$28 ; pos 40?
|
|
bne :- ; next char
|
|
jsr cursor_on
|
|
rts
|
|
|
|
; -------------------------------------
|
|
; delete screen line up to crsr
|
|
; (Erase Begin of Line)
|
|
; destroys all registers
|
|
; -------------------------------------
|
|
erase_line_to_cursor:
|
|
; erase chars
|
|
ldy $d3 ; get crsr col
|
|
lda #$20 ; load space
|
|
:
|
|
sta ($d1),y ; clear char
|
|
dey
|
|
bpl :- ; pos>=0 -> next
|
|
sta $ce ; del char ..
|
|
; ..under crsr
|
|
; set colour
|
|
ldy $d3 ; get crsr col
|
|
lda #charmode_vanilla ; load vanilla
|
|
:
|
|
sta ($f3),y ; clear char
|
|
dey
|
|
bpl :- ; pos>=0 -> next
|
|
rts
|
|
|
|
|
|
; -------------------------------------
|
|
; set line vectors
|
|
;
|
|
; line no in X
|
|
; destroys A and Y
|
|
;
|
|
; sets start of screen line in temp_ptr_x
|
|
; sets start of colour line in temp_ptr_y
|
|
; -------------------------------------
|
|
|
|
set_line_vectors:
|
|
lda $ecf0,x ; get lo byte
|
|
sta temp_ptr_x
|
|
sta temp_ptr_y
|
|
; determin hi byte
|
|
ldy #$04 ; hi byte
|
|
cpx #$07 ; line < 7?
|
|
bcc @got_line_vector
|
|
iny
|
|
cpx #$0d ; line < 13?
|
|
bcc @got_line_vector
|
|
iny
|
|
cpx #$14 ; line < 20?
|
|
bcc @got_line_vector
|
|
iny ; line 20-24
|
|
@got_line_vector:
|
|
sty temp_ptr_x+1
|
|
tya
|
|
clc ; colour RAM =
|
|
adc #$d4 ; video RAM + d4
|
|
sta temp_ptr_y+1
|
|
rts
|
|
|
|
|
|
|
|
; -------------------------------------
|
|
; init routines
|
|
;
|
|
; -------------------------------------
|
|
|
|
|
|
initialise_screen:
|
|
|
|
;--- set background ---
|
|
lda #text_background_colour
|
|
sta $d021
|
|
; --- disable Shift C= ---
|
|
lda #$80
|
|
sta $0291
|
|
; --- erase screen ---
|
|
ldx #$18 ; start at ln 24
|
|
@erase_one_line:
|
|
txa
|
|
pha ; save X
|
|
jsr erase_line_by_number ; erase line
|
|
pla
|
|
tax ; restore X
|
|
dex ; previous line
|
|
bpl @erase_one_line
|
|
|
|
lda #charmode_vanilla ; load vanilla
|
|
sta $0286
|
|
; --- crsr on ---
|
|
jsr cursor_off
|
|
jsr cursor_on
|
|
; --- put crsr ---
|
|
jsr do_cr
|
|
jsr do_line_feed
|
|
jsr do_line_feed
|
|
|
|
rts
|
|
|
|
|
|
|
|
initialise_variables:
|
|
lda #$00
|
|
sta escape_mode
|
|
sta escape_buffer_length
|
|
sta scroll_region_start
|
|
sta font_mode
|
|
sta saved_font_mode
|
|
sta saved_reverse_mode
|
|
sta saved_row
|
|
sta saved_column
|
|
|
|
lda #$18 ; last line
|
|
sta scroll_region_end ; = 24
|
|
|
|
rts
|
|
|
|
|
|
reverse_font_table = font_table + $0400
|
|
initialise_font:
|
|
sei
|
|
ldx #<ROM_FONT ; font_mode in temp_ptr_z
|
|
ldy #>ROM_FONT
|
|
stx temp_ptr_z
|
|
sty temp_ptr_z+1
|
|
ldx #<font_table
|
|
ldy #>font_table
|
|
stx temp_ptr_y
|
|
sty temp_ptr_y+1
|
|
ldx #<reverse_font_table
|
|
ldy #>reverse_font_table
|
|
stx temp_ptr_x
|
|
sty temp_ptr_x+1
|
|
|
|
; copy font
|
|
ldx #$04 ; copy 4 pages = 1KB
|
|
ldy #$00
|
|
:
|
|
lda (temp_ptr_z),y
|
|
sta (temp_ptr_y),y
|
|
eor #$ff ; reverse char
|
|
sta (temp_ptr_x),y
|
|
iny
|
|
bne :-
|
|
; switch to next page
|
|
inc temp_ptr_z+1
|
|
inc temp_ptr_y+1
|
|
inc temp_ptr_x+1
|
|
dex
|
|
bne :-
|
|
|
|
; enable font
|
|
lda $d018
|
|
and #$f1
|
|
ora #$09
|
|
sta $d018
|
|
cli
|
|
rts
|
|
|
|
|
|
.rodata
|
|
font_attribute_table: ; bits mean blink, underline, bold
|
|
.byte charmode_vanilla, charmode_bold ; 000 001
|
|
.byte charmode_underline, charmode_underline_bold ; 010 011
|
|
.byte charmode_blink, charmode_blink_bold ; 100 101
|
|
.byte charmode_blink_underline, charmode_blink_underline_bold ; 110 111
|
|
|
|
direct_colour_table:
|
|
;ANSI 30 31 32 32 34 35 36 37
|
|
; blk rd gr ye blu mg cy wh
|
|
.byte 0, $0a, 5, 7, $0e, 4, 3, 1
|
|
|
|
ansi_cursor_up: .byte esc, brace, $41, $00 ; esc [ A
|
|
ansi_cursor_down: .byte esc, brace, $42, $00 ; esc [ B
|
|
ansi_cursor_right: .byte esc, brace, $43, $00 ; esc [ C
|
|
ansi_cursor_left: .byte esc, brace, $44, $00 ; esc [ D
|
|
crlf: .byte $0d,$0a,0
|
|
|
|
; -------------------------------------
|
|
; table ASCII to PETSCII
|
|
;
|
|
; these characters cat be printed
|
|
;
|
|
; pet=$00 means ignore the char
|
|
; pet=$01 means do something complicated
|
|
; -------------------------------------
|
|
ascii_to_petscii:
|
|
.byte $00 ; $00
|
|
.byte $00 ; $01
|
|
.byte $00 ; $02
|
|
.byte $00 ; $03
|
|
.byte $00 ; $04
|
|
.byte $00 ; $05
|
|
.byte $00 ; $06
|
|
.byte $01 ; $07 BEL
|
|
.byte $01 ; $08 BS/DEL
|
|
.byte $01 ; $09 TAB
|
|
.byte $01 ; $0a LF
|
|
.byte $00 ; $0b
|
|
.byte $00 ; $0c
|
|
.byte $01 ; $0d CR
|
|
.byte $00 ; $0e
|
|
.byte $00 ; $0f
|
|
.byte $00 ; $10
|
|
.byte $00 ; $11
|
|
.byte $00 ; $12
|
|
.byte $00 ; $13
|
|
.byte $00 ; $14
|
|
.byte $00 ; $15
|
|
.byte $00 ; $16
|
|
.byte $00 ; $17
|
|
.byte $00 ; $18
|
|
.byte $00 ; $19
|
|
.byte $00 ; $1a
|
|
.byte $01 ; $1b ESC
|
|
.byte $00 ; $1c
|
|
.byte $00 ; $1d
|
|
.byte $00 ; $1e
|
|
.byte $00 ; $1f
|
|
.byte $20 ; $20 1:1
|
|
.byte $21 ; $21 1:1
|
|
.byte $22 ; $22 1:1
|
|
.byte $23 ; $23 1:1
|
|
.byte $24 ; $24 1:1
|
|
.byte $25 ; $25 1:1
|
|
.byte $26 ; $26 1:1
|
|
.byte $27 ; $27 1:1
|
|
.byte $28 ; $28 1:1
|
|
.byte $29 ; $29 1:1
|
|
.byte $2a ; $2a 1:1
|
|
.byte $2b ; $2b 1:1
|
|
.byte $2c ; $2c 1:1
|
|
.byte $2d ; $2d 1:1
|
|
.byte $2e ; $2e 1:1
|
|
.byte $2f ; $2f 1:1
|
|
.byte $30 ; $30 1:1
|
|
.byte $31 ; $31 1:1
|
|
.byte $32 ; $32 1:1
|
|
.byte $33 ; $33 1:1
|
|
.byte $34 ; $34 1:1
|
|
.byte $35 ; $35 1:1
|
|
.byte $36 ; $36 1:1
|
|
.byte $37 ; $37 1:1
|
|
.byte $38 ; $38 1:1
|
|
.byte $39 ; $39 1:1
|
|
.byte $3a ; $3a 1:1
|
|
.byte $3b ; $3b 1:1
|
|
.byte $3c ; $3c 1:1
|
|
.byte $3d ; $3d 1:1
|
|
.byte $3e ; $3e 1:1
|
|
.byte $3f ; $3f 1:1
|
|
.byte $40 ; $40 1:1
|
|
.byte $61 ; $41 -----
|
|
.byte $62 ; $42
|
|
.byte $63 ; $43
|
|
.byte $64 ; $44 capital
|
|
.byte $65 ; $45
|
|
.byte $66 ; $46
|
|
.byte $67 ; $47
|
|
.byte $68 ; $48
|
|
.byte $69 ; $49
|
|
.byte $6a ; $4a
|
|
.byte $6b ; $4b
|
|
.byte $6c ; $4c
|
|
.byte $6d ; $4d letters
|
|
.byte $6e ; $4e
|
|
.byte $6f ; $4f
|
|
.byte $70 ; $50
|
|
.byte $71 ; $51
|
|
.byte $72 ; $52
|
|
.byte $73 ; $53
|
|
.byte $74 ; $54
|
|
.byte $75 ; $55
|
|
.byte $76 ; $56
|
|
.byte $77 ; $57
|
|
.byte $78 ; $58
|
|
.byte $79 ; $59
|
|
.byte $7a ; $5a -----
|
|
.byte $5b ; $5b 1:1
|
|
.byte $5c ; $5c 1:1
|
|
.byte $5d ; $5d 1:1
|
|
.byte $5e ; $5e 1:1
|
|
.byte $5f ; $5f 1:1
|
|
.byte $60 ; $60 1:1
|
|
.byte $41 ; $61 -----
|
|
.byte $42 ; $62
|
|
.byte $43 ; $63
|
|
.byte $44 ; $64 small
|
|
.byte $45 ; $65
|
|
.byte $46 ; $66
|
|
.byte $47 ; $67
|
|
.byte $48 ; $68
|
|
.byte $49 ; $69
|
|
.byte $4a ; $6a
|
|
.byte $4b ; $6b letters
|
|
.byte $4c ; $6c
|
|
.byte $4d ; $6d
|
|
.byte $4e ; $6e
|
|
.byte $4f ; $6f
|
|
.byte $50 ; $70
|
|
.byte $51 ; $71
|
|
.byte $52 ; $72
|
|
.byte $53 ; $73
|
|
.byte $54 ; $74
|
|
.byte $55 ; $75
|
|
.byte $56 ; $76
|
|
.byte $57 ; $77
|
|
.byte $58 ; $78
|
|
.byte $59 ; $79
|
|
.byte $5a ; $7a -----
|
|
.byte $7b ; $7b 1:1 {
|
|
.byte $7c ; $7c 1:1 |
|
|
.byte $7d ; $7d 1:1 }
|
|
.byte $7e ; $7e 1:1 ~
|
|
.byte $00 ; $7f
|
|
.byte $00 ; $80
|
|
.byte $00 ; $81
|
|
.byte $00 ; $82
|
|
.byte $00 ; $83
|
|
.byte $00 ; $84
|
|
.byte $00 ; $85
|
|
.byte $00 ; $86
|
|
.byte $00 ; $87
|
|
.byte $00 ; $88
|
|
.byte $00 ; $89
|
|
.byte $00 ; $8a
|
|
.byte $00 ; $8b
|
|
.byte $00 ; $8c
|
|
.byte $00 ; $8d
|
|
.byte $00 ; $8e
|
|
.byte $00 ; $8f
|
|
.byte $00 ; $90
|
|
.byte $00 ; $91
|
|
.byte $00 ; $92
|
|
.byte $00 ; $93
|
|
.byte $00 ; $94
|
|
.byte $00 ; $95
|
|
.byte $00 ; $96
|
|
.byte $00 ; $97
|
|
.byte $00 ; $98
|
|
.byte $00 ; $99
|
|
.byte $00 ; $9a
|
|
.byte $00 ; $9b
|
|
.byte $00 ; $9c
|
|
.byte $00 ; $9d
|
|
.byte $00 ; $9e
|
|
.byte $00 ; $9f
|
|
.byte $20 ; $a0
|
|
.byte $7f ; $a1
|
|
.byte $7f ; $a2
|
|
.byte $bf ; $a3
|
|
.byte $be ; $a4
|
|
.byte $7f ; $a5
|
|
.byte $73 ; $a6
|
|
.byte $b5 ; $a7
|
|
.byte $53 ; $a8
|
|
.byte $bb ; $a9
|
|
.byte $7f ; $aa
|
|
.byte $bc ; $ab
|
|
.byte $7f ; $ac
|
|
.byte $2d ; $ad
|
|
.byte $7f ; $ae
|
|
.byte $7f ; $af
|
|
.byte $ba ; $b0
|
|
.byte $b8 ; $b1
|
|
.byte $b6 ; $b2
|
|
.byte $b7 ; $b3
|
|
.byte $7a ; $b4
|
|
.byte $b9 ; $b5
|
|
.byte $7f ; $b6
|
|
.byte $7f ; $b7
|
|
.byte $5a ; $b8
|
|
.byte $7f ; $b9
|
|
.byte $7f ; $ba
|
|
.byte $bd ; $bb
|
|
.byte $b0 ; $bc
|
|
.byte $b0 ; $bd
|
|
.byte $79 ; $be
|
|
.byte $7f ; $bf
|
|
.byte $a5 ; $c0
|
|
.byte $61 ; $c1
|
|
.byte $a4 ; $c2
|
|
.byte $61 ; $c3
|
|
.byte $a3 ; $c4
|
|
.byte $a4 ; $c5
|
|
.byte $7f ; $c6
|
|
.byte $63 ; $c7
|
|
.byte $ad ; $c8
|
|
.byte $ab ; $c9
|
|
.byte $ac ; $ca
|
|
.byte $65 ; $cb
|
|
.byte $69 ; $cc
|
|
.byte $69 ; $cd
|
|
.byte $69 ; $ce
|
|
.byte $69 ; $cf
|
|
.byte $64 ; $d0
|
|
.byte $6e ; $d1
|
|
.byte $6f ; $d2
|
|
.byte $6f ; $d3
|
|
.byte $b1 ; $d4
|
|
.byte $6f ; $d5
|
|
.byte $af ; $d6
|
|
.byte $7f ; $d7
|
|
.byte $6f ; $d8
|
|
.byte $75 ; $d9
|
|
.byte $75 ; $da
|
|
.byte $75 ; $db
|
|
.byte $b3 ; $dc
|
|
.byte $79 ; $dd
|
|
.byte $7f ; $de
|
|
.byte $b4 ; $df
|
|
.byte $a2 ; $e0
|
|
.byte $41 ; $e1
|
|
.byte $a1 ; $e2
|
|
.byte $41 ; $e3
|
|
.byte $a0 ; $e4
|
|
.byte $a1 ; $e5
|
|
.byte $7f ; $e6
|
|
.byte $a6 ; $e7
|
|
.byte $aa ; $e8
|
|
.byte $a8 ; $e9
|
|
.byte $a9 ; $ea
|
|
.byte $a7 ; $eb
|
|
.byte $49 ; $ec
|
|
.byte $49 ; $ed
|
|
.byte $49 ; $ee
|
|
.byte $49 ; $ef
|
|
.byte $7f ; $f0
|
|
.byte $4e ; $f1
|
|
.byte $4f ; $f2
|
|
.byte $4f ; $f3
|
|
.byte $b1 ; $f4
|
|
.byte $4f ; $f5
|
|
.byte $ae ; $f6
|
|
.byte $7f ; $f7
|
|
.byte $4f ; $f8
|
|
.byte $55 ; $f9
|
|
.byte $55 ; $fa
|
|
.byte $55 ; $fb
|
|
.byte $b2 ; $fc
|
|
.byte $59 ; $fd
|
|
.byte $7f ; $fe
|
|
.byte $59 ; $ff
|
|
|
|
; -------------------------------------
|
|
; table PETSCII to ASCII
|
|
;
|
|
; these characters can be typed with
|
|
; the keyboard
|
|
;
|
|
; ascii = $00 means ignore key
|
|
; ascii = $ff menas send string
|
|
; ascii = $fe means do something
|
|
; complicated (command key)
|
|
; -------------------------------------
|
|
petscii_to_ascii:
|
|
.byte $00 ; $00
|
|
.byte $01 ; $01
|
|
.byte $02 ; $02
|
|
.byte $03 ; $03
|
|
.byte $04 ; $04
|
|
.byte $05 ; $05
|
|
.byte $06 ; $06
|
|
.byte $07 ; $07
|
|
.byte $08 ; $08 DEL
|
|
.byte $09 ; $09 TAB
|
|
.byte $0a ; $0a
|
|
.byte $0b ; $0b
|
|
.byte $0c ; $0c
|
|
.byte $ff ; $0d CR
|
|
.byte $0e ; $0e
|
|
.byte $0f ; $0f
|
|
.byte $10 ; $10
|
|
.byte $fe ; $11 ^Q (crsr down)
|
|
.byte $12 ; $12
|
|
.byte $fe ; $13 ^S TAB (HOME)
|
|
.byte $fe ; $14 ^T BS (DEL)
|
|
.byte $15 ; $15
|
|
.byte $16 ; $16
|
|
.byte $17 ; $17
|
|
.byte $18 ; $18
|
|
.byte $19 ; $19
|
|
.byte $1a ; $1a
|
|
.byte $1b ; $1b ESC
|
|
.byte $1c ; $1c
|
|
.byte $fe ; $1d ^](crsr right)
|
|
.byte $1e ; $1e
|
|
.byte $1f ; $1f
|
|
.byte $20 ; $20 SPACE
|
|
.byte $21 ; $21 !
|
|
.byte $22 ; $22 "
|
|
.byte $23 ; $23 #
|
|
.byte $24 ; $24 $
|
|
.byte $25 ; $25 %
|
|
.byte $26 ; $26 &
|
|
.byte $27 ; $27 '
|
|
.byte $28 ; $28 (
|
|
.byte $29 ; $29 )
|
|
.byte $2a ; $2a *
|
|
.byte $2b ; $2b +
|
|
.byte $2c ; $2c ,
|
|
.byte $2d ; $2d -
|
|
.byte $2e ; $2e .
|
|
.byte $2f ; $2f /
|
|
.byte $30 ; $30 0
|
|
.byte $31 ; $31 1
|
|
.byte $32 ; $32 2
|
|
.byte $33 ; $33 3
|
|
.byte $34 ; $34 4
|
|
.byte $35 ; $35 5
|
|
.byte $36 ; $36 6
|
|
.byte $37 ; $37 7
|
|
.byte $38 ; $38 8
|
|
.byte $39 ; $39 9
|
|
.byte $3a ; $3a :
|
|
.byte $3b ; $3b ;
|
|
.byte $3c ; $3c <
|
|
.byte $3d ; $3d =
|
|
.byte $3e ; $3e >
|
|
.byte $3f ; $3f ?
|
|
.byte $40 ; $40 @
|
|
.byte $61 ; $41 a
|
|
.byte $62 ; $42 b
|
|
.byte $63 ; $43 c
|
|
.byte $64 ; $44 d
|
|
.byte $65 ; $45 e
|
|
.byte $66 ; $46 f
|
|
.byte $67 ; $47 g
|
|
.byte $68 ; $48 h
|
|
.byte $69 ; $49 i
|
|
.byte $6a ; $4a j
|
|
.byte $6b ; $4b k
|
|
.byte $6c ; $4c l
|
|
.byte $6d ; $4d m
|
|
.byte $6e ; $4e n
|
|
.byte $6f ; $4f o
|
|
.byte $70 ; $50 p
|
|
.byte $71 ; $51 q
|
|
.byte $72 ; $52 r
|
|
.byte $73 ; $53 s
|
|
.byte $74 ; $54 t
|
|
.byte $75 ; $55 u
|
|
.byte $76 ; $56 v
|
|
.byte $77 ; $57 w
|
|
.byte $78 ; $58 x
|
|
.byte $79 ; $59 y
|
|
.byte $7a ; $5a z
|
|
.byte $5b ; $5b [
|
|
.byte $5c ; $5c \ (Pound)
|
|
.byte $5d ; $5d ]
|
|
.byte $5e ; $5e ^
|
|
.byte $1b ; $5f ESC ( <- )
|
|
.byte $00 ; $60
|
|
.byte $41 ; $61 A
|
|
.byte $42 ; $62 B
|
|
.byte $43 ; $63 C
|
|
.byte $44 ; $64 D
|
|
.byte $45 ; $65 E
|
|
.byte $46 ; $66 F
|
|
.byte $47 ; $67 G
|
|
.byte $48 ; $68 H
|
|
.byte $49 ; $69 I
|
|
.byte $4a ; $6a J
|
|
.byte $4b ; $6b K
|
|
.byte $4c ; $6c L
|
|
.byte $4d ; $6d M
|
|
.byte $4e ; $6e N
|
|
.byte $4f ; $6f O
|
|
.byte $50 ; $70 P
|
|
.byte $51 ; $71 Q
|
|
.byte $52 ; $72 R
|
|
.byte $53 ; $73 S
|
|
.byte $54 ; $74 T
|
|
.byte $55 ; $75 U
|
|
.byte $56 ; $76 V
|
|
.byte $57 ; $77 W
|
|
.byte $58 ; $78 X
|
|
.byte $59 ; $79 Y
|
|
.byte $5a ; $7a Z
|
|
.byte $00 ; $7b
|
|
.byte $00 ; $7c
|
|
.byte $00 ; $7d
|
|
.byte $00 ; $7e
|
|
.byte $00 ; $7f
|
|
.byte $00 ; $80
|
|
.byte $00 ; $81
|
|
.byte $00 ; $82
|
|
.byte $00 ; $83
|
|
.byte $00 ; $84
|
|
.byte $00 ; $85 (f1)
|
|
.byte $00 ; $86 (f3)
|
|
.byte $00 ; $87 (f5)
|
|
.byte $00 ; $88 (f7)
|
|
.byte $00 ; $89 (f2)
|
|
.byte $00 ; $8a (f4)
|
|
.byte $00 ; $8b (f6)
|
|
.byte $00 ; $8c (f8)
|
|
.byte $00 ; $8d (Shift RET)
|
|
.byte $00 ; $8e
|
|
.byte $00 ; $8f
|
|
.byte $00 ; $90
|
|
.byte $ff ; $91 (crsr up)
|
|
.byte $00 ; $92
|
|
.byte $00 ; $93 (Shift Clr/Home)
|
|
.byte $7f ; $94 DEL (Shift Ins/Del)
|
|
.byte $00 ; $95
|
|
.byte $00 ; $96
|
|
.byte $00 ; $97
|
|
.byte $00 ; $98
|
|
.byte $00 ; $99
|
|
.byte $00 ; $9a
|
|
.byte $00 ; $9b
|
|
.byte $00 ; $9c
|
|
.byte $ff ; $9d (crsr left)
|
|
.byte $00 ; $9e
|
|
.byte $00 ; $9f
|
|
.byte $00 ; $a0 (Shift Space)
|
|
.byte $00 ; $a1
|
|
.byte $00 ; $a2
|
|
.byte $00 ; $a3
|
|
.byte $00 ; $a4
|
|
.byte $00 ; $a5
|
|
.byte $00 ; $a6
|
|
.byte $00 ; $a7
|
|
.byte $00 ; $a8
|
|
.byte $7c ; $a9 | (Shift Pound)
|
|
.byte $00 ; $aa
|
|
.byte $00 ; $ab
|
|
.byte $fe ; $ac C= D
|
|
.byte $00 ; $ad
|
|
.byte $fe ; $ae C= S
|
|
.byte $00 ; $af
|
|
.byte $fe ; $b0 C= A
|
|
.byte $00 ; $b1
|
|
.byte $fe ; $b2 C= R
|
|
.byte $00 ; $b3
|
|
.byte $00 ; $b4
|
|
.byte $00 ; $b5
|
|
.byte $fe ; $b6 C= L
|
|
.byte $00 ; $b7
|
|
.byte $00 ; $b8
|
|
.byte $00 ; $b9
|
|
.byte $60 ; $ba ` ( Shift @ )
|
|
.byte $00 ; $bb
|
|
.byte $fe ; $bc C= C
|
|
.byte $00 ; $bd
|
|
.byte $00 ; $be
|
|
.byte $fe ; $bf C= B
|
|
.byte $5f ; $c0 _ ( Shift * )
|
|
.byte $41 ; $c1 -----
|
|
.byte $42 ; $c2
|
|
.byte $43 ; $c3 capital
|
|
.byte $44 ; $c4
|
|
.byte $45 ; $c5 letters
|
|
.byte $46 ; $c6
|
|
.byte $47 ; $c7 generate
|
|
.byte $48 ; $c8
|
|
.byte $49 ; $c9 these
|
|
.byte $4a ; $ca
|
|
.byte $4b ; $cb codes
|
|
.byte $4c ; $cc
|
|
.byte $4d ; $cd
|
|
.byte $4e ; $ce
|
|
.byte $4f ; $cf
|
|
.byte $50 ; $d0
|
|
.byte $51 ; $d1
|
|
.byte $52 ; $d2
|
|
.byte $53 ; $d3
|
|
.byte $54 ; $d4
|
|
.byte $55 ; $d5
|
|
.byte $56 ; $d6
|
|
.byte $57 ; $d7
|
|
.byte $58 ; $d8
|
|
.byte $59 ; $d9
|
|
.byte $5a ; $da -----
|
|
.byte $7b ; $db { ( Shift + )
|
|
.byte $00 ; $dc ( C= - )
|
|
.byte $7d ; $dd } ( Shift - )
|
|
.byte $7e ; $de ~ ( Pi )
|
|
.byte $00 ; $df
|
|
.byte $00 ; $e0
|
|
.byte $00 ; $e1
|
|
.byte $00 ; $e2
|
|
.byte $00 ; $e3
|
|
.byte $00 ; $e4
|
|
.byte $00 ; $e5
|
|
.byte $00 ; $e6
|
|
.byte $00 ; $e7
|
|
.byte $00 ; $e8
|
|
.byte $00 ; $e9
|
|
.byte $00 ; $ea
|
|
.byte $00 ; $eb
|
|
.byte $00 ; $ec
|
|
.byte $00 ; $ed
|
|
.byte $00 ; $ee
|
|
.byte $00 ; $ef
|
|
.byte $00 ; $f0
|
|
.byte $00 ; $f1
|
|
.byte $00 ; $f2
|
|
.byte $00 ; $f3
|
|
.byte $00 ; $f4
|
|
.byte $00 ; $f5
|
|
.byte $00 ; $f6
|
|
.byte $00 ; $f7
|
|
.byte $00 ; $f8
|
|
.byte $00 ; $f9
|
|
.byte $00 ; $fa
|
|
.byte $00 ; $fb
|
|
.byte $00 ; $fc
|
|
.byte $00 ; $fd
|
|
.byte $00 ; $fe
|
|
.byte $00 ; $ff
|
|
|
|
ROM_FONT:
|
|
.incbin "../inc/vt100_font.bin"
|
|
|
|
;-- LICENSE FOR c64_vt100.s --
|
|
; The contents of this file are subject to the Mozilla Public License
|
|
; Version 1.1 (the "License"); you may not use this file except in
|
|
; compliance with the License. You may obtain a copy of the License at
|
|
; http://www.mozilla.org/MPL/
|
|
;
|
|
; Software distributed under the License is distributed on an "AS IS"
|
|
; basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
|
; License for the specific language governing rights and limitations
|
|
; under the License.
|
|
;
|
|
; The Initial Developer of the Original Code is Lars Stollenwerk.
|
|
;
|
|
; Portions created by the Initial Developer are Copyright (C) 2003
|
|
; Lars Stollenwerk. All Rights Reserved.
|
|
;
|
|
;Contributor(s): Jonno Downes
|
|
; -- LICENSE END --
|