繁体   English   中英

Video MEM fasm assembly的使用方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM