runningwater преди 1 година
родител
ревизия
8add2dd948
променени са 1 файла, в които са добавени 66 реда и са изтрити 0 реда
  1. 66 0
      boot/mbr.s

+ 66 - 0
boot/mbr.s

@@ -0,0 +1,66 @@
+; 主引导程序
+; ----------------------------------------------------------------
+SECTION MBR vstart=0x7c00
+    mov ax, cs ; 0x00000000
+    mov ds, ax
+    mov es, ax
+    mov ss, ax
+    mov fs, ax 
+    mov sp, 0x7c00
+
+    call CleanDisply
+    call GetCursorPosition
+    call DispStr
+	jmp $
+
+
+;清屏,利用 0x06 号功能,上巻全部行,则可清屏
+; ----------------------------------------------------------------
+; INT 0X10 功能号:0x06 功能描述:上巻窗口
+; AL=上卷行数
+; AL=0 整个窗口空白
+; BH=卷入行属性
+; CH=左上角行号 (CH、CL)=窗口的左上角位置(Y坐标,X坐标)
+; CL=左上角列号
+; DH=右下角行号 (DH、DL)=窗口的右下角位置(Y坐标,X坐标)
+; DL=右下角列号
+; ----------------------------------------------------------------
+CleanDisply:
+    mov ah, 0x06 ; 功能号
+    mov al, 0x00 ; 上巻的行数(如果为 0,表示全部)
+    mov bx, 0x700 
+    mov cx, 0      ; 左上角:(0,0)
+    mov dx, 0x184f ; 右下角: (80, 25)
+                ; VGA 文本模式中,一行只能容纳 80 个字符,共 25 行. 
+                ;下标、从 0 开始,所以 Ox18=24, 0x4f=79
+    int 0x10      ; 调用 INT 0x10 功能
+    ret
+
+
+;;;;;;;;;;;; 获取光标位置 ;;;;;;;;;;;;;
+; .get_cursor_position, 在光标位置打印字符
+GetCursorPosition:
+    mov ah, 0x3  ; 3 号功能是获取光标位置,需要
+    mov bh, 0    ; 待获取光标的页号
+
+    int 0x10
+    ret 
+;;;;;;;;;;;; 获取光标位置结束 ;;;;;;;;;
+
+; 13 号子功能打印字符串
+;--------------------------------------------------------
+;--------------------------------------------------------
+DispStr:
+	mov ax, BootMessage
+	mov bp, ax         ; ss:bp 为串首地址  
+
+	mov cx, 16         ; 串长度,不包括结束符个数
+	mov ax, 0x01301    ; 子功能号 13 显示字符及属性
+                ; al 设置写字符方式 al=01: 显示字符串,光标跟随移动
+	mov bx, 0x2  ; bh 显示的页号 bl 是字符属性,黑底绿字(bl=02h)
+	mov dl, 0
+	int 0x10
+	ret
+BootMessage:	db "Hello OS World"
+times 510 - ($-$$) db 0
+db 0x55, 0xaa