POKER ACTION for FX-890P
2009年3月3日
今回は、G815の名作「POKER ACTION」を移植してみました。
トランプゲームとしては、おそらく7並べの次に有名だと、勝手に私が思っているポーカーと、テトリス、ぷよぷよをはじめ万人に受けるゲームのジャンル、落ち物を組み合わせると最強のゲームになるはずです。私も、今まで遊んできて、何でこんなゲームが今までなかったのかなと思ったほどでした。この面白さをG815ユーザーのみのものにするのはもったいないと思うので、どうぞ、遊んでみてください。
それから、原作と差別するために、若干のオリジナル要素を付け加えてありますので、G815でオリジナルを遊んだことのある方もぜひ遊んでみてください。
動作環境
FX-890Pとその互換機で動きます。Z-1GRでも動作します。
インストール
マシン語で組まれています。BASICかCALモードで
CLEAR 1024,&HD2A,6144
と打ち込んで、マシン語エリアを確保してください。「POKER.BAS」を読み込んで実行してください。
遊び方
画面の左から右にトランプが流れてきます。縦、横にトランプを5枚並べて「役」を作ってください。5枚並んだトランプは消えます。役に応じて得点が加算されます。ブタかワンペアの低い役を作ると、画面右からおじゃまブロックがせり上がってきます。これはストレート以上の役を作ると消すことができます。
ただし、フラッシュは永久パターンの元になるので、得点は加算されません。画面上には同じトランプはあらわれません。
トランプは、[8]、[8]で上下移動、[6]で高速右移動です。ゲーム中は[P]でポーズがかかり、[RET]で解除できます。[BRK]を押すとプログラムを終了できます。リプレイは[RET]です。
オリジナル要素
移植にあたって、JOKER(ゲームでの表示は(J))が追加されました。もちろん、JOKERは一番高い役になるように判定されます。さらに、ポーカーのルールには無い「ロイヤルストレート(トランプのマークに関係なく10,J,Q,K,Aが揃う)」という役を付け加えました。
アルゴリズム
一見面倒そうな、ポーカーの役の判定ですが、こんな方法でやってみました。
JOKERがないとき
(1)フラッシュかどうかを調べます。
これは、5枚のトランプのマークが一致するかを調べればいいのですから簡単ですね。このフラグを表す変数をAとしましょう。
(2)ストレートがあるか調べます。
これが一番面倒です。まず、1枚目のトランプを先頭にしてストレートが成り立つかを調べます。ストレートが成り立つかどうかは、プラス1した数字が残りのトランプにあるかを4回調べればよいのです。
ここで、Kの次はAにするのをお忘れなく。このフラグを表す変数をBとします。ここで、ストレートがAで終わっていたときには、さらにロイヤル系の役が付きます。このフラグを表す変数をCとしましょう。
(3)ペアがあるか調べます。
A~Kのそれぞれについて、5枚のカードの中に何枚あるかを調べます。それぞれ2枚、3枚、4枚、5枚同じカードがあったときに、その様子を記録する変数をそれぞれD,E,F,Gとします。それらの変数はペアが「いくつ」あったかを記録するようにします。
(4)役の判定をします。
例えば、A=B=C=1ならロイヤルストレートフラッシュ、A=B=C=0かつD=E=1ならフルハウスです。A=B=C=0かつD=2ならツーペアです。
こんな感じで、場合分けしましょう。高いほうの役から判定していって、その役にあてはまらなかったら次の役、といった形で判定して、それを数字化しておきます。この変数は、ただの数字の条件比較ですから簡単です。
JOKERがあるとき
JOKERが、52枚のカードのうちどのカードだったら一番高い役が付くかを調べます。その方法とは、そうです、52回(1)~(4)を繰り返すのです。でも、マシン語なら一瞬で終わります。
オリジナル版のディスアセンブルをした訳ではないので、もしかしたらもっと効率のいい方法で判定しているのかもしれませんが、私にはこんな方法しか思い付きませんでした。
プログラムリスト
90 'POKER ACTION インスト-ラ
100 CLS:CLEAR:L=1000:FOR I=&H2000 TO &H2C80 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 BEEF29B800A08EC0,99
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 AA8EC1BB0903BF53,05
1180 DATA 2CE84606E87D05E8,BF
1190 DATA 0307B81000E83107,78
1200 DATA 248074F0B410CD41,C7
1210 DATA B9500033C08EC0BF,71
1220 DATA 882CF3AAB135BFE2,5D
1230 DATA 2CF3AAA3DD2CA3DF,62
1240 DATA 2CC606E12C0FC706,25
1250 DATA DA2C2C01B21432FF,02
1260 DATA B3FEE85505FEC30A,6D
1270 DATA DB75F7FEC780FF02,8E
1280 DATA 74F980FF0575E9BB,F0
1290 DATA 1000E83D05FEC780,3A
1300 DATA FF0575F6BB1301BF,58
1310 DATA 622CE8DD0533C033,09
1320 DATA D2E83C04E88C04BB,2A
1330 DATA 1302BF692CE8CA05,F2
1340 DATA C606812C00C60682,E3
1350 DATA 2C02E87604C60683,BA
1360 DATA 2C00FF0EDA2C813E,22
1370 DATA DA2C96007706C706,0C
1380 DATA DA2C9600A1DA2CA3,81
1390 DATA D82CE8A806E8D404,02
1400 DATA E85A06E86806E8A2,E2
1410 DATA 05803EDC2C007403,4F
1420 DATA E89E068A3E822C02,E4
1430 DATA 3EDC2C883E822CE8,50
1440 DATA 8306832ED82C0173,AF
1450 DATA D4E88506A0E12C38,A5
1460 DATA 06812C74328A1E81,6C
1470 DATA 2C8A3E822CE84705,67
1480 DATA 807D01007521FE06,AE
1490 DATA 812C803E812C0172,75
1500 DATA 14B3FFB7028A1686,63
1510 DATA 2CE88E04FECB8A16,E4
1520 DATA 872CE88504EB8DE8,5C
1530 DATA 3B068A1E812C8A3E,A0
1540 DATA 822CE81205A0842C,AF
1550 DATA 88050ADB740A8A26,92
1560 DATA 852C8865FFE85300,B9
1570 DATA 33C9E2FEBB0002E8,58
1580 DATA F504803D007503E9,8C
1590 DATA 36FFE8B603B21532,22
1600 DATA FF32DBE8440447FE,E1
1610 DATA C380FB1075F5FEC7,25
1620 DATA 80FF0575ECB90020,53
1630 DATA E2FEFEC280FA1B75,A1
1640 DATA DEBB0501BF772CE8,60
1650 DATA D004E89005B88000,B9
1660 DATA E8BE0580E40274F2,AF
1670 DATA E989FE33C08EC08E,85
1680 DATA D8A0E12C2C083AD8,CD
1690 DATA 7F33E89A048BF74E,8C
1700 DATA BF172DB90A008A04,70
1710 DATA 8805C604004647E2,99
1720 DATA F5D0E38AC3D0E302,5A
1730 DATA D880C305D0E78AC7,AD
1740 DATA D0E702F88BCB81C1,8C
1750 DATA 3C06EB4790BE172D,72
1760 DATA B700E862048B55FF,98
1770 DATA 0BD2743689144646,22
1780 DATA FEC780FF0575EBB7,04
1790 DATA 00E84B04C745FF00,3B
1800 DATA 00FEC780FF0575F1,25
1810 DATA 8A3E822CD0E38AC3,7C
1820 DATA D0E302D880C30532,C1
1830 DATA FF8BCB81C10C1EEB,B1
1840 DATA 0290C35351B90500,C5
1850 DATA BE172D8A44013C13,31
1860 DATA 7506BB3400EB1190,FB
1870 DATA 2C0EB20DF6E232F6,BA
1880 DATA 8A14FECA03C28BD8,FC
1890 DATA C687E22C004646E2,C8
1900 DATA DABE172DB3FF803C,28
1910 DATA 1275028AD94646FE,E5
1920 DATA C180F90575F080FB,01
1930 DATA FF742ABE172DB600,D8
1940 DATA D0E332FFB001B40E,FA
1950 DATA 8900E8E1003AF277,77
1960 DATA 028AF2FEC480FC12,2C
1970 DATA 75EEFEC03C0E75E6,2E
1980 DATA 8AD6EB0490E8C600,B1
1990 DATA 32F68BC2C1E2042B,4C
2000 DATA D0BF9F2B03FA8B05,B7
2010 DATA 33D20106DF2C1116,7C
2020 DATA DD2CB91027F7F13D,AC
2030 DATA E803720DBA9800B8,6A
2040 DATA 7F968916DD2CA3DF,64
2050 DATA 2C8B16DD2CA1DF2C,13
2060 DATA B91027F7F1E8E801,AF
2070 DATA 83C703BB1402E879,96
2080 DATA 03595B57B008E8AB,72
2090 DATA 0451B90070E2FE59,07
2100 DATA FEC875F2BF692CBB,F2
2110 DATA 1302E85D03E87B01,27
2120 DATA 5F8A45FF3CFF7524,B7
2130 DATA FE0EE12C32FFB301,4E
2140 DATA E834038A058845FF,A5
2150 DATA FEC380FB1075F1C6,C5
2160 DATA 051BFEC780FF0575,96
2170 DATA E5EB2F903C00742A,30
2180 DATA 803EE12C0F7423FE,37
2190 DATA 06E12C32FFB30FE8,EA
2200 DATA 05038A65FF8825FE,5B
2210 DATA CB75F4C645FF00FE,EC
2220 DATA C780FF0575E7FEC8,BD
2230 DATA 75D6E84701C36033,C4
2240 DATA C08EC08ED8BF212D,55
2250 DATA B90900F3AAB104BE,1B
2260 DATA 172D468A0446463A,DD
2270 DATA 047507E2F8C60621,39
2280 DATA 2D01B105BE172DB3,69
2290 DATA 048A04FEC03C0E75,4E
2300 DATA 02B001B505BF172D,D5
2310 DATA 32E43A057502B401,05
2320 DATA 4747FECD75F480FC,64
2330 DATA 017515FECB75DCC6,0B
2340 DATA 06222D013C017505,62
2350 DATA C606232D01EB0590,19
2360 DATA 4646E2C3B001BE17,E4
2370 DATA 2DB400B905003A04,48
2380 DATA 7502FEC44646E2F6,63
2390 DATA 8ADC32FFFE87242D,58
2400 DATA FEC03C0E75E0A023,6B
2410 DATA 2D8A26222D8A1E21,32
2420 DATA 2D3C01751480FC01,CC
2430 DATA 750F80FB017505B2,75
2440 DATA 0BEB6E90B20AEB69,D6
2450 DATA 9080FC01750F80FB,83
2460 DATA 017505B209EB5A90,67
2470 DATA B204EB559080FB01,84
2480 DATA 7505B205EB4B9080,F2
2490 DATA 3E292D017505B208,A0
2500 DATA EB3F90803E282D01,82
2510 DATA 7505B207EB339080,6A
2520 DATA 3E272D017511803E,36
2530 DATA 262D017505B206EB,1E
2540 DATA 2090B203EB1B9080,8B
2550 DATA 3E262D027505B202,6E
2560 DATA EB0F90803E262D01,16
2570 DATA 7505B201EB0390B2,C2
2580 DATA 008816242D618A16,7F
2590 DATA 242DC332FFB301E8,03
2600 DATA C501803D00750E8A,AB
2610 DATA CB32ED8A45FF8805,51
2620 DATA 4FE2F8880DFEC380,A5
2630 DATA FB1075E3FEC780FF,1E
2640 DATA 0575DAC3BF882C32,38
2650 DATA FF32DB8A15E8FA00,CB
2660 DATA 47FEC380FB1075F3,9E
2670 DATA FEC780FF0575EAC3,5D
2680 DATA B319B70152B164F6,3A
2690 DATA F18AD0E83C008AC4,27
2700 DATA 32E4B10AF6F18AD0,EF
2710 DATA E82F008AD4E82A00,28
2720 DATA 5A8BC233D2B9E803,62
2730 DATA F7F192E81C00B164,B2
2740 DATA F6F18AD0E813008A,00
2750 DATA C432E4B10AF6F18A,75
2760 DATA D0E806008AD4E801,BC
2770 DATA 00C380C230E8EA00,D4
2780 DATA FEC3C3A0862CA284,81
2790 DATA 2CA0872CA2852CE8,6D
2800 DATA 720080FAFA7612BE,EE
2810 DATA E22C83C634803C01,8B
2820 DATA 7407B012B213EB43,4B
2830 DATA 90E8580080E20FFE,8D
2840 DATA C280FA0D77F38AC2,BF
2850 DATA E8490080E203BEE2,38
2860 DATA 2C50B00DF6E203F0,BF
2870 DATA 58B40003F04E803C,B0
2880 DATA 007415FEC03C0D76,52
2890 DATA E5B001FEC280FA03,F8
2900 DATA 76DCB200B001EBD6,D7
2910 DATA 80C20EC60401A287,06
2920 DATA 2C8816862CB3FEB7,4E
2930 DATA 02B200E81C00FEC3,9C
2940 DATA E81700C35053B8DB,84
2950 DATA 028BD8D1E003C305,D3
2960 DATA 7535A317268AD75B,D7
2970 DATA 58C360061E80C302,11
2980 DATA 33FF8EDFB800A08E,BF
2990 DATA C0B021AA8AC3240F,E3
3000 DATA 0406AAB022AA8AC7,72
3010 DATA D0E7C0E00202C7D0,65
3020 DATA E380E32002C3FEC0,9A
3030 DATA AA32F6D1E28BCAD1,EE
3040 DATA E203D181C247298B,4A
3050 DATA F2B90600B020AAAC,AC
3060 DATA 535BAA4FE2F91F07,94
3070 DATA 61C360061E33C08E,97
3080 DATA D8B43ACD418CC08E,5F
3090 DATA D88BF780EA2032F6,33
3100 DATA C1E20303F2B800A0,A4
3110 DATA 8EC033FFB021AA8A,CF
3120 DATA C3240F0406AAB022,42
3130 DATA AA8AC7C0E003F6C3,57
3140 DATA 1074020420AAB020,7A
3150 DATA AAB90700AC535BAA,4C
3160 DATA 4FE2F91F0761C350,B8
3170 DATA 53C0E70402DF32FF,32
3180 DATA 8BFBB8882C03F85B,57
3190 DATA 58C3608A15470AD2,0F
3200 DATA 7407E895FFFEC3EB,2A
3210 DATA F261C38A0E832CC6,E1
3220 DATA 06DC2C00B80001E8,21
3230 DATA D7002510007433FE,93
3240 DATA 06832C803E832C32,9C
3250 DATA 7228C606832C0080,C3
3260 DATA 3E822C00741C8A1E,68
3270 DATA 812C80FB0074138A,D2
3280 DATA 3E822CFECFE89FFF,8A
3290 DATA 803D007505C606DC,95
3300 DATA 2CFFB80001E89900,F6
3310 DATA 2540007433FE0683,AA
3320 DATA 2C803E832C327228,58
3330 DATA C606832C00803E82,CD
3340 DATA 2C04741C8A1E812C,4D
3350 DATA 80FB0074138A3E82,A3
3360 DATA 2CFEC7E861FF803D,64
3370 DATA 007505C606DC2C01,93
3380 DATA B80002E85B002540,28
3390 DATA 007416FE06832C80,86
3400 DATA 3E832C14720BC606,2E
3410 DATA 832C00C706D82C00,59
3420 DATA 003A0E832C7505C6,97
3430 DATA 06832C00C3B80100,B6
3440 DATA E82E0032C4A84174,37
3450 DATA 04B47FCD41C3B840,FC
3460 DATA 00E81D0024027418,D3
3470 DATA B84000E813002402,43
3480 DATA 75F6E8D8FFB88000,44
3490 DATA E8060080E40274F2,30
3500 DATA C3BA0002EFE80500,7D
3510 DATA BA0202EDC351B909,84
3520 DATA 00E2FE59C38A1684,E7
3530 DATA 2C8A36852CE80700,73
3540 DATA C333D2E80100C38A,E9
3550 DATA 1E812C8A3E822CE8,82
3560 DATA 28FE80FB00750580,71
3570 DATA FF027507FECB8AD6,AC
3580 DATA E817FEC35351FEC7,CB
3590 DATA FECDE8180086D9E8,03
3600 DATA 130086D9FECFFEC5,F3
3610 DATA E8180086FDE81300,16
3620 DATA 86FD595BC353E8AF,88
3630 DATA 003AFD7404FEC7EB,0C
3640 DATA F55BC36006B800A0,E2
3650 DATA 8EC033FF5351B63F,1A
3660 DATA 8AE3B006E8D200F6,9C
3670 DATA DC8AEC518AC8D2EE,88
3680 DATA 598AE1B006E8C100,A5
3690 DATA 8AC802EC22ED750F,B3
3700 DATA FEC5EB4A90B63F80,3E
3710 DATA ED017303EB4B9053,35
3720 DATA 51E84A0059B021AA,13
3730 DATA 8AC3AAB022AA8AC7,72
3740 DATA AAB020AA268A2553,A7
3750 DATA 5B535B268A2532F4,38
3760 DATA 4FB021AA8AC3AAB0,24
3770 DATA 22AA8AC7AAB020AA,D2
3780 DATA 8AC6AA5B80C30680,BC
3790 DATA FD0175B9B63FF6D9,CC
3800 DATA 80C105D2EED2E6EB,8D
3810 DATA AE595B0761C380FB,5C
3820 DATA 60720380C7208AE3,CE
3830 DATA B006E84C008AC880,58
3840 DATA E40F80C4068ADCC3,08
3850 DATA 6006B800A08EC033,E0
3860 DATA FFE8DAFFB021AA8A,85
3870 DATA C3AAB022AA8AC7AA,FE
3880 DATA B020AA268A25B020,E6
3890 DATA D2E8535B535B268A,22
3900 DATA 2532E04FB021AA8A,91
3910 DATA C3AAB022AA8AC7AA,FE
3920 DATA B020AA8AC4AA0761,1F
3930 DATA C3535133DB8ADCB9,77
3940 DATA 0800D1E38AE72AE0,49
3950 DATA 7204FEC38AFCE2F2,D8
3960 DATA 8AE38AC7595BC300,3E
3970 DATA 00000000001C2222,A6
3980 DATA 3E22003C021C203E,F4
3990 DATA 003C021C023C000C,C0
4000 DATA 14243E04003E203C,5A
4010 DATA 023C001C203C221C,C0
4020 DATA 003E22040808001C,2A
4030 DATA 221C221C001C221E,B6
4040 DATA 021C002E2A2A2A2E,56
4050 DATA 000E04042418001C,5C
4060 DATA 222A241A00262830,C6
4070 DATA 282600081C3E081C,AC
4080 DATA 00081C3E1C08001C,F8
4090 DATA 2A3E081C00363E3E,14
4100 DATA 1C08001120202413,64
4110 DATA 003422222204003D,00
4120 DATA 3D002F2F0000000C,E6
4130 DATA 0C0000000C12120C,92
4140 DATA 00001E12121E001E,A0
4150 DATA 212121211E3F2121,49
4160 DATA 21213F0000000000,20
4170 DATA 003E3E3E3E3E0000,D8
4180 DATA 0000000000010103,25
4190 DATA 0306060C0C180000,1D
4200 DATA 0000007E63C3C386,FE
4210 DATA 8CF1010303060303,DD
4220 DATA 00000000000F1961,11
4230 DATA 61C3C386860D0D1B,67
4240 DATA 33C6000000000018,7F
4250 DATA 98B1B36C6CF0F898,07
4260 DATA 98190D1B00000000,5D
4270 DATA 006FCC981830307F,82
4280 DATA 60C0C08080FD0000,8E
4290 DATA 000000F7060C0C18,56
4300 DATA 183F336663C6C386,DF
4310 DATA 0000000000E03030,10
4320 DATA 3060C00000000000,30
4330 DATA 0000000000000000,00
4340 DATA 000000010106060C,B7
4350 DATA 0F30306100000000,83
4360 DATA 003030F1F1E3E366,20
4370 DATA 66CCCCD8CC8F0000,18
4380 DATA 0000003C66868600,BC
4390 DATA 000000003061C103,95
4400 DATA 00000000007F0C18,0E
4410 DATA 1830306060C0C080,28
4420 DATA 800300000000008F,FE
4430 DATA 060C0C1818303061,92
4440 DATA 61C3C1C100000000,2E
4450 DATA 00070C30306161C3,E7
4460 DATA C386860D99E30000,E4
4470 DATA 0000008CCCDCDCBC,38
4480 DATA BC6D6DCFCF8E8E0C,BA
4490 DATA 0000000000303060,70
4500 DATA 60C0C08080000000,A0
4510 DATA 0000000000000000,00
4520 DATA 0000000000010202,24
4530 DATA 0F0404081E000000,D9
4540 DATA 00000000000000C0,00
4550 DATA 00009D2424293300,76
4560 DATA 0000000000000000,00
4570 DATA 00000000F0C08000,B0
4580 DATA 8000000000000000,80
4590 DATA 0000000F0405070A,EF
4600 DATA 0808380000000000,C0
4610 DATA 0000000000BF141C,E6
4620 DATA 19103848F8000000,D9
4630 DATA 0000000000000001,08
4640 DATA 0202FB0404040700,64
4650 DATA 0000000000000000,00
4660 DATA 00E72828C94F418A,C4
4670 DATA 1C00000000000000,1C
4680 DATA 0000000CB2A2A444,12
4690 DATA 4449730000000000,2F
4700 DATA 0000000000F84848,08
4710 DATA 7080800080000000,70
4720 DATA 00FF20202020CCDE,C2
4730 DATA C020202020000A00,C6
4740 DATA FF202020DCDDCDDF,2C
4750 DATA B1202020001E0000,85
4760 DATA 202020C2B0CDDFB1,A7
4770 DATA 2020200032000020,BA
4780 DATA 20BDD8B0B6B0C4DE,DC
4790 DATA 2020004600012020,5E
4800 DATA 20BDC4DAB0C42020,36
4810 DATA 2000000000202020,C0
4820 DATA CCD7AFBCAD202020,78
4830 DATA 00500001202020CC,44
4840 DATA D9CAB3BD20202000,BA
4850 DATA 8200022020CCABB0,9D
4860 DATA B6B0C4DE202000AA,8A
4870 DATA 000220CCA7B2CCDE,87
4880 DATA B6B0C4DE2000FA00,50
4890 DATA 03BDC4DAB0C420CC,79
4900 DATA D7AFBCAD00900104,A4
4910 DATA 20DBB2D4D9BDC4DA,13
4920 DATA B0C4200058020552,0F
4930 DATA BDC4DAB0C4CCD7AF,88
4940 DATA BCAD005055534820,E9
4950 DATA 5350414345204B45,10
4960 DATA 590053434F52453A,88
4970 DATA 005B202020202020,D6
4980 DATA 20202020205D0047,46
4990 DATA 414D45204F564552,2C
5000 DATA 00##############,00
ソースリスト
;******************************************************************************
;POKER ACTION for FX-890P Ver4.17
;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 RND
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 CL,53
MOV DI,OFFSET TRUMP_APPEAR
REP STOSB
MOV SCORE1,AX
MOV SCORE2,AX
MOV BYTE PTR DOWN_LIMIT,15
MOV WORD PTR DOWN_WAIT_COUNT,300
MOV DL,20 ;壁表示
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,0113H
MOV DI,OFFSET MOJI_SCORE
CALL MOJI_PRINT
XOR AX,AX
XOR DX,DX
CALL SCORE_PRINT
CALL NEXT
MOV BX,0213H
MOV DI,OFFSET MOJI_YAKU
CALL MOJI_PRINT
;**************************************
;メインルーチン
;**************************************
SET:
MOV BYTE PTR TRUMP_X,0
MOV BYTE PTR TRUMP_Y,2
CALL NEXT
MOV BYTE PTR KEY_REPEAT,0
DEC WORD PTR DOWN_WAIT_COUNT
CMP WORD PTR DOWN_WAIT_COUNT,150
JA CALC_WAIT
MOV WORD PTR DOWN_WAIT_COUNT,150
CALC_WAIT:
DOWN_CONT:
MOV AX,DOWN_WAIT_COUNT
MOV DOWN_WAIT,AX
CALL TRUMP_PRINT
DOWN_LOOP:
CALL RND
CALL POWEROFF_CHECK
CALL PAUSE_CHECK
CALL CHK ;Y方向の変化量を返す
CMP BYTE PTR DELTA_Y,0
JZ RE_CHR_PUT
CALL TRUMP_DISPRINT
RE_CHR_PUT:
MOV BH,TRUMP_Y
ADD BH,BYTE PTR DELTA_Y
MOV BYTE PTR TRUMP_Y,BH
CALL TRUMP_PRINT
DOWN_LOOP_END:
SUB WORD PTR DOWN_WAIT,1
JNC DOWN_LOOP
CALL TRUMP_DISPRINT
MOV AL,DOWN_LIMIT
CMP TRUMP_X,AL
JZ BOTTOM
MOV BL,TRUMP_X
MOV BH,TRUMP_Y
CALL XY
CMP BYTE PTR [DI+1],0
JNZ BOTTOM
INC BYTE PTR TRUMP_X
CMP BYTE PTR TRUMP_X,1
JC TO_DOWN_CONT
MOV BL,-1
MOV BH,2
MOV DL,NEXT_TRUMP_MARK
CALL PRINT
DEC BL
MOV DL,NEXT_TRUMP_NUM
CALL PRINT
TO_DOWN_CONT:
JMP DOWN_CONT
BOTTOM: ;これ以上落ちられないとき
CALL TRUMP_PRINT
MOV BL,TRUMP_X
MOV BH,TRUMP_Y
CALL XY
MOV AL,TRUMP_MARK
MOV [DI],AL
OR BL,BL
JZ OVER_CHECK ;BOTTOM_2
MOV AH,TRUMP_NUM
MOV [DI-1],AH
BOTTOM_2:
CALL VANISH ;消去判定
OVER_CHECK:
XOR CX,CX
LOOP $
MOV BX,0200H
CALL XY
CMP BYTE PTR [DI],0
JNZ END
JMP SET
;**************************************
;ゲームオーバー
;**************************************
END:
CALL NEXT ;NEXT消去用
MOV DL,21
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,2000H
LOOP $
INC DL
CMP DL,27
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:
XOR AX,AX
MOV ES,AX
MOV DS,AX
MOV AL,DOWN_LIMIT
SUB AL,8
CMP BL,AL
JG VANISH_TATE
;VANISH_YOKO: ;横に5枚そろったとき
CALL XY
MOV SI,DI
DEC SI
MOV DI,OFFSET VANISH_TRUMP
MOV CX,10
VANISH_YOKO_LOOP:
MOV AL,[SI]
MOV [DI],AL
MOV BYTE PTR [SI],0
INC SI
INC DI
LOOP VANISH_YOKO_LOOP
SAL BL,1 ;四角形の座標計算
MOV AL,BL
SAL BL,1
ADD BL,AL
ADD BL,5
SAL BH,1
MOV AL,BH
SAL BH,1
ADD BH,AL
MOV CX,BX
ADD CX,063CH
JMP VANISH_POSSIBLE
VANISH_TATE:
MOV SI,OFFSET VANISH_TRUMP
MOV BH,0
VANISH_TATE_1:
CALL XY
MOV DX,[DI-1]
OR DX,DX
JZ VANISH_IMP
MOV WORD PTR [SI],DX
INC SI
INC SI
INC BH
CMP BH,5
JNZ VANISH_TATE_1
MOV BH,0 ;BRAMのトランプを消す
VANISH_TATE_2:
CALL XY
MOV WORD PTR [DI-1],0
INC BH
CMP BH,5
JNZ VANISH_TATE_2
MOV BH,TRUMP_Y ;四角形の座標計算
SAL BL,1
MOV AL,BL
SAL BL,1
ADD BL,AL
ADD BL,5
XOR BH,BH
MOV CX,BX
ADD CX,1E0CH
JMP VANISH_POSSIBLE
VANISH_IMP:
RET
VANISH_POSSIBLE:
PUSH BX
PUSH CX
MOV CX,5
MOV SI,OFFSET VANISH_TRUMP ;消えたトランプの出現フラグを消す
VANISH_VANISH_LOOP:
MOV AL,[SI+1]
CMP AL,19
JNZ NOT_VANISH_JOKER
MOV BX,52
JMP VANISH_JOKER
NOT_VANISH_JOKER:
SUB AL,14
MOV DL,13
MUL DL
XOR DH,DH
MOV DL,[SI]
DEC DL
ADD AX,DX
MOV BX,AX
VANISH_JOKER:
MOV BYTE PTR [TRUMP_APPEAR+BX],0
INC SI
INC SI
LOOP VANISH_VANISH_LOOP
MOV SI,OFFSET VANISH_TRUMP ;JOKERがあるかないかで場合分け
MOV BL,-1
JOKER_EXSIT:
CMP BYTE PTR [SI],18
JNZ NOT_JOKER_EXSIT
MOV BL,CL
NOT_JOKER_EXSIT:
INC SI
INC SI
INC CL
CMP CL,5
JNZ JOKER_EXSIT
CMP BL,-1
JZ NO_JOKER
MOV SI,OFFSET VANISH_TRUMP ;JOKERがある時
MOV DH,0
SAL BL,1
XOR BH,BH
MOV AL,1
BEST_JOKER_1:
MOV AH,14
BEST_JOKER_2:
MOV [SI+BX],AX
CALL YAKU_CHECK
CMP DH,DL
JA BEST_JOKER_3
MOV DH,DL
BEST_JOKER_3:
INC AH
CMP AH,18
JNZ BEST_JOKER_2
INC AL
CMP AL,14
JNZ BEST_JOKER_1
MOV DL,DH ;一番良い結果
JMP CHECKED
NO_JOKER:
CALL YAKU_CHECK
CHECKED:
XOR DH,DH
MOV AX,DX
SAL DX,4
SUB DX,AX
MOV DI,OFFSET YAKU
ADD DI,DX
MOV AX,[DI]
XOR DX,DX
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 DX,SCORE1
MOV AX,SCORE2
MOV CX,10000
DIV CX
CALL SCORE_PRINT
ADD DI,3 ;スコア部分をとばす
MOV BX,0214H
CALL MOJI_PRINT
POP CX
POP BX
PUSH DI
MOV AL,8
BOX_BOX:
CALL BOX
PUSH CX
MOV CX,7000H
LOOP $
POP CX
DEC AL
JNZ BOX_BOX
MOV DI,OFFSET MOJI_YAKU
MOV BX,0213H
CALL MOJI_PRINT
CALL GRAVITY
POP DI
MOV AL,[DI-1]
CMP AL,-1
JNZ NOT_OJAMA_UP
DEC BYTE PTR DOWN_LIMIT
OJAMA_UP:
XOR BH,BH
OJAMA_UP_Y_LOOP:
MOV BL,1
OJAMA_UP_X_LOOP:
CALL XY
MOV AL,[DI]
MOV [DI-1],AL
INC BL
CMP BL,16
JNZ OJAMA_UP_X_LOOP
MOV BYTE PTR [DI],27
INC BH
CMP BH,5
JNZ OJAMA_UP_Y_LOOP
JMP OJAMA_END
NOT_OJAMA_UP:
CMP AL,0
JZ OJAMA_END
OJAMA_DOWN:
CMP BYTE PTR DOWN_LIMIT,15
JZ OJAMA_END
INC BYTE PTR DOWN_LIMIT
XOR BH,BH
OJAMA_DOWN_Y_LOOP:
MOV BL,15
OJAMA_DOWN_X_LOOP:
CALL XY
MOV AH,[DI-1]
MOV [DI],AH
DEC BL
JNZ OJAMA_DOWN_X_LOOP
MOV BYTE PTR [DI-1],0
INC BH
CMP BH,5
JNZ OJAMA_DOWN_Y_LOOP
DEC AL
JNZ OJAMA_DOWN
OJAMA_END:
CALL BRAM_PUT
RET
;**************************************
;役を判定します
;**************************************
YAKU_CHECK: ;return DL=役の種類
PUSHA
XOR AX,AX
MOV ES,AX
MOV DS,AX
MOV DI,OFFSET YAKU_WORK
MOV CX,9
REP STOSB
MOV CL,4 ;フラッシュがあるか?
MOV SI,OFFSET VANISH_TRUMP
INC SI
MOV AL,[SI]
FRASH_CHECK_LOOP:
INC SI
INC SI
CMP AL,[SI]
JNZ NO_FRASH
LOOP FRASH_CHECK_LOOP
MOV BYTE PTR FRASH_FLAG,1
NO_FRASH:
MOV CL,5 ;ストレートがあるか
MOV SI,OFFSET VANISH_TRUMP
STRAIGHT_CHECK_1:
MOV BL,4
MOV AL,[SI] ;ストレートの先頭数
STRAIGHT_CHECK_2:
INC AL ;ストレートにつながるやつ
CMP AL,14
JNZ NOT_K
MOV AL,1
NOT_K:
MOV CH,5
MOV DI,OFFSET VANISH_TRUMP
XOR AH,AH
STRAIGHT_CHECK_3:
CMP AL,[DI]
JNZ STRAIGHT_CHECK_4
MOV AH,1
STRAIGHT_CHECK_4:
INC DI
INC DI
DEC CH
JNZ STRAIGHT_CHECK_3
CMP AH,1
JNZ START_CHANGE
DEC BL
JNZ STRAIGHT_CHECK_2
MOV BYTE PTR STRAIGHT_FLAG,1
CMP AL,1
JNZ TO_PAIR_CHECK
MOV BYTE PTR ROYAL_FLAG,1
TO_PAIR_CHECK:
JMP PAIR_CHECK
START_CHANGE:
INC SI
INC SI
LOOP STRAIGHT_CHECK_1
PAIR_CHECK: ;ペアがあるか
MOV AL,1
PAIR_CHECK_1:
MOV SI,OFFSET VANISH_TRUMP
MOV AH,0
MOV CX,5
PAIR_CHECK_2:
CMP AL,[SI]
JNZ NOT_SAME
INC AH
NOT_SAME:
INC SI
INC SI
LOOP PAIR_CHECK_2
MOV BL,AH
XOR BH,BH
INC BYTE PTR [OFFSET NOCARD_FLAG+BX]
INC AL
CMP AL,14
JNZ PAIR_CHECK_1
MOV AL,ROYAL_FLAG
MOV AH,STRAIGHT_FLAG
MOV BL,FRASH_FLAG
CMP AL,1
JNZ NOT_ROYALS
CMP AH,1
JNZ NOT_ROYALS
CMP BL,1
JNZ ROYAL_STRAIGHT_NOT_FRASH
MOV DL,11 ;ロイヤルストレートフラッシュ
JMP YAKU_END
ROYAL_STRAIGHT_NOT_FRASH:
MOV DL,10 ;ロイヤルストレート
JMP YAKU_END
NOT_ROYALS:
CMP AH,1
JNZ NOT_STRAIGHTS
CMP BL,1
JNZ STRAIGHT_NOT_FRASH
MOV DL,9 ;ストレートフラッシュ
JMP YAKU_END
STRAIGHT_NOT_FRASH:
MOV DL,4 ;ストレート
JMP YAKU_END
NOT_STRAIGHTS:
CMP BL,1
JNZ NOT_STRAIGHTS_NOT_FRASH
MOV DL,5 ;フラッシュ
JMP YAKU_END
NOT_STRAIGHTS_NOT_FRASH:
CMP BYTE PTR FIVECARD_FLAG,1
JNZ NOT_FIVECARD
MOV DL,8 ;ファイブカード
JMP YAKU_END
NOT_FIVECARD:
CMP BYTE PTR FOURCARD_FLAG,1
JNZ NOT_FOURCARD
MOV DL,7 ;フォーカード
JMP YAKU_END
NOT_FOURCARD:
CMP BYTE PTR THREECARD_FLAG,1
JNZ NOT_THREECARD
CMP BYTE PTR TWOCARD_FLAG,1
JNZ NOT_FULLHOUSE
MOV DL,6 ;フルハウス
JMP YAKU_END
NOT_FULLHOUSE:
MOV DL,3 ;スリーカード
JMP YAKU_END
NOT_THREECARD:
CMP BYTE PTR TWOCARD_FLAG,2
JNZ NOT_TWOPAIR
MOV DL,2 ;ツーペア
JMP YAKU_END
NOT_TWOPAIR:
CMP BYTE PTR TWOCARD_FLAG,1
JNZ NOT_ONEPAIR
MOV DL,1
JMP YAKU_END
NOT_ONEPAIR:
MOV DL,0
YAKU_END:
MOV NOCARD_FLAG,DL ;NOCARDFLAGが空いてたから
POPA
MOV DL,NOCARD_FLAG
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
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,1
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_TRUMP_MARK
MOV TRUMP_MARK,AL
MOV AL,NEXT_TRUMP_NUM
MOV TRUMP_NUM,AL
CALL RND
CMP DL,250
JNA NEXT_1
MOV SI,OFFSET TRUMP_APPEAR
ADD SI,52
CMP BYTE PTR [SI],1
JZ NEXT_1
MOV AL,18
MOV DL,19
JMP NEXT_3
NEXT_1:
CALL RND ;数字の方を制作
AND DL,15
INC DL
CMP DL,13
JA NEXT_1
MOV AL,DL
CALL RND ;マークの方を制作
AND DL,3
D_CHECK:
MOV SI,OFFSET TRUMP_APPEAR
PUSH AX
MOV AL,13
MUL DL
ADD SI,AX
POP AX
MOV AH,0
ADD SI,AX
DEC SI
CMP BYTE PTR [SI],0
JZ NEXT_2
INC AL ;ダブっていたら一枚づつ次のものを探す
CMP AL,13
JNA D_CHECK
MOV AL,1
INC DL
CMP DL,3
JNA D_CHECK
MOV DL,0
MOV AL,1
JMP D_CHECK
NEXT_2:
ADD DL,14
NEXT_3:
MOV BYTE PTR [SI],1
MOV BYTE PTR NEXT_TRUMP_NUM,AL
MOV BYTE PTR NEXT_TRUMP_MARK,DL
MOV BL,-2
MOV BH,2
MOV DL,0
CALL PRINT
INC BL
CALL PRINT
RET
;**************************************
;乱数発生
;**************************************
RND:
PUSH AX
PUSH BX
RNDDT:
MOV AX,02DBH
MOV BX,AX
SAL AX,1
ADD AX,BX
ADD AX,3575H
MOV WORD PTR [RNDDT+1],AX
MOV DL,BH
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 TRUMP_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
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 TRUMP_Y,0
JE CHK_A
MOV BL,TRUMP_X
CMP BL,0
JE CHK_A
MOV BH,TRUMP_Y
DEC BH
CALL XY
CMP BYTE PTR [DI],0
JNE CHK_A
MOV BYTE PTR DELTA_Y,-1
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 TRUMP_Y,4
JE CHK_B
MOV BL,TRUMP_X
CMP BL,0
JE CHK_B
MOV BH,TRUMP_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:
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
CALL KEY
AND AL,02H
JZ PAUSE_CHECK_END
WHILE_P_PUSHED:
MOV AX,0040H
CALL KEY
AND AL,02H
JNZ WHILE_P_PUSHED
UNTIL_CR_PUSH:
CALL POWEROFF_CHECK
MOV AX,0080H
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
;**************************************
;トランプ表示サブ
;**************************************
TRUMP_PRINT:
MOV DL,TRUMP_MARK
MOV DH,TRUMP_NUM
CALL TRUMP_PRINT_MAIN
RET
TRUMP_DISPRINT:
XOR DX,DX
CALL TRUMP_PRINT_MAIN
RET
TRUMP_PRINT_MAIN:
MOV BL,TRUMP_X
MOV BH,TRUMP_Y
CALL PRINT
CMP BL,0
JNZ TRUMP_PRINT_0
CMP BH,2
JNZ TRUMP_PRINT_RET
TRUMP_PRINT_0:
DEC BL
MOV DL,DH
CALL PRINT
TRUMP_PRINT_RET:
RET
;**************************************
;BOXサブ
;**************************************
BOX:
PUSH BX
PUSH CX
INC BH
DEC CH
CALL TATE
XCHG BL,CL
CALL TATE
XCHG BL,CL
DEC BH
INC CH
CALL YOKO
XCHG BH,CH
CALL YOKO
XCHG BH,CH
POP CX
POP BX
RET
TATE:
PUSH BX
TATE_1:
CALL DOT
CMP BH,CH
JE TATE_E
INC BH
JMP TATE_1
TATE_E:
POP BX
RET
YOKO:
PUSHA
PUSH ES
MOV AX,0A000H
MOV ES,AX
XOR DI,DI
BOX_LP:
PUSH BX
PUSH CX
LINE_FS:
MOV DH,03FH
MOV AH,BL
MOV AL,6
CALL WARI
NEG AH
MOV CH,AH
PUSH CX
MOV CL,AL
SHR DH,CL
POP CX
MOV AH,CL
MOV AL,6
CALL WARI
MOV CL,AL
ADD CH,AH
AND CH,CH
JNZ LINE_RD
INC CH
JMP LINE_RT2
LINE_MD:
MOV DH,03FH
LINE_LP:
SUB CH,1
JNC LINE_RD
JMP LINE_END
LINE_RD:
PUSH BX
PUSH CX
CALL LCDC_Z
POP CX
MOV AL,21H
STOSB
MOV AL,BL
STOSB
MOV AL,22H
STOSB
MOV AL,BH
STOSB
MOV AL,20H
STOSB
MOV AH,ES:[DI]
PUSH BX
POP BX
PUSH BX
POP BX
LINE_S:
MOV AH,ES:[DI]
XOR DH,AH
LINE_WT:
DEC DI
MOV AL,21H
STOSB
MOV AL,BL
STOSB
MOV AL,22H
STOSB
MOV AL,BH
STOSB
MOV AL,20H
STOSB
MOV AL,DH
STOSB
POP BX
ADD BL,6
CMP CH,1
JNE LINE_MD
LINE_RT:
MOV DH,03FH
LINE_RT2:
NEG CL
ADD CL,5
SHR DH,CL
SHL DH,CL
JMP LINE_LP
LINE_END:
POP CX
POP BX
LINE_RET:
POP ES
POPA
RET
LCDC_Z:
CMP BL,96
JC LCDC_Z_1
ADD BH,32
LCDC_Z_1:
MOV AH,BL
MOV AL,6
CALL WARI
MOV CL,AL
AND AH,0FH
ADD AH,6
MOV BL,AH
RET
DOT:
PUSHA
PUSH ES
MOV AX,0A000H
MOV ES,AX
XOR DI,DI
CALL LCDC_Z
MOV AL,21H
STOSB
MOV AL,BL
STOSB
MOV AL,22H
STOSB
MOV AL,BH
STOSB
MOV AL,20H
STOSB
MOV AH,ES:[DI]
MOV AL,20H
SHR AL,CL
PUSH BX
POP BX
PUSH BX
POP BX
MOV AH,ES:[DI]
XOR AH,AL
DEC DI
MOV AL,21H
STOSB
MOV AL,BL
STOSB
MOV AL,22H
STOSB
MOV AL,BH
STOSB
MOV AL,20H
STOSB
MOV AL,AH
STOSB
POP ES
POPA
RET
WARI:
PUSH BX
PUSH CX
XOR BX,BX
MOV BL,AH
MOV CX,8
WARI_L:
SAL BX,1
MOV AH,BH
SUB AH,AL
JC WARI_S
INC BL
MOV BH,AH
WARI_S:
LOOP WARI_L
MOV AH,BL
MOV AL,BH
POP CX
POP BX
RET
;**************************************
;各種データ
;**************************************
TRUMP_FONT:
DB 000H,000H,000H,000H,000H,000H
DB 01CH,022H,022H,03EH,022H,000H
DB 03CH,002H,01CH,020H,03EH,000H
DB 03CH,002H,01CH,002H,03CH,000H
DB 00CH,014H,024H,03EH,004H,000H
DB 03EH,020H,03CH,002H,03CH,000H
DB 01CH,020H,03CH,022H,01CH,000H
DB 03EH,022H,004H,008H,008H,000H
DB 01CH,022H,01CH,022H,01CH,000H
DB 01CH,022H,01EH,002H,01CH,000H
DB 02EH,02AH,02AH,02AH,02EH,000H
DB 00EH,004H,004H,024H,018H,000H
DB 01CH,022H,02AH,024H,01AH,000H
DB 026H,028H,030H,028H,026H,000H
DB 008H,01CH,03EH,008H,01CH,000H
DB 008H,01CH,03EH,01CH,008H,000H
DB 01CH,02AH,03EH,008H,01CH,000H
DB 036H,03EH,03EH,01CH,008H,000H
DB 011H,020H,020H,024H,013H,000H
DB 034H,022H,022H,022H,004H,000H
DB 03DH,03DH,000H,02FH,02FH,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 03EH,03EH,03EH,03EH,03EH,000H
TITLE_GRAPH:
DB 000H,000H,000H,000H,000H,000H,001H,001H,003H
DB 003H,006H,006H,00CH,00CH,018H,000H,000H,000H
DB 000H,000H,07EH,063H,0C3H,0C3H,086H,08CH,0F1H
DB 001H,003H,003H,006H,003H,003H,000H,000H,000H
DB 000H,000H,00FH,019H,061H,061H,0C3H,0C3H,086H
DB 086H,00DH,00DH,01BH,033H,0C6H,000H,000H,000H
DB 000H,000H,018H,098H,0B1H,0B3H,06CH,06CH,0F0H
DB 0F8H,098H,098H,019H,00DH,01BH,000H,000H,000H
DB 000H,000H,06FH,0CCH,098H,018H,030H,030H,07FH
DB 060H,0C0H,0C0H,080H,080H,0FDH,000H,000H,000H
DB 000H,000H,0F7H,006H,00CH,00CH,018H,018H,03FH
DB 033H,066H,063H,0C6H,0C3H,086H,000H,000H,000H
DB 000H,000H,0E0H,030H,030H,030H,060H,0C0H,000H
DB 000H,000H,000H,000H,000H,000H,000H,000H,000H
DB 000H,000H,000H,000H,000H,000H,001H,001H,006H
DB 006H,00CH,00FH,030H,030H,061H,000H,000H,000H
DB 000H,000H,030H,030H,0F1H,0F1H,0E3H,0E3H,066H
DB 066H,0CCH,0CCH,0D8H,0CCH,08FH,000H,000H,000H
DB 000H,000H,03CH,066H,086H,086H,000H,000H,000H
DB 000H,000H,030H,061H,0C1H,003H,000H,000H,000H
DB 000H,000H,07FH,00CH,018H,018H,030H,030H,060H
DB 060H,0C0H,0C0H,080H,080H,003H,000H,000H,000H
DB 000H,000H,08FH,006H,00CH,00CH,018H,018H,030H
DB 030H,061H,061H,0C3H,0C1H,0C1H,000H,000H,000H
DB 000H,000H,007H,00CH,030H,030H,061H,061H,0C3H
DB 0C3H,086H,086H,00DH,099H,0E3H,000H,000H,000H
DB 000H,000H,08CH,0CCH,0DCH,0DCH,0BCH,0BCH,06DH
DB 06DH,0CFH,0CFH,08EH,08EH,00CH,000H,000H,000H
DB 000H,000H,030H,030H,060H,060H,0C0H,0C0H,080H
DB 080H,000H,000H,000H,000H,000H,000H,000H,000H
DB 000H,000H,000H,000H,000H,000H,000H,000H,001H
DB 002H,002H,00FH,004H,004H,008H,01EH,000H,000H
DB 000H,000H,000H,000H,000H,000H,000H,000H,0C0H
DB 000H,000H,09DH,024H,024H,029H,033H,000H,000H
DB 000H,000H,000H,000H,000H,000H,000H,000H,000H
DB 000H,000H,0F0H,0C0H,080H,000H,080H,000H,000H
DB 000H,000H,000H,000H,000H,000H,000H,000H,00FH
DB 004H,005H,007H,00AH,008H,008H,038H,000H,000H
DB 000H,000H,000H,000H,000H,000H,000H,000H,0BFH
DB 014H,01CH,019H,010H,038H,048H,0F8H,000H,000H
DB 000H,000H,000H,000H,000H,000H,000H,000H,001H
DB 002H,002H,0FBH,004H,004H,004H,007H,000H,000H
DB 000H,000H,000H,000H,000H,000H,000H,000H,0E7H
DB 028H,028H,0C9H,04FH,041H,08AH,01CH,000H,000H
DB 000H,000H,000H,000H,000H,000H,000H,000H,00CH
DB 0B2H,0A2H,0A4H,044H,044H,049H,073H,000H,000H
DB 000H,000H,000H,000H,000H,000H,000H,000H,0F8H
DB 048H,048H,070H,080H,080H,000H,080H,000H,000H
YAKU:
DW 0
DB -1,' ブタ ',0
DW 10
DB -1,' ワンペア ',0
DW 30
DB 0,' ツーペア ',0
DW 50
DB 0,' スリーカード ',0
DW 70
DB 1,' ストレート ',0
DW 0
DB 0,' フラッシュ ',0
DW 80
DB 1,' フルハウス ',0
DW 130
DB 2,' フォーカード ',0
DW 170
DB 2,' ファイブカード ',0
DW 250
DB 3,'ストレート フラッシュ',0
DW 400
DB 4,' ロイヤルストレート ',0
DW 600
DB 5,'Rストレートフラッシュ',0
MOJI_PUSH_SPACE_KEY DB 'PUSH SPACE KEY',0
MOJI_SCORE DB 'SCORE:',0
MOJI_YAKU DB '[ ]',0
MOJI_GAMEOVER DB 'GAME OVER',0
;**************************************
;ワークエリア
;**************************************
TRUMP_X DB 1 DUP(?)
TRUMP_Y DB 1 DUP(?)
KEY_REPEAT DB 1 DUP(?)
TRUMP_MARK DB 1 DUP(?)
TRUMP_NUM DB 1 DUP(?)
NEXT_TRUMP_MARK DB 1 DUP(?)
NEXT_TRUMP_NUM DB 1 DUP(?)
BRAM DB 80 DUP(?)
DOWN_WAIT DW 1 DUP(?)
DOWN_WAIT_COUNT DW 1 DUP(?)
DELTA_Y DB 1 DUP(?)
SCORE1 DW 1 DUP(?)
SCORE2 DW 1 DUP(?)
DOWN_LIMIT DB 1 DUP(?)
TRUMP_APPEAR DB 53 DUP(?)
VANISH_TRUMP DB 10 DUP(?)
YAKU_WORK:
FRASH_FLAG DB 1 DUP(?)
STRAIGHT_FLAG DB 1 DUP(?)
ROYAL_FLAG DB 1 DUP(?)
NOCARD_FLAG DB 1 DUP(?)
ONECARD_FLAG DB 1 DUP(?)
TWOCARD_FLAG DB 1 DUP(?)
THREECARD_FLAG DB 1 DUP(?)
FOURCARD_FLAG DB 1 DUP(?)
FIVECARD_FLAG DB 1 DUP(?)
CODE ENDS
END START
























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