加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

图形界面的源代码

(2011-07-23 15:52:08)
标签:

杂谈

[BITS 16]
 org  07c00h  ; BIOS 将把 Boot Sector 加载到 0:7C00 处
 mov sp, cs
        mov     ss, sp  ; 栈sp寄存器反正将要设置, 先借来用用
        mov     sp,07c00h
        push cs
        pop ds
 push cs
 pop es

  ; 清屏
        mov ax,13h ;320x200图形方式
        int 10h

 call disp_booting

        xor ah,ah
        xor dl,dl
        int 013h ;初始化磁盘

; 外存软盘没有文件结构,整个500k一个程序文件。把文件读入内存
        mov ax,07c0h
        mov es,ax ; 设置段址
        mov byte [_80],0 ; 磁道号
_20:
        xor bx,bx ; 偏址清 0
        mov dh,0 ; 0 磁头
        call _30 ; 读18扇区整个磁道
        mov bx,512*18 ; 偏址增加
        mov dh,1 ; 1 磁头
        call _30 ; 读盘
        mov ax,es
        mov bx,512*18*2
        shr bx,4
        add ax,bx
        cmp ax,8000h    ; 段界限 0000:0000-8000_0000
        ja  _10  ; 超,停止读盘
        mov es,ax ; 段增
        inc byte [_80]
        cmp byte [_80],2 ;28 ; 最多读28道
   ; 512字节x2头x18扇区x28道=504k
        jnz _20  ; 继续读盘
_10:                    
        push cs
        pop es

 jmp _100 ; 为了节约引导部分珍贵的512个字节, 全部移到最后

disp_booting:
 push ds
 pop es
 mov bp,message
 mov cx,8
 mov ax,1301h
 mov bx,7
 mov dl,0
 int 10h
 ret
message:
 db 'booting:'
_80:  ;磁道计数
        db 0    
       
_30:  ; 读磁盘
        mov ah,2
        mov al,18 ; 每道18扇区
        mov ch,byte [_80] ; 磁道号
        mov cl,1
        mov dl,0 ; A 盘
        int 013h

 push ax
 push bx
 mov ah,0eh
 mov al,'.'
 mov bl,0fh
 int 10h ;读一磁道画一点
 pop bx
 pop ax
        ret        

times  510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节
dw  0xaa55     ; 结束标志


; long mode - 64bit code  ; 内存定位在 7e00 处
_64:
[bits 64]
 call _400 ;画window
        mov qword [_510],0a7da0h ;定光标位置,屏幕中心
 cld
        call _520
        call _530
 call _500 ;画光标
_loop: 
 call _410 ;keybord
 ;在没有中断功能时,权宜之计,在死循环中调用              
 ;这样也有键盘和显示功能,过过瘾
 jmp _loop

_410: ;keybord
        push rax ;没必要,只不过提醒一下,不能随便ret
        in al, 60h ;查询
 push rax
 call _45w ;延时
 pop rax
        cmp al,38h   ;alt
        jz _440
        cmp al,0eh  ;<- 退格键,在回车键上方
 jz _470
        cmp al,0fh  ; tab制表键
        jz _450
        cmp al,1ch  ; enter回车键
        jz _460
 cmp al,1 ;esc重启
 jz _480
 cmp al,4bh ;<向左
 jz _490
 cmp al,4dh ;>向右
 jz _4a0
 cmp al,48h ;^向上
 jz _4b0
 cmp al,50h ;v向下
 jz _4c0
        pop rax
        ret
_480: ;esc
 call _400 ;重新画窗囗
        mov qword [_510],0a7da0h   
        mov byte [_451],0
 pop rax
 ret
_490: ;<
 call _530 ;抹去光标
        sub qword [_510],8
 call _500 ;画光标
 pop rax
 ret

_4a0: ;>
 call _530
        add qword [_510],8
 call _500
 pop rax
 ret
_4b0: ;^
 call _530
        sub qword [_510],3200
        call _500
 pop rax
 ret
_4c0: ;v
        call _530
        add qword [_510],3200
        call _500   
 pop rax
 ret

_430:     ; keybord 123456
        in al,60h
        mov r8b,al
 cmp al,11
        ja _430
        jnz _431
        mov r8b,1
_431:
 push rax
        call _45w ;延时
 pop rax

        dec r8b ;is 123456
        ; 信号转换成字符   
 mov rdi,[_420]
        mov r8b,0fh ;颜色:白
        call _310  ;显示字符
        pop rax
 ret


_440:      ;alt
 cmp byte [_451],0
 jnz _44z
 mov byte [_451],1
 call _441 ;只黒第一个窗口
_44z:
 pop rax
 ret
_441:
 mov r9w,0 ;座标
 shl r9,16
 mov r9w,10
 shl r9,16
 mov r9w,50
 shl r9,16
 mov r9w,22
        mov r8,0h ;颜色
 call _270 ;画长方形
 ret
_442:
 mov r9w,52 ;座标
 shl r9,16
 mov r9w,10
 shl r9,16
 mov r9w,100
 shl r9,16
 mov r9w,22
        mov r8,0h ;颜色
 call _270 ;画长方形
 ret

_443: 
 mov r9w,102 ;座标
 shl r9,16
 mov r9w,10
 shl r9,16
 mov r9w,150
 shl r9,16
 mov r9w,22
        mov r8,0h ;颜色
 call _270 ;画长方形
 ret
_451:  ;alt按过标志
 db 0
_45w:  ;延时
 push rcx
        mov rcx,1000000
_45x:
 nop
 loop _45x
 pop rcx
 ret
_450:           ;tab
        call _45w
        call _45w ;延时
        call _45w
 cmp byte [_451],0
 jz _452 ;alt没有按过,直接返回
 cmp byte [_451],1
 jz _453
 cmp byte [_451],2
 jz _454
 cmp byte [_451],3
 jnz _452
 mov byte [_451],1
 call _224
 call _441
 jmp _452
