Created
October 30, 2023 04:43
-
-
Save keyboardspecialist/513cc1038861868a52a31428b7922b86 to your computer and use it in GitHub Desktop.
Lesson9 VERA
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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