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

トラックバック先

当サイトについて

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

Get Adobe Flash playerPlugin by wpburn.com wordpress themes