[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