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