推箱子游戏,运行不需操作系统,自有引导扇区
Bochs-2.4.6模拟运行时的截图:
前几关
通关结束
我的代码:
1
; box.s
2 ; 推箱子,运行不需操作系统,自有引导扇区,软盘引导
3 ; 玩法:W S A D 上下左右,Q 退出,R 重玩当前一关
4 ; zj QQ: 466577437
5 ; 初学汇编,求师友
6
7
8 ; NASM 16位 实模式
9 ; Ubuntu
10 ; nasm - o box.bin box.s
11 ; sudo dd if = box.bin of =/ dev / fd0 bs = 512 count = 15 conv = notrunc
12 ; Bochs 模拟
13
14
15 ; 函数调用约定
16 ; 参数从右向左压栈,由调用函数平衡栈
17 ; 被调用函数返回后与调用前相比,栈中元素及栈大小不改变
18 ; 被调用方不维护 ax, bx, cx, dx,但保证维护其它寄存器
19 ; 函数返回值 ax, bx, cx, dx
20
21
22 ; 代码为将来改进做好了准备(常数, 变量 和 未实现的函数)
23 ; 如 人物各方向不同,移动动画,使用斜视图实现3D效果
24
25
26 ; 常数
27 ; 程序占用扇区总数,不超过 0xFFFF 字节
28 % define SEC_NUM 15
29 ; 每个扇区大小 字节
30 % define SEC_SIZE 0x200
31 ; 显示
32 % define VIDEO_ID 0x13
33 % define VIDEO_HORZ_P 320
34 % define VIDEO_VERT_P 200
35 % define VIDEO_P (VIDEO_HORZ_P * VIDEO_VERT_P)
36 % define VIDEO_SEG 0xA000
37 % define VIDEO_PAL_PORT 0x03C8
38 % define VIDEO_COL_PORT 0x03C9
39 ; 栈,考虑对齐
40 % define STACK_TOP 0xFF00
41 % define STACK_SEG 0x8000
42 ; 引导
43 % define BOOT_SEG 0x7C0
44 ; 级别总数(级别为 1 .. LEVEL_MAX )
45 % define LEVEL_MAX 4
46 ; 按键虚拟键码
47 % define VK_NULL 0xFFFF
48 % define VK_W ( ' W ' )
49 % define VK_A ( ' A ' )
50 % define VK_S ( ' S ' )
51 % define VK_D ( ' D ' )
52 % define VK_Q ( ' Q ' )
53 % define VK_R ( ' R ' )
54 ; 游戏状态
55 % define GS_WIN 0x1
56 % define GS_QUIT 0x2
57 % define GS_REPLAY 0x3
58
59
60 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
61 ; 设置
62 [bits 16 ]
63 ; org 0x7C00
64
65 ; 初始化 cs, ip
66 jmp BOOT_SEG : BOOT
67 BOOT :
68 ; 初始化段寄存器
69 mov ax, cs
70 mov ds, ax
71 mov es, ax
72 mov fs, ax
73 mov gs, ax
74 ; 初始化 栈
75 mov ax, STACK_SEG
76 mov ss, ax
77 mov ax, STACK_TOP
78 mov sp, ax
79
80 ; 读入整个程序
81 ; 偷懒,假设要读取的扇区都在 0 磁道,若扇区数增加,需修改此段代码
82 mov ah, 0x2
83 mov al, SEC_NUM
84 dec al
85 ; mov cx, 0x0001 悲剧!!!!
86 mov cx, 0x0002
87 mov dx, 0x0000
88 mov bx, SEC_SIZE
89 int 0x13
90
91 ; 初始化显示方式
92 call initVideo
93
94 ; 跳入 main 执行
95 call main
96
97 ; 跳入 shutdown 关机
98 call shutdown
99
100 times ( 0x200 - 2 - ($ - $$)) db 0
101 db 0x55
102 db 0xAA
103
104
105 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
106 ; 地图
107 ;
108 ; 地图单元
109 ;
110 ; * ------------
111 ; ***** ^
112 ; ********* |
113 ; *************
114 ; | *********|
115 ; | + ***** | UNIT_VERT_P
116 ; |+ * |
117 ; + | +
118 ; + | + |
119 ; + |+ V
120 ; 位置点 --> @ ----------
121 ;
122 ; | |
123 ; | UNIT_HORZ_P |
124 ;
125 ;
126 ;
127 ; 地图布局
128 ; 单元点坐标以单元为单位,常量 * _U
129 ; 像素点坐标以像素为单位,常量 * _P
130 ; 坐标点格式(x,y),先水平,后垂直
131 ; 单元点的像素坐标为其右下角像素的像素坐标
132 ; 水平 MAP_HORZ_U 个单元
133 ; 垂直 MAP_VERT_U 个单元
134 ; 单元点(xu,yu) in [ 0 .. MAP_HORZ_U) * [ 0 .. MAP_VERT_U)
135 ; 像素点(xp,yp) in [ 0 .. VIDEO_HORZ_P) * [ 0 .. VIDEO_VERT_P)
136 ; 二维图片实现3D效果,暂未使用,待扩充
137 ; 绘制从左上角单元开始,至右下角单元结束,实现3D效果
138 ; 地图原点为地图左上角单元(xu = 0 ,yu = 0 )的像素坐标
139 ;
140 ; +--------------------------> xu in [ 0 .. MAP_HORZ_U)
141 ; | xp in [ 0 .. VIDEO_HORZ_P)
142 ; | *
143 ; | * *
144 ; | * *
145 ; yu | * *
146 ; yp | * *
147 ; v ----------* *------------
148 ; | * *|
149 ; DY_HORZ_P | * * | DY_VERT_P
150 ; | * * |
151 ; | * * |
152 ; ----------+-------------- @ ----+-------------
153 ; | | |
154 ; | DX_HORZ_P | |
155 ; | | |
156 ; DX_VERT_P
157 ;
158
159 ; 注意正负号,作为增量
160 % define DX_VERT_P ( 0 )
161 % define DY_VERT_P ( 22 )
162 % define DX_HORZ_P ( 22 )
163 % define DY_HORZ_P ( 0 )
164
165 % define UNIT_HORZ_P ( 22 )
166 % define UNIT_VERT_P ( 22 )
167 % define UNIT_P (UNIT_HORZ_P * UNIT_VERT_P)
168
169 % define MAP_HORZ_U 8
170 % define MAP_VERT_U 8
171 % define MAP_U (MAP_HORZ_U * MAP_VERT_U)
172
173 ; 单元 id,一字节,使用位或,一个单元可以为 BOX + DEST 或BOX + FLOOR
174 % define UID_SPACE 0x01
175 % define UID_FLOOR 0x02
176 % define UID_WALL 0x04
177 % define UID_BOX 0x08
178 % define UID_DEST 0x10
179 % define UID_PLAYER 0x20
180 ; 一字节
181 % define DIR_UP 0x0
182 % define DIR_DOWN 0x1
183 % define DIR_LEFT 0x2
184 % define DIR_RIGHT 0x3
185
186 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
187 ; func void main()
188 ; 主程序
189 main :
190 mov byte [level], 0x1
191 .PLAY :
192 movzx ax, byte [level]
193 cmp ax, LEVEL_MAX
194 ja .COMPLETE
195
196 call initOneLevel
197 call playOneLevel
198
199 cmp ax, GS_QUIT
200 je .QUIT
201 cmp ax, GS_REPLAY
202 je .REPLAY
203 cmp ax, GS_WIN
204 jne .ERR
205 inc byte [level]
206 .REPLAY :
207 jmp .PLAY
208 .COMPLETE :
209 call initOneLevel
210 jmp .EXIT
211 .QUIT :
212 mov byte [level], LEVEL_MAX + 1
213 call initOneLevel
214 jmp .EXIT
215 .ERR :
216 jmp .EXIT
217 .EXIT :
218 ret
219
220 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
221 ; func void shutdown()
222 ; 关机
223 shutdown :
224 ; 暂时死循环吧
225 jmp $
226 ret
227
228 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
229 ; func void initOneLevel()
230 ; 初始化 level 级别
231 initOneLevel :
232 push si
233 push di
234 movzx ax, byte [level]
235 mov cx, MAP_SIZE
236 mul cx
237 mov si, MAP_CUR
238 add si, ax
239 mov di, MAP_CUR
240 cld
241 rep movsb
242 pop di
243 pop si
244 call eraseAll
245 call drawAll
246 ret
247
248 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
249 ; func ax playOneLevel()
250 ; 玩 level 级别
251 ; 返回 GS_WIN GS_REPLAY GS_QUIT
252 playOneLevel :
253 .PLAY :
254 call getKey
255 cmp ax, VK_Q
256 je .QUIT
257 cmp ax, VK_R
258 je .REPLAY
259
260 movzx cx, byte [px_u]
261 movzx dx, byte [py_u]
262 cmp ax, VK_W
263 je .UP
264 cmp ax, VK_S
265 je .DOWN
266 cmp ax, VK_A
267 je .LEFT
268 cmp ax, VK_D
269 je .RIGHT
270 jmp .PLAY
271 .UP :
272 mov byte [dir], DIR_UP
273 sub dx, 2
274 push dx
275 push cx
276 inc dx
277 push dx
278 push cx
279 jmp .TMOVE
280 .DOWN :
281 mov byte [dir], DIR_DOWN
282 add dx, 2
283 push dx
284 push cx
285 dec dx
286 push dx
287 push cx
288 jmp .TMOVE
289 .LEFT :
290 mov byte [dir], DIR_LEFT
291 sub cx, 2
292 push dx
293 push cx
294 inc cx
295 push dx
296 push cx
297 jmp .TMOVE
298 .RIGHT :
299 mov byte [dir], DIR_RIGHT
300 add cx, 2
301 push dx
302 push cx
303 dec cx
304 push dx
305 push cx
306 .TMOVE :
307 ; BOX
308 mov ax, UID_BOX
309 push ax
310 call isUidU
311 add sp, 2
312 test ax, ax
313 jnz .BOX
314 ; FLOOR
315 mov ax, UID_FLOOR
316 push ax
317 call isUidU
318 add sp, 2
319 test ax, ax
320 jnz .WALK
321 ; DEST
322 mov ax, UID_DEST
323 push ax
324 call isUidU
325 add sp, 2
326 test ax, ax
327 jnz .WALK
328 jmp .CANTMOVE
329 .BOX :
330 push bp
331 mov bp, sp
332 mov ax, [bp + 8 ]
333 push ax
334 mov ax, [bp + 6 ]
335 push ax
336 call isInMapU
337 test ax, ax
338 jz .ENDBOX
339 mov ax, UID_BOX
340 push ax
341 call isUidU
342 add sp, 2
343 test ax, ax
344 jnz .ENDBOX
345 mov ax, UID_WALL
346 push ax
347 call isUidU
348 add sp, 2
349 test ax, ax
350 jz .PUSHBOX
351 .ENDBOX :
352 mov sp, bp
353 pop bp
354 add sp, 8
355 jmp .MOVED
356 .PUSHBOX :
357 mov ax, [bp + 8 ]
358 mov cx, MAP_HORZ_U
359 mul cx
360 add ax, [bp + 6 ]
361 push si
362 mov si, MAP_CUR
363 add si, ax
364 ; movzx ax, [si] 悲剧!!!!
365 mov al, [si]
366 xor al, UID_BOX
367 mov [si], al
368 pop si
369 mov ax, [bp + 4 ]
370 mov cx, MAP_HORZ_U
371 mul cx
372 add ax, [bp + 2 ]
373 push si
374 mov si, MAP_CUR
375 add si, ax
376 mov al, [si]
377 xor al, UID_BOX
378 mov [si], al
379 pop si
380 mov ax, [bp + 2 ]
381 mov [px_u], al
382 mov ax, [bp + 4 ]
383 mov [py_u], al
384 jmp .ENDBOX
385 .WALK :
386 pop ax
387 mov [px_u], al
388 pop ax
389 mov [py_u], al
390 add sp, 4
391 jmp .MOVED
392 .CANTMOVE :
393 add sp, 8
394 .MOVED :
395 call drawAll
396 call judgeWin
397 test ax, ax
398 jnz .WIN
399 jmp .PLAY
400 .WIN :
401 mov ax, GS_WIN
402 jmp .EXIT
403 .REPLAY :
404 mov ax, GS_REPLAY
405 jmp .EXIT
406 .QUIT :
407 mov ax, GS_QUIT
408 .EXIT :
409 ret
410
411 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
412 ; func ax isUidU( uid, xu, yu )
413 ; 判断单元点(xu,yu)是否为uid
414 ; ax != 0 是, ax == 0 否
415 ; 若此单元点不在地图中,返回 否
416 isUidU :
417 push bp
418 mov bp, sp
419 mov ax, [bp + 8 ]
420 push ax
421 mov ax, [bp + 6 ]
422 push ax
423 call isInMapU
424 add sp, 4
425 test ax, ax
426 jz .EXIT
427 mov ax, [bp + 8 ]
428 mov cx, MAP_HORZ_U
429 mul cx
430 add ax, [bp + 6 ]
431 push si
432 mov si, MAP_CUR
433 add si, ax
434 movzx ax, byte [si]
435 pop si
436 and ax, [bp + 4 ]
437 .EXIT :
438 mov sp, bp
439 pop bp
440 ret
441
442 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
443 ; func ax isInMapU( xu, yu )
444 ; 判断单元点(xu,yu)是否在地图中(所在点为SPACE算不在地图中)
445 ; ax != 0 在, ax == 0 不在
446 isInMapU :
447 push bp
448 mov bp, sp
449 mov bx, [bp + 4 ]
450 cmp bx, MAP_HORZ_U
451 jae .NO
452 mov ax, [bp + 6 ]
453 cmp ax, MAP_VERT_U
454 jae .NO
455 mov cx, MAP_HORZ_U
456 mul cx
457 add ax, bx
458 push si
459 mov si, MAP_CUR
460 add si, ax
461 mov al, [si]
462 pop si
463 test al, UID_SPACE
464 jnz .NO
465 .YES :
466 mov ax, 1
467 jmp .EXIT
468 .NO :
469 mov ax, 0
470 .EXIT :
471 mov sp, bp
472 pop bp
473 ret
474
475 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
476 ; func ax judgeWin()
477 ; 判断是否胜利,ax == 0 否,ax != 0 胜
478 ; 简单化,扫描整个地图
479 judgeWin :
480 push si
481 mov si, MAP_CUR
482 mov cx, MAP_U
483 .judgeWin :
484 xor bx, bx
485 movzx ax, byte [si]
486 test ax, UID_DEST
487 jz .skip1
488 inc bx
489 .skip1 :
490 test ax, UID_BOX
491 jz .skip2
492 inc bx
493 .skip2 :
494 cmp bx, 1
495 je .LOSE
496 inc si
497 loop .judgeWin
498 .WIN :
499 mov ax, 1
500 jmp .EXIT
501 .LOSE :
502 mov ax, 0
503 .EXIT :
504 pop si
505 ret
506
507 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
508 ; func void eraseAll()
509 ; 清除所有图像
510 eraseAll :
511 mov ax, 01
512 mov cx, VIDEO_P
513 push es
514 mov bx, VIDEO_SEG
515 mov es, bx
516 push di
517 mov di, 0
518 cld
519 rep stosb
520 pop di
521 pop es
522 ret
523
524 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
525 ; func void drawAll()
526 ; 直接重绘地图,无关背景
527 ; 兼容3D效果,从左上角到右下角顺序绘制
528 drawAll :
529 push si
530
531 mov si, MAP_CUR
532 mov bx, 0 ; yu
533 mov cx, MAP_VERT_U
534 .drawAll1 :
535 push cx
536
537 mov ax, 0 ; xu
538 mov cx, MAP_HORZ_U
539 .drawAll2 :
540 push cx
541
542 push bx
543 push ax
544 movzx cx, byte [si]
545 inc si
546 push cx
547 call drawUidU
548 pop cx
549 pop ax
550 pop bx
551
552 inc ax
553 pop cx
554 loop .drawAll2
555
556 inc bx
557 pop cx
558 loop .drawAll1
559
560 pop si
561
562 movzx ax, byte [py_u]
563 push ax
564 movzx ax, byte [px_u]
565 push ax
566 mov ax, UID_PLAYER
567 push ax
568 call drawUidU
569 add sp, 6
570 ret
571
572 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
573 ; func void drawUidU( uid, xu, yu )
574 ; 绘制单元坐标为(xu,yu)的单元uid
575 ; uid == UID_FLOOR,
576 drawUidU :
577 push bp
578 mov bp, sp
579 mov ax, [bp + 8 ]
580 push ax
581 mov ax, [bp + 6 ]
582 push ax
583 call convU2P
584 add sp, 4
585 push bx
586 push ax
587 mov ax, [bp + 4 ]
588 push ax
589 call drawUid
590 add sp, 6
591 mov sp, bp
592 pop bp
593 ret
594
595 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
596 ; func ax, bx convU2P( xu, yu )
597 ; 单元坐标转换为像素坐标,依据 orgx_p, orgy_p
598 ; 返回 ax == xp, bx = yp
599 ; 适应3D侧视图
600 convU2P :
601 push bp
602 mov bp, sp
603 movzx ax, byte [orgx_p]
604 movzx bx, byte [orgy_p]
605 .convU2P_L1 :
606 mov cx, [bp + 4 ]
607 test cx, cx
608 jz .convU2P_L2
609 .convU2P1 :
610 add ax, DX_HORZ_P
611 add bx, DY_HORZ_P
612 loop .convU2P1
613 .convU2P_L2 :
614 mov cx, [bp + 6 ]
615 test cx, cx
616 jz .EXIT
617 .convU2P2 :
618 add ax, DX_VERT_P
619 add bx, DY_VERT_P
620 loop .convU2P2
621 .EXIT :
622 mov sp, bp
623 pop bp
624 ret
625
626 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
627 ; func void drawUid( uid, xp, yp )
628 ; 绘制像素点为(xp,yp)且类型为uid的单元点
629 ; uid == UID_SPACE, UID_FLOOR,
630 drawUid :
631 push bp
632 mov bp, sp
633 mov ax, [bp + 4 ]
634 push ax
635 call convUid2Uoff
636 pop bx
637 mov bx, [bp + 8 ]
638 push bx
639 mov bx, [bp + 6 ]
640 push bx
641 push ax
642 call drawUoff
643 mov sp, bp
644 pop bp
645 ret
646
647 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
648 ; func ax convUid2Uoff( uid )
649 ; uid == UID_FLOOR,
uoff
=
UOFF_FLOOR, 
650 ; 不依赖 uid 和 uoff 的定义,无跳表,大量比较
651 ; 处理了player的方向dir
652 ; BOX + DEST或BOX + FLOOR 按BOX处理,所以注意测试顺序
653 convUid2Uoff :
654 push bp
655 mov bp, sp
656 mov ax, [bp + 4 ]
657 .SPACE :
658 test ax, UID_SPACE
659 jz .BOX
660 mov ax, UOFF_SPACE
661 jmp .EXIT
662 .BOX :
663 test ax, UID_BOX
664 jz .FLOOR
665 mov ax, UOFF_BOX
666 jmp .EXIT
667 .FLOOR :
668 test ax, UID_FLOOR
669 jz .WALL
670 mov ax, UOFF_FLOOR
671 jmp .EXIT
672 .WALL :
673 test ax, UID_WALL
674 jz .DEST
675 mov ax, UOFF_WALL
676 jmp .EXIT
677 .DEST :
678 test ax, UID_DEST
679 jz .PLAYER
680 mov ax, UOFF_DEST
681 jmp .EXIT
682 .PLAYER :
683 test ax, UID_PLAYER
684 jz .ELSE
685 mov al, [dir]
686 .UP :
687 cmp al, DIR_UP
688 jne .DOWN
689 mov ax, UOFF_PLAYER_UP
690 jmp .EXIT
691 .DOWN :
692 cmp al, DIR_DOWN
693 jne .LEFT
694 mov ax, UOFF_PLAYER_DOWN
695 jmp .EXIT
696 .LEFT :
697 cmp al, DIR_LEFT
698 jne .RIGHT
699 mov ax, UOFF_PLAYER_LEFT
700 jmp .EXIT
701 .RIGHT :
702 cmp al, DIR_RIGHT
703 jne .ELSE
704 mov ax, UOFF_PLAYER_RIGHT
705 jmp .EXIT
706 .ELSE :
707 mov ax, UOFF_SPACE
708 .EXIT :
709 mov sp, bp
710 pop bp
711 ret
712
713 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
714 ; func void drawUoff( uoff, xp, yp )
715 ; 绘制像素点为(xp,yp)且地图单元位图偏移为uoff的单元点
716 ; off == UOFF_SPACE, UOFF_FLOOR,
717 drawUoff :
718 ; 悲剧!!!!
719 push bp
720 mov bp, sp
721 push si
722 push di
723 push es
724
725 mov si, [bp + 4 ]
726
727 mov cx, VIDEO_SEG
728 mov es, cx
729
730 mov ax, [bp + 8 ]
731 sub ax, UNIT_VERT_P
732 inc ax
733 mov cx, VIDEO_HORZ_P
734 mul cx
735 mov bx, [bp + 6 ]
736 sub bx, UNIT_HORZ_P
737 inc bx
738 add ax, bx
739 mov di, ax
740
741 mov cx, UNIT_VERT_P
742 .drawUoff1 :
743 push cx
744
745 mov cx, UNIT_HORZ_P
746 .drawUoff2 :
747 mov al, [ds:si]
748 test al, al
749 jz .drawUoff3
750 mov [es:di], al
751 .drawUoff3 :
752 inc si
753 inc di
754 loop .drawUoff2
755
756 sub di, UNIT_HORZ_P
757 add di, VIDEO_HORZ_P
758 pop cx
759 loop .drawUoff1
760
761 pop es
762 pop di
763 pop si
764 mov sp, bp
765 pop bp
766 ret
767
768 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
769 ; func ax peekKey()
770 ; 获取键盘输入,不阻塞
771 ; 若无输入返回 VK_NULL
772 ; 若有输入,取出,且不将其从缓冲区中清除
773 peekKey :
774 mov ah, 1
775 int 0x16
776 jz .VK_NULL
777 push ax
778 call convKey2Vk
779 add sp, 2
780 jmp .EXIT
781 .VK_NULL :
782 mov ax, VK_NULL
783 .EXIT :
784 ret
785
786 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
787 ; func ax getKey()
788 ; 获取键盘输入,阻塞
789 ; 若无输入,阻塞
790 ; 若有输入,取出,且将其从缓冲区中清除
791 getKey :
792 mov ah, 0
793 int 0x16
794 push ax
795 call convKey2Vk
796 add sp, 2
797 cmp ax, VK_NULL
798 je getKey
799 ret
800
801 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
802 ; func ax convKey2Vk( bios_ax )
803 ; 将BIOS键盘输入转换为虚拟键码
804 ; 不依赖任何编码,大量比较
805 convKey2Vk :
806 push bp
807 mov bp, sp
808 mov ax, [bp + 4 ]
809
810 cmp al, ' W '
811 je .VK_W
812 cmp al, ' w '
813 je .VK_W
814
815 cmp al, ' A '
816 je .VK_A
817 cmp al, ' a '
818 je .VK_A
819
820 cmp al, ' S '
821 je .VK_S
822 cmp al, ' s '
823 je .VK_S
824
825 cmp al, ' D '
826 je .VK_D
827 cmp al, ' d '
828 je .VK_D
829
830 cmp al, ' Q '
831 je .VK_Q
832 cmp al, ' q '
833 je .VK_Q
834
835 cmp al, ' R '
836 je .VK_R
837 cmp al, ' r '
838 je .VK_R
839
840 jmp .VK_NULL
841 .VK_W :
842 mov ax, VK_W
843 jmp .EXIT
844 .VK_A :
845 mov ax, VK_A
846 jmp .EXIT
847 .VK_S :
848 mov ax, VK_S
849 jmp .EXIT
850 .VK_D :
851 mov ax, VK_D
852 jmp .EXIT
853 .VK_Q :
854 mov ax, VK_Q
855 jmp .EXIT
856 .VK_R :
857 mov ax, VK_R
858 jmp .EXIT
859 .VK_NULL :
860 mov ax, VK_NULL
861 .EXIT :
862 mov sp, bp
863 pop bp
864 ret
865
866 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
867 ; func void sleep( t )
868 ; 等待 t 毫秒,等待中的输入被清除(清空输入缓冲区)
869 ; 移动动画使用
870 sleep :
871 ret
872
873 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
874 ; 调色板
875 BOX_PAL :
876 ; r g b
877 db 63 , 63 , 00 ; 00 透明色
878 ; SPACE
879 db 00 , 00 , 00 ; 01 背景色
880 db 00 , 00 , 00 ; 02
881 db 00 , 00 , 00 ; 03
882 db 00 , 00 , 00 ; 04
883 db 00 , 00 , 00 ; 05
884 ; FLOOR
885 db 16 , 22 , 28 ; 06
886 db 21 , 26 , 32 ; 07
887 db 00 , 07 , 15 ; 08
888 db 00 , 00 , 00 ; 09
889 db 00 , 00 , 00 ; 10
890 ; WALL
891 db 00 , 07 , 15 ; 11
892 db 63 , 63 , 63 ; 12
893 db 14 , 20 , 22 ; 13
894 db 30 , 31 , 38 ; 14
895 db 37 , 42 , 45 ; 15
896 ; BOX
897 db 60 , 60 , 60 ; 16
898 db 25 , 30 , 06 ; 17
899 db 44 , 47 , 21 ; 18
900 db 55 , 56 , 37 ; 19
901 db 00 , 07 , 15 ; 20
902 ; DEST
903 db 60 , 60 , 30 ; 21
904 db 00 , 07 , 15 ; 22
905 db 00 , 00 , 00 ; 23
906 db 00 , 00 , 00 ; 24
907 db 00 , 00 , 00 ; 25
908 ; PLAYER
909 db 00 , 07 , 15 ; 26
910 db 60 , 60 , 60 ; 27
911 db 00 , 00 , 00 ; 28
912 db 60 , 44 , 62 ; 29
913 db 63 , 28 , 62 ; 30
914 db 00 , 32 , 63 ; 31
915 db 00 , 00 , 00 ; 32
916 db 00 , 00 , 00 ; 33
917 BOX_PAL_NUM : equ $ - BOX_PAL
918
919 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
920 ; func void initVideo()
921 ; 初始化显示方式
922 initVideo :
923 ; 设置显示方式
924 mov ax, 0x0013
925 int 0x10
926
927 ; 设置调色板
928 xor bx, bx ; rgbrgbrgb
929 xor cx, cx ; index 0
930 .iVset :
931 cmp bx, BOX_PAL_NUM
932 je .iVexit
933
934 ; 调色板 index
935 mov dx, VIDEO_PAL_PORT
936 mov ax, cx
937 out dx, al
938 inc cx
939
940 ; 调色板颜色
941 mov dx, VIDEO_COL_PORT
942 mov al, [ds:BOX_PAL + bx]
943 out dx, al
944 inc bx
945 mov al, [ds:BOX_PAL + bx]
946 out dx, al
947 inc bx
948 mov al, [ds:BOX_PAL + bx]
949 out dx, al
950 inc bx
951
952 jmp .iVset
953 .iVexit :
954 ret
955
956 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
957 ; 地图单元位图
958 ; (繁琐的工作,还好有 Vim + 自制的MageX )
959 UOFF_SPACE :
960 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
961 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
962 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
963 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
964 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
965 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
966 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
967 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
968 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
969 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
970 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
971 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
972 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
973 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
974 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
975 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
976 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
977 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
978 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
979 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
980 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
981 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
982 UOFF_FLOOR :
983 db 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08
984 db 08 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 08
985 db 08 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 08
986 db 08 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 08
987 db 08 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 08
988 db 08 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 08
989 db 08 , 06 , 06 , 06 , 06 , 06 , 07 , 07 , 07 , 07 , 06 , 06 , 07 , 07 , 07 , 07 , 06 , 06 , 06 , 06 , 06 , 08
990 db 08 , 06 , 06 , 06 , 06 , 06 , 07 , 07 , 07 , 07 , 06 , 06 , 07 , 07 , 07 , 07 , 06 , 06 , 06 , 06 , 06 , 08
991 db 08 , 06 , 06 , 06 , 06 , 06 , 07 , 07 , 07 , 07 , 06 , 06 , 07 , 07 , 07 , 07 , 06 , 06 , 06 , 06 , 06 , 08
992 db 08 , 06 , 06 , 06 , 06 , 06 , 07 , 07 , 07 , 07 , 06 , 06 , 07 , 07 , 07 , 07 , 06 , 06 , 06 , 06 , 06 , 08
993 db 08 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 08
994 db 08 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 08
995 db 08 , 06 , 06 , 06 , 06 , 06 , 07 , 07 , 07 , 07 , 06 , 06 , 07 , 07 , 07 , 07 , 06 , 06 , 06 , 06 , 06 , 08
996 db 08 , 06 , 06 , 06 , 06 , 06 , 07 , 07 , 07 , 07 , 06 , 06 , 07 , 07 , 07 , 07 , 06 , 06 , 06 , 06 , 06 , 08
997 db 08 , 06 , 06 , 06 , 06 , 06 , 07 , 07 , 07 , 07 , 06 , 06 , 07 , 07 , 07 , 07 , 06 , 06 , 06 , 06 , 06 , 08
998 db 08 , 06 , 06 , 06 , 06 , 06 , 07 , 07 , 07 , 07 , 06 , 06 , 07 , 07 , 07 , 07 , 06 , 06 , 06 , 06 , 06 , 08
999 db 08 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 08
1000 db 08 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 08
1001 db 08 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 08
1002 db 08 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 08
1003 db 08 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 08
1004 db 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08
1005 UOFF_WALL :
1006 db 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11
1007 db 11 , 12 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 13 , 11
1008 db 11 , 12 , 12 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 13 , 13 , 11
1009 db 11 , 12 , 12 , 12 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 13 , 13 , 13 , 11
1010 db 11 , 12 , 12 , 12 , 12 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 13 , 13 , 13 , 13 , 11
1011 db 11 , 12 , 12 , 12 , 12 , 12 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 13 , 13 , 13 , 13 , 13 , 11
1012 db 11 , 12 , 12 , 12 , 12 , 12 , 12 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 13 , 13 , 13 , 13 , 13 , 13 , 11
1013 db 11 , 12 , 12 , 12 , 12 , 12 , 12 , 12 , 14 , 14 , 14 , 14 , 14 , 14 , 13 , 13 , 13 , 13 , 13 , 13 , 13 , 11
1014 db 11 , 12 , 12 , 12 , 12 , 12 , 12 , 12 , 12 , 14 , 14 , 14 , 14 , 13 , 13 , 13 , 13 , 13 , 13 , 13 , 13 , 11
1015 db 11 , 12 , 12 , 12 , 12 , 12 , 12 , 12 , 12 , 12 , 14 , 14 , 13 , 13 , 13 , 13 , 13 , 13 , 13 , 13 , 13 , 11
1016 db 11 , 12 , 12 , 12 , 12 , 12 , 12 , 12 , 12 , 12 , 12 , 13 , 13 , 13 , 13 , 13 , 13 , 13 , 13 , 13 , 13 , 11
1017 db 11 , 12 , 12 , 12 , 12 , 12 , 12 , 12 , 12 , 12 , 12 , 13 , 13 , 13 , 13 , 13 , 13 , 13 , 13 , 13 , 13 , 11
1018 db 11 , 12 , 12 , 12 , 12 , 12 , 12 , 12 , 12 , 12 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 11
1019 db 11 , 12 , 12 , 12 , 12 , 12 , 12 , 12 , 12 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 11
1020 db 11 , 12 , 12 , 12 , 12 , 12 , 12 , 12 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 11
1021 db 11 , 12 , 12 , 12 , 12 , 12 , 12 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 11
1022 db 11 , 12 , 12 , 12 , 12 , 12 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 11
1023 db 11 , 12 , 12 , 12 , 12 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 11
1024 db 11 , 12 , 12 , 12 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 11
1025 db 11 , 12 , 12 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 11
1026 db 11 , 12 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 11
1027 db 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11
1028 UOFF_BOX :
1029 db 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20
1030 db 20 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 18 , 18 , 18 , 18 , 18 , 18 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 20
1031 db 20 , 06 , 06 , 06 , 06 , 06 , 18 , 18 , 16 , 16 , 16 , 16 , 18 , 18 , 18 , 18 , 06 , 06 , 06 , 06 , 06 , 20
1032 db 20 , 06 , 06 , 06 , 18 , 18 , 16 , 16 , 16 , 16 , 16 , 16 , 16 , 16 , 18 , 18 , 18 , 18 , 06 , 06 , 06 , 20
1033 db 20 , 06 , 06 , 18 , 18 , 16 , 16 , 16 , 16 , 16 , 16 , 16 , 16 , 16 , 16 , 16 , 16 , 18 , 18 , 06 , 06 , 20
1034 db 20 , 06 , 06 , 18 , 16 , 16 , 16 , 16 , 16 , 16 , 17 , 16 , 16 , 16 , 16 , 16 , 16 , 18 , 18 , 06 , 06 , 20
1035 db 20 , 06 , 18 , 18 , 16 , 16 , 16 , 16 , 16 , 16 , 17 , 17 , 16 , 16 , 16 , 16 , 18 , 18 , 18 , 18 , 06 , 20
1036 db 20 , 06 , 18 , 18 , 18 , 16 , 16 , 16 , 16 , 17 , 17 , 17 , 17 , 18 , 16 , 18 , 18 , 18 , 18 , 18 , 06 , 20
1037 db 20 , 18 , 18 , 18 , 18 , 18 , 16 , 16 , 16 , 17 , 17 , 17 , 17 , 18 , 18 , 18 , 18 , 18 , 18 , 18 , 18 , 20
1038 db 20 , 18 , 18 , 18 , 18 , 18 , 18 , 17 , 17 , 17 , 17 , 17 , 17 , 17 , 17 , 18 , 18 , 18 , 18 , 18 , 18 , 20
1039 db 20 , 18 , 18 , 18 , 18 , 18 , 17 , 17 , 17 , 17 , 17 , 17 , 17 , 17 , 17 , 17 , 17 , 18 , 18 , 18 , 18 , 20
1040 db 20 , 18 , 18 , 18 , 18 , 17 , 17 , 17 , 17 , 17 , 17 , 17 , 17 , 17 , 17 , 17 , 18 , 18 , 18 , 18 , 18 , 20
1041 db 20 , 18 , 18 , 18 , 18 , 18 , 18 , 17 , 17 , 17 , 17 , 17 , 17 , 17 , 17 , 18 , 18 , 18 , 18 , 18 , 18 , 20
1042 db 20 , 18 , 18 , 18 , 18 , 18 , 18 , 18 , 18 , 17 , 17 , 17 , 17 , 18 , 18 , 19 , 19 , 18 , 18 , 18 , 18 , 20
1043 db 20 , 06 , 18 , 18 , 18 , 18 , 18 , 18 , 18 , 17 , 17 , 17 , 17 , 18 , 19 , 19 , 19 , 18 , 18 , 18 , 06 , 20
1044 db 20 , 06 , 18 , 18 , 18 , 18 , 18 , 18 , 18 , 18 , 17 , 17 , 18 , 19 , 19 , 19 , 19 , 18 , 18 , 18 , 06 , 20
1045 db 20 , 06 , 06 , 18 , 18 , 18 , 18 , 18 , 18 , 19 , 19 , 17 , 18 , 19 , 19 , 19 , 18 , 18 , 18 , 06 , 06 , 20
1046 db 20 , 06 , 06 , 18 , 18 , 18 , 18 , 18 , 19 , 19 , 19 , 19 , 19 , 19 , 19 , 18 , 18 , 18 , 18 , 06 , 06 , 20
1047 db 20 , 06 , 06 , 06 , 18 , 18 , 18 , 19 , 19 , 19 , 19 , 19 , 19 , 19 , 18 , 18 , 18 , 18 , 06 , 06 , 06 , 20
1048 db 20 , 06 , 06 , 06 , 06 , 06 , 18 , 18 , 18 , 18 , 18 , 18 , 18 , 18 , 18 , 18 , 06 , 06 , 06 , 06 , 06 , 20
1049 db 20 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 18 , 18 , 18 , 18 , 18 , 18 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 20
1050 db 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20
1051 UOFF_DEST :
1052 db 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22
1053 db 22 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 22
1054 db 22 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 22
1055 db 22 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 21 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 22
1056 db 22 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 21 , 21 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 22
1057 db 22 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 21 , 21 , 21 , 21 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 22
1058 db 22 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 21 , 21 , 21 , 21 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 22
1059 db 22 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 21 , 21 , 21 , 21 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 22
1060 db 22 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 21 , 21 , 21 , 21 , 21 , 21 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 22
1061 db 22 , 06 , 06 , 06 , 06 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 06 , 06 , 06 , 06 , 22
1062 db 22 , 06 , 06 , 06 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 06 , 06 , 22
1063 db 22 , 06 , 06 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 06 , 06 , 06 , 22
1064 db 22 , 06 , 06 , 06 , 06 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 06 , 06 , 06 , 06 , 22
1065 db 22 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 21 , 21 , 21 , 21 , 21 , 21 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 22
1066 db 22 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 21 , 21 , 21 , 21 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 22
1067 db 22 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 21 , 21 , 21 , 21 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 22
1068 db 22 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 21 , 21 , 21 , 21 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 22
1069 db 22 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 21 , 21 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 22
1070 db 22 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 21 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 22
1071 db 22 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 22
1072 db 22 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 22
1073 db 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22
1074 UOFF_PLAYER_UP :
1075 db 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26
1076 db 26 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 26
1077 db 26 , 06 , 06 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 06 , 06 , 26
1078 db 26 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 26
1079 db 26 , 06 , 06 , 29 , 29 , 29 , 29 , 31 , 31 , 29 , 29 , 29 , 29 , 31 , 31 , 29 , 29 , 29 , 29 , 06 , 06 , 26
1080 db 26 , 06 , 06 , 29 , 29 , 29 , 31 , 27 , 27 , 31 , 29 , 29 , 31 , 27 , 27 , 31 , 29 , 29 , 29 , 06 , 06 , 26
1081 db 26 , 06 , 29 , 29 , 29 , 31 , 28 , 28 , 31 , 31 , 31 , 31 , 28 , 28 , 31 , 31 , 31 , 29 , 29 , 29 , 06 , 26
1082 db 26 , 06 , 29 , 29 , 27 , 31 , 31 , 31 , 31 , 31 , 27 , 31 , 31 , 31 , 31 , 31 , 31 , 27 , 29 , 29 , 06 , 26
1083 db 26 , 29 , 29 , 29 , 27 , 27 , 31 , 31 , 31 , 31 , 27 , 27 , 31 , 31 , 31 , 31 , 27 , 27 , 29 , 29 , 29 , 26
1084 db 26 , 29 , 29 , 29 , 27 , 27 , 27 , 31 , 31 , 27 , 27 , 27 , 27 , 31 , 31 , 27 , 27 , 27 , 29 , 29 , 29 , 26
1085 db 26 , 29 , 29 , 29 , 29 , 27 , 27 , 27 , 27 , 27 , 30 , 30 , 27 , 27 , 27 , 27 , 27 , 29 , 29 , 29 , 29 , 26
1086 db 26 , 29 , 29 , 29 , 29 , 27 , 27 , 27 , 27 , 27 , 30 , 30 , 27 , 27 , 27 , 27 , 27 , 29 , 29 , 29 , 29 , 26
1087 db 26 , 29 , 29 , 29 , 29 , 29 , 27 , 27 , 27 , 30 , 30 , 30 , 30 , 27 , 27 , 27 , 29 , 29 , 29 , 29 , 29 , 26
1088 db 26 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 27 , 30 , 30 , 30 , 30 , 27 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 26
1089 db 26 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 26
1090 db 26 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 30 , 30 , 29 , 29 , 06 , 26
1091 db 26 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 30 , 30 , 29 , 29 , 29 , 06 , 06 , 26
1092 db 26 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 30 , 30 , 30 , 30 , 30 , 30 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 26
1093 db 26 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 26
1094 db 26 , 06 , 06 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 06 , 06 , 26
1095 db 26 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 26
1096 db 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26
1097 UOFF_PLAYER_DOWN :
1098 db 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26
1099 db 26 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 26
1100 db 26 , 06 , 06 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 06 , 06 , 26
1101 db 26 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 26
1102 db 26 , 06 , 06 , 29 , 29 , 29 , 29 , 31 , 31 , 29 , 29 , 29 , 29 , 31 , 31 , 29 , 29 , 29 , 29 , 06 , 06 , 26
1103 db 26 , 06 , 06 , 29 , 29 , 29 , 31 , 27 , 27 , 31 , 29 , 29 , 31 , 27 , 27 , 31 , 29 , 29 , 29 , 06 , 06 , 26
1104 db 26 , 06 , 29 , 29 , 29 , 31 , 28 , 28 , 31 , 31 , 31 , 31 , 28 , 28 , 31 , 31 , 31 , 29 , 29 , 29 , 06 , 26
1105 db 26 , 06 , 29 , 29 , 27 , 31 , 31 , 31 , 31 , 31 , 27 , 31 , 31 , 31 , 31 , 31 , 31 , 27 , 29 , 29 , 06 , 26
1106 db 26 , 29 , 29 , 29 , 27 , 27 , 31 , 31 , 31 , 31 , 27 , 27 , 31 , 31 , 31 , 31 , 27 , 27 , 29 , 29 , 29 , 26
1107 db 26 , 29 , 29 , 29 , 27 , 27 , 27 , 31 , 31 , 27 , 27 , 27 , 27 , 31 , 31 , 27 , 27 , 27 , 29 , 29 , 29 , 26
1108 db 26 , 29 , 29 , 29 , 29 , 27 , 27 , 27 , 27 , 27 , 30 , 30 , 27 , 27 , 27 , 27 , 27 , 29 , 29 , 29 , 29 , 26
1109 db 26 , 29 , 29 , 29 , 29 , 27 , 27 , 27 , 27 , 27 , 30 , 30 , 27 , 27 , 27 , 27 , 27 , 29 , 29 , 29 , 29 , 26
1110 db 26 , 29 , 29 , 29 , 29 , 29 , 27 , 27 , 27 , 30 , 30 , 30 , 30 , 27 , 27 , 27 , 29 , 29 , 29 , 29 , 29 , 26
1111 db 26 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 27 , 30 , 30 , 30 , 30 , 27 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 26
1112 db 26 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 26
1113 db 26 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 30 , 30 , 29 , 29 , 06 , 26
1114 db 26 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 30 , 30 , 29 , 29 , 29 , 06 , 06 , 26
1115 db 26 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 30 , 30 , 30 , 30 , 30 , 30 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 26
1116 db 26 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 26
1117 db 26 , 06 , 06 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 06 , 06 , 26
1118 db 26 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 26
1119 db 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26
1120 UOFF_PLAYER_LEFT :
1121 db 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26
1122 db 26 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 26
1123 db 26 , 06 , 06 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 06 , 06 , 26
1124 db 26 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 26
1125 db 26 , 06 , 06 , 29 , 29 , 29 , 29 , 31 , 31 , 29 , 29 , 29 , 29 , 31 , 31 , 29 , 29 , 29 , 29 , 06 , 06 , 26
1126 db 26 , 06 , 06 , 29 , 29 , 29 , 31 , 27 , 27 , 31 , 29 , 29 , 31 , 27 , 27 , 31 , 29 , 29 , 29 , 06 , 06 , 26
1127 db 26 , 06 , 29 , 29 , 29 , 31 , 28 , 28 , 31 , 31 , 31 , 31 , 28 , 28 , 31 , 31 , 31 , 29 , 29 , 29 , 06 , 26
1128 db 26 , 06 , 29 , 29 , 27 , 31 , 31 , 31 , 31 , 31 , 27 , 31 , 31 , 31 , 31 , 31 , 31 , 27 , 29 , 29 , 06 , 26
1129 db 26 , 29 , 29 , 29 , 27 , 27 , 31 , 31 , 31 , 31 , 27 , 27 , 31 , 31 , 31 , 31 , 27 , 27 , 29 , 29 , 29 , 26
1130 db 26 , 29 , 29 , 29 , 27 , 27 , 27 , 31 , 31 , 27 , 27 , 27 , 27 , 31 , 31 , 27 , 27 , 27 , 29 , 29 , 29 , 26
1131 db 26 , 29 , 29 , 29 , 29 , 27 , 27 , 27 , 27 , 27 , 30 , 30 , 27 , 27 , 27 , 27 , 27 , 29 , 29 , 29 , 29 , 26
1132 db 26 , 29 , 29 , 29 , 29 , 27 , 27 , 27 , 27 , 27 , 30 , 30 , 27 , 27 , 27 , 27 , 27 , 29 , 29 , 29 , 29 , 26
1133 db 26 , 29 , 29 , 29 , 29 , 29 , 27 , 27 , 27 , 30 , 30 , 30 , 30 , 27 , 27 , 27 , 29 , 29 , 29 , 29 , 29 , 26
1134 db 26 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 27 , 30 , 30 , 30 , 30 , 27 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 26
1135 db 26 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 26
1136 db 26 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 30 , 30 , 29 , 29 , 06 , 26
1137 db 26 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 30 , 30 , 29 , 29 , 29 , 06 , 06 , 26
1138 db 26 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 30 , 30 , 30 , 30 , 30 , 30 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 26
1139 db 26 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 26
1140 db 26 , 06 , 06 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 06 , 06 , 26
1141 db 26 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 26
1142 db 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26
1143 UOFF_PLAYER_RIGHT :
1144 db 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26
1145 db 26 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 26
1146 db 26 , 06 , 06 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 06 , 06 , 26
1147 db 26 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 26
1148 db 26 , 06 , 06 , 29 , 29 , 29 , 29 , 31 , 31 , 29 , 29 , 29 , 29 , 31 , 31 , 29 , 29 , 29 , 29 , 06 , 06 , 26
1149 db 26 , 06 , 06 , 29 , 29 , 29 , 31 , 27 , 27 , 31 , 29 , 29 , 31 , 27 , 27 , 31 , 29 , 29 , 29 , 06 , 06 , 26
1150 db 26 , 06 , 29 , 29 , 29 , 31 , 28 , 28 , 31 , 31 , 31 , 31 , 28 , 28 , 31 , 31 , 31 , 29 , 29 , 29 , 06 , 26
1151 db 26 , 06 , 29 , 29 , 27 , 31 , 31 , 31 , 31 , 31 , 27 , 31 , 31 , 31 , 31 , 31 , 31 , 27 , 29 , 29 , 06 , 26
1152 db 26 , 29 , 29 , 29 , 27 , 27 , 31 , 31 , 31 , 31 , 27 , 27 , 31 , 31 , 31 , 31 , 27 , 27 , 29 , 29 , 29 , 26
1153 db 26 , 29 , 29 , 29 , 27 , 27 , 27 , 31 , 31 , 27 , 27 , 27 , 27 , 31 , 31 , 27 , 27 , 27 , 29 , 29 , 29 , 26
1154 db 26 , 29 , 29 , 29 , 29 , 27 , 27 , 27 , 27 , 27 , 30 , 30 , 27 , 27 , 27 , 27 , 27 , 29 , 29 , 29 , 29 , 26
1155 db 26 , 29 , 29 , 29 , 29 , 27 , 27 , 27 , 27 , 27 , 30 , 30 , 27 , 27 , 27 , 27 , 27 , 29 , 29 , 29 , 29 , 26
1156 db 26 , 29 , 29 , 29 , 29 , 29 , 27 , 27 , 27 , 30 , 30 , 30 , 30 , 27 , 27 , 27 , 29 , 29 , 29 , 29 , 29 , 26
1157 db 26 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 27 , 30 , 30 , 30 , 30 , 27 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 26
1158 db 26 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 26
1159 db 26 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 30 , 30 , 29 , 29 , 06 , 26
1160 db 26 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 30 , 30 , 29 , 29 , 29 , 06 , 06 , 26
1161 db 26 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 30 , 30 , 30 , 30 , 30 , 30 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 26
1162 db 26 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 26
1163 db 26 , 06 , 06 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 06 , 06 , 26
1164 db 26 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 26
1165 db 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26
1166
1167 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1168 ; 变量
1169 level : db 1
1170 ; 当前地图
1171 MAP_CUR :
1172 times MAP_U db 0
1173 orgx_p : db 0
1174 orgy_p : db 0
1175 px_u : db 0
1176 py_u : db 0
1177 dir : db 0
1178 MAP_SIZE : equ $ - MAP_CUR
1179
1180 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1181 ; 地图,级别从低到高按顺序,相对 MAP_CUR 定位
1182
1183 % define SPACE UID_SPACE
1184 % define FLOOR UID_FLOOR
1185 % define WALL UID_WALL
1186 % define DEST UID_DEST
1187 % define BOX (UID_FLOOR | UID_BOX)
1188 % define BOXDE (UID_DEST | UID_BOX)
1189 % define PLAYE UID_FLOOR
1190
1191 MAP_LEVEL_1 :
1192 db SPACE, SPACE, WALL, WALL, WALL, SPACE, SPACE, SPACE
1193 db SPACE, SPACE, WALL, DEST, WALL, SPACE, SPACE, SPACE
1194 db SPACE, SPACE, WALL, FLOOR, WALL, WALL, WALL, WALL
1195 db WALL, WALL, WALL, BOX, FLOOR, BOX, DEST, WALL
1196 db WALL, DEST, FLOOR, BOX, FLOOR, WALL, WALL, WALL
1197 db WALL, WALL, WALL, WALL, BOX, WALL, SPACE, SPACE
1198 db SPACE, SPACE, SPACE, WALL, DEST, WALL, SPACE, SPACE
1199 db SPACE, SPACE, SPACE, WALL, WALL, WALL, SPACE, SPACE
1200 db 90 , 30 , 4 , 4 , DIR_UP
1201
1202 MAP_LEVEL_2 :
1203 db SPACE, SPACE, WALL, WALL, WALL, WALL, SPACE, SPACE
1204 db SPACE, WALL, WALL, FLOOR, FLOOR, WALL, SPACE, SPACE
1205 db SPACE, WALL, FLOOR, BOX, FLOOR, WALL, SPACE, SPACE
1206 db SPACE, WALL, WALL, BOX, FLOOR, WALL, WALL, SPACE
1207 db SPACE, WALL, WALL, FLOOR, BOX, FLOOR, WALL, SPACE
1208 db SPACE, WALL, DEST, BOX, FLOOR, FLOOR, WALL, SPACE
1209 db SPACE, WALL, DEST, DEST, BOXDE, DEST, WALL, SPACE
1210 db SPACE, WALL, WALL, WALL, WALL, WALL, WALL, SPACE
1211 db 90 , 30 , 2 , 2 , DIR_UP
1212
1213 MAP_LEVEL_3 :
1214 db SPACE, WALL, WALL, WALL, WALL, WALL, SPACE, SPACE
1215 db SPACE, WALL, FLOOR, FLOOR, WALL, WALL, WALL, SPACE
1216 db SPACE, WALL, FLOOR, BOX, FLOOR, FLOOR, WALL, SPACE
1217 db WALL, WALL, WALL, FLOOR, WALL, FLOOR, WALL, WALL
1218 db WALL, DEST, WALL, FLOOR, WALL, FLOOR, FLOOR, WALL
1219 db WALL, DEST, BOX, FLOOR, FLOOR, WALL, FLOOR, WALL
1220 db WALL, DEST, FLOOR, FLOOR, FLOOR, BOX, FLOOR, WALL
1221 db WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL
1222 db 90 , 30 , 2 , 2 , DIR_UP
1223
1224 MAP_LEVEL_4 :
1225 db SPACE, SPACE, WALL, WALL, WALL, WALL, WALL, WALL
1226 db SPACE, WALL, WALL, FLOOR, FLOOR, WALL, FLOOR, FLOOR
1227 db SPACE, WALL, FLOOR, FLOOR, FLOOR, WALL, FLOOR, FLOOR
1228 db SPACE, WALL, BOX, FLOOR, BOX, FLOOR, BOX, FLOOR
1229 db SPACE, WALL, FLOOR, BOX, WALL, WALL, FLOOR, FLOOR
1230 db WALL, WALL, FLOOR, BOX, FLOOR, WALL, FLOOR, WALL
1231 db DEST, DEST, DEST, DEST, DEST, FLOOR, FLOOR, WALL
1232 db WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL
1233 db 90 , 30 , 7 , 1 , DIR_UP
1234
1235 MAP_LEVEL_COMPELETE :
1236 db FLOOR, FLOOR, FLOOR, SPACE, SPACE, FLOOR, FLOOR, SPACE
1237 db FLOOR, SPACE, SPACE, SPACE, SPACE, FLOOR, SPACE, FLOOR
1238 db FLOOR, SPACE, SPACE, SPACE, SPACE, FLOOR, SPACE, FLOOR
1239 db FLOOR, FLOOR, FLOOR, SPACE, SPACE, FLOOR, SPACE, FLOOR
1240 db FLOOR, SPACE, SPACE, SPACE, SPACE, FLOOR, SPACE, FLOOR
1241 db FLOOR, SPACE, SPACE, SPACE, SPACE, FLOOR, SPACE, FLOOR
1242 db FLOOR, FLOOR, FLOOR, SPACE, SPACE, FLOOR, FLOOR, SPACE
1243 db SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE
1244 db 95 , 40 , 1 , 3 , DIR_UP
1245
2 ; 推箱子,运行不需操作系统,自有引导扇区,软盘引导
3 ; 玩法:W S A D 上下左右,Q 退出,R 重玩当前一关
4 ; zj QQ: 466577437
5 ; 初学汇编,求师友
6
7
8 ; NASM 16位 实模式
9 ; Ubuntu
10 ; nasm - o box.bin box.s
11 ; sudo dd if = box.bin of =/ dev / fd0 bs = 512 count = 15 conv = notrunc
12 ; Bochs 模拟
13
14
15 ; 函数调用约定
16 ; 参数从右向左压栈,由调用函数平衡栈
17 ; 被调用函数返回后与调用前相比,栈中元素及栈大小不改变
18 ; 被调用方不维护 ax, bx, cx, dx,但保证维护其它寄存器
19 ; 函数返回值 ax, bx, cx, dx
20
21
22 ; 代码为将来改进做好了准备(常数, 变量 和 未实现的函数)
23 ; 如 人物各方向不同,移动动画,使用斜视图实现3D效果
24
25
26 ; 常数
27 ; 程序占用扇区总数,不超过 0xFFFF 字节
28 % define SEC_NUM 15
29 ; 每个扇区大小 字节
30 % define SEC_SIZE 0x200
31 ; 显示
32 % define VIDEO_ID 0x13
33 % define VIDEO_HORZ_P 320
34 % define VIDEO_VERT_P 200
35 % define VIDEO_P (VIDEO_HORZ_P * VIDEO_VERT_P)
36 % define VIDEO_SEG 0xA000
37 % define VIDEO_PAL_PORT 0x03C8
38 % define VIDEO_COL_PORT 0x03C9
39 ; 栈,考虑对齐
40 % define STACK_TOP 0xFF00
41 % define STACK_SEG 0x8000
42 ; 引导
43 % define BOOT_SEG 0x7C0
44 ; 级别总数(级别为 1 .. LEVEL_MAX )
45 % define LEVEL_MAX 4
46 ; 按键虚拟键码
47 % define VK_NULL 0xFFFF
48 % define VK_W ( ' W ' )
49 % define VK_A ( ' A ' )
50 % define VK_S ( ' S ' )
51 % define VK_D ( ' D ' )
52 % define VK_Q ( ' Q ' )
53 % define VK_R ( ' R ' )
54 ; 游戏状态
55 % define GS_WIN 0x1
56 % define GS_QUIT 0x2
57 % define GS_REPLAY 0x3
58
59
60 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
61 ; 设置
62 [bits 16 ]
63 ; org 0x7C00
64
65 ; 初始化 cs, ip
66 jmp BOOT_SEG : BOOT
67 BOOT :
68 ; 初始化段寄存器
69 mov ax, cs
70 mov ds, ax
71 mov es, ax
72 mov fs, ax
73 mov gs, ax
74 ; 初始化 栈
75 mov ax, STACK_SEG
76 mov ss, ax
77 mov ax, STACK_TOP
78 mov sp, ax
79
80 ; 读入整个程序
81 ; 偷懒,假设要读取的扇区都在 0 磁道,若扇区数增加,需修改此段代码
82 mov ah, 0x2
83 mov al, SEC_NUM
84 dec al
85 ; mov cx, 0x0001 悲剧!!!!
86 mov cx, 0x0002
87 mov dx, 0x0000
88 mov bx, SEC_SIZE
89 int 0x13
90
91 ; 初始化显示方式
92 call initVideo
93
94 ; 跳入 main 执行
95 call main
96
97 ; 跳入 shutdown 关机
98 call shutdown
99
100 times ( 0x200 - 2 - ($ - $$)) db 0
101 db 0x55
102 db 0xAA
103
104
105 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
106 ; 地图
107 ;
108 ; 地图单元
109 ;
110 ; * ------------
111 ; ***** ^
112 ; ********* |
113 ; *************
114 ; | *********|
115 ; | + ***** | UNIT_VERT_P
116 ; |+ * |
117 ; + | +
118 ; + | + |
119 ; + |+ V
120 ; 位置点 --> @ ----------
121 ;
122 ; | |
123 ; | UNIT_HORZ_P |
124 ;
125 ;
126 ;
127 ; 地图布局
128 ; 单元点坐标以单元为单位,常量 * _U
129 ; 像素点坐标以像素为单位,常量 * _P
130 ; 坐标点格式(x,y),先水平,后垂直
131 ; 单元点的像素坐标为其右下角像素的像素坐标
132 ; 水平 MAP_HORZ_U 个单元
133 ; 垂直 MAP_VERT_U 个单元
134 ; 单元点(xu,yu) in [ 0 .. MAP_HORZ_U) * [ 0 .. MAP_VERT_U)
135 ; 像素点(xp,yp) in [ 0 .. VIDEO_HORZ_P) * [ 0 .. VIDEO_VERT_P)
136 ; 二维图片实现3D效果,暂未使用,待扩充
137 ; 绘制从左上角单元开始,至右下角单元结束,实现3D效果
138 ; 地图原点为地图左上角单元(xu = 0 ,yu = 0 )的像素坐标
139 ;
140 ; +--------------------------> xu in [ 0 .. MAP_HORZ_U)
141 ; | xp in [ 0 .. VIDEO_HORZ_P)
142 ; | *
143 ; | * *
144 ; | * *
145 ; yu | * *
146 ; yp | * *
147 ; v ----------* *------------
148 ; | * *|
149 ; DY_HORZ_P | * * | DY_VERT_P
150 ; | * * |
151 ; | * * |
152 ; ----------+-------------- @ ----+-------------
153 ; | | |
154 ; | DX_HORZ_P | |
155 ; | | |
156 ; DX_VERT_P
157 ;
158
159 ; 注意正负号,作为增量
160 % define DX_VERT_P ( 0 )
161 % define DY_VERT_P ( 22 )
162 % define DX_HORZ_P ( 22 )
163 % define DY_HORZ_P ( 0 )
164
165 % define UNIT_HORZ_P ( 22 )
166 % define UNIT_VERT_P ( 22 )
167 % define UNIT_P (UNIT_HORZ_P * UNIT_VERT_P)
168
169 % define MAP_HORZ_U 8
170 % define MAP_VERT_U 8
171 % define MAP_U (MAP_HORZ_U * MAP_VERT_U)
172
173 ; 单元 id,一字节,使用位或,一个单元可以为 BOX + DEST 或BOX + FLOOR
174 % define UID_SPACE 0x01
175 % define UID_FLOOR 0x02
176 % define UID_WALL 0x04
177 % define UID_BOX 0x08
178 % define UID_DEST 0x10
179 % define UID_PLAYER 0x20
180 ; 一字节
181 % define DIR_UP 0x0
182 % define DIR_DOWN 0x1
183 % define DIR_LEFT 0x2
184 % define DIR_RIGHT 0x3
185
186 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
187 ; func void main()
188 ; 主程序
189 main :
190 mov byte [level], 0x1
191 .PLAY :
192 movzx ax, byte [level]
193 cmp ax, LEVEL_MAX
194 ja .COMPLETE
195
196 call initOneLevel
197 call playOneLevel
198
199 cmp ax, GS_QUIT
200 je .QUIT
201 cmp ax, GS_REPLAY
202 je .REPLAY
203 cmp ax, GS_WIN
204 jne .ERR
205 inc byte [level]
206 .REPLAY :
207 jmp .PLAY
208 .COMPLETE :
209 call initOneLevel
210 jmp .EXIT
211 .QUIT :
212 mov byte [level], LEVEL_MAX + 1
213 call initOneLevel
214 jmp .EXIT
215 .ERR :
216 jmp .EXIT
217 .EXIT :
218 ret
219
220 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
221 ; func void shutdown()
222 ; 关机
223 shutdown :
224 ; 暂时死循环吧
225 jmp $
226 ret
227
228 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
229 ; func void initOneLevel()
230 ; 初始化 level 级别
231 initOneLevel :
232 push si
233 push di
234 movzx ax, byte [level]
235 mov cx, MAP_SIZE
236 mul cx
237 mov si, MAP_CUR
238 add si, ax
239 mov di, MAP_CUR
240 cld
241 rep movsb
242 pop di
243 pop si
244 call eraseAll
245 call drawAll
246 ret
247
248 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
249 ; func ax playOneLevel()
250 ; 玩 level 级别
251 ; 返回 GS_WIN GS_REPLAY GS_QUIT
252 playOneLevel :
253 .PLAY :
254 call getKey
255 cmp ax, VK_Q
256 je .QUIT
257 cmp ax, VK_R
258 je .REPLAY
259
260 movzx cx, byte [px_u]
261 movzx dx, byte [py_u]
262 cmp ax, VK_W
263 je .UP
264 cmp ax, VK_S
265 je .DOWN
266 cmp ax, VK_A
267 je .LEFT
268 cmp ax, VK_D
269 je .RIGHT
270 jmp .PLAY
271 .UP :
272 mov byte [dir], DIR_UP
273 sub dx, 2
274 push dx
275 push cx
276 inc dx
277 push dx
278 push cx
279 jmp .TMOVE
280 .DOWN :
281 mov byte [dir], DIR_DOWN
282 add dx, 2
283 push dx
284 push cx
285 dec dx
286 push dx
287 push cx
288 jmp .TMOVE
289 .LEFT :
290 mov byte [dir], DIR_LEFT
291 sub cx, 2
292 push dx
293 push cx
294 inc cx
295 push dx
296 push cx
297 jmp .TMOVE
298 .RIGHT :
299 mov byte [dir], DIR_RIGHT
300 add cx, 2
301 push dx
302 push cx
303 dec cx
304 push dx
305 push cx
306 .TMOVE :
307 ; BOX
308 mov ax, UID_BOX
309 push ax
310 call isUidU
311 add sp, 2
312 test ax, ax
313 jnz .BOX
314 ; FLOOR
315 mov ax, UID_FLOOR
316 push ax
317 call isUidU
318 add sp, 2
319 test ax, ax
320 jnz .WALK
321 ; DEST
322 mov ax, UID_DEST
323 push ax
324 call isUidU
325 add sp, 2
326 test ax, ax
327 jnz .WALK
328 jmp .CANTMOVE
329 .BOX :
330 push bp
331 mov bp, sp
332 mov ax, [bp + 8 ]
333 push ax
334 mov ax, [bp + 6 ]
335 push ax
336 call isInMapU
337 test ax, ax
338 jz .ENDBOX
339 mov ax, UID_BOX
340 push ax
341 call isUidU
342 add sp, 2
343 test ax, ax
344 jnz .ENDBOX
345 mov ax, UID_WALL
346 push ax
347 call isUidU
348 add sp, 2
349 test ax, ax
350 jz .PUSHBOX
351 .ENDBOX :
352 mov sp, bp
353 pop bp
354 add sp, 8
355 jmp .MOVED
356 .PUSHBOX :
357 mov ax, [bp + 8 ]
358 mov cx, MAP_HORZ_U
359 mul cx
360 add ax, [bp + 6 ]
361 push si
362 mov si, MAP_CUR
363 add si, ax
364 ; movzx ax, [si] 悲剧!!!!
365 mov al, [si]
366 xor al, UID_BOX
367 mov [si], al
368 pop si
369 mov ax, [bp + 4 ]
370 mov cx, MAP_HORZ_U
371 mul cx
372 add ax, [bp + 2 ]
373 push si
374 mov si, MAP_CUR
375 add si, ax
376 mov al, [si]
377 xor al, UID_BOX
378 mov [si], al
379 pop si
380 mov ax, [bp + 2 ]
381 mov [px_u], al
382 mov ax, [bp + 4 ]
383 mov [py_u], al
384 jmp .ENDBOX
385 .WALK :
386 pop ax
387 mov [px_u], al
388 pop ax
389 mov [py_u], al
390 add sp, 4
391 jmp .MOVED
392 .CANTMOVE :
393 add sp, 8
394 .MOVED :
395 call drawAll
396 call judgeWin
397 test ax, ax
398 jnz .WIN
399 jmp .PLAY
400 .WIN :
401 mov ax, GS_WIN
402 jmp .EXIT
403 .REPLAY :
404 mov ax, GS_REPLAY
405 jmp .EXIT
406 .QUIT :
407 mov ax, GS_QUIT
408 .EXIT :
409 ret
410
411 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
412 ; func ax isUidU( uid, xu, yu )
413 ; 判断单元点(xu,yu)是否为uid
414 ; ax != 0 是, ax == 0 否
415 ; 若此单元点不在地图中,返回 否
416 isUidU :
417 push bp
418 mov bp, sp
419 mov ax, [bp + 8 ]
420 push ax
421 mov ax, [bp + 6 ]
422 push ax
423 call isInMapU
424 add sp, 4
425 test ax, ax
426 jz .EXIT
427 mov ax, [bp + 8 ]
428 mov cx, MAP_HORZ_U
429 mul cx
430 add ax, [bp + 6 ]
431 push si
432 mov si, MAP_CUR
433 add si, ax
434 movzx ax, byte [si]
435 pop si
436 and ax, [bp + 4 ]
437 .EXIT :
438 mov sp, bp
439 pop bp
440 ret
441
442 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
443 ; func ax isInMapU( xu, yu )
444 ; 判断单元点(xu,yu)是否在地图中(所在点为SPACE算不在地图中)
445 ; ax != 0 在, ax == 0 不在
446 isInMapU :
447 push bp
448 mov bp, sp
449 mov bx, [bp + 4 ]
450 cmp bx, MAP_HORZ_U
451 jae .NO
452 mov ax, [bp + 6 ]
453 cmp ax, MAP_VERT_U
454 jae .NO
455 mov cx, MAP_HORZ_U
456 mul cx
457 add ax, bx
458 push si
459 mov si, MAP_CUR
460 add si, ax
461 mov al, [si]
462 pop si
463 test al, UID_SPACE
464 jnz .NO
465 .YES :
466 mov ax, 1
467 jmp .EXIT
468 .NO :
469 mov ax, 0
470 .EXIT :
471 mov sp, bp
472 pop bp
473 ret
474
475 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
476 ; func ax judgeWin()
477 ; 判断是否胜利,ax == 0 否,ax != 0 胜
478 ; 简单化,扫描整个地图
479 judgeWin :
480 push si
481 mov si, MAP_CUR
482 mov cx, MAP_U
483 .judgeWin :
484 xor bx, bx
485 movzx ax, byte [si]
486 test ax, UID_DEST
487 jz .skip1
488 inc bx
489 .skip1 :
490 test ax, UID_BOX
491 jz .skip2
492 inc bx
493 .skip2 :
494 cmp bx, 1
495 je .LOSE
496 inc si
497 loop .judgeWin
498 .WIN :
499 mov ax, 1
500 jmp .EXIT
501 .LOSE :
502 mov ax, 0
503 .EXIT :
504 pop si
505 ret
506
507 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
508 ; func void eraseAll()
509 ; 清除所有图像
510 eraseAll :
511 mov ax, 01
512 mov cx, VIDEO_P
513 push es
514 mov bx, VIDEO_SEG
515 mov es, bx
516 push di
517 mov di, 0
518 cld
519 rep stosb
520 pop di
521 pop es
522 ret
523
524 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
525 ; func void drawAll()
526 ; 直接重绘地图,无关背景
527 ; 兼容3D效果,从左上角到右下角顺序绘制
528 drawAll :
529 push si
530
531 mov si, MAP_CUR
532 mov bx, 0 ; yu
533 mov cx, MAP_VERT_U
534 .drawAll1 :
535 push cx
536
537 mov ax, 0 ; xu
538 mov cx, MAP_HORZ_U
539 .drawAll2 :
540 push cx
541
542 push bx
543 push ax
544 movzx cx, byte [si]
545 inc si
546 push cx
547 call drawUidU
548 pop cx
549 pop ax
550 pop bx
551
552 inc ax
553 pop cx
554 loop .drawAll2
555
556 inc bx
557 pop cx
558 loop .drawAll1
559
560 pop si
561
562 movzx ax, byte [py_u]
563 push ax
564 movzx ax, byte [px_u]
565 push ax
566 mov ax, UID_PLAYER
567 push ax
568 call drawUidU
569 add sp, 6
570 ret
571
572 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
573 ; func void drawUidU( uid, xu, yu )
574 ; 绘制单元坐标为(xu,yu)的单元uid
575 ; uid == UID_FLOOR,

