From 16b49bd98d2c13c5f3f3918c0cc84edaa46943a0 Mon Sep 17 00:00:00 2001 From: fumiama Date: Sun, 4 Apr 2021 23:05:36 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=89=A9=E5=B1=95data=E6=AE=B5=EF=BC=8C?= =?UTF-8?q?=E5=AE=8C=E6=88=90=E9=A3=9F=E7=89=A9=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- addfood.asm | 84 ++++++++++++++++++++++++++++++++++++++++++++++++- delay.asm | 2 +- head.asm | 9 +++--- main.asm | 18 ++++++++--- print.asm | 3 -- print16.asm | 2 +- printfield.asm | 3 -- snake.prg | Bin 739 -> 1122 bytes 8 files changed, 104 insertions(+), 17 deletions(-) diff --git a/addfood.asm b/addfood.asm index 6ef1d3a..d361361 100644 --- a/addfood.asm +++ b/addfood.asm @@ -3,5 +3,87 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;; addfood: .scope +.data +.space seed 6 +.text + lda #field + sta _ptr + 1 + + `propagate seed, $c3 + `propagate seed+1, $9e + `propagate seed+2, $26 + `propagate seed, seed+1 + `propagate seed+1, seed+2 + `propagate seed+2, seed+3 + + lda seed + 5 + ldx seed + 4 + sta seed + 4 + lda seed + 3 + stx seed + 3 + ldx seed + 2 + sta seed + 2 + lda seed + 1 + stx seed + 1 + ldx seed + sta seed + stx seed + 5 + + lda seed + tay + lda seed + 1 + and #$03 + beq + + clc + adc _ptr + 1 + sta _ptr + 1 +* cmp #$03 + bne + + tya + cmp #$c0 + bmi + + sbc #$c0 + tay +* lda (_ptr), y + iny + cmp #csnk + beq - + cmp #cblk + beq - + lda #csnk + dey + sta (_ptr), y rts -.scend \ No newline at end of file +.scend + +srand: ; 做随机种子的初始化 +.scope + jsr rdtim + sta seed + 5 + stx seed + 3 + sty seed + 1 + rts +.scend + +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; propagate 进位 +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +.macro propagate + lda _1 + clc + adc _2 + bcc _end + inc _1 + 1 + bne _end + inc _1 + 2 + bne _end + inc _1 + 3 + bne _end + inc _1 + 4 + bne _end + inc _1 + 5 +_end: + sta _1 +.macend \ No newline at end of file diff --git a/delay.asm b/delay.asm index c51ee64..a573d9a 100644 --- a/delay.asm +++ b/delay.asm @@ -1,7 +1,7 @@ ; DELAY routine. Takes values from the Accumulator and pauses ; for that many jiffies (1/60th of a second). .scope -.data zp +.data .space _tmp 1 .space _target 1 .text diff --git a/head.asm b/head.asm index 19bca85..2b5f825 100644 --- a/head.asm +++ b/head.asm @@ -17,10 +17,11 @@ .space d 1 ; 方向 值定义如上 .space c 1 ; 🐍长度 最大255 最小0 .space s 2 ; 得分 小端序 +.space _ptr 2 ; 通用指针 + +.alias title $0400 +.alias field $0428 ; 蛇所在屏幕内存区 .data -.org $0400 -.space title 40 -.space field 960 ; 蛇所在屏幕内存区 - +.org $c000 .text \ No newline at end of file diff --git a/main.asm b/main.asm index 7c5eafa..26a9e29 100644 --- a/main.asm +++ b/main.asm @@ -5,6 +5,9 @@ main: .scope +.data +.space lopcnt 1 ; 循环次数计数 +.text `init jsr getchar ; 等待输入任意字符开始游戏 jsr erasehint ; 游戏开始,清空提示 @@ -21,7 +24,7 @@ main: jsr append * jsr calcscore ; 计算得分 jsr printscore ; 打印分数 - lda #60 + lda #32 jsr delay ; 延时期间最后一个按键位于d lda d beq ++ @@ -29,7 +32,13 @@ main: bne + rts * sta d -* jsr addfood +* inc lopcnt + lda lopcnt + cmp #16 + bmi ----- + lda #0 + sta lopcnt + jsr addfood jmp ----- .scend @@ -51,6 +60,7 @@ main: jsr printhint ; 打印开始提示 lda #go_d ; 初始化方向为下 sta d + jsr srand ; 初始化随机数种子 .macend .require "printscore.asm" @@ -66,8 +76,8 @@ main: .require "calcscore.asm" .require "print.asm" -.checkpc $A000 ; text段边界 +.checkpc $a000 ; text段边界 .data zp ; 零页段边界 .checkpc $80 .data -.checkpc $0800 ; data段边界 \ No newline at end of file +.checkpc $d000 ; data段边界 \ No newline at end of file diff --git a/print.asm b/print.asm index 93db005..a18fdd3 100644 --- a/print.asm +++ b/print.asm @@ -13,9 +13,6 @@ ; PRINTSTR routine. Accumulator stores the low byte of the address, ; X register stores the high byte. .scope -.data zp -.space _ptr 2 -.text printstr: sta _ptr sty _ptr+1 diff --git a/print16.asm b/print16.asm index 9da3aeb..af2cd39 100644 --- a/print16.asm +++ b/print16.asm @@ -4,7 +4,7 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; print16: .scope -.data zp +.data .space _num 4 .space _num_dec 6 .text diff --git a/printfield.asm b/printfield.asm index 92b4e7b..5e2b8a8 100644 --- a/printfield.asm +++ b/printfield.asm @@ -3,9 +3,6 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; printfield: .scope -.data zp -.space _ptr 2 -.text ldx #23 ; i代表行数,不含边框 lda #{R7loS!_ zp=DVpbc6&1MMT731T_U=^&p<4h!jPP3sUic#(z>P2wDdg=KsF$|Nh6Ynv-!nGPAw7 zV;dnPCO646S$LCtp4A3^xHQz*KIe?QF9HLB@1Yh?+|?GYX!A zFSBP|NkS7pi`{Z$BtBZ9!H#-t%#+nnXB&O?-eWgBHsl9vzu$1!jE4vh*a5#`uzsH% z^i?8bTl`r)wcAG%jfZ-NK$Ac_UwkBqAizF)L#Le}CJ|w2SB}OxtUI54El-u@tH@zT z{MuZNy>V7>Ufp%LQX=K?vLrE`HUYJ>rZ8bY9$|pYZ8ZVISxe~4n5HltFq|rXW~W?s z-etF4W_hs{k@34Gw7tgK@<6H#&KfXnKy4t`GhTQRTgbb`UbIx3Q%zYBEH_oVR^!cH zw)@t*CN<%}xNw2D48TDp4eBm5GG&<$>JA`TLsDug_=VaaY(yO#;VEzFt7KV!%aVFf zw^zI<2#Q`ddfnkIZ51!~uU=+Qrz>6-2n)Sv&nsRp`$Hd`JqN zEF{@ZA0$pE2Z_(kSr)Nt4Ie)RICBvLoX*O?a_2eMq`tdvzJ|wS5}vN;EM(qYXG63j)ND}?MVR~wNX9P Z`->kqo<);~^a4Kob(&KAEgvVJ_)oE?(YpWu literal 739 zcmZuv&ubGw6rSDu*qKSvZrh0K?OmkFEqYK8FF~VQEvY6E?a8^M?4g1ep?`o+O0b$D zfqGDug@jH~&_j+MJXme2vU(7`NDn0_UKRu`EgEOjD5xD6=6m1!zL_^~MxzPJ$^FB* zBZmkf9%++%WaE>+)zq>-SsXQ(pmXx+f)!E357fL{PqdAO)(Hj7Kuw-jsY^FjXLVQJ zfww(LFsfz@npC$#_8AWzR4Wx4TAVb!Sq0x`yDmKtqvbUhf;4*`o4Az+!b4jhu)_C2tvq31lMjO=0 z4u_jT+ z%M6+_iX$$OGmEAihoig?GzB{T7dhi*R?S6o-ro^c)vW8?5j2J6rPVtGy|5Q^F5m6N zU+nEatb0Jh-Em{y-xlXeg>o74#c4QOn1;#}lq>mCg`CPyOcqWa+s!JrRH$4i6$xzi vf*m2c5rL!dv1e6BaZIhx#%P$)QP1Q8p++| Date: Mon, 5 Apr 2021 22:53:53 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E9=A3=9F=E7=89=A9?= =?UTF-8?q?=E7=94=9F=E6=88=90=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- addfood.asm | 4 +++- append.asm | 9 --------- head.asm | 4 +++- main.asm | 28 ++++++++++------------------ snake.prg | Bin 1122 -> 1114 bytes 5 files changed, 16 insertions(+), 29 deletions(-) delete mode 100644 append.asm diff --git a/addfood.asm b/addfood.asm index d361361..89f26af 100644 --- a/addfood.asm +++ b/addfood.asm @@ -52,7 +52,9 @@ addfood: beq - cmp #cblk beq - - lda #csnk + cmp #crnd + beq - + lda #crnd dey sta (_ptr), y rts diff --git a/append.asm b/append.asm deleted file mode 100644 index 8788428..0000000 --- a/append.asm +++ /dev/null @@ -1,9 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; append 增加蛇长 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -append: -.scope - inc c ; 蛇长加一 - ; 其他代码 - rts -.scend \ No newline at end of file diff --git a/head.asm b/head.asm index 2b5f825..22972ef 100644 --- a/head.asm +++ b/head.asm @@ -1,6 +1,7 @@ .alias cblk $66 ; 边框 .alias csnk $a0 ; 像素 .alias csps $20 ; 空白 +.alias crnd $51 ; 食物 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; 按钮配置,调试时使用WASD控制 @@ -23,5 +24,6 @@ .alias field $0428 ; 蛇所在屏幕内存区 .data -.org $c000 +.org $c000 +.space eat 1 .text \ No newline at end of file diff --git a/main.asm b/main.asm index 26a9e29..e350a2a 100644 --- a/main.asm +++ b/main.asm @@ -5,9 +5,6 @@ main: .scope -.data -.space lopcnt 1 ; 循环次数计数 -.text `init jsr getchar ; 等待输入任意字符开始游戏 jsr erasehint ; 游戏开始,清空提示 @@ -18,28 +15,24 @@ main: jsr printfail jsr getchar rts - clc -* jsr judgefood ; 判断是否吃到食物 +* clc + lda #0 + sta eat + jsr judgefood ; 判断是否吃到食物 bcc + - jsr append + inc c ; 蛇长加一 + lda #1 + sta eat + jsr addfood * jsr calcscore ; 计算得分 jsr printscore ; 打印分数 lda #32 jsr delay ; 延时期间最后一个按键位于d lda d - beq ++ cmp #ed_g bne + rts -* sta d -* inc lopcnt - lda lopcnt - cmp #16 - bmi ----- - lda #0 - sta lopcnt - jsr addfood - jmp ----- +* jmp ---- .scend ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -50,7 +43,7 @@ main: jsr chrout lda #$00 sta s - lda #$00 + sta eat sta s + 1 ; 初始化分数为0 jsr printscore ; 打印分数 lda #csnk @@ -69,7 +62,6 @@ main: .require "hint.asm" .require "getchar.asm" .require "addfood.asm" -.require "append.asm" .require "delay.asm" .require "judge.asm" .require "move.asm" diff --git a/snake.prg b/snake.prg index 7d3a4bd100a146b3b1a816f48c4610ecec5b191d..a9f7847242c4dde7819e8e19b4b1cb0288a6f0af 100644 GIT binary patch delta 234 zcmaFFaf@R@aD6YsfmT+9bsQ@f^nPY-WmfRuQmE%z8QjXGAjYHcgiB#Hmx2qAgn|># z1a^g~TtJZoiIogMO$yFD6S$r+uVe(VUvVk8@_-CcP*CPs%5*aD0%L+t35UcYh6M}? zAO5dQTg0z$>HnzFq1#g}S%nBMj3cfrbjS33dJWH8Au%8UPz?jg=^p4@cT80BB1q_a_Wawo$ zpzxW?r+DHzaqdS8I1~bSGFD_LyqI{wlRKYNp_x-*C#M1{*JKq&E5?Ay@r-}D>bO>> zO=Mfis8BaKjY&;<{{k+Eo&uSa}U3x_LQM8l&jS1sxOF5)|(J?-e-E R$9JHI=Rm?U=E=$|<^Vm9ObY-2 From e35509d578ea37e93749b594b79da5e9afbcccf8 Mon Sep 17 00:00:00 2001 From: fumiama Date: Tue, 6 Apr 2021 23:03:27 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E5=88=A4=E6=96=AD?= =?UTF-8?q?=E3=80=81=E7=A7=BB=E5=8A=A8=E9=A1=BA=E5=BA=8F=EF=BC=8C=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0head?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- delay.asm | 2 +- head.asm | 3 ++- main.asm | 7 ++++--- print16.asm | 2 +- snake.prg | Bin 1114 -> 1057 bytes 5 files changed, 8 insertions(+), 6 deletions(-) diff --git a/delay.asm b/delay.asm index a573d9a..c51ee64 100644 --- a/delay.asm +++ b/delay.asm @@ -1,7 +1,7 @@ ; DELAY routine. Takes values from the Accumulator and pauses ; for that many jiffies (1/60th of a second). .scope -.data +.data zp .space _tmp 1 .space _target 1 .text diff --git a/head.asm b/head.asm index 22972ef..9c59492 100644 --- a/head.asm +++ b/head.asm @@ -19,11 +19,12 @@ .space c 1 ; 🐍长度 最大255 最小0 .space s 2 ; 得分 小端序 .space _ptr 2 ; 通用指针 +.space eat 1 ; 吃到食物标记 +.space shead 2 ; 蛇头指针 .alias title $0400 .alias field $0428 ; 蛇所在屏幕内存区 .data .org $c000 -.space eat 1 .text \ No newline at end of file diff --git a/main.asm b/main.asm index e350a2a..514082d 100644 --- a/main.asm +++ b/main.asm @@ -8,8 +8,7 @@ main: `init jsr getchar ; 等待输入任意字符开始游戏 jsr erasehint ; 游戏开始,清空提示 -* jsr move ; 蛇移动一格 - clc +* clc jsr judgeout ; 判断是否出界 bcc + jsr printfail @@ -24,7 +23,8 @@ main: lda #1 sta eat jsr addfood -* jsr calcscore ; 计算得分 +* jsr move ; 蛇移动一格 + jsr calcscore ; 计算得分 jsr printscore ; 打印分数 lda #32 jsr delay ; 延时期间最后一个按键位于d @@ -54,6 +54,7 @@ main: lda #go_d ; 初始化方向为下 sta d jsr srand ; 初始化随机数种子 + jsr addfood ; 增加食物 .macend .require "printscore.asm" diff --git a/print16.asm b/print16.asm index af2cd39..9da3aeb 100644 --- a/print16.asm +++ b/print16.asm @@ -4,7 +4,7 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; print16: .scope -.data +.data zp .space _num 4 .space _num_dec 6 .text diff --git a/snake.prg b/snake.prg index a9f7847242c4dde7819e8e19b4b1cb0288a6f0af..e6b165e1658e9ea6142a346b45ee4363287bc2ce 100644 GIT binary patch literal 1057 zcmah|OH30%7@pbpZnqDLz3=b0(buRn=|Mz|WYj&U!F)T25y6?;> z0Dupc!9%eAF4(TX-tVSHAQ~`k(I*8*=7Dbn`ZJH=dI>fJ!PE()mpF9&?#d0xqxaE^ z76n8h22s(XLA}C9mB^^wLW35~5(&MHpk)g^ve2aEAk!}D2n!cGTxB53E}EM%h1}$< zh>dJpWI?DIsYvzF0OFxZ!|{O!P}rj5ew>$U1Uu<+nyz^Uira40MQ@D5IL@9Q$)rGf zI!%GEm12!xx1x~PAU`BZ<0oPyR#Az)=SR426T6(=M%PT_ny6%=m!_|JV0t-Lw~C2$ zZzza2qot_Z8yCqoUis>B%C`N+|7^AEY= z@7+?I9Xfi0%P8KC97gbk5o{AU7Jpdphp*tZ1{^RIrPkyjGMpb)sR% zKgRDNY>8dm_N@I~{1PqyjC#i@deE&;1v~gkCY8;i{^2onIW>lIBPg5e&*Z?x{(+&? zg|qu8k7iQ2tC?YdHd^5>KJ2dsn3I26>}o<5B%2ZoqD`3vMpI#d+*DZsuo~oyInLl< zQh-qb8XV*djTIoPNt|(#GdP$OU{rtx2RTD$1&N6&6OjF{%!DK;|Ex113(DUMsccbU z1%=gQHY2k|X|FnDGmtF;G0luBnyK=kdgYM+3_8*4a$uC}tWVxz)g^7U?uB3L1m$k?tO3m~?R0$#;-W{(aVIh;>Rt>gfwHKbs0B+8uuDOIoP$=d~Jq G#yDFx+>#Ay^A+Y=?2^TczRb4S?1jZ{TI`_humg5gXV)!6Jcko3V#9XT zT2r_r;@1|-+rosg9d=D_jm468?5yELBqS{9@KTh)cFXY>ch==kLxZ_?xn5?^jSbu@ z4j(V%i96+T645yoP+L<26^`Hu6yTZNDqvdE0(l*i1SSKfv+gHWGT8-_-7?uXGtxpb zwWvbNs%~)y5@B#rfjI@r1DUSz>XS%A-W=>^AIfzxlorDJQ00ZP*XUN8udD@J&w#1G z1h1(8F2$)+F`=4rdDf{IfMgj-E{Wt9szab7YTycwyr#TKmG-wPE;|){!;3;d(Mw0K zdtOu8#LN7vm+DmLhL;9`hF-Mm74`9cpK{gLL&8fll<#8atZpD-upGbPrLg}YouQNQ zSI?QCRe4SKspmvn@$r(5xUsvTwSHrNpew)8a64x=cIlJx7w<$NUo5hr(bMc`{xlmu z&Whthg>iCdXyjP_;Qn!%dg=PkV3^aORx(Ax+Zg(4|ZD^*%Hq%)#OdXdRP!i3V(0#q7#Kvq329;M( zzfG4~Ve+|EN!EKqxTa&#Lx2p From 620818c2239ae6f09dbff7bb73fd8970c66e6966 Mon Sep 17 00:00:00 2001 From: fumiama Date: Sun, 11 Apr 2021 11:49:42 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E8=9B=87=E9=95=BF?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E9=94=99=E8=AF=AF=EF=BC=8C=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +++++- main.asm | 1 + snake.prg | Bin 1057 -> 1059 bytes 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index bfc69d9..f29c8f8 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,6 @@ # c64-snake -C64上的贪吃蛇 +在Commodore64上实现简单的贪吃蛇游戏。 + +# 说明 +1. 如果想要直接游玩,只需要下载`snake.prg`文件,在模拟器上运行即可。 +2. 如果想进行修改,你需要下载[ophis](https://github.com/fumiama/c64-ophis-lib),并了解它的独特语法,以理解程序代码。 diff --git a/main.asm b/main.asm index 514082d..c9a6ede 100644 --- a/main.asm +++ b/main.asm @@ -48,6 +48,7 @@ main: jsr printscore ; 打印分数 lda #csnk sta field + 11*40 + 19 ; 初始化蛇位置 + lda #1 sta c ; 初始化蛇长为1 jsr printfield ; 打印蛇,包括边框 jsr printhint ; 打印开始提示 diff --git a/snake.prg b/snake.prg index e6b165e1658e9ea6142a346b45ee4363287bc2ce..28bdec9ef5d37352e299bf95a37a683cb418776d 100644 GIT binary patch delta 182 zcmZ3;v6y2*M8pP;l?!@5v#w-pWmXX7Qt;tg8QjXG@R(a+JD0*nE`ZTg41L}CN=5i1zZp< Z2@;D$fZ9L&_n6_aau!H*a}m>eMgWZ=I5q$P delta 180 zcmZ3?v5;dzMA$lxl?!@5v$irT2y-cTajgt)Wm0&^t+16#VLg{Z8JC0tC(i_Sg#-{c zL1HCCD~AFX&jikA%qtmzOrR=m9t9pA1)wPk3h%g=GMx;(z?k4uHgSVE_ss4-BPrT&770#)U!KpBnQ{l>F8Aek^{>ed%*SQ?HR;Ep4Tgj;4Fxi+%O}cRb7eq^f Y#3B)(_7DF(W_YZe0TSI@!nB?d0Q+G#SO5S3