From da96e23cc74b2160c0ec0288b3f99a286644d509 Mon Sep 17 00:00:00 2001 From: Mattias Hansson Date: Fri, 2 Jan 2026 16:16:05 +0100 Subject: [PATCH] Cleaned up ZP usage. --- carddeck.c65 | 10 +++++----- cardgame.c65 | 5 ++++- cardmoves.c65 | 38 +++++++++++++++++++------------------- cardrender.c65 | 22 +++++++++++----------- gameloop.c65 | 17 ++++++++--------- utils.c65 | 14 +++++++++++--- 6 files changed, 58 insertions(+), 48 deletions(-) diff --git a/carddeck.c65 b/carddeck.c65 index bb3794f..53d26ca 100644 --- a/carddeck.c65 +++ b/carddeck.c65 @@ -95,7 +95,7 @@ FEND // Tab0=1, Tab1=2, Tab2=3, Tab3=4, Tab4=5, Tab5=6, Tab6=7 cards // Top card of each tableau is face up FUNC deal_tableaus - WORD ptr @ $fc + WORD ptr POINTER ptr -> pile_tab0 deal_to_tableau(ptr, 1) @@ -121,7 +121,7 @@ FEND // Clear the seen array FUNC validate_clear_seen - WORD ptr @ $fa + WORD ptr @ $86 POINTER ptr -> validate_seen BYTE i FOR i = 0 TO 51 @@ -131,8 +131,8 @@ FEND // Check cards in a pile, mark as seen // Returns 0 if OK, 1 if duplicate found -FUNC validate_pile({WORD pile_ptr @ $fa} out:{BYTE result}) - WORD seen_ptr @ $fc +FUNC validate_pile({WORD pile_ptr @ $a2} out:{BYTE result}) + WORD seen_ptr @ $b2 POINTER seen_ptr -> validate_seen BYTE count @@ -166,7 +166,7 @@ FEND // Validate entire deck across all piles // Returns: 0=OK, 1=duplicate, 2=missing FUNC validate_deck(out:{BYTE result}) - WORD ptr @ $fa + WORD ptr @ $98 WORD seen_ptr @ $fc BYTE pile_result BYTE i diff --git a/cardgame.c65 b/cardgame.c65 index 8734b6d..fe9896a 100644 --- a/cardgame.c65 +++ b/cardgame.c65 @@ -36,11 +36,14 @@ FUNC main sei ENDASM + // Save zero page for potential kernal operations later + save_zeropage() + // Initialize game state #IFNDEF TEST_GAMES // Normal game: random shuffle and deal // Seed RNG with multiple entropy sources for better randomness - WORD timer_seed @ $fa + WORD timer_seed BYTE raster @ $d012 BYTE extra_entropy BYTE warmup diff --git a/cardmoves.c65 b/cardmoves.c65 index 99cb002..091ca78 100644 --- a/cardmoves.c65 +++ b/cardmoves.c65 @@ -31,8 +31,8 @@ FUNC card_color({BYTE card_id} out:{BYTE color}) FEND // Get top card from pile (returns card with facedown bit, or PILE_END if empty) -// Uses $fa - for source pile operations -FUNC pile_top_card({WORD pile_ptr @ $fa} out:{BYTE card}) +// Uses $ac - for source pile operations +FUNC pile_top_card({WORD pile_ptr @ $ac} out:{BYTE card}) BYTE count count = PEEK pile_ptr[0] IF count == 0 @@ -43,8 +43,8 @@ FUNC pile_top_card({WORD pile_ptr @ $fa} out:{BYTE card}) FEND // Remove top card from pile (returns the card, updates count) -// Uses $fa - for source pile operations -FUNC pile_pop({WORD pile_ptr @ $fa} out:{BYTE card}) +// Uses $9a - for source pile operations +FUNC pile_pop({WORD pile_ptr @ $9a} out:{BYTE card}) BYTE count count = PEEK pile_ptr[0] card = PEEK pile_ptr[count] @@ -63,8 +63,8 @@ FUNC pile_push({WORD pile_ptr @ $fc} {BYTE card}) FEND // Flip top card face-up if it's face-down -// Uses $fa - for source pile operations -FUNC pile_flip_top({WORD pile_ptr @ $fa}) +// Uses $9e - for source pile operations +FUNC pile_flip_top({WORD pile_ptr @ $9e}) BYTE count BYTE card BYTE is_facedown @@ -165,10 +165,10 @@ FEND // Stock to Waste: Draw cards from stock to waste // draw_count = 1 or 3 depending on game variant -// Stock is source @ $fa, Waste is destination @ $fc +// Stock is source @ $94, Waste is destination FUNC move_stock_to_waste({BYTE draw_count} out:{BYTE success}) - WORD stock_ptr @ $fa - WORD waste_ptr @ $fc + WORD stock_ptr @ $94 + WORD waste_ptr POINTER stock_ptr -> pile_stock POINTER waste_ptr -> pile_waste BYTE stock_count @@ -196,10 +196,10 @@ FUNC move_stock_to_waste({BYTE draw_count} out:{BYTE success}) FEND // Reset Stock: Flip waste back to stock (all face-down) -// Waste is source @ $fa, Stock is destination @ $fc +// Waste is source @ $9c, Stock is destination FUNC move_reset_stock(out:{BYTE success}) - WORD waste_ptr @ $fa - WORD stock_ptr @ $fc + WORD waste_ptr @ $9c + WORD stock_ptr POINTER waste_ptr -> pile_waste POINTER stock_ptr -> pile_stock BYTE waste_count @@ -223,8 +223,8 @@ FUNC move_reset_stock(out:{BYTE success}) FEND // Waste to Tableau -FUNC move_waste_to_tab({WORD tab_ptr @ $fc} out:{BYTE success}) - WORD waste_ptr @ $fa +FUNC move_waste_to_tab({WORD tab_ptr} out:{BYTE success}) + WORD waste_ptr @ $8c POINTER waste_ptr -> pile_waste BYTE card BYTE valid @@ -248,8 +248,8 @@ FUNC move_waste_to_tab({WORD tab_ptr @ $fc} out:{BYTE success}) FEND // Waste to Foundation -FUNC move_waste_to_found({WORD found_ptr @ $fc} out:{BYTE success}) - WORD waste_ptr @ $fa +FUNC move_waste_to_found({WORD found_ptr} out:{BYTE success}) + WORD waste_ptr @ $aa POINTER waste_ptr -> pile_waste BYTE card BYTE valid @@ -273,7 +273,7 @@ FUNC move_waste_to_found({WORD found_ptr @ $fc} out:{BYTE success}) FEND // Tableau to Foundation (top card only) -FUNC move_tab_to_found({WORD tab_ptr @ $fa} {WORD found_ptr @ $fc} out:{BYTE success}) +FUNC move_tab_to_found({WORD tab_ptr @ $8e} {WORD found_ptr} out:{BYTE success}) BYTE card BYTE valid BYTE is_facedown @@ -305,7 +305,7 @@ FUNC move_tab_to_found({WORD tab_ptr @ $fa} {WORD found_ptr @ $fc} out:{BYTE suc FEND // Tableau to Tableau: Move card_count cards from src to dst -FUNC move_tab_to_tab({WORD src_ptr @ $fa} {WORD dst_ptr @ $fc} {BYTE card_count} out:{BYTE success}) +FUNC move_tab_to_tab({WORD src_ptr @ $b0} {WORD dst_ptr} {BYTE card_count} out:{BYTE success}) BYTE src_count BYTE start_idx BYTE bottom_card @@ -358,7 +358,7 @@ FUNC move_tab_to_tab({WORD src_ptr @ $fa} {WORD dst_ptr @ $fc} {BYTE card_count} FEND // Foundation to Tableau (optional rule - some variants allow this) -FUNC move_found_to_tab({WORD found_ptr @ $fa} {WORD tab_ptr @ $fc} out:{BYTE success}) +FUNC move_found_to_tab({WORD found_ptr @ $84} {WORD tab_ptr} out:{BYTE success}) BYTE card BYTE valid diff --git a/cardrender.c65 b/cardrender.c65 index be9928f..1dcd535 100644 --- a/cardrender.c65 +++ b/cardrender.c65 @@ -67,7 +67,7 @@ FUNC render_card({WORD screen_address} {WORD offset} {BYTE card_id}) card_id_to_suit_rank(card_id, card_suit, card_rank) // Get rank charcode - WORD card_charcode_map_ptr @ $fa + WORD card_charcode_map_ptr @ $a0 POINTER card_charcode_map_ptr -> card_charcode_map BYTE card_rank_charcode @@ -79,14 +79,14 @@ FUNC render_card({WORD screen_address} {WORD offset} {BYTE card_id}) ENDIF // Get suit charcode - WORD card_suit_charcode_map_ptr @ $fa + WORD card_suit_charcode_map_ptr @ $a0 POINTER card_suit_charcode_map_ptr -> card_suit_charcode_map BYTE suit_charcode suit_charcode = PEEK card_suit_charcode_map_ptr[card_suit] - WORD p2 @ $fa + WORD p2 @ $a0 SWITCH card_suit CASE CARD_SUIT_HEARTS POINTER p2 -> suit_graphic_hearts @@ -291,7 +291,7 @@ FUNC render_card_body_partial({WORD screen_address} {WORD offset} {BYTE card_id} card_id_to_suit_rank(card_id, card_suit, card_rank) // Get rank charcode - WORD card_charcode_map_ptr @ $fa + WORD card_charcode_map_ptr @ $96 POINTER card_charcode_map_ptr -> card_charcode_map BYTE card_rank_charcode @@ -303,7 +303,7 @@ FUNC render_card_body_partial({WORD screen_address} {WORD offset} {BYTE card_id} ENDIF // Get suit charcode - WORD card_suit_charcode_map_ptr @ $fa + WORD card_suit_charcode_map_ptr @ $96 POINTER card_suit_charcode_map_ptr -> card_suit_charcode_map BYTE suit_charcode @@ -329,7 +329,7 @@ FUNC render_card_body_full({WORD screen_address} {WORD offset} {BYTE card_id}) card_id_to_suit_rank(card_id, card_suit, card_rank) // Get rank charcode - WORD card_charcode_map_ptr @ $fa + WORD card_charcode_map_ptr @ $90 POINTER card_charcode_map_ptr -> card_charcode_map BYTE card_rank_charcode @@ -341,14 +341,14 @@ FUNC render_card_body_full({WORD screen_address} {WORD offset} {BYTE card_id}) ENDIF // Get suit charcode - WORD card_suit_charcode_map_ptr @ $fa + WORD card_suit_charcode_map_ptr @ $90 POINTER card_suit_charcode_map_ptr -> card_suit_charcode_map BYTE suit_charcode suit_charcode = PEEK card_suit_charcode_map_ptr[card_suit] // Get suit graphic pointer - WORD p2 @ $fa + WORD p2 @ $90 SWITCH card_suit CASE CARD_SUIT_HEARTS POINTER p2 -> suit_graphic_hearts @@ -810,7 +810,7 @@ FUNC render_card_left_edge({WORD screen_address} {WORD offset} {BYTE card_id}) card_id_to_suit_rank(card_id, card_suit, card_rank) // Get rank charcode - WORD card_charcode_map_ptr @ $fa + WORD card_charcode_map_ptr @ $a6 POINTER card_charcode_map_ptr -> card_charcode_map BYTE card_rank_charcode @@ -822,14 +822,14 @@ FUNC render_card_left_edge({WORD screen_address} {WORD offset} {BYTE card_id}) ENDIF // Get suit charcode - WORD card_suit_charcode_map_ptr @ $fa + WORD card_suit_charcode_map_ptr @ $a6 POINTER card_suit_charcode_map_ptr -> card_suit_charcode_map BYTE suit_charcode suit_charcode = PEEK card_suit_charcode_map_ptr[card_suit] // Get suit graphic pointer - WORD p2 @ $fa + WORD p2 @ $a6 SWITCH card_suit CASE CARD_SUIT_HEARTS POINTER p2 -> suit_graphic_hearts diff --git a/gameloop.c65 b/gameloop.c65 index b8c21ae..cc0baf5 100644 --- a/gameloop.c65 +++ b/gameloop.c65 @@ -236,7 +236,7 @@ FEND // Convert pile ID to pile data pointer // ============================================================================ FUNC pile_id_to_pointer({BYTE pile_id} out:{WORD pile_ptr}) - WORD ptr @ $fa + WORD ptr SWITCH pile_id CASE PILE_ID_STOCK @@ -386,7 +386,7 @@ FEND // Returns card_id (0-51) and valid flag (1=valid, 0=no selection) // ============================================================================ FUNC get_selected_card_info(out:{BYTE card_id} out:{BYTE valid}) - WORD pile_ptr @ $fa + WORD pile_ptr @ $80 BYTE pile_count BYTE card_index BYTE card @@ -534,7 +534,7 @@ FEND // Clears the area first to remove artifacts from previous render // ============================================================================ FUNC render_pile_by_id({BYTE pile_id}) - WORD pile_ptr @ $fa + WORD pile_ptr @ $92 WORD screen_offset pile_id_to_pointer(pile_id, pile_ptr) @@ -599,7 +599,7 @@ FEND // Returns 1 if won, 0 otherwise // ============================================================================ FUNC check_win_condition(out:{BYTE is_won}) - WORD ptr @ $fa + WORD ptr @ $a4 BYTE count is_won = 1 // Assume won, set to 0 if any foundation incomplete @@ -650,7 +650,8 @@ FUNC handle_click_on_pile({BYTE clicked_pile} {BYTE click_row}) BYTE success WORD src_ptr WORD dst_ptr - WORD tab_ptr @ $f8 + //WORD tab_ptr @ $f8 + WORD tab_ptr BYTE tab_col BYTE tab_index BYTE j @@ -684,8 +685,6 @@ FUNC handle_click_on_pile({BYTE clicked_pile} {BYTE click_row}) IF clicked_pile == PILE_ID_STOCK // Stock: draw cards - WORD stock_ptr @ $fa - POINTER stock_ptr -> pile_stock move_stock_to_waste(game_draw_mode, success) IF success render_pile_by_id(PILE_ID_STOCK) @@ -820,9 +819,9 @@ FUNC game_loop BYTE button_state BYTE clicked BYTE is_won - WORD src_ptr @ $fa + WORD src_ptr @ $8a WORD src_end_ptr - WORD dst_ptr @ $fc + WORD dst_ptr // Copy sprite data to $2200 (sprite block 136) // $2000-$21FF reserved for charset diff --git a/utils.c65 b/utils.c65 index 182a4d1..9935784 100644 --- a/utils.c65 +++ b/utils.c65 @@ -4,14 +4,14 @@ GOTO __skip_lib_utils -FUNC fill_mem({WORD start_addr @ $fa} {WORD end_addr} {BYTE value}) +FUNC fill_mem({WORD start_addr @ $fb} {WORD end_addr} {BYTE value}) FOR start_addr = start_addr TO end_addr POKE start_addr , value NEXT FEND -FUNC mem_copy({WORD start_addr @ $fa} {WORD end_addr} {WORD target_addr @ $fc}) +FUNC mem_copy({WORD start_addr @ $fb} {WORD end_addr} {WORD target_addr @ $fd}) BYTE value FOR start_addr = start_addr TO end_addr @@ -22,7 +22,7 @@ FUNC mem_copy({WORD start_addr @ $fa} {WORD end_addr} {WORD target_addr @ $fc}) FEND -FUNC mem_copy_range({WORD start_addr @ $fa} {WORD target_addr @ $fc} {WORD range}) +FUNC mem_copy_range({WORD start_addr @ $fb} {WORD target_addr @ $fd} {WORD range}) BYTE value WHILE range @@ -137,6 +137,14 @@ FUNC wait_key WEND FEND +FUNC save_zeropage + mem_copy_range($0000, $cf00, 256) +FEND + +FUNC restore_zeropage + mem_copy_range($cf00, $0000, 256) +FEND + LABEL __skip_lib_utils #IFEND