3D-MAZE
2009年3月3日
無性に3Dの迷路ゲームがやりたくなったので、手元にあったポケコンで開発しました。これで、いつでもどこでも迷路に潜り込めます。
動作条件
FX-890Pとその互換機で動作します。動作確認は市販のFX-890Pでしてあります。
入力方法
プログラムはマシン語(2000H~26EEH)で組まれています。BASICかCALモードで、
CLEAR 1024,&HABA,6144
と入力して、マシン語エリアを確保します。
次にプログラムリストを入力します。これはBASICプログラムですから、普通に入力してください。実行すると、マシン語プログラムが書き込まれますが、入力ミスがあると途中でストップしてしまいます。その時は誤りを修正して、再実行してください。
書き込みが終わったら、FDにバイナリでセーブしておくと、次からの読み込みに便利です。
遊びかた
RPGなどでたまに見る3Dワイヤーフレームのゲームです。
DEFSEG=0
CALL &H2000
で起動すると、タイトルが表示されます。
タイトルではゲームのレベルを設定できます。レベルが大きいほど、迷路が広くなります。[4]、[6]で設定して[RET]で決定します。
ゲームの最初にはマップが表示されます。これは迷路を上から見た図(上が北)です。いったん歩き出すと、マップは途中で参照できません。しっかり暗記して下さい。また、ゴールもここには表示されませんが、目安として、右下の方にあります。 当然迷路は毎回ランダムに制作されますので、飽きるまで遊べます。
スタート地点はマップの左上です。移動はテンキーで行います。[8]で前進し、[6]で右に90度回転、[4]で左に90度回転、[2]でそのままの向きで、後退します。
ゴール地点には、床に線が引いてあります。ゴールを目指してひたすらさまよって下さい。画面には、今、自分が向いている方向が表示されます(東=E、西=W、南=S、北=N)。スタートしたときは東を向いています。
プログラムについて
ちょっとした暇つぶしに最適なゲームだと思います。そんな意味ではポケコンゲームの王道をいっていると思います。このゲームに、他にもいろいろな要素を付け加えたりもしたのですが、純粋に迷路を楽しみたい私としては、今の形に落ち着きました。
迷路を作るアルゴリズムですが、いわゆる穴掘りタイプではなくて、ある部分はあらかじめ壁を埋めておいて、閉じ込めをしないように注意してさらに壁を置いていきます。
3D表示部分ですが、BASICで組むととんでもなく遅いので、マシン語でオリジナルグラフィックサブルーチンを使って高速化しました。アルゴリズムとしては、「画面の両端から、壁があれば横向きの等脚台形、なければ長方形を書き、正面に壁があれば、正面に長方形を書く。」という単純作業を繰り返すだけです。
参考文献
工学社:「FX-890P/Z-1活用研究」
プログラムリスト
100 CLS:CLEAR:L=1000:FOR I=&H2000 TO &H26EE 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 FC33C08ED88EC0A2,B6
1010 DATA B12AB410CD41B40F,4C
1020 DATA BB0C00CD41B420BF,5C
1030 DATA AE26CD41B40FBB09,A8
1040 DATA 02CD41B420BFB626,73
1050 DATA CD41B40FBB1502CD,42
1060 DATA 41B4018A16B12A80,8E
1070 DATA C230CD41B404CD41,CC
1080 DATA 80FA34750B803EB1,55
1090 DATA 2A007404FE0EB12A,07
1100 DATA 80FA36750B803EB1,5B
1110 DATA 2A097404FE06B12A,E9
1120 DATA 80FA0D75C5A0B12A,2F
1130 DATA D0E0040CA2EF26B4,3A
1140 DATA 10CD4133C0BFF026,33
1150 DATA B9C103F3AAA0EF26,DB
1160 DATA FEC0B300B700E8EC,E2
1170 DATA 05C605018A3EEF26,83
1180 DATA E8E205C60501FEC3,FC
1190 DATA 3AD875E8B701B300,67
1200 DATA E8D205C605018A1E,88
1210 DATA EF26E8C805C60501,FB
1220 DATA FEC73A3EEF2675E6,24
1230 DATA B702B302E8B605C6,FB
1240 DATA 0501E8C80580E203,3E
1250 DATA 80FB02740580FA03,53
1260 DATA 74F0D0E232F6BFD7,FB
1270 DATA 2603FA8B055302D8,1F
1280 DATA 02FCE89005C60501,DA
1290 DATA 5B80C3023A1EEF26,3B
1300 DATA 72CA33C9E8960580,F2
1310 DATA E2038ACAE2FE80C7,C4
1320 DATA 023A3EEF2672B38A,8B
1330 DATA 1EEF26E87F0580E2,37
1340 DATA 01D0E2FEC22ADA8A,4B
1350 DATA 3EEF26E86F0580E2,07
1360 DATA 01D0E2FEC22AFAE8,1B
1370 DATA 4B05C60502A0EF26,3E
1380 DATA FEC0B1C02A0EEF26,70
1390 DATA D0E9B5202A2EEF26,E0
1400 DATA D0EDB700B300E82C,06
1410 DATA 058A1580FA017509,BB
1420 DATA 5302D902FDE83A03,F9
1430 DATA 5BFEC33AD875E7FE,BF
1440 DATA C73AF875DFB404CD,0E
1450 DATA 41C606B42A01C606,21
1460 DATA B52A01C606B82A01,C0
1470 DATA C606B92A00B410CD,B5
1480 DATA 41B40FBB0A01CD41,9D
1490 DATA B420BFC526CD41B4,38
1500 DATA 0FBB1501CD41B401,43
1510 DATA 8A1EB82A32FF8A97,08
1520 DATA D326CD4133DBB927,F2
1530 DATA 1FE8C2038A16B82A,CF
1540 DATA C0E20232F6BFDF26,E3
1550 DATA 03FA893EB22A8B05,F5
1560 DATA 8A1EB42A8A3EB52A,F3
1570 DATA 02D802FCE8A604B0,B0
1580 DATA 02803D01740232C0,6B
1590 DATA BB26032AF8B92303,F3
1600 DATA E8F0028BD9B9231C,62
1610 DATA E8E8028BD9B9261C,67
1620 DATA 02E8E8DE028B3EB2,90
1630 DATA 2A8B058A1EB42A8A,BB
1640 DATA 3EB52A2AD82AFCE8,26
1650 DATA 6B04B002803D0174,20
1660 DATA 0232C0BB01032AF8,8F
1670 DATA B90403E8B5028BD9,94
1680 DATA B9041CE8AD028BD9,B7
1690 DATA B9011C02E8E8A302,94
1700 DATA 8B3EB22A8B45028A,78
1710 DATA 1EB42A8A3EB52A02,D6
1720 DATA D802FC881EB62A88,30
1730 DATA 3EB72AE827048A05,93
1740 DATA 3C01750CBB0403B9,69
1750 DATA 231CE81103E97001,F4
1760 DATA 3C02750EBB0F1CB9,64
1770 DATA 181CE86602C606B9,40
1780 DATA 2A018B3EB22A8B05,30
1790 DATA 8A1EB62A8A3EB72A,07
1800 DATA 02D802FCE8EE03B0,59
1810 DATA 06803D01740232C0,6F
1820 DATA BB23092AF8B91B09,F7
1830 DATA E838028BD9B91B16,8A
1840 DATA E830028BD9B92316,B2
1850 DATA 02E8E826028B3EB2,B0
1860 DATA 2A8B058A1EB62A8A,C7
1870 DATA 3EB72A2AD82AFCE8,2A
1880 DATA B303B006803D0174,76
1890 DATA 0232C0BB04092AF8,C2
1900 DATA B90C09E8FD018BD9,18
1910 DATA B90C16E8F5018BD9,17
1920 DATA B9041602E8E8EB01,78
1930 DATA 8B3EB22A8B45028A,78
1940 DATA 1EB62A8A3EB72A02,E6
1950 DATA D802FC881EB62A88,30
1960 DATA 3EB72AE86F038A05,F5
1970 DATA 3C01750CBB0C09B9,C3
1980 DATA 1B16E85902E9B800,EB
1990 DATA 3C027509BB1216B9,38
2000 DATA 1516E8AE018B3EB2,3A
2010 DATA 2A8B058A1EB62A8A,C7
2020 DATA 3EB72A02D802FCE8,9A
2030 DATA 3B03B004803D0174,F6
2040 DATA 0232C0BB1B0D2AF8,4D
2050 DATA B9160DE885018BD9,E0
2060 DATA B91612E87D018BD9,C7
2070 DATA B91B1202E8E87301,52
2080 DATA 8B3EB22A8B058A1E,50
2090 DATA B62A8A3EB72A2AD8,15
2100 DATA 2AFCE80003B00480,25
2110 DATA 3D01740232C0BB0C,9A
2120 DATA 0D2AF8B9110DE84A,78
2130 DATA 018BD9B91112E842,AF
2140 DATA 018BD9B90C1202E8,7C
2150 DATA E838018B3EB22A8B,67
2160 DATA 45028A1EB62A8A3E,9F
2170 DATA B72A02D802FCE8C4,DB
2180 DATA 028A053C01750CBB,04
2190 DATA 110DB91612E8AE01,42
2200 DATA EB0E903C027509BB,86
2210 DATA 1312B91412E80301,99
2220 DATA 803EB92A017503E9,EF
2230 DATA 8B00B41FCD41B41D,7E
2240 DATA CD4180FA3275268A,C9
2250 DATA 1EB42A8A3EB52A8B,1E
2260 DATA 3EB22A8B45022AD8,97
2270 DATA 2AFCE87802803D00,6F
2280 DATA 750B881EB42A883E,C3
2290 DATA B52AE970FD80FA34,EB
2300 DATA 750FA0B82AFEC879,59
2310 DATA 02B003A2B82AE95C,C6
2320 DATA FD80FA367511A0B8,92
2330 DATA 2AFEC03C047502B0,B6
2340 DATA 00A2B82AE946FD80,30
2350 DATA FA3875268A1EB42A,03
2360 DATA 8A3EB52A8B3EB22A,26
2370 DATA 8B450202D802FCE8,8B
2380 DATA 2302803D00750B88,E6
2390 DATA 1EB42A883EB52AE9,06
2400 DATA 1BFDE975FFB88000,6F
2410 DATA E8130080E40274F5,62
2420 DATA B88000E8080080E4,20
2430 DATA 0275F5E98CFBBA00,23
2440 DATA 02EFE80500BA0202,26
2450 DATA EDC351B90900E2FE,95
2460 DATA 59C36006B800A08E,7F
2470 DATA C033FFE8BD01B021,52
2480 DATA AA8AC3AAB022AA8A,E1
2490 DATA C7AAB020AA268A25,CF
2500 DATA B020D2E8535B535B,E4
2510 DATA 268A250AE04FB021,E3
2520 DATA AA8AC3AAB022AA8A,E1
2530 DATA C7AAB020AA8AC4AA,E5
2540 DATA 0761C3608AE12AE3,C8
2550 DATA 3AD972048AE32AE1,84
2560 DATA FEC48AC52AC73AFD,32
2570 DATA 72048AC72AC5FEC0,96
2580 DATA 3AE0763D3AD97202,B6
2590 DATA 87D98AF0E83E0186,CA
2600 DATA C48BF881E7FF0086,73
2610 DATA C48AE6D0EC518BCB,71
2620 DATA 03CFFEC92AE07304,16
2630 DATA FEC102E6E893008A,68
2640 DATA D9FEC3593AFD7444,DE
2650 DATA FECF730380C702EB,91
2660 DATA DC3AFD720287D986,62
2670 DATA E08AF0E8FF008BF8,EC
2680 DATA 81E700FF8AE6D0EC,71
2690 DATA 518BCB03CFFECD2A,BE
2700 DATA E07304FEC502E6E8,39
2710 DATA 4A008AFDFEC7593A,BB
2720 DATA D97409FECB730380,92
2730 DATA C302EBDC61C35351,3C
2740 DATA 3AD9742D720286D9,B4
2750 DATA 3AFD7425720286FD,FC
2760 DATA FEC7FECD3AFD770A,5B
2770 DATA E8190086D9E81400,6B
2780 DATA 86D9FECFFEC5E819,22
2790 DATA 003AFD74048AFDEB,CE
2800 DATA F5595BC353E8EAFE,29
2810 DATA 3AFD7404FEC7EBF5,55
2820 DATA 5BC36006B800A08E,81
2830 DATA C033FF5351B63F8A,51
2840 DATA E3B006E87700F6DC,E2
2850 DATA 8AEC518AC8D2EE59,9B
2860 DATA 8AE1B006E866008A,B0
2870 DATA C802EC22ED750FFE,D0
2880 DATA C5EB4A90B63F80ED,A9
2890 DATA 017303EB4B905351,40
2900 DATA E8680059B021AA8A,48
2910 DATA C3AAB022AA8AC7AA,FE
2920 DATA B020AA268A25535B,33
2930 DATA 535B268A250AF44F,BC
2940 DATA B021AA8AC3AAB022,C3
2950 DATA AA8AC7AAB020AA8A,E1
2960 DATA C6AA5B80C30680FD,86
2970 DATA 0175B9B63FF6D980,DC
2980 DATA C105D2EED2E6EBAE,54
2990 DATA 595B0761C3535133,38
3000 DATA DB8ADCB90800D1E3,5E
3010 DATA 8AE72AE07204FEC3,B2
3020 DATA 8AFCE2F28AE38AC7,F2
3030 DATA 595BC380FB607203,B5
3040 DATA 80C7208AE3B006E8,8F
3050 DATA D3FF8AC880E40F80,D0
3060 DATA C4068ADCC35053BF,CA
3070 DATA F0268AC78A26EF26,45
3080 DATA FEC4F6E432FF03C3,19
3090 DATA 03F85B58C3505351,E0
3100 DATA B9DB128AFD8AD9D1,71
3110 DATA E303CB8AD102D58A,B6
3120 DATA EA83C138890E9126,3B
3130 DATA 8AD5595B58C33344,7A
3140 DATA 2D4D415A45004741,44
3150 DATA 4D45204C4556454C,07
3160 DATA 3A5B205D00446972,CB
3170 DATA 656374696F6E3A5B,58
3180 DATA 205D004E45535700,BE
3190 DATA 0100FF0100FF0001,04
3200 DATA 0000FF00010100FF,00
3210 DATA 00000100FFFF00##,F8
ソースリスト
;******************************************************************************
;3D-MAZE 1997(C) COPYRIGHT BY ABCP software
;******************************************************************************
.186
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,SS:CODE,ES:CODE
ORG 0100H
START:
ORG 2000H
;**************************************
;初期化
;**************************************
CLD
XOR AX,AX
MOV DS,AX
MOV ES,AX
MOV G_LEVEL,AL ;(AL=0)
;**************************************
;タイトル表示
;**************************************
TITLE:
MOV AH,10H
INT 41H
MOV AH,0FH
MOV BX,000CH
INT 41H
MOV AH,20H
MOV DI,OFFSET _3DMAZE
INT 41H
MOV AH,0FH
MOV BX,0209H
INT 41H
MOV AH,20H
MOV DI,OFFSET LEVEL
INT 41H
P_LV:
MOV AH,0FH
MOV BX,0215H
INT 41H
MOV AH,1
MOV DL,G_LEVEL
ADD DL,30H
INT 41H
MOV AH,4
INT 41H
CMP DL,34H
JNZ LV_1
CMP BYTE PTR G_LEVEL,0
JZ LV_1
DEC BYTE PTR G_LEVEL
LV_1:
CMP DL,36H
JNZ LV_2
CMP BYTE PTR G_LEVEL,9
JZ LV_2
INC BYTE PTR G_LEVEL
LV_2:
CMP DL,13
JNZ P_LV
MOV AL,G_LEVEL
SAL AL,1
ADD AL,12
MOV BYTE PTR M_SIZE,AL
;**************************************
;迷路作成
;**************************************
MOV AH,10H ;CLS
INT 41H
;取り合えず壁をおく
XOR AX,AX
MOV DI,OFFSET MAZE
MOV CX,961
REP STOSB
MOV AL,M_SIZE
INC AL
MOV BL,0
MK_LP:
MOV BH,0
CALL XY
MOV BYTE PTR [DI],1
MOV BH,M_SIZE
CALL XY
MOV BYTE PTR [DI],1
INC BL
CMP BL,AL
JNZ MK_LP
MOV BH,1
MK_LP2:
MOV BL,0
CALL XY
MOV BYTE PTR [DI],1
MOV BL,M_SIZE
CALL XY
MOV BYTE PTR [DI],1
INC BH
CMP BH,M_SIZE
JNZ MK_LP2
;隙間を埋める
MOV BH,2
KABE_1:
MOV BL,2
KABE_2:
CALL XY
MOV BYTE PTR [DI],1
KABE_A:
CALL RND
AND DL,3
CMP BL,2
JZ KABE_3
CMP DL,3
JZ KABE_A
KABE_3:
SAL DL,1
XOR DH,DH
MOV DI,OFFSET KABEDATA
ADD DI,DX
MOV AX,[DI]
PUSH BX
ADD BL,AL
ADD BH,AH
CALL XY
MOV BYTE PTR [DI],1
POP BX
ADD BL,2
CMP BL,M_SIZE
JC KABE_2
XOR CX,CX ;ダブり防止
CALL RND
AND DL,3
MOV CL,DL
LP: LOOP LP
ADD BH,2
CMP BH,M_SIZE
JC KABE_1
;ゴール設定
MOV BL,M_SIZE
CALL RND
AND DL,1
SAL DL,1
INC DL
SUB BL,DL
MOV BH,M_SIZE
CALL RND
AND DL,1
SAL DL,1
INC DL
SUB BH,DL
CALL XY
MOV BYTE PTR [DI],2
;**************************************
;マップ表示
;**************************************
MOV AL,M_SIZE
INC AL
;画面の真ん中に表示
MOV CL,192
SUB CL,M_SIZE
SHR CL,1
MOV CH,32
SUB CH,M_SIZE
SHR CH,1
MOV BH,0
SHOW_1:
MOV BL,0
SHOW_2:
CALL XY
MOV DL,[DI]
CMP DL,1
JNZ SHOW_3
PUSH BX
ADD BL,CL
ADD BH,CH
CALL FUNK_7
POP BX
SHOW_3:
INC BL
CMP BL,AL
JNZ SHOW_2
INC BH
CMP BH,AL
JNZ SHOW_1
MOV AH,4 ;キー入力待ち
INT 41H
;**************************************
;メイン
;**************************************
MOV BYTE PTR MY_X,1
MOV BYTE PTR MY_Y,1
MOV BYTE PTR DRCT,1
MOV BYTE PTR G_FLAG,0
MAIN_S:
MOV AH,10H
INT 41H
MOV AH,0FH
MOV BX,010AH
INT 41H
MOV AH,20H
MOV DI,OFFSET NEWS
INT 41H
MOV AH,0FH
MOV BX,0115H
INT 41H
MOV AH,1
MOV BL,DRCT
XOR BH,BH
MOV DL,[BX+NEWS_O]
INT 41H
XOR BX,BX ;外枠
MOV CX,1F27H
CALL FUNK_9
MOV DL,DRCT
SAL DL,2
XOR DH,DH
MOV DI,OFFSET VECTOR
ADD DI,DX
MOV [VECTOR_O],DI
MOV AX,[DI]
MOV BL,BYTE PTR MY_X
MOV BH,BYTE PTR MY_Y
ADD BL,AL
ADD BH,AH
CALL XY
MOV AL,2
CMP BYTE PTR [DI],1
JZ LINE_1
XOR AL,AL
LINE_1:
MOV BX,0326H
SUB BH,AL
MOV CX,0323H
CALL FUNK_8
MOV BX,CX
MOV CX,1C23H
CALL FUNK_8
MOV BX,CX
MOV CX,1C26H
ADD CH,AL
CALL FUNK_8
MOV DI,[VECTOR_O]
MOV AX,[DI]
MOV BL,BYTE PTR MY_X
MOV BH,BYTE PTR MY_Y
SUB BL,AL
SUB BH,AH
CALL XY
MOV AL,2
CMP BYTE PTR [DI],1
JZ LINE_2
XOR AL,AL
LINE_2:
MOV BX,301H
SUB BH,AL
MOV CX,304H
CALL FUNK_8
MOV BX,CX
MOV CX,1C04H
CALL FUNK_8
MOV BX,CX
MOV CX,1C01H
ADD CH,AL
CALL FUNK_8
MOV DI,[VECTOR_O]
MOV AX,[DI+2]
MOV BL,BYTE PTR MY_X
MOV BH,BYTE PTR MY_Y
ADD BL,AL
ADD BH,AH
MOV BYTE PTR MY_XX,BL
MOV BYTE PTR MY_YY,BH
CALL XY
MOV AL,[DI]
CMP AL,1
JNZ LINE_3
MOV BX,304H
MOV CX,1C23H
CALL FUNK_9
JMP KEY_IN
LINE_3:
CMP AL,2
JNZ LINE_4
MOV BX,1C0FH
MOV CX,1C18H
CALL FUNK_8
MOV BYTE PTR G_FLAG,1
LINE_4:
MOV DI,[VECTOR_O]
MOV AX,[DI]
MOV BL,BYTE PTR MY_XX
MOV BH,BYTE PTR MY_YY
ADD BL,AL
ADD BH,AH
CALL XY
MOV AL,6
CMP BYTE PTR [DI],1
JZ LINE_5
XOR AL,AL
LINE_5:
MOV BX,0923H
SUB BH,AL
MOV CX,091BH
CALL FUNK_8
MOV BX,CX
MOV CX,161BH
CALL FUNK_8
MOV BX,CX
MOV CX,1623H
ADD CH,AL
CALL FUNK_8
MOV DI,[VECTOR_O]
MOV AX,[DI]
MOV BL,BYTE PTR MY_XX
MOV BH,BYTE PTR MY_YY
SUB BL,AL
SUB BH,AH
CALL XY
MOV AL,6
CMP BYTE PTR [DI],1
JZ LINE_6
XOR AL,AL
LINE_6:
MOV BX,0904H
SUB BH,AL
MOV CX,090CH
CALL FUNK_8
MOV BX,CX
MOV CX,160CH
CALL FUNK_8
MOV BX,CX
MOV CX,1604H
ADD CH,AL
CALL FUNK_8
MOV DI,[VECTOR_O]
MOV AX,[DI+2]
MOV BL,BYTE PTR MY_XX
MOV BH,BYTE PTR MY_YY
ADD BL,AL
ADD BH,AH
MOV BYTE PTR MY_XX,BL
MOV BYTE PTR MY_YY,BH
CALL XY
MOV AL,[DI]
CMP AL,1
JNZ LINE_7
MOV BX,090CH
MOV CX,161BH
CALL FUNK_9
JMP KEY_IN
LINE_7:
CMP AL,2
JNZ LINE_8
MOV BX,1612H
MOV CX,1615H
CALL FUNK_8
LINE_8:
MOV DI,[VECTOR_O]
MOV AX,[DI]
MOV BL,BYTE PTR MY_XX
MOV BH,BYTE PTR MY_YY
ADD BL,AL
ADD BH,AH
CALL XY
MOV AL,4
CMP BYTE PTR [DI],1
JZ LINE_9
XOR AL,AL
LINE_9:
MOV BX,0D1BH
SUB BH,AL
MOV CX,0D16H
CALL FUNK_8
MOV BX,CX
MOV CX,1216H
CALL FUNK_8
MOV BX,CX
MOV CX,121BH
ADD CH,AL
CALL FUNK_8
MOV DI,[VECTOR_O]
MOV AX,[DI]
MOV BL,BYTE PTR MY_XX
MOV BH,BYTE PTR MY_YY
SUB BL,AL
SUB BH,AH
CALL XY
MOV AL,4
CMP BYTE PTR [DI],1
JZ LINE_10
XOR AL,AL
LINE_10:
MOV BX,0D0CH
SUB BH,AL
MOV CX,0D11H
CALL FUNK_8
MOV BX,CX
MOV CX,1211H
CALL FUNK_8
MOV BX,CX
MOV CX,120CH
ADD CH,AL
CALL FUNK_8
MOV DI,[VECTOR_O]
MOV AX,[DI+2]
MOV BL,BYTE PTR MY_XX
MOV BH,BYTE PTR MY_YY
ADD BL,AL
ADD BH,AH
CALL XY
MOV AL,[DI]
CMP AL,1
JNZ LINE_11
MOV BX,0D11H
MOV CX,1216H
CALL FUNK_9
JMP KEY_IN
LINE_11:
CMP AL,2
JNZ LINE_12
MOV BX,1213H
MOV CX,1214H
CALL FUNK_8
LINE_12:
KEY_IN:
CMP BYTE PTR G_FLAG,1
JNZ KEY_P
JMP GOAL
KEY_P:
MOV AH,1FH
INT 41H
MOV AH,1DH
INT 41H
CMP DL,32H
JNZ KEY_1
MOV BL,BYTE PTR MY_X
MOV BH,BYTE PTR MY_Y
MOV DI,[VECTOR_O]
MOV AX,[DI+2]
SUB BL,AL
SUB BH,AH
CALL XY
CMP BYTE PTR [DI],0
JNZ KEY_1
MOV BYTE PTR MY_X,BL
MOV BYTE PTR MY_Y,BH
JMP MAIN_S
KEY_1:
CMP DL,34H
JNZ KEY_2
MOV AL,DRCT
DEC AL
JNS DRCT_2
MOV AL,3
DRCT_2:
MOV DRCT,AL
JMP MAIN_S
KEY_2:
CMP DL,36H
JNZ KEY_3
MOV AL,DRCT
INC AL
CMP AL,4
JNZ DRCT_3
MOV AL,0
DRCT_3:
MOV DRCT,AL
JMP MAIN_S
KEY_3:
CMP DL,38H
JNZ KEY_4
MOV BL,BYTE PTR MY_X
MOV BH,BYTE PTR MY_Y
MOV DI,[VECTOR_O]
MOV AX,[DI+2]
ADD BL,AL
ADD BH,AH
CALL XY
CMP BYTE PTR [DI],0
JNZ KEY_4
MOV BYTE PTR MY_X,BL
MOV BYTE PTR MY_Y,BH
JMP MAIN_S
KEY_4:
JMP KEY_P
GOAL:
MOV AX,0080H
CALL KEY
AND AH,02H
JZ GOAL
GOAL2:
MOV AX,0080H
CALL KEY
AND AH,02H
JNZ GOAL2
JMP TITLE
;**************************************
;サブルーチン
;**************************************
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
FUNK_7:
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]
OR 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
FUNK_8:
PUSHA
MOV AH,CL
SUB AH,BL
CMP BL,CL
JC X_LEN
MOV AH,BL
SUB AH,CL
X_LEN:
INC AH
MOV AL,CH
SUB AL,BH
CMP BH,CH
JC Y_LEN
MOV AL,BH
SUB AL,CH
Y_LEN:
INC AL
CMP AH,AL
JNA Y_LONG
X_LONG:
CMP BL,CL
JC X_LONG_1
XCHG BX,CX
X_LONG_1:
MOV DH,AL
CALL WARI
XCHG AL,AH
MOV DI,AX
AND DI,00FFH
XCHG AL,AH
MOV AH,DH
SHR AH,1
X_LONG_L:
PUSH CX
MOV CX,BX
ADD CX,DI
DEC CL
SUB AH,AL
JNC NANAME_2
INC CL
ADD AH,DH
NANAME_2:
CALL YOKO
MOV BL,CL
INC BL
POP CX
CMP BH,CH
JE NANAME_E
DEC BH
JNC X_ADD
ADD BH,2
X_ADD:
JMP X_LONG_L
Y_LONG:
CMP BH,CH
JC Y_LONG_1
XCHG BX,CX
Y_LONG_1:
XCHG AH,AL
MOV DH,AL
CALL WARI
MOV DI,AX
AND DI,0FF00H
MOV AH,DH
SHR AH,1
Y_LONG_L:
PUSH CX
MOV CX,BX
ADD CX,DI
DEC CH
SUB AH,AL
JNC NANAME_3
INC CH
ADD AH,DH
NANAME_3:
CALL TATE
MOV BH,CH
INC BH
POP CX
CMP BL,CL
JE NANAME_E
DEC BL
JNC Y_ADD
ADD BL,2
Y_ADD:
JMP Y_LONG_L
NANAME_E:
POPA
RET
FUNK_9:
PUSH BX
PUSH CX
CMP BL,CL
JE FUNK_9_E
JC FUNK_9_1
XCHG BL,CL
FUNK_9_1:
CMP BH,CH
JE FUNK_9_E
JC FUNK_9_2
XCHG BH,CH
FUNK_9_2:
INC BH
DEC CH
CMP BH,CH
JA FUNK_9_3
CALL TATE
XCHG BL,CL
CALL TATE
XCHG BL,CL
FUNK_9_3:
DEC BH
INC CH
BOX_FS:
CALL YOKO
CMP BH,CH
JE FUNK_9_E
MOV BH,CH
JMP BOX_FS
FUNK_9_E:
POP CX
POP BX
RET
TATE:
PUSH BX
TATE_1:
CALL FUNK_7
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
MOV AH,ES:[DI]
OR DH,AH
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
WARI: ;AH/AL=AH...AL
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
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
XY:
PUSH AX
PUSH BX
MOV DI,OFFSET MAZE
MOV AL,BH
MOV AH,M_SIZE
INC AH
MUL AH
XOR BH,BH
ADD AX,BX
ADD DI,AX
POP BX
POP AX
RET
RND:
PUSH AX
PUSH BX
PUSH CX
DB 0B9H ;CX=?
RNDDT:
DW 12DBH
MOV BH,CH
MOV BL,CL
SAL BX,1
ADD CX,BX
MOV DL,CL
ADD DL,CH
MOV CH,DL
ADD CX,0038H
MOV WORD PTR RNDDT,CX
MOV DL,CH
POP CX
POP BX
POP AX
RET
;**************************************
;データ、ワークエリア
;**************************************
_3DMAZE DB '3D-MAZE',0
LEVEL DB 'GAME LEVEL:[ ]',0
NEWS DB 'Direction:[ ]',0
NEWS_O DB 'NESW'
KABEDATA DB 0,1,0,-1,1,0,-1,0
VECTOR DB 1,0,0,-1
DB 0,1,1,0
DB -1,0,0,1
DB 0,-1,-1,0
M_SIZE DB 1 DUP(?)
MAZE DB 961 DUP(?)
G_LEVEL DB 1 DUP(?)
VECTOR_O DW 1 DUP(?)
MY_X DB 1 DUP(?)
MY_Y DB 1 DUP(?)
MY_XX DB 1 DUP(?)
MY_YY DB 1 DUP(?)
DRCT DB 1 DUP(?)
G_FLAG DB 1 DUP(?)
CODE ENDS
END START
コメント
コメント(0件)
コメントする
トラックバック
トラックバック(0件)
トラックバック先