576 drawUidU :
577 push bp
578 mov bp, sp
579 mov ax, [bp + 8 ]
580 push ax
581 mov ax, [bp + 6 ]
582 push ax
583 call convU2P
584 add sp, 4
585 push bx
586 push ax
587 mov ax, [bp + 4 ]
588 push ax
589 call drawUid
590 add sp, 6
591 mov sp, bp
592 pop bp
593 ret
594
595 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
596 ; func ax, bx convU2P( xu, yu )
597 ; 单元坐标转换为像素坐标,依据 orgx_p, orgy_p
598 ; 返回 ax == xp, bx = yp
599 ; 适应3D侧视图
600 convU2P :
601 push bp
602 mov bp, sp
603 movzx ax, byte [orgx_p]
604 movzx bx, byte [orgy_p]
605 .convU2P_L1 :
606 mov cx, [bp + 4 ]
607 test cx, cx
608 jz .convU2P_L2
609 .convU2P1 :
610 add ax, DX_HORZ_P
611 add bx, DY_HORZ_P
612 loop .convU2P1
613 .convU2P_L2 :
614 mov cx, [bp + 6 ]
615 test cx, cx
616 jz .EXIT
617 .convU2P2 :
618 add ax, DX_VERT_P
619 add bx, DY_VERT_P
620 loop .convU2P2
621 .EXIT :
622 mov sp, bp
623 pop bp
624 ret
625
626 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
627 ; func void drawUid( uid, xp, yp )
628 ; 绘制像素点为(xp,yp)且类型为uid的单元点
629 ; uid == UID_SPACE, UID_FLOOR,

