📄 findbad.asm
字号:
mov bh,00h
mov dl,80h
int 13h
;-------------------
mov si,OFFSET NO_F_DAT
mov al,00h
mov test_h,al
mov al,[si+2]
mov test_s,al
mov al,[si+3]
mov test_c,al
mov ax,dos_start_c
mov si,offset testhd
add si,ax
mov ch,test_c
test9: mov dh,test_h
test10:mov ah,04h
mov al,ns
mov cl,test_s
mov dl,80h
int 13h
jnb test11
mov ah,31h ;写入坏柱
mov [si],ah
jmp test12
test11:inc dh
mov ah,nh
dec ah
cmp dh,ah
jnz test10
test12:inc si
clc
add ch,1h
jnc test13
mov ah,test_s
add ah,40h
mov test_s,ah
test13:mov ax,nc
dec ax
mov di,ax
mov ah,test_s
shr ah,1h
shr ah,1h
shr ah,1h
shr ah,1h
shr ah,1h
shr ah,1h
mov al,ch
mov test_c,ch
call dsp_test_c_nc ;在屏幕上显示当前Test_c of Nc
cmp ax,di
jnz test9
pop di
pop si
popf
pop dx
pop cx
pop bx
pop ax
ret
tests endp
phy_chs_dos_rs proc near
;物理柱扇头转成逻辑扇区
;输入:phy_c/h/s nh ns dos_start_c/h/s
;输出:dos_rs
push ax
push bx
push cx
push dx
pushf
push si
push di
mov ax,phy_1c_ns
mov bx,phy_c
mov cx,dos_start_c
sub bx,cx
mul bx
mov di,dx
mov si,ax
;-----------------
mov al,ns
mov bh,phy_h
mul bh
add si,ax
jnc p_c_d1
inc di
p_c_d1:mov al,ns
mov bh,dos_start_h
mul bh
sub si,ax
jnc p_c_d2
dec di
p_c_d2:mov ah,00h
mov al,phy_s
add si,ax
jnc p_c_d3
inc di
p_c_d3:mov ah,00h
mov al,dos_start_s
sub si,ax
jnc p_c_d4
dec di
p_c_d4:mov dos_rs_l16,si
mov dos_rs_h16,di
pop di
pop si
popf
pop dx
pop cx
pop bx
pop ax
ret
phy_chs_dos_rs endp
dos_rs_ch proc near
;逻辑扇区dos_rs转成dos_CH
;输入:dos_rs bn_A/B/C/E
;输出:dos_CH
push ax
push bx
push cx
push dx
pushf
push si
push di
mov di,dos_rs_h16
mov si,dos_rs_l16
mov ax,bn_A
sub si,ax
jnc d_r_c1
dec di
d_r_c1:mov ax,bn_B
mov bh,00h
mov bl,bn_c
mul bx
sub si,ax
jnc d_r_c2
dec di
d_r_c2:sub di,dx
mov dx,di
mov ax,si
mov bl,bn_E
mov bh,00h
mov dx,00h
mov ax,di
div bx
mov cx,ax
mov ax,si
div bx
mov dx,cx
add ax,2h
jnc d_r_c3
inc dx
d_r_c3:mov dos_CH_L16,ax
mov dos_CH_H16,dx
pop di
pop si
popf
pop dx
pop cx
pop bx
pop ax
ret
dos_rs_ch endp
dos_rs_phy_int13 proc near
;将逻辑扇区dos_rs转成phy_c/h/s>int13_c/h/s
;输入:dos_rs,ns,nh,dos_start_h/s/c
;输出:phy_c/h/s & int13_c/h/s
push ax
push bx
push cx
push dx
pushf
push si
push di
mov si,dos_rs_L16
mov di,dos_rs_H16
;phy_s-----------
mov bl,ns
mov bh,00h
mov dx,0h
mov ax,di
div bx
mov ax,si
div bx
mov ah,00h
mov al,dos_start_s
add dx,ax
mov phy_s,dl
;phy_h------------
mov bl,ns
mov bh,00h
mov dx,0h
mov ax,di
div bx
mov cx,ax
mov ax,si
div bx
mov dx,cx
push ax
mov ax,dx
mov dx,0h
mov bl,nh
mov bh,0h
div bx
pop ax
div bx
push ax
mov al,dos_start_h
add dl,al
mov phy_h,dl
;phy_c------------
pop ax
mov dx,dos_start_c
add ax,dx
mov phy_c,ax
;------------------
call phychs_int13
pop di
pop si
popf
pop dx
pop cx
pop bx
pop ax
ret
dos_rs_phy_int13 endp
read_int13_1c proc near
push ax
push bx
push cx
push dx
pushf
push si
push di
mov ah,00h
mov bh,00h
mov dl,80h
int 13h
mov ax,0201h
mov bx,offset temp_dat
mov dl,80h
mov dh,int13_h
mov cl,int13_s
mov ch,int13_c
int 13h
pop di
pop si
popf
pop dx
pop cx
pop bx
pop ax
ret
read_int13_1c endp
writ_int13_1c proc near
push ax
push bx
push cx
push dx
pushf
push si
push di
mov ah,00h
mov bh,00h
mov dl,80h
int 13h
mov ax,0301h ;0301h
mov bx,offset temp_dat
mov dl,80h
mov dh,int13_h
mov cl,int13_s
mov ch,int13_c
int 13h
pop di
pop si
popf
pop dx
pop cx
pop bx
pop ax
ret
writ_int13_1c endp
writ_int13_1c_bad_dat proc near
push ax
push bx
push cx
push dx
pushf
push si
push di
mov ah,00h
mov bh,00h
mov dl,80h
int 13h
mov ax,0301h ;0301h
mov bx,offset bad_dat
mov dl,80h
mov dh,int13_h
mov cl,int13_s
mov ch,int13_c
int 13h
pop di
pop si
popf
pop dx
pop cx
pop bx
pop ax
ret
writ_int13_1c_bad_dat endp
write_bad proc near
;净化testhd区--A
;查找TESTHD表中第一个“31H”,记录下第几柱面至BAD_C,并将此"31H"改写成"30H"--B
;将BAD_C送往PHY_C,phy_h置0h phy_s置01h---C
;计算出dos_rs-->dos_CH(起)---D
;将dos_rs加上phy_1c_ns-->dos_CH(终)---E
;A=dos_ch(起) DIV 80h +begin_FAT1_rs==>int13_c/h/s
; 并从dos_ch(起) MOD 80h处改写0ffffff7h至扇区尾
;B=dos_ch(终) DIV 80h +begin_FAT1_rs
;将A+1开始连续写入整扇区的0ffffff7h直至B-1
;B==>int13_c/h/s 并从0至dos_ch(终) MOD 80h写0ffffff7h至扇区
;重复搜表"31h"以nc为参考,直至全为"30h"处理完毕
push ax
push bx
push cx
push dx
pushf
push si
push di
;-------------A
mov bx,dos_start_c
mov si,offset testhd
add bx,si
mov al,[bx]
cmp al,31h
jnz write_bad_0
mov dx,offset err_dos_start_c
mov ah,09h
int 21h
mov ax,4c00h
int 21h
ret
write_bad_0:mov cx,dos_start_c
cmp cx,00h
jz w_b_0
mov al,30h
write_bad_0a:mov [si],al
inc si
dec cx
jnz write_bad_0a
;-------------B
w_b_0: mov cx,nc
mov bx,0h
mov si,offset testhd
w_b_1: mov al,[si]
cmp al,31h
jz write_bad_1
inc bx
inc si
dec cx
jnz w_b_1
jmp w_b_exit
write_bad_1:mov bad_c,bx
mov al,30h
mov [si],al
;------------C
mov ax,bad_c
mov phy_c,ax
mov ah,00h
mov al,01h
mov phy_h,ah
mov phy_s,al
;------------D
call phy_chs_dos_rs
call dos_rs_ch
mov ax,dos_ch_L16
mov dx,dos_ch_H16
mov dos_CH_Bg_L16,ax
mov dos_CH_Bg_H16,dx
;------------E
mov bx,phy_1c_ns
mov ax,dos_rs_L16
mov dx,dos_rs_H16
add ax,bx
jnc write_bad_2
inc dx
write_bad_2:mov dos_rs_L16,ax
mov dos_rs_H16,dx
call dos_rs_ch
mov ax,dos_ch_L16
mov dx,dos_ch_H16
mov dos_ch_ED_L16,ax
mov dos_ch_ED_H16,dx
;--------------F
mov ax,dos_ch_Bg_L16
mov dx,dos_ch_bg_H16
mov bx,80h ;注:sector/4=80h
div bx
mov write_sector_bg_no,dx
mov dx,00h
mov si,begin_FAT1_rs_L16
mov di,begin_FAT1_rs_H16
add ax,si
jnc write_bad_3
inc dx
write_bad_3:add dx,di
mov FAT1_Bad_ch_rs1_L16,ax
mov FAT1_Bad_ch_rs1_H16,dx
;---------------------
mov ax,dos_ch_ED_L16
mov dx,dos_ch_ED_H16
mov bx,80h ;同上
div bx
mov write_sector_ED_no,dx
mov dx,00h
mov si,begin_FAT1_rs_L16
mov di,begin_FAT1_rs_H16
add ax,si
jnc write_BAD_4
inc dx
write_BAD_4:add dx,di
mov FAT1_BAD_CH_rs2_L16,ax
mov FAT1_BAD_CH_rs2_H16,dx
;---------------------
mov ax,FAT1_BAD_ch_rs1_L16
mov dx,FAT1_BAD_ch_rs1_H16
mov dos_rs_L16,ax
mov dos_rs_H16,dx
call dos_rs_phy_int13
call read_int13_1c
mov si,offset temp_dat
mov di,si
add di,200h
mov cx,write_sector_Bg_no
mov ax,04h
mul cx
mov cx,ax
add si,cx
mov ax,0fff7h
mov dx,0fffh
write_bad_5:mov [si],ax
mov [si+2h],dx
add si,4h
cmp si,di
jnz write_bad_5
call writ_int13_1c
;-----------------
w_b_5: mov ax,dos_rs_L16
mov dx,dos_rs_H16
add ax,1h
jnc w_b_6
inc dx
w_b_6: mov si,FAT1_BAD_ch_rs2_L16
mov di,FAT1_BAD_ch_rs2_H16
cmp dx,di
jnz w_b_7
cmp ax,si
jnz w_b_7
jmp w_b_8
w_b_7: mov dos_rs_L16,ax
mov dos_rs_H16,dx
call dos_rs_phy_int13
call writ_int13_1c_bad_dat
jmp w_b_5
;------------------
w_b_8: mov dos_rs_L16,ax
mov dos_rs_H16,dx
call dos_rs_phy_int13
call read_int13_1c
mov si,offset temp_dat
mov cx,write_sector_Ed_no
mov ax,0fff7h
mov dx,0fffh
w_b_9: mov [si],ax
mov [si+2],dx
add si,4h
dec cx
jnz w_b_9
call writ_int13_1c
jmp w_b_0 ;返回开始重新寻找下一坏柱
w_b_exit: nop
pop di
pop si
popf
pop dx
pop cx
pop bx
pop ax
ret
write_bad endp
copy_FAT1_FAT2 proc near
push ax
push bx
push cx
push dx
pushf
push si
push di
mov ax,begin_FAT1_rs_L16
mov dx,begin_FAT1_rs_H16
mov si,begin_FAT2_rs_L16
mov di,begin_FAT2_rs_H16
mov cpy_fat1_fat2_2_L16,si
mov cpy_fat1_fat2_2_H16,di
push si
push di
cp_f0: mov dos_rs_L16,ax
mov dos_rs_H16,dx
call dos_rs_phy_int13
call read_int13_1c
mov dos_rs_L16,si
mov dos_rs_H16,di
call dos_rs_phy_int13
call read_int13_1c
add ax,1h
jnc cp_f1
inc dx
cp_f1: add si,1h
jnc cp_f2
inc di
cp_f2: pop cx ;高位
pop bx ;低位
push bx
push cx
mov cpy_fat1_fat2_1_L16,ax
mov cpy_fat1_fat2_1_H16,dx
call dsp_cpy_fat1_fat2
cmp cx,dx
jnz cp_f0
cmp bx,ax
jnz cp_f0
pop cx
pop bx
pop di
pop si
popf
pop dx
pop cx
pop bx
pop ax
ret
copy_FAT1_FAT2 endp
DSP_VGA11H proc near
;显示640X480分辨率单彩色图形在屏幕上
;输入:VGA11H_DAT
;输出:在屏幕上显示VGA12H单16色之一的图像
push ax
push bx
push cx
push dx
pushf
push si
push di
push es
;保存当前显示模式
mov ah,0fh
int 10h
push ax
push bx
;置显示模式为图形12H=640X480X16
mov ax,0a000h
push ax
pop es
mov ax,0012h
int 10h
;显示VGA11h_DAT区图像
mov si,offset vga11h_dat
mov di,00h
mov cx,9600h ;38400
cli
d_vga_1:mov al,[si]
mov es:[di],al
inc di
inc si
dec cx
jnz d_vga_1
sti
mov ah,01h
int 21h
cmp al,38h ;输入键8继续,其它任意键退出!
jz d_vga_z2
pop bx
pop ax
mov ah,00h
int 10h
pop es
pop di
pop si
popf
pop dx
pop cx
pop bx
pop ax
pop ax
mov ax,4c00h
int 21h
ret
d_vga_z2:pop bx
pop ax
mov ah,00h
int 10h
pop es
pop di
pop si
popf
pop dx
pop cx
pop bx
pop ax
ret
DSP_VGA11H endp
jisuanRS proc near
push ax
push bx
push cx
push dx
pushf
push si
push di
pop di
pop si
popf
pop dx
pop cx
pop bx
pop ax
ret
jisuanRS endp
code ends
;------------------
;堆栈区
;------------------
stack segment stack 'stack'
db 1000 dup(0)
stack ends
;------------------
end beg
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -