coreBugZJ

此 blog 已弃。

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


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 636300 ; 00 透明色
 878                 ; SPACE
 879         db 000000 ; 01 背景色
 880         db 000000 ; 02
 881         db 000000 ; 03
 882         db 000000 ; 04
 883         db 000000 ; 05
 884                 ; FLOOR
 885         db 162228 ; 06
 886         db 212632 ; 07
 887         db 000715 ; 08
 888         db 000000 ; 09
 889         db 000000 ; 10
 890                 ; WALL
 891         db 000715 ; 11
 892         db 636363 ; 12
 893         db 142022 ; 13
 894         db 303138 ; 14
 895         db 374245 ; 15
 896                 ; BOX
 897         db 606060 ; 16
 898         db 253006 ; 17
 899         db 444721 ; 18
 900         db 555637 ; 19
 901         db 000715 ; 20
 902                 ; DEST
 903         db 606030 ; 21
 904         db 000715 ; 22
 905         db 000000 ; 23
 906         db 000000 ; 24
 907         db 000000 ; 25
 908                 ; PLAYER
 909         db 000715 ; 26
 910         db 606060 ; 27
 911         db 000000 ; 28
 912         db 604462 ; 29
 913         db 632862 ; 30
 914         db 003263 ; 31
 915         db 000000 ; 32
 916         db 000000 ; 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 01010101010101010101010101010101010101010101
 961         db 01010101010101010101010101010101010101010101
 962         db 01010101010101010101010101010101010101010101
 963         db 01010101010101010101010101010101010101010101
 964         db 01010101010101010101010101010101010101010101
 965         db 01010101010101010101010101010101010101010101
 966         db 01010101010101010101010101010101010101010101
 967         db 01010101010101010101010101010101010101010101
 968         db 01010101010101010101010101010101010101010101
 969         db 01010101010101010101010101010101010101010101
 970         db 01010101010101010101010101010101010101010101
 971         db 01010101010101010101010101010101010101010101
 972         db 01010101010101010101010101010101010101010101
 973         db 01010101010101010101010101010101010101010101
 974         db 01010101010101010101010101010101010101010101
 975         db 01010101010101010101010101010101010101010101
 976         db 01010101010101010101010101010101010101010101
 977         db 01010101010101010101010101010101010101010101
 978         db 01010101010101010101010101010101010101010101
 979         db 01010101010101010101010101010101010101010101
 980         db 01010101010101010101010101010101010101010101
 981         db 01010101010101010101010101010101010101010101
 982 UOFF_FLOOR : 
 983         db 08080808080808080808080808080808080808080808
 984         db 08060606060606060606060606060606060606060608
 985         db 08060606060606060606060606060606060606060608
 986         db 08060606060606060606060606060606060606060608
 987         db 08060606060606060606060606060606060606060608
 988         db 08060606060606060606060606060606060606060608
 989         db 08060606060607070707060607070707060606060608
 990         db 08060606060607070707060607070707060606060608
 991         db 08060606060607070707060607070707060606060608
 992         db 08060606060607070707060607070707060606060608
 993         db 08060606060606060606060606060606060606060608
 994         db 08060606060606060606060606060606060606060608
 995         db 08060606060607070707060607070707060606060608
 996         db 08060606060607070707060607070707060606060608
 997         db 08060606060607070707060607070707060606060608
 998         db 08060606060607070707060607070707060606060608
 999         db 08060606060606060606060606060606060606060608
