CYCLES 890P
2009年3月3日
PJ'94年4月号に載ってたMOR氏のE200シリーズの「CYCLES」をFX-890Pシリーズに移植しました。
残念ながら私はE200系を持っているのに(作者怠慢のゆえ)、オリジナルの移植版(E200版)をプレイしたことはありません。 「おそらくこんなゲームなんだろうなぁ」と仮定して、強引に移植しました。MORさん怒らないでくださいねっ!
ちなみにタイトルの「890P」はFX-890P上で制作したということで付けました。もちろん、Z-1GRでも遊べます。
入力方法
すべて、マシン語のゲームです。まず、BASICかCALモードから
CLEAR 1024,&HA4D,6144
としてマシン語エリアを確保して、「CYCLES.BIN」を転送してください。「CYCLES.BAS」を転送、実行してもかまいません。
実行は2000H番地なのでBASICで、
10 DEFSEG=0:CALL&H2000
として使うと便利です。
遊び方
ルール
矢印型のブロックが左から流れてくるので、「8」、「2」で上下移動、「6」で加速させブロックを積んでいきます。
ブロックはいっぺんに2つ流れてくるので「A」で左右を入れ替えます。「S」で矢印の向きを時計回りに回転させます。
矢印をどうしたらいいのかって言うと「サイクルにする」、つまり、1つの「輪っか」にすればいいのです。
このとき、図1の(3)のように矢印を向かい合わせてもサイクルだと認められます(簡単に消せるのでおすすめです)。
サイクルになったブロックは当然消えます。
このとき、得点はブロックの数や連鎖数によって高くなります。
さらに、流れてくるブロックを積むたびに得点が....加算されません。(^^;)
プライマー
上下左右のブロックの他に「プライマー(P)」(50回に1回登場)というのがあります。
このブロックは矢印の通り道に沿ってブロックを全部消してってくれるという、お助けブロックです。
なお、プライマーで消したブロックは得点にはなりませんが、その後に連鎖的に消えるブロックについては、得点になります。
ポーズ
いつものように、ゲーム中は「P」でPAUSE、「RET」でPAUSE解除です。 PAUSE中にも現在の得点が表示されます。
開発言語
今回からMASMを使うようになりました。なぜか、ポケコンのアセンブラでアセンブルできないことがあるので、開発環境を変えました。
とはいっても、MASM(Ver3.00)は中学校の先生にもらったパソコンのおまけみたいなMS-DOS Ver3.1の付属品。おまけにマニュアルがない....
ですから、ポケコンではアセンブルできません、とはいっても、ちょっといじれはアセンブルできますが。
MASMはいいですよ。SAL AL,3をちゃんとアセンブルしてくれるし、アセンブルは速いし。
参考文献
MOR:「CYCLES」、PJ'94年4月号P.62
---------------------------------------------------------------------
図1:サイクルの例
(1) (2) (3)
→↓ →→→↓ →←
↑← ↑← ↓
↑←←
---------------------------------------------------------------------
プログラムリスト
100 CLS:CLEAR:L=1000:FOR I=&H2000 TO &H2942 STEP 8
110 READ A$:C=0:LOCATE 0,0:PRINT "LINE:";STR$(L)
120 FOR J=0 TO 7
130 P$=MID$(A$,J*2+1,2):IF P$="##" THEN 150
140 P=VAL("&H"+P$):POKE I+J,P:C=C+P*(J+1)
150 NEXT:READ A$:IF VAL("&H"+A$)-(C AND 255) THEN PRINT "ERROR IN ";L:END
160 L=L+10:NEXT
170 PRINT "COMPLETED END!":END
1000 DATA 33FF8EDFB410CD41,DE
1010 DATA BE7327B800A08EC0,9B
1020 DATA B023AAB035AAB204,B7
1030 DATA B021AA8AC2AAB022,BE
1040 DATA AAB003AAB020AAB9,59
1050 DATA 1200ACC0E804AA47,94
1060 DATA E2F8FEC247B021AA,8E
1070 DATA 8AC2AAB022AAB003,5A
1080 DATA AAB020AAB1128A64,D9
1090 DATA EEACC1E804AA47E2,3A
1100 DATA F580FA1075DC83EE,99
1110 DATA 12B203FEC247B021,C3
1120 DATA AA8AC2AAB022AAB0,0E
1130 DATA 23AAB020AAB1128A,4D
1140 DATA 64EEACC1E804AA47,C6
1150 DATA E2F580FA1075DC47,7E
1160 DATA B023AAB075AAB020,C9
1170 DATA AA8EC1BB0903BF2A,BD
1180 DATA 29E8F404E80D06B8,A5
1190 DATA 1000E83B06248074,CA
1200 DATA F3B410CD41B95000,8A
1210 DATA 33C08EC0BF4C29F3,97
1220 DATA AAA24629A24729C6,87
1230 DATA 06402A33A3432AA3,CF
1240 DATA 452AB20C32FFB3FE,A8
1250 DATA E80D04FEC30ADB75,B6
1260 DATA F7FEC780FF0274F9,43
1270 DATA 80FF0575E9BB1000,C0
1280 DATA E8F503FEC780FF05,D7
1290 DATA 75F6BB1401BF2329,9E
1300 DATA E8950433C033D2E8,DA
1310 DATA 1B03E86B03C60643,7A
1320 DATA 2900C606442902E8,2B
1330 DATA 5E03C606452900E8,5D
1340 DATA DA05B864008B1643,90
1350 DATA 2A83FA007515A145,74
1360 DATA 2AB93200F7F13DC8,96
1370 DATA 007203B8C800F7D8,36
1380 DATA 052C01A33C2AE877,24
1390 DATA 03E86805E87605E8,CE
1400 DATA 5704803E3E2A0074,A9
1410 DATA 03E8AC058A3E4429,35
1420 DATA 023E3E2A883E4429,20
1430 DATA E89105832E3C2A01,A1
1440 DATA 73D4E89305803E43,02
1450 DATA 290F74338A1E4329,F2
1460 DATA 8A3E4429E8FE0380,07
1470 DATA 7D01007522FE0643,33
1480 DATA 29803E4329017214,80
1490 DATA B3FFB7028A164A29,62
1500 DATA E84503FECB8A164B,98
1510 DATA 29E83C03E970FFE8,1F
1520 DATA 4A058A1E43298A3E,65
1530 DATA 4429E8C803A04829,7D
1540 DATA 88050ADB74078A26,80
1550 DATA 49298865FF3C0B75,1F
1560 DATA 568A1E43298A3E44,AB
1570 DATA 29E8A903C60502B2,9A
1580 DATA 05E80403B90020E2,7A
1590 DATA FEFEC280FA0B75F1,1F
1600 DATA E892038A05C60500,1D
1610 DATA 0AC075028AC68AF0,8D
1620 DATA 32E48BF88A8D1B27,70
1630 DATA 8AAD202702D902FD,F6
1640 DATA 80FB00720F80FB0F,DE
1650 DATA 770A80FF00720580,D6
1660 DATA FF0476BBE8B601E8,68
1670 DATA 500033C9E2FEBB00,88
1680 DATA 02E85103803D0075,67
1690 DATA 03E9D1FEB20532FF,2E
1700 DATA 32DBE8A30247FEC3,EA
1710 DATA 80FB1075F5FEC780,A8
1720 DATA FF0575ECB90008E2,FD
1730 DATA FEFEC280FA0B75DE,87
1740 DATA BB0501BF3929E82F,A7
1750 DATA 03E84804B88000E8,93
1760 DATA 760480E40274F2E9,36
1770 DATA 37FEC7064B2A0100,1A
1780 DATA 33C08EC08ED8BF9C,4C
1790 DATA 29B95000F3AAC606,E0
1800 DATA 3F2A00C706412A00,79
1810 DATA 0032FF32DB53BFEC,FB
1820 DATA 29B95000F3AAE8DC,7E
1830 DATA 0281EF4C2981C7EC,A5
1840 DATA 29C605FFE8CE028A,7A
1850 DATA 0D32ED8BF98A8D1B,30
1860 DATA 278AAD202702D902,90
1870 DATA FD80FB00724A80FB,3C
1880 DATA 0F774580FF007240,E5
1890 DATA 80FF04773BE8A502,90
1900 DATA 803D00743381EF4C,B8
1910 DATA 2981C7EC29803D01,B0
1920 DATA 7426803DFFC60501,FE
1930 DATA 75BABE9C29BFEC29,96
1940 DATA B950008A050AC074,B6
1950 DATA 04FF06412A080446,66
1960 DATA 47E2F0C6063F2A01,B9
1970 DATA 5BFEC380FB107403,2B
1980 DATA E97AFFFEC780FF05,D6
1990 DATA 7403E96EFF803E3F,92
2000 DATA 2A017403E98E00BB,4D
2010 DATA 1802B22BE8F901A1,4B
2020 DATA 4B2AF7264B2AF726,80
2030 DATA 4B2AF726412A8916,CC
2040 DATA 472AA3492AB91027,78
2050 DATA F7F1E8C8008B1647,C5
2060 DATA 2AA1492A0106452A,4B
2070 DATA 1116432AB91027F7,74
2080 DATA F13DE803720DBA98,8D
2090 DATA 00B87F968916432A,9B
2100 DATA A3452AB20532FF32,41
2110 DATA DBE8F9018BF781EF,1A
2120 DATA 4C2981C79C29803D,A7
2130 DATA 007406E84A01C604,9C
2140 DATA 00FEC380FB1075E1,C7
2150 DATA FEC780FF0575D8B9,8F
2160 DATA 0030E2FEFEC280FA,D0
2170 DATA 0B75CAE81F00FF06,B7
2180 DATA 4B2AE9BBFEBB1802,56
2190 DATA B220E86B018B1643,4F
2200 DATA 2AA1452AB91027F7,A9
2210 DATA F1E84900C332FFB3,28
2220 DATA 01E8A101803D0075,4E
2230 DATA 0E8ACB32ED8A45FF,03
2240 DATA 88054FE2F8880DFE,5A
2250 DATA C380FB1075E3FEC7,B9
2260 DATA 80FF0575DAE80100,1A
2270 DATA C3BF4C2932FF32DB,F3
2280 DATA 8A15E8D30047FEC3,6C
2290 DATA 80FB1075F3FEC780,9E
2300 DATA FF0575EAC3B319B7,78
2310 DATA 0252B164F6F18AD0,03
2320 DATA E83C008AC432E4B1,4C
2330 DATA 0AF6F18AD0E82F00,BA
2340 DATA 8AD4E82A005A8BC2,8B
2350 DATA 33D2B9E803F7F192,A2
2360 DATA E81C00B164F6F18A,83
2370 DATA D0E813008AC432E4,A1
2380 DATA B10AF6F18AD0E806,85
2390 DATA 008AD4E80100C380,8A
2400 DATA C230E8C300FEC3C3,47
2410 DATA A04A29A24829A04B,4D
2420 DATA 29A24929E839008A,1A
2430 DATA F2E8340081E20303,5C
2440 DATA 81C2010188164A29,86
2450 DATA 88364B29FE0E402A,D3
2460 DATA 750FC606402A32C6,C7
2470 DATA 064A290BC6064B29,98
2480 DATA 00B3FEB702B200E8,B2
2490 DATA 2E00FEC3E82900C3,CA
2500 DATA 505351B8DB02BB83,51
2510 DATA 0333C9B20A03C9D0,CF
2520 DATA E4D0D0720203CB80,65
2530 DATA EA0175F187D9891E,77
2540 DATA B4248AD7595B58C3,55
2550 DATA 60061E80C30233FF,FE
2560 DATA 8EDFB800A08EC0B0,A8
2570 DATA 21AA8AC3240F0406,79
2580 DATA AAB022AA8AC7D0E7,5C
2590 DATA C0E00202C7D0E380,86
2600 DATA E32002C3FEC0AA32,E1
2610 DATA F6D1E28BCAD1E203,88
2620 DATA D181C225278BF2B9,18
2630 DATA 0600B020AAAC535B,0D
2640 DATA AA4FE2F91F0761C3,56
2650 DATA 60061E33C08ED8B4,2E
2660 DATA 3ACD418CC08ED88B,1B
2670 DATA F780EA2032F6C1E2,4A
2680 DATA 0303F2B800A08EC0,61
2690 DATA 33FFB021AA8AC324,C8
2700 DATA 0F0406AAB022AA8A,03
2710 DATA C7C0E003F6C31074,63
2720 DATA 020420AAB020AAB9,B0
2730 DATA 0700AC535BAA4FE2,53
2740 DATA F91F0761C35053C0,C4
2750 DATA E70402DF32FF8BFB,0A
2760 DATA B84C2903F85B58C3,51
2770 DATA 608A15470AD27407,51
2780 DATA E895FFFEC3EBF261,FE
2790 DATA C38A0E4529C6063E,A0
2800 DATA 2A00B80001E83001,1F
2810 DATA 251000742EFE0645,41
2820 DATA 29803E4529327223,26
2830 DATA C606452900803E44,17
2840 DATA 290074178A1E4329,64
2850 DATA 8A3E4429FECFE8A4,BE
2860 DATA FF803D007505C606,B7
2870 DATA 3E2AFFB80001E8F7,85
2880 DATA 00254000742EFE06,84
2890 DATA 4529803E45293272,4C
2900 DATA 23C606452900803E,12
2910 DATA 44290474178A1E43,0B
2920 DATA 298A3E4429FEC7E8,79
2930 DATA 6BFF803D007505C6,EE
2940 DATA 063E2A01B80002E8,EA
2950 DATA BE002540007416FE,6F
2960 DATA 064529803E452914,9E
2970 DATA 720BC606452900C7,79
2980 DATA 063C2A00003A0E45,E2
2990 DATA 297505C606452900,15
3000 DATA B80200E892002510,B9
3010 DATA 007419803E462900,2C
3020 DATA 7517C606462901A0,68
3030 DATA 482986064929A248,55
3040 DATA 29EB0690C6064629,85
3050 DATA 00B80400E8690025,A2
3060 DATA 0800742A803E4729,39
3070 DATA 007528C606472901,69
3080 DATA 803E48290B741CA0,2B
3090 DATA 48298A2649292503,4E
3100 DATA 03050101A2482988,4D
3110 DATA 264929EB0690C606,F7
3120 DATA 472900C3B80100E8,83
3130 DATA 2E0032C4A8417404,EE
3140 DATA B47FCD41C3B84000,FC
3150 DATA E81D0024027418B8,DC
3160 DATA 4000E81300240275,D2
3170 DATA F6E8D8FFB88000E8,22
3180 DATA 060080E40274F2C3,8E
3190 DATA BA0002EFE80500BA,F2
3200 DATA 0202EDC351B90900,03
3210 DATA E2FE59C38A164829,6B
3220 DATA 8A364929E80700C3,3F
3230 DATA 33D2E80100C38A1E,DB
3240 DATA 43298A3E4429E8CF,45
3250 DATA FD80FB00750580FF,CD
3260 DATA 027507FECB8AD6E8,46
3270 DATA BEFDC300000100FF,FF
3280 DATA 00FF000100000000,02
3290 DATA 000000081C2A0808,20
3300 DATA 0008043E04080008,98
3310 DATA 082A1C080008103E,60
3320 DATA 10080000000C0C00,BC
3330 DATA 00000C12120C0000,0E
3340 DATA 1E12121E001E2121,93
3350 DATA 21211E3F21212121,13
3360 DATA 3F0000000000003C,1F
3370 DATA 223C2020003D3D00,93
3380 DATA 2F2F000000000001,95
3390 DATA 0303070707070703,D0
3400 DATA 0100000000001F70,5A
3410 DATA E0C0808080000000,60
3420 DATA 000183FC00000000,7B
3430 DATA 27E3E34141010100,EC
3440 DATA 0001018103070000,42
3450 DATA 0000E7C382C4C8C8,9B
3460 DATA D0E0E0C0C0C0C0F0,30
3470 DATA 00000000830E1C38,67
3480 DATA 7070F0E0E0E0E060,60
3490 DATA 301F00000000E41C,8A
3500 DATA 1C08080000000001,4C
3510 DATA 0131638700000000,A8
3520 DATA FE78707070E0E0E0,8E
3530 DATA E0C0C0C1C7FF0000,81
3540 DATA 0000070303030307,8F
3550 DATA 0707070E8E8E1E7F,46
3560 DATA 00000000FFC38180,14
3570 DATA 8818F81010000206,6E
3580 DATA 1CFC00000000878E,35
3590 DATA 1C1C1E0F07030140,26
3600 DATA 4060F18F00000000,0F
3610 DATA C8783810100080C0,70
3620 DATA E0E0E0E0C0800000,80
3630 DATA 0000000000000000,00
3640 DATA 0000000101010000,0F
3650 DATA 000000001F337373,8A
3660 DATA 733A1C6ECFC7C7C7,51
3670 DATA CE78000000000386,03
3680 DATA 8E9C1C1C1C1C0F01,2F
3690 DATA 01030E1800000000,91
3700 DATA C060707173F3F3E7,62
3710 DATA E7C7860602010000,2F
3720 DATA 00003864C6C68E8E,0C
3730 DATA 8E1C1C1C383070C1,DA
3740 DATA 000000003F1E1C1C,93
3750 DATA 1C38383F38707070,78
3760 DATA F0F800000000E070,80
3770 DATA 38383870E0C00000,F0
3780 DATA 0000000000000000,00
3790 DATA 0000000000000000,00
3800 DATA 3910111214181010,B8
3810 DATA 0000000000000000,00
3820 DATA 0000C080003653E2,D9
3830 DATA 84E4000000000000,4C
3840 DATA 00000000041C0888,34
3850 DATA 0808103900000000,2C
3860 DATA 000000000000020E,7E
3870 DATA 04040404081C0000,F8
3880 DATA 0000000000000000,00
3890 DATA 3148090911224AF3,BF
3900 DATA 0000000000000000,00
3910 DATA 0000808000E02020,A0
3920 DATA 40800053434F5245,1B
3930 DATA 3A00505553482053,45
3940 DATA 50414345204B4559,BC
3950 DATA 0047414D45204F56,77
3960 DATA 455200##########,E9
ソースリスト
;******************************************************************************
;CYCLES 890P by ABCP software. Ver.1.12b
;1997 (C) COPYRIGHT BY ABCP software
;******************************************************************************
.186
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,SS:CODE,ES:CODE
ORG 0100H
START:
ORG 2000H
;**************************************
;タイトル表示
;**************************************
TITLE:
XOR DI,DI
MOV DS,DI
MOV AH,10H
INT 41H
BDISP1:
MOV SI,OFFSET TITLE_GRAPH
BDISP:
MOV AX,0A000H
MOV ES,AX
MOV AL,23H
STOSB
MOV AL,35H
STOSB
MOV DL,4
MOV AL,21H
STOSB
MOV AL,DL
STOSB
MOV AL,22H
STOSB
MOV AL,3
STOSB
MOV AL,20H
STOSB
MOV CX,18
BDILP0:
LODSB
SHR AL,4
STOSB
INC DI
LOOP BDILP0
BDILP1:
INC DL
INC DI
MOV AL,21H
STOSB
MOV AL,DL
STOSB
MOV AL,22H
STOSB
MOV AL,3
STOSB
MOV AL,20H
STOSB
MOV CL,18
BDILP2:
MOV AH,[SI-18]
LODSB
SHR AX,4
STOSB
INC DI
LOOP BDILP2
CMP DL,16
JNZ BDILP1
SUB SI,18
MOV DL,3
BDILP3:
INC DL
INC DI
MOV AL,21H
STOSB
MOV AL,DL
STOSB
MOV AL,22H
STOSB
MOV AL,35
STOSB
MOV AL,20H
STOSB
MOV CL,18
BDILP4:
MOV AH,[SI-18]
LODSB
SHR AX,4
STOSB
INC DI
LOOP BDILP4
CMP DL,16
JNZ BDILP3
INC DI
MOV AL,23H
STOSB
MOV AL,75H
STOSB
MOV AL,20H
STOSB
MOV ES,CX
MOV BX,0309H
MOV DI,OFFSET MOJI_PUSH_SPACE_KEY
CALL MOJI_PRINT
TITLE_BREAK_CHK:
CALL POWEROFF_CHECK
MOV AX,0010H
CALL KEY
AND AL,80H
JZ TITLE_BREAK_CHK
;**************************************
;ゲーム前の初期設定
;**************************************
INIT:
MOV AH,10H
INT 41H
MOV CX,80
XOR AX,AX
MOV ES,AX
MOV DI,OFFSET BRAM
REP STOSB
MOV BYTE PTR KEY_REPEAT_2,AL
MOV BYTE PTR KEY_REPEAT_3,AL
MOV BYTE PTR UNTIL_PRIMER,51
MOV WORD PTR SCORE1,AX
MOV WORD PTR SCORE2,AX
MOV DL,12
XOR BH,BH
WALL_Y_LOOP:
MOV BL,-2
WALL_X_LOOP:
CALL PRINT
INC BL
OR BL,BL
JNZ WALL_X_LOOP
WALL_Y_INC:
INC BH
CMP BH,2
JZ WALL_Y_INC
CMP BH,5
JNZ WALL_Y_LOOP
MOV BX,16
WALL_BOTTOM_LOOP:
CALL PRINT
INC BH
CMP BH,5
JNZ WALL_BOTTOM_LOOP
MOV BX,0114H
MOV DI,OFFSET MOJI_SCORE
CALL MOJI_PRINT
XOR AX,AX
XOR DX,DX
CALL SCORE_PRINT
CALL NEXT
;**************************************
;メインルーチン
;**************************************
SET:
MOV BYTE PTR ARROW_X,0
MOV BYTE PTR ARROW_Y,2
CALL NEXT
MOV BYTE PTR KEY_REPEAT,0
DOWN_CONT:
CALL ARROW_PRINT
MOV AX,100 ;スコアによって落下速度を変化
MOV DX,SCORE1
CMP DX,0
JNZ FASTEST
MOV AX,SCORE2
MOV CX,50
DIV CX
CMP AX,200
JC SLOW
MOV AX,200
SLOW:
NEG AX
ADD AX,300
FASTEST:
MOV WORD PTR DOWN_WAIT,AX
DOWN_LOOP:
CALL RND
CALL POWEROFF_CHECK
CALL PAUSE_CHECK
CALL CHK ;Yの変化量を返す
CMP BYTE PTR DELTA_Y,0 ;DELTA_Y=Yの変化量
JZ RE_CHR_PUT
CALL ARROW_DISPRINT
RE_CHR_PUT:
MOV BH,ARROW_Y
ADD BH,BYTE PTR DELTA_Y
MOV BYTE PTR ARROW_Y,BH
CALL ARROW_PRINT
DOWN_LOOP_END:
SUB WORD PTR DOWN_WAIT,1
JNC DOWN_LOOP
CALL ARROW_DISPRINT
CMP BYTE PTR ARROW_X,15
JZ BOTTOM
MOV BL,ARROW_X
MOV BH,ARROW_Y
CALL XY
CMP BYTE PTR [DI+1],0
JNZ BOTTOM
INC BYTE PTR ARROW_X
CMP BYTE PTR ARROW_X,1
JC TO_DOWN_CONT
MOV BL,-1
MOV BH,2
MOV DL,NEXT_ARROW_DERECTION
CALL PRINT
DEC BL
MOV DL,NEXT_ARROW_DERECTION2
CALL PRINT
TO_DOWN_CONT:
JMP DOWN_CONT
BOTTOM: ;これ以上落ちられないとき
CALL ARROW_PRINT
MOV BL,ARROW_X
MOV BH,ARROW_Y
CALL XY
MOV AL,ARROW_DERECTION
MOV [DI],AL
OR BL,BL
JZ BOTTOM_2
MOV AH,ARROW_DERECTION2
MOV [DI-1],AH
BOTTOM_2:
CMP AL,11
JNZ VANISHING
;**************************************
;プライマーの処理
;**************************************
PRIMER:
MOV BL,ARROW_X
MOV BH,ARROW_Y
CALL XY
MOV BYTE PTR [DI],2
PRIMER_LOOP:
MOV DL,5
PRIMER_ANIME_LOOP:
CALL PRINT
MOV CX,02000H
LOOP $
INC DL
CMP DL,11
JNZ PRIMER_ANIME_LOOP
CALL XY
MOV AL,[DI]
MOV BYTE PTR [DI],0
OR AL,AL
JNZ PRIMER_MOVE
MOV AL,DH
PRIMER_MOVE:
MOV DH,AL
XOR AH,AH
MOV DI,AX
MOV CL,[OFFSET VECTOR_X+DI]
MOV CH,[OFFSET VECTOR_Y+DI]
ADD BL,CL ;座標の変化
ADD BH,CH
CMP BL,0
JC PRIMER_E
CMP BL,15
JA PRIMER_E
CMP BH,0
JC PRIMER_E
CMP BH,4
JNA PRIMER_LOOP
PRIMER_E:
CALL GRAVITY ;ブロックの落下
VANISHING:
CALL VANISH
OVER_CHECK:
XOR CX,CX
LOOP $
MOV BX,0200H
CALL XY
CMP BYTE PTR [DI],0
JNZ END
JMP SET
;**************************************
;ゲームオーバー
;**************************************
END:
MOV DL,5
END_LOOP:
XOR BH,BH
CLS_Y:
XOR BL,BL
CLS_X:
CALL PRINT
INC DI
INC BL
CMP BL,16
JNZ CLS_X
INC BH
CMP BH,5
JNZ CLS_Y
MOV CX,0800H
LOOP $
INC DL
CMP DL,11
JNZ END_LOOP
MOV BX,0105H
MOV DI,OFFSET MOJI_GAMEOVER
CALL MOJI_PRINT
END_CR_WAIT:
CALL POWEROFF_CHECK
MOV AX,0080H
CALL KEY
AND AH,02H
JZ END_CR_WAIT
JMP INIT
;**************************************
;消去判定
;**************************************
VANISH:
MOV WORD PTR RENSA_NUMBER,1
VANISH_START:
XOR AX,AX
MOV ES,AX
MOV DS,AX
MOV DI,OFFSET VANISH_BLOCK
MOV CX,80
REP STOSB
VANISH_1:
MOV BYTE PTR [VANISH_THIS_TIME],0
MOV WORD PTR VANISH_NUMBER,0
XOR BH,BH
VANISH_Y_LOOP:
XOR BL,BL
VANISH_X_LOOP:
PUSH BX
MOV DI,OFFSET VANISH_CHECK_WORK
MOV CX,80
REP STOSB
CALL XY
SUB DI,OFFSET BRAM
ADD DI,OFFSET VANISH_CHECK_WORK
MOV BYTE PTR [DI],-1 ;輪の最初にフラグ
VANISH_MAIN_LOOP:
CALL XY
MOV CL,[DI]
XOR CH,CH
MOV DI,CX
MOV CL,[OFFSET VECTOR_X+DI]
MOV CH,[OFFSET VECTOR_Y+DI]
ADD BL,CL
ADD BH,CH
CMP BL,0
JC VANISH_E
CMP BL,15
JA VANISH_E
CMP BH,0
JC VANISH_E
CMP BH,4
JA VANISH_E
CALL XY ;そのマスが空っぽか
CMP BYTE PTR [DI],0
JZ VANISH_E
SUB DI,OFFSET BRAM ;一回通ったところならダメ
ADD DI,OFFSET VANISH_CHECK_WORK
CMP BYTE PTR [DI],1
JZ VANISH_E
CMP BYTE PTR [DI],-1
MOV BYTE PTR [DI],1 ;「通った」というフラグを立てる
JNZ VANISH_MAIN_LOOP
MOV SI,OFFSET VANISH_BLOCK
MOV DI,OFFSET VANISH_CHECK_WORK
MOV CX,80
TRANS_LOOP:
MOV AL,[DI]
OR AL,AL
JZ TRANS_SCORE
INC WORD PTR VANISH_NUMBER ;VANISH_NUMBER=消したブロック数の2乗
TRANS_SCORE:
OR [SI],AL
INC SI
INC DI
LOOP TRANS_LOOP
MOV BYTE PTR [VANISH_THIS_TIME],1
VANISH_E:
POP BX
INC BL
CMP BL,16
JZ $+5
JMP VANISH_X_LOOP
INC BH
CMP BH,5
JZ $+5
JMP VANISH_Y_LOOP
CMP BYTE PTR [VANISH_THIS_TIME],1
JZ $+5
JMP VANISH_NO_ANIME
MOV BX,0218H
MOV DL,'+'
CALL LCDC
MOV AX,RENSA_NUMBER
MUL WORD PTR RENSA_NUMBER
MUL WORD PTR RENSA_NUMBER
MUL WORD PTR VANISH_NUMBER
MOV WORD PTR SCORE_PLUS1,DX
MOV WORD PTR SCORE_PLUS2,AX
MOV CX,10000
DIV CX
CALL SCORE_PRINT
MOV DX,WORD PTR SCORE_PLUS1
MOV AX,WORD PTR SCORE_PLUS2
ADD SCORE2,AX
ADC SCORE1,DX
MOV CX,10000
DIV CX
CMP AX,1000
JC NOT_OVERFLOW
MOV DX,0098H
MOV AX,967FH
MOV SCORE1,DX
MOV SCORE2,AX
NOT_OVERFLOW:
MOV DL,5
ANIME_CHR_LOOP:
XOR BH,BH
ANIME_Y_LOOP:
XOR BL,BL
ANIME_X_LOOP:
CALL XY
MOV SI,DI
SUB DI,OFFSET BRAM
ADD DI,OFFSET VANISH_BLOCK
CMP BYTE PTR [DI],0
JZ ANIME_LOOP_END
CALL PRINT
MOV BYTE PTR [SI],0 ;BRAMから消す。
ANIME_LOOP_END:
INC BL
CMP BL,16
JNZ ANIME_X_LOOP
INC BH
CMP BH,5
JNZ ANIME_Y_LOOP
MOV CX,03000H
LOOP $
INC DL
CMP DL,11
JNZ ANIME_CHR_LOOP
CALL GRAVITY
INC WORD PTR RENSA_NUMBER
JMP VANISH_START
VANISH_NO_ANIME:
MOV BX,0218H
MOV DL,' '
CALL LCDC
MOV DX,SCORE1
MOV AX,SCORE2
MOV CX,10000
DIV CX
CALL SCORE_PRINT
RET
;**************************************
;重力が働きます
;**************************************
GRAVITY:
XOR BH,BH
GRAVITY_Y_LOOP:
MOV BL,1
GRAVITY_X_LOOP:
CALL XY
CMP BYTE PTR [DI],0
JNZ GRAVITY_LOOP_END
MOV CL,BL
XOR CH,CH
GRAVITY_DOWN_LOOP:
MOV AL,[DI-1]
MOV [DI],AL
DEC DI
LOOP GRAVITY_DOWN_LOOP
MOV [DI],CL ;先頭を0にする。
GRAVITY_LOOP_END:
INC BL
CMP BL,16
JNZ GRAVITY_X_LOOP
INC BH
CMP BH,5
JNZ GRAVITY_Y_LOOP
CALL BRAM_PUT
RET
;**************************************
;画面表示のサブルーチン
;**************************************
BRAM_PUT:
MOV DI,OFFSET BRAM
XOR BH,BH
BRAM_PUT_Y:
XOR BL,BL
BRAM_PUT_X:
MOV DL,[DI]
CALL PRINT
INC DI
INC BL
CMP BL,16
JNZ BRAM_PUT_X
INC BH
CMP BH,5
JNZ BRAM_PUT_Y
RET
;**************************************
;スコア表示
;**************************************
SCORE_PRINT:
MOV BL,25
MOV BH,2
PUSH DX
MOV CL,100
DIV CL
MOV DL,AL
CALL SCORE_NUMBER
MOV AL,AH
XOR AH,AH
MOV CL,10
DIV CL
MOV DL,AL
CALL SCORE_NUMBER
MOV DL,AH
CALL SCORE_NUMBER
POP DX
MOV AX,DX
XOR DX,DX
MOV CX,1000
DIV CX
XCHG AX,DX
CALL SCORE_NUMBER
MOV CL,100
DIV CL
MOV DL,AL
CALL SCORE_NUMBER
MOV AL,AH
XOR AH,AH
MOV CL,10
DIV CL
MOV DL,AL
CALL SCORE_NUMBER
MOV DL,AH
CALL SCORE_NUMBER
RET
SCORE_NUMBER:
ADD DL,48
CALL LCDC
INC BL
RET
;**************************************
;NEXT表示ルーチン
;**************************************
NEXT:
MOV AL,NEXT_ARROW_DERECTION
MOV ARROW_DERECTION,AL
MOV AL,NEXT_ARROW_DERECTION2
MOV ARROW_DERECTION2,AL
CALL RND
MOV DH,DL
CALL RND
AND DX,0303H
ADD DX,0101H
MOV BYTE PTR NEXT_ARROW_DERECTION,DL
MOV BYTE PTR NEXT_ARROW_DERECTION2,DH
DEC BYTE PTR UNTIL_PRIMER
JNZ NEXT_RET
MOV BYTE PTR UNTIL_PRIMER,50
MOV BYTE PTR NEXT_ARROW_DERECTION,11
MOV BYTE PTR NEXT_ARROW_DERECTION2,0
NEXT_RET:
MOV BL,-2
MOV BH,2
MOV DL,0
CALL PRINT
INC BL
CALL PRINT
RET
;**************************************
;乱数発生
;**************************************
RND:
PUSH AX
PUSH BX
PUSH CX
RNDDT:
MOV AX,02DBH
MOV BX,0383H
XOR CX,CX
MOV DL,10
RNDLP:
ADD CX,CX
SAL AH,1
RCL AL,1
JC RNDSK
ADD CX,BX
RNDSK:
SUB DL,1
JNZ RNDLP
XCHG BX,CX
MOV WORD PTR [RNDDT+1],BX
MOV DL,BH
POP CX
POP BX
POP AX
RET
;**************************************
;1文字表示
;**************************************
PRINT:
PUSHA
PUSH ES
PUSH DS
ADD BL,2
XOR DI,DI
MOV DS,DI
MOV AX,0A000H
MOV ES,AX
MOV AL,21H
STOSB
MOV AL,BL
AND AL,0FH
ADD AL,6
STOSB
MOV AL,22H
STOSB
MOV AL,BH
SAL BH,1
SAL AL,2
ADD AL,BH
SAL BL,1
AND BL,20H
ADD AL,BL
INC AL
STOSB
XOR DH,DH
SAL DX,1
MOV CX,DX
SAL DX,1
ADD DX,CX
ADD DX,OFFSET ARROW_FONT
MOV SI,DX
MOV CX,6
WRITE_S:
MOV AL,20H
STOSB
WRITE_L:
LODSB
PUSH BX
POP BX
STOSB
DEC DI
LOOP WRITE_L
POP DS
POP ES
POPA
RET
LCDC:
PUSHA
PUSH ES
PUSH DS
XOR AX,AX
MOV DS,AX
MOV AH,3AH
INT 41H
MOV AX,ES
MOV DS,AX
MOV SI,DI
SUB DL,32
XOR DH,DH
SHL DX,3
ADD SI,DX
MOV AX,0A000H
MOV ES,AX
XOR DI,DI
MOV AL,21H
STOSB
MOV AL,BL
AND AL,0FH
ADD AL,6
STOSB
MOV AL,22H
STOSB
MOV AL,BH
SHL AL,3
TEST BL,10H
JE OK
ADD AL,20H
OK:
STOSB
MOV AL,20H
STOSB
MOV CX,7
P_LP:
LODSB
PUSH BX
POP BX
STOSB
DEC DI
LOOP P_LP
POP DS
POP ES
POPA
RET
;**************************************
;仮想配列変数
;**************************************
XY:
PUSH AX
PUSH BX
SHL BH,4
ADD BL,BH
XOR BH,BH
MOV DI,BX
MOV AX,OFFSET BRAM
ADD DI,AX
POP BX
POP AX
RET
;**************************************
;文字列表示
;**************************************
MOJI_PRINT:
PUSHA
MOJI_PRINT_LOOP:
MOV DL,[DI]
INC DI
OR DL,DL
JZ MOJI_PRINT_END
CALL LCDC
INC BL
JMP SHORT MOJI_PRINT_LOOP
MOJI_PRINT_END:
POPA
RET
;**************************************
;キー入力チェック
;**************************************
CHK:
MOV CL,BYTE PTR KEY_REPEAT
MOV BYTE PTR DELTA_Y,0
MOV AX,0100H ;8
CALL KEY
AND AX,0010H
JZ CHK_A
INC BYTE PTR KEY_REPEAT
CMP BYTE PTR KEY_REPEAT,50
JC CHK_A
MOV BYTE PTR KEY_REPEAT,0
CMP BYTE PTR ARROW_Y,0
JE CHK_A
MOV BL,ARROW_X
MOV BH,ARROW_Y
DEC BH
CALL XY
CMP BYTE PTR [DI],0
JNE CHK_A
MOV BYTE PTR DELTA_Y,255
CHK_A:
MOV AX,0100H
CALL KEY
AND AX,0040H
JZ CHK_B
INC BYTE PTR KEY_REPEAT
CMP BYTE PTR KEY_REPEAT,50
JC CHK_B
MOV BYTE PTR KEY_REPEAT,0
CMP BYTE PTR ARROW_Y,4
JE CHK_B
MOV BL,ARROW_X
MOV BH,ARROW_Y
INC BH
CALL XY
CMP BYTE PTR [DI],0
JNE CHK_B
MOV BYTE PTR DELTA_Y,1
CHK_B:
MOV AX,0200H
CALL KEY
AND AX,0040H
JZ CHK_C
INC BYTE PTR KEY_REPEAT
CMP BYTE PTR KEY_REPEAT,20
JC CHK_C
MOV BYTE PTR KEY_REPEAT,0
MOV WORD PTR DOWN_WAIT,0
CHK_C:
CMP CL,BYTE PTR KEY_REPEAT
JNZ CHK_D
MOV BYTE PTR KEY_REPEAT,0
CHK_D:
MOV AX,0002H ;A
CALL KEY
AND AX,0010H
JZ CHK_E
CMP BYTE PTR KEY_REPEAT_2,0
JNZ CHK_F
MOV BYTE PTR KEY_REPEAT_2,1
MOV AL,BYTE PTR ARROW_DERECTION
XCHG AL,BYTE PTR ARROW_DERECTION2
MOV BYTE PTR ARROW_DERECTION,AL
JMP CHK_F
CHK_E:
MOV BYTE PTR KEY_REPEAT_2,0
CHK_F:
MOV AX,0004H ;S
CALL KEY
AND AX,0008H
JZ CHK_G
CMP BYTE PTR KEY_REPEAT_3,0
JNZ CHK_H
MOV BYTE PTR KEY_REPEAT_3,1
CMP BYTE PTR ARROW_DERECTION,11
JZ CHK_H
MOV AL,ARROW_DERECTION
MOV AH,ARROW_DERECTION2
AND AX,0303H
ADD AX,0101H
MOV ARROW_DERECTION,AL
MOV ARROW_DERECTION2,AH
JMP CHK_H
CHK_G:
MOV BYTE PTR KEY_REPEAT_3,0
CHK_H:
RET
;**************************************
;キー入力のサブルーチン
;**************************************
POWEROFF_CHECK:
MOV AX,0001H
CALL KEY
XOR AL,AH
TEST AL,41H
JZ NOT_POWEROFF
MOV AH,7FH
INT 41H
NOT_POWEROFF:
RET
PAUSE_CHECK:
MOV AX,0040H ;P
CALL KEY
AND AL,02H
JZ PAUSE_CHECK_END
WHILE_P_PUSHED:
MOV AX,0040H ;P
CALL KEY
AND AL,02H
JNZ WHILE_P_PUSHED
UNTIL_CR_PUSH:
CALL POWEROFF_CHECK
MOV AX,0080H ;CR
CALL KEY
AND AH,02H
JZ UNTIL_CR_PUSH
PAUSE_CHECK_END:
RET
KEY:
MOV DX,200H
OUT DX,AX
CALL K_WAIT
MOV DX,202H
IN AX,DX
RET
K_WAIT:
PUSH CX
MOV CX,0009H
K_LOOP:
LOOP K_LOOP
POP CX
RET
;**************************************
;矢印表示サブ
;**************************************
ARROW_PRINT:
MOV DL,ARROW_DERECTION
MOV DH,ARROW_DERECTION2
CALL ARROW_PRINT_MAIN
RET
ARROW_DISPRINT:
XOR DX,DX
CALL ARROW_PRINT_MAIN
RET
ARROW_PRINT_MAIN:
MOV BL,ARROW_X
MOV BH,ARROW_Y
CALL PRINT
CMP BL,0
JNZ ARROW_PRINT_0
CMP BH,2
JNZ ARROW_PRINT_RET
ARROW_PRINT_0:
DEC BL
MOV DL,DH
CALL PRINT
ARROW_PRINT_RET:
RET
;**************************************
;各種データ
;**************************************
VECTOR_X:
DB 0,0,1,0,-1
VECTOR_Y:
DB 0,-1,0,1,0
ARROW_FONT:
DB 0,0,0,0,0,0
DB 008H,01CH,02AH,008H,008H,000H ;矢印(上)
DB 008H,004H,03EH,004H,008H,000H ;矢印(右)
DB 008H,008H,02AH,01CH,008H,000H ;矢印(下)
DB 008H,010H,03EH,010H,008H,000H ;矢印(左)
DB 000H,000H,00CH,00CH,000H,000H
DB 000H,00CH,012H,012H,00CH,000H
DB 000H,01EH,012H,012H,01EH,000H
DB 01EH,021H,021H,021H,021H,01EH
DB 03FH,021H,021H,021H,021H,03FH
DB 000H,000H,000H,000H,000H,000H
DB 03CH,022H,03CH,020H,020H,000H
DB 03DH,03DH,000H,02FH,02FH,000H
TITLE_GRAPH:
DB 000H,000H,000H,000H,001H,003H,003H,007H,007H
DB 007H,007H,007H,003H,001H,000H,000H,000H,000H
DB 000H,01FH,070H,0E0H,0C0H,080H,080H,080H,000H
DB 000H,000H,000H,001H,083H,0FCH,000H,000H,000H
DB 000H,027H,0E3H,0E3H,041H,041H,001H,001H,000H
DB 000H,001H,001H,081H,003H,007H,000H,000H,000H
DB 000H,0E7H,0C3H,082H,0C4H,0C8H,0C8H,0D0H,0E0H
DB 0E0H,0C0H,0C0H,0C0H,0C0H,0F0H,000H,000H,000H
DB 000H,083H,00EH,01CH,038H,070H,070H,0F0H,0E0H
DB 0E0H,0E0H,0E0H,060H,030H,01FH,000H,000H,000H
DB 000H,0E4H,01CH,01CH,008H,008H,000H,000H,000H
DB 000H,001H,001H,031H,063H,087H,000H,000H,000H
DB 000H,0FEH,078H,070H,070H,070H,0E0H,0E0H,0E0H
DB 0E0H,0C0H,0C0H,0C1H,0C7H,0FFH,000H,000H,000H
DB 000H,007H,003H,003H,003H,003H,007H,007H,007H
DB 007H,00EH,08EH,08EH,01EH,07FH,000H,000H,000H
DB 000H,0FFH,0C3H,081H,080H,088H,018H,0F8H,010H
DB 010H,000H,002H,006H,01CH,0FCH,000H,000H,000H
DB 000H,087H,08EH,01CH,01CH,01EH,00FH,007H,003H
DB 001H,040H,040H,060H,0F1H,08FH,000H,000H,000H
DB 000H,0C8H,078H,038H,010H,010H,000H,080H,0C0H
DB 0E0H,0E0H,0E0H,0E0H,0C0H,080H,000H,000H,000H
DB 000H,000H,000H,000H,000H,000H,000H,000H,000H
DB 000H,001H,001H,001H,000H,000H,000H,000H,000H
DB 000H,01FH,033H,073H,073H,073H,03AH,01CH,06EH
DB 0CFH,0C7H,0C7H,0C7H,0CEH,078H,000H,000H,000H
DB 000H,003H,086H,08EH,09CH,01CH,01CH,01CH,01CH
DB 00FH,001H,001H,003H,00EH,018H,000H,000H,000H
DB 000H,0C0H,060H,070H,071H,073H,0F3H,0F3H,0E7H
DB 0E7H,0C7H,086H,006H,002H,001H,000H,000H,000H
DB 000H,038H,064H,0C6H,0C6H,08EH,08EH,08EH,01CH
DB 01CH,01CH,038H,030H,070H,0C1H,000H,000H,000H
DB 000H,03FH,01EH,01CH,01CH,01CH,038H,038H,03FH
DB 038H,070H,070H,070H,0F0H,0F8H,000H,000H,000H
DB 000H,0E0H,070H,038H,038H,038H,070H,0E0H,0C0H
DB 000H,000H,000H,000H,000H,000H,000H,000H,000H
DB 000H,000H,000H,000H,000H,000H,000H,000H,000H
DB 039H,010H,011H,012H,014H,018H,010H,010H,000H
DB 000H,000H,000H,000H,000H,000H,000H,000H,000H
DB 0C0H,080H,000H,036H,053H,0E2H,084H,0E4H,000H
DB 000H,000H,000H,000H,000H,000H,000H,000H,000H
DB 004H,01CH,008H,088H,008H,008H,010H,039H,000H
DB 000H,000H,000H,000H,000H,000H,000H,000H,000H
DB 002H,00EH,004H,004H,004H,004H,008H,01CH,000H
DB 000H,000H,000H,000H,000H,000H,000H,000H,000H
DB 031H,048H,009H,009H,011H,022H,04AH,0F3H,000H
DB 000H,000H,000H,000H,000H,000H,000H,000H,000H
DB 080H,080H,000H,0E0H,020H,020H,040H,080H,000H
MOJI_SCORE DB 'SCORE:',0
MOJI_PUSH_SPACE_KEY DB 'PUSH SPACE KEY',0
MOJI_GAMEOVER DB 'GAME OVER',0
;**************************************
;ワークエリア
;**************************************
ARROW_X DB 1 DUP(?)
ARROW_Y DB 1 DUP(?)
KEY_REPEAT DB 1 DUP(?)
KEY_REPEAT_2 DB 1 DUP(?)
KEY_REPEAT_3 DB 1 DUP(?)
ARROW_DERECTION DB 1 DUP(?)
ARROW_DERECTION2 DB 1 DUP(?)
NEXT_ARROW_DERECTION DB 1 DUP(?)
NEXT_ARROW_DERECTION2 DB 1 DUP(?)
BRAM DB 80 DUP(?)
VANISH_BLOCK DB 80 DUP(?)
VANISH_CHECK_WORK DB 80 DUP(?)
DOWN_WAIT DW 1 DUP(?)
DELTA_Y DB 1 DUP(?)
VANISH_THIS_TIME DB 1 DUP(?)
UNTIL_PRIMER DB 1 DUP(?)
VANISH_NUMBER DW 1 DUP(?)
SCORE1 DW 1 DUP(?)
SCORE2 DW 1 DUP(?)
SCORE_PLUS1 DW 1 DUP(?)
SCORE_PLUS2 DW 1 DUP(?)
RENSA_NUMBER DW 1 DUP(?)
CODE ENDS
END START
























コメント
コメント(0件)
コメントする
トラックバック
トラックバック(0件)
トラックバック先