Skip to content

Instantly share code, notes, and snippets.

@keyboardspecialist
Created October 30, 2023 04:43
Show Gist options
  • Save keyboardspecialist/513cc1038861868a52a31428b7922b86 to your computer and use it in GitHub Desktop.
Save keyboardspecialist/513cc1038861868a52a31428b7922b86 to your computer and use it in GitHub Desktop.
Lesson9 VERA
base $080d
jmp start
enum $0030
zp_ptr_lo dsb 1
zp_ptr_hi dsb 1
ende
;vera chip mapping
vera_addr_low = $9f20
vera_addr_high = $9f21
vera_addr_bank = $9f22
vera_data0 = $9f23
vera_data1 = $9f24
vera_ctrl = $9f25
vera_dc_video = $9f29
vera_dc_hscale = $9f2a
vera_dc_vscale = $9f2b
vera_l0_config = $9f2d
vera_l0_mapbase = $9f2e
vera_l0_tilebase = $9f2f
vera_l1_config = $9f34
vera_l1_mapbase = $9f35
vera_l1_tilebase = $9f36
;vram addresses
vram_layer1_map = $1b000
vram_layer0_map = $00000
vram_lowerchars = $0b000
vram_lower_rev = vram_lowerchars + 128 * 8
vram_petscii = $1f000
vram_palette = $1fa00
;rom banks
rom_bank = $01
basic_bank = 4
chrset_bank = 6
;char set rom
lower_upper = $c400
;kernal
chrout = $ffd2
getin = $ffe4
;petscii codes
white = $05
return = $0d
space = $20
zero_char = $30
six_char = $36
nine_char = $39
c_char = $43
i_char = $49
o_char = $4f
t_char = $54
clr = $93
;screen codes
reverse = $80
;globals
text_colors db $61
smile
db %00111100
db %01000010
db %10100101
db %10000001
db %10100101
db %10011001
db %01000010
db %00111100
email db "[email protected]",0
hidden db "secret message!",0
start:
;clear screen and set to white
lda #clr
jsr chrout
lda #white
jsr chrout
;print text lines
ldx #0
@email_loop:
lda email, x
beq @done_email
jsr chrout
inx
bra @email_loop
@done_email:
lda #return
jsr chrout
ldx #0
@hidden_loop:
lda hidden, x
beq @done_hidden
jsr chrout
inx
bra @hidden_loop
@done_hidden:
lda #return
jsr chrout
;copy lower/upper char set from rom to vram
lda #chrset_bank
sta rom_bank
lda #<lower_upper
sta zp_ptr_lo
lda #>lower_upper
sta zp_ptr_hi
stz vera_ctrl ;port 0 standard glyphs copied from rom
lda #($10 | ^vram_lowerchars) ;stride 1
sta vera_addr_bank
lda #>vram_lowerchars
sta vera_addr_high
stz vera_addr_low
lda #1
sta vera_ctrl ;port 1 reverse glyphs inverted from rom
lda #($10 | ^vram_lower_rev)
sta vera_addr_bank
lda #>vram_lower_rev
sta vera_addr_high
lda #<vram_lower_rev
sta vera_addr_low
ldx #4
ldy #0
@copy_char_loop:
lda (zp_ptr_lo), y
sta vera_data0 ;original pixel row
eor #$ff
sta vera_data1 ;inverted pixel row
iny
bne @copy_char_loop
inc zp_ptr_hi
dex
bne @copy_char_loop
lda #basic_bank
sta rom_bank
;configure layer 0: 256 color text, upper/graphics petscii
lda #$68
sta vera_l0_config
lda #(vram_layer0_map >> 9)
sta vera_l0_mapbase
lda #(vram_petscii >> 9)
sta vera_l0_tilebase
;init palette vram (color 1 = white)
stz vera_ctrl
lda #($10 | ^vram_palette) ; stride = 1
sta vera_addr_bank
lda #>vram_palette
sta vera_addr_high
lda #<(vram_palette+2) ;3rd byte of palette
sta vera_addr_low
lda #$ff
sta vera_data0
lda #$0f
sta vera_data0
;popular layer 0: palette as reverse spaces
stz vera_ctrl
lda #($10 | ^vram_layer0_map)
sta vera_addr_bank
lda #>vram_layer0_map
sta vera_addr_high
stz vera_addr_low
lda #(reverse | space)
ldx #0
ldy #16
@pal_loop:
sta vera_data0 ;screen code: reversed space (all foreground)
stx vera_data0 ;color index
inx
beq @check_keyboard
dey
bne @pal_loop
inc vera_addr_high
stz vera_addr_low
ldy #16
bra @pal_loop
@check_keyboard:
;poll keyboard for input
jsr getin
cmp #0
beq @check_keyboard
cmp #zero_char
bmi @check_keyboard
cmp #(nine_char+1)
bpl @check_c
jsr set_color
bra @check_keyboard
@check_c:
cmp #c_char
bne @check_i
jsr toggle_color1
bra @check_keyboard
@check_i:
cmp #i_char
bne @check_jump
jsr zoom_in
bra @check_keyboard
@check_jump:
cmp #o_char
bmi @check_keyboard
cmp #(t_char + 1)
bpl @check_keyboard
sec
sbc #o_char
asl ; A = (char code - '0') * 2
tax
jmp (@jump_table,x)
@jump_table:
dw @zoom_out ;O
dw @toggle_layer0 ;P
dw @return ;Q
dw @toggle_charset ;R
dw @make_smile ;S
dw @toggle_layer1 ;T
@zoom_out:
jsr zoom_out
bra @check_keyboard
@toggle_layer0:
jsr toggle_layer0
bra @check_keyboard
@toggle_layer1:
jsr toggle_layer1
bra @check_keyboard
@toggle_charset:
jsr toggle_charset
bra @check_keyboard
@make_smile:
jsr make_smile
bra @check_keyboard
@return:
rts
;'0'-'9' in A
set_color:
cmp #zero_char
beq @set_background
cmp #six_char
bpl @set_background
bra @set_foreground
@set_background:
asl
asl
asl
asl
tay
lda text_colors
and #$0f
@set_colors:
sta text_colors
tya
ora text_colors
sta text_colors
tay ; Y = text colors
bra @start
@set_foreground:
and #$0f
tay
lda text_colors
and #$f0
bra @set_colors
@start:
stz vera_ctrl
lda #($20 | ^vram_layer1_map) ; stride = 2
sta vera_addr_bank
lda #>vram_layer1_map
sta vera_addr_high
lda #(<vram_layer1_map + 1) ;start with second byte of map
sta vera_addr_low
ldx #0
@loop:
sty vera_data0
inx
bne @loop ;do 256 iters (2 rows)
rts
zoom_in:
lda vera_dc_hscale
cmp #1 ;max zoom
beq @return
lsr vera_dc_hscale
lsr vera_dc_vscale
@return:
rts
zoom_out:
lda vera_dc_hscale
cmp #128 ;zoom level = 100%
beq @return
asl vera_dc_hscale
asl vera_dc_vscale
@return:
rts
toggle_color1:
stz vera_ctrl
lda #^vram_palette
sta vera_addr_bank
lda #>vram_palette
sta vera_addr_high
lda #<(vram_palette+2) ;third byte of palette
sta vera_addr_low
lda vera_data0 ;low byte (green, blue)
eor #$ff
sta vera_data0 ;invert blue, green
inc vera_addr_low ;fourht byte of palette
lda vera_data0 ;high byte (-, red)
eor #$0f
sta vera_data0
rts
toggle_layer0:
lda vera_dc_video
eor #$10
sta vera_dc_video ;toggle "layer 0 enable" bit
rts
toggle_layer1:
lda vera_dc_video
eor #$20
sta vera_dc_video ;toggle "layer 1 enable" bit
rts
toggle_charset:
lda vera_l1_tilebase
cmp #(vram_petscii >> 9)
beq @set_lower
lda #(vram_petscii >> 9)
bra @set
@set_lower:
lda #(vram_lowerchars >> 9)
@set:
sta vera_l1_tilebase
rts
make_smile:
stz vera_ctrl
lda #($10 | ^vram_petscii) ;stride = 1
sta vera_addr_bank
lda #>vram_petscii
sta vera_addr_high
stz vera_addr_low ;screen code 0 = '@'
ldx #0
@loop:
lda smile, x
sta vera_data0
inx
cpx #8
bne @loop
rts
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment