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