From cece96bdd71da5ad1492c2d96485320f78ba8a83 Mon Sep 17 00:00:00 2001 From: "H. Peter Anvin" Date: Mon, 15 Feb 2010 15:19:54 -0800 Subject: dosutil: move copybs here, update Makefile Move copybs to dosutil, change the Makefile to deal with UPX being able to compress (e.g. very small files.) Signed-off-by: H. Peter Anvin --- dosutil/Makefile | 10 +- dosutil/copybs.asm | 271 +++++++++++++++++++++++++++++++++++++++++++++++++++ dosutil/mdiskchk.com | Bin 3 files changed, 279 insertions(+), 2 deletions(-) create mode 100644 dosutil/copybs.asm mode change 100755 => 100644 dosutil/mdiskchk.com (limited to 'dosutil') diff --git a/dosutil/Makefile b/dosutil/Makefile index 2a105731..fc10ff90 100644 --- a/dosutil/Makefile +++ b/dosutil/Makefile @@ -13,7 +13,7 @@ NASM = nasm NASMOPT = -O9999 WCTARGETS = mdiskchk.com -NSTARGETS = eltorito.sys +NSTARGETS = eltorito.sys copybs.com TARGETS = $(WCTARGETS) $(NSTARGETS) %.obj: %.c @@ -24,23 +24,29 @@ TARGETS = $(WCTARGETS) $(NSTARGETS) $(UPX) --ultra-brute --lzma $@ || \ $(UPX) --ultra-brute $@ || \ true + rm -f $*.0* + chmod a-x $@ %.sys: %.asm $(NASM) $(NASMOPT) -f bin -o $@ -l $*.lst $< $(UPX) --ultra-brute --lzma $@ || \ $(UPX) --ultra-brute $@ || \ true + rm -f $*.0* + chmod a-x $@ %.com: %.asm $(NASM) $(NASMOPT) -f bin -o $@ -l $*.lst $< $(UPX) --ultra-brute --lzma $@ || \ $(UPX) --ultra-brute $@ || \ true + rm -f $*.0* + chmod a-x $@ all: $(TARGETS) tidy dist: - -rm -f *.obj *.lst *.o + -rm -f *.obj *.lst *.o *.0* clean: tidy diff --git a/dosutil/copybs.asm b/dosutil/copybs.asm new file mode 100644 index 00000000..26407148 --- /dev/null +++ b/dosutil/copybs.asm @@ -0,0 +1,271 @@ +; -*- fundamental -*- (asm-mode sucks) +; ----------------------------------------------------------------------- +; +; Copyright 1998-2008 H. Peter Anvin - All Rights Reserved +; +; This program is free software; you can redistribute it and/or modify +; it under the terms of the GNU General Public License as published by +; the Free Software Foundation, Inc., 53 Temple Place Ste 330, +; Boston MA 02111-1307, USA; either version 2 of the License, or +; (at your option) any later version; incorporated herein by reference. +; +; ----------------------------------------------------------------------- + +; +; copybs.asm +; +; Small DOS program to copy the boot sector from a drive +; to a file +; +; Usage: copybs : +; + + absolute 0 +pspInt20: resw 1 +pspNextParagraph: resw 1 + resb 1 ; reserved +pspDispatcher: resb 5 +pspTerminateVector: resd 1 +pspControlCVector: resd 1 +pspCritErrorVector: resd 1 + resw 11 ; reserved +pspEnvironment: resw 1 + resw 23 ; reserved +pspFCB_1: resb 16 +pspFCB_2: resb 16 + resd 1 ; reserved +pspCommandLen: resb 1 +pspCommandArg: resb 127 + + section .text + org 100h ; .COM format +_start: + mov ax,3000h ; Get DOS version + int 21h + xchg al,ah + mov [DOSVersion],ax + cmp ax,0200h ; DOS 2.00 minimum + jae dosver_ok + mov dx,msg_ancient_err + jmp die + + section .bss + alignb 2 +DOSVersion: resw 1 + + section .text +; +; Scan command line for a drive letter followed by a colon +; +dosver_ok: + xor cx,cx + mov si,pspCommandArg + mov cl,[pspCommandLen] + +cmdscan1: jcxz bad_usage ; End of command line? + lodsb ; Load character + dec cx + cmp al,' ' ; White space + jbe cmdscan1 + or al,020h ; -> lower case + cmp al,'a' ; Check for letter + jb bad_usage + cmp al,'z' + ja bad_usage + sub al,'a' ; Convert to zero-based index + mov [DriveNo],al ; Save away drive index + + section .bss +DriveNo: resb 1 + + section .text +; +; Got the leading letter, now the next character must be a colon +; +got_letter: jcxz bad_usage + lodsb + dec cx + cmp al,':' + jne bad_usage +; +; Got the colon; now we should have at least one whitespace +; followed by a filename +; +got_colon: jcxz bad_usage + lodsb + dec cx + cmp al,' ' + ja bad_usage + +skipspace: jcxz bad_usage + lodsb + dec cx + cmp al,' ' + jbe skipspace + + mov di,FileName +copyfile: stosb + jcxz got_cmdline + lodsb + dec cx + cmp al,' ' + ja copyfile + jmp short got_cmdline + +; +; We end up here if the command line doesn't parse +; +bad_usage: mov dx,msg_unfair + jmp die + + section .data +msg_unfair: db 'Usage: copybs : ', 0Dh, 0Ah, '$' + + section .bss + alignb 4 +FileName resb 256 + +; +; Parsed the command line OK. Get device parameter block to get the +; sector size. +; + struc DPB +dpbDrive: resb 1 +dpbUnit: resb 1 +dpbSectorSize: resw 1 +dpbClusterMask: resb 1 +dpbClusterShift: resb 1 +dpbFirstFAT: resw 1 +dpbFATCount: resb 1 +dpbRootEntries: resw 1 +dpbFirstSector: resw 1 +dpbMaxCluster: resw 1 +dpbFATSize: resw 1 +dpbDirSector: resw 1 +dpbDriverAddr: resd 1 +dpbMedia: resb 1 +dpbFirstAccess: resb 1 +dpbNextDPB: resd 1 +dpbNextFree: resw 1 +dpbFreeCnt: resw 1 + endstruc + + section .bss + alignb 2 +SectorSize resw 1 + + section .text +got_cmdline: + xor al,al ; Zero-terminate filename + stosb + + mov dl,[DriveNo] + inc dl ; 1-based + mov ah,32h + int 21h ; Get Drive Parameter Block + + and al,al + jnz filesystem_error + + mov dx,[bx+dpbSectorSize] ; Save sector size +; +; Read the boot sector. +; + section .data + align 4, db 0 +DISKIO equ $ +diStartSector: dd 0 ; Absolute sector 0 +diSectors: dw 1 ; One sector +diBuffer: dw SectorBuffer ; Buffer offset + dw 0 ; Buffer segment + + section .text +read_bootsect: + mov ax,cs ; Set DS <- CS + mov ds,ax + + mov [SectorSize],dx ; Saved sector size from above + + cmp word [DOSVersion],0400h ; DOS 4.00 has a new interface + jae .new +.old: + mov bx,SectorBuffer + mov cx,1 ; One sector + jmp short .common +.new: + mov [diBuffer+2],ax ; == DS + mov bx,DISKIO + mov cx,-1 +.common: + xor dx,dx ; Absolute sector 0 + mov al,[DriveNo] + int 25h ; DOS absolute disk read + pop ax ; Remove flags from stack + jc disk_read_error + +; +; Open the file and write the boot sector to the file. +; + mov dx,FileName + mov cx,0020h ; Attribute = ARCHIVE + mov ah,3Ch ; Create file + int 21h + jc file_write_error + + mov bx,ax + push ax ; Handle + + mov cx,[SectorSize] + mov dx,SectorBuffer + mov ah,40h ; Write file + int 21h + jc file_write_error + cmp ax,[SectorSize] + jne file_write_error + + pop bx ; Handle + mov ah,3Eh ; Close file + int 21h + jc file_write_error +; +; We're done! +; + mov ax,4C00h ; exit(0) + int 21h + +; +; Error routine jump +; +filesystem_error: + mov dx,msg_filesystem_err + jmp short die +disk_read_error: + mov dx,msg_read_err + jmp short die +file_write_error: + mov dx,msg_write_err +die: + push cs + pop ds + push dx + mov dx,msg_error + mov ah,09h + int 21h + pop dx + + mov ah,09h ; Write string + int 21h + + mov ax,4C01h ; Exit error status + int 21h + + section .data +msg_error: db 'ERROR: $' +msg_ancient_err: db 'DOS version 2.00 or later required', 0Dh, 0Ah, '$' +msg_filesystem_err: db 'Filesystem not found on disk', 0Dh, 0Ah, '$' +msg_read_err: db 'Boot sector read failed', 0Dh, 0Ah, '$' +msg_write_err: db 'File write failed', 0Dh, 0Ah, '$' + + section .bss + alignb 4 +SectorBuffer: resb 4096 diff --git a/dosutil/mdiskchk.com b/dosutil/mdiskchk.com old mode 100755 new mode 100644 -- cgit v1.2.1