_453:
 call _222
 call _442
 mov byte [_451],2
 jmp _452
_454:
 call _223
 call _443
 mov byte [_451],3
_452:      
        pop rax
        ret
_46z:
 db 0
  dq 0 ;怕8位存入64位,把后面冲掉,隔离
_460:               ;enter
        call _45w
        mov al,[_451] ;取tab选出的菜单
 or al,al
 jz _461 ;0
 dec al
 jz _462 ;1
 dec al
 jz _463 ;2
 dec al
 jz _464 ;3
_465:
        mov byte [_451],0
        pop rax
        ret
_461:  ;0 什么也没选,打字
 cmp byte [_46z],3
 jz _46i
 cmp byte [_46z],3 ;1
 jz _
 cmp byte [_46z],2
 jz _700
 cmp byte [_46z],4
 jz _600
  ;mov byte [_46z],1
        mov rax,[_510] ;取光标指定的位置
        mov qword [_420],rax ;0a3840h
 mov rcx,8 ;八个数意思意思
_467:
 add qword [_420],8
 call _466
 loop _467
 jmp _465
_466:  ; 多此一举,没必要,开始有想法,后来懒得改
 call _430 ;123456
 ret

_462:  ;1 按tab选了1,回车,转此,画斜线
 mov byte [_46z],2
 call _222      
        mov byte [_46h],38
        jmp _465
_700:
        cmp byte [_46h],38 ;随便乱捡的,臭三八
        jz _710
        cmp byte [_46h],83 ;瘪三
        jz _720
        cmp byte [_46h],76 ;赤佬
        jz _780
 jmp _465 
_710:
        mov byte [_46h],83
 mov rax,[_510] 
 mov [_46x],rax 
 jmp _465
_720:
        mov byte [_46h],76
 mov rax,[_510]
 mov [_46y],rax

        call _46e

 mov ax,word [_46c]
 sub ax,word [_46a]
        ja  _730
 mov word [_791],-1
 neg ax
 mov word [_793],ax
 jmp _731
_730:
 mov word [_791],1
 mov word [_793],ax ;差
_731:
 mov ax,word [_46d]
 sub ax,word [_46b]
        ja  _740
 mov word [_792],-1
 neg ax
 mov word [_794],ax
 jmp _741 
_740:
 mov word [_792],1
 mov word [_794],ax 
_741:
 cmp ax,word [_793] ;差比较
 ja _750
 mov ax,word [_793]
_750:
 mov word [_795],ax ;长的
 mov word [_797],0
 mov word [_798],0
 ;mov cx,ax
 ;inc cx
 ;movzx rcx,cx 
 mov rcx,0
_760:
 call _7a0
 mov ax,word[_793]
 add ax,word [_797]
 mov word [_797],ax
 cmp ax,word [_795]
 jb _770
 sub ax,word [_795]
 mov word [_797],ax
 mov ax,word [_791]
 add word [_46a],ax
_770:
 mov ax,[_794]
 add ax,word [_798]
 mov word [_798],ax
 cmp ax,word [_795]
 jb _775
 sub ax,word [_795]
 mov word [_798],ax
 mov ax,word [_792]
 add word [_46b],ax 
_775:  
 inc cx
 ;cmp cx,word [_795]
 cmp cl,byte [_795]
 jnz _760 
 jmp _465
_7a0:
        mov ax,word [_46b] ;a] ;b]
 movzx rax,ax
 mov rdi,320
 mul rdi
        mov di,word [_46a] ;b] ;a]
        movzx rdi,di
        add rdi,rax
        add rdi,0a0000h
 mov al,1
 stosb  ;画点
 ret
_780:
 mov byte [_46h],38
 jmp _465

_790:  ;变量
 dw 0
_791:
 dw 0
_792:
 dw 0
_793:
 dw 0
_794:
 dw 0
_795:
 dw 0
_796:
 dw 0
_797:
 dw 0
_798:
 dw 0
_799:
 dw 0
 dq 0
_46x:
 dq 0a0000h ;第一次光标定位址
_46y:
 dq 0a0000h ;第二次光标定位址
_46a:
        dw 0 ;第一次光标定位座标 320x200
_46b:
        dw 0   
_46c:
        dw 0 ;第二次光标定位座标 320x200
_46d:
        dw 0     
_46h:
        db 0
_463:  ;2  按tab选了2,回车,转此,画长方形
 call _223 
 mov byte [_46z],3
 mov byte [_46h],90
 jmp _465 
_46i:
 cmp byte [_46h],90
 jz _46o
 cmp byte [_46h],12
 jz _46j
 cmp byte [_46h],34
 jz _46k
 cmp byte [_46h],56
 jz _46l
 cmp byte [_46h],78
 jz _46m
 mov byte [_46h],90
 jmp _465 
_46o:
 mov byte [_46h],12
 mov rax,[_510] 
 mov [_46x],rax 
 jmp _465
_46j: 
 mov byte [_46h],34

 mov rax,[_510]
 mov [_46y],rax

        call _46e
 mov r9w,word [_46a]
 cmp r9w,word [_46c]
        jb  _46g 
 xchg r9w,word [_46c]
 mov word [_46a],r9w
_46g:
 mov r9w,word [_46b]
 cmp r9w,word [_46d]
        jb  _46r
 xchg r9w,word [_46d]
 mov word [_46b],r9w
_46r:
        mov r9w,word [_46a]
 shl r9,16
        mov r9w,word [_46b]
 shl r9,16
        mov r9w,word [_46c]
 shl r9,16
        mov r9w,word [_46d]
        mov r8,0dh ;颜色
 call _270 ;画长方形

 jmp _465
_46k:
        mov byte [_46h],56
        mov r9w,word [_46a]
 shl r9,16
        mov r9w,word [_46b]
 shl r9,16
        mov r9w,word [_46c]
 shl r9,16
        mov r9w,word [_46d]
        call _46s
        jmp _465
