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