Cleaned up ZP usage.

This commit is contained in:
Mattias Hansson 2026-01-02 16:16:05 +01:00
parent 9c723cce1d
commit da96e23cc7
6 changed files with 58 additions and 48 deletions

View file

@ -95,7 +95,7 @@ FEND
// Tab0=1, Tab1=2, Tab2=3, Tab3=4, Tab4=5, Tab5=6, Tab6=7 cards // Tab0=1, Tab1=2, Tab2=3, Tab3=4, Tab4=5, Tab5=6, Tab6=7 cards
// Top card of each tableau is face up // Top card of each tableau is face up
FUNC deal_tableaus FUNC deal_tableaus
WORD ptr @ $fc WORD ptr
POINTER ptr -> pile_tab0 POINTER ptr -> pile_tab0
deal_to_tableau(ptr, 1) deal_to_tableau(ptr, 1)
@ -121,7 +121,7 @@ FEND
// Clear the seen array // Clear the seen array
FUNC validate_clear_seen FUNC validate_clear_seen
WORD ptr @ $fa WORD ptr @ $86
POINTER ptr -> validate_seen POINTER ptr -> validate_seen
BYTE i BYTE i
FOR i = 0 TO 51 FOR i = 0 TO 51
@ -131,8 +131,8 @@ FEND
// Check cards in a pile, mark as seen // Check cards in a pile, mark as seen
// Returns 0 if OK, 1 if duplicate found // Returns 0 if OK, 1 if duplicate found
FUNC validate_pile({WORD pile_ptr @ $fa} out:{BYTE result}) FUNC validate_pile({WORD pile_ptr @ $a2} out:{BYTE result})
WORD seen_ptr @ $fc WORD seen_ptr @ $b2
POINTER seen_ptr -> validate_seen POINTER seen_ptr -> validate_seen
BYTE count BYTE count
@ -166,7 +166,7 @@ FEND
// Validate entire deck across all piles // Validate entire deck across all piles
// Returns: 0=OK, 1=duplicate, 2=missing // Returns: 0=OK, 1=duplicate, 2=missing
FUNC validate_deck(out:{BYTE result}) FUNC validate_deck(out:{BYTE result})
WORD ptr @ $fa WORD ptr @ $98
WORD seen_ptr @ $fc WORD seen_ptr @ $fc
BYTE pile_result BYTE pile_result
BYTE i BYTE i

View file

@ -36,11 +36,14 @@ FUNC main
sei sei
ENDASM ENDASM
// Save zero page for potential kernal operations later
save_zeropage()
// Initialize game state // Initialize game state
#IFNDEF TEST_GAMES #IFNDEF TEST_GAMES
// Normal game: random shuffle and deal // Normal game: random shuffle and deal
// Seed RNG with multiple entropy sources for better randomness // Seed RNG with multiple entropy sources for better randomness
WORD timer_seed @ $fa WORD timer_seed
BYTE raster @ $d012 BYTE raster @ $d012
BYTE extra_entropy BYTE extra_entropy
BYTE warmup BYTE warmup

View file