1000         db 08060606060606060606060606060606060606060608
1001         db 08060606060606060606060606060606060606060608
1002         db 08060606060606060606060606060606060606060608
1003         db 08060606060606060606060606060606060606060608
1004         db 08080808080808080808080808080808080808080808
1005 UOFF_WALL : 
1006         db 11111111111111111111111111111111111111111111
1007         db 11121414141414141414141414141414141414141311
1008         db 11121214141414141414141414141414141414131311
1009         db 11121212141414141414141414141414141413131311
1010         db 11121212121414141414141414141414141313131311
1011         db 11121212121214141414141414141414131313131311
1012         db 11121212121212141414141414141413131313131311
1013         db 11121212121212121414141414141313131313131311
1014         db 11121212121212121214141414131313131313131311
1015         db 11121212121212121212141413131313131313131311
1016         db 11121212121212121212121313131313131313131311
1017         db 11121212121212121212121313131313131313131311
1018         db 11121212121212121212141414141414141414141411
1019         db 11121212121212121214141414141414141414141411
1020         db 11121212121212121414141414141414141414141411
1021         db 11121212121212141414141414141414141414141411
1022         db 11121212121215151515151515151515151515151511
1023         db 11121212121515151515151515151515151515151511
1024         db 11121212151515151515151515151515151515151511
1025         db 11121215151515151515151515151515151515151511
1026         db 11121515151515151515151515151515151515151511
1027         db 11111111111111111111111111111111111111111111
1028 UOFF_BOX : 
1029         db 20202020202020202020202020202020202020202020
1030         db 20060606060606061818181818180606060606060620
1031         db 20060606060618181616161618181818060606060620
1032         db 20060606181816161616161616161818181806060620
1033         db 20060618181616161616161616161616161818060620
1034         db 20060618161616161616171616161616161818060620
1035         db 20061818161616161616171716161616181818180620
1036         db 20061818181616161617171717181618181818180620
1037         db 20181818181816161617171717181818181818181820
1038         db 20181818181818171717171717171718181818181820
1039         db 20181818181817171717171717171717171818181820
1040         db 20181818181717171717171717171717181818181820
1041         db 20181818181818171717171717171718181818181820
1042         db 20181818181818181817171717181819191818181820
1043         db 20061818181818181817171717181919191818180620
1044         db 20061818181818181818171718191919191818180620
1045         db 20060618181818181819191718191919181818060620
1046         db 20060618181818181919191919191918181818060620
1047         db 20060606181818191919191919191818181806060620
1048         db 20060606060618181818181818181818060606060620
1049         db 20060606060606061818181818180606060606060620
1050         db 20202020202020202020202020202020202020202020
1051 UOFF_DEST : 
1052         db 22222222222222222222222222222222222222222222
1053         db 22060606060606060606060606060606060606060622
1054         db 22060606060606060606060606060606060606060622
1055         db 22060606060606060606210606060606060606060622
1056         db 22060606060606060606212106060606060606060622
1057         db 22060606060606060621212121060606060606060622
1058         db 22060606060606060621212121060606060606060622
1059         db 22060606060606060621212121060606060606060622
1060         db 22060606060606062121212121210606060606060622
1061         db 22060606062121212121212121212121210606060622
1062         db 22060606212121212121212121212121212121060622
1063         db 22060621212121212121212121212121212106060622
1064         db 22060606062121212121212121212121210606060622
1065         db 22060606060606062121212121210606060606060622
1066         db 22060606060606060621212121060606060606060622
1067         db 22060606060606060621212121060606060606060622
1068         db 22060606060606060621212121060606060606060622
1069         db 22060606060606060606212106060606060606060622
1070         db 22060606060606060606062106060606060606060622
1071         db 22060606060606060606060606060606060606060622
1072         db 22060606060606060606060606060606060606060622
1073         db 22222222222222222222222222222222222222222222
1074 UOFF_PLAYER_UP : 
1075         db 26262626262626262626262626262626262626262626
1076         db 26060606060606062929292929290606060606060626
1077         db 26060606060629292929292929292929060606060626
1078         db 26060606292929292929292929292929292906060626
1079         db 26060629292929313129292929313129292929060626
1080         db 26060629292931272731292931272731292929060626
1081         db 26062929293128283131313128283131312929290626
1082         db 26062929273131313131273131313131312729290626
1083         db 26292929272731313131272731313131272729292926
1084         db 26292929272727313127272727313127272729292926
1085         db 26292929292727272727303027272727272929292926
1086         db 26292929292727272727303027272727272929292926
1087         db 26292929292927272730303030272727292929292926
1088         db 26292929292929292730303030272929292929292926
1089         db 26062929292929292929292929292929292929290626
1090         db 26062929292929292929292929292929303029290626
1091         db 26060629292929292929292929293030292929060626
1092         db 26060629292929293030303030302929292929060626
1093         db 26060606292929292929292929292929292906060626
1094         db 26060606060629292929292929292929060606060626
1095         db 26060606060606062929292929290606060606060626
1096         db 26262626262626262626262626262626262626262626
1097 UOFF_PLAYER_DOWN : 
1098         db 26262626262626262626262626262626262626262626
1099         db 26060606060606062929292929290606060606060626
1100         db 26060606060629292929292929292929060606060626
1101         db 26060606292929292929292929292929292906060626
1102         db 26060629292929313129292929313129292929060626
1103         db 26060629292931272731292931272731292929060626
1104         db 26062929293128283131313128283131312929290626
1105         db 26062929273131313131273131313131312729290626
1106         db 26292929272731313131272731313131272729292926
1107         db 26292929272727313127272727313127272729292926
1108         db 26292929292727272727303027272727272929292926
1109         db 26292929292727272727303027272727272929292926
1110         db 26292929292927272730303030272727292929292926
1111         db 26292929292929292730303030272929292929292926
1112         db 26062929292929292929292929292929292929290626
1113         db 26062929292929292929292929292929303029290626
1114         db 26060629292929292929292929293030292929060626
1115         db 26060629292929293030303030302929292929060626
1116         db 26060606292929292929292929292929292906060626
1117         db 26060606060629292929292929292929060606060626
1118         db 26060606060606062929292929290606060606060626
1119         db 26262626262626262626262626262626262626262626
1120 UOFF_PLAYER_LEFT : 
1121         db 26262626262626262626262626262626262626262626
1122         db 26060606060606062929292929290606060606060626
1123         db 26060606060629292929292929292929060606060626
1124         db 26060606292929292929292929292929292906060626
1125         db 26060629292929313129292929313129292929060626
1126         db 26060629292931272731292931272731292929060626
1127         db 26062929293128283131313128283131312929290626
1128         db 26062929273131313131273131313131312729290626
1129         db 26292929272731313131272731313131272729292926
1130         db 26292929272727313127272727313127272729292926
1131         db 26292929292727272727303027272727272929292926
1132         db 26292929292727272727303027272727272929292926
1133         db 26292929292927272730303030272727292929292926
1134         db 26292929292929292730303030272929292929292926
1135         db 26062929292929292929292929292929292929290626
1136         db 26062929292929292929292929292929303029290626
1137         db 26060629292929292929292929293030292929060626
1138         db 26060629292929293030303030302929292929060626
1139         db 26060606292929292929292929292929292906060626
1140         db 26060606060629292929292929292929060606060626
1141         db 26060606060606062929292929290606060606060626
1142         db 26262626262626262626262626262626262626262626
1143 UOFF_PLAYER_RIGHT : 
1144         db 26262626262626262626262626262626262626262626
1145         db 26060606060606062929292929290606060606060626
1146         db 26060606060629292929292929292929060606060626
1147         db 26060606292929292929292929292929292906060626
1148         db 26060629292929313129292929313129292929060626
1149         db 26060629292931272731292931272731292929060626
1150         db 26062929293128283131313128283131312929290626
1151         db 26062929273131313131273131313131312729290626
1152         db 26292929272731313131272731313131272729292926
1153         db 26292929272727313127272727313127272729292926
1154         db 26292929292727272727303027272727272929292926
1155         db 26292929292727272727303027272727272929292926
1156         db 26292929292927272730303030272727292929292926
1157         db 26292929292929292730303030272929292929292926
1158         db 26062929292929292929292929292929292929290626
1159         db 26062929292929292929292929292929303029290626
1160         db 26060629292929292929292929293030292929060626
1161         db 26060629292929293030303030302929292929060626
1162         db 26060606292929292929292929292929292906060626
1163         db 26060606060629292929292929292929060606060626
1164         db 26060606060606062929292929290606060606060626
1165         db 26262626262626262626262626262626262626262626
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 903044, 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 903022, 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 903022, 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 903071, 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 954013, DIR_UP
1245 