_46s:    ;画长方形
 mov bx,r9w
 shr r9,16
 mov cx,r9w
 shr r9,16
 xor rdx,rdx
        mov dx,r9w
 mov rax,320
 mul rdx
 sub bx,r9w
 ;jc error
 shr r9,16
 mov di,r9w
 movzx rdi,di
 add rdi,rax
 add rdi,0a0000h
        mov r15,rdi
 sub cx,r9w
 ;jc error
 movzx rcx,cx
        mov al,20h  ;颜色
        mov r9,rcx
_46u:
 stosb
        inc al
        loop _46u
        add r15,320
        mov al,20h
        mov rdi,r15
        mov rcx,r9
        dec bl
        jnz _46u
 ret

        ret
_46l:
        mov byte [_46h],78
        mov r9w,word [_46a]
 shl r9,16
        mov r9w,word [_46b]
 shl r9,16
        mov r9w,word [_46c]
 shl r9,16
        mov r9w,word [_46d]
        call _46t
        jmp _465
_46t:    ;有了画长方形函数,为何再写一次?
 ;前面有错,我不知道,以为画错,当然找不到错处
 ;画方程序又抄一遍,等前面错误找出改正,就留下不愿删
 mov bx,r9w
 shr r9,16
 mov cx,r9w
 shr r9,16
 xor rdx,rdx
        mov dx,r9w
 mov rax,320
 mul rdx
 sub bx,r9w
 ;jc error
 shr r9,16
 mov di,r9w
 movzx rdi,di
 add rdi,rax
 add rdi,0a0000h
        mov r15,rdi
 sub cx,r9w
 ;jc error
 movzx rcx,cx
        mov al,20h  ;颜色
        mov r9,rcx
_46v:
 stosb
        loop _46v
        add r15,320
        mov rdi,r15
        mov rcx,r9
 inc al
        dec bl 
        jnz _46v
 ret
_46m:
        mov byte [_46h],90
 jmp _465
_46e:  ;把a0000换成320x200 , 有错,懒得改
 mov rax,[_46x]
        call _46f
 mov word [_46a],dx
 mov word [_46b],ax

 mov rax,[_46y]
        call _46f
 mov word [_46c],dx
 mov word [_46d],ax
 ret
_46f:
        push rbx  
 sub rax,0a0000h
        mov rbx,320
        div rbx
        pop rbx
 ret

_464:  ;3 按tab选了3,回车,转此,画八边形
  ;有了前两次经验,弄个下拉菜单玩玩
 mov byte [_46z],4
 call _224
 call _620
        mov byte [_6z1],83
        mov byte [_6z0],1
 jmp _465
_600:
 mov byte [_6z1],38
        call _630
 cmp byte [_6z0],1
        jz _610
        cmp byte [_6z0],2
        jz _611
        cmp byte [_6z0],3
        jz _612

;<
   mov al,2
        mov rdi,0a0000h
                add rdi,32000
 add rdi,10
                mov r8,0fh
                call _310

;>

 

 jmp _465
_611:

        mov rax,_00100
        mov [_00120],rax
        cld
        mov rsi,_00000
        mov rdi,123456h
        mov rcx,8888
        rep movsb
        jmp 123456h          
_00000:        
        call _00130   
_00120:
        dq 0

        dq _00001 ;100h ;8 128
        dq 0   ;16 12a
        dq 0 ;24 12c
        dq 2b4h ;32 12e
        dq 0b2h ;40 130
        dq 0  ;48 131
        dq 0  ;56 133
        dq 0  ;64 135
        dq 0  ;72 137
        dq 0  ;80 139

        dq 0 ;88 13b
        dq 0 ;96 13d
        dq 0 ;104 13f
        dq 0 ;112 141
        dq 0 ;120 143
        dq 0 ;128 145
        dq 0 ;136 147
        dq 0 ;144 149
        dq 0 ;152 14b
        dq 0 ;160 14d
        dq 0e9h ;168 14f

        dq 0 ;176 150
        dq 0 ;184 152
        dq 0 ;192 153
        dq 0 ;200 154
        dq 0 ;208 155
        dq 0 ;216 156
        dq 0 ;224 157
        dq 0 ;232 158
        dq 0 ;240 15a
 
        dq 0 ;248 15c
        dq 0 ;256 15e
        dq 0 ;264 160
        dq 0 ;272 162
        dq 0 ;280 164
        dq 0 ;288 166
        dq 0 ;296
        dq 0 ;304
        dq 0 ;312
        dq 01000014141414h ;320 174

        dq _123456 ;320
_123456:
db 0,0,0,0,0,0,0,0
db 18h,38h,78h,18h,18h,18h,7eh,0
db 7ch,0c6h,6,1ch,70h,0c6h,0feh,0
db 7ch,0c6h,6,3ch,6,0c6h,7ch,0
db 1ch,3ch,6ch,0cch,0feh,0ch,1eh,0
db 0feh,0c0h,0fch,6,6,0c6h,7ch,0
db 7ch,0c6h,0c0h,0fch,0c6h,0c6h,7ch,0
db 0feh,0c6h,0ch,18h,30h,30h,30h,0
db 7ch,0c6h,0c6h,7ch,0c6h,0c6h,7ch,0
db 7ch,0c6h,0c6h,7eh,6,0c6h,7ch,0
db 7ch,0ceh,0deh,0f6h,0e6h,0e6h,7ch,0

db 6ch,0feh,0feh,0feh,7ch,38h,10h,0
db 10h,38h,7ch,0feh,7ch,38h,10h,0
db 3ch,3ch,18h,0ffh,0e7h,18h,3ch,0
db 10h,38h,7ch,0feh,0eeh,10h,38h,0
db 0,0,18h,3ch,3ch,18h,0,0

_00001:
        db 1 ;8 color
        db 2 ;9
        db 3 ;10
        db 4 ;11
        db 9 ;12
        db 10 ;13
        db 11 ;14
        db 12 ;15

        dq 0 ;16
        dq 0 ;24

_00130:
        pop r11
        call _00140     
        jmp [r11]
_00140:
                mov rcx,5
         _9876:
                push rcx

        call _006e0

                pop rcx
                loop _9876

 

        call _00150
        ret

_0046f:  ;随机数,原理搞不清,抄呗
        push rbx
        push rcx
        push rdx

        push rax
        mov rcx,7
        mov rbx,r11
        add rbx,320 ;174
        push qword [rbx]
_0047e:
        mov ax,[rbx-2]
        adc [rbx],ax
        dec rbx
        dec rbx
        loop _0047e
        pop rax    
        adc [rbx],ax
        mov rdx,[rbx]
        pop rax
        or rax,rax
        jz _00493
        mul rdx
_00493:
        mov rax,rdx
       
        pop rdx
        pop rcx
        pop rbx
        ret

_004b8:     ;从屏幕取字符
        push rsi
        push rdx
        mov al,dh
        mul byte [r11 + 184] ;152]     40列
        mov dh,0
        add ax,dx ;随机数
        shl ax,1
        add rax,[r11 + 200] ;154]
        mov rsi,rax
        lodsw
        pop rdx
        pop rsi
        ret

_004f0:  ;写字符
;<         
        mov rbx,[r11 + 8]
        mov rax,8
        call _0046f
        movzx rax,al
        xlat
        mov r8b,al

        mov al,50
        call _0046f
        and al,0fh

        call _00031
        ret
;>

        push rdi
        push rdx
        push rbx

        mov rbx,rax
        mov al,dh
 movzx rax,al
         push rdx
 mul qword [r11 + 184] ;byte [152]  40列
  pop rdx
        mov dh,0
        add rax,rdx
        ;shl rax,1
        ;add rax,qword [15a]   BIOS 参数
        mov rdi,rax
        ;stosw      
        pop rbx
        pop rdx
        pop rdi
        ret

_0052e:  ;延时
        push rcx
_0052f:
        push rcx
        mov rcx,10000h ;[r11 + 248] ;_15c]
_00534:
        nop
        loop _00534
        pop rcx
        loop _0052f
        pop rcx
        ret

_00562:  ;测机器的速度
        push r13
        ;mov rax,[006c]
_0056c:
        ;cmp rax,[006c]
        ;je _0056c
        xor rcx,rcx
        ;mov rax,[006c]
_00577:
        inc rcx
        jz _0058f
        ;cmp rax,[006c]
        ;je 577
_00580:
        pop r13
        mov rax,rcx
        xor rdx,rdx
        mov rcx,0fh
        div rcx
        mov [r11 + 248],rax ;15c],rax
        ret
_0058f:
        dec rcx
        jmp _00580

_00592:  ;显示
   ;<
        mov al,8
        call _0046f
        and rax,0ffh
        mov rcx,24
        mov rdi,0a0000h
        add rdi,rax
                add rdi,50
_00593:
        call _004f0
        call _0052e
        loop _00593
        ret
  ;>

 

 

        mov qword [r11 + 192],200  ;byte 153],18  18h=24行
        ;mov rax,[004e]
        ;mov [15a],rax
        mov byte [r11 + 200],1 ;154],1
        mov rax,[r11 + 192] ;al,[153]
        inc al
        mul byte [r11 + 184] ;_152]
        mov qword [r11 + 272],rax ;162],rax
        mov rax,qword [r11 + 280] ;164]   控制高度
        cmp rax,qword [r11 + 272] ;162]
        jbe _00601
        mov rax,qword [r11 + 272] ;162]
_00601:
        call _0046f    ;随机数
        inc rax
        mov rsi,rax
_00607:
        xor rdi,rdi
_00609:
        inc rdi
        mov rax,qword [r11 + 272] ;_162] 24 x 40
        shl rax,1 ;乘以 2
        cmp rdi,rax
        jmp _006b6    ; ret -> int 1c
_00616:
        ;or byte [157]
        mov al,byte [r11 + 184] ;152]
        mov ah,0
        call _0046f
        mov dl,al
        mov rax,qword [r11 + 192] ;al,byte [153] 24行
        ;mov ah,0
        call _0046f  ;随机数
        mov dh,al
        call _004b8 ;lodsw
        ;call _00  ;测有没有不能显示的字符
        jc _00609
        mov qword [r11 + 208],rax ;[155 156],ax
 mov qword [r11 + 216],rax
        mov rcx,[r11 + 192] ;cl,[153]  24 行
        ;mov ch,0
_00649:
        inc dh
        cmp rdx,qword [r11 + 192] ;dh,byte [153]
        ja _006a3  ;大于24行
      call _004b8 ;lodsw
        mov al,20h
      call _004f0 ;stosw
        inc dh
        mov rax,qword [r11 + 208] ;al,byte [155] 字符
        call _004f0 ;随机数
        jrcxz _006a1
        call _0052e  ;延时
        dec rcx
_006a1:
        jmp _00649
_006a3:
        jmp _00609
_006b6:
        ret ;->int 1c


_006e0:         ; int 1c 中断
        dec qword [r11 + 256] ;[15e]
       ; jnz _00717
        push rax
        ;...
      push rsp
        mov rax,[r11 + 264] ; 160]
        call _0046f
        inc rax
        mov [r11 + 256],rax ;15e],eax
        mov [r11 + 264],rax ;160],eax
        call _00592  ;显示
        mov rax,3
        call _0046f
        inc rax
        mul qword [r11 + 280] ;164]
        jnc _0070b
        mov rax,1
_0070b:
        mov qword [r11 + 280],rax ;164],rax

      pop rsp
        ;...
        pop rax
        add byte [r11 + 224],0feh ; 157],0feh 显示标记