630 drawUid :
631 push bp
632 mov bp, sp
633 mov ax, [bp + 4 ]
634 push ax
635 call convUid2Uoff
636 pop bx
637 mov bx, [bp + 8 ]
638 push bx
639 mov bx, [bp + 6 ]
640 push bx
641 push ax
642 call drawUoff
643 mov sp, bp
644 pop bp
645 ret
646
647 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
648 ; func ax convUid2Uoff( uid )
649 ; uid == UID_FLOOR,


650 ; 不依赖 uid 和 uoff 的定义,无跳表,大量比较
651 ; 处理了player的方向dir
652 ; BOX + DEST或BOX + FLOOR 按BOX处理,所以注意测试顺序
653 convUid2Uoff :
654 push bp
655 mov bp, sp
656 mov ax, [bp + 4 ]
657 .SPACE :
658 test ax, UID_SPACE
659 jz .BOX
660 mov ax, UOFF_SPACE
661 jmp .EXIT
662 .BOX :
663 test ax, UID_BOX
664 jz .FLOOR
665 mov ax, UOFF_BOX
666 jmp .EXIT
667 .FLOOR :
668 test ax, UID_FLOOR
669 jz .WALL
670 mov ax, UOFF_FLOOR
671 jmp .EXIT
672 .WALL :
673 test ax, UID_WALL
674 jz .DEST
675 mov ax, UOFF_WALL
676 jmp .EXIT
677 .DEST :
678 test ax, UID_DEST
679 jz .PLAYER
680 mov ax, UOFF_DEST
681 jmp .EXIT
682 .PLAYER :
683 test ax, UID_PLAYER
684 jz .ELSE
685 mov al, [dir]
686 .UP :
687 cmp al, DIR_UP
688 jne .DOWN
689 mov ax, UOFF_PLAYER_UP
690 jmp .EXIT
691 .DOWN :
692 cmp al, DIR_DOWN
693 jne .LEFT
694 mov ax, UOFF_PLAYER_DOWN
695 jmp .EXIT
696 .LEFT :
697 cmp al, DIR_LEFT
698 jne .RIGHT
699 mov ax, UOFF_PLAYER_LEFT
700 jmp .EXIT
701 .RIGHT :
702 cmp al, DIR_RIGHT
703 jne .ELSE
704 mov ax, UOFF_PLAYER_RIGHT
705 jmp .EXIT
706 .ELSE :
707 mov ax, UOFF_SPACE
708 .EXIT :
709 mov sp, bp
710 pop bp
711 ret
712
713 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
714 ; func void drawUoff( uoff, xp, yp )
715 ; 绘制像素点为(xp,yp)且地图单元位图偏移为uoff的单元点
716 ; off == UOFF_SPACE, UOFF_FLOOR,

