这本书我看得有点慢,尤其是最后一个课程设计2,非常非常慢.
慢的原因各各种各样.上班事情比较多,到家比较累,有时候也会偷偷懒看看别的东西.
当然,也有自己智商平平,天赋有限的原因.等等等等
为了做这个课程设计2,参考了一些资料.
主要是关于如何将软盘其他扇区拷贝到机器上,并且让机器执行这方面的.
这个程序最大的困难,是程序在开机之前运行,没法Debug,纠错只能用肉眼调试.
比较大的缺陷有2个
1是第二次察看时间后,新的中断可能因为flag的原因,没有安装上
2是设置时间的界面是在不太友好 .
作这个题目之前总觉得做完这个课程设计2,会有许多总结想说.拖拖拉拉了这么长时间,
也懒得多说什么了.
直接上代码把!
代码很乱,没有什么参考价值,纯属作个纪念.
课程设计2做完了,终于可以向32位汇编进发了!继续努力!
assume cs:setupsg
; setupsg
; copy launchsg to floppy's fan 1,others copy to fan 2
setupsg segment
start:
; write launchsg to floppy fan 1
mov ax,launchsg
mov es,ax
mov bx,0
mov al,1
mov dl,0
mov dh,0
mov ch,0
mov cl,1
mov ah,3
int 13H
; write funcssg to floppy after fan2
mov ax,funcssg
mov es,ax
mov al,15
mov cl,2
mov ah,3
int 13H
mov ax,4c00H
int 21H
setupsg ends
; copy floppy fan 2 to 2000H:0,jmp 2000H:0
launchsg segment
assume cs:launchsg
call loadsys
; jump to 2000H:0
mov ax,2000H
push ax
mov ax,0
push ax
retf
; copy after fan 2 to 2000H:0
loadsys:
mov ax,2000H
mov es,ax
mov bx,0
mov al,15
mov dl,0
mov dh,0
mov ch,0
mov cl,2
mov ah,2
int 13H
ret
launchsg ends
funcssg segment
assume cs:funcssg ; This sentence is very important for table
allsrc:
; test ,for FLAG of INT 9
mov cx,0
jmp short sysbegin
functab dw offset func1,offset func2,offset func3,offset func4
sysbegin:
call show_mm
mov ah,0 ; wait for user input
int 16H
cmp al,49 ; compare with 1's ASCII
jb sysbegin
cmp al,52 ; compare with 4's ASCII
ja sysbegin
sub al,49 ; jump to sub function
mov bl,al
mov bh,0
add bx,bx
call word ptr functab[bx]
jmp short sysbegin ; menu loop it's very important
;--------------------------------------------
; show main menu
;--------------------------------------------
show_mm: push ax
push ds
push si
push bx
jmp short smm_start
mmstr1 db '1.reset pc',0
mmstr2 db '2.start system',0
mmstr3 db '3.clock',0
mmstr4 db '4.set clock',0
mmtab dw mmstr1,mmstr2,mmstr3,mmstr4
smm_start:
mov ax,0b800H
mov ds,ax
mov si,0
mov ah,0
strs: cmp ah,4
jnb mmend
mov bl,ah
mov bh,0
add bx,bx
mov bx,mmtab[bx]
push si
item:
mov al,cs:[bx]
cmp al,0
je itemend
mov ds:[si],al
inc si
mov byte ptr ds:[si],2
inc si
inc bx
jmp item
itemend:
pop si
add si,160
inc ah
jmp short strs
mmend:
pop bx
pop si
pop ds
pop ax
ret
;--------------------------------------------
; clsscr, fill screen with ' '
;--------------------------------------------
clsscr:
push ax
push ds
push si
push cx
mov ax,0b800H
mov ds,ax
mov si,0
mov cx,160*25
cs_lp: mov byte ptr ds:[si],' '
inc si
;mov byte ptr ds:[si],01100110B
mov byte ptr ds:[si],2
inc si
loop cs_lp
pop cx
pop si
pop ds
pop ax
ret
;--------------------------------------------
; func1,reset computer
;--------------------------------------------
func1:
;call clsscr ; call clsscr is useless for restart pc
mov ax,0ffffH
push ax
mov ax,0
push ax
retf
;--------------------------------------------
; func2,start system
;--------------------------------------------
func2: ; read disk C:\'s data to 0:7c00H
mov ax,0
mov es,ax
mov bx,07c00H
mov al,1
mov ch,0
mov cl,1
mov dl,80H ; disk C:
mov dh,0
mov ah,2
int 13H
; jump to 0:7c00H
mov ax,0
push ax
mov ax,07c00H
push ax
retf
;--------------------------------------------
; func3,show clock
;--------------------------------------------
func3:
jmp short func3_start
dis_time db '20??/??/?? ??:??:??',0 ; year/month/day hour:minute:second
time_num db 9,8,7,4,2,0
ori9ip dw 0
ori9cs dw 0 ; save original int 9's entry
func3_start:
call clsscr
cmp cx,0 ; use flag
jne time_lp
mov cx,1
call seti9
time_lp: call showtime
jmp short time_lp ; loop for update time
;mov ax,4c00H ; cut!!
;int 21H
seti9:
;-------------------------------------------
; over write a new int 9 prog
; 写在这里,会不会导致第二次有问题?找不到 原INT9 入口?
;-------------------------------------------
push ds
push ax
push es
push si
; save original int 9's entry
push cs
pop ds
mov ax,0
mov es,ax
push es:[9*4]
mov si,offset ori9ip
pop ds:[si]
push es:[9*4+2]
pop ds:[si+2]
mov word ptr es:[9*4],offset int9
mov es:[9*4+2],cs
pop si
pop es
pop ax
pop ds
ret
int9:
;-------------------------------------------
; define new int 9
;-------------------------------------------
push ax
push ds
push si
push cx
int9te:
pushf ; call original int9
mov si,offset ori9ip
call dword ptr ds:[si]
mov ax,0b800H
mov ds,ax
in al,60H
cmp al,3bH ; F1
je changecl
cmp al,1 ; ESC
je gomm
jmp short int9ret
changecl: mov cx,19 ; length of '20??/??/?? ??:??:??'==19
mov si,160*10+1
i9lp: inc byte ptr ds:[si]
add si,2
loop i9lp
jmp short int9ret
gomm:
;------------------------
; restore original int 9
;------------------------
mov ax,0
mov es,ax
push cs
pop ds
mov si,offset ori9ip
mov ax,ds:[si] ; cs 16 bit ,ip 16 bit
mov es:[9*4],ax
mov ax,ds:[si+2]
mov es:[9*4+2],ax
;call show_mm ; back to main menu
pop cx
pop si
pop ds
pop ax
mov cx,0 ; after restore int 9,set FLAG of int9 as FALSE (0),but useless.............
jmp sysbegin ; back to main menu
int9ret: pop cx
pop si
pop ds
pop ax
iret
;--------------------------------------------
; middle helper
;--------------------------------------------
jmphlp: call clsscr
jmp sysbegin
showtime:
push ds
push si
push es
push di
push ax
push cx
;---------------------------------
; save time to time area
;---------------------------------
mov ax,cs
mov ds,ax
mov si,offset dis_time
mov di,offset time_num
push si
add si,2
mov cx,6
bcdlp:
mov al,ds:[di] ; get data from CMOS RAM
out 70H,al
in al,71H
push cx
mov ah,al
mov cl,4
shr ah,cl
and al,00001111B
add ah,30H
add al,30H
mov ds:[si],ah
mov ds:[si+1],al
add si,3
inc di
pop cx
loop bcdlp
pop si
;---------------------------------
; display time area
;---------------------------------
mov ax,0b800H
mov es,ax
mov di,160*10
st_lp: mov al,ds:[si]
cmp al,0
je st_ok
mov es:[di],al
inc di
inc di
inc si
jmp short st_lp
st_ok:
pop cx
pop ax
pop di
pop es
pop si
pop ds
ret
nop
;--------------------------------------------
; func4,set clock
;--------------------------------------------
func4:
call clsscr
call dissettime ; test display set time....
; for test
;call mod_time ; mod time correct!
;jmp sysbegin
mov bx,0 ; inpos[down_flag]'s down_flag
func4_start:
cmp bx,12 ; length of inpos[]
jnb func4_fix
call time_input
inc bx
jmp short func4_start
; position of time
; This area only to save data!!!
timetip db '2000/01/01 00:00:00',0 ; default time
inpos db 4,6,10,12,16,18,22,24,28,30,34,36 ; length is 12
mt_pos db 2,3,5,6,8,9,11,12,14,15,17,18 ; yy/mm/dd hh:mm:ss
func4_fix:
dec bx
jmp short func4_start
;------------------------------------------
; jmphlp helper
;------------------------------------------
jmphlphlp:
jmp jmphlp
;------------------------------------------
; after modify time,go here
;------------------------------------------
aft_mt:
call mod_time
jmp sysbegin
;------------------------------
; solve input
; params: bx--- inpos[]'s down_flag
;------------------------------
time_input:
push ax
push bx
push ds
push si
push di
mov ax,0b800H ; ds:[si] WHERE SHOW INPUT TIME
mov ds,ax
mov si,0
mov di,bx
mov bl,inpos[bx]
;add bl,bl
ti_st: mov ah,0
int 16H
; ESC ascii:1BH ENTER ascii:0D
cmp al,1bH ; ESC
je jmphlphlp
cmp al,0dH ; enter
je aft_mt
cmp al,30H ; not number
jb ti_st
cmp al,39H
ja ti_st
mov ds:[si+bx],al ; ASCII to display
mov bl,mt_pos[di] ; ASCII to modify time_tip
mov bh,0
mov timetip[bx],al
pop di
pop si
pop ds
pop bx
pop ax
ret
;------------------------------
; display set time
;------------------------------
dissettime:
push ds
push bx
push si
push ax
push es
push di
push cs
pop ds
mov bx,offset timetip
mov si,0
mov ax,0b800H
mov es,ax
mov di,0
mov ah,0
dstlp: mov al,ds:[bx+si]
cmp ax,0
je dstend
mov es:[di],al
inc si
add di,2
jmp short dstlp
dstend:
pop di
pop es
pop ax
pop si
pop bx
pop ds
ret
;------------------------------
; set time by input area
;------------------------------
;time_num db 9,8,7,4,2,0
;timetip db '2000/01/01 00:00:00',0 ; default time
;inpos db 4,6,10,12,16,18,22,24,28,30,34,36 ; length is 12
mod_time:
jmp mt_start
;mt_pos db 2,3,5,6,8,9,11,12,14,15,17,18 ; yy/mm/dd hh:mm:ss
mt_start:
push di
push ax
push ds
push si
push bx
push cx
mov di,0
push cs
pop ds
mov bx,offset timetip
mov si,0
mt_lp:
cmp di,5
ja mt_ret
mov bl,mt_pos[si]
mov bh,0
mov al,time_num[di]
out 70H,al
mov cl,4
mov al,timetip[bx]
sub al,30H
shl al,cl
inc si
mov bl,mt_pos[si]
mov bh,0
mov bl,timetip[bx]
sub bl,30H
or al,bl
inc si
; mov al,24
out 71H,al
inc di
jmp short mt_lp
mt_ret: pop cx
pop bx
pop si
pop ds
pop ax
pop di
ret
funcssg ends
end start