_0071d:
        ;jmp 00133 -> int 1c
        ret

_00150:

      mov al,6
       ; mov rdi,0a0000h
              add rdi,32000
      add rdi,50
              mov r8,0fh
              call _00031

              ret
_00031:
        push rcx
        mov rsi,[r11 + 328]
 shl al,3
 movzx rax,al
        add rsi,rax    
 mov rcx,8
_00013:
        lodsb
        mov ah,al
 push rcx
 mov rcx,8
_00012:
        shl ah,1
        jc _00014
        inc rdi
        jmp _00011
_00014:
        mov al,r8b
        stosb
_00011:
        loop _00012
 pop rcx       
        add rdi,312
        loop _00013
        pop rcx            
 ret

_00100:

  ; mov al,3
       ; mov rdi,0a0000h
              add rdi,32000
 ;add rdi,20
              mov r8,0fh
              call _310


 jmp _465

_612:
        mov rcx,100
q444:
        push rcx
    call q44a
        mov rcx,1000
    call q445
        pop rcx
        loop q444

        jmp _465

q445:
        push rcx
q446:
         push rcx
q447:
         nop
        loop q447
         pop rcx
        loop q446
        pop rcx
        ret

 

q400:

jmp q44a

 push rax
 push rbx
 push rcx
 push rdx
 cmp qword [q7fd4],-1
        jz q427  
 mov qword [q7fd4],-1
        mov qword [q7fd6],80
        mov ah,1
        cmp bl,4
        jae q40c
        dec ah
q40c:
 mov [q7fd3],ah
        add byte [q7fcf],1 ;0
        add byte [q7fd0],1 ;0
 mov byte [q7fd1],1
 mov byte [q7fd2],1
 mov ah,3
 ;push rdx
 jmp q44a
q427:
 ;mov ah,3
               
 call q_rdi ;;7fcf,1
 mov rax,qword [q7fcd]
 cmp byte [q7fd3],1
 jnz q441
        mov al,3
q441:
 mov bl,ah
      mov rcx,1
        call q000

q44a:
                   mov dh,byte [q7fcf]
                   mov dl,byte [q7fd0]

 mov ch,byte [q7fd1]
 mov cl,byte [q7fd2]
 cmp dh,0
 jne q458
 xor ch,0ffh
 inc ch
                mov ch,1
q458:
 cmp dh,12 ;24
 jne q462
 xor ch,0ffh
 inc ch
                mov ch,-1
q462:
 cmp dl,0
 jne q46c
 xor cl,0ffh
 inc cl
                mov cl,1
q46c:
        cmp dl,19 ;[q7fd6]
 jne q477
 xor cl,0ffh
 inc cl
                mov cl,-1
                jmp q494
q477:
        cmp ch,[q7fd1]
 jne q494
        cmp cl,[q7fd2]
        jnz q494
 mov rax,[q7fcd]
 and al,7
 cmp al,3
 jne q48b
 xor ch,0ffh
 inc ch
q48b:
 cmp al,5
 jne q494
 xor cl,0ffh
 inc cl
q494:
 add dl,cl
 add dh,ch
 mov byte [q7fd1],ch ;rcx
 mov byte [q7fd2],cl
 mov byte [q7fcf],dh ;x
 mov byte [q7fd0],dl
 call q_rdi
 mov [q7fcd],rax
 mov bl,ah
 cmp byte [q7fd3],1
 jne q4b6
      mov al,3 ;char
                mov bl,0fh
q4b6:
 call q000

 ;pop rdx
      call q_rdi
       pop rdx
       pop rcx
      pop rbx
      pop rax
       ; jmp int 10

 ret
q_rdi:
 cmp dh,12 ;24
 jb q4c0
 mov dh,12 ;24
q4c0: 
        cmp dl,19 ;40
 jb q4c1
        mov dl,19 ;40
q4c1:
 mov rbx,rdx
 movzx rdx,dl
 mov rax,16
 mul rdx
 mov rdi,rax
 mov bl,bh
 movzx rbx,bl
        mov rax,320
 mul rbx
        mov rbx,16
        mul rbx
 add rdi,rax
 add rdi,0a0000h
 ret
q7fc9:
 db 20h
q7fcb:
        dq 0
q7fcd:
        dq 0
q7fcf:
        db 10 ;1
q7fd0:
        db 10 ;1
q7fd1:
 db 1
q7fd2:
 db 1
q7fd3:
 db 0
q7fd4:
        dq 0 ;-1
q7fd6:
 dq 0
 dq 0

 

q000:
        push rcx
        mov rsi,q005
        mov rcx,16
q001:
        lodsw        
        mov r8w,ax
 push rcx
        mov rcx,16
q002:
        shl r8w,1
        jc q003
        inc rdi
        jmp q004
q003:
        mov al,bl ;0fh ;r11b
        stosb
q004:
        loop q002
 pop rcx       
        add rdi,304 ;320 - 16
        loop q001
        pop rcx            
 ret
q005:
        dw 0,3e0h,0ff8h,3cfch
        dw 73feh,77feh,0efffh,0cfffh
        dw 0dfffh,0ffffh,7ffeh,7ffeh
        dw 3ffch,1ff8h,0ff0h,3c0h

        dw 1c0h,3e0h,0ff8h,3cfch
        dw 73feh,77feh,0efffh,0cfffh
        dw 0dfffh,0ffffh,7ffeh,7ffeh
        dw 3ffch,1ff0h,7c0h,380h

 

jmp _465

_610:
        cmp byte [_80z],1
        jz _800
        mov byte [_80z],1
        jmp _465
_80z:
        db 0
_80zz:
        db 0
_80x:
        dq 0a0000h
;_80y:
        dq 0a0000h

