;;; -*- Mode: asm; indent-tabs-mode: t; tab-width: 8 -*- ;; petski: https://www.c64-wiki.com/wiki/File:ASCII-Codes.gif ;;https://www.c64-wiki.com/wiki/Character_set ;; Takes in a PETSKI-code in CODE ;; And prints it ON X_pos, Y_pos ;; Note that this is the real positions divided by 8 .proc char_draw; user-procedure :clobbers (A Y) :clobbers-arguments (0 3) Character_generator_ROM = $D000 Y_pos_offset = $F9 ; 16-bit value (uses F8), reuses from Y_pos X_pos_offset = $FA ; 16-bit value (uses F7) X_pos = $FA Y_pos = $F9 charset = $FB code = $FE petski_position = $FE ; 16-bit value (uses FF),reuses code:s memory screen_position = $FC ; 16-bit value (uses FD) ;#### TEMP INIT DATA #### LDA #$10 STA code LDA #04 STA X_pos LDA #02 STA Y_pos ;;Do arithimatic to know where to read and write bytes. initial: ;We first need to clear some memory LDA #$00 STA petski_position + 1 STA Y_pos_offset + 1 STA X_pos_offset + 1 ;;We need the relative offset for bytes to read and write. ;; This is code *8 because 8byte is one character ;; *8 = 2*2*2 ASL code ;Will never owerflow, therefore 8byte Mult_16 petski_position, petski_position + 1 Mult_16 petski_position, petski_position + 1 ;; Add starting position Add_16 petski_position, petski_position + 1, #Character_generator_ROM, ! ;;Calculate screen_position to use Mov_16 screen_position, screen_position + 1, #VIC_bank ;; Add the X_pos has a offset multiplier of *8 because 1 chunk = 8 addresses ;; *8 Mult_16 X_pos_offset, X_pos_offset + 1 Mult_16 X_pos_offset, X_pos_offset + 1 Mult_16 X_pos_offset, X_pos_offset + 1 ;; Add Add_16 screen_position, screen_position + 1, X_pos, #$00, ! ;; And Y_pos has a offset multiplier of "screen length" = 320 = (2*2 +1)*2^6 ;;Y_pos*2*2 +1 |Lets reuse X_pos for storage LDA Y_pos STA X_pos Mult_16 Y_pos_offset, Y_pos_offset + 1 Mult_16 Y_pos_offset, Y_pos_offset + 1 Add_16 Y_pos_offset, Y_pos_offset + 1, X_pos, #$00, ! ;; *2^6 Mult_16 Y_pos_offset, Y_pos_offset + 1 Mult_16 Y_pos_offset, Y_pos_offset + 1 Mult_16 Y_pos_offset, Y_pos_offset + 1 Mult_16 Y_pos_offset, Y_pos_offset + 1 Mult_16 Y_pos_offset, Y_pos_offset + 1 Mult_16 Y_pos_offset, Y_pos_offset + 1 ;; Add Add_16 screen_position, screen_position + 1, Y_pos_offset, Y_pos_offset + 1, ! initial_end: ;; One character is 8 byte, move these bytes to screen LDY #$07 @loop: LDA (petski_position), Y STA (screen_position), Y DEY BNE @loop LDA (petski_position), Y STA (screen_position), Y RTS .endproc