@ -31,8 +31,8 @@ FUNC card_color({BYTE card_id} out:{BYTE color})
FEND FEND
// Get top card from pile (returns card with facedown bit, or PILE_END if empty) // Get top card from pile (returns card with facedown bit, or PILE_END if empty)
// Uses $fa - for source pile operations // Uses $ac - for source pile operations
FUNC pile_top_card({WORD pile_ptr @ $fa} out:{BYTE card}) FUNC pile_top_card({WORD pile_ptr @ $ac} out:{BYTE card})
BYTE count BYTE count
count = PEEK pile_ptr[0] count = PEEK pile_ptr[0]
IF count == 0 IF count == 0
@ -43,8 +43,8 @@ FUNC pile_top_card({WORD pile_ptr @ $fa} out:{BYTE card})
FEND FEND
// Remove top card from pile (returns the card, updates count) // Remove top card from pile (returns the card, updates count)
// Uses $fa - for source pile operations // Uses $9a - for source pile operations
FUNC pile_pop({WORD pile_ptr @ $fa} out:{BYTE card}) FUNC pile_pop({WORD pile_ptr @ $9a} out:{BYTE card})
BYTE count BYTE count
count = PEEK pile_ptr[0] count = PEEK pile_ptr[0]
card = PEEK pile_ptr[count] card = PEEK pile_ptr[count]
@ -63,8 +63,8 @@ FUNC pile_push({WORD pile_ptr @ $fc} {BYTE card})
FEND FEND
// Flip top card face-up if it's face-down // Flip top card face-up if it's face-down
// Uses $fa - for source pile operations // Uses $9e - for source pile operations
FUNC pile_flip_top({WORD pile_ptr @ $fa}) FUNC pile_flip_top({WORD pile_ptr @ $9e})
BYTE count BYTE count
BYTE card BYTE card
BYTE is_facedown BYTE is_facedown
@ -165,10 +165,10 @@ FEND
// Stock to Waste: Draw cards from stock to waste // Stock to Waste: Draw cards from stock to waste
// draw_count = 1 or 3 depending on game variant // 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}) FUNC move_stock_to_waste({BYTE draw_count} out:{BYTE success})
WORD stock_ptr @ $fa WORD stock_ptr @ $94
WORD waste_ptr @ $fc WORD waste_ptr
POINTER stock_ptr -> pile_stock POINTER stock_ptr -> pile_stock
POINTER waste_ptr -> pile_waste POINTER waste_ptr -> pile_waste
BYTE stock_count BYTE stock_count
@ -196,10 +196,10 @@ FUNC move_stock_to_waste({BYTE draw_count} out:{BYTE success})
FEND FEND
// Reset Stock: Flip waste back to stock (all face-down) // 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}) FUNC move_reset_stock(out:{BYTE success})
WORD waste_ptr @ $fa WORD waste_ptr @ $9c
WORD stock_ptr @ $fc WORD stock_ptr
POINTER waste_ptr -> pile_waste POINTER waste_ptr -> pile_waste
POINTER stock_ptr -> pile_stock POINTER stock_ptr -> pile_stock
BYTE waste_count BYTE waste_count
@ -223,8 +223,8 @@ FUNC move_reset_stock(out:{BYTE success})
FEND FEND
// Waste to Tableau // Waste to Tableau
FUNC move_waste_to_tab({WORD tab_ptr @ $fc} out:{BYTE success}) FUNC move_waste_to_tab({WORD tab_ptr} out:{BYTE success})
WORD waste_ptr @ $fa WORD waste_ptr @ $8c
POINTER waste_ptr -> pile_waste POINTER waste_ptr -> pile_waste
BYTE card BYTE card
BYTE valid BYTE valid
@ -248,8 +248,8 @@ FUNC move_waste_to_tab({WORD tab_ptr @ $fc} out:{BYTE success})
FEND FEND
// Waste to Foundation // Waste to Foundation
FUNC move_waste_to_found({WORD found_ptr @ $fc} out:{BYTE success}) FUNC move_waste_to_found({WORD found_ptr} out:{BYTE success})
WORD waste_ptr @ $fa WORD waste_ptr @ $aa
POINTER waste_ptr -> pile_waste POINTER waste_ptr -> pile_waste
BYTE card BYTE card
BYTE valid BYTE valid
@ -273,7 +273,7 @@ FUNC move_waste_to_found({WORD found_ptr @ $fc} out:{BYTE success})
FEND FEND
// Tableau to Foundation (top card only) // 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 card
BYTE valid BYTE valid
BYTE is_facedown BYTE is_facedown
@ -305,7 +305,7 @@ FUNC move_tab_to_found({WORD tab_ptr @ $fa} {WORD found_ptr @ $fc} out:{BYTE suc
FEND FEND
// Tableau to Tableau: Move card_count cards from src to dst // 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 src_count
BYTE start_idx BYTE start_idx
BYTE bottom_card BYTE bottom_card
@ -358,7 +358,7 @@ FUNC move_tab_to_tab({WORD src_ptr @ $fa} {WORD dst_ptr @ $fc} {BYTE card_count}
FEND FEND
// Foundation to Tableau (optional rule - some variants allow this) // 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 card
BYTE valid BYTE valid

View file

@ -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) card_id_to_suit_rank(card_id, card_suit, card_rank)
// Get rank charcode // Get rank charcode
WORD card_charcode_map_ptr @ $fa WORD card_charcode_map_ptr @ $a0
POINTER card_charcode_map_ptr -> card_charcode_map POINTER card_charcode_map_ptr -> card_charcode_map
BYTE card_rank_charcode BYTE card_rank_charcode
@ -79,14 +79,14 @@ FUNC render_card({WORD screen_address} {WORD offset} {BYTE card_id})
ENDIF ENDIF
// Get suit charcode // 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 POINTER card_suit_charcode_map_ptr -> card_suit_charcode_map
BYTE suit_charcode BYTE suit_charcode
suit_charcode = PEEK card_suit_charcode_map_ptr[card_suit] suit_charcode = PEEK card_suit_charcode_map_ptr[card_suit]
WORD p2 @ $fa WORD p2 @ $a0
SWITCH card_suit SWITCH card_suit
CASE CARD_SUIT_HEARTS CASE CARD_SUIT_HEARTS
POINTER p2 -> suit_graphic_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) card_id_to_suit_rank(card_id, card_suit, card_rank)
// Get rank charcode // Get rank charcode
WORD card_charcode_map_ptr @ $fa WORD card_charcode_map_ptr @ $96
POINTER card_charcode_map_ptr -> card_charcode_map POINTER card_charcode_map_ptr -> card_charcode_map
BYTE card_rank_charcode BYTE card_rank_charcode
@ -303,7 +303,7 @@ FUNC render_card_body_partial({WORD screen_address} {WORD offset} {BYTE card_id}
ENDIF ENDIF
// Get suit charcode // 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 POINTER card_suit_charcode_map_ptr -> card_suit_charcode_map
BYTE suit_charcode 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) card_id_to_suit_rank(card_id, card_suit, card_rank)
// Get rank charcode // Get rank charcode
WORD card_charcode_map_ptr @ $fa WORD card_charcode_map_ptr @ $90
POINTER card_charcode_map_ptr -> card_charcode_map POINTER card_charcode_map_ptr -> card_charcode_map
BYTE card_rank_charcode BYTE card_rank_charcode
@ -341,14 +341,14 @@ FUNC render_card_body_full({WORD screen_address} {WORD offset} {BYTE card_id})
ENDIF ENDIF
// Get suit charcode // 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 POINTER card_suit_charcode_map_ptr -> card_suit_charcode_map
BYTE suit_charcode BYTE suit_charcode
suit_charcode = PEEK card_suit_charcode_map_ptr[card_suit] suit_charcode = PEEK card_suit_charcode_map_ptr[card_suit]
// Get suit graphic pointer // Get suit graphic pointer
WORD p2 @ $fa WORD p2 @ $90
SWITCH card_suit SWITCH card_suit
CASE CARD_SUIT_HEARTS CASE CARD_SUIT_HEARTS
POINTER p2 -> suit_graphic_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) card_id_to_suit_rank(card_id, card_suit, card_rank)
// Get rank charcode // Get rank charcode
WORD card_charcode_map_ptr @ $fa WORD card_charcode_map_ptr @ $a6
POINTER card_charcode_map_ptr -> card_charcode_map POINTER card_charcode_map_ptr -> card_charcode_map
BYTE card_rank_charcode BYTE card_rank_charcode
@ -822,14 +822,14 @@ FUNC render_card_left_edge({WORD screen_address} {WORD offset} {BYTE card_id})
ENDIF ENDIF
// Get suit charcode // 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 POINTER card_suit_charcode_map_ptr -> card_suit_charcode_map
BYTE suit_charcode BYTE suit_charcode
suit_charcode = PEEK card_suit_charcode_map_ptr[card_suit] suit_charcode = PEEK card_suit_charcode_map_ptr[card_suit]
// Get suit graphic pointer // Get suit graphic pointer
WORD p2 @ $fa WORD p2 @ $a6
SWITCH card_suit SWITCH card_suit
CASE CARD_SUIT_HEARTS CASE CARD_SUIT_HEARTS
POINTER p2 -> suit_graphic_hearts POINTER p2 -> suit_graphic_hearts