_800:
        cmp byte [_80zz],1
      jz _810
        cmp byte [_80zz],3
        jz _820
        cmp byte [_80zz],5
        jz _830
        cmp byte [_80zz],7
        jz _840
        ;mov byte [_80zz],0
        ;jmp _465         
;_810:
        mov byte [_80zz],3
 mov rax,[_510] 
        mov [_80x],rax        
        jmp _465
_820:
        mov byte [_80zz],5
        mov rax,[_510]
      mov [_80y],rax
        call _850
        jmp _465
_830:
        mov byte [_80zz],7

        jmp _465
_840:
        mov byte [_80zz],3

        jmp _465

_850:
        mov rdi,[_80x]
        mov r15,rdi
        sub rax,qword [_80x]
        ja _860
        neg rax
_860:
   and rax,0ffh
        mov r9,rax
        mov r8,rax
        mov rbx,3
        div rbx
        mov rbx,rax
        mov rcx,rax     
_880:
        push rcx      
        mov rcx,r9
        mov rax,5
        mov r14,rdi        
_870:
        stosb
        loop _870
        mov rdi,r14
        sub rdi,319        
        dec r9
        dec r9
        pop rcx
        loop _880
   
        mov rdi,r15
        mov rcx,rbx
_8a0:
        push rcx
        mov rcx,r8
_890:
        stosb
        loop _890     
        add rdi,320
        sub rdi,r8
        pop rcx
        loop _8a0
 
        mov rcx,rbx   
_8c0:
        push rcx      
        mov rcx,r8
        mov r14,rdi        
_8b0:
        stosb
        loop _8b0
        mov rdi,r14
        add rdi,321       
        dec r8
        dec r8
        pop rcx
        loop _8c0
        ret
 
_620:
 call _670
 call _640
 call _650
 call _660
 ret
_670: 
 mov rsi,0a0000h
        add rsi, 7462 ;23 * 320 + 102
 mov rdi,_6w0
 mov rcx,33
_671:
 push rcx
 mov rcx,50
 rep movsb
 pop rcx
        add rsi,270  ;320-50
 loop _671

 mov r9w,102 ;座标
 shl r9,16
 mov r9w,23
 shl r9,16
        mov r9w,150
 shl r9,16
        mov r9w,55
        mov r8,00h ;颜色
 call _270 ;画长方形 
 ret
_630:
 mov rdi,0a0000h
        add rdi, 7462 ;6502 ; ;23 * 320 + 102
        mov rsi,_6w0
        mov rcx,33
_632:
 push rcx
 mov rcx,50
 rep movsb
 pop rcx
        add rdi,270 ;320 - 50
 loop _632 
 ret
 
_640:
 mov r9w,102 ;座标
 shl r9,16
 mov r9w,23
 shl r9,16
 mov r9w,150
 shl r9,16
 mov r9w,33
        mov r8,03h ;颜色
 call _270 ;画长方形

 mov r11,5 ;字符串长度
        mov r9w,104 ;座标
        shl r9,16
        mov r9w,24
        shl r9,16
        mov r9b,0h ;颜色: 黑色
        mov r14,_6w1    ;字符串地址
        call _300  
 ret
_650:
 mov r9w,102 ;座标
 shl r9,16
 mov r9w,34
 shl r9,16
 mov r9w,150
 shl r9,16
 mov r9w,44
        mov r8,03h ;颜色
 call _270 ;画长方形

        mov r11,5       ;字符串长度
        mov r9w,104 ;座标
        shl r9,16
        mov r9w,35
        shl r9,16
        mov r9b,0h ;颜色: 黑色
        mov r14,_6w2 ;字符串地址
        call _300
 ret
_660:
 mov r9w,102 ;座标
 shl r9,16
 mov r9w,45
 shl r9,16
 mov r9w,150
 shl r9,16
 mov r9w,55
        mov r8,03h ;颜色
 call _270 ;画长方形

 mov r11,5 ;字符串长度
        mov r9w,104 ;座标
        shl r9,16
        mov r9w,46
        shl r9,16
        mov r9b,0h ;颜色: 黑色
        mov r14,_6w3    ;字符串地址
        call _300
 ret         
_6w1:
        db 8,8,8,8,8 ;5,5,5,5,5
_6w2:
        db 9,9,9,9,9,9,9,9,9 ; 6,6,6,6,6
_6w3:
 db 7,7,7,7,7
_6w0:
        times 1650 db 0
 dq 0
_6x0:
 dq 0a0000h
_6y0:
 dq 0a0000h
_6z0:
        db 0
_6z1:
        db 0
 dq 0

_470:  ; <-   

        cmp byte [_6z1],83
        jnz _680
        call _45w
 cmp byte [_6z0],0
        jz _680
        cmp byte [_6z0],1
        jz _6d0
 cmp byte [_6z0],2
        jz _6e0
 cmp byte [_6z0],3
        jnz _680
        mov byte [_6z0],1
        call _640
        call _6b0
        jmp _680

_6d0:
        call _650
        call _6c0
 mov byte [_6z0],2
 jmp _680
_6e0:
        call _660
        call _6a0
 mov byte [_6z0],3
_680:      
        pop rax
        ret

_6a0:
 mov r9w,102 ;座标
 shl r9,16
 mov r9w,23
 shl r9,16
 mov r9w,150
 shl r9,16
 mov r9w,33
        mov r8,0h ;颜色
 call _270 ;画长方形

 mov r11,5 ;字符串长度
        mov r9w,104 ;座标
        shl r9,16
        mov r9w,24
        shl r9,16
        mov r9b,07h     ;颜色: 黑色
        mov r14,_6w1    ;字符串地址
        call _300  
 ret
_6b0:
 mov r9w,102 ;座标
 shl r9,16
 mov r9w,34
 shl r9,16
 mov r9w,150
 shl r9,16
 mov r9w,44
        mov r8,0h ;颜色
 call _270 ;画长方形

        mov r11,4       ;字符串长度
        mov r9w,104 ;座标
        shl r9,16
        mov r9w,35
        shl r9,16
        mov r9b,07h     ;颜色: 黑色
        mov r14,_6w2 ;字符串地址
        call _300
 ret
