推箱子游戏,运行不需操作系统,自有引导扇区

推箱子游戏,运行不需操作系统,自有引导扇区


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 

你可能感兴趣的:(推箱子游戏,运行不需操作系统,自有引导扇区)