124 lines
2.5 KiB
NASM
124 lines
2.5 KiB
NASM
|
; .setcpu "65C02"
|
||
|
.include "./macro.inc"
|
||
|
|
||
|
; okay so rn i wanna set up a very basic system init, and write a few subroutines to draw characters at x,y coordinates
|
||
|
n = $01 ; temporary storage for data stack operations
|
||
|
|
||
|
key_row = $200 ; used for character lookup when key pressed
|
||
|
key_col = $201
|
||
|
cursor = $202
|
||
|
|
||
|
char_buffer = $300 ; 256 byte character buffer
|
||
|
|
||
|
kb_row = $4400 ; keyboard hardware register
|
||
|
kb_row_cache = $203 ; cache
|
||
|
|
||
|
.org $8000
|
||
|
|
||
|
reset:
|
||
|
sei
|
||
|
ldx #0; initialize data stack pointer
|
||
|
|
||
|
; initdisplay:
|
||
|
; lda #0
|
||
|
; ldy #0
|
||
|
|
||
|
; cleardisplay:
|
||
|
; sta $6000,y
|
||
|
; sta $6100,y
|
||
|
; sta $6200,y
|
||
|
; sta $6300,y
|
||
|
; sta $6400,y
|
||
|
; sta $6500,y
|
||
|
; sta $6600,y
|
||
|
; sta $6700,y ; this goes slightly over but it's fine
|
||
|
; iny
|
||
|
; bne cleardisplay
|
||
|
; cli
|
||
|
|
||
|
main:
|
||
|
jsr draw
|
||
|
jmp main
|
||
|
|
||
|
draw:
|
||
|
char = $200
|
||
|
x = $201
|
||
|
y = $202
|
||
|
.y_loop:
|
||
|
.x_loop:
|
||
|
inc char
|
||
|
lda x
|
||
|
push
|
||
|
sta 0, x
|
||
|
stz 1, x
|
||
|
lda y
|
||
|
push
|
||
|
sta 0, x
|
||
|
sta 1, x
|
||
|
lda char
|
||
|
push
|
||
|
sta 0, x
|
||
|
sta 1, x
|
||
|
jsr draw_char
|
||
|
inc x
|
||
|
lda #64
|
||
|
cmp x
|
||
|
bne .x_loop
|
||
|
inc y
|
||
|
lda #30
|
||
|
cmp y
|
||
|
bne .y_loop
|
||
|
.end:
|
||
|
rts
|
||
|
|
||
|
draw_char: ; draw a character c at (x, y) (n1: x n2: y n3: c -- )
|
||
|
lda 0, x ; load a with character to draw
|
||
|
pop ; and pop it off the stack
|
||
|
jsr get_char_address ; calculate where to put the character in memory
|
||
|
sta (0, x) ; store a at the address pointed to on the stack
|
||
|
rts
|
||
|
|
||
|
get_char_address: ; gets vram address for a character at (x, y),
|
||
|
; (n1: x n2: y -- n: $6000 + x + (64 * y))
|
||
|
;jsr push_lit ; push 64 onto stack, low byte first
|
||
|
;.byte 64
|
||
|
;.byte 0
|
||
|
pha
|
||
|
lda #64
|
||
|
push ; doing this instead until `push_lit` is fixed
|
||
|
sta 0, x
|
||
|
stz 1, x
|
||
|
jsr mult ; multiply 64 with y (n2)
|
||
|
jsr plus ; add result with x (n1)
|
||
|
|
||
|
;jsr push_lit ; push vram address onto the stack
|
||
|
;.byte $00
|
||
|
;.byte $60
|
||
|
lda #$60
|
||
|
push
|
||
|
sta 1, x
|
||
|
stz 0, x
|
||
|
jsr plus ; add vram start address to result
|
||
|
|
||
|
pla
|
||
|
rts
|
||
|
|
||
|
fill: ; fills an area from (x1, y1) to (x2, y2) will character c, (n1: c n2: x1 n3: y1 n4: x2 n5: y2 -- )
|
||
|
jsr get_char_address
|
||
|
|
||
|
isr: ; interrupt service routine
|
||
|
pha
|
||
|
phx
|
||
|
phy
|
||
|
; jsr keyboard
|
||
|
ply
|
||
|
plx
|
||
|
pla
|
||
|
rti
|
||
|
|
||
|
.include "math.inc"
|
||
|
|
||
|
.org $fffc
|
||
|
.word reset
|
||
|
.word isr
|