From daddce60375efdc16f72391cbfc42386e852e4bd Mon Sep 17 00:00:00 2001 From: Lee Fastenau Date: Sun, 12 Mar 2017 16:30:49 -0700 Subject: [PATCH] Initial commit. --- .DS_Store | Bin 0 -> 6148 bytes .gitignore | 1 + conway.sublime-project | 20 + conway.sublime-workspace | 399 +++++++++++++++ include/apple2.asm | 36 ++ include/macros.asm | 31 ++ include/utilities.asm | 69 +++ makefile | 45 ++ res/dos3.3bootable.dsk | Bin 0 -> 143360 bytes res/runner.scpt | Bin 0 -> 3556 bytes src/conway.asm | 1054 ++++++++++++++++++++++++++++++++++++++ 11 files changed, 1655 insertions(+) create mode 100644 .DS_Store create mode 100644 .gitignore create mode 100644 conway.sublime-project create mode 100644 conway.sublime-workspace create mode 100644 include/apple2.asm create mode 100644 include/macros.asm create mode 100644 include/utilities.asm create mode 100644 makefile create mode 100644 res/dos3.3bootable.dsk create mode 100644 res/runner.scpt create mode 100644 src/conway.asm diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..67ec2fbe751cbbd6430403879ede14e2f29144a4 GIT binary patch literal 6148 zcmeHK!EWL(5Ve7}j?k(cDs6l7r8f@1wi1_05lauft(0o_(A|ZEpb{y>h=ihD3d(nE z|ET9m{eyl-$MzI~Sgu>NnvuqDJf0cHFOeNH#&~NI))}iX#ssLwf&c@&BL)C7FldQ+s)63$gskR&mw~UMi+p67p<0Mwe zE!25?P*ai`Vt^PR2HuAO+=@i`eWs^bi2-6@hZ)fOg9O#+BIXv&)&Y&V0sxl4Z3Jw6 zm(V#9(M8NH!Uzbrsem?>;}wJ3bnr`za}jfkHl1<2d~lqZ;|+zI*`dBP;f%W$sU-%8 zfprFowp-EX|K;}k|9TSjhyh~YzhZ!w+FrW_OTx2tV{!Vdm7rZvEjli@xJ&`V9K{f; ekK$ucBjA_X0CW*^i{JsF9|1!HHN?O_W#AQ}c58b8 literal 0 HcmV?d00001 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..378eac2 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +build diff --git a/conway.sublime-project b/conway.sublime-project new file mode 100644 index 0000000..275d027 --- /dev/null +++ b/conway.sublime-project @@ -0,0 +1,20 @@ +{ + "folders": + [ + { + "path": "." + } + ], + "settings": + { + "tab_size": 8 + }, + "build_systems": + [ + { + "name": "Run", + "working_dir": "${project_path:${folder}}", + "shell_cmd": "make run" + } + ] +} diff --git a/conway.sublime-workspace b/conway.sublime-workspace new file mode 100644 index 0000000..6a9ed1a --- /dev/null +++ b/conway.sublime-workspace @@ -0,0 +1,399 @@ +{ + "auto_complete": + { + "selected_items": + [ + ] + }, + "buffers": + [ + { + "file": "makefile", + "settings": + { + "buffer_size": 448, + "encoding": "UTF-8", + "line_ending": "Unix" + } + }, + { + "file": "src/conway.asm", + "settings": + { + "buffer_size": 103, + "encoding": "UTF-8", + "line_ending": "Unix" + } + }, + { + "file": "conway.sublime-project", + "settings": + { + "buffer_size": 159, + "encoding": "UTF-8", + "line_ending": "Unix" + } + }, + { + "file": "include/include.asm", + "settings": + { + "buffer_size": 6, + "encoding": "UTF-8", + "line_ending": "Unix" + } + } + ], + "build_system": "Run", + "build_system_choices": + [ + [ + [ + [ + "List", + "" + ], + [ + "Packages/Makefile/Make.sublime-build", + "" + ], + [ + "Packages/Makefile/Make.sublime-build", + "Clean" + ] + ], + [ + "List", + "" + ] + ], + [ + [ + [ + "Packages/Makefile/Make.sublime-build", + "" + ], + [ + "Packages/Makefile/Make.sublime-build", + "Clean" + ] + ], + [ + "Packages/Makefile/Make.sublime-build", + "" + ] + ], + [ + [ + [ + "Run", + "" + ], + [ + "Packages/Makefile/Make.sublime-build", + "" + ], + [ + "Packages/Makefile/Make.sublime-build", + "Clean" + ] + ], + [ + "Run", + "" + ] + ] + ], + "build_varint": "", + "command_palette": + { + "height": 0.0, + "last_filter": "", + "selected_items": + [ + ], + "width": 0.0 + }, + "console": + { + "height": 0.0, + "history": + [ + ] + }, + "distraction_free": + { + "menu_visible": true, + "show_minimap": false, + "show_open_files": false, + "show_tabs": false, + "side_bar_visible": false, + "status_bar_visible": false + }, + "expanded_folders": + [ + "/Users/thelbane/code/apple2/conway", + "/Users/thelbane/code/apple2/conway/include", + "/Users/thelbane/code/apple2/conway/src" + ], + "file_history": + [ + "/Users/thelbane/code/apple2/conway/conway.sublime-project", + "/Users/thelbane/Library/Application Support/Sublime Text 3/Packages/User/Make.sublime-build", + "/Users/thelbane/code/apple2/conway/build/conway", + "/Users/thelbane/code/apple2/conway/conway.asm", + "/Users/thelbane/code/makefile/foo.txt", + "/Users/thelbane/code/makefile/test.txt", + "/Users/thelbane/code/web/node-postgres-todo/model/database.js", + "/Users/thelbane/code/web/nodetest/test.txt", + "/Users/thelbane/code/web/nodetest/node_modules/express/lib/application.js", + "/Users/thelbane/code/web/nodetest/app/calc.js", + "/Users/thelbane/code/web/nodetest/file.md", + "/Users/thelbane/code/web/nodetest/app/index.js", + "/Users/thelbane/code/web/nodetest/index.js", + "/Users/thelbane/code/web/nodetest/package.json", + "/Users/thelbane/.zshrc", + "/Users/thelbane/.plan" + ], + "find": + { + "height": 23.0 + }, + "find_in_files": + { + "height": 93.0, + "where_history": + [ + "" + ] + }, + "find_state": + { + "case_sensitive": false, + "find_history": + [ + "app", + "app.js", + "{\n" + ], + "highlight": true, + "in_selection": false, + "preserve_case": false, + "regex": false, + "replace_history": + [ + ], + "reverse": false, + "show_context": true, + "use_buffer2": true, + "whole_word": false, + "wrap": true + }, + "groups": + [ + { + "selected": 2, + "sheets": + [ + { + "buffer": 0, + "file": "makefile", + "semi_transient": false, + "settings": + { + "buffer_size": 448, + "regions": + { + }, + "selection": + [ + [ + 432, + 432 + ] + ], + "settings": + { + "syntax": "Packages/Makefile/Makefile.sublime-syntax" + }, + "translation.x": 0.0, + "translation.y": 0.0, + "zoom_level": 1.0 + }, + "stack_index": 2, + "type": "text" + }, + { + "buffer": 1, + "file": "src/conway.asm", + "semi_transient": false, + "settings": + { + "buffer_size": 103, + "regions": + { + }, + "selection": + [ + [ + 0, + 0 + ] + ], + "settings": + { + "syntax": "Packages/Text/Plain text.tmLanguage" + }, + "translation.x": 0.0, + "translation.y": 0.0, + "zoom_level": 1.0 + }, + "stack_index": 1, + "type": "text" + }, + { + "buffer": 2, + "file": "conway.sublime-project", + "semi_transient": false, + "settings": + { + "buffer_size": 159, + "regions": + { + }, + "selection": + [ + [ + 159, + 159 + ] + ], + "settings": + { + "syntax": "Packages/JavaScript/JSON.sublime-syntax" + }, + "translation.x": 0.0, + "translation.y": 0.0, + "zoom_level": 1.0 + }, + "stack_index": 0, + "type": "text" + }, + { + "buffer": 3, + "file": "include/include.asm", + "semi_transient": false, + "settings": + { + "buffer_size": 6, + "regions": + { + }, + "selection": + [ + [ + 6, + 6 + ] + ], + "settings": + { + "syntax": "Packages/Text/Plain text.tmLanguage" + }, + "translation.x": 0.0, + "translation.y": 0.0, + "zoom_level": 1.0 + }, + "stack_index": 3, + "type": "text" + } + ] + } + ], + "incremental_find": + { + "height": 23.0 + }, + "input": + { + "height": 31.0 + }, + "layout": + { + "cells": + [ + [ + 0, + 0, + 1, + 1 + ] + ], + "cols": + [ + 0.0, + 1.0 + ], + "rows": + [ + 0.0, + 1.0 + ] + }, + "menu_visible": true, + "output.exec": + { + "height": 461.0 + }, + "output.find_results": + { + "height": 0.0 + }, + "pinned_build_system": "", + "project": "conway.sublime-project", + "replace": + { + "height": 42.0 + }, + "save_all_on_build": true, + "select_file": + { + "height": 0.0, + "last_filter": "", + "selected_items": + [ + ], + "width": 0.0 + }, + "select_project": + { + "height": 0.0, + "last_filter": "", + "selected_items": + [ + ], + "width": 0.0 + }, + "select_symbol": + { + "height": 0.0, + "last_filter": "", + "selected_items": + [ + ], + "width": 0.0 + }, + "selected_group": 0, + "settings": + { + }, + "show_minimap": true, + "show_open_files": false, + "show_tabs": true, + "side_bar_visible": true, + "side_bar_width": 150.0, + "status_bar_visible": true, + "template_settings": + { + } +} diff --git a/include/apple2.asm b/include/apple2.asm new file mode 100644 index 0000000..48bde4b --- /dev/null +++ b/include/apple2.asm @@ -0,0 +1,36 @@ +; ------------------------------------ +; Zero Page Constants +; ------------------------------------ +; Free zero page locacations according to +; http://home.swbell.net/rubywand/csa2pfaq.html#017 + +ZPA0 equ $06 +ZPA1 equ $07 +ZPA2 equ $08 +ZPA3 equ $09 + +HTAB equ $24 +VTAB equ $25 +TXTROW equ $28 + +ZPB0 equ $EB +ZPB1 equ $EC +ZPB2 equ $ED +ZPB3 equ $EE +ZPB4 equ $EF + +ZPC0 equ $FA +ZPC1 equ $FB +ZPC2 equ $FC +ZPC3 equ $FD + + +STACK equ $100 + +TXTPG0 equ $0400 +TXTPG1 equ $0800 +CLICK equ $C030 +HOME equ $FC58 +PUTCHAR equ $FDED + +EXITDOS equ $03D0 \ No newline at end of file diff --git a/include/macros.asm b/include/macros.asm new file mode 100644 index 0000000..f5ed57f --- /dev/null +++ b/include/macros.asm @@ -0,0 +1,31 @@ + mac LOG_REGION + if {3} && >. != >{2} + echo "(",{2},"-",.,")",{1},"*** BOUNDARY CROSSED ***" + err + else + echo "(",{2},"-",.,")",{1} + endif + endm + + mac WARN_BOUNDARY +.start set {2} +.end set * + if >.start != >.end + echo "Page boundary crossed (",{1},.start,"-",.end,")" + endif + endm + + mac REQUIRED_BOUNDARY +.start set {2} +.end set * + if >.start == >.end + echo "Expected page boundary not crossed (",{1},.start,"-",.end,")" + endif + endm + + mac ABORT + echo "" + echo "*** ABORTING ASSEMBLY" + echo "***", {0} + err + endm \ No newline at end of file diff --git a/include/utilities.asm b/include/utilities.asm new file mode 100644 index 0000000..9d5a3ed --- /dev/null +++ b/include/utilities.asm @@ -0,0 +1,69 @@ +printline subroutine + tsx + inx + lda STACK,x + sta ZPA0 + lda STACK+1,x + sta ZPA1 +.loop + inc ZPA0 + bne .cont + inc ZPA1 +.cont + ldy #0 + lda (ZPA0),y + beq .cleanup + ora #%10000000 + jsr PUTCHAR + bne .loop +.cleanup + lda ZPA0 + sta STACK,x +.end + lda ZPA1 + sta STACK+1,x + rts + +rand subroutine + jsr rand64k ;Factors of 65535: 3 5 17 257 + jsr rand32k ;Factors of 32767: 7 31 151 are independent and can be combined + lda sr1+1 ;can be left out + eor sr2+1 ;if you dont use + tay ;y as suggested + lda sr1 ;mix up lowbytes of SR1 + eor sr2 ;and SR2 to combine both + rts + +;periode with 65535 +;10+12+13+15 +rand64k subroutine + lda sr1+1 + asl + asl + eor sr1+1 + asl + eor sr1+1 + asl + asl + eor sr1+1 + asl + rol sr1 ;shift this left, "random" bit comes from low + rol sr1+1 + rts + +;periode with 32767 +;13+14 +rand32k subroutine + lda sr2+1 + asl + eor sr2+1 + asl + asl + ror sr2 ;shift this right, random bit comes from high - nicer when eor with sr1 + rol sr2+1 + rts + +;feel free to set seeds as wished, if put in zeropage some speed-boost is +;the result. For example sr1=$5c sr2=5e would fit +sr1 dc.w $a55a +sr2 dc.w $7653 \ No newline at end of file diff --git a/makefile b/makefile new file mode 100644 index 0000000..d833cb4 --- /dev/null +++ b/makefile @@ -0,0 +1,45 @@ +TARGET = conway +export FILENAME = $(shell echo $(TARGET) | tr a-z A-Z) +TYPE = B + +AC = java -jar /usr/local/bin/ac.jar + +SDIR = ./src +_SRC = $(TARGET).asm +SRC = $(patsubst %,$(SDIR)/%,$(_SRC)) + +IDIR = ./include +_DEPS = apple2.asm macros.asm utilities.asm +DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS)) + +BDIR = ./build +_OBJ = $(TARGET) +OBJ = $(patsubst %,$(BDIR)/%,$(_OBJ)) +_LST = $(TARGET).lst +LST = $(patsubst %,$(BDIR)/%,$(_LST)) +_IMAGE = $(TARGET).dsk +export IMAGE = $(patsubst %,$(BDIR)/%,$(_IMAGE)) + +RDIR = ./res +_BOOTIMAGE = dos3.3bootable.dsk +BOOTIMAGE = $(patsubst %,$(RDIR)/%,$(_BOOTIMAGE)) +_RUNNER = runner.scpt +RUNNER = $(patsubst %,$(RDIR)/%,$(_RUNNER)) + +all: $(OBJ) + +$(OBJ): $(SRC) $(DEPS) + @mkdir -p $(BDIR) + dasm $< -o$@ -l$(LST) -v4 -f2 + +$(IMAGE): $(OBJ) + cp $(BOOTIMAGE) $(IMAGE) + $(AC) -cc65 $(IMAGE) $(TARGET) $(TYPE) < $(OBJ) + +run: $(IMAGE) + osascript $(RUNNER) + @echo Running... + +clean: + @rm -rf $(BDIR) + @echo Cleaned! \ No newline at end of file diff --git a/res/dos3.3bootable.dsk b/res/dos3.3bootable.dsk new file mode 100644 index 0000000000000000000000000000000000000000..1b25d2e48e14ee45004cdb0eabe83b3fbd47e777 GIT binary patch literal 143360 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 literal 0 HcmV?d00001 diff --git a/res/runner.scpt b/res/runner.scpt new file mode 100644 index 0000000000000000000000000000000000000000..af5c109cbb9ba23e4ef69a7383aeb0bc16f083de GIT binary patch literal 3556 zcmb_eZFH2y6@K2$W=UpuHdzP|!H}Q?O9-2UkAf){A_*UcxM)l$V6bm?H?U;0n`SqW z{AqKJ_MBS!!*kl-{bQ|YMMYb+ek;X~lB(2b)glE&5%BxFSiODbeX}GdHMT#xd*;ra zckbMK=b1bA&RRPYYinq&s0-KCnid4$EfRqR5ArNB(B!Rdem6g_2VTzP!>38|lH`Fs zm?B@xR~l2`i8x|=P=G>B;w<#y=TIIf3i}bzB%VH_i;PB4ljLpSoEL@iFBHj_id|{A zD;4Y8k;x{j_%ljHhG2M&B3M1n`g{}zQ4DK8LLr1`U;|pvfOTl{$d|_RAgr`m%hhN7 zau$WP$WQdxJK~_d0NYed(OTT72Nq6wGNs}|$c7sjjUV_tpkm(LNXML}008Bf_gj$_m4*m;I<% zUz2z`xt9`Lh%(I4B%|ZGC`W}R;fdsPz8rJqGx=0wE<7n`ML90Og_^{wqWW(8VDk_F)0?MA`OuIL41DulF(QJ6K`b)X!lED+nI+*6 z!tk+$QKK=(J(9V&K+gE(%=kdjv~wta9nB7;`jbf$%py0!@Rq#IaFmlKCTrR1uvn8gDyp$u-og?r zRqRT`(R5!tnoMVMD!>>^ckbfRFM+j~;8vqX-c<4?v1^Z|qdqJp&?m4=-cankDq|0% zHI}(>)MAOeuHMCxbLHV|))Q zHHni!nsEaz@!%4QeIKhdiQ`r?u9UxHwY;j>m4-8enRG0kv~%bfkW)RK487H^@n&-o z3wRd`R?$)O^T?~l{wlUhu||_PH?9>|qY+J-#7Q-+XqQ)%yh5Z}d*d0lC7RdTxl8TX zCNC>_nLFb5xCd*fY%SJl635F9^vK_^9vc+9(r|mCW7~#QCY$rpoMAuXTvNn}vkq*R zm;Cb5Byr|rPRWxOahZ%Lc3wqgjT)E1vy>aMk&qYAtVq17F+PycXmb}qVC4fbyQPjolC32g{J#SgGWlQ_nQa2>V=vDLt`Ere~XBA3$9Hlo05wZ%P> z>u|js^2?!#sal3j2t8|3%u3>KfpD&uKjUge;$A_`P;v}0B;=Vqc?On8j+hmN?sq0B zbQGb(8Yyr>^8ZRqu)$*?myN9f!e<3q>}VpDO=ositZ$rPZ}`yOlJyJe)QQ;UV0)r3 z+ixc;I<|%F-rfn4|9xnkxc>0S@zyyxN#PGDtjLW=do^Z;cY!Dj510Omb0Ncz96#`D z@)in=N7gSNy_P#zHhu&34ZXd|MAXhE(y2^6#*~fcUH^kj^g%{W0)5D$pSLB+lF-3Z z50mfZzld2pfEJFTluA)5jSO#21#f2~UkdZb8><&U48xPmHf-etCRC5c}n^Nit24Hm4NJqln2P@-X7) zl7|$BlN-~B<=%>Wu)~8L+(W)R=#dA_&K@y4d)Ro-XHGF60|xqHc|iWiihsY{C-=%9 zSTcW)MRJeaE&Jszxl`_teR8|}4h?df+$wwJ7WpkU%FXf{Y?YgoJV0+Idnx*g$$-U&vb3@UG$zL&w-nnlkzuYqkY)bB?hRLeElKrEZLCIa@OyyN_ z=eQcI)K$xWlO-;|C+@(_M;Y$|?sd>5bLO)o@FIQ@%}1#g{9 z22gOS@^tl?$^(^6Mm5r%3rjak<_wJghSZ!lE#b!io%;aoo z_1eg=jq}LPvN5}clIL?OCsH;lVq?z1N-isJYby%!cCiBN4DqhdGjBrPwSH!RBqO?p zxggD4a4ls9ITvF_=nhhV3lbp;1z7VVEEt>lwAd1)G$(e2unW7nwvEzp=9>)pEVaj} svy+-q#datapg0_last + sta dataAddrH + lda <#datapg1_tln + sta nbrAddr + lda >#datapg1_tln + sta nbrAddrH + jmp .continue +.page1 lda <#datapg1_last + sta dataAddr + lda >#datapg1_last + sta dataAddrH + lda <#datapg0_tln + sta nbrAddr + lda >#datapg0_tln + sta nbrAddrH +.continue rts + +initScreen subroutine + lda <#initData + sta dataAddr + lda >#initData + sta dataAddrH + lda #initDataLen-1 ; get data length + sta .dataoffset ; save it + lda #fieldHeight-1 ; load the field height + sta .row ; save in row counter +.1 jsr getRow ; update rowAddr (A = row) + lda #fieldWidth-1 ; load the field width (reset every new row) + sta .column ; save in column counter + ldy .dataoffset + lda (dataAddr),y ; get the current data byte + sta .byte ; save it + lda #8 ; init the byte counter + sta .bit ; save in bit counter +.2 ldy .column + lda #0 +.byte equ .-1 + lsr + sta .byte + bcs .turnOn +.turnOff lda #charOff + bne .draw +.turnOn lda #charOn +.draw sta (rowAddr),y + dec .bit + bne .skipbit + lda #8 ; reset bit counter + sta .bit ; decrease data byte reference + sec + dec .dataoffset + ldy #0 ; .dataoffset +.dataoffset equ .-1 + lda (dataAddr),y + sta .byte +.skipbit lda .column ; start to calculate init byte offset + dec .column + ldy #0 ; .column +.column equ .-1 + bpl .2 + dec .row + lda #0 ; .row +.row equ .-1 + bpl .1 + rts +.bit ds.b + +; inputs: +; ? +; outputs: +; ? +setPoint subroutine + jsr getRow + lda #charOn + sta (rowAddr),y + rts + +; inputs: +; A = screen character code +; outputs: +; A = $FF, X = ?, Y = $FF +fillScreen subroutine + sta .char + lda #fieldHeight-1 + sta .row +.1 jsr getRow + ldy #fieldWidth-1 +.2 lda #0 ; .char +.char equ .-1 + sta (rowAddr),y + dey + bpl .2 + dec .row + lda #0 ; .row +.row equ .-1 + bpl .1 + rts + LOG_REGION "fillScreen", fillScreen, 0 +; inputs: +; A = row +; outputs: +; A = ?, X = A << 1 +getRow subroutine + asl + tax + lda tp0tbl,x + sta rowAddr + lda tp0tbl+1,x + sta rowAddrH + rts + LOG_REGION "getRow", getRow, 0 + +; ------------------------------------ +; Utilities +; ------------------------------------ + + include "utilities.asm" + +; ------------------------------------ +; Tables +; ------------------------------------ + if USES_TXTPG0 +tp0tbl subroutine +.pg equ 1024 +.y set TXTPG0 + repeat 24 + dc.w .pg + (.y & %11111000) * 5 + ((.y & %00000111) << 7) +.y set .y + 1 + repend + LOG_REGION "tp0tbl", tp0tbl, 0 + endif + + if USES_TXTPG1 + align 256 +tp1tbl subroutine +.pg equ TXTPG1 +.y set 0 + repeat 50 + dc.w .pg + (.y & %11111000) * 5 + ((.y & %00000111) << 7) +.y set .y + 1 + repend + LOG_REGION "tp1tbl", tp1tbl, 1 + endif + + ifconst FAIL +initData dc.b %00000000,%00000000,%00000000,%00000000,%00000000 + dc.b %00000000,%00000000,%00000000,%00000000,%00000000 + dc.b %00000000,%00000000,%00000000,%00000000,%00000000 + dc.b %00000000,%00100000,%00000000,%00000000,%00000000 + dc.b %00000000,%00010000,%00000000,%00000000,%00010000 + dc.b %00000000,%01110000,%00000000,%00000000,%00100000 + dc.b %00000000,%00000000,%00000000,%00000000,%00111000 + dc.b %00000000,%00000000,%00000000,%00001000,%00000000 + dc.b %00000000,%00000000,%00000000,%00001010,%00000000 + dc.b %00001000,%00000000,%00000000,%00001100,%00000000 + dc.b %00000100,%00000000,%00000000,%00000000,%00000000 + dc.b %00011100,%00000000,%00000000,%00000000,%00000000 + dc.b %00000000,%00000000,%00000000,%00000000,%00000000 + dc.b %00000000,%00000000,%00000000,%00000000,%00000000 + dc.b %00000000,%00000000,%00000000,%00000000,%00000000 + dc.b %00000000,%00000000,%00000000,%00000000,%00000000 + dc.b %00000000,%00011100,%00000000,%00000000,%00000000 + dc.b %00000000,%00000000,%00001000,%00000000,%00000000 + dc.b %00000000,%00000000,%10001000,%00000000,%00000000 + dc.b %00000000,%00000000,%10001000,%00000000,%00000000 + dc.b %00000000,%00000000,%10000000,%00000000,%00000000 + dc.b %00000000,%00000000,%00000001,%11000000,%00000000 + dc.b %00000000,%00000000,%00000000,%00000000,%00000000 + dc.b %00000000,%00000000,%00000000,%00000000,%00000000 + endif + +initData dc.b %00000000,%00000000,%00000000,%00000000,%00000000 + dc.b %00000000,%00000000,%00000000,%00000000,%00000000 + dc.b %00000000,%00000000,%00000000,%00000000,%00000000 + dc.b %00000000,%00000000,%00000000,%00000000,%00000000 + dc.b %00000000,%00000000,%00000000,%00000000,%00000000 + dc.b %00000000,%00000000,%00000000,%00000000,%00000000 + dc.b %00000000,%00000000,%00000000,%00000000,%00000000 + dc.b %00000000,%00000000,%00000000,%00000000,%00000000 + dc.b %00000000,%00000000,%00000000,%00000000,%00000000 + dc.b %00000000,%00000000,%00000000,%00000000,%00000000 + dc.b %00000000,%00000000,%00010000,%00000000,%00000000 + dc.b %00000000,%00000000,%00010000,%00000000,%00000000 + dc.b %00000000,%00000000,%00010000,%00000000,%00000000 + dc.b %00000000,%00000000,%00000000,%00000000,%00000000 + dc.b %00000000,%00000000,%00000000,%00000000,%00000000 + dc.b %00000000,%00000000,%00000000,%00000000,%00000000 + dc.b %00000000,%00000000,%00000000,%00000000,%00000000 + dc.b %00000000,%00000000,%00000000,%00000000,%00000000 + dc.b %00000000,%00000000,%00000000,%00000000,%00000000 + dc.b %00000000,%00000000,%00000000,%00000000,%00000000 + dc.b %00000000,%00000000,%00000000,%00000000,%00000000 + dc.b %00000000,%00000000,%00000000,%00000000,%00000000 + dc.b %00000000,%00000000,%00000000,%00000000,%00000000 + dc.b %00000000,%00000000,%00000000,%00000000,%00000000 + +initDataLen equ .-initData + +currentPage dc.b #0 + +; var loggers = { +; console: console.log, +; html: (v) => {$("#console").html($("#console").html() + v + "\n")} +; } +; var log = loggers.html +; +; for(var i = 0; i<256; i++) { +; var bits = 0 +; for(var j = 0; j<8; j++) { +; bits += (Math.pow(2,j) & i) > 0 ? 1 : 0 +; } +; var status = "noChange" +; if (bits < 2 || bits > 3) status = "charOff" +; if (bits == 3) status = "charOn" +; log("\tdc.b " + status) +; } + +conwayRules dc.b charOff + dc.b charOff + dc.b charOff + dc.b noChange + dc.b charOff + dc.b noChange + dc.b noChange + dc.b charOn + dc.b charOff + dc.b noChange + dc.b noChange + dc.b charOn + dc.b noChange + dc.b charOn + dc.b charOn + dc.b charOff + dc.b charOff + dc.b noChange + dc.b noChange + dc.b charOn + dc.b noChange + dc.b charOn + dc.b charOn + dc.b charOff + dc.b noChange + dc.b charOn + dc.b charOn + dc.b charOff + dc.b charOn + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b noChange + dc.b noChange + dc.b charOn + dc.b noChange + dc.b charOn + dc.b charOn + dc.b charOff + dc.b noChange + dc.b charOn + dc.b charOn + dc.b charOff + dc.b charOn + dc.b charOff + dc.b charOff + dc.b charOff + dc.b noChange + dc.b charOn + dc.b charOn + dc.b charOff + dc.b charOn + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOn + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b noChange + dc.b noChange + dc.b charOn + dc.b noChange + dc.b charOn + dc.b charOn + dc.b charOff + dc.b noChange + dc.b charOn + dc.b charOn + dc.b charOff + dc.b charOn + dc.b charOff + dc.b charOff + dc.b charOff + dc.b noChange + dc.b charOn + dc.b charOn + dc.b charOff + dc.b charOn + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOn + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b noChange + dc.b charOn + dc.b charOn + dc.b charOff + dc.b charOn + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOn + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOn + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b noChange + dc.b noChange + dc.b charOn + dc.b noChange + dc.b charOn + dc.b charOn + dc.b charOff + dc.b noChange + dc.b charOn + dc.b charOn + dc.b charOff + dc.b charOn + dc.b charOff + dc.b charOff + dc.b charOff + dc.b noChange + dc.b charOn + dc.b charOn + dc.b charOff + dc.b charOn + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOn + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b noChange + dc.b charOn + dc.b charOn + dc.b charOff + dc.b charOn + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOn + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOn + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b noChange + dc.b charOn + dc.b charOn + dc.b charOff + dc.b charOn + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOn + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOn + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOn + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + dc.b charOff + + if DEBUG +debugTable dc.b "0" | %10000000 + dc.b "1" | %10000000 + dc.b "1" | %10000000 + dc.b "2" | %10000000 + dc.b "1" | %10000000 + dc.b "2" | %10000000 + dc.b "2" | %10000000 + dc.b "3" | %10000000 + dc.b "1" | %10000000 + dc.b "2" | %10000000 + dc.b "2" | %10000000 + dc.b "3" | %10000000 + dc.b "2" | %10000000 + dc.b "3" | %10000000 + dc.b "3" | %10000000 + dc.b "4" | %10000000 + dc.b "1" | %10000000 + dc.b "2" | %10000000 + dc.b "2" | %10000000 + dc.b "3" | %10000000 + dc.b "2" | %10000000 + dc.b "3" | %10000000 + dc.b "3" | %10000000 + dc.b "4" | %10000000 + dc.b "2" | %10000000 + dc.b "3" | %10000000 + dc.b "3" | %10000000 + dc.b "4" | %10000000 + dc.b "3" | %10000000 + dc.b "4" | %10000000 + dc.b "4" | %10000000 + dc.b "5" | %10000000 + dc.b "1" | %10000000 + dc.b "2" | %10000000 + dc.b "2" | %10000000 + dc.b "3" | %10000000 + dc.b "2" | %10000000 + dc.b "3" | %10000000 + dc.b "3" | %10000000 + dc.b "4" | %10000000 + dc.b "2" | %10000000 + dc.b "3" | %10000000 + dc.b "3" | %10000000 + dc.b "4" | %10000000 + dc.b "3" | %10000000 + dc.b "4" | %10000000 + dc.b "4" | %10000000 + dc.b "5" | %10000000 + dc.b "2" | %10000000 + dc.b "3" | %10000000 + dc.b "3" | %10000000 + dc.b "4" | %10000000 + dc.b "3" | %10000000 + dc.b "4" | %10000000 + dc.b "4" | %10000000 + dc.b "5" | %10000000 + dc.b "3" | %10000000 + dc.b "4" | %10000000 + dc.b "4" | %10000000 + dc.b "5" | %10000000 + dc.b "4" | %10000000 + dc.b "5" | %10000000 + dc.b "5" | %10000000 + dc.b "6" | %10000000 + dc.b "1" | %10000000 + dc.b "2" | %10000000 + dc.b "2" | %10000000 + dc.b "3" | %10000000 + dc.b "2" | %10000000 + dc.b "3" | %10000000 + dc.b "3" | %10000000 + dc.b "4" | %10000000 + dc.b "2" | %10000000 + dc.b "3" | %10000000 + dc.b "3" | %10000000 + dc.b "4" | %10000000 + dc.b "3" | %10000000 + dc.b "4" | %10000000 + dc.b "4" | %10000000 + dc.b "5" | %10000000 + dc.b "2" | %10000000 + dc.b "3" | %10000000 + dc.b "3" | %10000000 + dc.b "4" | %10000000 + dc.b "3" | %10000000 + dc.b "4" | %10000000 + dc.b "4" | %10000000 + dc.b "5" | %10000000 + dc.b "3" | %10000000 + dc.b "4" | %10000000 + dc.b "4" | %10000000 + dc.b "5" | %10000000 + dc.b "4" | %10000000 + dc.b "5" | %10000000 + dc.b "5" | %10000000 + dc.b "6" | %10000000 + dc.b "2" | %10000000 + dc.b "3" | %10000000 + dc.b "3" | %10000000 + dc.b "4" | %10000000 + dc.b "3" | %10000000 + dc.b "4" | %10000000 + dc.b "4" | %10000000 + dc.b "5" | %10000000 + dc.b "3" | %10000000 + dc.b "4" | %10000000 + dc.b "4" | %10000000 + dc.b "5" | %10000000 + dc.b "4" | %10000000 + dc.b "5" | %10000000 + dc.b "5" | %10000000 + dc.b "6" | %10000000 + dc.b "3" | %10000000 + dc.b "4" | %10000000 + dc.b "4" | %10000000 + dc.b "5" | %10000000 + dc.b "4" | %10000000 + dc.b "5" | %10000000 + dc.b "5" | %10000000 + dc.b "6" | %10000000 + dc.b "4" | %10000000 + dc.b "5" | %10000000 + dc.b "5" | %10000000 + dc.b "6" | %10000000 + dc.b "5" | %10000000 + dc.b "6" | %10000000 + dc.b "6" | %10000000 + dc.b "7" | %10000000 + dc.b "1" | %10000000 + dc.b "2" | %10000000 + dc.b "2" | %10000000 + dc.b "3" | %10000000 + dc.b "2" | %10000000 + dc.b "3" | %10000000 + dc.b "3" | %10000000 + dc.b "4" | %10000000 + dc.b "2" | %10000000 + dc.b "3" | %10000000 + dc.b "3" | %10000000 + dc.b "4" | %10000000 + dc.b "3" | %10000000 + dc.b "4" | %10000000 + dc.b "4" | %10000000 + dc.b "5" | %10000000 + dc.b "2" | %10000000 + dc.b "3" | %10000000 + dc.b "3" | %10000000 + dc.b "4" | %10000000 + dc.b "3" | %10000000 + dc.b "4" | %10000000 + dc.b "4" | %10000000 + dc.b "5" | %10000000 + dc.b "3" | %10000000 + dc.b "4" | %10000000 + dc.b "4" | %10000000 + dc.b "5" | %10000000 + dc.b "4" | %10000000 + dc.b "5" | %10000000 + dc.b "5" | %10000000 + dc.b "6" | %10000000 + dc.b "2" | %10000000 + dc.b "3" | %10000000 + dc.b "3" | %10000000 + dc.b "4" | %10000000 + dc.b "3" | %10000000 + dc.b "4" | %10000000 + dc.b "4" | %10000000 + dc.b "5" | %10000000 + dc.b "3" | %10000000 + dc.b "4" | %10000000 + dc.b "4" | %10000000 + dc.b "5" | %10000000 + dc.b "4" | %10000000 + dc.b "5" | %10000000 + dc.b "5" | %10000000 + dc.b "6" | %10000000 + dc.b "3" | %10000000 + dc.b "4" | %10000000 + dc.b "4" | %10000000 + dc.b "5" | %10000000 + dc.b "4" | %10000000 + dc.b "5" | %10000000 + dc.b "5" | %10000000 + dc.b "6" | %10000000 + dc.b "4" | %10000000 + dc.b "5" | %10000000 + dc.b "5" | %10000000 + dc.b "6" | %10000000 + dc.b "5" | %10000000 + dc.b "6" | %10000000 + dc.b "6" | %10000000 + dc.b "7" | %10000000 + dc.b "2" | %10000000 + dc.b "3" | %10000000 + dc.b "3" | %10000000 + dc.b "4" | %10000000 + dc.b "3" | %10000000 + dc.b "4" | %10000000 + dc.b "4" | %10000000 + dc.b "5" | %10000000 + dc.b "3" | %10000000 + dc.b "4" | %10000000 + dc.b "4" | %10000000 + dc.b "5" | %10000000 + dc.b "4" | %10000000 + dc.b "5" | %10000000 + dc.b "5" | %10000000 + dc.b "6" | %10000000 + dc.b "3" | %10000000 + dc.b "4" | %10000000 + dc.b "4" | %10000000 + dc.b "5" | %10000000 + dc.b "4" | %10000000 + dc.b "5" | %10000000 + dc.b "5" | %10000000 + dc.b "6" | %10000000 + dc.b "4" | %10000000 + dc.b "5" | %10000000 + dc.b "5" | %10000000 + dc.b "6" | %10000000 + dc.b "5" | %10000000 + dc.b "6" | %10000000 + dc.b "6" | %10000000 + dc.b "7" | %10000000 + dc.b "3" | %10000000 + dc.b "4" | %10000000 + dc.b "4" | %10000000 + dc.b "5" | %10000000 + dc.b "4" | %10000000 + dc.b "5" | %10000000 + dc.b "5" | %10000000 + dc.b "6" | %10000000 + dc.b "4" | %10000000 + dc.b "5" | %10000000 + dc.b "5" | %10000000 + dc.b "6" | %10000000 + dc.b "5" | %10000000 + dc.b "6" | %10000000 + dc.b "6" | %10000000 + dc.b "7" | %10000000 + dc.b "4" | %10000000 + dc.b "5" | %10000000 + dc.b "5" | %10000000 + dc.b "6" | %10000000 + dc.b "5" | %10000000 + dc.b "6" | %10000000 + dc.b "6" | %10000000 + dc.b "7" | %10000000 + dc.b "5" | %10000000 + dc.b "6" | %10000000 + dc.b "6" | %10000000 + dc.b "7" | %10000000 + dc.b "6" | %10000000 + dc.b "7" | %10000000 + dc.b "7" | %10000000 + dc.b "8" | %10000000 + endif + + echo "CALL",[showDebug]d,": REM SHOW DEBUG" + echo "CALL",[flipPage]d,": REM FLIP PAGE" + echo "CALL",[iterate]d,": REM ITERATE" + echo "POKE",[currentPage]d,", 0 : REM SET PAGE" + +dataSeg equ . + seg.u conwayData ; uninitialized data segment + org dataSeg +datapg0 ds.b dataWidth * dataHeight ; The start of data page 0 (padded) +datapg0_last equ .-n_offset ; The last non-padding cell of data page 0 (topleft neighbor of last cell) +datapg0_tln equ datapg0_last - n_offset ; Top left neighbor of last non-padding cell of page 0 +datapg0_end equ .-1 + +datapg1 ds.b dataWidth * dataHeight ; The start of data page 1 (padded) +datapg1_last equ .-n_offset ; The last non-padding cell of data page 1 (topleft neighbor of last cell) +datapg1_tln equ datapg1_last - n_offset ; Top left neighbor of last non-padding cell of page 1 +datapg1_end equ .-1 \ No newline at end of file