1.在之前的时间设置上改进了时间设置的处理.
assume cs:code
code segment
start:
;-----------------------------------------------------将程序写入软盘
;把安装程序写入到软盘0面0道1扇区
mov ax,install
;call mfs
mov es,ax
mov bx,0 ;es:bx 指向读写内存
mov al,1 ;写入扇区数
mov ch,0 ;磁道号
mov cl,1 ;扇区号
mov dl,0 ;驱动器号 0为软盘A
mov dh,0 ;磁面号
mov ah,3 ;调用int 13h写功能
int 13h
;把执行程序写入到软盘0面0道2扇区至16扇区
mov ax,mainseg
mov es,ax
mov bx,0
mov al,14 ;写入扇区数
mov ch,0 ;磁道号
mov cl,2 ;扇区号
mov dl,0 ;驱动器号 0为软盘A
mov dh,0 ;磁面号
mov ah,3 ;调用int 13h写功能
int 13h
mov ax,4c00h
int 21h
;-----------------------------------------------------将程序写入软盘
;-----------------------------------------安装执行主程序
install segment
assume cs:install
installm:
mov ax,2000h ;软盘数据读取到2000:0
mov es,ax
mov bx,0
mov al,14 ;读取的扇区数
mov ch,0 ;0磁道
mov cl,2 ;2扇区
mov dl,0 ;0号驱动器
mov dh,0 ;0面
mov ah,2 ;调用int 13h从磁盘读取数据至 es:bx
int 13h
;以下功能是将cs:ip指向 2000:0处执行
mov ax,2000h
push ax
mov ax,0
push ax
retf
install ends
;-----------------------------------------安装执行主程序
;-------------------------------------------------------------------------主程序
mainseg segment
assume cs:mainseg
mfs:
call show_menu ;显示目录
call doit ;调用按键选择功能
jmp mfs
;------------------------------选项操作----------------------------------
;输入选项进行操作
;按下键 1,重新启动计算机
;按下键 2,引导现有操作系统
;按下键 3,显示动态时间 格式: 年/月/日/ 时:分:秒
;按下键 4,修改时间
doit:
push ax
jmp doitm
doa: db 'press ESC return menu!',0
dob: db 'press F1 change color!',0
doc: db 'reset pc,y or n?',0
dod: db 'start system,y or n?',0
doe: db 'press ESC to shutdown!',0
dof: db 'Please input time like "yy/mm/dd hh:mm:ss"',0
dog: db 'Set clock successful! Press any key return...',0
doh: db 'Set clock error! press any key return menu!',0
doitm:
mov ah,0
int 16h
call cls
cmp al,'1'
je do1f
cmp al,'2'
je do2f
cmp al,'3'
je do3f
cmp al,'4'
je do4f
jmp short doitmret
do1f: call do1
jmp doitmret
do2f: call do2
jmp doitmret
do3f: call do3
jmp doitmret
do4f: call do4
jmp doitmret
doitmret:
pop ax
ret
;------------------------------选项1---------------------
do1:
push ax
push dx
push si
push ds
d01m:
call cls
mov ax,cs
mov ds,ax
mov dl,1
mov dh,1
mov ah,0
mov si,offset doc
call show_str
mov ah,0
int 16h
cmp al,'y'
je do1d
cmp al,'n'
je do1ret
jmp short d01m
do1ret:
call cls
pop ds
pop si
pop dx
pop ax
ret
;重新启动计算机
do1d:
mov ax,0ffffh
push ax
mov ax,0
push ax
retf
;------------------------------选项1---------------------
;------------------------------选项2---------------------
do2:
push ax
push dx
push si
push ds
do2m:
call cls
mov ax,cs
mov ds,ax
mov dl,1
mov dh,1
mov ah,0
mov si,offset dod
call show_str
mov ah,0
int 16h
cmp al,'y'
je do2s
cmp al,'n'
je do2ret
jmp short do2m
do2ret:
call cls
pop ds
pop si
pop dx
pop ax
ret
;启动计算机原操作系统
do2s:
call cls
mov ax,0h ;硬盘数据读取到0:7c00
mov es,ax
mov bx,7c00h
mov al,1 ;读取的扇区数
mov ch,0 ;0磁道
mov cl,1 ;1扇区
mov dl,80h ;c盘
mov dh,0 ;0面
mov ah,2
int 13h
mov ax,0h
push ax
mov ax,7c00h
push ax
retf
;------------------------------选项2---------------------
;------------------------------选项3---------------------
do3:
push ax
push dx
push si
push ds
mov dh,1
mov dl,1
mov ax,cs
mov ds,ax
mov si,offset doa
call show_str
inc dh
mov si,offset dob
call show_str
mov al,1
push ax
;显示时间
do3m: call delay ;延时
call show_time ;时间读取显示模块
in al,60h ;按键检测
mov bl,al
cmp bl,3bh
jne do3j
pop ax
call color_ch ;改变字体颜色
add al,1
push ax
jmp short do3m
do3j: cmp bl,1
je do3ret
jmp short do3m
do3ret:
pop ax
pop ds
pop si
pop dx
pop ax
ret
;------------------------------选项3---------------------
;------------------------------选项4---------------------
do4:
jmp do4m
do4data segment
db 32 dup(0)
do4data ends
do4m:
call cls
call do4_ts ;显示提示信息
call show_time
call copy
mov dl,19
call setI
call do4_press ;按键输入处理
do4m_ret:
ret
;------------------------------------------复制
copy: push ax
push cx
push si
push ds
push es
mov ax,do4data
mov ds,ax
mov si,0
mov ax,cs
mov es,ax
mov di,offset dbt
copys:
mov cl,es:[di] ;------------------
jcxz cret
mov ds:[si],cl
inc si
inc di
loop copys
cret: pop es
pop ds
pop si
pop cx
pop ax
ret
;------------------------------------------复制
;---------------------------------------显示提示信息
do4_ts:
push ax
push dx
push si
push ds
call cls
mov dl,1
mov dh,1
mov ax,cs
mov ds,ax
mov si,offset dof
call show_str
inc dh
mov si,offset doa
call show_str
pop ds
pop si
pop dx
pop ax
ret
;---------------------------------------显示提示信息
;---------------------------------------检测案件的按下请款
;dl 为光标位置
do4_press:
push ax
push bx
push si
push di
push ds
mov di,0
do4_pm:
mov ah,0
int 16h
mov bl,al
mov bh,ah
cmp bh,1 ;Esc键按下后返回目录
je do4_pret
cmp bh,1ch ;enter键按下后设置时间
je do4_pent ;检测输入格式是否正确
cmp bh,4dh ;右键按下后
je do4_pr
cmp bh,4bh ;左键按下后
je do4_pl
; cmp bh,0eh ;退格键按下后
; je do4_pdel
cmp bh,0bh ;按下0-9处理
ja do4_pm
jmp do4_pchin
;do4_pnext:
; cmp bh,0ch
; jb do4_pchin
; jmp do4_pm
;call do4_chin ;输入字符处理
; call do4_shin
; jmp do4_pm
do4_pchin: ;按下0-9处理
call do4_chin ;输入字符处理
call do4_shin
call setI
jmp do4_pm
do4_pent: ;按下enter键后的处理
call do4_ent
jmp do4_pret
;do4_pdel: ;按下退格键后的处理
; call do4_del
; call cls
; call do4_shin
; jmp do4_pm
do4_pr: ;右键按下后
cmp dl,35
je do4_pm
inc dl
call setI
jmp do4_pm
do4_pl: ;左键按下后
cmp dl,19
je do4_pm
dec dl
call SetI
jmp do4_pm
do4_pret:
mov ax,do4data
mov ds,ax
mov si,0
mov cx,32
cmpes: ;返回时清空数据段内容
mov byte ptr ds:[si],0
inc si
loop cmpes
call cls
pop ds
pop di
pop si
pop bx
pop ax
ret
;---------------------------------------检测案件的按下请款
;---------------------------------------按下enter键后处理
do4_ent:
push ax
push cx
push dx
push di
push si
push ds
mov ax,cs
mov ds,ax
call cls
mov dh,1
mov dl,1
call do4_cmp ;检测字符合格性
cmp ch,1 ;ch=1表示格式正确
jne do4_eerro
;===============设置时间
do4_eset:
mov ax,do4data
mov es,ax
mov si,0 ;set date
mov di,9
mov cx,3
do4_edin: ;设置日期
push cx
mov ah,es:[si][0]
mov al,es:[si][1]
sub ah,30h
sub al,30h
mov cl,4
shl ah,cl
or al,ah
mov cl,al
mov ax,di ;8,7
out 70h,al
mov al,cl
out 71h,al
dec di
add si,3
pop cx
loop do4_edin
mov si,9
mov cx,3
mov di,4
do4_etin: ;设置时间
push cx
mov ah,es:[si][0]
mov al,es:[si][1]
sub ah,30h
sub al,30h
mov cl,4
shl ah,cl
or al,ah
mov cl,al
mov ax,di ;2,0
out 70h,al
mov al,cl
out 71h,al
sub di,2
add si,3
pop cx
loop do4_etin
mov si,offset dog
call show_str
mov ah,0
int 16h
jmp do4_eret
do4_eerro: ;格式错误的处理
mov si,offset doh
call show_str
mov ah,0
int 16h
jmp do4_eret
do4_eret: ;返回
pop ds
pop si
pop di
pop dx
pop cx
pop ax
ret
;---------------------------------------按下enter键后处理
;---------------------------------------按下字符键后处理
;bl为输入字符
;di为文字所在位置
do4_chin:
push ax
push dx
push ds
;将字符写入数据段中
mov dh,0
sub dx,19
mov di,dx
mov ax,do4data
mov ds,ax
mov ds:[di],bl
;inc di
pop ds
pop dx
pop ax
ret
;---------------------------------------按下字符键后处理
;---------------------------------------显示输入字符串
do4_shin:
push ax
push dx
push si
push ds
call cls
call do4_ts ;显示提示信息
mov dh,10
mov dl,20
mov ax,do4data
mov ds,ax
mov si,0
call show_str
pop ds
pop si
pop dx
pop ax
ret
;---------------------------------------显示输入字符串
;---------------------------------------按下backspace键后处理
;di传递位置
;do4_del:
; push ax
; push ds
; mov ax,do4data
; mov ds,ax
; cmp di,0
; je do4_dret
; mov byte ptr ds:[di-1],0
; dec di
;do4_dret:
; pop ds
; pop ax
; ret
;---------------------------------------按下backspace键后处理
;---------------------------------------检测字符合格性
;返回值ch 0 为不合格 1 为合格
do4_cmp:
push ax
push ds
mov ch,0
mov ax,do4data
mov ds,ax
mov cl,ds:[5]
cmp cl,'/'
jne do4_cret
cmp ds:[2],cl
jne do4_cret
mov cl,ds:[11]
cmp cl,':'
jne do4_cret
cmp ds:[14],cl
jne do4_cret
mov ch,1
do4_cret:
pop ds
pop ax
ret
;---------------------------------------检测字符合格性
;------------------------------选项4---------------------
;------------------------------选项操作----------------------------------
;-----------------显示目录---------------------
;显示字符串
;dh=行号
;dl=列号
show_menu:
jmp short show_menu_s
table dw a,b,c,d,e
a db '1)reset pc',0
b db '2)start system',0
c db '3)clock',0
d db '4)set clock',0
e db 'by PrinceKinXuan@2014/03/31',0
show_menu_s:
push ax
push bx
push cx
push dx
push si
push ds
mov ax,cs
mov ds,ax
mov di,0
mov dh,2 ;----------------------------------选项显示位置 行
mov dl,2 ;----------------------------------选项显示位置 列
mov cx,5
ms:
mov si,table[di]
call show_str
inc dh
add di,2
loop ms
inc dh
mov ah,2
mov bh,0
int 10h
pop ds
pop si
pop dx
pop cx
pop bx
pop ax
ret
;-----------------显示目录---------------------
;-----------------显示时间---------------------1
show_time:
push ax
push bx
push cx
push dx
push di
push si
push ds
push es
jmp short ts
;dataw dw offset dbt,offset
dbt db '00/00/00 00:00:00',0
dbd db 9,8,7,4,2,0
ts: ;mov ax,offset dbd
;mov es,ax
mov si,0
;mov bx,offset dbt
;mov ds,bx
mov di,0
mov cx,6
t: push cx
;mov al,es:[si]
mov al,dbd[si]
out 70h,al
in al,71h
mov ah,al
mov cl,4
shr ah,cl
add ah,30h
;mov byte ptr ds:[di],ah
mov byte ptr dbt[di],ah
;add di,2
inc di
and al,00001111b
add al,30h
mov byte ptr dbt[di],al
;add di,2
add di,2
;cmp si,2
;jb td ;日期隔开符
;je tb ;中间空格
;ja tt ;时间隔开符
tj: inc si
pop cx
loop t
mov ax,cs
mov ds,ax
mov si,offset dbt
mov dl,20
mov dh,10
call show_str
pop es
pop ds
pop si
pop di
pop dx
pop cx
pop bx
pop ax
ret
;-----------------显示时间---------------------1
;-----------------显示时间gai---------------------co
;al,color
color_ch:
;push ax
push bx
push cx
push di
push es
mov bx,0b800h
mov es,bx
mov di,1
mov cx,2000
and al,00000111b
color_ch_s:
mov byte ptr es:[di],al
add di,2
loop color_ch_s
pop es
pop di
pop cx
pop bx
ret
;-----------------显示时间---------------------co
;-------------------延时-----------------------
delay:
push bx
push dx
mov dx,0ffffh ;---------------------------时间长度调整
mov bx,01h
delays:
sub dx,1
cmp dx,0
jne delays
sub bx,1
cmp bx,0
mov dx,0ffffh
jne delays
pop dx
pop bx
ret
;-------------------延时-----------------------
;-------------------清屏-----------------------
cls:
push ax
push cx
push si
push es
mov si,0
mov ax,0b800h
mov es,ax
mov cx,2000
clss: mov byte ptr es:[si],' '
add si,2
loop clss
pop es
pop si
pop cx
pop ax
ret
;-------------------清屏-----------------------
;-------------------改变颜色-----------------------
;子程序2 设置前景色
;al为颜色
ch_color:
push ax
push bx
push cx
push es
;mov dx,ax
mov bx,0b800h
mov es,bx
mov bx,1
mov cx,2000
sub2s:
;and byte ptr es:[bx],11111000b
;or byte ptr es:[bx],al
mov byte ptr es:[bx],al
add bx,2
loop sub2s
pop es
pop cx
pop bx
pop ax
ret
;-------------------改变颜色-----------------------
;--------------------------setI
;dl 为列数
setI:
push ax
push bx
push dx
mov ah,2
mov bh,0
mov dh,10
int 10h
pop dx
pop bx
pop ax
ret
;--------------------------setI
;----------------------------------
;显示一个字符串
;参数:
;dh--行 dl--列 ds:si 字符串位置
show_str:
push ax
push bx
push cx
push dx
push es
push si
mov al,0ah ;指定行
mul dh
add ax,0b800h
mov es,ax
mov bl,dl ;指定列
mov bh,0
dec bx
add bx,bx
mov al,cl
show_str_s:
mov cl,ds:[si] ;将字符显示到指定的位置
mov ch,0
jcxz show_str_ret
mov ch,al
mov es:[bx],cl
inc si
add bx,2
jmp short show_str_s
show_str_ret:
pop si
pop es
pop dx
pop cx
pop bx
pop ax
ret
;------------------------------------------------------
mainseg ends
;--------------------------------------------------------主
code ends
end start