如何根据坐标读取控制台上已有的位置?大会8086

时间:2013-11-18 20:14:01

标签: assembly x86 x86-16

我正在制作一个pacman游戏,我需要检查我角色前方坐标中的内容,这样我就能看出pacman是否有可能进入那些坐标。我已经搜索了很多,但我不确定如何将这个问题放到谷歌搜索方面并且运气不佳。

我想做的伪代码:

CheckNext PROC

go to coordinate position (champ_xnew,champ_ynew)

take what is in that position, store into next (next BYTE ?)

上面的部分(从记忆中读取)是我需要帮助的。

cmp next, '#' ;# is what I am using for walls

je NoMove

jne Move

Move:

champ_x = champ_xnew

champ_y = champ_ynew

NoMove:

return without changing champ_x/y

CheckNext ENDP

3 个答案:

答案 0 :(得分:2)

只要屏幕处于文本模式(不是图形模式),您就可以从(分段的)地址0xB800:0x0000中回读屏幕数据。

答案 1 :(得分:0)

假设您正在使用彩色文本模式,因此您的屏幕从B800:0000开始,您正在使用8086操作码,即在有效地址计算中不缩放。一行有160个字节(每个字符单元填充两个字节:一个用于字符本身,另一个用于颜色)。

mov al,[x]
mov bl,160
mul bl           ;AX = x*80*2
xor bx,bx
mov bl,[y]
add bx,bx        ;BX = y*2
add ax,bx        ;AX = x*160 + y*2
mov si,ax
mov ax,0b800h
mov es,ax        ;ES:SI points to the character at coordinates X,Y
mov al,es:[si]   ;AL has the ASCII code of character at coordinates X,Y

答案 2 :(得分:0)

要读取字符和屏幕上特定坐标的颜色,有两种方法:

  1. 使用int 10h
  2. 的函数08h

    输入:

    啊= 08H bh =屏幕页数(我总是使用0)

    输出:

    AL =炭 啊=颜色(高4位,低4位是前景色和背景色)

    找出网页的编号,使用int 10h的函数0fh

    输出:

    al:当前的视频模式 啊:每行的cols数 BH:当前屏幕的数量

    int 10h的函数0fh如果在Windows控制台上使用它将导致错误,如果控制台

    不是全屏模式。

    1. 直接访问视频内存:
    2. 使用" mov ax,0b800h mov es,ax"

      将ds寄存器设置为0b800h

      将si设置为char的偏移量(NumberOfScreenpage *(cols * rows * 2)+ 2 *(row_number * cols + col))

      使用lodsw加载WORD

      啊现在包含颜色 al包含char