Video MEM fasm assembly的使用方法
How to use Video MEM fasm assembly
我正在写一个关于 fasm 汇编的 OS,R-OS,我想知道如何在没有 bios 的情况下使用显存。当前 OSs 作为 Windows 或 MacOS 让我在内核中创建视频系统,但我不知道如何做。请帮忙
boot.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 刚刚有内核加载函数
printh.asm 只是 printf 和 printh
功能
并非每个 BIOS 都适用于像 101h 这样的扩展视频模式! BIOS.WritePixel 函数 0Ch 通常仅在 LEGACY 视频模式下运行。这些是编号范围从0到19的视频模式。
视频模式 101h 是 640x480 256 色 VESA 定义的视频模式。在不使用 BI 的情况下在屏幕上写入像素OS 将需要学习很多有关 VESA、线性帧缓冲区、库切换等的知识
您正在创建 OS。而你才刚刚开始。我认为您在这个阶段应该尽可能简单,select 一种易于使用的传统视频模式:320x200 256 色视频模式。
操作系统不仅仅是它的屏幕,所以请将大部分时间花在其他事情上,而将输出屏幕的细节留到最后。稍后你会感谢我的。以前很多人都在写漂亮的启动画面和特效,却连基本的输入行(提示)都没有。
这是您如何将单个像素直接放在 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
我正在写一个关于 fasm 汇编的 OS,R-OS,我想知道如何在没有 bios 的情况下使用显存。当前 OSs 作为 Windows 或 MacOS 让我在内核中创建视频系统,但我不知道如何做。请帮忙
boot.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 刚刚有内核加载函数 printh.asm 只是 printf 和 printh 功能
并非每个 BIOS 都适用于像 101h 这样的扩展视频模式! BIOS.WritePixel 函数 0Ch 通常仅在 LEGACY 视频模式下运行。这些是编号范围从0到19的视频模式。
视频模式 101h 是 640x480 256 色 VESA 定义的视频模式。在不使用 BI 的情况下在屏幕上写入像素OS 将需要学习很多有关 VESA、线性帧缓冲区、库切换等的知识
您正在创建 OS。而你才刚刚开始。我认为您在这个阶段应该尽可能简单,select 一种易于使用的传统视频模式:320x200 256 色视频模式。
操作系统不仅仅是它的屏幕,所以请将大部分时间花在其他事情上,而将输出屏幕的细节留到最后。稍后你会感谢我的。以前很多人都在写漂亮的启动画面和特效,却连基本的输入行(提示)都没有。
这是您如何将单个像素直接放在 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