From c2e89a5487538e8e447fec6bf898c3892eccf629 Mon Sep 17 00:00:00 2001 From: hugova Date: Sun, 11 May 2025 22:23:08 +0200 Subject: [PATCH] make char.s use ARGVEC --- wip-hugo/routines/text/char.inc | 31 +++++++++++------ wip-hugo/routines/text/char_draw.s | 45 ++++++++++++------------- wip-hugo/routines/text/char_draw_test.s | 1 - wip-hugo/source.s | 4 ++- 4 files changed, 45 insertions(+), 36 deletions(-) diff --git a/wip-hugo/routines/text/char.inc b/wip-hugo/routines/text/char.inc index bf346d5..8c19794 100644 --- a/wip-hugo/routines/text/char.inc +++ b/wip-hugo/routines/text/char.inc @@ -1,11 +1,20 @@ - 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) - ;; copy - VIC_bank = $4000 + ;; public args + X_pos = ARGVEC + 0 + Y_pos = ARGVEC + 1 + code = ARGVEC + 2 + + ;; private variables + screen_position = $EE ; 16-bit value (uses EF) + ;; 16-bit value, we reuse bytes from X_pos + X_pos_offset_hi = $ED + X_pos_offset_lo = X_pos + ;; 16-bit value, we reuse bytes from Y_pos + Y_pos_offset_hi = $EC + Y_pos_offset_lo = Y_pos + ;; 16-bit value, we reuse bytes from code + petski_position_lo = code + petski_position_hi = code + 1 # this clobers the ARGVEK space ik but it's faster. CURSED AF + + ;; values + VIC_bank = $4000 + Character_generator_ROM = $D000 diff --git a/wip-hugo/routines/text/char_draw.s b/wip-hugo/routines/text/char_draw.s index 3f959a0..d8aff20 100644 --- a/wip-hugo/routines/text/char_draw.s +++ b/wip-hugo/routines/text/char_draw.s @@ -4,7 +4,7 @@ ;; 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) +.proc char_draw; user-procedure :clobbers (A Y) :clobbers-arguments 4 .include "char.inc" ;#### TEMP INIT DATA #### @@ -19,27 +19,27 @@ initial: ;We first need to clear some memory LDA #$00 - STA petski_position + 1 - STA Y_pos_offset + 1 - STA X_pos_offset + 1 + STA petski_position_hi + STA Y_pos_offset_hi + STA X_pos_offset_hi ;;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 + Mult_16 petski_position_lo, petski_position_hi + Mult_16 petski_position_lo, petski_position_hi ;; Add starting position - Add_16 petski_position, petski_position + 1, #Character_generator_ROM, ! + Add_16 petski_position_lo, petski_position_hi, #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 + Mult_16 X_pos_offset_lo, X_pos_offset_hi + Mult_16 X_pos_offset_lo, X_pos_offset_hi + Mult_16 X_pos_offset_lo, X_pos_offset_hi ;; Add Add_16 screen_position, screen_position + 1, X_pos, #$00, ! @@ -47,29 +47,28 @@ initial: ;;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, ! + Mult_16 Y_pos_offset_lo, Y_pos_offset_hi + Mult_16 Y_pos_offset_lo, Y_pos_offset_hi + Add_16 Y_pos_offset_lo, Y_pos_offset_hi, 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 + Mult_16 Y_pos_offset_lo, Y_pos_offset_hi + Mult_16 Y_pos_offset_lo, Y_pos_offset_hi + Mult_16 Y_pos_offset_lo, Y_pos_offset_hi + Mult_16 Y_pos_offset_lo, Y_pos_offset_hi + Mult_16 Y_pos_offset_lo, Y_pos_offset_hi + Mult_16 Y_pos_offset_lo, Y_pos_offset_hi ;; Add - Add_16 screen_position, screen_position + 1, Y_pos_offset, Y_pos_offset + 1, ! + Add_16 screen_position, screen_position + 1, Y_pos_offset_lo, Y_pos_offset_hi, ! initial_end: - ;; One character is 8 byte, move these bytes to screen LDY #$07 @loop: - LDA (petski_position), Y + LDA (petski_position_lo), Y STA (screen_position), Y DEY BNE @loop - LDA (petski_position), Y + LDA (petski_position_lo), Y STA (screen_position), Y RTS .endproc diff --git a/wip-hugo/routines/text/char_draw_test.s b/wip-hugo/routines/text/char_draw_test.s index 6b1949b..e27607e 100644 --- a/wip-hugo/routines/text/char_draw_test.s +++ b/wip-hugo/routines/text/char_draw_test.s @@ -2,7 +2,6 @@ .include "char.inc" LDA #$10 STA code - LDA #$10 LDA #04 STA X_pos LDA #02 diff --git a/wip-hugo/source.s b/wip-hugo/source.s index a349a18..5a1ae03 100755 --- a/wip-hugo/source.s +++ b/wip-hugo/source.s @@ -7,7 +7,8 @@ ;;Code to run .include "STARTUP.s" ;.include "dubbel_buffer/raster_irqs.s" -.include "routines/line/line_test.s" +;.include "routines/line/line_test.s" +.include "routines/text/char_draw_test.s" ;.include "routines/memory/memcpy_test.s" ;.include "routines/triangle/triangle_test.s" exit: @@ -16,6 +17,7 @@ JMP exit .include "routines/line/line.s" .include "routines/triangle/triangle.s" .include "routines/pixel/pixel_draw.s" +.include "routines/text/char_draw.s" .include "routines/memory/memset.s" .include "routines/memory/memcpy.s" .include "END.s"