a2d/desk.acc/puzzle.s

1182 lines
36 KiB
ArmAsm
Raw Normal View History

2017-09-11 03:40:32 +00:00
.org $800
.setcpu "65C02"
2017-09-11 03:40:32 +00:00
.include "apple2.inc"
.include "../inc/prodos.inc"
.include "../inc/auxmem.inc"
.include "a2d.inc"
2017-09-12 04:06:37 +00:00
ROMIN2 := $C082
SPKR := $C030
2017-09-11 03:40:32 +00:00
jmp copy2aux
.res 36, 0
2017-09-11 03:40:32 +00:00
;;; ==================================================
;;; Copy the DA to AUX and invoke it
2017-09-11 06:09:33 +00:00
stash_stack: .byte 0
.proc copy2aux
tsx
2017-09-11 03:40:32 +00:00
stx stash_stack
start := enter_da
end := last
sta ALTZPOFF
2017-09-12 04:06:37 +00:00
lda ROMIN2
lda #<start
2017-09-11 03:40:32 +00:00
sta STARTLO
lda #>start
2017-09-11 03:40:32 +00:00
sta STARTHI
lda #<end
2017-09-11 03:40:32 +00:00
sta ENDLO
lda #>end
2017-09-11 03:40:32 +00:00
sta ENDHI
lda #<start
2017-09-11 03:40:32 +00:00
sta DESTINATIONLO
lda #>start
2017-09-11 03:40:32 +00:00
sta DESTINATIONHI
sec ; main>aux
jsr AUXMOVE
lda #<enter_da
sta XFERSTARTLO
lda #>enter_da
sta XFERSTARTHI
php
pla
ora #$40 ; set overflow: use aux zp/stack
pha
plp
sec ; control main>aux
jmp XFER
.endproc
;;; ==================================================
;;; Set up / tear down
.proc exit_da
sta ALTZPON
lda LCBANK1
lda LCBANK1
2017-09-11 03:40:32 +00:00
ldx stash_stack
txs
rts
.endproc
.proc enter_da
sta ALTZPON
lda LCBANK1
lda LCBANK1
2017-09-11 06:09:33 +00:00
lda #0
sta $08
2017-09-12 03:38:58 +00:00
jmp create_window
.endproc
2017-09-11 06:09:33 +00:00
window_id = $33
;;; ==================================================
.proc call_4015_main
dest := $20
;; copy following routine to $20 and call it
2017-09-12 03:38:58 +00:00
ldx #sizeof_routine
loop: lda routine,x
sta dest,x
dex
bpl loop
jsr dest
2017-09-11 06:09:33 +00:00
lda #window_id
jsr L08B4
2017-09-12 04:06:37 +00:00
bit L08B3
bmi L089D
2017-09-11 06:38:20 +00:00
jsr UNKNOWN_CALL
.byte $0C
2017-09-11 06:38:20 +00:00
.addr 0
2017-09-11 06:09:33 +00:00
L089D: lda #0
sta L08B3
rts
.proc routine
sta RAMRDOFF
sta RAMWRTOFF
2017-09-12 04:06:37 +00:00
jsr JUMP_TABLE_15
sta RAMRDON
sta RAMWRTON
rts
.endproc
2017-09-12 03:38:58 +00:00
sizeof_routine := * - routine
.endproc
;;; ==================================================
2017-09-12 03:38:58 +00:00
;;; ???
screen_height := 192
L08B3: .byte 0 ; ???
2017-09-12 04:06:37 +00:00
;; called with window_id in A
L08B4: sta query_box_params_id
2017-09-12 04:06:37 +00:00
lda create_window_params_top ; is top on screen?
2017-09-12 03:38:58 +00:00
cmp #screen_height-1
2017-09-12 04:06:37 +00:00
bcc :+ ; yes
lda #$80 ; no, so ... ???
sta L08B3
rts
2017-09-12 03:38:58 +00:00
: A2D_CALL A2D_QUERY_BOX, query_box_params
2017-09-12 04:06:37 +00:00
A2D_CALL A2D_SET_BOX1, set_box_params
lda query_box_params_id
2017-09-11 06:09:33 +00:00
cmp #window_id
2017-09-12 03:38:58 +00:00
bne :+
jmp L1072
2017-09-12 03:38:58 +00:00
: rts
;;; ==================================================
;;; Param Blocks
2017-09-12 04:06:37 +00:00
;; following memory space is re-used so x/y overlap
.proc drag_window_params
id := * + 0
.endproc
.proc map_coords_params
id := * + 0
2017-09-12 04:06:37 +00:00
screenx := * + 1 ; x overlap
screeny := * + 3 ; y overlap
clientx := * + 5
clienty := * + 7
.endproc
.proc get_input_params
state: .byte 0
key := *
modifiers := *+1
2017-09-12 04:06:37 +00:00
xcoord := * ; x overlap
ycoord := *+2 ; y overlap
.endproc
2017-09-12 04:06:37 +00:00
.proc query_target_params
queryx := * ; x overlap
queryy := *+2 ; y overlap
element := *+4
id := *+5
.endproc
.res 8, 0 ; storage for above
2017-09-12 04:06:37 +00:00
.byte 0,0 ; ???
2017-09-12 03:38:58 +00:00
.proc close_click_params
clicked:.byte 0
.endproc
.proc query_box_params
id: .byte 0
2017-09-12 04:06:37 +00:00
addr: .addr set_box_params
.endproc
query_box_params_id := query_box_params::id
2017-09-12 04:06:37 +00:00
;; Puzzle piece row/columns
2017-09-12 03:38:58 +00:00
cw := 28
c1 := 5
c2 := c1 + cw
c3 := c2 + cw
c4 := c3 + cw
rh := 16
r1 := 3
r2 := r1 + rh
r3 := r2 + rh
r4 := r3 + rh
space_positions: ; left, top for all 16 holes
.word c1,r1
.word c2,r1
.word c3,r1
.word c4,r1
.word c1,r2
.word c2,r2
.word c3,r2
.word c4,r2
.word c1,r3
.word c2,r3
.word c3,r3
.word c4,r3
.word c1,r4
.word c2,r4
.word c3,r4
.word c4,r4
2017-09-11 05:58:30 +00:00
.proc pattern_table
2017-09-12 04:06:37 +00:00
.addr piece1, piece2, piece3, piece4
.addr piece5, piece6, piece7, piece8
.addr piece9, piece10, piece11, piece12
.addr piece13, piece14, piece15, piece16
2017-09-11 05:58:30 +00:00
.endproc
2017-09-11 06:09:33 +00:00
;; Current position table
position_table:
.res 16, 0
2017-09-11 05:58:30 +00:00
.proc draw_pattern_params
left: .word 0
top: .word 0
addr: .addr 0
stride: .byte 4
2017-09-12 04:06:37 +00:00
.byte 0,0,0,0,0 ; ???
2017-09-11 05:58:30 +00:00
width: .word 27
height: .word 15
.endproc
piece1:
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0000000),px(%0000000),px(%0000000),px(%0000000)
piece2:
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%0000000),px(%0011111),px(%1111110)
.byte px(%0111000),px(%1010101),px(%0100001),px(%1111110)
.byte px(%0000000),px(%0000000),px(%0000000),px(%0000000)
piece3:
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1110001),px(%1111110)
.byte px(%0111111),px(%1111111),px(%0010101),px(%0111110)
.byte px(%0111111),px(%1111101),px(%0101010),px(%1011110)
.byte px(%0111111),px(%1110010),px(%1010101),px(%0111110)
.byte px(%0111111),px(%1100101),px(%0101010),px(%0111110)
.byte px(%0111111),px(%0001010),px(%1010100),px(%1111110)
.byte px(%0111110),px(%1010101),px(%0101001),px(%1111110)
.byte px(%0111101),px(%0101010),px(%1000111),px(%1111110)
.byte px(%0111010),px(%1010101),px(%0011111),px(%1111110)
.byte px(%0110101),px(%0101000),px(%0111111),px(%1111110)
.byte px(%0110010),px(%1010011),px(%1111111),px(%1111110)
.byte px(%0110101),px(%0001111),px(%1111100),px(%0000000)
.byte px(%0110000),px(%1111111),px(%1000010),px(%1010100)
.byte px(%0000000),px(%0000000),px(%0000000),px(%0000000)
piece4:
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0000111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0101000),px(%0111111),px(%1111111),px(%1111110)
.byte px(%0000000),px(%0000000),px(%0000000),px(%0000000)
piece5:
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111100)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111100)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1110100)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1101010)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1011110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%0111110)
.byte px(%0111111),px(%1111111),px(%1111110),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111101),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111101),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111011),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1110111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1110111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1110110),px(%1101100)
.byte px(%0111111),px(%1111111),px(%1101101),px(%1011010)
.byte px(%0111111),px(%1111111),px(%1101011),px(%0110110)
.byte px(%0000000),px(%0000000),px(%0000000),px(%0000000)
piece6:
.byte px(%0101010),px(%1010101),px(%0101010),px(%1010100)
.byte px(%0010101),px(%0101010),px(%1010101),px(%0101010)
.byte px(%0101010),px(%1010101),px(%0101010),px(%1010100)
.byte px(%0010101),px(%0101010),px(%1010101),px(%0101010)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0011011),px(%0110110),px(%1101101),px(%1011010)
.byte px(%0110110),px(%1101101),px(%1011011),px(%0110110)
.byte px(%0101101),px(%1011011),px(%0110110),px(%1101100)
.byte px(%0000000),px(%0000000),px(%0000000),px(%0000000)
piece7:
.byte px(%0101010),px(%1010101),px(%0101010),px(%1010100)
.byte px(%0010101),px(%0101010),px(%1010101),px(%0101010)
.byte px(%0101010),px(%1010101),px(%0101010),px(%1010100)
.byte px(%0010101),px(%0101010),px(%1010101),px(%0101010)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0110110),px(%1101101),px(%1011011),px(%0110110)
.byte px(%0101101),px(%1011011),px(%0110110),px(%1101100)
.byte px(%0011011),px(%0110110),px(%1101101),px(%1011010)
.byte px(%0000000),px(%0000000),px(%0000000),px(%0000000)
piece8:
.byte px(%0101010),px(%1010001),px(%1111111),px(%1111110)
.byte px(%0010101),px(%0101010),px(%0111111),px(%1111110)
.byte px(%0101010),px(%1010101),px(%0001111),px(%1111110)
.byte px(%0010101),px(%0101010),px(%1000111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%0011111),px(%1111110)
.byte px(%0111111),px(%1111110),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111101),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111011),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1110111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1110111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1101111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1101111),px(%1111111),px(%1111110)
.byte px(%0101101),px(%1001111),px(%1111111),px(%1111110)
.byte px(%0011011),px(%0011111),px(%1111111),px(%1111110)
.byte px(%0110110),px(%1011111),px(%1111111),px(%1111110)
.byte px(%0000000),px(%0000000),px(%0000000),px(%0000000)
piece9:
.byte px(%0111111),px(%1111111),px(%1110011),px(%0110110)
.byte px(%0111111),px(%1111111),px(%1110110),px(%1101100)
.byte px(%0111111),px(%1111111),px(%1110101),px(%1011010)
.byte px(%0111111),px(%1111111),px(%1110011),px(%0110110)
.byte px(%0111111),px(%1111111),px(%1111010),px(%1010100)
.byte px(%0111111),px(%1111111),px(%1111010),px(%1010100)
.byte px(%0111111),px(%1111111),px(%1111100),px(%1010100)
.byte px(%0111111),px(%1111111),px(%1111110),px(%1010100)
.byte px(%0111111),px(%1111111),px(%1111110),px(%1010100)
.byte px(%0111111),px(%1111111),px(%1111110),px(%1010100)
.byte px(%0111111),px(%1111111),px(%1111111),px(%0010100)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1001100)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1100110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1110100)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111010)
.byte px(%0000000),px(%0000000),px(%0000000),px(%0000000)
piece10:
.byte px(%0101101),px(%1011011),px(%0110110),px(%1101100)
.byte px(%0011011),px(%0110110),px(%1101101),px(%1011010)
.byte px(%0110110),px(%1101101),px(%1011011),px(%0110110)
.byte px(%0101101),px(%1011011),px(%0110110),px(%1101100)
.byte px(%0101010),px(%1010101),px(%0101010),px(%1010100)
.byte px(%0101010),px(%1010101),px(%0101010),px(%1010100)
.byte px(%0101010),px(%1010101),px(%0101010),px(%1010100)
.byte px(%0101010),px(%1010101),px(%0101010),px(%1010100)
.byte px(%0101010),px(%1010101),px(%0101010),px(%1010100)
.byte px(%0101010),px(%1010101),px(%0101010),px(%1010100)
.byte px(%0101010),px(%1010101),px(%0101010),px(%1010100)
.byte px(%0100110),px(%0110011),px(%0011001),px(%1001100)
.byte px(%0110011),px(%0011001),px(%1001100),px(%1100110)
.byte px(%0100110),px(%0110011),px(%0011001),px(%1001100)
.byte px(%0110011),px(%0011001),px(%1001100),px(%1100110)
.byte px(%0000000),px(%0000000),px(%0000000),px(%0000000)
piece11:
.byte px(%0011011),px(%0110110),px(%1101101),px(%1011010)
.byte px(%0110110),px(%1101101),px(%1011011),px(%0110110)
.byte px(%0101101),px(%1011011),px(%0110110),px(%1101100)
.byte px(%0011011),px(%0110110),px(%1101101),px(%1011010)
.byte px(%0101010),px(%1010101),px(%0101010),px(%1010100)
.byte px(%0101010),px(%1010101),px(%0101010),px(%1010100)
.byte px(%0101010),px(%1010101),px(%0101010),px(%1010100)
.byte px(%0101010),px(%1010101),px(%0101010),px(%1010100)
.byte px(%0101010),px(%1010101),px(%0101010),px(%1010100)
.byte px(%0101010),px(%1010101),px(%0101010),px(%1010100)
.byte px(%0101010),px(%1010101),px(%0101010),px(%1010100)
.byte px(%0100110),px(%0110011),px(%0011001),px(%1001100)
.byte px(%0110011),px(%0011001),px(%1001100),px(%1100110)
.byte px(%0100110),px(%0110011),px(%0011001),px(%1001100)
.byte px(%0110011),px(%0011001),px(%1001100),px(%1100110)
.byte px(%0000000),px(%0000000),px(%0000000),px(%0000000)
piece12:
.byte px(%0110110),px(%1011111),px(%1111111),px(%1111110)
.byte px(%0101101),px(%1011111),px(%1111111),px(%1111110)
.byte px(%0011011),px(%0101111),px(%1111111),px(%1111110)
.byte px(%0110110),px(%1101111),px(%1111111),px(%1111110)
.byte px(%0101010),px(%1010111),px(%1111111),px(%1111110)
.byte px(%0101010),px(%1010011),px(%1111111),px(%1111110)
.byte px(%0101010),px(%1010011),px(%1111111),px(%1111110)
.byte px(%0101010),px(%1010101),px(%1111111),px(%1111110)
.byte px(%0101010),px(%1010100),px(%1111111),px(%1111110)
.byte px(%0101010),px(%1010101),px(%0011111),px(%1111110)
.byte px(%0101010),px(%1010101),px(%0100111),px(%1111110)
.byte px(%0100110),px(%0110011),px(%0010111),px(%1111110)
.byte px(%0110011),px(%0011001),px(%1001111),px(%1111110)
.byte px(%0100110),px(%0110011),px(%0001111),px(%1111110)
.byte px(%0110011),px(%0011001),px(%1011111),px(%1111110)
.byte px(%0000000),px(%0000000),px(%0000000),px(%0000000)
2017-09-12 03:38:58 +00:00
piece13: ; the hole
2017-09-11 05:58:30 +00:00
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111011),px(%1011101),px(%1101110),px(%1110110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0101110),px(%1110111),px(%0111011),px(%1011100)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111011),px(%1011101),px(%1101110),px(%1110110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0101110),px(%1110111),px(%0111011),px(%1011100)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111011),px(%1011101),px(%1101110),px(%1110110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0101110),px(%1110111),px(%0111011),px(%1011100)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111011),px(%1011101),px(%1101110),px(%1110110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0000000),px(%0000000),px(%0000000),px(%0000000)
piece14:
.byte px(%0001100),px(%1100110),px(%0110011),px(%0011000)
.byte px(%0100110),px(%0110011),px(%0011001),px(%1001100)
.byte px(%0110011),px(%0011001),px(%1001100),px(%1100110)
.byte px(%0011011),px(%0110110),px(%1101101),px(%1011010)
.byte px(%0100101),px(%1011011),px(%0110110),px(%1101100)
.byte px(%0110010),px(%1101101),px(%1011011),px(%0110110)
.byte px(%0111001),px(%0110110),px(%1101101),px(%1011010)
.byte px(%0111110),px(%0111011),px(%0110110),px(%1101100)
.byte px(%0111111),px(%1000101),px(%1011000),px(%0000000)
.byte px(%0111111),px(%1111000),px(%0000001),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0000000),px(%0000000),px(%0000000),px(%0000000)
piece15:
.byte px(%0001100),px(%1100110),px(%0110011),px(%0011000)
.byte px(%0100110),px(%0110011),px(%0011001),px(%1001100)
.byte px(%0110011),px(%0011001),px(%1001100),px(%1100110)
.byte px(%0110110),px(%1101101),px(%1011011),px(%0110110)
.byte px(%0011011),px(%0110110),px(%1101101),px(%1011010)
.byte px(%0101101),px(%1011011),px(%0110110),px(%1101100)
.byte px(%0110110),px(%1101101),px(%1011011),px(%0110110)
.byte px(%0011011),px(%0110110),px(%1101101),px(%1011010)
.byte px(%0000000),px(%0000000),px(%0000110),px(%1101100)
.byte px(%0111111),px(%1111111),px(%1100000),px(%0000010)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0000000),px(%0000000),px(%0000000),px(%0000000)
piece16:
.byte px(%0001100),px(%1100110),px(%0011111),px(%1111110)
.byte px(%0100110),px(%0110011),px(%0111111),px(%1111110)
.byte px(%0110011),px(%0011000),px(%1111111),px(%1111110)
.byte px(%0101101),px(%1011001),px(%1111111),px(%1111110)
.byte px(%0110110),px(%1100111),px(%1111111),px(%1111110)
.byte px(%0011011),px(%0011111),px(%1111111),px(%1111110)
.byte px(%0101110),px(%0111111),px(%1111111),px(%1111110)
.byte px(%0100111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0000000),px(%0000000),px(%0000000),px(%0000000)
.proc fill_rect_params
2017-09-12 04:06:37 +00:00
.word 1, 0, default_width, default_height
.endproc
.proc pattern_speckles
.byte $77,$DD,$77,$DD,$77,$DD,$77,$DD
.endproc
.byte $00 ; ???
.proc pattern_black
.res 8, 0
.endproc
2017-09-11 05:58:30 +00:00
2017-09-12 04:06:37 +00:00
;; ???
.byte $00
.res 8, $FF
.byte $00
2017-09-12 03:38:58 +00:00
.proc set_pos_params ; for what ??? (board is at 5,3)
.word 5, 2
.endproc
2017-09-12 03:38:58 +00:00
;; Param block for $0F call (4 bytes)
L0D91: .byte $70,$00,$00,$00 ; ???
;; hole position (0..3, 0..3)
hole_x: .byte 0
hole_y: .byte 0
;; click location (0..3, 0..3)
click_y: .byte $00
click_x: .byte $00
;; param for draw_row/draw_col
draw_rc: .byte $00
;; params for draw_selected
draw_end: .byte $00
draw_inc: .byte $00
2017-09-12 04:06:37 +00:00
.proc destroy_window_params
id: .byte window_id
.endproc
.byte $73,$00,$F7,$FF,$AD,$0D,$01
.byte $00,$00,$00,$00,$00,$06,$00,$05
.byte $00,$41,$35,$47,$37,$36,$49
2017-09-12 03:38:58 +00:00
;; SET_BOX1 params (filled in by QUERY_BOX)
2017-09-12 04:06:37 +00:00
set_box_params:
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$0D
.byte $00,$00,$20,$80,$00,$00,$00,$00
.byte $00,$2F,$02,$B1,$00,$00,$01,$02
.byte $06
2017-09-12 03:38:58 +00:00
2017-09-12 04:06:37 +00:00
default_left := 220
default_top := 80
default_width := $79
default_height := $44
2017-09-12 03:38:58 +00:00
.proc create_window_params
2017-09-12 04:06:37 +00:00
id: .byte window_id
2017-09-12 03:38:58 +00:00
flags: .byte A2D_CWF_ADDCLOSE
title: .addr name
hscroll:.byte 0
vscroll:.byte 0
hsmax: .byte 0
hspos: .byte 0
vsmax: .byte 0
vspos: .byte 0
.byte $00,$00 ; ???
w_a: .word default_width
h_a: .word default_height
w_b: .word default_width
h_b: .word default_height
2017-09-12 04:06:37 +00:00
left: .word default_left
top: .word default_top
2017-09-12 03:38:58 +00:00
saddr: .addr A2D_SCREEN_ADDR
stride: .word A2D_SCREEN_STRIDE
hoffset:.word 0
voffset:.word 0
width: .word default_width
height: .word default_height
pattern:.res 8, $FF
.byte $FF,$00
.byte $00,$00,$00,$00
hthick: .byte 1
vthick: .byte 1
.byte $00,$7F,$00,$88,$00,$00
;; This is QUERY_BOX/SET_BOX cruft only below
2017-09-12 04:06:37 +00:00
.word default_left
.word default_top
.addr A2D_SCREEN_ADDR
.word A2D_SCREEN_STRIDE
.byte $00,$00,$00,$00
.word default_width
.word default_height
.res 8, $FF
.byte $FF,$00,$00,$00
.byte $00,$00
.byte 1
.byte 1
.byte $00,$7F,$00,$88,$00,$00
2017-09-12 03:38:58 +00:00
.endproc
name: PASCAL_STRING "Puzzle"
2017-09-12 04:06:37 +00:00
create_window_params_top := create_window_params::top
2017-09-11 06:09:33 +00:00
;;; ==================================================
;;; Create the window
2017-09-12 03:38:58 +00:00
.proc create_window
jsr save_zp
A2D_CALL A2D_CREATE_WINDOW, create_window_params
;; init pieces
ldy #15
loop: tya
2017-09-11 06:09:33 +00:00
sta position_table,y
dey
2017-09-12 03:38:58 +00:00
bpl loop
2017-09-11 06:09:33 +00:00
lda #window_id
jsr L08B4
2017-09-12 04:06:37 +00:00
A2D_CALL $2B ; ???
;; Scramble?
2017-09-12 03:38:58 +00:00
L0E70: ldy #3
L0E72: tya
pha
2017-09-11 06:09:33 +00:00
ldx position_table
2017-09-12 03:38:58 +00:00
ldy #0
ploop: lda position_table+1,y
2017-09-11 06:09:33 +00:00
sta position_table,y
iny
2017-09-12 03:38:58 +00:00
cpy #15
bcc ploop
2017-09-11 06:09:33 +00:00
stx position_table+15
pla
tay
dey
bne L0E72
2017-09-11 06:09:33 +00:00
ldx position_table
lda position_table+1
sta position_table
stx position_table+1
2017-09-12 03:38:58 +00:00
A2D_CALL A2D_GET_INPUT, get_input_params
lda get_input_params::state
beq L0E70
2017-09-11 06:38:20 +00:00
jsr check_victory
bcs L0E70
2017-09-12 03:38:58 +00:00
jsr draw_all
jsr find_hole
; fall through
.endproc
;;; ==================================================
;;; Input loop and processing
2017-09-12 03:38:58 +00:00
.proc input_loop
A2D_CALL A2D_GET_INPUT, get_input_params
lda get_input_params::state
cmp #A2D_INPUT_DOWN
bne :+
2017-09-12 03:38:58 +00:00
jsr on_click
jmp input_loop
;; key?
: cmp #A2D_INPUT_KEY
bne input_loop
jsr check_key
jmp input_loop
;; click - where?
2017-09-12 03:38:58 +00:00
on_click:
A2D_CALL A2D_QUERY_TARGET, query_target_params
2017-09-12 04:06:37 +00:00
lda query_target_params::id
2017-09-11 06:09:33 +00:00
cmp #window_id
bne bail
2017-09-12 04:06:37 +00:00
lda query_target_params::element
bne :+
bail: rts
;; client area?
: cmp #A2D_ELEM_CLIENT
bne :+
jsr find_click_piece
bcc bail
2017-09-12 06:16:29 +00:00
jmp process_click
;; close box?
: cmp #A2D_ELEM_CLOSE
bne check_title
2017-09-12 03:38:58 +00:00
A2D_CALL A2D_CLOSE_CLICK, close_click_params
lda close_click_params::clicked
beq bail
2017-09-12 03:38:58 +00:00
destroy:
A2D_CALL A2D_DESTROY_WINDOW, destroy_window_params
2017-09-11 03:40:32 +00:00
jsr UNKNOWN_CALL ; ???
.byte $0C
2017-09-11 06:38:20 +00:00
.addr 0
2017-09-11 03:40:32 +00:00
2017-09-12 03:38:58 +00:00
target = $20 ; copy following to ZP and run it
ldx #sizeof_routine
loop: lda routine,x
sta target,x
dex
2017-09-12 03:38:58 +00:00
bpl loop
jmp target
2017-09-12 03:38:58 +00:00
.proc routine
L0F12: sta RAMRDOFF
sta RAMWRTOFF
jmp exit_da
2017-09-12 03:38:58 +00:00
.endproc
sizeof_routine := * - routine
;; title bar?
check_title:
cmp #A2D_ELEM_TITLE
bne bail
2017-09-11 06:09:33 +00:00
lda #window_id
sta drag_window_params::id
A2D_CALL A2D_DRAG_WINDOW, drag_window_params
ldx #$23
jsr call_4015_main
rts
;; on key press - exit if Escape
check_key:
lda get_input_params::modifiers
bne :+
lda get_input_params::key
cmp #$1B ; Escape
2017-09-12 03:38:58 +00:00
beq destroy
: rts
2017-09-12 03:38:58 +00:00
.endproc
;;; ==================================================
;;; Map click to piece x/y
.proc find_click_piece
2017-09-11 06:09:33 +00:00
L0F3D: lda #window_id
sta map_coords_params::id
A2D_CALL A2D_MAP_COORDS, map_coords_params
lda map_coords_params::clientx+1
ora map_coords_params::clienty+1
bne nope ; ensure high bytes are 0
lda map_coords_params::clienty
ldx map_coords_params::clientx
2017-09-12 03:38:58 +00:00
cmp #r1
bcc nope
2017-09-12 03:38:58 +00:00
cmp #r2+1
bcs :+
jsr find_click_y
bcc nope
lda #0
beq yep
2017-09-12 03:38:58 +00:00
: cmp #r3+1
bcs :+
jsr find_click_y
bcc nope
lda #1
bne yep
2017-09-12 03:38:58 +00:00
: cmp #r4+1
bcs :+
jsr find_click_y
bcc nope
lda #2
bne yep
2017-09-12 03:38:58 +00:00
: cmp #r4+rh+1
bcs nope
jsr find_click_y
bcc nope
lda #3
2017-09-12 03:38:58 +00:00
yep: sta click_x
sec
rts
nope: clc
rts
.endproc
.proc find_click_y
2017-09-12 03:38:58 +00:00
cpx #c1
bcc nope
2017-09-12 03:38:58 +00:00
cpx #c2
bcs :+
lda #0
beq yep
2017-09-12 03:38:58 +00:00
: cpx #c3+1
bcs :+
lda #1
bne yep
2017-09-12 03:38:58 +00:00
: cpx #c4+1
bcs :+
lda #2
bne yep
2017-09-12 03:38:58 +00:00
: cpx #c4+cw
bcs nope
lda #3
2017-09-12 03:38:58 +00:00
yep: sta click_y
sec
rts
nope: clc
rts
.endproc
;;; ==================================================
;;; Process piece click
2017-09-12 03:38:58 +00:00
hole_piece := 12
2017-09-12 06:16:29 +00:00
.proc process_click
lda #0
2017-09-12 03:38:58 +00:00
ldy hole_y
beq L0FC9
L0FC3: clc
2017-09-12 06:16:29 +00:00
adc #4
dey
bne L0FC3
2017-09-12 03:38:58 +00:00
L0FC9: sta draw_rc
clc
2017-09-12 03:38:58 +00:00
adc hole_x
tay
2017-09-12 03:38:58 +00:00
lda click_y
cmp hole_x
beq L1014
2017-09-12 03:38:58 +00:00
lda click_x
cmp hole_y
2017-09-12 06:16:29 +00:00
beq :+
L0FE1: rts
2017-09-12 06:16:29 +00:00
: lda click_y
2017-09-12 03:38:58 +00:00
cmp hole_x
beq L0FE1
bcs L1000
2017-09-12 03:38:58 +00:00
lda hole_x
sec
2017-09-12 03:38:58 +00:00
sbc click_y
tax
2017-09-11 06:09:33 +00:00
L0FF4: lda position_table-1,y
sta position_table,y
dey
dex
bne L0FF4
2017-09-12 06:16:29 +00:00
beq row
2017-09-12 03:38:58 +00:00
L1000: lda click_y
sec
2017-09-12 03:38:58 +00:00
sbc hole_x
tax
2017-09-11 06:09:33 +00:00
L1008: lda position_table+1,y
sta position_table,y
iny
dex
bne L1008
2017-09-12 06:16:29 +00:00
beq row
2017-09-12 03:38:58 +00:00
L1014: lda click_x
cmp hole_y
beq L0FE1
bcs L1035
2017-09-12 03:38:58 +00:00
lda hole_y
sec
2017-09-12 03:38:58 +00:00
sbc click_x
tax
2017-09-11 06:09:33 +00:00
L1026: lda position_table-4,y
sta position_table,y
dey
dey
dey
dey
dex
bne L1026
2017-09-12 06:16:29 +00:00
beq col
2017-09-12 03:38:58 +00:00
L1035: lda click_x
sec
2017-09-12 03:38:58 +00:00
sbc hole_y
tax
2017-09-11 06:09:33 +00:00
L103D: lda position_table+4,y
sta position_table,y
iny
iny
iny
iny
dex
bne L103D
2017-09-12 06:16:29 +00:00
col: lda #hole_piece
2017-09-11 06:09:33 +00:00
sta position_table,y
2017-09-12 03:38:58 +00:00
jsr draw_col
2017-09-12 06:16:29 +00:00
jmp done
2017-09-12 06:16:29 +00:00
row: lda #hole_piece
2017-09-11 06:09:33 +00:00
sta position_table,y
2017-09-12 03:38:58 +00:00
jsr draw_row
2017-09-12 06:16:29 +00:00
done: jsr check_victory
bcc L106E
2017-09-12 06:16:29 +00:00
;; Yay! Play the sound 4 times
2017-09-12 03:38:58 +00:00
ldx #4
L1064: txa
pha
jsr play_sound
pla
tax
dex
bne L1064
2017-09-12 03:38:58 +00:00
L106E: jmp find_hole
2017-09-12 06:16:29 +00:00
rts ; ???
.endproc
;;; ==================================================
;;; Clear the background
L1072: A2D_CALL A2D_SET_PATTERN, pattern_speckles
A2D_CALL A2D_FILL_RECT, fill_rect_params
A2D_CALL A2D_SET_PATTERN, pattern_black
A2D_CALL A2D_SET_POS, set_pos_params
A2D_CALL $0F, L0D91 ; ???
2017-09-12 03:38:58 +00:00
jsr draw_all
2017-09-11 06:09:33 +00:00
lda #window_id
sta query_box_params::id
A2D_CALL A2D_QUERY_BOX, query_box_params
2017-09-12 04:06:37 +00:00
A2D_CALL A2D_SET_BOX1, set_box_params
rts
;;; ==================================================
2017-09-11 06:38:20 +00:00
.proc save_zp
ldx #$00
loop: lda $00,x
sta saved_zp,x
dex
2017-09-11 06:38:20 +00:00
bne loop
rts
2017-09-11 06:38:20 +00:00
.endproc
2017-09-11 06:38:20 +00:00
.proc restore_zp
ldx #$00
2017-09-11 06:38:20 +00:00
loop: lda saved_zp,x
sta $00,x
dex
2017-09-11 06:38:20 +00:00
bne loop
rts
2017-09-11 06:38:20 +00:00
.endproc
2017-09-11 06:38:20 +00:00
saved_zp:
.res 256, 0
2017-09-11 03:40:32 +00:00
;;; ==================================================
;;; Draw pieces
2017-09-12 03:38:58 +00:00
.proc draw_all
ldy #1
sty draw_inc
dey
2017-09-12 03:38:58 +00:00
lda #16
sta draw_end
bne draw_selected
.endproc
.proc draw_row ; row specified in draw_rc
lda #1
sta draw_inc
lda draw_rc
tay
clc
2017-09-12 03:38:58 +00:00
adc #4
sta draw_end
bne draw_selected
.endproc
.proc draw_col ; col specified in draw_rc
lda #4
sta draw_inc
ldy hole_x
lda #16
sta draw_end
;; fall through
.endproc
;; Draw pieces from A to draw_end, step draw_inc
.proc draw_selected
tya
pha
2017-09-11 03:40:32 +00:00
A2D_CALL A2D_HIDE_CURSOR
2017-09-11 06:09:33 +00:00
lda #window_id
sta query_box_params::id
A2D_CALL A2D_QUERY_BOX, query_box_params
2017-09-12 04:06:37 +00:00
A2D_CALL A2D_SET_BOX1, set_box_params
pla
tay
2017-09-12 03:38:58 +00:00
loop: tya
pha
asl a
asl a
tax
2017-09-12 03:38:58 +00:00
lda space_positions,x
2017-09-11 05:58:30 +00:00
sta draw_pattern_params::left
2017-09-12 03:38:58 +00:00
lda space_positions+1,x
2017-09-11 05:58:30 +00:00
sta draw_pattern_params::left+1
2017-09-12 03:38:58 +00:00
lda space_positions+2,x
2017-09-11 05:58:30 +00:00
sta draw_pattern_params::top
2017-09-12 03:38:58 +00:00
lda space_positions+3,x
2017-09-11 05:58:30 +00:00
sta draw_pattern_params::top+1
2017-09-11 06:09:33 +00:00
lda position_table,y
asl a
tax
2017-09-11 05:58:30 +00:00
lda pattern_table,x
sta draw_pattern_params::addr
lda pattern_table+1,x
sta draw_pattern_params::addr+1
A2D_CALL A2D_DRAW_PATTERN, draw_pattern_params
pla
clc
2017-09-12 03:38:58 +00:00
adc draw_inc
tay
2017-09-12 03:38:58 +00:00
cpy draw_end
bcc loop
2017-09-11 03:40:32 +00:00
A2D_CALL A2D_SHOW_CURSOR
rts
2017-09-12 03:38:58 +00:00
.endproc
;;; ==================================================
;;; Play sound
.proc play_sound
ldx #$80
2017-09-12 03:38:58 +00:00
loop1: lda #$58
loop2: ldy #$1B
delay1: dey
bne delay1
bit SPKR
tay
2017-09-12 03:38:58 +00:00
delay2: dey
bne delay2
sbc #1
beq loop1
bit SPKR
dex
2017-09-12 03:38:58 +00:00
bne loop2
rts
.endproc
;;; ==================================================
;;; Puzzle complete?
2017-09-11 06:38:20 +00:00
;; Returns with carry set if puzzle complete
.proc check_victory ; Allows for swapped indistinct pieces, etc.
;; 0/12 can be swapped
lda position_table
beq :+
cmp #12
bne nope
: ldy #1
c1234: tya
2017-09-11 06:09:33 +00:00
cmp position_table,y
2017-09-11 06:38:20 +00:00
bne nope
iny
2017-09-11 06:38:20 +00:00
cpy #5
bcc c1234
;; 5/6 are identical
2017-09-11 06:09:33 +00:00
lda position_table+5
2017-09-11 06:38:20 +00:00
cmp #5
beq :+
cmp #6
bne nope
: lda position_table+6
cmp #5
beq :+
cmp #6
bne nope
: lda position_table+7
cmp #7
bne nope
2017-09-11 06:09:33 +00:00
lda position_table+8
2017-09-11 06:38:20 +00:00
cmp #8
bne nope
;; 9/10 are identical
2017-09-11 06:09:33 +00:00
lda position_table+9
2017-09-11 06:38:20 +00:00
cmp #9
beq :+
cmp #10
bne nope
: lda position_table+10
cmp #9
beq :+
cmp #10
bne nope
: lda position_table+11
cmp #11
bne nope
;; 0/12 can be swapped
2017-09-11 06:09:33 +00:00
lda position_table+12
2017-09-11 06:38:20 +00:00
beq :+
cmp #12
bne nope
: ldy #13
c131415:tya
2017-09-11 06:09:33 +00:00
cmp position_table,y
2017-09-11 06:38:20 +00:00
bne nope
iny
2017-09-11 06:38:20 +00:00
cpy #16
bcc c131415
rts
2017-09-11 06:38:20 +00:00
nope: clc
rts
2017-09-11 06:38:20 +00:00
.endproc
2017-09-12 03:38:58 +00:00
;;; ==================================================
;;; Find hole piece
2017-09-12 03:38:58 +00:00
.proc find_hole
ldy #15
loop: lda position_table,y
cmp #hole_piece
beq :+
dey
2017-09-12 03:38:58 +00:00
bpl loop
: lda #0
sta hole_x
sta hole_y
tya
2017-09-12 03:38:58 +00:00
again: cmp #4
bcc done
2017-09-11 06:09:33 +00:00
sbc #4
2017-09-12 03:38:58 +00:00
inc hole_y
bne again
done: sta hole_x
rts
2017-09-12 03:38:58 +00:00
.endproc
last := *