[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