155 lines
3.5 KiB
Text
155 lines
3.5 KiB
Text
#INCLUDE <c64start.c65>
|
|
#INCLUDE <c64defs.c65>
|
|
|
|
//#DEFINE MOUSE_NO_SMOOTHING 1
|
|
|
|
// Enable test game setups (comment out for release build)
|
|
//#DEFINE TEST_GAMES 1
|
|
|
|
GOTO start
|
|
|
|
ASM
|
|
*=$3000
|
|
ENDASM
|
|
|
|
#INCLUDE "utils.c65"
|
|
#INCLUDE "cardconsts.c65"
|
|
#INCLUDE "piles.c65"
|
|
#INCLUDE "random.c65"
|
|
#INCLUDE "carddeck.c65"
|
|
#INCLUDE "cardrender.c65"
|
|
//#INCLUDE "cardtests.c65"
|
|
#INCLUDE "joystick.c65"
|
|
#INCLUDE "mouse.c65"
|
|
#INCLUDE "pointer.c65"
|
|
//#INCLUDE "joysticktests.c65"
|
|
#IFDEF TEST_GAMES
|
|
#INCLUDE "testgames.c65"
|
|
#IFEND
|
|
#INCLUDE "gameloop.c65"
|
|
|
|
|
|
FUNC main
|
|
|
|
|
|
ASM
|
|
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
|
|
BYTE raster @ $d012
|
|
BYTE extra_entropy
|
|
BYTE warmup
|
|
|
|
// Combine CIA timer with raster position
|
|
timer_seed = PEEKW $DC04
|
|
extra_entropy = raster
|
|
timer_seed = timer_seed ^ extra_entropy
|
|
rand_seed(timer_seed)
|
|
|
|
// Warm up RNG by advancing it based on timer low byte
|
|
extra_entropy = PEEK $DC04
|
|
FOR warmup = 0 TO extra_entropy
|
|
rand(extra_entropy)
|
|
NEXT
|
|
|
|
stock_init()
|
|
stock_shuffle()
|
|
deal_tableaus()
|
|
#IFEND
|
|
|
|
BYTE validation_result
|
|
validate_deck(validation_result)
|
|
IF validation_result
|
|
POKE $d020 , color_red
|
|
ENDIF
|
|
|
|
set_vic_bank(0) // $0000 - $3fff
|
|
set_vic_screenmem(1) // $400
|
|
set_vic_charmem(4) // $2000
|
|
set_vic_ecm()
|
|
|
|
|
|
WORD charset_ptr
|
|
WORD charset_end_ptr
|
|
POINTER charset_ptr -> card_charset
|
|
POINTER charset_end_ptr -> card_charset_end
|
|
mem_copy(charset_ptr, charset_end_ptr, $2000)
|
|
//mem_copy_range(charset_ptr, $2000, 512)
|
|
|
|
fill_mem($d800, $d800+999, color_white) // Fill color mem
|
|
POKE $d020 , color_white //color_grey
|
|
POKE $d021 , color_black
|
|
POKE $d022 , color_red
|
|
POKE $d023 , color_light_grey
|
|
POKE $d024 , color_dark_grey
|
|
|
|
|
|
//show_charset()
|
|
|
|
fill_mem($0400, $0400+999, 0)
|
|
|
|
//render_card($0400, $30, 0) // Ace of Hearts
|
|
//render_card($0400, $35, 27) // 2 of Spades
|
|
//render_card($0400, $3a, 15) // 3 of Diamonds
|
|
|
|
|
|
//render_all_cards_test()
|
|
//render_facedown_test()
|
|
//render_faceup_stack_test()
|
|
//render_tableaus_test()
|
|
//render_midgame_test()
|
|
//render_card_back($0400, 35) // Test card back at column 35
|
|
//render_empty_pile($0400, 8*40+35) // Test empty pile below card back
|
|
//render_foundation_test()
|
|
//render_waste_test()
|
|
//render_all_piles_test()
|
|
|
|
// Move tests - runs multiple tests, press key between each
|
|
//test_stock_to_waste_draw1() // Draw 1 card x3 from stock
|
|
//wait_key()
|
|
//fill_mem($0400, $0400+999, 0)
|
|
//test_waste_to_tab_valid() // Move card from waste to tableau
|
|
//wait_key()
|
|
//fill_mem($0400, $0400+999, 0)
|
|
//test_tab_to_found() // Tableau to foundation + auto-flip
|
|
//wait_key()
|
|
//fill_mem($0400, $0400+999, 0)
|
|
//test_tab_to_tab_stack() // Move stack of 3 cards + auto-flip
|
|
|
|
// Joystick tests
|
|
//test_joystick_read() // Test joystick input reading - suit symbols
|
|
//fill_mem($0400, $0400+999, 0)
|
|
//test_pointer_sprite() // Test sprite pointer with joystick
|
|
//fill_mem($0400, $0400+999, 0)
|
|
//test_pointer_manual() // Test sprite pointer manual movement
|
|
|
|
// Mouse test
|
|
//test_pointer_mouse() // Test sprite pointer with 1351 mouse
|
|
|
|
// Start the game!
|
|
game_init()
|
|
game_loop() // Never returns
|
|
|
|
|
|
FEND
|
|
|
|
|
|
LABEL start
|
|
|
|
|
|
main()
|
|
|
|
|
|
LABEL card_charset
|
|
ASM
|
|
!binary "charpad_cards/charpad_cards7.bin"
|
|
ENDASM
|
|
LABEL card_charset_end
|