Cleaned up ZP usage.
This commit is contained in:
parent
9c723cce1d
commit
da96e23cc7
6 changed files with 58 additions and 48 deletions
10
carddeck.c65
10
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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
17
gameloop.c65
17
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
|
||||
|
|
|
|||
14
utils.c65
14
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
|
||||
|
|
|
|||
Loading…
Reference in a new issue