posted on 2011-06-04 20:40 coreBugZJ 阅读(3693) 评论(15)  编辑 收藏 引用 所属分类: AssembleOperatingSystem

Feedback

# re: 推箱子游戏,运行不需操作系统,自有引导扇区 2011-06-04 21:13 溪流

推箱子操作系统。。  回复  更多评论   

# re: 推箱子游戏,运行不需操作系统,自有引导扇区 2011-06-04 21:48 coreBugZJ

@溪流
额。。。  回复  更多评论   

# re: 推箱子游戏,运行不需操作系统,自有引导扇区 2011-06-04 22:09 lwch

强力围观...  回复  更多评论   

# re: 推箱子游戏,运行不需操作系统,自有引导扇区 2011-06-05 00:19 陈昱(CY)

强大啊,比我那个复杂多了,连像素都做出来,我那个还用着字符背景色。。。  回复  更多评论   

# re: 推箱子游戏,运行不需操作系统,自有引导扇区 2011-06-05 10:23 codejie

强力羡慕。。。刚做个android游戏感觉很丢脸了。。。  回复  更多评论   

# re: 推箱子游戏,运行不需操作系统,自有引导扇区 2011-06-05 11:52 空明流转

诶有,帅气!  回复  更多评论   

# re: 推箱子游戏,运行不需操作系统,自有引导扇区 2011-06-05 13:55 Paw

汇编写游戏。。。。
强大啊~~~~膜拜中  回复  更多评论   

# re: 推箱子游戏,运行不需操作系统,自有引导扇区 2011-06-06 21:54 sll

阅读(800) 强大啊  回复  更多评论   

# re: 推箱子游戏,运行不需操作系统,自有引导扇区 2011-06-07 09:58 zuhd

没敢看完,完全被震撼了  回复  更多评论   

# re: 推箱子游戏,运行不需操作系统,自有引导扇区 2011-06-07 10:53 coreBugZJ

@sll
100921301**吗?  回复  更多评论   

# re: 推箱子游戏,运行不需操作系统,自有引导扇区[未登录] 2011-06-07 11:07 vincent

非常非常非常赞
非常非常非常有创意!  回复  更多评论   

# re: 推箱子游戏,运行不需操作系统,自有引导扇区 2011-06-07 14:58 lc7cl

我cao你太牛了 膜拜  回复  更多评论   

# re: 推箱子游戏,运行不需操作系统,自有引导扇区[未登录] 2011-06-09 13:48 lwf

不需要操作系统那怎么显示游戏的框框呢,有点奇怪,莫非标题栏,工具栏也是自己画的么  回复  更多评论   

# re: 推箱子游戏,运行不需操作系统,自有引导扇区 2011-06-09 18:22 coreBugZJ

@lwf
那个窗口是x86模拟器Bochs的界面,窗口的客户区才属于推箱子。。。  回复  更多评论   

# re: 推箱子游戏,运行不需操作系统,自有引导扇区 2011-06-15 09:57 linbc

强大  回复  更多评论   



只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理