code segment
assume cs:code
setupsg2:jmp short show ;选项显示
table dw offset t0,offset t1,offset t2,offset t3
t0 db "1) reset pc",0
t1 db "2) start system",0
t2 db "3) clock",0
t3 db "4) set clock",0
table1 dw resetpc,startsys,clock,setclock
s1:db 50,9,8,7,4,2,0
s2:db '/','/',20h,':',':',20h
show:
mov dh,8
mov dl,20
mov di,0
mov ax,cs
mov ds,ax
mov cx,4
show1:push cx
mov si,table[di]
mov cl,02 ;属性
call showchoice
add di,2
add dh,1
pop cx
loop show1
choiced:mov ah,0
int 16h
sub al,30h ;将ASCII码换为数字
sub al,1
mov ah,0
add ax,ax
mov bx,ax
call word ptr table1[bx]
jmp choiced
resetpc:mov ax,0ffffh ;重新启动计算机
push ax
mov ax,0
push ax
retf
startsys: ;硬盘数据读取到0:7c00
mov ax,0
mov es,ax
mov bx,7c00h
mov al,1 ;读取的扇区数
mov ch,0
mov cl,1 ;1扇区
mov dl,80h
mov dh,0
mov ah,2
int 13h
mov ax,0
push ax
mov ax,7c00h
push ax
retf
showchoice:push ax
push dx
push cx
push di
push es
push si
mov ax,0b800h
mov es,ax
mov al,160
mul dh
mov dh,0
add dl,dl
add ax,dx
mov di,ax
showchoice1:mov ch,ds:[si]
cmp ch,0
je showret
mov byte ptr es:[di],ch
mov byte ptr es:[di+1],02
add di,2
inc si
jmp short showchoice1
showret:
pop si
pop es
pop di
pop cx
pop dx
pop ax
ret
clock:mov ax,0
mov es,ax
push es:[9*4]
pop es:[200h]
push es:[9*4+2]
pop es:[202h]
cli
mov word ptr es:[9*4],offset int9
mov word ptr es:[9*4+2],cs
sti
mov dl,02
clock1:
mov bx,160*12+40*2
mov di,offset s1
mov si,offset s2
mov al,cs:[di]
out 70h,al
in al,71h
mov ah,al
mov cl,4
shr ah,cl
and al,00001111b
add ah,30h
add al,30h
push bx
mov bx,0b800h
mov es,bx
pop bx
mov byte ptr es:[bx],ah
mov byte ptr es:[bx+1],dl
mov byte ptr es:[bx+2],al
mov byte ptr es:[bx+3],dl
inc di
add bx,4
mov cx,6
l1:push cx
mov al,cs:[di]
out 70h,al
in al,71h
mov ah,al
mov cl,4
shr ah,cl
and al,00001111b
add ah,30h
add al,30h
push bx
mov bx,0b800h
mov es,bx
pop bx
mov byte ptr es:[bx],ah
mov byte ptr es:[bx+1],dl
mov byte ptr es:[bx+2],al
mov byte ptr es:[bx+3],dl
mov al,cs:[si]
mov byte ptr es:[bx+4],al
mov byte ptr es:[bx+5],dl
add bx,6
inc di
inc si
pop cx
loop l1
jmp short clock1
int9: push ax
mov ax,0
mov es,ax
in al,60h
pushf
call dword ptr es:[200h]
cmp al,02h ;1
je changecolor
cmp al,1 ;ESC
je return
k1:
pop ax
iret
changecolor:
inc dl
jmp short k1
return:
pop ax
mov ax,0
mov es,ax
cli
push es:[200h]
pop es:[9*4]
push es:[202h]
pop es:[9*4+2]
sti
jmp near ptr setupsg2
setclock:call getstr
call settime
jmp near ptr setupsg2
settime:jmp short set1
settable db 50,9,8,7,4,2,0
set1:
mov bx,0
mov cx,6
set2:
mov dh,ds:[si]
inc si
mov dl,ds:[si]
add si,2
mov al,30h
sub dl,al
sub dh,al
shl dh,1
shl dh,1
shl dh,1
shl dh,1
or dl,dh
mov al,settable[bx]
out 70h,al
mov al,dl
out 71h,al
inc bx
loop set2
ret
getstr:push ax
getstrs:mov ah,0
int 16h
cmp al,20h
jb nochar
mov ah,0
call charstack
mov ah,2
call charstack
jmp getstrs
nochar:cmp ah,0eh ;退格键扫描码
je backspace
cmp ah,1ch
je enter ;enter键扫描码
jmp getstrs
backspace:mov ah,1
call charstack
mov ah,2
call charstack
enter:mov al,0
mov ah,0
call charstack
mov ah,2
call charstack
pop ax
ret
charstack:jmp short charstart
tabl dw charpush,charpop,charshow
top dw 0
charstart:push bx
push dx
push di
push es
cmp ah,2
ja sret
mov bl,ah
mov bh,0
add bx,bx
jmp word ptr tabl[bx]
charpush:
mov bx,top
mov [si][bx],al
inc top
jmp sret
charpop:
cmp top,0
je sret
dec top
mov bx,top
mov al,[si][bx]
jmp sret
charshow:
mov bx,0b800h
mov es,bx
mov al,160
mov ah,0
mul dh
mov di,ax
add dl,dl
mov dh,0
add di,dx
mov bx,0
charshows:
cmp bx,top
jne noempty
mov byte ptr es:[di],' '
jmp sret
noempty:
mov al,[si][bx]
mov es:[di],al
mov byte ptr es:[di+2],' '
mov byte ptr es:[di+1],02h
inc bx
add di,2
jmp charshows
sret:
pop es
pop di
pop dx
pop bx
ret
setupsg: call floppytwo ;主引导程序
mov ax,200h
push ax
mov ax,0h
push ax
retf
floppytwo: ;从2扇区读数据到200h:0
mov ax,200h
mov es,ax
mov bx,0h
mov al,2
mov ch,0
mov cl,2
mov dl,0
mov dh,0
mov ah,2
int 13h
ret
start: ;主引导程序安装到第一扇区
mov ax,cs
mov es,ax
mov bx,offset setupsg
mov al,1 ;读取的扇区数
mov ch,0
mov cl,1 ;扇区号
mov dl,0
mov ah,3
mov dh,0
int 13h
mov ax,cs ;子程序安装到从第二扇区开始的扇区
mov es,ax
mov bx,offset setupsg2
mov al,2 ;读取的扇区数
mov cl,2 ;扇区号
mov ah,3
mov dl,0
mov ch,0
mov dh,0
int 13h
mov ax,4c00h
int 21h
code ends
end start
谁有设置时钟项的完善啊,我现在只能实现简单的字符串的输入和输出,想改变charshow里的内容,使输出格式为'/','/',20h,':',':',20h
我搞晕了