page ,132 title BootThru - v1.05 ;------------------------------------------------------------------------ ; ; BootThru - Copyright (c) Bill Gibson - 1987 ; Lathrup Village, Mi 48076 ; ; Ver. 1.00 - Initial version (not rlsd) - 01/11/87 ; 1.01 - revised code structure " - 01/25/87 ; 1.02 - revised Modify Proc " - 02/01/87 ; 1.03 - enhanced error message output " - 02/06/87 ; 1.04 - revised Print Proc released - 02/07/87 ; 1.05 - fix incompatibility plbm - 02/09/87 ; ; ; For Public Domain Use. Not for Sale or Hire. ;------------------------------------------------------------------------ COMMENT * Routine to modify diskette boot record, using drive A: or B:, thus circumventing DOS' non-system disk display error. Usage: BT A: -> transfer new boot record to drive A: BT B: -> transfer new boot record to drive B: BT -> starts program, default is drive A: * ;------------------------------------------------------------------------ code SEGMENT BYTE PUBLIC 'code' ASSUME CS:code,DS:code,SS:code ORG 5Ch ;drive id param1 LABEL BYTE ORG 5Dh ;elim spurrious characters param2 LABEL BYTE ORG 100h BootThru PROC FAR MOV CS:stk_ptr,SP ;save stack ptr to ensure ret CALL Chk_Ver ;dos 2.0 or greater CALL Scan CALL Dwrite JMP SHORT exit error: MOV SP,stk_ptr ;insure proper return CALL Print ;print error messages MOV AL,1 ;set errorlevel to 1 exit: MOV AH,4Ch INT 21h ;------------------------------------------------------------------------ ; Work Area - constants,equates,messages ;------------------------------------------------------------------------ drive DB 0 stk_ptr DW 0 blank EQU 020h ;ascii space code cr EQU 0Dh ;carriage return lf EQU 0Ah ;line feed esc EQU 01Bh ;escape char stopper EQU 255 ;end of display line indicator logo DB cr,lf,'BootThru - The Diskette Modifier' DB cr,lf,'Version 1.05 - Bill Gibson 1987',cr,lf,stopper usage DB cr,lf,'Usage: BT [drive A: or B:]',cr,lf,stopper sorry DB cr,lf,'Wrong PC DOS Version',cr,lf,stopper msg1 DB cr,lf,'Insert diskette in drive A, and press ENTER' DB ' when ready ...',stopper msg2 DB cr,lf,'Insert diskette in drive B, and press ENTER' DB ' when ready ...',stopper msg3 DB cr,lf,'Press ENTER to modify another disk',cr,lf DB 'or ESCape to quit...',stopper msg4 DB cr,lf,cr,lf,'Transferring New Boot Sector',cr,lf,stopper msg5 DB cr,lf,'Transfer Completed',cr,lf,stopper msg80h DB cr,lf,cr,lf,'* Error * Drive failed to respond.',cr,lf,cr,lf,stopper msg40h DB cr,lf,cr,lf,'* Error * Seek operation failed.',cr,lf,cr,lf,stopper msg20h DB cr,lf,cr,lf,'* Error * Controller failure.',cr,lf,cr,lf,stopper msg10h DB cr,lf,cr,lf,'* Error * Bad CRC on diskette write.',cr,lf,cr,lf,stopper msg08h DB cr,lf,cr,lf,'* Error * DMA overrun on operation.',cr,lf,cr,lf,stopper msg04h DB cr,lf,cr,lf,'* Error * Requested sector not found.',cr,lf,cr,lf,stopper msg03h DB cr,lf,cr,lf,'* Error * Write protected diskette.',cr,lf,cr,lf,stopper msg02h DB cr,lf,cr,lf,'* Error * Address mark not found.',cr,lf,cr,lf,stopper msggen DB cr,lf,cr,lf,'* Unknown Error *',cr,lf,cr,lf,stopper ;-------------------------------------------------------------------------- ; Sub-Routines: ;-------------------------------------------------------------------------- Chk_Ver PROC NEAR MOV AH,30h ;verify DOS 2.0 or later INT 21h CMP AL,2 JAE SHORT chk_ok MOV DX,OFFSET sorry JMP error chk_ok: RET Chk_Ver ENDP ;-------------- Scan PROC NEAR ;check for any spurrious chars MOV AL,[param2] CMP AL,blank ;anything ? JNZ shlp ;yes, give error msg s1: MOV AL,[param1] ;check for drive parameters OR AL,AL ;anything ? JNZ s2 ;jump and test MOV DX,OFFSET logo ;setup default drive A: CALL Print MOV drive,0 MOV DX,OFFSET msg1 RET s2: CMP AL,01 ;setup for drive A: JZ SHORT sdrvA CMP AL,02 ;for drive B: JZ SHORT sdrvB shlp: MOV DX,OFFSET usage ;display for invalid drives JMP error sdrvA: MOV DX,OFFSET logo CALL Print MOV drive,0 MOV DX,OFFSET msg1 RET sdrvB: MOV DX,OFFSET logo CALL Print MOV drive,1 MOV DX,OFFSET msg2 RET Scan ENDP ;-------------- Dwrite PROC NEAR ;transfer new disk boot sector CALL Print ;get ready d1: MOV AH,8 ;use function 8 in order to detect INT 21h ;ctrl-breaks CMP AL,esc ;ESC & Ctrl-Break aborts process JZ d5 CMP AL,cr JNZ d1 d2: MOV DX,OFFSET msg4 ;setup for disk write CALL Print MOV AL,drive LEA BX,head MOV CX,0001 MOV DX,0000 drite: ;more setups PUSH AX PUSH BX PUSH CX PUSH DX INT 26h JC derror ;processing error ? POPF ;done POP DX POP CX POP BX POP AX d3: MOV DX,OFFSET msg5 ;transfer complete CALL Print JMP d4 derror: ;display disk errror CALL ErrorList dend_of: CALL Print POPF ;done POP DX POP CX POP BX POP AX d4: MOV DX,OFFSET msg3 ;another ? CALL Print JMP d1 ;loop d5: RET Dwrite ENDP ;-------------- Print PROC NEAR ;a Great idea from Vern Buerg ! PUSH SI PUSH BX PUSH CX MOV SI,DX ;DX has the offset to string SUB CX,CX ;set to zero for count p1: LODSB CMP AL,stopper ;string ends in FFh JE p9 INC CX ;increment text length JMP p1 p9: MOV AH,40h ;write using file handles MOV BX,1 INT 21h POP CX POP BX ;recover registers POP SI RET Print ENDP ;-------------- ErrorList PROC NEAR ;error code interpretation ;the upper byte (AH) contains error err80h: CMP AH,080h ;attachment failed to respond JNZ err40h MOV DX,OFFSET msg80h RET err40h: CMP AH,040h ;seek operation failed JNZ err20h MOV DX,OFFSET msg40h RET err20h: CMP AH,020h ;controller failed JNZ err10h MOV DX,OFFSET msg20h RET err10h: CMP AH,010h ;data error (bad CRC) JNZ err08h MOV DX,OFFSET msg10h RET err08h: CMP AH,08h ;direct memory access failure JNZ err04h MOV DX,OFFSET msg08h RET err04h: CMP AH,04h ;requested sector not found JNZ err03h MOV DX,OFFSET msg04h RET err03h: CMP AH,03h ;write-protect fault JNZ err02h MOV DX,OFFSET msg03h RET err02h: CMP AH,02h ;bad address mark JNZ errgen MOV DX,OFFSET msg02h RET errgen: MOV DX,OFFSET msggen ;something new ? (Unknown) RET ErrorList ENDP ;-------------- Modify PROC FAR head: cr EQU 0Dh ;carriage return lf EQU 0Ah ;line feed stopper EQU 255 ;end of display line indicator boot_area EQU 0000h ;setup boot area bogus_drv EQU 0080h ;setup bogus drive loc2 EQU 01FEh ;last two bytes of boot sector eof_bootsec EQU 0AA55h ;end of boot sector (reversed) bulc EQU 0DAh ;box upper left corner burc EQU 0BFh ;box upper right corner bllc EQU 0C0h ;box lower left corner blrc EQU 0D9h ;box lower right corner bver EQU 0B3h ;vertical bhor EQU 0C4h ;horizontal JMP start ;1st byte of the sector must be a jmp DB 'BootThru' ;8-byte system id DW 512 ;sector size in bytes DB 2 ;sectors per cluster DW 1 ;reserved clusters DB 2 ;number of fats DW 112 ;root directory entries DW 720 ;total sectors DB 0FDh ;format id (2 sided, 9 sector) DW 2 ;sectors per fat DW 9 ;sectors per track DW 2 ;sides DW 0 ;special hidden sectors DB 0 ;filler DB 0 ;head DB 0Ah ;length of BIOS file DB 0DFh ;disk parameter table DB 02 ; " DB 25h ; " DB 02 ; " DB 09 ; " DB 02Ah ;Int 1Eh points to this table, DB 0FFh ;the disk parameter table. DB 050h ;contents of this vector (1Eh) DB 0F6h ;are used as a pointer only, DB 0Fh ;Int 1Eh is not executed DB 02 ;directly intro_beg: DB cr,lf, DB cr,lf,bulc,46 DUP(bhor),burc DB cr,lf,bver,' This disk was modified by BootThru ',bver DB cr,lf,bver,' Version 1.05 by Bill Gibson 1987 ',bver DB cr,lf,bllc,46 DUP(bhor),blrc DB cr,lf,stopper intro_offset EQU intro_beg - head start: MOV AX,07C0h ;boot record location MOV ES,AX MOV DS,AX MOV SI,intro_offset strt1: MOV AH,0Eh ;write teletype MOV AL,[SI] CMP AL,stopper JE SHORT strt2 PUSH SI INT 10h POP SI INC SI JMP SHORT strt1 strt2: CLD ;setup to bypass drive A: MOV SI,OFFSET strt3 - OFFSET head MOV DI,0200h ;boot sector size MOV CX,0200h REPZ MOVSB JMP head + 200h strt3: MOV AH,2 ;function 02h - read floppy disk MOV BX,boot_area ;boot area MOV CH,0 ;track number MOV CL,1 ;sector MOV DH,0 ;head MOV DL,bogus_drv ;bogus drive MOV AL,1 ;number of sectors INT 13h strt4: MOV BX,loc2 ;setup to pull ROM Basic in MOV AX,[BX] ;if an error occurs CMP AX,eof_bootsec JNZ strt9 JMP strt3 - 200h strt9: INT 18h DB 'BootThru, Copyright (c) Bill Gibson, 02.09.87' tail: filler_amount EQU 512 - (tail - head) - 2 DB filler_amount dup (0) ; filler boot_id DB 055h,0AAh ; boot id Modify ENDP BootThru ENDP code ENDS END BootThru