【发布时间】:2017-08-08 04:37:28
【问题描述】:
花了一些时间,但终于在 16 位图形中得到了平方 1。 这里我清屏并绘制一个像素:
mov ax, 0a000h
mov es, ax ; es - Extra Segment now points to the VGA location
mov ax, 0013h
int 10h
xor al, al
mov dx, 3c8h
out dx, al
inc dx
mov al, 63
out dx, al
out dx, al
out dx, al
mov ax, 0100h
int 21h
mov ax, 4c00h
int 21h
; draw single pixel :)
mov ah, 0ch;
mov al, 03h ; color
mov cx, 70 ; x co-ordinate
mov dx, 70 ; y co-ordinate
; mov bh,1 ; page #
int 10h
times 510-($-$$) db 0 ; PadZeros:
dw 0xaa55 ; MagicNumber
第 2 步:如何让它移动?
显然,这意味着在循环中交替擦除屏幕、更新和绘制像素。当然它会飞过屏幕,所以我猜你会访问内部时钟的毫秒,比较,然后在它大于某个常数时更新。
刚开始组装。我确实知道如何使用标签来制作伪函数,所以假设我可能已经在示例中继续这样做了。
我从 nasm 编译为 bin,然后在 qemu 中直接打开。注意我不使用链接器,因此不需要使用 .text 或任何其他 .bss 只是尝试使用原始二进制文件。
如果有人对低级机器代码入门教程感兴趣,我也会尝试记录我在 YouTube 上学到的所有内容: https://www.youtube.com/watch?v=XJdcoHjzvCo&list=PLJv7Sh0ZDUnpNnhNm3msK1C4K_8SzfMvO
如果其他人也在尝试编写内核、他们自己的操作系统、编译器或了解更多关于汇编中的 16 位游戏图形的并行路径,请随时加入 KAOS 项目并帮助创建 100 % 视频记录操作系统: https://github.com/musicalglass/KAOS
KAOS 没有 BS 的操作系统
【问题讨论】:
-
如果我正确读取了该源代码,它会将颜色索引 0 设置为全白,然后等待一个键并退出(如果加载了一些 DOS,它会退出)。
; draw single pixel后面的代码不可达? (现在我明白了,它是引导扇区,所以int 21h是无效的,不知何故不会崩溃,只是返回,然后你通过 BIOS 绘制像素......我明白了)你为什么要通过 BIOS 绘制像素? :-o .. 只需像mov al,3mov es:[70*320+70],al一样将其写入内存。关于你的代码“教程”......是的,学生辅导和存档,听起来不错,但我更喜欢不那么悲惨的情景喜剧。 -
如何让它动起来很明显:1)清晰(以后有背景的时候会变成“恢复背景”,下一个阶段是“我每帧都从头开始画整个帧” ) 旧的。 2)画新的。 ...“太宽泛”的部分是时间,在真正的硬件时代,VSYNC 同步已被大量使用,因为这是使其平滑的唯一方法(只要您的代码执行得足够快以与光束相提并论)。然后 CRT 以更高的频率显示。卖掉了,所有的 vsync 时间都关闭了,游戏运行得更快了,等等。现在 LCD 大多是 60Hz = 足以进行实验
-
但是要对动画进行适当的计时,这实际上是一个相当复杂的话题(我的意思是远远超出简单的 SO 答案,但这也不是火箭科学)。一旦你没有固定的屏幕刷新率,你将不得不在这里和那里做一些妥协,可能没有为每个显示器提供完美的解决方案(尤其是在旧的“2D 视差”平面滚动的情况下)。如果您不关心没有视觉伪影的平滑图形,那么只需读取一些硬件时钟(只要确保您不使用机器周期之一,它通过 cpu 频率动态加速/减速)并插入位置。跨度>
-
好的,到目前为止,我得到了通常没有帮助的答案,任何人都可以通过谷歌搜索找到。您会发现无数的论坛链接,您可以在其中获得相同的陈词滥调答案; 1:和你争论:“为什么世界上会有人想做 16 位图形?” 2:去其他地方读一本关于操作系统开发的书。 3:陈述显而易见:“动画是一系列帧,这里还有一些我刚刚从 WIKI 搜索中抓取的更多无用的东西”太棒了!非常感谢!你们都想表现得如此博学,但没有人回答一个非常简陋的问题
标签: animation assembly nasm machine-code