717 drawUoff :
718 ; 悲剧!!!!
719 push bp
720 mov bp, sp
721 push si
722 push di
723 push es
724
725 mov si, [bp + 4 ]
726
727 mov cx, VIDEO_SEG
728 mov es, cx
729
730 mov ax, [bp + 8 ]
731 sub ax, UNIT_VERT_P
732 inc ax
733 mov cx, VIDEO_HORZ_P
734 mul cx
735 mov bx, [bp + 6 ]
736 sub bx, UNIT_HORZ_P
737 inc bx
738 add ax, bx
739 mov di, ax
740
741 mov cx, UNIT_VERT_P
742 .drawUoff1 :
743 push cx
744
745 mov cx, UNIT_HORZ_P
746 .drawUoff2 :
747 mov al, [ds:si]
748 test al, al
749 jz .drawUoff3
750 mov [es:di], al
751 .drawUoff3 :
752 inc si
753 inc di
754 loop .drawUoff2
755
756 sub di, UNIT_HORZ_P
757 add di, VIDEO_HORZ_P
758 pop cx
759 loop .drawUoff1
760
761 pop es
762 pop di
763 pop si
764 mov sp, bp
765 pop bp
766 ret
767
768 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
769 ; func ax peekKey()
770 ; 获取键盘输入,不阻塞
771 ; 若无输入返回 VK_NULL
772 ; 若有输入,取出,且不将其从缓冲区中清除
773 peekKey :
774 mov ah, 1
775 int 0x16
776 jz .VK_NULL
777 push ax
778 call convKey2Vk
779 add sp, 2
780 jmp .EXIT
781 .VK_NULL :
782 mov ax, VK_NULL
783 .EXIT :
784 ret
785
786 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
787 ; func ax getKey()
788 ; 获取键盘输入,阻塞
789 ; 若无输入,阻塞
790 ; 若有输入,取出,且将其从缓冲区中清除
791 getKey :
792 mov ah, 0
793 int 0x16
794 push ax
795 call convKey2Vk
796 add sp, 2
797 cmp ax, VK_NULL
798 je getKey
799 ret
800
801 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
802 ; func ax convKey2Vk( bios_ax )
803 ; 将BIOS键盘输入转换为虚拟键码
804 ; 不依赖任何编码,大量比较
805 convKey2Vk :
806 push bp
807 mov bp, sp
808 mov ax, [bp + 4 ]
809
810 cmp al, ' W '
811 je .VK_W
812 cmp al, ' w '
813 je .VK_W
814
815 cmp al, ' A '
816 je .VK_A
817 cmp al, ' a '
818 je .VK_A
819
820 cmp al, ' S '
821 je .VK_S
822 cmp al, ' s '
823 je .VK_S
824
825 cmp al, ' D '
826 je .VK_D
827 cmp al, ' d '
828 je .VK_D
829
830 cmp al, ' Q '
831 je .VK_Q
832 cmp al, ' q '
833 je .VK_Q
834
835 cmp al, ' R '
836 je .VK_R
837 cmp al, ' r '
838 je .VK_R
839
840 jmp .VK_NULL
841 .VK_W :
842 mov ax, VK_W
843 jmp .EXIT
844 .VK_A :
845 mov ax, VK_A
846 jmp .EXIT
847 .VK_S :
848 mov ax, VK_S
849 jmp .EXIT
850 .VK_D :
851 mov ax, VK_D
852 jmp .EXIT
853 .VK_Q :
854 mov ax, VK_Q
855 jmp .EXIT
856 .VK_R :
857 mov ax, VK_R
858 jmp .EXIT
859 .VK_NULL :
860 mov ax, VK_NULL
861 .EXIT :
862 mov sp, bp
863 pop bp
864 ret
865
866 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
867 ; func void sleep( t )
868 ; 等待 t 毫秒,等待中的输入被清除(清空输入缓冲区)
869 ; 移动动画使用
870 sleep :
871 ret
872
873 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
874 ; 调色板
875 BOX_PAL :
876 ; r g b
877 db 63 , 63 , 00 ; 00 透明色
878 ; SPACE
879 db 00 , 00 , 00 ; 01 背景色
880 db 00 , 00 , 00 ; 02
881 db 00 , 00 , 00 ; 03
882 db 00 , 00 , 00 ; 04
883 db 00 , 00 , 00 ; 05
884 ; FLOOR
885 db 16 , 22 , 28 ; 06
886 db 21 , 26 , 32 ; 07
887 db 00 , 07 , 15 ; 08
888 db 00 , 00 , 00 ; 09
889 db 00 , 00 , 00 ; 10
890 ; WALL
891 db 00 , 07 , 15 ; 11
892 db 63 , 63 , 63 ; 12
893 db 14 , 20 , 22 ; 13
894 db 30 , 31 , 38 ; 14
895 db 37 , 42 , 45 ; 15
896 ; BOX
897 db 60 , 60 , 60 ; 16
898 db 25 , 30 , 06 ; 17
899 db 44 , 47 , 21 ; 18
900 db 55 , 56 , 37 ; 19
901 db 00 , 07 , 15 ; 20
902 ; DEST
903 db 60 , 60 , 30 ; 21
904 db 00 , 07 , 15 ; 22
905 db 00 , 00 , 00 ; 23
906 db 00 , 00 , 00 ; 24
907 db 00 , 00 , 00 ; 25
908 ; PLAYER
909 db 00 , 07 , 15 ; 26
910 db 60 , 60 , 60 ; 27
911 db 00 , 00 , 00 ; 28
912 db 60 , 44 , 62 ; 29
913 db 63 , 28 , 62 ; 30
914 db 00 , 32 , 63 ; 31
915 db 00 , 00 , 00 ; 32
916 db 00 , 00 , 00 ; 33
917 BOX_PAL_NUM : equ $ - BOX_PAL
918
919 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
920 ; func void initVideo()
921 ; 初始化显示方式
922 initVideo :
923 ; 设置显示方式
924 mov ax, 0x0013
925 int 0x10
926
927 ; 设置调色板
928 xor bx, bx ; rgbrgbrgb

