aboutsummaryrefslogtreecommitdiffstats
path: root/dos
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@zytor.com>2010-02-15 15:19:54 -0800
committerH. Peter Anvin <hpa@zytor.com>2010-02-15 15:20:56 -0800
commitcece96bdd71da5ad1492c2d96485320f78ba8a83 (patch)
treed0daf3a0a07e0160fb1914c9fda0ad02830552d6 /dos
parentb82686b524d2ee4441ce411fa6db3a210edbaa34 (diff)
downloadsyslinux-devel-cece96bdd71da5ad1492c2d96485320f78ba8a83.tar.gz
syslinux-devel-cece96bdd71da5ad1492c2d96485320f78ba8a83.tar.xz
syslinux-devel-cece96bdd71da5ad1492c2d96485320f78ba8a83.zip
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 <hpa@zytor.com>
Diffstat (limited to 'dos')
-rw-r--r--dos/Makefile2
-rw-r--r--dos/copybs.asm271
2 files changed, 1 insertions, 272 deletions
diff --git a/dos/Makefile b/dos/Makefile
index 9d8ce33c..eb0ca1a6 100644
--- a/dos/Makefile
+++ b/dos/Makefile
@@ -36,7 +36,7 @@ LIBOBJS = int2526.o conio.o memcpy.o memset.o skipatou.o atou.o \
VPATH = .:../libfat:../libinstaller
-TARGETS = syslinux.com copybs.com
+TARGETS = syslinux.com
all: $(TARGETS)
diff --git a/dos/copybs.asm b/dos/copybs.asm
deleted file mode 100644
index 26407148..00000000
--- a/dos/copybs.asm
+++ /dev/null
@@ -1,271 +0,0 @@
-; -*- 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 <drive>: <file>
-;
-
- 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 <drive>: <filename>', 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