View file

@ -236,7 +236,7 @@ FEND
// Convert pile ID to pile data pointer // Convert pile ID to pile data pointer
// ============================================================================ // ============================================================================
FUNC pile_id_to_pointer({BYTE pile_id} out:{WORD pile_ptr}) FUNC pile_id_to_pointer({BYTE pile_id} out:{WORD pile_ptr})
WORD ptr @ $fa WORD ptr
SWITCH pile_id SWITCH pile_id
CASE PILE_ID_STOCK CASE PILE_ID_STOCK
@ -386,7 +386,7 @@ FEND
// Returns card_id (0-51) and valid flag (1=valid, 0=no selection) // 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}) FUNC get_selected_card_info(out:{BYTE card_id} out:{BYTE valid})
WORD pile_ptr @ $fa WORD pile_ptr @ $80
BYTE pile_count BYTE pile_count
BYTE card_index BYTE card_index
BYTE card BYTE card
@ -534,7 +534,7 @@ FEND
// Clears the area first to remove artifacts from previous render // Clears the area first to remove artifacts from previous render
// ============================================================================ // ============================================================================
FUNC render_pile_by_id({BYTE pile_id}) FUNC render_pile_by_id({BYTE pile_id})
WORD pile_ptr @ $fa WORD pile_ptr @ $92
WORD screen_offset WORD screen_offset
pile_id_to_pointer(pile_id, pile_ptr) pile_id_to_pointer(pile_id, pile_ptr)
@ -599,7 +599,7 @@ FEND
// Returns 1 if won, 0 otherwise // Returns 1 if won, 0 otherwise
// ============================================================================ // ============================================================================
FUNC check_win_condition(out:{BYTE is_won}) FUNC check_win_condition(out:{BYTE is_won})
WORD ptr @ $fa WORD ptr @ $a4
BYTE count BYTE count
is_won = 1 // Assume won, set to 0 if any foundation incomplete 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 BYTE success
WORD src_ptr WORD src_ptr
WORD dst_ptr WORD dst_ptr
WORD tab_ptr @ $f8 //WORD tab_ptr @ $f8
WORD tab_ptr
BYTE tab_col BYTE tab_col
BYTE tab_index BYTE tab_index
BYTE j BYTE j
@ -684,8 +685,6 @@ FUNC handle_click_on_pile({BYTE clicked_pile} {BYTE click_row})
IF clicked_pile == PILE_ID_STOCK IF clicked_pile == PILE_ID_STOCK
// Stock: draw cards // Stock: draw cards
WORD stock_ptr @ $fa
POINTER stock_ptr -> pile_stock
move_stock_to_waste(game_draw_mode, success) move_stock_to_waste(game_draw_mode, success)
IF success IF success
render_pile_by_id(PILE_ID_STOCK) render_pile_by_id(PILE_ID_STOCK)
@ -820,9 +819,9 @@ FUNC game_loop
BYTE button_state BYTE button_state
BYTE clicked BYTE clicked
BYTE is_won BYTE is_won
WORD src_ptr @ $fa WORD src_ptr @ $8a
WORD src_end_ptr WORD src_end_ptr
WORD dst_ptr @ $fc WORD dst_ptr
// Copy sprite data to $2200 (sprite block 136) // Copy sprite data to $2200 (sprite block 136)
// $2000-$21FF reserved for charset // $2000-$21FF reserved for charset

View file

@ -4,14 +4,14 @@
GOTO __skip_lib_utils 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 FOR start_addr = start_addr TO end_addr
POKE start_addr , value POKE start_addr , value
NEXT NEXT
FEND 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 BYTE value
FOR start_addr = start_addr TO end_addr 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 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 BYTE value
WHILE range WHILE range
@ -137,6 +137,14 @@ FUNC wait_key
WEND WEND
FEND 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 LABEL __skip_lib_utils
#IFEND #IFEND