; .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