作者: 一了 <[email protected]> 日期: 2016-05-01 今天是劳动节, 是全体劳动者的节日, 首先祝福全天下的劳动者都幸福! 想着能为天下劳动者们做点什么, 可惜我还没能做到达则兼济天下的程度, 在这里只能把我的想法写出来, 或者可以对别人能有点启发. 财富都是劳动创造出来的, 当然这里的财富不是指"钱", 而是特指能满足你的需要而又不能垂手可得的, 这就排除了大自然赐予而又送到你身边的东西, 典型的就是阳光, 感觉像是循环定义. 不管了, 这里想说的实际上是财富来自于哪里? 人们获得财富的方式从采集与狩猎, 到放牧与农业, 到工业, 还有商业等服务业, 劳动者发生了多次角色转换, 典型的主体劳动人群就是农民和工人. 随着科技和经济形态的发展, 未来的主要劳动人群很大可能是程序员, 因此需要越来越多的码农码工. 从本世纪初开始, 编程人员就一直处于紧缺状态, 而且我估计会一直紧缺很多年! 这就需要社会不断的培养新的编程技术人员, 包括学校培养, 培训班, 以及自学! 很多人问, 自学编程难不难? 这个问题不好一句话回答, 我准备以亲身经历来回答 ;-) 本人学的是会计专业, 在学校上过两个学期的计算机课程, 第一个学期实际上就是简单的电脑操作, 如 TT 指法练习, WPS 中文输入等, 第二个学期学了 FoxBase 数据库, 这算是摸到编程的门了, 当然严格来说应该还不算入门吧, 哈哈. 毕业之后也没有电脑操作机会, 瞎混混过日子, 直到1999年下半年才有电脑用, 从此一发不可收拾矣...... 最先自学的是汇编, 为啥是汇编呢, 因为 DOS 自带了 debug 可以用, 这个程序可以载入任意可执行程序, 然后反汇编, 从反汇编开始学汇编, 也就非常自然了. 一开始的学习方法就是用 debug 输入一小段程序, 然后运行, 看结果, 但这个方式不好的地方是只能写短小的程序, 而且相对位移非常难算, 稍不小心, 代码就跑飞了.后来要写大一点的程序, 就只能上 MASM 了, 我用 MASM 写了一个磁盘编辑程序. 这个程序比较有意思的地方是我还自制了一个菜单 ;-) 从图中可以看出, 菜单看起来还蛮像那么回事的. 这个程序是因为 CIH 病毒的猖獗才出笼的, 因为可以全屏幕编辑磁盘, 因此对被 CIH 破坏的地方可以手工修复. 程序接受键盘输入, 可以用键盘快捷键切换磁盘特定位置, 如 MBR, BOOT, FAT, ROOT 等, 也可以按照物理柱面/磁头/扇区或者逻辑扇区定位, 用菜单可以选择A/B软盘或者电脑挂载的硬盘. 为了预防 CIH 病毒, 软件支持把硬盘前几兆的内容备份到硬盘的隐藏柱面(经过我的观察, 所有硬盘都会有一两个隐藏柱面, 一般程序是无法访问的), 特别是重要的 MBR 和分区表树, 根目录等. 因为之前没有什么编程实践和训练, 加上那时好穷啊也买不起书, 汇编几乎全是从 debug 学的, 一条条反汇编, 看不懂的指令就用 debug 反汇编 debug 自身, debug 软件本身有字符串资源, 用来解释汇编指令含义, 就这样学. 实在不懂的, 就去书店翻看一点关于汇编的书. 想想那时的学习热情, 连现在的我自己都惭愧啊! 因为对汇编掌握的不精通, 写出来的代码质量如何我就不得而知了, 反正是能跑 :-] 后来统计了一下, 一共也就用到三十多条汇编指令, 哈哈哈... 这里顺便附录一下程序的源代码, 这个程序经编译其可执行程序为5660字节, 因为实际上没有用到什么 DOS 中断调用, 程序可以脱离操作系统执行, 在正确加载的情况下, 无需操作系统就可以直接对磁盘进行编辑, 备份和恢复操作(部分重要内容). 因为原先的保存手段有限, 写的程序有些没有保存下来, 这么久了也根本回想不起来, 根据保存下来的, 我用汇编还写了一些小玩意儿, 如音乐播放软件(用硬件端口), 文本阅读器等, 甚至还写了一个病毒原型, 当然只写了中断截留盗用/传染/自身加密这些部分, 完全没有破坏体, 哈哈... 磁盘编辑器源码如下: ;---------------------------------------------------------------------------- ;---------------------- Program Starting ... -------------------------------- ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- ;Defination Starting... ;---------------------------------------------------------------------------- A_BUF = 0400H UP = 0 escape = 011bh enter = 1c0dh c_pgup = 8400h c_pgdw = 7600h home = 4700h ende = 4f00h pageup = 4900h pagedw = 5100h cleft = 4b00h cup = 4800h cright = 4d00h cdown = 5000h digit0 = 48 digit9 = 57 hex_au = 65 hex_fu = 70 hex_ad = 97 hex_fd = 102 lfrg = 0c4h updw = 0b3h uplf = 0dah uprg = 0bfh dwlf = 0c0h dwrg = 0d9h d_wild = 74 d_row = 03 d_col = 02 d_hex = d_col+10 d_text = d_col+59 d_para = d_col+04 d_drive = d_para+02 d_cyls = d_para+09 d_head = d_para+18 d_sect = d_para+28 d_ldrive = d_para+39 d_lclust = d_para+46 d_lsect = d_para+56 d_up = d_para+64 w_msub = 10 c_mbar = 7 tbar_c = 07h pbar_c = 70h tmnu_c = 70h pmnu_c = 07h thed_c = 26h phed_c = 2eh bord_c = 2ah text_c = 3eh stat1_c = 3ch stat2_c = 39h stat3_c = 3ah stat4_c = 3bh ldisk_w = 18 ;Defination End... ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- ;Macro Starting... ;---------------------------------------------------------------------------- Add_Row macro ;Use SI=>Get Row mov ax,si mov [row],al add [row],d_row+1 call SCursor endm Add_Col macro ;Use DI=>Get Col mov ax,di mov dl,3 mul dl add al,d_hex ;Disp2hex=>Col mov [col],al call SCursor endm ;Macro End... ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- ;CODE Segment Starting... ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- Code segment para public org 100h assume cs:Code,ds:Data,es:Data,ss:Code ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- Main Proc Far ;---------------------------------------------------------------------------- START: mov ax,Data ;MOV AX,OFFSET CLAST ;INC AX ;MOV BX,AX ;MOV CL,4 ;SHR AX,CL ;MOV DX,AX ;SHL DX,CL ;CMP DX,BX ;JZ NEXT ;INC AX ;NEXT: ;MOV BX,CS ;ADD AX,BX mov ds,ax mov es,ax call Disk call Display call Cls ;---------------------------------------------------------------------------- Main Endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- Exit proc near ;---------------------------------------------------------------------------- mov ah,4ch int 21h Exit endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- Error proc near ;---------------------------------------------------------------------------- call NewLine mov dx,offset version call DispText call NewLine call NewLine mov dx,offset error_m call DispText call NewLine call Exit Error endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- Invalid proc near ;---------------------------------------------------------------------------- mov al,[y] push ax mov [x1],8 mov [y1],20 mov [x],5 mov [y],41 call MSave call MBox mov [row],9 mov [col],35 call SCursor mov dx,offset err_m1 call DispText mov [row],11 mov [col],22 call SCursor mov dx,offset err_m2 call DispText mov [col],28 call SCursor mov bl,[ldrive] add bl,hex_au call DispChar mov [row],13 mov [col],28 call SCursor mov dx,offset err_m3 call DispText call GetKey call Mstore pop ax mov [y],al ret Invalid endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- WBox proc near ;---------------------------------------------------------------------------- mov bh,stat1_c mov cx,1800h mov dx,1802h call Box mov bh,stat2_c mov cx,1803h mov dx,1810h call Box mov bh,stat3_c mov cx,1810h mov dx,1840h call Box mov bh,stat4_c mov cx,1840h mov dx,184fh call Box mov [row],18h call SCursor mov dx,offset status call DispText ;Display Version mov bh,tbar_c call Dsp_Bar mov bh,11h mov cx,0100h mov dx,174fh call Box ;Clear Text Screen mov ah,[color] mov al,[y] push ax mov [x1],d_row mov [y1],d_col-1 mov [x],16 mov [y],d_wild+1 mov [color],bord_c call MBox ;Text Box Border pop ax mov [color],ah mov [y],al mov bh,text_c mov ch,d_row+1 mov cl,d_col mov dh,d_row+16 mov dl,d_col+d_wild call Box ;Text Box mov bh,thed_c mov ch,d_row mov cl,d_para+1 mov dh,ch mov dl,d_up+1 call Box ;Parameter Box mov [row],d_row mov [col],d_para call SCursor mov dx,offset titles call DispText ;Display Disk Parameter mov bh,phed_c mov ch,d_row mov cl,d_cyls mov dh,ch mov dl,d_cyls+3 call Box ;Cylinder mov bh,phed_c mov ch,d_row mov cl,d_head mov dh,ch mov dl,d_head+1 call Box ;Head mov bh,phed_c mov ch,d_row mov cl,d_sect mov dh,ch mov dl,d_sect+1 call Box ;Sector mov bh,phed_c mov ch,d_row mov cl,d_ldrive mov dh,ch mov dl,d_ldrive call Box ;Logical Drive mov bh,phed_c mov ch,d_row mov cl,d_lclust mov dh,ch mov dl,d_lclust+3 call Box ;Logical Clust mov bh,phed_c mov ch,d_row mov cl,d_lsect mov dh,ch mov dl,d_lsect+1 call Box ;Logical Sector mov bh,phed_c mov ch,d_row mov cl,d_up mov dh,ch mov dl,d_up call Box ;page UP/DOWN ret WBox endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- Dsp_Bar proc near ;---------------------------------------------------------------------------- mov cx,0000h mov dx,004fh call Box ;Menu Bar Box mov [row],0 mov [col],0 call SCursor mov dx,offset menubar call DispText ;Display Menubar ret Dsp_Bar endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- Disk proc near ;---------------------------------------------------------------------------- mov [drive],80h call XDisk or ax,ax jz disk1 call Error disk1: call Cls call ECursor call WBox call DispPage mov [ldrive],2 mov [dlast],0 mov bp,sp sub bp,6 disk2: mov di,[buffer] disk3: push di push [cyls] mov ah,[head] mov al,[sect] push ax call Read jc disk5 mov al,[di+01c2h] cmp al,06h ;No Branch jnz disk4 mov ch,[di+01c1h] mov dh,[di+01bfh] mov cl,[di+01c0h] call PPPP mov [ncyls],ax mov [nhead],dh mov [nsect],cl call LDisk cmp ax,0 jnz disk5 call PushDisk inc [ldrive] inc [dlast] pop ax mov [head],ah mov [sect],al pop [cyls] pop di add di,10h jmp disk3 disk4: cmp al,05h ;Have Branch jnz disk5 ;AL==0:End mov ch,[di+01c1h] mov dh,[di+01bfh] mov cl,[di+01c0h] call PPPP mov [cyls],ax mov [head],dh mov [sect],cl jmp disk2 disk5: mov di,sp mov di,ss:[di+4] sub di,[buffer] cmp di,40h jb disk6 cmp bp,sp jz diskx add sp,6 disk6: pop ax mov [head],ah mov [sect],al pop [cyls] pop di add di,10h jmp disk3 diskx: add sp,6 mov [ldrive],2 call PopDisk ret Disk endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- XDisk proc near ;AX ?= 0 ;---------------------------------------------------------------------------- mov ah,8 mov dl,[drive] int 13h jnc xdisk1 xdiskx: mov ax,0ffffh ret xdisk1: mov ax,Data ;MOV AX,DS mov es,ax add ch,[Extra_Cylinder] call PPPP mov [xcyls],ax mov [xhead],dh mov [xsect],cl mov [cyls],0 mov [head],0 mov [sect],1 call Read jc xdiskx xor ax,ax ret XDisk endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- PPPP proc near ;CH,CL=>AX,CL ;---------------------------------------------------------------------------- mov al,cl shl cl,1 shl cl,1 shr cl,1 shr cl,1 push cx mov cl,6 shr al,cl mov ah,al mov al,ch pop cx ret PPPP endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- LDisk proc near ;AX ?= 0 ;---------------------------------------------------------------------------- mov [ls_h],0 mov [ls_l],0 call LRead jc ldiskx mov si,[buffer] jmp ldisk0 ldiskx: call Invalid mov ax,0ffffh ret ldisk0: mov ax,[si+1feh] cmp ax,0aa55h jnz ldiskx mov ax,[si+0bh] ;0BH:Bytes/Sector cmp ax,0 jz ldiskx mov cl,[si+0dh] ;0DH:sectors/clust cmp cl,0 jz ldiskx dec cl mov [xlsect],cl inc cl mov al,[drive] cmp al,80h jnz ldisk1 mov dx,[si+22h] ;20H:Max LSector mov ax,[si+20h] ;IF DL==80 jmp ldisk2 ldisk1: xor dx,dx ;13H:Max Sector mov ax,[si+13h] ;IF DL==00/01 ldisk2: mov [xls_h],dx mov [xls_l],ax call Divide cmp ax,0 jz ldiskx mov [xlclust],ax mov cl,[si+10h] ;10H:fats cmp cl,0 jz ldiskx xor ch,ch dec cx mov ax,[si+16h] ;16H:sectors/fat cmp ax,0 jz ldiskx mov bx,ax inc ax mov [fat],ax ldisk3: add ax,bx loop ldisk3 mov [root],ax mov bx,[si+11h] ;11H:root items cmp bx,0 jz ldiskx mov cl,4 shr bx,cl add ax,bx mov [d1st],ax xor ax,ax ret LDisk endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- DiskP proc near ;---------------------------------------------------------------------------- mov al,[sectors] ;AL=Sectors. mov bx,[buffer] ;BX=Buffer, ;ES=Segment. mov dx,[cyls] mov cl,6 shl dh,cl mov cl,[sect] ;CL=Sector, add cl,dh mov dh,[head] ;DH=Head, mov ch,dl ;CH=Cylinder, mov dl,[drive] ;DL=Drive. int 13h ret DiskP endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- Read proc near ;---------------------------------------------------------------------------- mov ah,02 ;AH=Function. call DiskP jc readx call ResetUp readx: ret Read endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- Write proc near ;---------------------------------------------------------------------------- mov ah,03 ;AH=Function. call DiskP ret Write endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- LRead proc near ;---------------------------------------------------------------------------- call LtoP call Read ret LRead endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- PushDisk proc near ;---------------------------------------------------------------------------- mov si,offset dlast push [xcyls] pop [si+1] mov al,[xhead] mov [si+3],al mov al,[xsect] mov [si+4],al add si,4 mov al,[ldrive] dec al dec al mov cl,ldisk_w mul cl add si,ax mov al,[ldrive] mov [si+1],al push [ncyls] pop [si+2] mov al,[nhead] mov [si+4],al mov al,[nsect] mov [si+5],al push [xls_h] pop [si+6] push [xls_l] pop [si+8] push [xlclust] pop [si+10] mov al,[xlsect] mov [si+12],al push [fat] pop [si+13] push [root] pop [si+15] push [d1st] pop [si+17] ret PushDisk endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- PopDisk proc near ;---------------------------------------------------------------------------- mov si,offset dlast push [si+1] pop [xcyls] mov al,[si+3] mov [xhead],al mov al,[si+4] mov [xsect],al add si,4 mov al,[ldrive] dec al dec al mov cl,ldisk_w mul cl add si,ax mov al,[si+1] mov [ldrive],al push [si+2] pop [ncyls] mov al,[si+4] mov [nhead],al mov al,[si+5] mov [nsect],al push [si+6] pop [xls_h] push [si+8] pop [xls_l] push [si+10] pop [xlclust] mov al,[si+12] mov [xlsect],al push [si+13] pop [fat] push [si+15] pop [root] push [si+17] pop [d1st] mov [ls_h],0 mov [ls_l],0 call StoC call LRead ret PopDisk endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- PtoL proc near ;---------------------------------------------------------------------------- mov ax,[cyls] sub ax,[ncyls] jc ptolx mov cl,[xhead] inc cl xor dx,dx call Multiply mov cl,[head] add ax,cx jnc ptol1 inc dx ptol1: mov cl,[nhead] sub ax,cx jnc ptol2 sub dx,1 jc ptolx ptol2: mov cl,[xsect] call Multiply mov cl,[sect] add ax,cx jnc ptol3 inc dx ptol3: mov cl,[nsect] sub ax,cx jnc ptol4 sub dx,1 jc ptolx ptol4: cmp dx,[xls_h] ja ptolx jnz ptol5 cmp ax,[xls_l] ja ptolx ptol5: mov [ls_h],dx mov [ls_l],ax call StoC ptolx: ret PtoL endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- LtoP proc near ;---------------------------------------------------------------------------- mov dx,[ls_h] mov ax,[ls_l] xor ch,ch mov cl,[nsect] dec cl add ax,cx jnc ltop1 inc dx ltop1: mov cl,[xsect] call Divide inc cl mov [sect],cl mov cl,[nhead] add ax,cx jnc ltop2 inc dx ltop2: mov cl,[xhead] inc cl call Divide mov [head],cl mov cx,[ncyls] add ax,cx mov [cyls],ax ret LtoP endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- Divide proc near ;DX_AX/CL(<>0)=>DX_AX,CL ;---------------------------------------------------------------------------- push ax xor ah,ah mov al,dh div cl mov dh,al ;=>DH mov al,dl div cl mov dl,al ;=>DL pop bx mov al,bh div cl mov bh,al ;=>AH mov al,bl div cl mov bl,al ;=>AL mov cl,ah ;=>CL mov ax,bx ;=>AX ret Divide endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- Multiply proc near ;DX_AX*CL=>DX_AX ;---------------------------------------------------------------------------- push ax xor ch,ch mov ax,dx mul cx mov bx,ax pop ax mul cx add dx,bx ret Multiply endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- iCyls proc near ;---------------------------------------------------------------------------- mov cx,[xcyls] cmp [cyls],cx jz icylsx inc [cyls] call PtoL icylsx: ret iCyls endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- dCyls proc near ;---------------------------------------------------------------------------- cmp [cyls],0 jz dcylsx dec [cyls] call PtoL dcylsx: ret dCyls endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- iHead proc near ;---------------------------------------------------------------------------- mov cl,[xhead] cmp [head],cl jz ihead1 inc [head] call PtoL jmp iheadx ihead1: mov [head],0 call iCyls iheadx: ret iHead endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- dHead proc near ;---------------------------------------------------------------------------- cmp [head],0 jz dhead1 dec [head] call PtoL jmp dheadx dhead1: mov al,[xhead] mov [head],al call dCyls dheadx: ret dHead endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- iSect proc near ;---------------------------------------------------------------------------- mov cl,[xsect] cmp [sect],cl jz isect1 inc [sect] call PtoL jmp isectx isect1: mov [sect],1 call iHead isectx: ret iSect endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- dSect proc near ;---------------------------------------------------------------------------- cmp [sect],1 jz dsect1 dec [sect] call PtoL jmp dsectx dsect1: mov al,[xsect] mov [sect],al call dHead dsectx: ret dSect endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- CtoS proc near ;---------------------------------------------------------------------------- xor dx,dx mov ax,[lclust] mov cl,[xlsect] inc cl call Multiply mov cl,[lsect] add ax,cx jnc ctos1 inc dx ctos1: mov [ls_h],dx mov [ls_l],ax ret CtoS endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- StoC proc near ;---------------------------------------------------------------------------- mov cl,[xlsect] inc cl mov dx,[ls_h] mov ax,[ls_l] call Divide mov [lclust],ax mov [lsect],cl ret StoC endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- iLClust proc near ;---------------------------------------------------------------------------- mov ax,[xlclust] cmp [lclust],ax jz ilclustx inc [lclust] call CtoS ilclustx: ret iLClust endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- dLClust proc near ;---------------------------------------------------------------------------- cmp [lclust],0 jz dlclustx dec [lclust] call CtoS dlclustx: ret dLClust endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- iLSect proc near ;---------------------------------------------------------------------------- mov al,[xlsect] cmp [lsect],al jz ilsect1 inc [lsect] call CtoS jmp ilsectx ilsect1: mov [lsect],0 call iLClust ilsectx: ret iLSect endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- dLSect proc near ;---------------------------------------------------------------------------- cmp [lsect],0 jz dlsect1 dec [lsect] call CtoS jmp dlsectx dlsect1: mov al,[xlsect] mov [lsect],al call dLClust dlsectx: ret dLSect endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- ResetUp proc near ;---------------------------------------------------------------------------- mov si,offset cbuf mov cx,[buffer] mov [si],cx mov [pages],UP ret ResetUp endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- ResetDw proc near ;---------------------------------------------------------------------------- call ResetUp add [cbuf],0100h not [pages] ret ResetDw endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- ReadPage proc near ;---------------------------------------------------------------------------- cmp [pages],up jnz readpage1 call ResetUp jmp readpage2 readpage1: call ResetDw readpage2: ret ReadPage endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- Cls proc near ;---------------------------------------------------------------------------- mov ax,0003h int 10h ret Cls endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- Box proc near ;---------------------------------------------------------------------------- mov ax,0600h xor bl,bl int 10h ret Box endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- DCursor proc near ;---------------------------------------------------------------------------- mov ch,7 mov cl,0 mov ah,1 int 10h ret DCursor endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- ECursor proc near ;---------------------------------------------------------------------------- mov ch,4 mov cl,7 mov ah,1 int 10h ret ECursor endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- BCursor proc near ;---------------------------------------------------------------------------- mov ch,0 mov cl,7 mov ah,1 int 10h ret BCursor endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- SCursor proc near ;DH,DL=>Row,Col. ;---------------------------------------------------------------------------- mov dh,[row] mov dl,[col] mov ah,02h mov bh,00h int 10h ret SCursor endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- GCursor proc near ;DH,DL=>Row,Col. ;---------------------------------------------------------------------------- mov ah,03h mov bh,00h int 10h mov [row],dh mov [col],dl ret GCursor endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- NewLine proc near ;---------------------------------------------------------------------------- mov ax,0e0dh int 10h mov ax,0e0ah int 10h ret NewLine endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- MSave proc near ;---------------------------------------------------------------------------- mov dh,[x1] mov dl,[y1] mov [row],dh mov [col],dl mov di,[mbuf] mov cl,[x] xor ch,ch add cx,3 msave1: push cx push dx mov cl,[y] add cx,3 msave2: push cx call SCursor mov ah,8 int 10h stosw inc [col] pop cx loop msave2 inc [row] pop dx mov [col],dl pop cx loop msave1 ret MSave endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- MStore proc near ;---------------------------------------------------------------------------- mov dh,[x1] mov dl,[y1] mov [row],dh mov [col],dl mov si,[mbuf] mov cl,[x] xor ch,ch add cx,3 mstore1: push cx push dx mov cl,[y] add cx,3 mstore2: push cx call SCursor lodsw mov bl,ah mov ah,09h mov cx,1 int 10h inc [col] pop cx loop mstore2 inc [row] pop dx mov [col],dl pop cx loop mstore1 ret MStore endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- PBox proc near ;AL=SUB,BH=CLR ;---------------------------------------------------------------------------- push ax mov ch,[x1] add ch,al mov dh,ch mov cl,[y1] inc cl mov dl,cl mov al,[y] add dl,al dec dl mov [row],ch mov [col],cl call Box call SCursor mov dx,[text] pop ax dec al mov cl,w_msub+1 mul cl add dx,ax call DispText ret PBox endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- TBox proc near ;---------------------------------------------------------------------------- mov ch,[x1] mov cl,[y1] inc ch inc cl mov [row],ch mov [col],cl mov si,[text] mov cl,[x] xor ch,ch tbox1: push cx call SCursor mov dx,si push si call DispText pop si inc [row] add si,w_msub+1 pop cx loop tbox1 ret TBox endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- MBox proc near ;---------------------------------------------------------------------------- mov ch,[x1] mov cl,[y1] mov dh,ch add dh,[x] inc dh mov dl,cl add dl,[y] inc dl push cx push dx inc ch inc cl inc dh inc dl mov bh,00h call Box pop dx pop cx mov bh,[color] call Box push cx push dx mov [row],ch mov [col],cl call SCursor mov bl,uplf call DispChar mov cl,[y] xor ch,ch mbox1: mov bl,lfrg call DispChar loop mbox1 call GCursor mov bl,uprg call DispChar mov cl,[x] xor ch,ch push cx mbox2: inc [row] call SCursor mov bl,updw call DispChar loop mbox2 pop ax pop dx pop cx push ax mov [row],ch mov [col],cl pop cx mbox3: inc [row] call SCursor mov bl,updw call DispChar loop mbox3 call GCursor inc [row] dec [col] call SCursor mov bl,dwlf call DispChar mov cl,[y] xor ch,ch mbox4: mov bl,lfrg call DispChar loop mbox4 mov bl,dwrg call DispChar ret MBox endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- ReadMenu proc near ;---------------------------------------------------------------------------- mov [x1],1 mov al,[mbar] push ax dec al mov cl,w_msub mul cl mov [y1],al mov si,offset subs pop ax xor ah,ah mov cx,ax xor bl,bl readmenu1: lodsb sub al,digit0 add bl,al loop readmenu1 mov [x],al sub bl,al mov al,bl mov cl,w_msub+1 mul cl mov si,offset menusub add si,ax mov [text],si ret ReadMenu endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- Menu proc near ;---------------------------------------------------------------------------- call DCursor mov bh,pbar_c call Dsp_Bar mov [mbar],1 call ReadPage menu1: call ReadMenu mov [msub],1 mov [osub],1 call MSave call MBox call TBox menu2: mov al,[osub] mov bh,tmnu_c call PBox mov al,[msub] mov bh,pmnu_c call PBox menu3: call GetKey mov al,[msub] mov [osub],al cmp [key],cup jnz menu5 cmp [msub],1 jbe menu4 dec [msub] jmp menu2 menu4: mov al,[x] mov [msub],al jmp menu2 menu5: cmp [key],cdown jnz menu7 mov al,[x] cmp [msub],al jae menu6 inc [msub] jmp menu2 menu6: mov [msub],1 jmp menu2 menu1_1: call MStore jmp menu1 menu3_1: jmp menu3 menu7: cmp [key],cleft jnz menu9 cmp [mbar],1 jbe menu8 dec [mbar] jmp menu1_1 menu8: mov [mbar],c_mbar jmp menu1_1 menu9: cmp [key],cright jnz menu11 cmp [mbar],c_mbar jae menu10 inc [mbar] jmp menu1_1 menu10: mov [mbar],1 jmp menu1_1 menu11: cmp [key],escape jnz menu12 mov [item],0 jmp menux menu12: cmp [key],enter jnz menu3_1 mov al,[mbar] mov cl,10 mul cl add al,[msub] mov [item],al cmp al,15 ;EXIT ITEM jnz menux mov [item],0ffh menux: call MStore mov bh,tbar_c call Dsp_Bar call ECursor ret Menu endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- BtoH proc near ;BL=>BX. ;---------------------------------------------------------------------------- mov ch,bl mov cl,4 shr ch,cl cmp ch,0ah jb btoh1 add ch,hex_au-0ah jmp btoh2 btoh1: add ch,digit0 btoh2: mov bh,ch mov ch,bl mov cl,4 shl ch,cl shr ch,cl cmp ch,0ah jb btoh3 add ch,hex_au-0ah jmp btoh4 btoh3: add ch,digit0 btoh4: mov bl,ch ret BtoH endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- Disp2Hex proc near ;BL=>BH,BL. ;---------------------------------------------------------------------------- call BtoH mov ah,0eh mov al,bh int 10h mov ah,0eh mov al,bl int 10h ret Disp2Hex endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- Disp4Hex proc near ;BX. ;---------------------------------------------------------------------------- push bx mov bl,bh call Disp2Hex pop bx call Disp2Hex ret Disp4Hex endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- DispChar proc near ;BL. ;---------------------------------------------------------------------------- cmp bl,20h jae dispchar1 mov bl,2eh dispchar1: mov ah,0eh mov al,bl int 10h ret DispChar endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- DispText proc near ;Equal Int 21H ;---------------------------------------------------------------------------- mov si,dx disptext1: lodsb cmp al,24h jz disptextx mov ah,0eh int 10h jmp disptext1 disptextx: ret DispText endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- DispAddress proc near ;DH. ;---------------------------------------------------------------------------- mov bx,es call Disp4Hex mov ax,0e3ah int 10h ; Display ':' mov bx,[cbuf] call Disp4Hex mov [col],d_hex+23 call SCursor mov ax,0e2dh int 10h ; Display '-' ret DispAddress endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- DispLine proc near ;---------------------------------------------------------------------------- mov [col],d_col call SCursor call DispAddress mov cx,16 xor di,di displine1: push cx mov si,offset cbuf mov bx,[si] mov bl,[bx] mov dx,[si] inc dx mov [si],dx push bx Add_Col ;MACRO pop bx push bx call Disp2Hex mov ax,di mov dl,al add dl,d_text ;DispText=>Col mov [col],dl call SCursor pop bx call DispChar pop cx inc di loop displine1 inc [row] ret DispLine endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- DiskPara proc near ;---------------------------------------------------------------------------- mov [row],d_row mov [col],d_head+3 call SCursor mov bl,[xhead] call Disp2Hex ;XHead mov [col],d_sect+3 call SCursor mov bl,[xsect] call Disp2Hex ;XSector mov [col],d_drive call SCursor mov bl,[drive] call Disp2Hex ;Drive mov [col],d_cyls call SCursor mov bx,[cyls] call Disp4Hex ;Cylinder mov [col],d_head call SCursor mov bl,[head] call Disp2Hex ;Head mov [col],d_sect call SCursor mov bl,[sect] call Disp2Hex ;Sector mov [col],d_lsect+3 call SCursor mov bl,[xlsect] call Disp2Hex ;Logical XSector mov [col],d_ldrive call SCursor mov bl,[ldrive] add bl,hex_au call DispChar ;Logical Drive mov [col],d_lclust call SCursor mov bx,[lclust] call Disp4Hex ;Logical Clust mov [col],d_lsect call SCursor mov bl,[lsect] call Disp2Hex ;Logical Sector cmp [pages],UP jz diskpara1 mov [col],d_up call SCursor mov ax,0e19h int 10h jmp diskparax diskpara1: mov [col],d_up call SCursor mov ax,0e18h int 10h diskparax: mov [col],d_up call SCursor ret DiskPara endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- DispPage proc near ;---------------------------------------------------------------------------- call DCursor mov [row],d_row+1 mov [col],d_col call SCursor mov cx,16 disppage1: push cx call DispLine pop cx loop disppage1 call DiskPara call ECursor ret DispPage endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- GetKey proc near ;---------------------------------------------------------------------------- xor ah,ah int 16h mov [key],ax ret GetKey endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- GetHex proc near ;---------------------------------------------------------------------------- gethex1: call GetKey mov bx,[key] cmp bl,digit0 jb gethex1 cmp bl,digit9 ja gethex2 call DispChar sub bl,digit0 mov [hex],bl jmp gethexx gethex2: cmp bl,hex_au jb gethex1 cmp bl,hex_fu ja gethex3 call DispChar sub bl,hex_au-0ah mov [hex],bl jmp gethexx gethex3: cmp bl,hex_ad jb gethex1 cmp bl,hex_fd ja gethex1 call DispChar sub bl,hex_ad-0ah mov [hex],bl gethexx: ret GetHex endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- Get2Hex proc near ;---------------------------------------------------------------------------- call BCursor call SCursor call GetHex mov bh,[hex] push bx call GetHex pop bx mov bl,[hex] mov cl,4 shl bh,cl add bl,bh mov [hex],bl call SCursor call Disp2Hex call ECursor ret Get2Hex endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- Get4Hex proc near ;=>AX ;---------------------------------------------------------------------------- call Get2Hex mov ah,[hex] push ax add [col],2 call Get2Hex pop ax mov al,[hex] ret Get4Hex endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- GetDisk proc near ;---------------------------------------------------------------------------- call BCursor getdisk1: mov [row],d_row mov [col],d_ldrive call SCursor call GetKey mov bx,[key] cmp bl,hex_au+2 jb getdisk1 mov bh,[dlast] add bh,hex_au+2 cmp bl,bh jae getdisk2 call DispChar sub bl,hex_au mov [ldrive],bl jmp getdiskx getdisk2: cmp bl,hex_ad+2 jb getdisk1 mov bh,[dlast] add bh,hex_ad+2 cmp bl,bh jae getdisk1 call DispChar sub bl,hex_ad mov [ldrive],bl getdiskx: call ECursor ret GetDisk endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- GetSect proc near ;---------------------------------------------------------------------------- getsect1: mov [row],d_row mov [col],d_cyls call Get4Hex ;Input Cylinder cmp ax,[xcyls] ja getsect1 mov [cyls],ax getsect2: mov [row],d_row mov [col],d_head call Get2Hex ;Input Head mov al,[hex] cmp al,[xhead] ja getsect2 mov [head],al getsect3: mov [row],d_row mov [col],d_sect call Get2Hex ;Input Sector mov al,[hex] cmp al,1 jb getsect3 cmp al,[xsect] ja getsect3 mov [sect],al call PtoL call Read ret GetSect endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- GetLSect proc near ;---------------------------------------------------------------------------- getlsect1: mov [row],d_row mov [col],d_lclust call Get4Hex cmp ax,[xlclust] ja getlsect1 mov [lclust],ax getlsect2: mov [row],d_row mov [col],d_lsect call Get2Hex mov al,[hex] cmp al,[xlsect] ja getlsect2 mov [lsect],al call CtoS call LRead ret GetLSect endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- GetData proc near ;---------------------------------------------------------------------------- call ReadPage xor si,si mov di,si getdata1: Add_Row Add_Col ;MACRO ;MACRO call GetKey cmp [key],cleft jnz getdata2 cmp di,0 jz getdata1 dec di jmp getdata1 getdata2: cmp [key],cright jnz getdata3 cmp di,0fh jz getdata1 inc di jmp getdata1 getdata3: cmp [key],cup jnz getdata4 cmp si,0 jz getdata1 dec si jmp getdata1 getdata4: cmp [key],cdown jnz getdata5 cmp si,0fh jz getdata1 inc si getdata1_1: jmp getdata1 getdata5: cmp [key],enter jnz getdata6 call Get2Hex mov ax,si mov cl,4 shl ax,cl add ax,di push si mov si,[cbuf] add si,ax mov al,[hex] mov [si],al pop si getdata6: cmp [key],escape jnz getdata1_1 getdatax: ret GetData endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- Display proc near ;---------------------------------------------------------------------------- display1: call DispPage display1_1: call GetKey mov ax,[key] cmp ax,escape ;ESC jnz display2 call Menu mov al,[item] cmp al,0 jz display1 cmp al,0ffh jz displayx_1 call Run jmp display1 display2: cmp ax,pageup ;PageUP jnz display4 ;NotPageUP cmp [pages],UP jz display3 ;AT UP display2_1: call ResetUp jmp display1 display3: call dSect call Read display3_1: call ResetDw jmp display1 display4: cmp ax,pagedw ;PageDOWN jnz display6 ;NotPageDOWN cmp [pages],UP jnz display5 ;AT DOWN display4_1: not [pages] jmp display1 display5: call iSect display5_1: call Read jmp display1 display6: cmp ax,c_pgup ;Ctrl-PgUp jnz display7 call dCyls jmp display5_1 display7: cmp ax,c_pgdw ;Ctrl-PgDw jnz display8 call iCyls jmp display5_1 display8: cmp ax,home ;Home jnz display9 call dHead jmp display5_1 display9: cmp ax,ende ;End jnz display10 call iHead jmp display5_1 displayx_1: jmp displayx display1_2: jmp display1_1 display10: cmp ax,cup ;UP jnz display12 cmp [pages],UP jz display11 jmp display2_1 display11: call dLSect call LRead jmp display3_1 display12: cmp ax,cdown ;DOWN jnz display14 cmp [pages],UP jnz display13 jmp display4_1 display13: call iLSect display13_1: call LRead jmp display1 display14: cmp ax,cleft ;LEFT jnz display15 call dLClust jmp display13_1 display15: cmp ax,cright ;RIGHT jnz display1_2 call iLClust jmp display13_1 displayx: ret Display endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- Waiting proc near ;---------------------------------------------------------------------------- mov [x1],8 mov [y1],20 mov [x],3 mov [y],30 call MSave call MBox mov [row],10 mov [col],25 call SCursor mov dx,offset err_m4 call DispText ret Waiting endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- Waiterr proc near ;---------------------------------------------------------------------------- mov [row],10 mov [col],25 call SCursor mov dx,offset err_m5 call DispText call GetKey call Waitend ret Waiterr endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- Waitend proc near ;---------------------------------------------------------------------------- call Mstore mov [y],w_msub ret Waitend endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- SaveDisk proc near ;---------------------------------------------------------------------------- call Waiting mov di,[buffer] push di push di mov cx,200h xor al,al rep stosb xor ah,ah mov al,[xsect] mov cl,6 shl ax,cl mov cx,ax push [xcyls] pop [cyls] mov [head],0 mov [sect],1 savedisk0: push cx call Write call iSect pop cx loop savedisk0 pop di mov si,offset status mov cx,79 rep movsb mov al,20h stosb pop di add di,100h mov si,offset dlast mov al,[si] mov cl,ldisk_w mul cl add ax,5 push ax pop cx rep movsb push [xcyls] pop [cyls] push [cyls] mov [head],0 mov [sect],1 call Write mov [cyls],0 call Read pop [cyls] mov [sect],2 call Write mov [ldrive],2 xor ch,ch mov cl,[dlast] xor dh,dh mov dl,[xsect] shl dx,1 shl dx,1 shl dx,1 savedisk1: push cx push dx push dx call PopDisk pop cx mov bh,[ldrive] dec bh dec bh shl bh,1 shl bh,1 shl bh,1 inc bh mov bl,1 push bx mov ah,[nhead] mov al,[nsect] push ax savedisk2: pop ax pop bx push cx push bx mov [head],ah mov [sect],al push [ncyls] pop [cyls] call Read call iSect mov ah,[head] mov al,[sect] pop bx push ax mov [head],bh mov [sect],bl push [xcyls] pop [cyls] call Write call iSect mov bh,[head] mov bl,[sect] pop ax pop cx push bx push ax loop savedisk2 inc [ldrive] pop cx pop cx pop dx pop cx loop savedisk1 mov [ldrive],2 call PopDisk call Waitend ret SaveDisk endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- LoadDisk proc near ;---------------------------------------------------------------------------- call Waiting mov si,[buffer] push si push si push [xcyls] pop [cyls] mov [head],0 mov [sect],1 call Read pop si mov di,offset status mov cx,79 rep cmpsb jz loaddisk0 call Waiterr pop si ret loaddisk0: pop si add si,100h mov di,offset dlast movsb mov al,[di-1] mov cl,ldisk_w mul cl add ax,4 push ax pop cx rep movsb push [xcyls] pop [cyls] mov [sect],2 call Read mov [cyls],0 mov [sect],1 call Write mov [ldrive],2 xor ch,ch mov cl,[dlast] xor dh,dh mov dl,[xsect] shl dx,1 shl dx,1 shl dx,1 loaddisk1: push cx push dx push dx call PopDisk pop cx mov ah,[nhead] mov al,[nsect] push ax mov bh,[ldrive] dec bh dec bh shl bh,1 shl bh,1 shl bh,1 inc bh mov bl,1 push bx loaddisk2: pop bx pop ax push cx push ax mov [head],bh mov [sect],bl push [xcyls] pop [cyls] call Read call iSect mov bh,[head] mov bl,[sect] pop ax push bx mov [head],ah mov [sect],al push [ncyls] pop [cyls] call Write call iSect mov ah,[head] mov al,[sect] pop bx pop cx push ax push bx loop loaddisk2 inc [ldrive] pop cx pop cx pop dx pop cx loop loaddisk1 mov [ldrive],2 call PopDisk call Waitend ret LoadDisk endp ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- Run proc near ;---------------------------------------------------------------------------- mov al,[item] run11: cmp al,11 jnz run12 call SaveDisk jmp runx run12: cmp al,12 jnz run21 call LoadDisk jmp runx run21: cmp al,21 jnz run22 mov [cyls],0 run21_1: mov [head],0 mov [sect],1 call Read jmp runx run22: cmp al,22 jnz run23 push [xcyls] pop [cyls] jmp run21_1 run23: cmp al,23 jnz run24 mov [ls_l],0 run23_1: mov [ls_h],0 call StoC call LRead jmp runx run24: cmp al,24 jnz run25 mov [ls_l],1 jmp run23_1 run25: cmp al,25 jnz run26 push [fat] pop [ls_l] jmp run23_1 run26: cmp al,26 jnz run27 push [root] pop [ls_l] jmp run23_1 run27: cmp al,27 jnz run28 push [d1st] pop [ls_l] jmp run23_1 run28: cmp al,28 jnz run29 call GetSect jmp runx run29: cmp al,29 jnz run31 call GetLSect jmp runx run31: cmp al,31 jnz run32 call GetData jmp runx run32: cmp al,32 jnz run51 call Write jmp runx run51: cmp al,51 jnz run52 mov [ldrive],0 mov [drive],0 run51_1: mov [ncyls],0 mov [nhead],0 mov [nsect],1 mov [ls_l],0 call XDisk cmp ax,0 jnz run51_2 call LDisk jmp run23_1 run51_2: call Invalid jmp run53_2 run52: cmp al,52 jnz run53 mov [ldrive],1 mov [drive],1 jmp run51_1 run53: cmp al,53 jnz run54 run53_2: mov [ldrive],2 run53_1: mov [drive],80h call PopDisk jmp runx run54: cmp al,54 jnz run61 call GetDisk jmp run53_1 run61: cmp al,61 jnz run62 mov [Extra_Cylinder],1 run61_1: call Disk jmp runx run62: cmp al,62 jnz runx mov [Extra_Cylinder],2 jmp run61_1 runx: ret Run endp ;---------------------------------------------------------------------------- ; CLAST DB 0 ;---------------------------------------------------------------------------- Code ends ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- ;CODE Segment End... ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- ;DATA Segment Starting... ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- Data segment para public ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- ;Parameter Starting... ;---------------------------------------------------------------------------- buffer dw A_BUF cbuf dw A_BUF Extra_Cylinder db 1 sectors db 1 drive db 80h cyls dw 0 head db 0 sect db 1 xcyls dw 0 xhead db 0 xsect db 1 ncyls dw 0 nhead db 0 nsect db 1 ldrive db 2 lclust dw 0 lsect db 0 xlclust dw 0 xlsect db 1 ls_h dw 0 ls_l dw 0 xls_h dw 0 xls_l dw 1 fat dw 0 root dw 0 d1st dw 0 row db 0 col db 0 x1 db 0 y1 db 0 x db 0 y db w_msub mbar db 1 msub db 1 osub db 1 text dw 0 color db tmnu_c item db 0 mbuf dw A_BUF+0200h key dw 0 hex db 0 pages db 0 ;Parameter End... ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- ;Text Starting... ;---------------------------------------------------------------------------- status db ' ?DISK v1.0 Copyright (c) Zhang ' db 'Weidong, 1999-2000 NO:1999-0701$' titles db '碵 ] C:[ ] H:[ - ] S:[ - ]' db ' LD:[ ] LC:[ ] LS:[ - ] [ ]?' version db 'DISK v1.0',9,'Copyright(c) Zhang Weidong, ' db '1999-2000, All rights reserved.$' error_m db 'Error:',9,9,'HARD DISK NOT Found.$' err_m1 db 'WARNING!$' err_m2 db 'Drive C Not Found or Boot Record Error.$' err_m3 db 'Press any key to continue...$' err_m4 db 'Please Waiting......$' err_m5 db "Disk wasn't Saved...$" menubar db 'File View Edit Search ' db 'Drive Option Help$' subs db '5924421' menusub db 'Save Disk $' db 'Load Disk $' db 'Save CMOS $' db 'Load CMOS $' db 'Exit $' db 'MBR $' db 'Reserve $' db 'Boot $' db 'Fat 1st $' db 'Fat Copy $' db 'Root $' db 'Data Start$' db 'Sector $' db 'LSector $' db 'Edit $' db 'Save $' db 'DIR $' db 'FileName $' db 'String $' db 'Next $' db 'A: $' db 'B: $' db 'C: $' db 'Other Wise$' db 'Extra: 1C $' db 'Extra: 2C $' db 'How About $' dlast db 0 ;Text End... ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- Data ends ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- ;DATA Segment End... ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- END START ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- ;------------------------- Program is End ... ------------------------------- ;----------------------------------------------------------------------------