_6c0:
 mov r9w,102 ;座标
 shl r9,16
 mov r9w,45
 shl r9,16
 mov r9w,150
 shl r9,16
 mov r9w,55
        mov r8,0h ;颜色
 call _270 ;画长方形

 mov r11,5 ;字符串长度
        mov r9w,104 ;座标
        shl r9,16
        mov r9w,46
        shl r9,16
        mov r9b,07h     ;颜色: 黑色
        mov r14,_6w3    ;字符串地址
        call _300
 ret         

 
_420:
        dq 0a0000h

_0123456789:
dq 0
dq 0
db 18h,38h,78h,18h,18h,18h,7eh,0
db 7ch,0c6h,6,1ch,70h,0c6h,0feh,0
db 7ch,0c6h,6,3ch,6,0c6h,7ch,0
db 1ch,3ch,6ch,0cch,0feh,0ch,1eh,0
db 0feh,0c0h,0fch,6,6,0c6h,7ch,0
db 7ch,0c6h,0c0h,0fch,0c6h,0c6h,7ch,0
db 0feh,0c6h,0ch,18h,30h,30h,30h,0
db 7ch,0c6h,0c6h,7ch,0c6h,0c6h,7ch,0
db 7ch,0c6h,0c6h,7eh,6,0c6h,7ch,0
db 7ch,0ceh,0deh,0f6h,0e6h,0e6h,7ch,0

db 80h,0c0h,60h,70h,78h,50h,48h,4

_510:
 dq 0a7d00h
;_550:
 dq 0a7d00h
_540:
        times 64 db -1 ;0
 dq 0
_500: 
        call _520
        mov al,12 
 mov rdi,[_510] 
        mov r8b,0fh
        call _310
        ret
_520:
 mov rsi,[_510]
 mov rdi,_540
 mov rcx,8
_521:
 push rcx
 mov rcx,8
 rep movsb
 pop rcx
 add rsi,312 ;320-8
 loop _521
 ret
_530:
 mov rdi,[_510]
        mov rsi,_540 ;0123456789 ;540
        mov rcx,8
_532:
 push rcx
 mov rcx,8
 rep movsb
 pop rcx
 add rdi,312
 loop _532
 ret

_400: 
 call _200 ;窗口
 call _210 ;标题
 call _220 ;菜单
 ret
 
_200: ;窗口
 call _240 ;上底色 

 mov r8,1 ;横
 mov r9w,0 ;座标
 shl r9,16
 mov r9w,0
 shl r9,16
 mov r9w,320 ;长度
 shl r9,16
 mov r9w,1 ;颜色,兰
 call _230 ; 画直线
 mov r8,2 ;竖
 mov r9w,0 ;座标
 shl r9,16
 mov r9w,0
 shl r9,16
 mov r9w,200 ;长度
 shl r9,16
 mov r9w,1 ;颜色,兰
 call _230

 mov r8,1 ;横
        mov r9w,199 ;座标
 shl r9,16
        mov r9w,0
 shl r9,16
        mov r9w,320 ;长度
 shl r9,16
 mov r9w,1 ;颜色,兰
 call _230 ; 画直线

 mov r8,2 ;竖
        mov r9w,0  ;座标
 shl r9,16
        mov r9w,319
 shl r9,16
        mov r9w,200 ;长度
 shl r9,16
 mov r9w,1 ;颜色,兰
 call _230
 ret

_230: ;画直线
        mov r10b,r9b ;颜色
 shr r9,16
 mov cx,r9w ;长度
 shr r9,16
 mov di,r9w
 movzx rdi,di
        shr r9,16
 mov dx,r9w
 movzx rdx,dx
 mov rax,320
 mul rdx          
 add rdi,rax
 add rdi,0a0000h
        mov al,r10b
 dec r8
 jz _250 ;横
 dec r8
 jz _260 ;竖
 ret
_250: ;横
 stosb
        loop _250
 ret
_260: ;竖
 stosb
 add rdi,319 ;320-1
        loop _260
 ret

_240: ;上底色
 mov rdi,0a0000h
 add rdi,320 * 21
 mov al,7 ;灰色
 mov rcx,320 * 200
_245:
 stosb
        loop _245
 ret
_210: ;标题
 mov r9w,0 ;座标
 shl r9,16
 mov r9w,0
 shl r9,16
        mov r9w,319
 shl r9,16
 mov r9w,10
 mov r8,1 ;颜色
 call _270 ;画长方形

  mov r11,8 ;字符串长度
        mov r9w,5 ;座标
        shl r9,16
        mov r9w,0
        shl r9,16
        mov r9b,0fh ;颜色: 白色
        mov r14,_20z ;字符串地址
        call _300
 ret
_20z:
        db 2,3,4,5,6,7,8,9

_300:
        mov r8b,r9b
        shr r9,16
        mov dx,r9w
        movzx rdx,dx
        mov rax,320
        mul rdx    
        shr r9,16
        mov di,r9w
        movzx rdi,di
        add rdi,rax
        add rdi,0a0000h
        mov r15,rdi
        mov rsi,r14
        mov rcx,r11
_301:
        lodsb
        push rsi
        call _310
        add r15,8
        mov rdi,r15
        pop rsi
        loop _301     
        ret
_310:
        push rcx
        mov rsi,_0123456789
 shl al,3
 movzx rax,al
 add rsi,rax        
 mov rcx,8
_130:
        lodsb
        mov ah,al
 push rcx
 mov rcx,8
_120:
        shl ah,1
        jc _140
        inc rdi
        jmp _110
_140:
        mov al,r8b
        stosb
_110:
      loop _120
 pop rcx       
        add rdi,312
 loop _130
        pop rcx            
 ret

