c64-livecoding/wip-hugo/routines/text/char_draw.s
2025-05-02 22:36:27 +02:00

75 lines
2.6 KiB
ArmAsm

;;; -*- Mode: asm; indent-tabs-mode: t; tab-width: 8 -*-
;; petscii: https://www.c64-wiki.com/wiki/File:ASCII-Codes.gif
;;https://www.c64-wiki.com/wiki/Character_set
;; Takes in a PETSCII-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)
.include "char.inc"
;#### 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 , #>Character_generator_ROM, !
;;Calculate screen_position to use
Mov_16 screen_position, screen_position + 1, #<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 + 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