荣誉值:6
信誉值:0
注册日期:2009-12-03 21:13 |
data segment
;input data segment code here
data ends
stack segment
;input stack segment code here
stack ends
code segment
assume cs:code ;自己写引导软盘
start:mov ax,cs ;安装程序把从good开始的代码写入软盘
mov es,ax
mov bx,offset good
mov ax,0304h
mov cx,0001h
mov dx,0000h
int 13h
mov ax,4c00h
int 21h
org 7c00h ;以下内容从内存地址7c00h开始编辑
good:
mov ax,0 ;把软盘第二扇区开始的内容写入内存7e00h处
;这段代码正好一扇区512字节
mov es,ax
mov bx,7e00h
mov ax,0203h
mov cx,0002h
mov dx,0000h
int 13h
mov ax,0
push ax
mov ax,7e00h
push ax
retf
db 512-($-good) dup (0) ;意思是512-从这里到标号good占多少字节后
;等于多少就补上多少个0,使这段代码=512字节
ha: mov bl,1
call clis
jmp kaisi
menu db '1) reset pc '
db '2) start system '
db '3) clock '
db '4) change time '
kaisi:
mov ax,0
mov ds,ax
mov si,offset menu
mov ax,0b800h
mov es,ax
mov di,160*5+40
mov cx,4
s:push cx
mov cx,16
s1:
push [si]
pop es:[di]
mov es:1[di],bl
inc si
add di,2
loop s1
add di,160-32
pop cx
loop s
jx:in al,60h
cmp al,2
je do1
cmp al,3
je do2
cmp al,4
je do3
cmp al,5
je do4
jmp jx
do4:
call clis
call change
jmp ha
do3:
mov al,45h
out 60h,al
call clis
call clock
jmp ha
do2:
call harddisk
do1: mov ax,0ffffh
push ax
mov ax,0
push ax
retf
clis:
push ax
push cx
push si
push es
mov ax,0b800h
mov es,ax
mov si,0
mov cx,2000
sb: mov byte ptr es:[si],' '
mov byte ptr es:1[si],7
add si,2
loop sb
pop es
pop si
pop cx
pop ax
ret
change:
push ax
push bx
push cx
push si
push di
push ds
push es
jmp kaisi5
table1 db 'nian:yue :ri :si :fen :miao:'
bios db 9,8,7,4,2,0
kaisi5:
mov ax,0
mov ds,ax
mov di,160*8+50
mov ax,0b800h
mov es,ax
mov si,0
mov bx,0
mov cx,6
kaisi5lp:
call kaisi6
call zicenxu
mov al,bios[bx]
out 70h,al
call zuanhuan
out 71h,al
inc bx
add di,150
loop kaisi5lp
pop es
pop ds
pop di
pop si
pop cx
pop bx
pop ax
ret
kaisi6:
push cx
mov cx,5
kaisi6lp:
mov al,table1[si]
mov es:[di],al
mov byte ptr es:1[di],02h
inc si
add di,2
loop kaisi6lp
pop cx
ret
zuanhuan:
push bx
push cx
mov bx,0
mov ah,top1[bx]
mov al,top1[bx+1]
sub al,30h
sub ah,30h
mov cl,4
shl ah,cl
or al,ah
pop cx
pop bx
ret
zicenxu:push ax
d2:mov ah,0
int 16h
cmp ah,0bh
ja nozihu
mov ah,0
call zihu
mov ah,2
call zihu
jmp d2
nozihu:
cmp ah,0eh
je tuige
cmp ah,1ch
je huice
jmp d2
tuige:
mov ah,1
call zihu
mov ah,2
call zihu
jmp d2
huice:
mov al,0
mov ah,0
call zihu
mov ah,2
call zihu
mov top,0
pop ax
ret
zihu:
push bx
push cx
push dx
push di
push es
jmp do
table dw dopush,dopop,doxian
top dw 0
top1 db 0,0,0,0,0,0,0,0
do:
cmp ah,2
ja doend
mov bl,ah
mov bh,0
add bx,bx
jmp word ptr table[bx]
dopush:
cmp top,1
ja doend
mov bx,top
mov top1[bx],al
inc top
jmp doend
dopop:
cmp top,0
je doend
dec top
; mov bx,top
; mov al,[bx+si]
jmp doend
doxian:
mov bx,0
cmp top,0
je xian1
mov cx,top
d1:mov al,top1[bx]
mov es:[di],al
mov byte ptr es:1[di],02h
inc bx
add di,2
loop d1
xian1:mov es:[di],' '
doend:
pop es
pop di
pop dx
pop cx
pop bx
ret
clock:
push ax
push bx
mov bx,1
xian:
call nian
in al,60h
cmp al,3bh
je f1
cmp al,1
je esc1
jmp xian
f1:
mov ah,0
int 16h
inc bl
mov al,16h
out 60h,al
call nian
;这句很重要,要不60h的值一直是F1使时间停住
jmp xian
esc1:
pop bx
pop ax
ret
nian:
push ax
push cx
push si
push di
push ds
push es
jmp nian2
nian1 db 9,8,7,4,2,0,'/','/',' ',':',':',' '
nian2:
mov ax,0b800h
mov es,ax
mov di,160*8+60
mov ax,0
mov ds,ax
mov si,offset nian1
mov cx,6
snian:
mov al,[si]
out 70h,al
in al,71h
mov ah,al
push cx
mov cl,4
shr ah,cl
pop cx
and al,00001111b
add ah,30h
add al,30h
mov es:[di],ah
mov es:1[di],bl
mov es:2[di],al
mov es:3[di],bl
push 6[si]
pop es:4[di]
mov es:5[di],bl
inc si
add di,6
loop snian
pop es
pop ds
pop di
pop si
pop cx
pop ax
ret
harddisk:
call copyhd
mov ax,0
push ax
mov ax,7c00h
push ax
retf
copyhd:
push ax
push bx
push cx
push dx
push es
mov ax,0
mov es,ax
mov bx,7c00h
mov ax,0201h
mov cx,0001h
mov dx,0080h
int 13h
pop es
pop dx
pop cx
pop bx
pop ax
ret
code ends
end start | | |