;;; -*- 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 Character_generator_ROM = $D000 Y_pos_offset = $F9F8 ;Reuses from Y_pos X_pos_offset = $FAF7 X_pos = $FA Y_pos = $F9 charset = $FB code = $FE petski_position = $FEFF ;reuses code:s memory screen_position = $FCFD ;#### 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 STA <Y_pos_offset STA <X_pos_offset ;;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 Mult_16 >petski_position, <petski_position ;; Add starting position Add_16 >petski_position, <petski_position, #<Character_generator_ROM , #>Character_generator_ROM, ! ;;Calculate screen_position to use Mov_16 >screen_position, <screen_position, #<VIC_bank, #>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 Mult_16 >X_pos_offset, <X_pos_offset Mult_16 >X_pos_offset, <X_pos_offset ;; Add Add_16 >screen_position, <screen_position, 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 Mult_16 >Y_pos_offset, <Y_pos_offset Add_16 >Y_pos_offset, <Y_pos_offset, X_pos, #$00, ! ;; *2^6 Mult_16 >Y_pos_offset, <Y_pos_offset Mult_16 >Y_pos_offset, <Y_pos_offset Mult_16 >Y_pos_offset, <Y_pos_offset Mult_16 >Y_pos_offset, <Y_pos_offset Mult_16 >Y_pos_offset, <Y_pos_offset Mult_16 >Y_pos_offset, <Y_pos_offset ;; Add Add_16 >screen_position, <screen_position, >Y_pos_offset, <Y_pos_offset, ! 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