一个引导型的游戏,可以自启动玩。

Peirre12个月前我的程序166

俄罗斯方块引导程序:

; TetrOS version 1.04   改写版
; by Tomasz Grysztar

; Requires VGA and 80386 CPU or higher.
; Version 1.01 was submitted in 2004 for a 512-byte OS contest.

; For your playing pleasure, it's a boot-sector Tetris game.
; Keys:
;   Left - move left
;   Right - move right
;   Up - rotate
;   Down - drop
;   Esc - new game at any time

format binary as 'img'
org 7C00h

ROWS = 23
COLUMNS = 12
BACKGROUND = 0 ; background color, 0 for randomized

virtual at 46Ch
  clock dw ?
end virtual

virtual at bp
  current dw ?
  current_column db ?
  current_row dw ?
  next dw ?
  score dw ?
  last_tick dw ?
  random dw ?
end virtual

label well at 9000h
label pics at well-2*64

        xor     ax,ax
        mov     sp,8000h
        mov     ss,ax
        mov     ds,ax
        mov     es,ax
        push    ax
        push    start
        retf

start:
        mov     bp,sp

        mov     al,13h
        int     10h

        mov     di,3*4
        mov     ax,int_3
        stosw
        xor     ax,ax
        stosw
        lea     di,[next]
        stosw   ; [next]
        stosw   ; [score]
        mov     ax,[clock]
        stosw   ; [last_tick]
        stosw   ; [random]

        mov     di,pics
        mov     cx,64
if BACKGROUND
        mov     ax,0F00h + BACKGROUND
else
        mov     ah,15
end if
        rep     stosb
        mov     dx,7
      @@:
        mov     al,15
        stosb
        mov     al,ah
        mov     cl,6
        rep     stosb
        mov     ax,0708h
        stosb
        dec     dx
        jnz     @b
        mov     cl,8
        rep     stosb

        or      ax,-1
        stosw
        stosw
        stosw
        mov     cl,ROWS+4
        mov     ax,not ( (1 shl COLUMNS - 1) shl ((16-COLUMNS)/2) )
        rep     stosw
new_piece:
        mov     bx,[random]
        mov     ax,257
        mul     bx
        inc     ax
        mov     cx,43243
        div     cx
        mov     [random],dx
        and     bx,7
        jz      new_piece
;        shl     bx,1
        movzx   ax,byte[pieces+bx-1]
        ;shl     ax,4
        xchg    ax,[next]
        or      ax,ax
        jz      new_piece
        lea     di,[current]
        stosw   ; [current]
        mov     al,6
        stosb   ; [current_column]
        mov     ax,well+(3+ROWS-4)*2
        stosw   ; [current_row]
        mov     si,no_move
        call    first_move
        jz      update_screen
        inc     bp      ; game over  

process_key:
        xor     ah,ah
        int     16h
        mov     al,ah
        dec     ah
        jz      start
        test    bp,bp
        jnp     process_key
        mov     si,rotate
        cmp     al,48h
        je      action
        mov     si,left
        cmp     al,4Bh
        je      action
        mov     si,right
        cmp     al,4Dh
        je      action
        cmp     al,50h
        jne     main_loop

drop_down:
        call    do_move_down
        jz      drop_down

action:
        call    do_move

update_screen:
        mov     bx,7
        mov     dx,12h
        mov     ah,2
        int     10h
        mov     cl,12
      print_score:
        mov     ax,[score]
        shr     ax,cl
        and     al,0Fh
        cmp     al,10
        sbb     al,69h
        das
        mov     ah,0Eh
        int     10h
        sub     cl,4
        jnc     print_score
        push    es
        push    0A000h
        pop     es
        mov     si,well+3*2
        mov     di,320*184+160-(COLUMNS*8)/2
      draw_well:
        lodsw
        push    si
        mov     dl,COLUMNS
        xchg    bx,ax
        shr     bx,(16-COLUMNS)/2
        call    draw_row
        pop     si
        cmp     si,well+(3+ROWS)*2
        jb      draw_well
        mov     di,320*100+250
        mov     bx,[next]
      draw_preview:
        mov     dl,4
        call    draw_row
        cmp     di,320*68
        ja      draw_preview
        pop     es

main_loop:
        mov     ah,1
        int     16h
        jnz     process_key
        mov     al,-1
        xor     al,byte [score+1]
        and     al,11b
        mov     cx,[clock]
        sub     cx,[last_tick]
        cmp     cl,al
        jbe     main_loop
        add     [last_tick],cx
        call    do_move_down
        jz      update_screen
        movzx   dx,byte [current_row]
        shr     dx,2
        mov     si,well+3*2
        mov     di,si
      check_row:
        lodsw
        inc     ax
        jz      remove_row
        dec     ax
        stosw
        jmp     check_next_row
      remove_row:
        shl     dx,1
      check_next_row:
        cmp     di,well+(3+ROWS)*2
        jb      check_row
        add     [score],dx
        jmp     new_piece

draw_row:
        push    di
      blit_row:
        shr     bx,1
        mov     si,pics
        jnc     blit_block
        add     si,64
      blit_block:
        mov     cx,8
        rep     movsb
        add     di,320-8
        test    si,111111b
        jnz     blit_block
        sub     di,320*8-8
        dec     dx
        jnz     blit_row
        pop     di
        sub     di,320*8
        ret

do_move_down:
        mov     si,down
do_move:
        mov     al,1
        int3