929 xor cx, cx ; index 0

930 .iVset :
931 cmp bx, BOX_PAL_NUM
932 je .iVexit
933
934 ; 调色板 index
935 mov dx, VIDEO_PAL_PORT
936 mov ax, cx
937 out dx, al
938 inc cx
939
940 ; 调色板颜色
941 mov dx, VIDEO_COL_PORT
942 mov al, [ds:BOX_PAL + bx]
943 out dx, al
944 inc bx
945 mov al, [ds:BOX_PAL + bx]
946 out dx, al
947 inc bx
948 mov al, [ds:BOX_PAL + bx]
949 out dx, al
950 inc bx
951
952 jmp .iVset
953 .iVexit :
954 ret
955
956 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
957 ; 地图单元位图
958 ; (繁琐的工作,还好有 Vim + 自制的MageX )
959 UOFF_SPACE :
960 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
961 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
962 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
963 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
964 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
965 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
966 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
967 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
968 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
969 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
970 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
971 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
972 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
973 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
974 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
975 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
976 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
977 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
978 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
979 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
980 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
981 db 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01 , 01
982 UOFF_FLOOR :
983 db 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08
984 db 08 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 08
985 db 08 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 08
986 db 08 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 08
987 db 08 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 08
988 db 08 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 08
989 db 08 , 06 , 06 , 06 , 06 , 06 , 07 , 07 , 07 , 07 , 06 , 06 , 07 , 07 , 07 , 07 , 06 , 06 , 06 , 06 , 06 , 08
990 db 08 , 06 , 06 , 06 , 06 , 06 , 07 , 07 , 07 , 07 , 06 , 06 , 07 , 07 , 07 , 07 , 06 , 06 , 06 , 06 , 06 , 08
991 db 08 , 06 , 06 , 06 , 06 , 06 , 07 , 07 , 07 , 07 , 06 , 06 , 07 , 07 , 07 , 07 , 06 , 06 , 06 , 06 , 06 , 08
992 db 08 , 06 , 06 , 06 , 06 , 06 , 07 , 07 , 07 , 07 , 06 , 06 , 07 , 07 , 07 , 07 , 06 , 06 , 06 , 06 , 06 , 08
993 db 08 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 08
994 db 08 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 08
995 db 08 , 06 , 06 , 06 , 06 , 06 , 07 , 07 , 07 , 07 , 06 , 06 , 07 , 07 , 07 , 07 , 06 , 06 , 06 , 06 , 06 , 08
996 db 08 , 06 , 06 , 06 , 06 , 06 , 07 , 07 , 07 , 07 , 06 , 06 , 07 , 07 , 07 , 07 , 06 , 06 , 06 , 06 , 06 , 08
997 db 08 , 06 , 06 , 06 , 06 , 06 , 07 , 07 , 07 , 07 , 06 , 06 , 07 , 07 , 07 , 07 , 06 , 06 , 06 , 06 , 06 , 08
998 db 08 , 06 , 06 , 06 , 06 , 06 , 07 , 07 , 07 , 07 , 06 , 06 , 07 , 07 , 07 , 07 , 06 , 06 , 06 , 06 , 06 , 08
999 db 08 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 08
1000 db 08 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 08
1001 db 08 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 08
1002 db 08 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 08
1003 db 08 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 08
1004 db 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08 , 08
1005 UOFF_WALL :
1006 db 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11
1007 db 11 , 12 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 13 , 11
1008 db 11 , 12 , 12 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 13 , 13 , 11
1009 db 11 , 12 , 12 , 12 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 13 , 13 , 13 , 11
1010 db 11 , 12 , 12 , 12 , 12 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 13 , 13 , 13 , 13 , 11
1011 db 11 , 12 , 12 , 12 , 12 , 12 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 13 , 13 , 13 , 13 , 13 , 11
1012 db 11 , 12 , 12 , 12 , 12 , 12 , 12 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 13 , 13 , 13 , 13 , 13 , 13 , 11
1013 db 11 , 12 , 12 , 12 , 12 , 12 , 12 , 12 , 14 , 14 , 14 , 14 , 14 , 14 , 13 , 13 , 13 , 13 , 13 , 13 , 13 , 11
1014 db 11 , 12 , 12 , 12 , 12 , 12 , 12 , 12 , 12 , 14 , 14 , 14 , 14 , 13 , 13 , 13 , 13 , 13 , 13 , 13 , 13 , 11
1015 db 11 , 12 , 12 , 12 , 12 , 12 , 12 , 12 , 12 , 12 , 14 , 14 , 13 , 13 , 13 , 13 , 13 , 13 , 13 , 13 , 13 , 11
1016 db 11 , 12 , 12 , 12 , 12 , 12 , 12 , 12 , 12 , 12 , 12 , 13 , 13 , 13 , 13 , 13 , 13 , 13 , 13 , 13 , 13 , 11
1017 db 11 , 12 , 12 , 12 , 12 , 12 , 12 , 12 , 12 , 12 , 12 , 13 , 13 , 13 , 13 , 13 , 13 , 13 , 13 , 13 , 13 , 11
1018 db 11 , 12 , 12 , 12 , 12 , 12 , 12 , 12 , 12 , 12 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 11
1019 db 11 , 12 , 12 , 12 , 12 , 12 , 12 , 12 , 12 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 11
1020 db 11 , 12 , 12 , 12 , 12 , 12 , 12 , 12 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 11
1021 db 11 , 12 , 12 , 12 , 12 , 12 , 12 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 11
1022 db 11 , 12 , 12 , 12 , 12 , 12 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 11
1023 db 11 , 12 , 12 , 12 , 12 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 11
1024 db 11 , 12 , 12 , 12 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 11
1025 db 11 , 12 , 12 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 11
1026 db 11 , 12 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 15 , 11
1027 db 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11
1028 UOFF_BOX :
1029 db 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20
1030 db 20 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 18 , 18 , 18 , 18 , 18 , 18 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 20
1031 db 20 , 06 , 06 , 06 , 06 , 06 , 18 , 18 , 16 , 16 , 16 , 16 , 18 , 18 , 18 , 18 , 06 , 06 , 06 , 06 , 06 , 20
1032 db 20 , 06 , 06 , 06 , 18 , 18 , 16 , 16 , 16 , 16 , 16 , 16 , 16 , 16 , 18 , 18 , 18 , 18 , 06 , 06 , 06 , 20
1033 db 20 , 06 , 06 , 18 , 18 , 16 , 16 , 16 , 16 , 16 , 16 , 16 , 16 , 16 , 16 , 16 , 16 , 18 , 18 , 06 , 06 , 20
1034 db 20 , 06 , 06 , 18 , 16 , 16 , 16 , 16 , 16 , 16 , 17 , 16 , 16 , 16 , 16 , 16 , 16 , 18 , 18 , 06 , 06 , 20
1035 db 20 , 06 , 18 , 18 , 16 , 16 , 16 , 16 , 16 , 16 , 17 , 17 , 16 , 16 , 16 , 16 , 18 , 18 , 18 , 18 , 06 , 20
1036 db 20 , 06 , 18 , 18 , 18 , 16 , 16 , 16 , 16 , 17 , 17 , 17 , 17 , 18 , 16 , 18 , 18 , 18 , 18 , 18 , 06 , 20
1037 db 20 , 18 , 18 , 18 , 18 , 18 , 16 , 16 , 16 , 17 , 17 , 17 , 17 , 18 , 18 , 18 , 18 , 18 , 18 , 18 , 18 , 20
1038 db 20 , 18 , 18 , 18 , 18 , 18 , 18 , 17 , 17 , 17 , 17 , 17 , 17 , 17 , 17 , 18 , 18 , 18 , 18 , 18 , 18 , 20
1039 db 20 , 18 , 18 , 18 , 18 , 18 , 17 , 17 , 17 , 17 , 17 , 17 , 17 , 17 , 17 , 17 , 17 , 18 , 18 , 18 , 18 , 20
1040 db 20 , 18 , 18 , 18 , 18 , 17 , 17 , 17 , 17 , 17 , 17 , 17 , 17 , 17 , 17 , 17 , 18 , 18 , 18 , 18 , 18 , 20
1041 db 20 , 18 , 18 , 18 , 18 , 18 , 18 , 17 , 17 , 17 , 17 , 17 , 17 , 17 , 17 , 18 , 18 , 18 , 18 , 18 , 18 , 20
1042 db 20 , 18 , 18 , 18 , 18 , 18 , 18 , 18 , 18 , 17 , 17 , 17 , 17 , 18 , 18 , 19 , 19 , 18 , 18 , 18 , 18 , 20
1043 db 20 , 06 , 18 , 18 , 18 , 18 , 18 , 18 , 18 , 17 , 17 , 17 , 17 , 18 , 19 , 19 , 19 , 18 , 18 , 18 , 06 , 20
1044 db 20 , 06 , 18 , 18 , 18 , 18 , 18 , 18 , 18 , 18 , 17 , 17 , 18 , 19 , 19 , 19 , 19 , 18 , 18 , 18 , 06 , 20
1045 db 20 , 06 , 06 , 18 , 18 , 18 , 18 , 18 , 18 , 19 , 19 , 17 , 18 , 19 , 19 , 19 , 18 , 18 , 18 , 06 , 06 , 20
1046 db 20 , 06 , 06 , 18 , 18 , 18 , 18 , 18 , 19 , 19 , 19 , 19 , 19 , 19 , 19 , 18 , 18 , 18 , 18 , 06 , 06 , 20
1047 db 20 , 06 , 06 , 06 , 18 , 18 , 18 , 19 , 19 , 19 , 19 , 19 , 19 , 19 , 18 , 18 , 18 , 18 , 06 , 06 , 06 , 20
1048 db 20 , 06 , 06 , 06 , 06 , 06 , 18 , 18 , 18 , 18 , 18 , 18 , 18 , 18 , 18 , 18 , 06 , 06 , 06 , 06 , 06 , 20
1049 db 20 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 18 , 18 , 18 , 18 , 18 , 18 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 20
1050 db 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20
1051 UOFF_DEST :
1052 db 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22
1053 db 22 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 22
1054 db 22 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 22
1055 db 22 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 21 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 22
1056 db 22 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 21 , 21 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 22
1057 db 22 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 21 , 21 , 21 , 21 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 22
1058 db 22 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 21 , 21 , 21 , 21 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 22
1059 db 22 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 21 , 21 , 21 , 21 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 22
1060 db 22 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 21 , 21 , 21 , 21 , 21 , 21 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 22
1061 db 22 , 06 , 06 , 06 , 06 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 06 , 06 , 06 , 06 , 22
1062 db 22 , 06 , 06 , 06 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 06 , 06 , 22
1063 db 22 , 06 , 06 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 06 , 06 , 06 , 22
1064 db 22 , 06 , 06 , 06 , 06 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 06 , 06 , 06 , 06 , 22
1065 db 22 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 21 , 21 , 21 , 21 , 21 , 21 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 22
1066 db 22 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 21 , 21 , 21 , 21 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 22
1067 db 22 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 21 , 21 , 21 , 21 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 22
1068 db 22 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 21 , 21 , 21 , 21 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 22
1069 db 22 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 21 , 21 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 22
1070 db 22 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 21 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 22
1071 db 22 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 22
1072 db 22 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 22
1073 db 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22 , 22
1074 UOFF_PLAYER_UP :
1075 db 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26
1076 db 26 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 26
1077 db 26 , 06 , 06 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 06 , 06 , 26
1078 db 26 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 26
1079 db 26 , 06 , 06 , 29 , 29 , 29 , 29 , 31 , 31 , 29 , 29 , 29 , 29 , 31 , 31 , 29 , 29 , 29 , 29 , 06 , 06 , 26
1080 db 26 , 06 , 06 , 29 , 29 , 29 , 31 , 27 , 27 , 31 , 29 , 29 , 31 , 27 , 27 , 31 , 29 , 29 , 29 , 06 , 06 , 26
1081 db 26 , 06 , 29 , 29 , 29 , 31 , 28 , 28 , 31 , 31 , 31 , 31 , 28 , 28 , 31 , 31 , 31 , 29 , 29 , 29 , 06 , 26
1082 db 26 , 06 , 29 , 29 , 27 , 31 , 31 , 31 , 31 , 31 , 27 , 31 , 31 , 31 , 31 , 31 , 31 , 27 , 29 , 29 , 06 , 26
1083 db 26 , 29 , 29 , 29 , 27 , 27 , 31 , 31 , 31 , 31 , 27 , 27 , 31 , 31 , 31 , 31 , 27 , 27 , 29 , 29 , 29 , 26
1084 db 26 , 29 , 29 , 29 , 27 , 27 , 27 , 31 , 31 , 27 , 27 , 27 , 27 , 31 , 31 , 27 , 27 , 27 , 29 , 29 , 29 , 26
1085 db 26 , 29 , 29 , 29 , 29 , 27 , 27 , 27 , 27 , 27 , 30 , 30 , 27 , 27 , 27 , 27 , 27 , 29 , 29 , 29 , 29 , 26
1086 db 26 , 29 , 29 , 29 , 29 , 27 , 27 , 27 , 27 , 27 , 30 , 30 , 27 , 27 , 27 , 27 , 27 , 29 , 29 , 29 , 29 , 26
1087 db 26 , 29 , 29 , 29 , 29 , 29 , 27 , 27 , 27 , 30 , 30 , 30 , 30 , 27 , 27 , 27 , 29 , 29 , 29 , 29 , 29 , 26
1088 db 26 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 27 , 30 , 30 , 30 , 30 , 27 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 26
1089 db 26 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 26
1090 db 26 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 30 , 30 , 29 , 29 , 06 , 26
1091 db 26 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 30 , 30 , 29 , 29 , 29 , 06 , 06 , 26
1092 db 26 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 30 , 30 , 30 , 30 , 30 , 30 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 26
1093 db 26 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 26
1094 db 26 , 06 , 06 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 06 , 06 , 26
1095 db 26 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 26
1096 db 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26
1097 UOFF_PLAYER_DOWN :
1098 db 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26
1099 db 26 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 26
1100 db 26 , 06 , 06 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 06 , 06 , 26
1101 db 26 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 26
1102 db 26 , 06 , 06 , 29 , 29 , 29 , 29 , 31 , 31 , 29 , 29 , 29 , 29 , 31 , 31 , 29 , 29 , 29 , 29 , 06 , 06 , 26
1103 db 26 , 06 , 06 , 29 , 29 , 29 , 31 , 27 , 27 , 31 , 29 , 29 , 31 , 27 , 27 , 31 , 29 , 29 , 29 , 06 , 06 , 26
1104 db 26 , 06 , 29 , 29 , 29 , 31 , 28 , 28 , 31 , 31 , 31 , 31 , 28 , 28 , 31 , 31 , 31 , 29 , 29 , 29 , 06 , 26
1105 db 26 , 06 , 29 , 29 , 27 , 31 , 31 , 31 , 31 , 31 , 27 , 31 , 31 , 31 , 31 , 31 , 31 , 27 , 29 , 29 , 06 , 26
1106 db 26 , 29 , 29 , 29 , 27 , 27 , 31 , 31 , 31 , 31 , 27 , 27 , 31 , 31 , 31 , 31 , 27 , 27 , 29 , 29 , 29 , 26
1107 db 26 , 29 , 29 , 29 , 27 , 27 , 27 , 31 , 31 , 27 , 27 , 27 , 27 , 31 , 31 , 27 , 27 , 27 , 29 , 29 , 29 , 26
1108 db 26 , 29 , 29 , 29 , 29 , 27 , 27 , 27 , 27 , 27 , 30 , 30 , 27 , 27 , 27 , 27 , 27 , 29 , 29 , 29 , 29 , 26
1109 db 26 , 29 , 29 , 29 , 29 , 27 , 27 , 27 , 27 , 27 , 30 , 30 , 27 , 27 , 27 , 27 , 27 , 29 , 29 , 29 , 29 , 26
1110 db 26 , 29 , 29 , 29 , 29 , 29 , 27 , 27 , 27 , 30 , 30 , 30 , 30 , 27 , 27 , 27 , 29 , 29 , 29 , 29 , 29 , 26
1111 db 26 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 27 , 30 , 30 , 30 , 30 , 27 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 26
1112 db 26 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 26
1113 db 26 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 30 , 30 , 29 , 29 , 06 , 26
1114 db 26 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 30 , 30 , 29 , 29 , 29 , 06 , 06 , 26
1115 db 26 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 30 , 30 , 30 , 30 , 30 , 30 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 26
1116 db 26 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 26
1117 db 26 , 06 , 06 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 06 , 06 , 26
1118 db 26 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 26
1119 db 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26
1120 UOFF_PLAYER_LEFT :
1121 db 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26
1122 db 26 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 26
1123 db 26 , 06 , 06 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 06 , 06 , 26
1124 db 26 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 26
1125 db 26 , 06 , 06 , 29 , 29 , 29 , 29 , 31 , 31 , 29 , 29 , 29 , 29 , 31 , 31 , 29 , 29 , 29 , 29 , 06 , 06 , 26
1126 db 26 , 06 , 06 , 29 , 29 , 29 , 31 , 27 , 27 , 31 , 29 , 29 , 31 , 27 , 27 , 31 , 29 , 29 , 29 , 06 , 06 , 26
1127 db 26 , 06 , 29 , 29 , 29 , 31 , 28 , 28 , 31 , 31 , 31 , 31 , 28 , 28 , 31 , 31 , 31 , 29 , 29 , 29 , 06 , 26
1128 db 26 , 06 , 29 , 29 , 27 , 31 , 31 , 31 , 31 , 31 , 27 , 31 , 31 , 31 , 31 , 31 , 31 , 27 , 29 , 29 , 06 , 26
1129 db 26 , 29 , 29 , 29 , 27 , 27 , 31 , 31 , 31 , 31 , 27 , 27 , 31 , 31 , 31 , 31 , 27 , 27 , 29 , 29 , 29 , 26
1130 db 26 , 29 , 29 , 29 , 27 , 27 , 27 , 31 , 31 , 27 , 27 , 27 , 27 , 31 , 31 , 27 , 27 , 27 , 29 , 29 , 29 , 26
1131 db 26 , 29 , 29 , 29 , 29 , 27 , 27 , 27 , 27 , 27 , 30 , 30 , 27 , 27 , 27 , 27 , 27 , 29 , 29 , 29 , 29 , 26
1132 db 26 , 29 , 29 , 29 , 29 , 27 , 27 , 27 , 27 , 27 , 30 , 30 , 27 , 27 , 27 , 27 , 27 , 29 , 29 , 29 , 29 , 26
1133 db 26 , 29 , 29 , 29 , 29 , 29 , 27 , 27 , 27 , 30 , 30 , 30 , 30 , 27 , 27 , 27 , 29 , 29 , 29 , 29 , 29 , 26
1134 db 26 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 27 , 30 , 30 , 30 , 30 , 27 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 26
1135 db 26 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 26
1136 db 26 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 30 , 30 , 29 , 29 , 06 , 26
1137 db 26 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 30 , 30 , 29 , 29 , 29 , 06 , 06 , 26
1138 db 26 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 30 , 30 , 30 , 30 , 30 , 30 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 26
1139 db 26 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 26
1140 db 26 , 06 , 06 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 06 , 06 , 26
1141 db 26 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 26
1142 db 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26
1143 UOFF_PLAYER_RIGHT :
1144 db 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26
1145 db 26 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 26
1146 db 26 , 06 , 06 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 06 , 06 , 26
1147 db 26 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 26
1148 db 26 , 06 , 06 , 29 , 29 , 29 , 29 , 31 , 31 , 29 , 29 , 29 , 29 , 31 , 31 , 29 , 29 , 29 , 29 , 06 , 06 , 26
1149 db 26 , 06 , 06 , 29 , 29 , 29 , 31 , 27 , 27 , 31 , 29 , 29 , 31 , 27 , 27 , 31 , 29 , 29 , 29 , 06 , 06 , 26
1150 db 26 , 06 , 29 , 29 , 29 , 31 , 28 , 28 , 31 , 31 , 31 , 31 , 28 , 28 , 31 , 31 , 31 , 29 , 29 , 29 , 06 , 26
1151 db 26 , 06 , 29 , 29 , 27 , 31 , 31 , 31 , 31 , 31 , 27 , 31 , 31 , 31 , 31 , 31 , 31 , 27 , 29 , 29 , 06 , 26
1152 db 26 , 29 , 29 , 29 , 27 , 27 , 31 , 31 , 31 , 31 , 27 , 27 , 31 , 31 , 31 , 31 , 27 , 27 , 29 , 29 , 29 , 26
1153 db 26 , 29 , 29 , 29 , 27 , 27 , 27 , 31 , 31 , 27 , 27 , 27 , 27 , 31 , 31 , 27 , 27 , 27 , 29 , 29 , 29 , 26
1154 db 26 , 29 , 29 , 29 , 29 , 27 , 27 , 27 , 27 , 27 , 30 , 30 , 27 , 27 , 27 , 27 , 27 , 29 , 29 , 29 , 29 , 26
1155 db 26 , 29 , 29 , 29 , 29 , 27 , 27 , 27 , 27 , 27 , 30 , 30 , 27 , 27 , 27 , 27 , 27 , 29 , 29 , 29 , 29 , 26
1156 db 26 , 29 , 29 , 29 , 29 , 29 , 27 , 27 , 27 , 30 , 30 , 30 , 30 , 27 , 27 , 27 , 29 , 29 , 29 , 29 , 29 , 26
1157 db 26 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 27 , 30 , 30 , 30 , 30 , 27 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 26
1158 db 26 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 26
1159 db 26 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 30 , 30 , 29 , 29 , 06 , 26
1160 db 26 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 30 , 30 , 29 , 29 , 29 , 06 , 06 , 26
1161 db 26 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 30 , 30 , 30 , 30 , 30 , 30 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 26
1162 db 26 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 26
1163 db 26 , 06 , 06 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 06 , 06 , 26
1164 db 26 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 29 , 29 , 29 , 29 , 29 , 29 , 06 , 06 , 06 , 06 , 06 , 06 , 06 , 26
1165 db 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26 , 26
1166
1167 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1168 ; 变量
1169 level : db 1
1170 ; 当前地图
1171 MAP_CUR :
1172 times MAP_U db 0
1173 orgx_p : db 0
1174 orgy_p : db 0
1175 px_u : db 0
1176 py_u : db 0
1177 dir : db 0
1178 MAP_SIZE : equ $ - MAP_CUR
1179
1180 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1181 ; 地图,级别从低到高按顺序,相对 MAP_CUR 定位
1182
1183 % define SPACE UID_SPACE
1184 % define FLOOR UID_FLOOR
1185 % define WALL UID_WALL
1186 % define DEST UID_DEST
1187 % define BOX (UID_FLOOR | UID_BOX)
1188 % define BOXDE (UID_DEST | UID_BOX)
1189 % define PLAYE UID_FLOOR
1190
1191 MAP_LEVEL_1 :
1192 db SPACE, SPACE, WALL, WALL, WALL, SPACE, SPACE, SPACE
1193 db SPACE, SPACE, WALL, DEST, WALL, SPACE, SPACE, SPACE
1194 db SPACE, SPACE, WALL, FLOOR, WALL, WALL, WALL, WALL
1195 db WALL, WALL, WALL, BOX, FLOOR, BOX, DEST, WALL
1196 db WALL, DEST, FLOOR, BOX, FLOOR, WALL, WALL, WALL
1197 db WALL, WALL, WALL, WALL, BOX, WALL, SPACE, SPACE
1198 db SPACE, SPACE, SPACE, WALL, DEST, WALL, SPACE, SPACE
1199 db SPACE, SPACE, SPACE, WALL, WALL, WALL, SPACE, SPACE
1200 db 90 , 30 , 4 , 4 , DIR_UP
1201
1202 MAP_LEVEL_2 :
1203 db SPACE, SPACE, WALL, WALL, WALL, WALL, SPACE, SPACE
1204 db SPACE, WALL, WALL, FLOOR, FLOOR, WALL, SPACE, SPACE
1205 db SPACE, WALL, FLOOR, BOX, FLOOR, WALL, SPACE, SPACE
1206 db SPACE, WALL, WALL, BOX, FLOOR, WALL, WALL, SPACE
1207 db SPACE, WALL, WALL, FLOOR, BOX, FLOOR, WALL, SPACE
1208 db SPACE, WALL, DEST, BOX, FLOOR, FLOOR, WALL, SPACE
1209 db SPACE, WALL, DEST, DEST, BOXDE, DEST, WALL, SPACE
1210 db SPACE, WALL, WALL, WALL, WALL, WALL, WALL, SPACE
1211 db 90 , 30 , 2 , 2 , DIR_UP
1212
1213 MAP_LEVEL_3 :
1214 db SPACE, WALL, WALL, WALL, WALL, WALL, SPACE, SPACE
1215 db SPACE, WALL, FLOOR, FLOOR, WALL, WALL, WALL, SPACE
1216 db SPACE, WALL, FLOOR, BOX, FLOOR, FLOOR, WALL, SPACE
1217 db WALL, WALL, WALL, FLOOR, WALL, FLOOR, WALL, WALL
1218 db WALL, DEST, WALL, FLOOR, WALL, FLOOR, FLOOR, WALL
1219 db WALL, DEST, BOX, FLOOR, FLOOR, WALL, FLOOR, WALL
1220 db WALL, DEST, FLOOR, FLOOR, FLOOR, BOX, FLOOR, WALL
1221 db WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL
1222 db 90 , 30 , 2 , 2 , DIR_UP
1223
1224 MAP_LEVEL_4 :
1225 db SPACE, SPACE, WALL, WALL, WALL, WALL, WALL, WALL
1226 db SPACE, WALL, WALL, FLOOR, FLOOR, WALL, FLOOR, FLOOR
1227 db SPACE, WALL, FLOOR, FLOOR, FLOOR, WALL, FLOOR, FLOOR
1228 db SPACE, WALL, BOX, FLOOR, BOX, FLOOR, BOX, FLOOR
1229 db SPACE, WALL, FLOOR, BOX, WALL, WALL, FLOOR, FLOOR
1230 db WALL, WALL, FLOOR, BOX, FLOOR, WALL, FLOOR, WALL
1231 db DEST, DEST, DEST, DEST, DEST, FLOOR, FLOOR, WALL
1232 db WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL
1233 db 90 , 30 , 7 , 1 , DIR_UP
1234
1235 MAP_LEVEL_COMPELETE :
1236 db FLOOR, FLOOR, FLOOR, SPACE, SPACE, FLOOR, FLOOR, SPACE
1237 db FLOOR, SPACE, SPACE, SPACE, SPACE, FLOOR, SPACE, FLOOR
1238 db FLOOR, SPACE, SPACE, SPACE, SPACE, FLOOR, SPACE, FLOOR
1239 db FLOOR, FLOOR, FLOOR, SPACE, SPACE, FLOOR, SPACE, FLOOR
1240 db FLOOR, SPACE, SPACE, SPACE, SPACE, FLOOR, SPACE, FLOOR
1241 db FLOOR, SPACE, SPACE, SPACE, SPACE, FLOOR, SPACE, FLOOR
1242 db FLOOR, FLOOR, FLOOR, SPACE, SPACE, FLOOR, FLOOR, SPACE
1243 db SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE
1244 db 95 , 40 , 1 , 3 , DIR_UP
1245