08day 鼠标显示控制 与32位模式切换

鼠标显示控制 与有关规定关系更大


通往32位模式之路

; haribote-os boot asm
; TAB=4

BOTPAK  EQU     0x00280000      ; bootpack偺儘乕僪愭
DSKCAC  EQU     0x00100000      ; 僨傿僗僋僉儍僢僔儏偺応強
DSKCAC0 EQU     0x00008000      ; 僨傿僗僋僉儍僢僔儏偺応強乮儕傾儖儌乕僪乯

; BOOT_INFO娭學
CYLS    EQU     0x0ff0          ; 僽乕僩僙僋僞偑愝掕偡傞
LEDS    EQU     0x0ff1
VMODE   EQU     0x0ff2          ; 怓悢偵娭偡傞忣曬丅壗價僢僩僇儔乕偐丠
SCRNX   EQU     0x0ff4          ; 夝憸搙偺X
SCRNY   EQU     0x0ff6          ; 夝憸搙偺Y
VRAM    EQU     0x0ff8          ; 僌儔僼傿僢僋僶僢僼傽偺奐巒斣抧

        ORG     0xc200          ; 偙偺僾儘僌儔儉偑偳偙偵撉傒崬傑傟傞偺偐

; 夋柺儌乕僪傪愝掕

        MOV     AL,0x13         ; VGA僌儔僼傿僢僋僗丄320x200x8bit僇儔乕
        MOV     AH,0x00
        INT     0x10
        MOV     BYTE [VMODE],8  ; 夋柺儌乕僪傪儊儌偡傞乮C尵岅偑嶲徠偡傞乯
        MOV     WORD [SCRNX],320
        MOV     WORD [SCRNY],200
        MOV     DWORD [VRAM],0x000a0000

; 僉乕儃乕僪偺LED忬懺傪BIOS偵嫵偊偰傕傜偆

        MOV     AH,0x02
        INT     0x16            ; keyboard BIOS
        MOV     [LEDS],AL

; PIC关闭一切中断
;   ATT兼容机的规则 如果要初始化PIC
;   必须在CLI之前进行,否则有时会挂起
;   随后进行PIC初始化
        MOV     AL,0xff
        OUT     0x21,AL
        NOP                     ; 
        OUT     0xa1,AL
        CLI                     ; 禁止CPU级别的中断

; 为了让CPU能够访问1MB以上的内存空间 设定A20GATE

        CALL    waitkbdout
        MOV     AL,0xd1
        OUT     0x64,AL
        CALL    waitkbdout
        MOV     AL,0xdf         ; enable A20 on
                                ;使内存的1MB以上变为可用状态
        OUT     0x60,AL
        CALL    waitkbdout

; 切换到保护模式

[INSTRSET "i486p"]              ; 为了能够使用386以后的LGDT EAX CR0等

        LGDT    [GDTR0]         ; 设定临时GDT
        MOV     EAX,CR0
        AND     EAX,0x7fffffff  ; bit31=0
        OR      EAX,0x00000001  ; bit0=1
        MOV     CR0,EAX         ;CR0最高位为0 最低位为1 进入到了保护模式
        JMP     pipelineflush
pipelineflush:
        MOV     AX,1*8          ;  可读写的段 32bit
        MOV     DS,AX
        MOV     ES,AX
        MOV     FS,AX
        MOV     GS,AX
        MOV     SS,AX

; bootpack的转送 从bootpack.hrb开始的512kb复制到0x00280000地址去

        MOV     ESI,bootpack    ; 转送源
        MOV     EDI,BOTPAK      ; 转送目的地
        MOV     ECX,512*1024/4
        CALL    memcpy

; 磁盘数据最终传送到它本来的位置去

; 首先从启动扇区开始 讲启动区的512字节转送到1M后内存去

        MOV     ESI,0x7c00      ; 转送源
        MOV     EDI,DSKCAC      ; 转送目的地
        MOV     ECX,512/4
        CALL    memcpy

; 所有剩下的 将0x00008200的磁盘内容 复制到0x100200那里

        MOV     ESI,DSKCAC0+512 ; 源
        MOV     EDI,DSKCAC+512  ; 目的地
        MOV     ECX,0
        MOV     CL,BYTE [CYLS]
        IMUL    ECX,512*18*2/4  ; 从柱面数变换为字节数
        SUB     ECX,512/4       ; 减去IPL
        CALL    memcpy

; 必须由asmhead来完成的工作 至此全部完毕
;    以后就由bootpack来完成

; bootpack的启动

        MOV     EBX,BOTPAK
        MOV     ECX,[EBX+16]
        ADD     ECX,3           ; ECX += 3;
        SHR     ECX,2           ; ECX /= 4;
        JZ      skip            ; 
        MOV     ESI,[EBX+20]    ; 
        ADD     ESI,EBX
        MOV     EDI,[EBX+12]    ; 
        CALL    memcpy
skip:
        MOV     ESP,[EBX+12]    ; 
        JMP     DWORD 2*8:0x0000001b

waitkbdout:
        IN       AL,0x64
        AND      AL,0x02
        IN       AL,0x60        ;空读
        JNZ     waitkbdout      ; AND结果如果不是0 就返回继续读 清楚缓冲区的垃圾数据
        RET

memcpy:
        MOV     EAX,[ESI]
        ADD     ESI,4
        MOV     [EDI],EAX
        ADD     EDI,4
        SUB     ECX,1
        JNZ     memcpy          ; 
        RET
; 

        ALIGNB  16
GDT0:
        RESB    8               ; NULL SELECTOR
        DW      0xffff,0x0000,0x9200,0x00cf ; 可以读写的段 32bit
        DW      0xffff,0x0000,0x9a28,0x0047 ; 可以执行的段32bit bootpack用

        DW      0
GDTR0:
        DW      8*3-1
        DD      GDT0

        ALIGNB  16
bootpack:

纸娃娃操作系统的内存分布图

0x00000000-0x000fffff 1MB空间 在启动中会多次使用 但之后就会变空
0x00100000-0x00267fff 用于保存软件的内容 1440KB
0x00268000-0x0026f7ff 空
0x0026f800-0x0026ffff IDT 2KB
0x00270000-0x0027ffff GDT 64KB
0x00280000-0x002fffff bootpack.hrb
0x00400000 - * 空

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值