first_move:
        push    dword [current]
        call    si
        xor     ax,ax
        int3
        inc     ax
        pop     edx
        test    ah,ah
        jz      @f
        mov     dword [current],edx
      @@:
        int3
      no_move:
        ret
down:
        sub     byte [current_row],2
        ret
left:
        dec     [current_column]
        ret
right:
        inc     [current_column]
        ret
rotate:
        mov     cx,3
     @@:
        bt      [current],cx
        rcl     dx,1
        add     cl,4
        cmp     cl,16
        jb      @b
        sub     cl,17
        jnc     @b
        mov     [current],dx
        ret

int_3:
        mov     di,[current_row]
        mov     bx,4
      on_piece_row:
        mov     dx,[current]
        mov     cl,bh
        shr     dx,cl
        and     dx,1111b
        mov     cl,[current_column]
        add     cl,4
        shl     edx,cl
        shr     edx,4
        test    al,al
        jz      @f
        xor     [di],dx
      @@:
        test    [di],dx
        jz      @f
        inc     ah
      @@:
        add     bh,4
        scasw
        dec     bl
        jnz     on_piece_row
        iret

pieces:
        db 1111'0000b ;I
        db 1110'0100b ;T
        db 1110'0010b ;J
        db 1110'1000b ;L
        db 0110'0110b ;O
        db 0110'1100b ;S
        db 1100'0110b ;Z

;       dw 0010'0010'0010'0010b
;       dw 0010'0110'0010'0000b
;       dw 0010'0010'0110'0000b
;       dw 0100'0100'0110'0000b
;       dw 0000'0110'0110'0000b
;       dw 0100'0110'0010'0000b
;       dw 0010'0110'0100'0000b

       n = 0
repeat 7C00h+510-$
       display n+30h
       n=n+1
       if n=10
       n=0
       display 13,10
       end if
       db 0
end repeat

dw 0AA55h

这个引导型程序是16位系统的引导程序,一开始的引导程序中最好是16位再32位。这样就可以了。因为计算机的BIOS基本输入输出系统有几个模式,基地址都不同。

后来的资料是32位保护模式,一直存在了很多年,从1990到2023有30年的历史地位了,那64位保护模式很一般,因为只是权限和为了更远的地址还有64位程序大作战。

上一层的管理你不太懂,CPU管理64位是一块一块的,到32位就连续了,你要知道,32位的寻址对64位寻址来说是冰山一角。也有可能,你看到的是别人电脑的内存。这个你还不知道。

你知道当权限被局限成32位的模式之后,有跳过64位的址的吗?最简单的就是利用MMX寄存器,这个寄存器利用得好是没有限制的。跳越地址快得很。这和CPU结构有关。并不复杂,只是巧思。

那些研究计算机指令和破解的人并没有完全看懂intel手册。也都只是局部了解,不过也是一通百通。究真没意义。不过有些指令和实现很吸引人,不用过分的死记硬背。这个技术来得快。

那起步是有难度的,一开始是捉虫,有个抖音视频,BUG!BUG!BUG!也就是两边战士打架,一边的一位战士丢了一个手榴弹,那手榴弹不是弦线,是弦线加垂直线下来打的中间的那几个人。

那几个人不知道是两边哪一边的。可能是两边的人打架的前锋在一起了,一起吃个饭,还是被炸了。焦糊的黑灰脸,一个东北帽,两只大眼睛向上向前,“bug,bug,bug",当然,这是一个笑话。没下文了,一个引导型游戏。截屏不太方便。

1.jpg

相关文章

发布一个雷达显示程序,仅测试,有问题请交流。

发布一个雷达显示程序,仅测试,有问题请交流。

下载地址:雷达显示程序.rar这个雷达显示程序用来显示雷达数据的。使用易语言编写。数据部分还没完善。欢迎提意见。...

linux 下的汉字输入法.

linux 下的汉字输入法.

各位老师,才子,同事们好!有很多初级玩linux的同学都会碰到一个难题,也就是在linux 下的汉字输入法.这个问题一直困绕了linux 使用者多年.我还好,每次都使用正常.现在说说心得笔记就可以了....

关于ch341驱动,联动3D打印机USB串口通讯.

关于ch341驱动,联动3D打印机USB串口通讯.

手上有个3D打印机,搬家的原因,好久没用.天气热了,打印温度很适合,正好可以使用.又过了一年.发现linux 版本内核已经升级,和原来的系统不一样了. 按照3D打印机的说明,和寻找它的程序,原来的方法...

linux 下的 opengl SDK。

linux 下的 opengl SDK。

opengl 图形库是开放式图形库,最近出了一个freeglut3 我们下载它:sudo apt-get install freeglut3sudo apt-get install freeglut3...

linux 下的《仙剑奇侠传》

linux 下的《仙剑奇侠传》

以前的DOS游戏《仙剑奇侠传》是炙制人口的一个很容易上手的游戏。这个游戏流行了很多年。很多人在玩过多年以后,重温旧梦,回味游戏之中的情感。这个游戏再版了很多次了。现在linux 下也可以直接玩这个游戏...

刚刚上手的一个汇编程序nasm。

刚刚上手的一个汇编程序nasm。

今天使用了masm32软件,总有使不上劲的感觉。因为intel 指令集很多都没有,自己想测试一下,一边翻资料,一边使用。windows 编程好用,但是指令不全,心里总是感觉差一点。又不是编大程序,只是...