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件)

トラックバック先

当サイトについて

栃木県宇都宮市在住のWeb屋さんのブログ。サイト設計からコーディング、プログラミングまで幅広く担当します。Web標準,WordPress,jQueryあたりに興味があります。≫PROFILE

Get Adobe Flash playerPlugin by wpburn.com wordpress themes