[英]How to use Video MEM fasm assembly
我正在 fasm 汇编 R-OS 上编写操作系统,我想知道如何在没有 bios 的情况下使用视频 memory。 当前操作系统为 Windows 或 MacOS 让我在 kernel 中创建视频系统,但我不知道如何操作。 请帮助。
启动.asm:
org 0x7C00
xor ax, ax
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 0,7C00
cld
mov ax, 0x03
int 0x10
mov si, boot_msg
call printf
mov al, 0x04
mov bx, 0x7E00
mov cx, 0x0002
mov dh, 0x00
call disk_read
mov ax, 0x7E0
mov ds, ax
mov es, ax
mov sp, 0x7E00
jmp 0x7E0:0x0000
include 'disk.asm'
include 'printh.asm'
times 510-$+$$ db 0x00
dw 0xAA55
include 'kernel.asm'
times 65536-512-$+$$ db 0x00
kernel.asm:
org 0x7E00
mov ax, 0x4F02
mov bx, 0x101
int 0x10
mov ah, 0x0C
mov al, 0x0F
mov cx, 0x10
mov dx, 0x10
int 0x10
msg0 db 'R-OS', 0x00
raf dd 0
wax dw 0
wah db 0
wal db 0
buff db 1024 dup (?)
jmp end2048
end2048:
cli
hlt
jmp $-2
times 2048-$+$$ db 0x00
disk.asm 只有 kernel load func 和 printh.asm 只有 printf 和 printh funcs
并非每个 BIOS 都适用于像 101h 这样的扩展视频模式。 BIOS.WritePixel function 0Ch 通常只在 LEGACY 视频模式下运行。 这些是编号范围为 0 到 19 的视频模式。
视频模式 101h 是 640x480 256 色 VESA 定义的视频模式。 在不使用 BIOS 的情况下在屏幕上写入像素将需要学习很多有关 VESA、线性帧缓冲区、库切换等的知识。
您正在创建操作系统。 而你才刚刚开始。 我认为你应该在这个阶段尽可能简单,select 一个易于使用的传统视频模式:320x200 256 色视频模式。
操作系统不仅仅是它的屏幕,所以将大部分时间花在其他事情上,最后留下 output 屏幕的细节。 稍后你会感谢我的。 以前很多人都在写漂亮的启动画面和特效,却连基本的输入行(提示符)都没有提供。
这是您如何将单个像素直接放在 320x200 256 色屏幕上的示例。 像素的地址是从
AddressInVideoBuffer = (Y * BytesPerScanline) + X
mov ax, 0013h ; BIOS.SetVideoMode 320x200x8
int 10h
...
; Puts a green dot in the middle of the screen
mov cl, 2 ; Color = Green
mov bx, 100 ; Y
mov ax, 160 ; X
call PutPixel
...
; IN (ax,bx,cl) OUT () MOD (ax)
PutPixel:
push ds bx ; Preserve registers, allow AX to get clobbered
imul bx, 320 ; Y * BytesPerScanline
add bx, ax ; + X
mov ax, 0xA000 ; VideoBuffer
mov ds, ax
mov [bx], cl ; Write the color from CL
pop bx ds ; Restore registers
ret
这是另一个使用嵌套循环用某种颜色填充屏幕矩形区域的代码:
; IN (ax,bx,cl,si,di)
; AX is UpperLeftX, BX is UpperLeftY, CL is Color, SI is Width, DI is Height
PaintRectangle:
push ds bx di ; Preserve registers, allow AX to get clobbered
imul bx, 320 ; UpperLeftY * BytesPerScanline
add bx, ax ; + UpperLeftX
mov ax, 0xA000 ; VideoBuffer
mov ds, ax
.OuterLoop:
push si ; (1)
.InnerLoop:
dec si
mov [bx+si], cl ; Write the color from CL
jnz .InnerLoop
pop si ; (1)
add bx, 320 ; Move to next scanline (line below)
dec di ; Decrement Height
jnz .OuterLoop
pop di bx ds ; Restore registers
ret
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.