diff --git a/MC6809/MC6809.Test/roms/6809_sudoku/README.md b/MC6809/MC6809.Test/roms/6809_sudoku/README.md new file mode 100644 index 0000000..51f5a39 --- /dev/null +++ b/MC6809/MC6809.Test/roms/6809_sudoku/README.md @@ -0,0 +1,51 @@ +# 6809_sudoku + +Sudoku solver in Motorola 6809 assembler, built with +[lwtools](http://www.lwtools.ca/) (`lwasm` + `lwlink`). + +Ported from the 6502 version (`6502_sudoku`). It uses the same recursive +backtracking algorithm and produces identical console output, rewritten for the +6809. + +## Building + +With lwtools installed (lwasm/lwlink on the PATH): + + make + +This produces `sudoku.bin`, a 4 KiB raw ROM image spanning `$F000-$FFFF` with +the 6809 reset vector at `$FFFE`. A listing (`sudoku.lst`) and link map +(`sudoku.map`) are produced too. + +By hand: + + lwasm --format=obj --output=sudoku.o --list=sudoku.lst sudoku.asm + lwlink --format=raw --script=sudoku.link --map=sudoku.map --output=sudoku.bin sudoku.o + +## Running + +The program expects a memory-mapped console matching the 6502 build: writing a +byte to `CONOUT` (`$E001`) emits a character. Map the 4 KiB image at `$F000`, +take reset from `$FFFE`, and provide a CONOUT sink. On start it prints: + + Solving puzzle: pass + +followed by the solved grid. + +## Notes on the port + +The 6809 has two index registers, two stack pointers and 16-bit pointers, so +several 6502 workarounds disappear: + +- The software data stack (`stack.inc`) is gone. The cell index `n` is passed + to `solve` in `B`, and recursion uses the hardware `S` stack directly. +- `is_available` and its row/column/box helpers return their result in the `Z` + condition code and preserve `A` (the digit) and `B` (the cell index). +- The board lives in RAM at `$0200`. The clues are copied there from a ROM + table (`puzzle_init`) at reset, so the image is ROM-clean. + +Memory map: + + $0200-$3FFF RAM (board + system stack, growing down from $4000) + $F000-$FFEF code + read-only tables + $FFF0-$FFFF 6809 vectors (reset at $FFFE) diff --git a/MC6809/MC6809.Test/roms/6809_sudoku/io.inc b/MC6809/MC6809.Test/roms/6809_sudoku/io.inc new file mode 100644 index 0000000..a019385 --- /dev/null +++ b/MC6809/MC6809.Test/roms/6809_sudoku/io.inc @@ -0,0 +1,50 @@ +; io.inc - console I/O for the 6809 sudoku port +; +; Memory-mapped console, matching the 6502 build: writing a byte to 6850 ACIA +; emits a character. + +UART equ $A000 +RECEV equ UART+1 +TRANS equ UART+1 +USTAT equ UART +UCTRL equ UART + +ACIA_RESET equ $03 ; master reset (CR1:CR0 = 11) +ACIA_CFG equ $15 ; div-16, 8 data / no parity / 1 stop, no interrupts + + +io_initialise_acia: + lda #ACIA_RESET ; master reset must precede configuration + sta UCTRL + lda #ACIA_CFG ; DIV16 CLOCK -> 7372800 / 4 / 16 = 115200 baud + sta UCTRL + rts + +; io_waitacia - wait for the ACIA to become ready +io_waitacia: + pshs a +io_wrwait: lda USTAT + bita #2 + beq io_wrwait + puls a + rts + +; io_outchr - print the character held in A +io_outchr: + bsr io_waitacia + sta TRANS + rts + +; io_outstr - print the nul-terminated string that immediately follows the +; "jsr io_outstr" instruction, then resume just past the nul. +; (Inline-string trick, as used in the 6502 original.) +io_outstr: + puls x ; X = return address = first byte of string +ios_loop: + lda ,x+ + beq ios_done + bsr io_outchr + bra ios_loop +ios_done: + pshs x ; resume after the terminating nul + rts diff --git a/MC6809/MC6809.Test/roms/6809_sudoku/makefile b/MC6809/MC6809.Test/roms/6809_sudoku/makefile new file mode 100644 index 0000000..7afabc6 --- /dev/null +++ b/MC6809/MC6809.Test/roms/6809_sudoku/makefile @@ -0,0 +1,26 @@ +# Makefile for the 6809 sudoku port (lwtools) +# +# lwlink's "raw" target only honours a single load address and concatenates +# sections, so it cannot zero-fill the gap up to the 6809 vector table at +# $FFF0. We therefore assemble the fixed ROM directly with lwasm in absolute +# (org) mode, which produces a gap-filled 4 KiB image with vectors at $FFFE. +# +# Outputs: +# sudoku.bin - flat 4 KiB raw ROM image (load at $F000) +# sudoku.hex - Intel HEX of the same image (addresses embedded) +# sudoku.lst - listing (address per source line) +# sudoku.map - symbol -> address map (for debuggers / monitors) + +LWASM = lwasm + +all: sudoku.bin sudoku.hex + +sudoku.bin: sudoku.asm io.inc + $(LWASM) --format=raw --output=sudoku.bin --list=sudoku.lst --map=sudoku.map sudoku.asm + +sudoku.hex: sudoku.asm io.inc + $(LWASM) --format=ihex --output=sudoku.hex sudoku.asm + +.PHONY: clean +clean: + rm -fv *.bin *.hex *.lst *.map *.o diff --git a/MC6809/MC6809.Test/roms/6809_sudoku/sudoku.asm b/MC6809/MC6809.Test/roms/6809_sudoku/sudoku.asm new file mode 100644 index 0000000..4b140dd --- /dev/null +++ b/MC6809/MC6809.Test/roms/6809_sudoku/sudoku.asm @@ -0,0 +1,402 @@ +; ============================================================================ +; 6809_sudoku - Sudoku solver in Motorola 6809 assembler (lwtools: lwasm) +; +; A port of the 6502 version to the 6809. Recursive backtracking solver, same +; algorithm and same console output. +; +; Console I/O matches the 6502 build (write a byte to CONOUT to print it). +; ROM at $F000-$FFFF, 6809 vectors at $FFF0-$FFFF, working RAM from $0200. +; ============================================================================ + +; ---- constants ------------------------------------------------------------- + +UNASSIGNED equ 0 +BOARD_SIZE equ 9 +CELL_COUNT equ BOARD_SIZE*BOARD_SIZE ; 81 +STACKTOP equ $4000 ; hardware stack top (RAM $0200-$3FFF) + +; ---- working RAM (uninitialised) ------------------------------------------- +puzzle equ $0200 ; live 9x9 board in RAM ($0200..$0250) + +; ---- code ------------------------------------------------------------------ + org $F000 + include "io.inc" + +; ---------------------------------------------------------------------------- +; reset - entry point +; ---------------------------------------------------------------------------- +reset: + orcc #$50 ; mask IRQ and FIRQ + lds #STACKTOP ; set up the hardware stack + jsr io_initialise_acia + + ; copy the clues from ROM into writable RAM + ldx #puzzle_init + ldy #puzzle + ldb #CELL_COUNT +rinit: + lda ,x+ + sta ,y+ + decb + bne rinit + + jsr io_outstr + fcc "Solving puzzle: " + fcb 0 + + clrb ; n = 0 + jsr solve + tsta + bne rfail + + jsr io_outstr + fcc "pass" + fcb 0 + jsr print_board + bra rdone +rfail: + jsr io_outstr + fcc "fail" + fcb 0 +rdone: + lda #$0a ; trailing newline + jsr io_outchr +halt: + bra halt + +; ---------------------------------------------------------------------------- +; Inlined availability checks (macros). The row/column/box base pointers are +; precomputed once per cell and held on the stack (see solve), so each check +; is a single "ldx n,s" plus the nine comparisons. A = candidate digit. +; A conflict branches to _loop_continue; no conflict falls through. The row +; check keeps a local 'used@' trampoline (its early compares sit >127 bytes +; from _loop_continue); column and box branch to _loop_continue directly. +; 0,s = row pointer 2,s = column pointer 4,s = box pointer +; ---------------------------------------------------------------------------- +is_used_in_row macro + ldx ,s ; puzzle + row start + cmpa ,x + beq used@ + cmpa 1,x + beq used@ + cmpa 2,x + beq used@ + cmpa 3,x + beq used@ + cmpa 4,x + beq used@ + cmpa 5,x + beq used@ + cmpa 6,x + beq used@ + cmpa 7,x + beq used@ + cmpa 8,x + beq used@ + bra pass@ +used@ bra _loop_continue ; in range: _loop_continue is < 127 bytes ahead +pass@ + endm + +is_used_in_column macro + ldx 2,s ; puzzle + column + cmpa ,x + beq _loop_continue + cmpa (BOARD_SIZE*1),x + beq _loop_continue + cmpa (BOARD_SIZE*2),x + beq _loop_continue + cmpa (BOARD_SIZE*3),x + beq _loop_continue + cmpa (BOARD_SIZE*4),x + beq _loop_continue + cmpa (BOARD_SIZE*5),x + beq _loop_continue + cmpa (BOARD_SIZE*6),x + beq _loop_continue + cmpa (BOARD_SIZE*7),x + beq _loop_continue + cmpa (BOARD_SIZE*8),x + beq _loop_continue + endm + +is_used_in_box macro + ldx 4,s ; puzzle + box start + cmpa ,x + beq _loop_continue + cmpa 1,x + beq _loop_continue + cmpa 2,x + beq _loop_continue + cmpa BOARD_SIZE,x + beq _loop_continue + cmpa BOARD_SIZE+1,x + beq _loop_continue + cmpa BOARD_SIZE+2,x + beq _loop_continue + cmpa (BOARD_SIZE*2),x + beq _loop_continue + cmpa (BOARD_SIZE*2)+1,x + beq _loop_continue + cmpa (BOARD_SIZE*2)+2,x + beq _loop_continue + endm + +is_available macro + is_used_in_row + is_used_in_column + is_used_in_box + endm + +; ---------------------------------------------------------------------------- +; solve - recursive backtracking +; entry: B = cell index n (0..81) +; exit : A = 0 on success, A <> 0 on failure +; +; For each empty cell the row/column/box base pointers are computed ONCE and +; held on the stack; they do not depend on the candidate digit, so the inner +; digit loop avoids recomputing them. Per-cell stack frame: +; 0,s row pointer (puzzle + row start) +; 2,s column pointer (puzzle + column) +; 4,s box pointer (puzzle + box start) +; 6,s n (cell index) +; ---------------------------------------------------------------------------- +solve: + cmpb #CELL_COUNT + bne _not_finished + clra + rts ; success! + +_not_finished: + ldx #puzzle + lda b,x ; A = puzzle[n] + beq sv_empty ; empty cell -> try to fill it + incb ; already assigned -> skip + bra solve ; tail recursion + +sv_empty: + pshs b ; 0,s = n + ldx #table_move2box_start + ldb b,x ; B = box start (B still = n) + ldx #puzzle + abx + pshs x ; push box pointer + ldb 2,s ; B = n + ldx #table_move2x + ldb b,x ; B = column + ldx #puzzle + abx + pshs x ; push column pointer + ldb 4,s ; B = n + ldx #table_move2row_start + ldb b,x ; B = row start + ldx #puzzle + abx + pshs x ; push row pointer + lda #1 ; first candidate digit + +_loop: + is_available ; A = digit; conflict -> _loop_continue + + ; available: place the digit and recurse + ldb 6,s ; B = n + ldx #puzzle + sta b,x ; puzzle[n] = digit + pshs a ; 0,s = digit ; n now at 7,s + ldb 7,s ; B = n + incb ; recurse on n+1 + + jsr solve + + tsta + beq _return_true + + puls a ; A = digit ; frame restored + ; fall through to try the next digit +_loop_continue: + inca + cmpa #BOARD_SIZE+1 + lbne _loop ; _loop is > 127 bytes back + + ; failure, unmake & try again + ldb 6,s + ldx #puzzle + clr b,x ; puzzle[n] = UNASSIGNED + +_return_false: + leas 7,s ; drop the per-cell frame (row,col,box,n) + lda #1 ; non-zero -> failure + rts + +_return_true: + leas 8,s ; drop saved digit + per-cell frame + clra ; success + rts + +; ---------------------------------------------------------------------------- +; Board printing +; ---------------------------------------------------------------------------- +print_board_element: ; entry: B = cell index + lda #$20 ; space + jsr io_outchr + ldx #puzzle + lda b,x ; A = puzzle[index] + beq pbe_blank + adda #$30 ; digit -> ASCII + jsr io_outchr + bra pbe_done +pbe_blank: + lda #$2d ; '-' + jsr io_outchr +pbe_done: + lda #$20 ; space + jsr io_outchr + rts + +print_box_break_vertical: + lda #$7c ; '|' + jsr io_outchr + rts + +print_box_break_horizontal: + jsr io_outstr + fcc " --------+---------+--------" + fcb 0 + rts + +print_newline: + lda #$0d ; CR + jsr io_outchr + lda #$0a ; LF + jsr io_outchr + rts + +print_board: + jsr print_newline + jsr print_newline + jsr print_box_break_horizontal + jsr print_newline + + clrb ; index = 0 +pb_loop: + jsr print_board_element ; B = index + incb ; advance to next index + + ldx #table_move2box_y + lda b,x + bne pb_boxh + ldx #table_move2x + lda b,x + bne pb_boxh + jsr print_newline + jsr print_box_break_horizontal +pb_boxh: + ldx #table_move2x + lda b,x + bne pb_newl + jsr print_newline + bra pb_cont +pb_newl: + ldx #table_move2box_x + lda b,x + bne pb_cont + jsr print_box_break_vertical +pb_cont: + cmpb #CELL_COUNT + bne pb_loop + rts + +; ---------------------------------------------------------------------------- +; Read-only data +; ---------------------------------------------------------------------------- + +puzzle_init: + fcb 8,0,0,0,0,0,0,0,0 + fcb 0,0,3,6,0,0,0,0,0 + fcb 0,7,0,0,9,0,2,0,0 + fcb 0,5,0,0,0,7,0,0,0 + fcb 0,0,0,0,4,5,7,0,0 + fcb 0,0,0,1,0,0,0,3,0 + fcb 0,0,1,0,0,0,0,6,8 + fcb 0,0,8,5,0,0,0,1,0 + fcb 0,9,0,0,0,0,4,0,0 + +table_move2x: + fcb 0,1,2,3,4,5,6,7,8 + fcb 0,1,2,3,4,5,6,7,8 + fcb 0,1,2,3,4,5,6,7,8 + fcb 0,1,2,3,4,5,6,7,8 + fcb 0,1,2,3,4,5,6,7,8 + fcb 0,1,2,3,4,5,6,7,8 + fcb 0,1,2,3,4,5,6,7,8 + fcb 0,1,2,3,4,5,6,7,8 + fcb 0,1,2,3,4,5,6,7,8 + fcb 0 + +table_move2y: + fcb 0,0,0,0,0,0,0,0,0 + fcb 1,1,1,1,1,1,1,1,1 + fcb 2,2,2,2,2,2,2,2,2 + fcb 3,3,3,3,3,3,3,3,3 + fcb 4,4,4,4,4,4,4,4,4 + fcb 5,5,5,5,5,5,5,5,5 + fcb 6,6,6,6,6,6,6,6,6 + fcb 7,7,7,7,7,7,7,7,7 + fcb 8,8,8,8,8,8,8,8,8 + +table_move2box_x: + fcb 0,1,2,0,1,2,0,1,2 + fcb 0,1,2,0,1,2,0,1,2 + fcb 0,1,2,0,1,2,0,1,2 + fcb 0,1,2,0,1,2,0,1,2 + fcb 0,1,2,0,1,2,0,1,2 + fcb 0,1,2,0,1,2,0,1,2 + fcb 0,1,2,0,1,2,0,1,2 + fcb 0,1,2,0,1,2,0,1,2 + fcb 0,1,2,0,1,2,0,1,2 + fcb 0 + +table_move2box_y: + fcb 0,0,0,0,0,0,0,0,0 + fcb 1,1,1,1,1,1,1,1,1 + fcb 2,2,2,2,2,2,2,2,2 + fcb 0,0,0,0,0,0,0,0,0 + fcb 1,1,1,1,1,1,1,1,1 + fcb 2,2,2,2,2,2,2,2,2 + fcb 0,0,0,0,0,0,0,0,0 + fcb 1,1,1,1,1,1,1,1,1 + fcb 2,2,2,2,2,2,2,2,2 + fcb 0 + +table_move2row_start: + fcb 0,0,0,0,0,0,0,0,0 + fcb 9,9,9,9,9,9,9,9,9 + fcb 18,18,18,18,18,18,18,18,18 + fcb 27,27,27,27,27,27,27,27,27 + fcb 36,36,36,36,36,36,36,36,36 + fcb 45,45,45,45,45,45,45,45,45 + fcb 54,54,54,54,54,54,54,54,54 + fcb 63,63,63,63,63,63,63,63,63 + fcb 72,72,72,72,72,72,72,72,72 + +table_move2box_start: + fcb 0,0,0,3,3,3,6,6,6 + fcb 0,0,0,3,3,3,6,6,6 + fcb 0,0,0,3,3,3,6,6,6 + fcb 27,27,27,30,30,30,33,33,33 + fcb 27,27,27,30,30,30,33,33,33 + fcb 27,27,27,30,30,30,33,33,33 + fcb 54,54,54,57,57,57,60,60,60 + fcb 54,54,54,57,57,57,60,60,60 + fcb 54,54,54,57,57,57,60,60,60 + + zmb $FFF0-* ; pad ROM up to the vector table + + fdb halt ; $FFF0 reserved + fdb halt ; $FFF2 SWI3 + fdb halt ; $FFF4 SWI2 + fdb halt ; $FFF6 FIRQ + fdb halt ; $FFF8 IRQ + fdb halt ; $FFFA SWI + fdb halt ; $FFFC NMI + fdb reset ; $FFFE RESET \ No newline at end of file diff --git a/MC6809/MC6809.Test/roms/6809_sudoku/sudoku.bin b/MC6809/MC6809.Test/roms/6809_sudoku/sudoku.bin new file mode 100644 index 0000000..6d30575 Binary files /dev/null and b/MC6809/MC6809.Test/roms/6809_sudoku/sudoku.bin differ diff --git a/MC6809/MC6809.Test/roms/6809_sudoku/sudoku.hex b/MC6809/MC6809.Test/roms/6809_sudoku/sudoku.hex new file mode 100644 index 0000000..6f79b52 --- /dev/null +++ b/MC6809/MC6809.Test/roms/6809_sudoku/sudoku.hex @@ -0,0 +1,257 @@ +:10F000008603B7A0008615B7A000393402B6A00069 +:10F01000850227F93502398DF2B7A001393510A6DE +:10F020008027048DF220F83410391A5010CE400099 +:10F03000BDF0008EF1EE108E0200C651A680A7A092 +:10F040005A26F9BDF01D536F6C76696E6720707596 +:10F050007A7A6C653A20005FBDF07A4D260DBDF0DE +:10F060001D7061737300BDF1AE2008BDF01D6661B7 +:10F07000696C00860ABDF01720FEC15126024F3987 +:10F080008E0200A68527035C20F034048EF3D7E6B9 +:10F09000858E02003A3410E6628EF23FE6858E02DB +:10F0A000003A3410E6648EF386E6858E02003A3428 +:10F0B000108601AEE4A1842722A101271EA1022708 +:10F0C0001AA1032716A1042712A105270EA10627BE +:10F0D0000AA1072706A10827022002206AAE62A122 +:10F0E000842764A1092760A18812275BA1881B27B8 +:10F0F00056A188242751A1882D274CA1883627475F +:10F10000A1883F2742A18848273DAE64A1842737C4 +:10F11000A1012733A102272FA109272BA10A272705 +:10F12000A10B2723A18812271EA188132719A188C4 +:10F13000142714E6668E0200A7853402E6675CBDDC +:10F14000F07A4D271535024C810A1026FF65E666D8 +:10F150008E02006F85326786013932684F3986200A +:10F16000BDF0178E0200A68527078B30BDF0172053 +:10F1700005862DBDF0178620BDF01739867CBDF0C1 +:10F180001739BDF01D202D2D2D2D2D2D2D2D2B2D85 +:10F190002D2D2D2D2D2D2D2D2B2D2D2D2D2D2D2DA1 +:10F1A0002D0039860DBDF017860ABDF01739BDF167 +:10F1B000A3BDF1A3BDF182BDF1A35FBDF15E5C8E85 +:10F1C000F334A685260D8EF23FA6852606BDF1A353 +:10F1D000BDF1828EF23FA6852605BDF1A3200A8EE1 +:10F1E000F2E2A6852603BDF17CC15126CE39080086 +:10F1F0000000000000000000000306000000000006 +:10F2000000070000090002000000050000000700E0 +:10F2100000000000000004050700000000000100DD +:10F2200000000300000001000000000608000008C4 +:10F2300005000000010000090000000004000000BB +:10F24000010203040506070800010203040506077E +:10F250000800010203040506070800010203040573 +:10F26000060708000102030405060708000102035F +:10F27000040506070800010203040506070800014B +:10F280000203040506070800010203040506070837 +:10F290000000000000000000000001010101010168 +:10F2A000010101020202020202020202030303033D +:10F2B0000303030303040404040404040404050511 +:10F2C00005050505050505060606060606060606E5 +:10F2D00007070707070707070708080808080808B7 +:10F2E0000808000102000102000102000102000101 +:10F2F00002000102000102000102000102000102FD +:10F3000000010200010200010200010200010200EE +:10F3100001020001020001020001020001020001DD +:10F3200002000102000102000102000102000102CC +:10F3300000010200000000000000000000010101C7 +:10F3400001010101010102020202020202020200A5 +:10F3500000000000000000000101010101010101A5 +:10F36000010202020202020202020000000000008A +:10F37000000000010101010101010101020202027C +:10F38000020202020200000000000000000000096A +:10F390000909090909090909121212121212121295 +:10F3A000121B1B1B1B1B1B1B1B1B24242424242480 +:10F3B0002424242D2D2D2D2D2D2D2D2D3636363674 +:10F3C00036363636363F3F3F3F3F3F3F3F3F484868 +:10F3D000484848484848480000000303030606061A +:10F3E00000000003030306060600000003030306F3 +:10F3F00006061B1B1B1E1E1E2121211B1B1B1E1E66 +:10F400001E2121211B1B1B1E1E1E212121363636CB +:10F410003939393C3C3C3636363939393C3C3C3656 +:10F4200036363939393C3C3C000000000000000011 +:10F4300000000000000000000000000000000000CC +:10F4400000000000000000000000000000000000BC +:10F4500000000000000000000000000000000000AC +:10F46000000000000000000000000000000000009C +:10F47000000000000000000000000000000000008C +:10F48000000000000000000000000000000000007C +:10F49000000000000000000000000000000000006C +:10F4A000000000000000000000000000000000005C +:10F4B000000000000000000000000000000000004C +:10F4C000000000000000000000000000000000003C +:10F4D000000000000000000000000000000000002C +:10F4E000000000000000000000000000000000001C +:10F4F000000000000000000000000000000000000C +:10F5000000000000000000000000000000000000FB +:10F5100000000000000000000000000000000000EB +:10F5200000000000000000000000000000000000DB +:10F5300000000000000000000000000000000000CB +:10F5400000000000000000000000000000000000BB +:10F5500000000000000000000000000000000000AB +:10F56000000000000000000000000000000000009B +:10F57000000000000000000000000000000000008B +:10F58000000000000000000000000000000000007B +:10F59000000000000000000000000000000000006B +:10F5A000000000000000000000000000000000005B +:10F5B000000000000000000000000000000000004B +:10F5C000000000000000000000000000000000003B +:10F5D000000000000000000000000000000000002B +:10F5E000000000000000000000000000000000001B +:10F5F000000000000000000000000000000000000B +:10F6000000000000000000000000000000000000FA +:10F6100000000000000000000000000000000000EA +:10F6200000000000000000000000000000000000DA +:10F6300000000000000000000000000000000000CA +:10F6400000000000000000000000000000000000BA +:10F6500000000000000000000000000000000000AA +:10F66000000000000000000000000000000000009A +:10F67000000000000000000000000000000000008A +:10F68000000000000000000000000000000000007A +:10F69000000000000000000000000000000000006A +:10F6A000000000000000000000000000000000005A +:10F6B000000000000000000000000000000000004A +:10F6C000000000000000000000000000000000003A +:10F6D000000000000000000000000000000000002A +:10F6E000000000000000000000000000000000001A +:10F6F000000000000000000000000000000000000A +:10F7000000000000000000000000000000000000F9 +:10F7100000000000000000000000000000000000E9 +:10F7200000000000000000000000000000000000D9 +:10F7300000000000000000000000000000000000C9 +:10F7400000000000000000000000000000000000B9 +:10F7500000000000000000000000000000000000A9 +:10F760000000000000000000000000000000000099 +:10F770000000000000000000000000000000000089 +:10F780000000000000000000000000000000000079 +:10F790000000000000000000000000000000000069 +:10F7A0000000000000000000000000000000000059 +:10F7B0000000000000000000000000000000000049 +:10F7C0000000000000000000000000000000000039 +:10F7D0000000000000000000000000000000000029 +:10F7E0000000000000000000000000000000000019 +:10F7F0000000000000000000000000000000000009 +:10F8000000000000000000000000000000000000F8 +:10F8100000000000000000000000000000000000E8 +:10F8200000000000000000000000000000000000D8 +:10F8300000000000000000000000000000000000C8 +:10F8400000000000000000000000000000000000B8 +:10F8500000000000000000000000000000000000A8 +:10F860000000000000000000000000000000000098 +:10F870000000000000000000000000000000000088 +:10F880000000000000000000000000000000000078 +:10F890000000000000000000000000000000000068 +:10F8A0000000000000000000000000000000000058 +:10F8B0000000000000000000000000000000000048 +:10F8C0000000000000000000000000000000000038 +:10F8D0000000000000000000000000000000000028 +:10F8E0000000000000000000000000000000000018 +:10F8F0000000000000000000000000000000000008 +:10F9000000000000000000000000000000000000F7 +:10F9100000000000000000000000000000000000E7 +:10F9200000000000000000000000000000000000D7 +:10F9300000000000000000000000000000000000C7 +:10F9400000000000000000000000000000000000B7 +:10F9500000000000000000000000000000000000A7 +:10F960000000000000000000000000000000000097 +:10F970000000000000000000000000000000000087 +:10F980000000000000000000000000000000000077 +:10F990000000000000000000000000000000000067 +:10F9A0000000000000000000000000000000000057 +:10F9B0000000000000000000000000000000000047 +:10F9C0000000000000000000000000000000000037 +:10F9D0000000000000000000000000000000000027 +:10F9E0000000000000000000000000000000000017 +:10F9F0000000000000000000000000000000000007 +:10FA000000000000000000000000000000000000F6 +:10FA100000000000000000000000000000000000E6 +:10FA200000000000000000000000000000000000D6 +:10FA300000000000000000000000000000000000C6 +:10FA400000000000000000000000000000000000B6 +:10FA500000000000000000000000000000000000A6 +:10FA60000000000000000000000000000000000096 +:10FA70000000000000000000000000000000000086 +:10FA80000000000000000000000000000000000076 +:10FA90000000000000000000000000000000000066 +:10FAA0000000000000000000000000000000000056 +:10FAB0000000000000000000000000000000000046 +:10FAC0000000000000000000000000000000000036 +:10FAD0000000000000000000000000000000000026 +:10FAE0000000000000000000000000000000000016 +:10FAF0000000000000000000000000000000000006 +:10FB000000000000000000000000000000000000F5 +:10FB100000000000000000000000000000000000E5 +:10FB200000000000000000000000000000000000D5 +:10FB300000000000000000000000000000000000C5 +:10FB400000000000000000000000000000000000B5 +:10FB500000000000000000000000000000000000A5 +:10FB60000000000000000000000000000000000095 +:10FB70000000000000000000000000000000000085 +:10FB80000000000000000000000000000000000075 +:10FB90000000000000000000000000000000000065 +:10FBA0000000000000000000000000000000000055 +:10FBB0000000000000000000000000000000000045 +:10FBC0000000000000000000000000000000000035 +:10FBD0000000000000000000000000000000000025 +:10FBE0000000000000000000000000000000000015 +:10FBF0000000000000000000000000000000000005 +:10FC000000000000000000000000000000000000F4 +:10FC100000000000000000000000000000000000E4 +:10FC200000000000000000000000000000000000D4 +:10FC300000000000000000000000000000000000C4 +:10FC400000000000000000000000000000000000B4 +:10FC500000000000000000000000000000000000A4 +:10FC60000000000000000000000000000000000094 +:10FC70000000000000000000000000000000000084 +:10FC80000000000000000000000000000000000074 +:10FC90000000000000000000000000000000000064 +:10FCA0000000000000000000000000000000000054 +:10FCB0000000000000000000000000000000000044 +:10FCC0000000000000000000000000000000000034 +:10FCD0000000000000000000000000000000000024 +:10FCE0000000000000000000000000000000000014 +:10FCF0000000000000000000000000000000000004 +:10FD000000000000000000000000000000000000F3 +:10FD100000000000000000000000000000000000E3 +:10FD200000000000000000000000000000000000D3 +:10FD300000000000000000000000000000000000C3 +:10FD400000000000000000000000000000000000B3 +:10FD500000000000000000000000000000000000A3 +:10FD60000000000000000000000000000000000093 +:10FD70000000000000000000000000000000000083 +:10FD80000000000000000000000000000000000073 +:10FD90000000000000000000000000000000000063 +:10FDA0000000000000000000000000000000000053 +:10FDB0000000000000000000000000000000000043 +:10FDC0000000000000000000000000000000000033 +:10FDD0000000000000000000000000000000000023 +:10FDE0000000000000000000000000000000000013 +:10FDF0000000000000000000000000000000000003 +:10FE000000000000000000000000000000000000F2 +:10FE100000000000000000000000000000000000E2 +:10FE200000000000000000000000000000000000D2 +:10FE300000000000000000000000000000000000C2 +:10FE400000000000000000000000000000000000B2 +:10FE500000000000000000000000000000000000A2 +:10FE60000000000000000000000000000000000092 +:10FE70000000000000000000000000000000000082 +:10FE80000000000000000000000000000000000072 +:10FE90000000000000000000000000000000000062 +:10FEA0000000000000000000000000000000000052 +:10FEB0000000000000000000000000000000000042 +:10FEC0000000000000000000000000000000000032 +:10FED0000000000000000000000000000000000022 +:10FEE0000000000000000000000000000000000012 +:10FEF0000000000000000000000000000000000002 +:10FF000000000000000000000000000000000000F1 +:10FF100000000000000000000000000000000000E1 +:10FF200000000000000000000000000000000000D1 +:10FF300000000000000000000000000000000000C1 +:10FF400000000000000000000000000000000000B1 +:10FF500000000000000000000000000000000000A1 +:10FF60000000000000000000000000000000000091 +:10FF70000000000000000000000000000000000081 +:10FF80000000000000000000000000000000000071 +:10FF90000000000000000000000000000000000061 +:10FFA0000000000000000000000000000000000051 +:10FFB0000000000000000000000000000000000041 +:10FFC0000000000000000000000000000000000031 +:10FFD0000000000000000000000000000000000021 +:10FFE0000000000000000000000000000000000011 +:10FFF000F078F078F078F078F078F078F078F02A0F +:00000001FF \ No newline at end of file diff --git a/MC6809/MC6809.Test/roms/6809_sudoku/sudoku.lst b/MC6809/MC6809.Test/roms/6809_sudoku/sudoku.lst new file mode 100644 index 0000000..a99cf5f --- /dev/null +++ b/MC6809/MC6809.Test/roms/6809_sudoku/sudoku.lst @@ -0,0 +1,958 @@ + ( sudoku.asm):00001 ; ============================================================================ + ( sudoku.asm):00002 ; 6809_sudoku - Sudoku solver in Motorola 6809 assembler (lwtools: lwasm) + ( sudoku.asm):00003 ; + ( sudoku.asm):00004 ; A port of the 6502 version to the 6809. Recursive backtracking solver, same + ( sudoku.asm):00005 ; algorithm and same console output. + ( sudoku.asm):00006 ; + ( sudoku.asm):00007 ; Console I/O matches the 6502 build (write a byte to CONOUT to print it). + ( sudoku.asm):00008 ; ROM at $F000-$FFFF, 6809 vectors at $FFF0-$FFFF, working RAM from $0200. + ( sudoku.asm):00009 ; ============================================================================ + ( sudoku.asm):00010 + ( sudoku.asm):00011 ; ---- constants ------------------------------------------------------------- + ( sudoku.asm):00012 + 0000 ( sudoku.asm):00013 UNASSIGNED equ 0 + 0009 ( sudoku.asm):00014 BOARD_SIZE equ 9 + 0051 ( sudoku.asm):00015 CELL_COUNT equ BOARD_SIZE*BOARD_SIZE ; 81 + 4000 ( sudoku.asm):00016 STACKTOP equ $4000 ; hardware stack top (RAM $0200-$3FFF) + ( sudoku.asm):00017 + ( sudoku.asm):00018 ; ---- working RAM (uninitialised) ------------------------------------------- + 0200 ( sudoku.asm):00019 puzzle equ $0200 ; live 9x9 board in RAM ($0200..$0250) + ( sudoku.asm):00020 + ( sudoku.asm):00021 ; ---- code ------------------------------------------------------------------ + ( sudoku.asm):00022 org $F000 + ( sudoku.asm):00023 include "io.inc" + ( io.inc):00001 ; io.inc - console I/O for the 6809 sudoku port + ( io.inc):00002 ; + ( io.inc):00003 ; Memory-mapped console, matching the 6502 build: writing a byte to 6850 ACIA + ( io.inc):00004 ; emits a character. + ( io.inc):00005 + A000 ( io.inc):00006 UART equ $A000 + A001 ( io.inc):00007 RECEV equ UART+1 + A001 ( io.inc):00008 TRANS equ UART+1 + A000 ( io.inc):00009 USTAT equ UART + A000 ( io.inc):00010 UCTRL equ UART + ( io.inc):00011 + 0003 ( io.inc):00012 ACIA_RESET equ $03 ; master reset (CR1:CR0 = 11) + 0015 ( io.inc):00013 ACIA_CFG equ $15 ; div-16, 8 data / no parity / 1 stop, no interrupts + ( io.inc):00014 + ( io.inc):00015 +F000 ( io.inc):00016 io_initialise_acia: +F000 8603 ( io.inc):00017 lda #ACIA_RESET ; master reset must precede configuration +F002 B7A000 ( io.inc):00018 sta UCTRL +F005 8615 ( io.inc):00019 lda #ACIA_CFG ; DIV16 CLOCK -> 7372800 / 4 / 16 = 115200 baud +F007 B7A000 ( io.inc):00020 sta UCTRL +F00A 39 ( io.inc):00021 rts + ( io.inc):00022 + ( io.inc):00023 ; io_waitacia - wait for the ACIA to become ready +F00B ( io.inc):00024 io_waitacia: +F00B 3402 ( io.inc):00025 pshs a +F00D B6A000 ( io.inc):00026 io_wrwait: lda USTAT +F010 8502 ( io.inc):00027 bita #2 +F012 27F9 ( io.inc):00028 beq io_wrwait +F014 3502 ( io.inc):00029 puls a +F016 39 ( io.inc):00030 rts + ( io.inc):00031 + ( io.inc):00032 ; io_outchr - print the character held in A +F017 ( io.inc):00033 io_outchr: +F017 8DF2 ( io.inc):00034 bsr io_waitacia +F019 B7A001 ( io.inc):00035 sta TRANS +F01C 39 ( io.inc):00036 rts + ( io.inc):00037 + ( io.inc):00038 ; io_outstr - print the nul-terminated string that immediately follows the + ( io.inc):00039 ; "jsr io_outstr" instruction, then resume just past the nul. + ( io.inc):00040 ; (Inline-string trick, as used in the 6502 original.) +F01D ( io.inc):00041 io_outstr: +F01D 3510 ( io.inc):00042 puls x ; X = return address = first byte of string +F01F ( io.inc):00043 ios_loop: +F01F A680 ( io.inc):00044 lda ,x+ +F021 2704 ( io.inc):00045 beq ios_done +F023 8DF2 ( io.inc):00046 bsr io_outchr +F025 20F8 ( io.inc):00047 bra ios_loop +F027 ( io.inc):00048 ios_done: +F027 3410 ( io.inc):00049 pshs x ; resume after the terminating nul +F029 39 ( io.inc):00050 rts + ( sudoku.asm):00024 + ( sudoku.asm):00025 ; ---------------------------------------------------------------------------- + ( sudoku.asm):00026 ; reset - entry point + ( sudoku.asm):00027 ; ---------------------------------------------------------------------------- +F02A ( sudoku.asm):00028 reset: +F02A 1A50 ( sudoku.asm):00029 orcc #$50 ; mask IRQ and FIRQ +F02C 10CE4000 ( sudoku.asm):00030 lds #STACKTOP ; set up the hardware stack +F030 BDF000 ( sudoku.asm):00031 jsr io_initialise_acia + ( sudoku.asm):00032 + ( sudoku.asm):00033 ; copy the clues from ROM into writable RAM +F033 8EF1EE ( sudoku.asm):00034 ldx #puzzle_init +F036 108E0200 ( sudoku.asm):00035 ldy #puzzle +F03A C651 ( sudoku.asm):00036 ldb #CELL_COUNT +F03C ( sudoku.asm):00037 rinit: +F03C A680 ( sudoku.asm):00038 lda ,x+ +F03E A7A0 ( sudoku.asm):00039 sta ,y+ +F040 5A ( sudoku.asm):00040 decb +F041 26F9 ( sudoku.asm):00041 bne rinit + ( sudoku.asm):00042 +F043 BDF01D ( sudoku.asm):00043 jsr io_outstr +F046 536F6C76696E6720 ( sudoku.asm):00044 fcc "Solving puzzle: " + 70757A7A6C653A20 +F056 00 ( sudoku.asm):00045 fcb 0 + ( sudoku.asm):00046 +F057 5F ( sudoku.asm):00047 clrb ; n = 0 +F058 BDF07A ( sudoku.asm):00048 jsr solve +F05B 4D ( sudoku.asm):00049 tsta +F05C 260D ( sudoku.asm):00050 bne rfail + ( sudoku.asm):00051 +F05E BDF01D ( sudoku.asm):00052 jsr io_outstr +F061 70617373 ( sudoku.asm):00053 fcc "pass" +F065 00 ( sudoku.asm):00054 fcb 0 +F066 BDF1AE ( sudoku.asm):00055 jsr print_board +F069 2008 ( sudoku.asm):00056 bra rdone +F06B ( sudoku.asm):00057 rfail: +F06B BDF01D ( sudoku.asm):00058 jsr io_outstr +F06E 6661696C ( sudoku.asm):00059 fcc "fail" +F072 00 ( sudoku.asm):00060 fcb 0 +F073 ( sudoku.asm):00061 rdone: +F073 860A ( sudoku.asm):00062 lda #$0a ; trailing newline +F075 BDF017 ( sudoku.asm):00063 jsr io_outchr +F078 ( sudoku.asm):00064 halt: +F078 20FE ( sudoku.asm):00065 bra halt + ( sudoku.asm):00066 + ( sudoku.asm):00067 ; ---------------------------------------------------------------------------- + ( sudoku.asm):00068 ; Inlined availability checks (macros). The row/column/box base pointers are + ( sudoku.asm):00069 ; precomputed once per cell and held on the stack (see solve), so each check + ( sudoku.asm):00070 ; is a single "ldx n,s" plus the nine comparisons. A = candidate digit. + ( sudoku.asm):00071 ; A conflict branches to _loop_continue; no conflict falls through. The row + ( sudoku.asm):00072 ; check keeps a local 'used@' trampoline (its early compares sit >127 bytes + ( sudoku.asm):00073 ; from _loop_continue); column and box branch to _loop_continue directly. + ( sudoku.asm):00074 ; 0,s = row pointer 2,s = column pointer 4,s = box pointer + ( sudoku.asm):00075 ; ---------------------------------------------------------------------------- +F07A ( sudoku.asm):00076 is_used_in_row macro + ( sudoku.asm):00077 ldx ,s ; puzzle + row start + ( sudoku.asm):00078 cmpa ,x + ( sudoku.asm):00079 beq used@ + ( sudoku.asm):00080 cmpa 1,x + ( sudoku.asm):00081 beq used@ + ( sudoku.asm):00082 cmpa 2,x + ( sudoku.asm):00083 beq used@ + ( sudoku.asm):00084 cmpa 3,x + ( sudoku.asm):00085 beq used@ + ( sudoku.asm):00086 cmpa 4,x + ( sudoku.asm):00087 beq used@ + ( sudoku.asm):00088 cmpa 5,x + ( sudoku.asm):00089 beq used@ + ( sudoku.asm):00090 cmpa 6,x + ( sudoku.asm):00091 beq used@ + ( sudoku.asm):00092 cmpa 7,x + ( sudoku.asm):00093 beq used@ + ( sudoku.asm):00094 cmpa 8,x + ( sudoku.asm):00095 beq used@ + ( sudoku.asm):00096 bra pass@ +F07A ( sudoku.asm):00097 used@ bra _loop_continue ; in range: _loop_continue is < 127 bytes ahead +F07A ( sudoku.asm):00098 pass@ + ( sudoku.asm):00099 endm + ( sudoku.asm):00100 +F07A ( sudoku.asm):00101 is_used_in_column macro + ( sudoku.asm):00102 ldx 2,s ; puzzle + column + ( sudoku.asm):00103 cmpa ,x + ( sudoku.asm):00104 beq _loop_continue + ( sudoku.asm):00105 cmpa (BOARD_SIZE*1),x + ( sudoku.asm):00106 beq _loop_continue + ( sudoku.asm):00107 cmpa (BOARD_SIZE*2),x + ( sudoku.asm):00108 beq _loop_continue + ( sudoku.asm):00109 cmpa (BOARD_SIZE*3),x + ( sudoku.asm):00110 beq _loop_continue + ( sudoku.asm):00111 cmpa (BOARD_SIZE*4),x + ( sudoku.asm):00112 beq _loop_continue + ( sudoku.asm):00113 cmpa (BOARD_SIZE*5),x + ( sudoku.asm):00114 beq _loop_continue + ( sudoku.asm):00115 cmpa (BOARD_SIZE*6),x + ( sudoku.asm):00116 beq _loop_continue + ( sudoku.asm):00117 cmpa (BOARD_SIZE*7),x + ( sudoku.asm):00118 beq _loop_continue + ( sudoku.asm):00119 cmpa (BOARD_SIZE*8),x + ( sudoku.asm):00120 beq _loop_continue + ( sudoku.asm):00121 endm + ( sudoku.asm):00122 +F07A ( sudoku.asm):00123 is_used_in_box macro + ( sudoku.asm):00124 ldx 4,s ; puzzle + box start + ( sudoku.asm):00125 cmpa ,x + ( sudoku.asm):00126 beq _loop_continue + ( sudoku.asm):00127 cmpa 1,x + ( sudoku.asm):00128 beq _loop_continue + ( sudoku.asm):00129 cmpa 2,x + ( sudoku.asm):00130 beq _loop_continue + ( sudoku.asm):00131 cmpa BOARD_SIZE,x + ( sudoku.asm):00132 beq _loop_continue + ( sudoku.asm):00133 cmpa BOARD_SIZE+1,x + ( sudoku.asm):00134 beq _loop_continue + ( sudoku.asm):00135 cmpa BOARD_SIZE+2,x + ( sudoku.asm):00136 beq _loop_continue + ( sudoku.asm):00137 cmpa (BOARD_SIZE*2),x + ( sudoku.asm):00138 beq _loop_continue + ( sudoku.asm):00139 cmpa (BOARD_SIZE*2)+1,x + ( sudoku.asm):00140 beq _loop_continue + ( sudoku.asm):00141 cmpa (BOARD_SIZE*2)+2,x + ( sudoku.asm):00142 beq _loop_continue + ( sudoku.asm):00143 endm + ( sudoku.asm):00144 +F07A ( sudoku.asm):00145 is_available macro + ( sudoku.asm):00146 is_used_in_row + ( sudoku.asm):00147 is_used_in_column + ( sudoku.asm):00148 is_used_in_box + ( sudoku.asm):00149 endm + ( sudoku.asm):00150 + ( sudoku.asm):00151 ; ---------------------------------------------------------------------------- + ( sudoku.asm):00152 ; solve - recursive backtracking + ( sudoku.asm):00153 ; entry: B = cell index n (0..81) + ( sudoku.asm):00154 ; exit : A = 0 on success, A <> 0 on failure + ( sudoku.asm):00155 ; + ( sudoku.asm):00156 ; For each empty cell the row/column/box base pointers are computed ONCE and + ( sudoku.asm):00157 ; held on the stack; they do not depend on the candidate digit, so the inner + ( sudoku.asm):00158 ; digit loop avoids recomputing them. Per-cell stack frame: + ( sudoku.asm):00159 ; 0,s row pointer (puzzle + row start) + ( sudoku.asm):00160 ; 2,s column pointer (puzzle + column) + ( sudoku.asm):00161 ; 4,s box pointer (puzzle + box start) + ( sudoku.asm):00162 ; 6,s n (cell index) + ( sudoku.asm):00163 ; ---------------------------------------------------------------------------- +F07A ( sudoku.asm):00164 solve: +F07A C151 ( sudoku.asm):00165 cmpb #CELL_COUNT +F07C 2602 ( sudoku.asm):00166 bne _not_finished +F07E 4F ( sudoku.asm):00167 clra +F07F 39 ( sudoku.asm):00168 rts ; success! + ( sudoku.asm):00169 +F080 ( sudoku.asm):00170 _not_finished: +F080 8E0200 ( sudoku.asm):00171 ldx #puzzle +F083 A685 ( sudoku.asm):00172 lda b,x ; A = puzzle[n] +F085 2703 ( sudoku.asm):00173 beq sv_empty ; empty cell -> try to fill it +F087 5C ( sudoku.asm):00174 incb ; already assigned -> skip +F088 20F0 ( sudoku.asm):00175 bra solve ; tail recursion + ( sudoku.asm):00176 +F08A ( sudoku.asm):00177 sv_empty: +F08A 3404 ( sudoku.asm):00178 pshs b ; 0,s = n +F08C 8EF3D7 ( sudoku.asm):00179 ldx #table_move2box_start +F08F E685 ( sudoku.asm):00180 ldb b,x ; B = box start (B still = n) +F091 8E0200 ( sudoku.asm):00181 ldx #puzzle +F094 3A ( sudoku.asm):00182 abx +F095 3410 ( sudoku.asm):00183 pshs x ; push box pointer +F097 E662 ( sudoku.asm):00184 ldb 2,s ; B = n +F099 8EF23F ( sudoku.asm):00185 ldx #table_move2x +F09C E685 ( sudoku.asm):00186 ldb b,x ; B = column +F09E 8E0200 ( sudoku.asm):00187 ldx #puzzle +F0A1 3A ( sudoku.asm):00188 abx +F0A2 3410 ( sudoku.asm):00189 pshs x ; push column pointer +F0A4 E664 ( sudoku.asm):00190 ldb 4,s ; B = n +F0A6 8EF386 ( sudoku.asm):00191 ldx #table_move2row_start +F0A9 E685 ( sudoku.asm):00192 ldb b,x ; B = row start +F0AB 8E0200 ( sudoku.asm):00193 ldx #puzzle +F0AE 3A ( sudoku.asm):00194 abx +F0AF 3410 ( sudoku.asm):00195 pshs x ; push row pointer +F0B1 8601 ( sudoku.asm):00196 lda #1 ; first candidate digit + ( sudoku.asm):00197 +F0B3 ( sudoku.asm):00198 _loop: + ( sudoku.asm):00199 is_available ; A = digit; conflict -> _loop_continue + ( is_available):00001 is_used_in_row +F0B3 AEE4 ( is_used_in_row):00001 ldx ,s ; puzzle + row start +F0B5 A184 ( is_used_in_row):00002 cmpa ,x +F0B7 2722 ( is_used_in_row):00003 beq used@ +F0B9 A101 ( is_used_in_row):00004 cmpa 1,x +F0BB 271E ( is_used_in_row):00005 beq used@ +F0BD A102 ( is_used_in_row):00006 cmpa 2,x +F0BF 271A ( is_used_in_row):00007 beq used@ +F0C1 A103 ( is_used_in_row):00008 cmpa 3,x +F0C3 2716 ( is_used_in_row):00009 beq used@ +F0C5 A104 ( is_used_in_row):00010 cmpa 4,x +F0C7 2712 ( is_used_in_row):00011 beq used@ +F0C9 A105 ( is_used_in_row):00012 cmpa 5,x +F0CB 270E ( is_used_in_row):00013 beq used@ +F0CD A106 ( is_used_in_row):00014 cmpa 6,x +F0CF 270A ( is_used_in_row):00015 beq used@ +F0D1 A107 ( is_used_in_row):00016 cmpa 7,x +F0D3 2706 ( is_used_in_row):00017 beq used@ +F0D5 A108 ( is_used_in_row):00018 cmpa 8,x +F0D7 2702 ( is_used_in_row):00019 beq used@ +F0D9 2002 ( is_used_in_row):00020 bra pass@ +F0DB 206A ( is_used_in_row):00021 used@ bra _loop_continue ; in range: _loop_continue is < 127 bytes ahead +F0DD ( is_used_in_row):00022 pass@ + ( is_available):00002 is_used_in_column +F0DD AE62 (is_used_in_column):00001 ldx 2,s ; puzzle + column +F0DF A184 (is_used_in_column):00002 cmpa ,x +F0E1 2764 (is_used_in_column):00003 beq _loop_continue +F0E3 A109 (is_used_in_column):00004 cmpa (BOARD_SIZE*1),x +F0E5 2760 (is_used_in_column):00005 beq _loop_continue +F0E7 A18812 (is_used_in_column):00006 cmpa (BOARD_SIZE*2),x +F0EA 275B (is_used_in_column):00007 beq _loop_continue +F0EC A1881B (is_used_in_column):00008 cmpa (BOARD_SIZE*3),x +F0EF 2756 (is_used_in_column):00009 beq _loop_continue +F0F1 A18824 (is_used_in_column):00010 cmpa (BOARD_SIZE*4),x +F0F4 2751 (is_used_in_column):00011 beq _loop_continue +F0F6 A1882D (is_used_in_column):00012 cmpa (BOARD_SIZE*5),x +F0F9 274C (is_used_in_column):00013 beq _loop_continue +F0FB A18836 (is_used_in_column):00014 cmpa (BOARD_SIZE*6),x +F0FE 2747 (is_used_in_column):00015 beq _loop_continue +F100 A1883F (is_used_in_column):00016 cmpa (BOARD_SIZE*7),x +F103 2742 (is_used_in_column):00017 beq _loop_continue +F105 A18848 (is_used_in_column):00018 cmpa (BOARD_SIZE*8),x +F108 273D (is_used_in_column):00019 beq _loop_continue + ( is_available):00003 is_used_in_box +F10A AE64 ( is_used_in_box):00001 ldx 4,s ; puzzle + box start +F10C A184 ( is_used_in_box):00002 cmpa ,x +F10E 2737 ( is_used_in_box):00003 beq _loop_continue +F110 A101 ( is_used_in_box):00004 cmpa 1,x +F112 2733 ( is_used_in_box):00005 beq _loop_continue +F114 A102 ( is_used_in_box):00006 cmpa 2,x +F116 272F ( is_used_in_box):00007 beq _loop_continue +F118 A109 ( is_used_in_box):00008 cmpa BOARD_SIZE,x +F11A 272B ( is_used_in_box):00009 beq _loop_continue +F11C A10A ( is_used_in_box):00010 cmpa BOARD_SIZE+1,x +F11E 2727 ( is_used_in_box):00011 beq _loop_continue +F120 A10B ( is_used_in_box):00012 cmpa BOARD_SIZE+2,x +F122 2723 ( is_used_in_box):00013 beq _loop_continue +F124 A18812 ( is_used_in_box):00014 cmpa (BOARD_SIZE*2),x +F127 271E ( is_used_in_box):00015 beq _loop_continue +F129 A18813 ( is_used_in_box):00016 cmpa (BOARD_SIZE*2)+1,x +F12C 2719 ( is_used_in_box):00017 beq _loop_continue +F12E A18814 ( is_used_in_box):00018 cmpa (BOARD_SIZE*2)+2,x +F131 2714 ( is_used_in_box):00019 beq _loop_continue + ( sudoku.asm):00200 + ( sudoku.asm):00201 ; available: place the digit and recurse +F133 E666 ( sudoku.asm):00202 ldb 6,s ; B = n +F135 8E0200 ( sudoku.asm):00203 ldx #puzzle +F138 A785 ( sudoku.asm):00204 sta b,x ; puzzle[n] = digit +F13A 3402 ( sudoku.asm):00205 pshs a ; 0,s = digit ; n now at 7,s +F13C E667 ( sudoku.asm):00206 ldb 7,s ; B = n +F13E 5C ( sudoku.asm):00207 incb ; recurse on n+1 + ( sudoku.asm):00208 +F13F BDF07A ( sudoku.asm):00209 jsr solve + ( sudoku.asm):00210 +F142 4D ( sudoku.asm):00211 tsta +F143 2715 ( sudoku.asm):00212 beq _return_true + ( sudoku.asm):00213 +F145 3502 ( sudoku.asm):00214 puls a ; A = digit ; frame restored + ( sudoku.asm):00215 ; fall through to try the next digit +F147 ( sudoku.asm):00216 _loop_continue: +F147 4C ( sudoku.asm):00217 inca +F148 810A ( sudoku.asm):00218 cmpa #BOARD_SIZE+1 +F14A 1026FF65 ( sudoku.asm):00219 lbne _loop ; _loop is > 127 bytes back + ( sudoku.asm):00220 + ( sudoku.asm):00221 ; failure, unmake & try again +F14E E666 ( sudoku.asm):00222 ldb 6,s +F150 8E0200 ( sudoku.asm):00223 ldx #puzzle +F153 6F85 ( sudoku.asm):00224 clr b,x ; puzzle[n] = UNASSIGNED + ( sudoku.asm):00225 +F155 ( sudoku.asm):00226 _return_false: +F155 3267 ( sudoku.asm):00227 leas 7,s ; drop the per-cell frame (row,col,box,n) +F157 8601 ( sudoku.asm):00228 lda #1 ; non-zero -> failure +F159 39 ( sudoku.asm):00229 rts + ( sudoku.asm):00230 +F15A ( sudoku.asm):00231 _return_true: +F15A 3268 ( sudoku.asm):00232 leas 8,s ; drop saved digit + per-cell frame +F15C 4F ( sudoku.asm):00233 clra ; success +F15D 39 ( sudoku.asm):00234 rts + ( sudoku.asm):00235 + ( sudoku.asm):00236 ; ---------------------------------------------------------------------------- + ( sudoku.asm):00237 ; Board printing + ( sudoku.asm):00238 ; ---------------------------------------------------------------------------- +F15E ( sudoku.asm):00239 print_board_element: ; entry: B = cell index +F15E 8620 ( sudoku.asm):00240 lda #$20 ; space +F160 BDF017 ( sudoku.asm):00241 jsr io_outchr +F163 8E0200 ( sudoku.asm):00242 ldx #puzzle +F166 A685 ( sudoku.asm):00243 lda b,x ; A = puzzle[index] +F168 2707 ( sudoku.asm):00244 beq pbe_blank +F16A 8B30 ( sudoku.asm):00245 adda #$30 ; digit -> ASCII +F16C BDF017 ( sudoku.asm):00246 jsr io_outchr +F16F 2005 ( sudoku.asm):00247 bra pbe_done +F171 ( sudoku.asm):00248 pbe_blank: +F171 862D ( sudoku.asm):00249 lda #$2d ; '-' +F173 BDF017 ( sudoku.asm):00250 jsr io_outchr +F176 ( sudoku.asm):00251 pbe_done: +F176 8620 ( sudoku.asm):00252 lda #$20 ; space +F178 BDF017 ( sudoku.asm):00253 jsr io_outchr +F17B 39 ( sudoku.asm):00254 rts + ( sudoku.asm):00255 +F17C ( sudoku.asm):00256 print_box_break_vertical: +F17C 867C ( sudoku.asm):00257 lda #$7c ; '|' +F17E BDF017 ( sudoku.asm):00258 jsr io_outchr +F181 39 ( sudoku.asm):00259 rts + ( sudoku.asm):00260 +F182 ( sudoku.asm):00261 print_box_break_horizontal: +F182 BDF01D ( sudoku.asm):00262 jsr io_outstr +F185 202D2D2D2D2D2D2D ( sudoku.asm):00263 fcc " --------+---------+--------" + 2D2B2D2D2D2D2D2D + 2D2D2D2B2D2D2D2D + 2D2D2D2D +F1A1 00 ( sudoku.asm):00264 fcb 0 +F1A2 39 ( sudoku.asm):00265 rts + ( sudoku.asm):00266 +F1A3 ( sudoku.asm):00267 print_newline: +F1A3 860D ( sudoku.asm):00268 lda #$0d ; CR +F1A5 BDF017 ( sudoku.asm):00269 jsr io_outchr +F1A8 860A ( sudoku.asm):00270 lda #$0a ; LF +F1AA BDF017 ( sudoku.asm):00271 jsr io_outchr +F1AD 39 ( sudoku.asm):00272 rts + ( sudoku.asm):00273 +F1AE ( sudoku.asm):00274 print_board: +F1AE BDF1A3 ( sudoku.asm):00275 jsr print_newline +F1B1 BDF1A3 ( sudoku.asm):00276 jsr print_newline +F1B4 BDF182 ( sudoku.asm):00277 jsr print_box_break_horizontal +F1B7 BDF1A3 ( sudoku.asm):00278 jsr print_newline + ( sudoku.asm):00279 +F1BA 5F ( sudoku.asm):00280 clrb ; index = 0 +F1BB ( sudoku.asm):00281 pb_loop: +F1BB BDF15E ( sudoku.asm):00282 jsr print_board_element ; B = index +F1BE 5C ( sudoku.asm):00283 incb ; advance to next index + ( sudoku.asm):00284 +F1BF 8EF334 ( sudoku.asm):00285 ldx #table_move2box_y +F1C2 A685 ( sudoku.asm):00286 lda b,x +F1C4 260D ( sudoku.asm):00287 bne pb_boxh +F1C6 8EF23F ( sudoku.asm):00288 ldx #table_move2x +F1C9 A685 ( sudoku.asm):00289 lda b,x +F1CB 2606 ( sudoku.asm):00290 bne pb_boxh +F1CD BDF1A3 ( sudoku.asm):00291 jsr print_newline +F1D0 BDF182 ( sudoku.asm):00292 jsr print_box_break_horizontal +F1D3 ( sudoku.asm):00293 pb_boxh: +F1D3 8EF23F ( sudoku.asm):00294 ldx #table_move2x +F1D6 A685 ( sudoku.asm):00295 lda b,x +F1D8 2605 ( sudoku.asm):00296 bne pb_newl +F1DA BDF1A3 ( sudoku.asm):00297 jsr print_newline +F1DD 200A ( sudoku.asm):00298 bra pb_cont +F1DF ( sudoku.asm):00299 pb_newl: +F1DF 8EF2E2 ( sudoku.asm):00300 ldx #table_move2box_x +F1E2 A685 ( sudoku.asm):00301 lda b,x +F1E4 2603 ( sudoku.asm):00302 bne pb_cont +F1E6 BDF17C ( sudoku.asm):00303 jsr print_box_break_vertical +F1E9 ( sudoku.asm):00304 pb_cont: +F1E9 C151 ( sudoku.asm):00305 cmpb #CELL_COUNT +F1EB 26CE ( sudoku.asm):00306 bne pb_loop +F1ED 39 ( sudoku.asm):00307 rts + ( sudoku.asm):00308 + ( sudoku.asm):00309 ; ---------------------------------------------------------------------------- + ( sudoku.asm):00310 ; Read-only data + ( sudoku.asm):00311 ; ---------------------------------------------------------------------------- + ( sudoku.asm):00312 +F1EE ( sudoku.asm):00313 puzzle_init: +F1EE 0800000000000000 ( sudoku.asm):00314 fcb 8,0,0,0,0,0,0,0,0 + 00 +F1F7 0000030600000000 ( sudoku.asm):00315 fcb 0,0,3,6,0,0,0,0,0 + 00 +F200 0007000009000200 ( sudoku.asm):00316 fcb 0,7,0,0,9,0,2,0,0 + 00 +F209 0005000000070000 ( sudoku.asm):00317 fcb 0,5,0,0,0,7,0,0,0 + 00 +F212 0000000004050700 ( sudoku.asm):00318 fcb 0,0,0,0,4,5,7,0,0 + 00 +F21B 0000000100000003 ( sudoku.asm):00319 fcb 0,0,0,1,0,0,0,3,0 + 00 +F224 0000010000000006 ( sudoku.asm):00320 fcb 0,0,1,0,0,0,0,6,8 + 08 +F22D 0000080500000001 ( sudoku.asm):00321 fcb 0,0,8,5,0,0,0,1,0 + 00 +F236 0009000000000400 ( sudoku.asm):00322 fcb 0,9,0,0,0,0,4,0,0 + 00 + ( sudoku.asm):00323 +F23F ( sudoku.asm):00324 table_move2x: +F23F 0001020304050607 ( sudoku.asm):00325 fcb 0,1,2,3,4,5,6,7,8 + 08 +F248 0001020304050607 ( sudoku.asm):00326 fcb 0,1,2,3,4,5,6,7,8 + 08 +F251 0001020304050607 ( sudoku.asm):00327 fcb 0,1,2,3,4,5,6,7,8 + 08 +F25A 0001020304050607 ( sudoku.asm):00328 fcb 0,1,2,3,4,5,6,7,8 + 08 +F263 0001020304050607 ( sudoku.asm):00329 fcb 0,1,2,3,4,5,6,7,8 + 08 +F26C 0001020304050607 ( sudoku.asm):00330 fcb 0,1,2,3,4,5,6,7,8 + 08 +F275 0001020304050607 ( sudoku.asm):00331 fcb 0,1,2,3,4,5,6,7,8 + 08 +F27E 0001020304050607 ( sudoku.asm):00332 fcb 0,1,2,3,4,5,6,7,8 + 08 +F287 0001020304050607 ( sudoku.asm):00333 fcb 0,1,2,3,4,5,6,7,8 + 08 +F290 00 ( sudoku.asm):00334 fcb 0 + ( sudoku.asm):00335 +F291 ( sudoku.asm):00336 table_move2y: +F291 0000000000000000 ( sudoku.asm):00337 fcb 0,0,0,0,0,0,0,0,0 + 00 +F29A 0101010101010101 ( sudoku.asm):00338 fcb 1,1,1,1,1,1,1,1,1 + 01 +F2A3 0202020202020202 ( sudoku.asm):00339 fcb 2,2,2,2,2,2,2,2,2 + 02 +F2AC 0303030303030303 ( sudoku.asm):00340 fcb 3,3,3,3,3,3,3,3,3 + 03 +F2B5 0404040404040404 ( sudoku.asm):00341 fcb 4,4,4,4,4,4,4,4,4 + 04 +F2BE 0505050505050505 ( sudoku.asm):00342 fcb 5,5,5,5,5,5,5,5,5 + 05 +F2C7 0606060606060606 ( sudoku.asm):00343 fcb 6,6,6,6,6,6,6,6,6 + 06 +F2D0 0707070707070707 ( sudoku.asm):00344 fcb 7,7,7,7,7,7,7,7,7 + 07 +F2D9 0808080808080808 ( sudoku.asm):00345 fcb 8,8,8,8,8,8,8,8,8 + 08 + ( sudoku.asm):00346 +F2E2 ( sudoku.asm):00347 table_move2box_x: +F2E2 0001020001020001 ( sudoku.asm):00348 fcb 0,1,2,0,1,2,0,1,2 + 02 +F2EB 0001020001020001 ( sudoku.asm):00349 fcb 0,1,2,0,1,2,0,1,2 + 02 +F2F4 0001020001020001 ( sudoku.asm):00350 fcb 0,1,2,0,1,2,0,1,2 + 02 +F2FD 0001020001020001 ( sudoku.asm):00351 fcb 0,1,2,0,1,2,0,1,2 + 02 +F306 0001020001020001 ( sudoku.asm):00352 fcb 0,1,2,0,1,2,0,1,2 + 02 +F30F 0001020001020001 ( sudoku.asm):00353 fcb 0,1,2,0,1,2,0,1,2 + 02 +F318 0001020001020001 ( sudoku.asm):00354 fcb 0,1,2,0,1,2,0,1,2 + 02 +F321 0001020001020001 ( sudoku.asm):00355 fcb 0,1,2,0,1,2,0,1,2 + 02 +F32A 0001020001020001 ( sudoku.asm):00356 fcb 0,1,2,0,1,2,0,1,2 + 02 +F333 00 ( sudoku.asm):00357 fcb 0 + ( sudoku.asm):00358 +F334 ( sudoku.asm):00359 table_move2box_y: +F334 0000000000000000 ( sudoku.asm):00360 fcb 0,0,0,0,0,0,0,0,0 + 00 +F33D 0101010101010101 ( sudoku.asm):00361 fcb 1,1,1,1,1,1,1,1,1 + 01 +F346 0202020202020202 ( sudoku.asm):00362 fcb 2,2,2,2,2,2,2,2,2 + 02 +F34F 0000000000000000 ( sudoku.asm):00363 fcb 0,0,0,0,0,0,0,0,0 + 00 +F358 0101010101010101 ( sudoku.asm):00364 fcb 1,1,1,1,1,1,1,1,1 + 01 +F361 0202020202020202 ( sudoku.asm):00365 fcb 2,2,2,2,2,2,2,2,2 + 02 +F36A 0000000000000000 ( sudoku.asm):00366 fcb 0,0,0,0,0,0,0,0,0 + 00 +F373 0101010101010101 ( sudoku.asm):00367 fcb 1,1,1,1,1,1,1,1,1 + 01 +F37C 0202020202020202 ( sudoku.asm):00368 fcb 2,2,2,2,2,2,2,2,2 + 02 +F385 00 ( sudoku.asm):00369 fcb 0 + ( sudoku.asm):00370 +F386 ( sudoku.asm):00371 table_move2row_start: +F386 0000000000000000 ( sudoku.asm):00372 fcb 0,0,0,0,0,0,0,0,0 + 00 +F38F 0909090909090909 ( sudoku.asm):00373 fcb 9,9,9,9,9,9,9,9,9 + 09 +F398 1212121212121212 ( sudoku.asm):00374 fcb 18,18,18,18,18,18,18,18,18 + 12 +F3A1 1B1B1B1B1B1B1B1B ( sudoku.asm):00375 fcb 27,27,27,27,27,27,27,27,27 + 1B +F3AA 2424242424242424 ( sudoku.asm):00376 fcb 36,36,36,36,36,36,36,36,36 + 24 +F3B3 2D2D2D2D2D2D2D2D ( sudoku.asm):00377 fcb 45,45,45,45,45,45,45,45,45 + 2D +F3BC 3636363636363636 ( sudoku.asm):00378 fcb 54,54,54,54,54,54,54,54,54 + 36 +F3C5 3F3F3F3F3F3F3F3F ( sudoku.asm):00379 fcb 63,63,63,63,63,63,63,63,63 + 3F +F3CE 4848484848484848 ( sudoku.asm):00380 fcb 72,72,72,72,72,72,72,72,72 + 48 + ( sudoku.asm):00381 +F3D7 ( sudoku.asm):00382 table_move2box_start: +F3D7 0000000303030606 ( sudoku.asm):00383 fcb 0,0,0,3,3,3,6,6,6 + 06 +F3E0 0000000303030606 ( sudoku.asm):00384 fcb 0,0,0,3,3,3,6,6,6 + 06 +F3E9 0000000303030606 ( sudoku.asm):00385 fcb 0,0,0,3,3,3,6,6,6 + 06 +F3F2 1B1B1B1E1E1E2121 ( sudoku.asm):00386 fcb 27,27,27,30,30,30,33,33,33 + 21 +F3FB 1B1B1B1E1E1E2121 ( sudoku.asm):00387 fcb 27,27,27,30,30,30,33,33,33 + 21 +F404 1B1B1B1E1E1E2121 ( sudoku.asm):00388 fcb 27,27,27,30,30,30,33,33,33 + 21 +F40D 3636363939393C3C ( sudoku.asm):00389 fcb 54,54,54,57,57,57,60,60,60 + 3C +F416 3636363939393C3C ( sudoku.asm):00390 fcb 54,54,54,57,57,57,60,60,60 + 3C +F41F 3636363939393C3C ( sudoku.asm):00391 fcb 54,54,54,57,57,57,60,60,60 + 3C + ( sudoku.asm):00392 +F428 0000000000000000 ( sudoku.asm):00393 zmb $FFF0-* ; pad ROM up to the vector table + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + ( sudoku.asm):00394 +FFF0 F078 ( sudoku.asm):00395 fdb halt ; $FFF0 reserved +FFF2 F078 ( sudoku.asm):00396 fdb halt ; $FFF2 SWI3 +FFF4 F078 ( sudoku.asm):00397 fdb halt ; $FFF4 SWI2 +FFF6 F078 ( sudoku.asm):00398 fdb halt ; $FFF6 FIRQ +FFF8 F078 ( sudoku.asm):00399 fdb halt ; $FFF8 IRQ +FFFA F078 ( sudoku.asm):00400 fdb halt ; $FFFA SWI +FFFC F078 ( sudoku.asm):00401 fdb halt ; $FFFC NMI +FFFE F02A ( sudoku.asm):00402 fdb reset ; $FFFE RESET diff --git a/MC6809/MC6809.Test/roms/6809_sudoku/sudoku.map b/MC6809/MC6809.Test/roms/6809_sudoku/sudoku.map new file mode 100644 index 0000000..ced8088 --- /dev/null +++ b/MC6809/MC6809.Test/roms/6809_sudoku/sudoku.map @@ -0,0 +1,51 @@ +Symbol: _loop (sudoku.bin) = F0B3 +Symbol: _loop_continue (sudoku.bin) = F147 +Symbol: _not_finished (sudoku.bin) = F080 +Symbol: _return_false (sudoku.bin) = F155 +Symbol: _return_true (sudoku.bin) = F15A +Symbol: ACIA_CFG (sudoku.bin) = 0015 +Symbol: ACIA_RESET (sudoku.bin) = 0003 +Symbol: BOARD_SIZE (sudoku.bin) = 0009 +Symbol: CELL_COUNT (sudoku.bin) = 0051 +Symbol: halt (sudoku.bin) = F078 +Symbol: io_initialise_acia (sudoku.bin) = F000 +Symbol: io_outchr (sudoku.bin) = F017 +Symbol: io_outstr (sudoku.bin) = F01D +Symbol: io_waitacia (sudoku.bin) = F00B +Symbol: io_wrwait (sudoku.bin) = F00D +Symbol: ios_done (sudoku.bin) = F027 +Symbol: ios_loop (sudoku.bin) = F01F +Symbol: pass@_F0DD (sudoku.bin) = F0DD +Symbol: pb_boxh (sudoku.bin) = F1D3 +Symbol: pb_cont (sudoku.bin) = F1E9 +Symbol: pb_loop (sudoku.bin) = F1BB +Symbol: pb_newl (sudoku.bin) = F1DF +Symbol: pbe_blank (sudoku.bin) = F171 +Symbol: pbe_done (sudoku.bin) = F176 +Symbol: print_board (sudoku.bin) = F1AE +Symbol: print_board_element (sudoku.bin) = F15E +Symbol: print_box_break_horizontal (sudoku.bin) = F182 +Symbol: print_box_break_vertical (sudoku.bin) = F17C +Symbol: print_newline (sudoku.bin) = F1A3 +Symbol: puzzle (sudoku.bin) = 0200 +Symbol: puzzle_init (sudoku.bin) = F1EE +Symbol: rdone (sudoku.bin) = F073 +Symbol: RECEV (sudoku.bin) = A001 +Symbol: reset (sudoku.bin) = F02A +Symbol: rfail (sudoku.bin) = F06B +Symbol: rinit (sudoku.bin) = F03C +Symbol: solve (sudoku.bin) = F07A +Symbol: STACKTOP (sudoku.bin) = 4000 +Symbol: sv_empty (sudoku.bin) = F08A +Symbol: table_move2box_start (sudoku.bin) = F3D7 +Symbol: table_move2box_x (sudoku.bin) = F2E2 +Symbol: table_move2box_y (sudoku.bin) = F334 +Symbol: table_move2row_start (sudoku.bin) = F386 +Symbol: table_move2x (sudoku.bin) = F23F +Symbol: table_move2y (sudoku.bin) = F291 +Symbol: TRANS (sudoku.bin) = A001 +Symbol: UART (sudoku.bin) = A000 +Symbol: UCTRL (sudoku.bin) = A000 +Symbol: UNASSIGNED (sudoku.bin) = 0000 +Symbol: used@_F0DB (sudoku.bin) = F0DB +Symbol: USTAT (sudoku.bin) = A000