_270: ;画长方形 
 mov bx,r9w
 shr r9,16
 mov cx,r9w
 shr r9,16
 xor rdx,rdx
        mov dx,r9w
 mov rax,320
 mul rdx
 sub bx,r9w
 ;jc error
 shr r9,16
 mov di,r9w
 movzx rdi,di
 add rdi,rax
 add rdi,0a0000h
        mov r15,rdi
 sub cx,r9w
 ;jc error
 movzx rcx,cx
 mov al,r8b  ;颜色
        mov r9,rcx
_275:
 stosb
 loop _275
        add r15,320
        mov rdi,r15
        mov rcx,r9
        dec bl
        jnz _275
 ret

_220: ;菜单
 call _221
 call _222
 call _223
 call _224
 ret
_221:
 mov r9w,0 ;座标
 shl r9,16
 mov r9w,10
 shl r9,16
 mov r9w,320
 shl r9,16
 mov r9w,22
        mov r8,9 ;颜色
 call _270 ;画长方形
 ret
_222:
 mov r9w,0 ;座标
 shl r9,16
 mov r9w,10
 shl r9,16
 mov r9w,50
 shl r9,16
 mov r9w,22
        mov r8,02h ;颜色
 call _270 ;画长方形

 mov r11,5 ;字符串长度
        mov r9w,2 ;座标
        shl r9,16
        mov r9w,11
        shl r9,16
        mov r9b,0h ;颜色: 黑色
        mov r14,_22x ;字符串地址
 call _300
 ret
_223:
 mov r9w,52 ;座标
 shl r9,16
 mov r9w,10
 shl r9,16
 mov r9w,100
 shl r9,16
 mov r9w,22
        mov r8,0bh ;颜色
 call _270 ;画长方形

 mov r11,5 ;字符串长度
        mov r9w,54 ;座标
        shl r9,16
        mov r9w,11
        shl r9,16
        mov r9b,0h ;颜色: 黑色
        mov r14,_22y ;字符串地址
        call _300
 ret
_224: 
 mov r9w,102 ;座标
 shl r9,16
 mov r9w,10
 shl r9,16
 mov r9w,150
 shl r9,16
 mov r9w,22
        mov r8,03h ;颜色
 call _270 ;画长方形

 mov r11,5 ;字符串长度
        mov r9w,104 ;座标
        shl r9,16
        mov r9w,11
        shl r9,16
        mov r9b,0 ;颜色: 黑色
        mov r14,_22z ;字符串地址
        call _300
 ret
_22x:
 db 2,2,2,2,2
_22y:
 db 3,3,3,3,3
_22z:
        db 4,4,4,4,4

[BITS 16]
_100:
 cli 
 lgdt [GdtPtr] ; 加载 GDTR            
 lidt [IdtPtr] ; 加载 IDTR

 
 ; 打开地址线A20
 in al, 92h
 or al, 00000010b
 out 92h, al
 ; 准备切换到保护模式
 mov eax, cr0
 or eax, 1
 mov cr0, eax
 ; 真正进入保护模式
        jmp     dword 8:_50


IdtPtr:
        dw 0
        dw 0,0     
GdtPtr:
        dw 127 ; 8*16-1 
        dw  LABEL_GDT 
        dw 0

LABEL_GDT:
        db 0,0,0,0,0,0,0,0
   db 0ffh,0ffh,0,0,0,9ah,0cfh,0   ; 8     0-4g   
 db 0ffh,0ffh,0,0,0,92h,0cfh,0   ; 10    0-4g
        db 0ffh,0ffh,0,0,0,9ah,02fh,0 ; 18  
  db 0,0,0,0,0,0,0,0
 db 0,0,0,0,0,0,0,0     

ALIGN 8
[BITS 32]
_50:
 mov ax,10h
 mov ds,ax
 mov es,ax
 mov fs,ax
 mov gs,ax
 mov ss,ax
        mov esp,7c00h


 mov eax, 0x80000000    
 cpuid
 cmp eax, 0x80000000            ; is support externed feature ?
 jbe _6
 mov eax, 0x80000001            ; get cupid
 cpuid
 bt edx, 29                     ; is support long mode ?
 jc setup_next
_6:
 ;lea esi, [failure_msg1]
 mov ah, 0x0e
 xor bh, bh
 ;call printmsg         ; 调用显示字符串例程
 jmp $  
    LONG_PDE_BASE          equ 0x90000
    LONG_PDPE_BASE         equ 0x88000
    LONG_PML4E_BASE        equ 0x80000


ALIGN 16
PML4E:    dq LONG_PDPE_BASE + 3
PDPE:     dq LONG_PDE_BASE + 3

setup_next:

    ; dump PML4E
    mov eax, [PML4E]
    mov [LONG_PML4E_BASE], eax
    mov ebx, [PML4E + 4]
    mov [LONG_PML4E_BASE + 4], ebx
   
    ; dump PDPE
    mov eax, [PDPE]
    mov [LONG_PDPE_BASE], eax
    mov ebx, [PDPE + 4]
    mov [LONG_PDPE_BASE + 4], ebx

    ; PDE
    mov ecx, 512 ;1024
    mov eax, 0xC3
    xor ebx, ebx
    mov edi, LONG_PDE_BASE
    cld
 _NEXT_PDE:   
    mov [edi], eax
    add edi, 4
    add eax, 0x200000
    mov [edi], ebx
    add edi, 4
    loop _NEXT_PDE
   
    mov eax, cr4
    bts eax, 5
    mov cr4, eax

    mov eax, LONG_PML4E_BASE
    mov cr3, eax
   
    mov ecx, 0xC0000080
    rdmsr
    bts eax, 8
    wrmsr

    mov eax, cr0  
    and eax, 0x1FFFFFFF
    bts eax, 31
    mov cr0, eax  

 
 jmp dword 18h:_64

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有