176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;----------------------------------------------------------------------------- 376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; ElTorito.asm 476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; 576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; El Torito Bootable CD-ROM driver which does not reset the CD-ROM drive upon 676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; loading, but instead accesses the drive through BIOS system calls 776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; 876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; MIT License 976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; 1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; (c) 2000 by Gary Tong 1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; (c) 2001-2009 by Bart Lagerweij 1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; 1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Permission is hereby granted, free of charge, to any person obtaining a copy 1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; of this software and associated documentation files (the "Software"), to deal 1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; in the Software without restriction, including without limitation the rights 1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; copies of the Software, and to permit persons to whom the Software is 1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; furnished to do so, subject to the following conditions: 1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; 2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; The above copyright notice and this permission notice shall be included in 2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; all copies or substantial portions of the Software. 2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; 2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; THE SOFTWARE. 3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; 3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;----------------------------------------------------------------------------- 3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; To assemble and link, use these commands with NASM 2.x: 3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; nasm -Ox -f bin -o eltorito.sys eltorito.asm 3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; To enable Trace markers uncomment the line below 3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; DEBUG_TRACERS=1 3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; To enable debug info uncomment the line below 4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; DEBUG=1 4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%ifdef DEBUG_TRACERS 4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman %macro TRACER 1 4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call debug_tracer 4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman db %1 4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman %endmacro 4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%else 4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman %macro TRACER 1 4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman %endmacro 5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%endif ; DEBUG_TRACERS 5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%define Ver '1.5' 5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%define CR 0DH, 0Ah 5476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanRPolyH equ 0EDB8h 5576d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanRPolyL equ 08320h 5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman section .text align=16 5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman org 0 5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;============================================================================= 6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanCdrom: 6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanNextDriver dd -1 ;-+ 6576d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanAttributes dw 0C800h ; | 6676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanPointers dw Strategy ; | 6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dw Commands ; | MSCDEX requires this 6876d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanDeviceName db 'ELTORITO' ; | data in these locations 6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dw 0 ; | 7076d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanDriveLetter db 0 ; | 7176d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanNumUnitsSupp db 1 ;-+ 7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 7376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanDriverName db 'El-Torito CD-ROM Device Driver',0 7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman align 4, db 0 7576d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanReqHdrLoc dd 0 7676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanXferAddr dd 0 7776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanChecksum dd -1 7876d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanDriveNumber db 0 7976d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanReadBytes db 0 ;0 --> 2048 bytes/sector 8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ;1 --> 1024 bytes/sector 8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ;2 --> 512 bytes/sector 8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 8376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanRoutines dw Init ;Init ;0 8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dw Unsupported ;MediaCheck ;1 8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dw Unsupported ;BuildBPB ;2 8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dw IoctlInput ;IoctlInput ;3 8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dw Unsupported ;Input ;4 8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dw Unsupported ;NonDesInput ;5 8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dw Unsupported ;InputStatus ;6 9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dw Unsupported ;InputFlush ;7 9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dw Unsupported ;Output ;8 9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dw Unsupported ;OutputVerify ;9 9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dw Unsupported ;OutputStatus ;10 9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dw Unsupported ;OutputFlush ;11 9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dw IoctlOutput ;IoctlOutput ;12 9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dw DoNothing ;DeviceOpen ;13 9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dw DoNothing ;DeviceClose ;14 9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dw ReadL ;ReadL ;128 9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 10076d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanIoctlICtrl dw Raddr ;Raddr ;0 10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dw Unsupported ;LocHead ;1 10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dw Unsupported ;(Reserved) ;2 10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dw Unsupported ;ErrStat ;3 10476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dw Unsupported ;AudInfo ;4 10576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dw DrvBytes ;DrvBytes ;5 10676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dw DevStat ;DevStat ;6 10776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dw SectSize ;SectSize ;7 10876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dw VolSize ;VolSize ;8 10976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dw MedChng ;MedChng ;9 11076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 11176d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanSpecPkt times 19 db 0 ; offset 77h in 1.4 11276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman times 13 db 0 ; unknown extra 00s in 1.4 11376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 11476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanGreeting db 'El-Torito Bootable CD-ROM Driver for Dos v',Ver,', http://www.nu2.nu/eltorito/',CR 11576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman db ' (c) 2000 by Gary Tong',CR 11676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman db ' (c) 2001-2002 by Bart Lagerweij',CR,0 11776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanDblSpace db ' ',0 11876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 11976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;============================================================================= 12076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 12176d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanStrategy: 12276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 12376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov word [cs:ReqHdrLoc],bx 12476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov word [cs:ReqHdrLoc+2],es 12576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman retf 12676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 12776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 12876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;============================================================================= 12976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 13076d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanCommands: 13176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 13276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman push ax 13376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman push bx 13476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman push cx 13576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman push dx 13676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman push si 13776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman push di 13876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman push bp 13976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; pushad 14076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman push ds 14176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman push es 14276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TRACER 'C' 14376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 14476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cld ;Clear direction 14576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sti ;Enable interrupts 14676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 14776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ax, cs ;ds=cs 14876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ds, ax 14976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 15076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman les bx,[ReqHdrLoc] ;seg:offset ptr into es:bx 15176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman xor ax,ax 15276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov al,[es:bx+2] ;Get Command code 15376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%ifdef DEBUG 15476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call print_hex8 15576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%endif 15676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cmp al,15 15776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jb Mult2 ;If 0-14 15876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cmp al,128 15976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jb UnknownCmd ;If 15-127 16076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cmp al,129 16176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jb ShiftDown ;If 128 16276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanUnknownCmd: mov al,121 ;8 = Unsupported (Reserved) 16376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanShiftDown: sub al,113 ;128 --> 15, 121 --> 8 16476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanMult2: shl al,1 ;Convert into offset (*2) 16576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov di,Routines 16676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman add di,ax 16776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call word [di] ;Execute desired command 16876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman or ax,100h ;Set Return Status's Done bit 16976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lds bx,[ReqHdrLoc] ;seg:offset ptr into ds:bx 17076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov [bx+3],ax ;Save Status 17176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 17276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%ifdef DEBUG 17376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cmp byte [cs:buffer+2048], 96h 17476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman je buffer_ok 17576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov al, '!' 17676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call print_char 17776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jmp $ 17876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanbuffer_ok: 17976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%endif 18076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 18176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TRACER 'c' 18276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pop es 18376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pop ds 18476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; popad 18576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pop bp 18676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pop di 18776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pop si 18876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pop dx 18976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pop cx 19076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pop bx 19176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pop ax 19276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman retf 19376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 19476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 19576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;============================================================================= 19676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 19776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanUnsupported: ;Unsupported Command 19876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 19976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ax,8003h ;Set Status Error bit, 20076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TRACER 'U' 20176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TRACER 'C' 20276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman retn ; Error 3 = Unknown Command 20376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 20476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 20576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;============================================================================= 20676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 20776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanIoctlInput: ;IOCTL Input Routine 20876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 20976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov di,[es:bx+14] ;es:bx --> Request Header 21076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov es,[es:bx+16] ;Get Xfer Address into es:di 21176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman xor ax,ax ;Get Control Block Code 21276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov al,[es:di] 21376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%ifdef DEBUG 21476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TRACER 'I' 21576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TRACER 'O' 21676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call print_hex8 21776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%endif 21876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cmp al,10 21976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jb UnkIoctlI ;If 0-9 22076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov al,2 ;Map to Unsupported 22176d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanUnkIoctlI: shl al,1 ;Convert into offset (*2) 22276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov si,IoctlICtrl 22376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman add si,ax 22476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call word [si] ;Execute desired command 22576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman retn 22676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 22776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 22876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;============================================================================= 22976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 23076d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanRaddr: ;Return Device Header Address 23176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 23276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TRACER 'A' 23376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov word [es:di+1],0 23476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov [es:di+3],cs 23576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman xor ax, ax ;Set Return Status = success 23676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TRACER 'a' 23776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman retn 23876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 23976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 24076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;============================================================================= 24176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 24276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanDrvBytes: ;Read Drive Bytes 24376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 24476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TRACER 'B' 24576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman push di ;Save original Xfer Addr 24676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman add di,2 ;Point to 1st dest byte 24776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov si,Greeting ;Point to Greeting 24876d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanDrvB: movsb ;Copy over a byte 24976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cmp byte [si],13 ;Is next char a CR? 25076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jne DrvB ;Loop if not 25176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 25276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sub di,2 ;Get #bytes copied into ax 25376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ax,di 25476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pop di ;Retrieve original Xfer Addr 25576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sub ax,di 25676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov byte [es:di+1],al ;and save it 25776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ax,0 ;Set Return Status = success 25876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TRACER 'b' 25976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman retn 26076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 26176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 26276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;============================================================================= 26376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 26476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanDevStat: ;Return Device Status 26576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 26676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TRACER 'D' 26776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov word [es:di+1],202h ;Door closed 26876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov word [es:di+3],0 ;Door unlocked 26976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ;Supports only cooked reading 27076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ;Read only 27176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ;Data read only 27276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ;No interleaving 27376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ;No prefetching 27476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ;No audio channel manipulation 27576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ;Supports both HSG and Redbook 27676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ; addressing modes 27776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 27876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman xor ax, ax ;Set Return Status = success 27976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TRACER 'd' 28076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman retn 28176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 28276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 28376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;============================================================================= 28476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 28576d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanSectSize: ;Return Sector Size 28676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 28776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TRACER 'S' 28876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov word [es:di+2],2048 28976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ax,0 ;Set Return Status = success 29076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TRACER 's' 29176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman retn 29276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 29376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 29476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;============================================================================= 29576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 29676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanVolSize: ;Return Volume Size 29776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 29876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TRACER 'V' 29976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call PriVolDesc ;Get and Check Primary Volume 30076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ; Descriptor 30176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ax,800Fh ;Assume Invalid Disk Change 30276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jc VolExit ;If Read Failure 30376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 30476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ax,word [Buffer+80] ;Read Successful 30576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov word [es:di+1],ax ;Copy over Volume Size 30676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ax,word [Buffer+82] 30776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov word [es:di+3],ax 30876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ax,0 ;Set Return Status = success 30976d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanVolExit: 31076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TRACER 'v' 31176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman retn 31276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 31376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 31476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;============================================================================= 31576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 31676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanMedChng: ;Return Media Changed Status 31776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 31876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TRACER 'M' 31976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call PriVolDesc ;Get and Check Primary Volume 32076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ; Descriptor 32176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov byte [es:di+1],-1 ;Assume Media Changed 32276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ax,800Fh ; and Invalid Disk Change 32376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jc MedExit ;If Media Changed or Bad 32476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 32576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov byte [es:di+1],1 ;Media has not changed 32676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ax,0 ;Set Return Status = success 32776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanMedExit: 32876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TRACER 'm' 32976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman retn 33076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 33176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 33276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;============================================================================= 33376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 33476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanPriVolDesc: ;Get and Check Primary Volume 33576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ; Descriptor 33676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TRACER 'P' 33776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ax,cs ;Set ds:si --> SpecPkt 33876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ds,ax 33976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 34076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov cx, 5 34176d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanPriVolAgain: 34276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov byte [SpecPkt],16 ;SpecPkt Size 34376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov byte [SpecPkt+1],0 ;Reserved 34476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov word [SpecPkt+2],1 ;Transfer one 2048-byte sector 34576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman push cx 34676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov cl,byte [ReadBytes] ;Multiply by 4 if reading 512 34776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman shl word [SpecPkt+2],cl ; bytes at a time 34876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pop cx 34976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov word [SpecPkt+6],cs ;Into our Buffer 35076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov word [SpecPkt+4], Buffer 35176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov word [SpecPkt+8],16 ;From CD Sector 16 35276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov word [SpecPkt+10],0 35376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov word [SpecPkt+12],0 35476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov word [SpecPkt+14],0 35576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 35676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov si, SpecPkt 35776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov dl, [DriveNumber] 35876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ah, 42h ;Extended Read 35976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int 13h 36076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jnc PriVolPass ;If success 36176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 36276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; TRACER '1' 36376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ; read error 36476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman loop PriVolAgain 36576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 36676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TRACER '2' 36776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ; read retries exhausted 36876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ; flow into below 36976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jmp PriReadErr 37076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 37176d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanPriVolPass: 37276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov si,Buffer ;Point input to Buffer 37376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ax,-1 ;Init Checksum registers 37476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov bx,ax ; bx,ax = 0FFFFFFFFh 37576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jc PriNew ;If Read Failure 37676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 37776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman push di ;Read Successful, 37876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ; so Calculate Checksum 37976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov di,1024 ;Init Word counter 38076d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanPriWord: mov dx,[cs:si] ;Grab next word from buffer 38176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov cx,16 ;Init bit counter 38276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanPriBit: shr dx,1 ;Shift everything right 1 bit 38376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman rcr bx,1 38476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman rcr ax,1 38576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jnc NoMult ;If a zero shifted out 38676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 38776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman xor bx,RPolyH ;A one shifted out, so XOR 38876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman xor ax,RPolyL ; Checksum with RPoly 38976d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanNoMult: 39076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman loop PriBit 39176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 39276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman add si,2 ;Inc Word Pointer 39376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dec di 39476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ja PriWord 39576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TRACER '3' 39676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 39776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pop di ;Checksum calculation complete 39876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cmp bx,[Checksum+2] ;Has Checksum changed? 39976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jne PriNew ;If Checksum Changed 40076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 40176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cmp ax,[Checksum] 40276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jne PriNew ;If Checksum Changed 40376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 40476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman clc ;Checksum not changed, CF=0 40576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ax,0 ;Status = success 40676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jmp PriOld 40776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 40876d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanPriReadErr: 40976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov WORD [Checksum+2],bx ;Save New Checksum 41076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov [Checksum],ax ; or 0FFFFFFFFh if bad read 41176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman stc ;Checksum change, CF=1 41276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ax, 800bh ;Status = read fault 41376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jmp PriOld 41476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 41576d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanPriNew: mov WORD [Checksum+2],bx ;Save New Checksum 41676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov [Checksum],ax ; or 0FFFFFFFFh if bad read 41776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman stc ;Checksum Changed, CF=1 41876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ax,800Fh ;Status = Invalid Media Change 41976d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanPriOld: 42076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TRACER 'p' 42176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman retn 42276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 42376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 42476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;============================================================================= 42576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 42676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanIoctlOutput: ;IOCTL Output Routine 42776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 42876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TRACER 'O' 42976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov di,[es:bx+14] ;es:bx --> Request Header 43076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov es,[es:bx+16] ;Get Xfer Address into es:di 43176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman xor ax,ax ;Get Control Block Code 43276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov al,[es:di] 43376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cmp al,2 43476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jne UnkIoctlO ;If not 2 (ResetDrv) 43576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call DoNothing ;Reset Drive 43676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jmp IoctlODone 43776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanUnkIoctlO: 43876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call Unsupported ;Unsupported command 43976d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanIoctlODone: 44076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TRACER 'o' 44176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman retn 44276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 44376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 44476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;============================================================================= 44576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 44676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanDoNothing: ;Do Nothing Command 44776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 44876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ax,0 ;Set Return Status = success 44976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman retn 45076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 45176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 45276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;============================================================================= 45376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 45476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanReadL: ;Read Long Command 45576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 45676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TRACER 'R' 45776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ax,cs ;Set ds=cs 45876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ds,ax 45976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ;es:bx --> Request Header 46076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cmp byte [es:bx+24],0 ;Check Data Read Mode 46176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jne ReadLErr ;If Cooked Mode 46276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 46376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cmp byte [es:bx+13],2 ;Check Addressing Mode 46476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jb ReadLOK ;If HSG or Redbook Mode 46576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 46676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanReadLErr: 46776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TRACER '8' 46876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ax,8003h ;Set Return Status = Unknown 46976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jmp ReadLExit ; Command Error and exit 47076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 47176d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanReadLOK: 47276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ax,[es:bx+20] ;Get Starting Sector Number, 47376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov dx,[es:bx+22] ; Assume HSG Addressing Mode 47476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cmp byte [es:bx+13],0 ;Check Addressing Mode again 47576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman je ReadLHSG ;If HSG Addressing Mode 47676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 47776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TRACER '7' 47876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ;Using Redbook Addressing Mode. Convert to HSG format 47976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov al,dl ;Get Minutes 48076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov dl,60 48176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mul dl ;ax = Minutes * 60 48276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman add al,byte [es:bx+21] ;Add in Seconds 48376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman adc ah,0 48476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov dx,75 ;dx:ax = 48576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mul dx ; ((Min * 60) + Sec) * 75 48676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman add al,byte [es:bx+20] ;Add in Frames 48776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman adc ah,0 48876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman adc dx,0 48976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sub ax,150 ;Subtract 2-Second offset 49076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sbb dx,0 ;dx:ax = HSG Starting Sector 49176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 49276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanReadLHSG: 49376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov word [SpecPkt+8], ax ;Store Starting 49476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov word [SpecPkt+10], dx ; Sector Number 49576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov word [SpecPkt+12], 0 ; (HSG Format) 49676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov word [SpecPkt+14], 0 49776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 49876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ax,[es:bx+14] ;Get Transfer Address 49976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov word [SpecPkt+4],ax 50076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ax,[es:bx+16] 50176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov word [SpecPkt+6],ax 50276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 50376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov byte [SpecPkt],16 ;Size of Disk Address Packet 50476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov byte [SpecPkt+1],0 ;Reserved 50576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 50676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov cx, 5 50776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanReadLAgain: 50876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ax,[es:bx+18] ;Get number of sectors to read 50976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov word [SpecPkt+2],ax 51076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cmp ax, 3FFFh ;Too large? 51176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ja ReadLBad ;If yes 51276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 51376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman push cx 51476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov cl,byte [ReadBytes] ;Multiply by 4 if reading 512 51576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman shl word [SpecPkt+2],cl ; bytes at a time 51676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pop cx 51776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 51876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%ifdef DEBUG 51976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman push ax 52076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman push cx 52176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman push si 52276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov cx, 16 52376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov si,SpecPkt 52476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanReadDump: mov al, ' ' 52576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call print_char 52676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov al, byte [si] ;Hexdump a SpecPkt byte 52776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call print_hex8 52876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman inc si ;Point to next byte 52976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman loop ReadDump 53076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pop si 53176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pop cx 53276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pop ax 53376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%endif 53476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov si,SpecPkt 53576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov dl,[DriveNumber] 53676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ah,42h ;Extended Read 53776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int 13h 53876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jnc ReadLGd ;If success 53976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 54076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;hang: 54176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; jmp hang 54276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; TRACER '1' 54376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman loop ReadLAgain 54476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TRACER '2' 54576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jmp short ReadLBad 54676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanReadLGd: 54776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TRACER '3' 54876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman xor ax, ax ;Status 0 = success 54976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jmp short ReadLExit 55076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 55176d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanReadLBad: 55276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TRACER '9' 55376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ax, 800Bh ;Set Read Fault Error 55476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ; flow into ReadLExit 55576d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanReadLExit: 55676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TRACER 'r' 55776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman retn 55876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 55976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 56076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 56176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%ifdef DEBUG_TRACERS 56276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmandebug_tracer: pushad 56376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pushfd 56476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 56576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov al, '[' 56676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ah,0Eh ;BIOS video teletype output 56776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman xor bh, bh 56876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int 10h ;Print it 56976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 57076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov bp,sp 57176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov bx,[bp+9*4] ; Get return address 57276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov al,[cs:bx] ; Get data byte 57376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman inc word [bp+9*4] ; Return to after data byte 57476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 57576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ah,0Eh ;BIOS video teletype output 57676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman xor bh, bh 57776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int 10h ;Print it 57876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 57976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov al, ']' 58076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ah,0Eh ;BIOS video teletype output 58176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman xor bh, bh 58276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int 10h ;Print it 58376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 58476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman popfd 58576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman popad 58676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman retn 58776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%endif 58876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 58976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;----------------------------------------------------------------------------- 59076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; PRINT_HEX4 59176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;----------------------------------------------------------------------------- 59276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; print a 4 bits integer in hex 59376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; 59476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Input: 59576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; AL - 4 bits integer to print (low) 59676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; 59776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Output: None 59876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; 59976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Registers destroyed: None 60076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; 60176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanprint_hex4: 60276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 60376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman push ax 60476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman and al, 0fh ; we only need the first nibble 60576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cmp al, 10 60676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jae hex_A_F 60776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman add al, '0' 60876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jmp hex_0_9 60976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanhex_A_F: 61076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman add al, 'A'-10 61176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanhex_0_9: 61276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call print_char 61376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pop ax 61476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman retn 61576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 61676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 61776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;----------------------------------------------------------------------------- 61876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; print_hex8 61976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;----------------------------------------------------------------------------- 62076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; print a 8 bits integer in hex 62176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; 62276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Input: 62376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; AL - 8 bits integer to print 62476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; 62576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Output: None 62676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; 62776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Registers destroyed: None 62876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; 62976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanprint_hex8: 63076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 63176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman push ax 63276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman push bx 63376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 63476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ah, al 63576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman shr al, 4 63676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call print_hex4 63776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 63876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov al, ah 63976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman and al, 0fh 64076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call print_hex4 64176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 64276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pop bx 64376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pop ax 64476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman retn 64576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 64676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 64776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;============================================================================= 64876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; print_hex16 - print a 16 bits integer in hex 64976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; 65076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Input: 65176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; AX - 16 bits integer to print 65276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; 65376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Output: None 65476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; 65576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Registers destroyed: None 65676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;============================================================================= 65776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanprint_hex16: 65876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 65976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman push ax 66076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman push bx 66176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman push cx 66276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 66376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov cx, 4 66476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanprint_hex16_loop: 66576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman rol ax, 4 66676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call print_hex4 66776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman loop print_hex16_loop 66876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 66976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pop cx 67076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pop bx 67176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pop ax 67276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman retn 67376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 67476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;============================================================================= 67576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; print_hex32 - print a 32 bits integer in hex 67676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; 67776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Input: 67876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; EAX - 32 bits integer to print 67976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; 68076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Output: None 68176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; 68276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Registers destroyed: None 68376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;============================================================================= 68476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanprint_hex32: 68576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 68676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman push eax 68776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman push bx 68876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman push cx 68976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 69076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov cx, 8 69176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanprint_hex32_loop: 69276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman rol eax, 4 69376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call print_hex4 69476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman loop print_hex32_loop 69576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 69676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pop cx 69776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pop bx 69876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pop eax 69976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman retn 70076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 70176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;============================================================================= 70276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; print_string - print string at current cursor location 70376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; 70476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Input: 70576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; DS:SI - ASCIIZ string to print 70676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; 70776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Output: None 70876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; 70976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Registers destroyed: None 71076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;============================================================================= 71176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanprint_string: 71276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman push ax 71376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman push si 71476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 71576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanprint_string_again: 71676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov al, [si] 71776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman or al, al 71876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jz print_string_exit 71976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call print_char 72076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman inc si 72176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jmp print_string_again 72276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 72376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanprint_string_exit: 72476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pop si 72576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pop ax 72676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman retn 72776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 72876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;----------------------------------------------------------------------------- 72976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; PRINT_CHAR 73076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;----------------------------------------------------------------------------- 73176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Print's a character at current cursor position 73276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; 73376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Input: 73476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; AL - Character to print 73576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; 73676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Output: None 73776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; 73876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Registers destroyed: None 73976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; 74076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanprint_char: 74176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 74276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman push ax 74376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman push bx 74476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 74576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ah,0Eh ;BIOS video teletype output 74676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman xor bh, bh 74776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int 10h ;Print it 74876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 74976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanprint_char_exit: 75076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pop bx 75176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pop ax 75276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman retn 75376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 75476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 75576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;============================================================================= 75676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 75776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;This space is used as a 2048-byte read buffer plus one test byte. 75876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;The 96h data is used for testing the number of bytes returned by an Extended 75976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; CD-ROM sector read 76076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 76176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman align 16, db 0 76276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanBuffer times 2049 db 96h 76376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 76476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;============================================================================= 76576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 76676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanInit: ;Initialization Routine 76776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 76876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TRACER 'I' 76976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ax,cs ;ds=cs 77076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ds,ax 77176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 77276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%ifdef DEBUG 77376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; print CS value (load segment) 77476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call print_hex16 77576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman%endif 77676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 77776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov si, Greeting ;Display Greeting 77876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call print_string 77976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 78076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ax,Unsupported ;Init is executed only once 78176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov [Routines],ax 78276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 78376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ax, 5400h 78476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int 13h ; Get diskemu status 78576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jc FindBoot ; If CF=1 no diskemu loaded 78676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 78776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov [DriveNumber], cl ; Store drive number 78876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 78976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call keyflag 79076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman and al, 8 ; alt key ? 79176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jz extread 79276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 79376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov si, DrvNumMsg ; Display "drive number=" 79476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call print_string 79576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov al, [DriveNumber] 79676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call print_hex8 79776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov si, LineEnd ; CR/LF 79876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call print_string 79976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jmp extread 80076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 80176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Diskemu is not loaded 80276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; so loop to find drive number 80376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ; *** start of 1.4 changes *** 80476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ; ??? mov dl, 0ffh ;Start at Drive 0xff 80576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ; *** FindBoot at c47 in 1.4, at c0c in 1.3 *** 80676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanFindBoot: call ScanDrives ; call new helper in 1.4 80776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jnc FoundBoot ; ded*df3 80876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; mov si,offset SpecPkt ;Locate booted CD-ROM drive 80976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; mov [SpecPkt],0 ;Clear 1st byte of SpecPkt 81076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; mov ax,4B01h ;Get Bootable CD-ROM Status 81176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; int 13h 81276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; jnc FindPass ;If booted CD found 81376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; 81476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Carry is not cleared in buggy Dell BIOSes, 81576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; so I'm checking packet size byte 81676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; some bogus bioses (Dell Inspiron 2500) returns packet size 0xff when failed 81776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Dell Dimension XPsT returns packet size 0x14 when OK 81876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 81976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; cmp [SpecPkt], 0 82076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; jne FoundBoot 82176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 82276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; cmp [SpecPkt], 13h ; anything between 13h and 20h should be OK 82376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; jb FindFail 82476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; cmp [SpecPkt], 20h 82576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; ja FindFail 82676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; jmp short FoundBoot 82776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; 82876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; FindFail: 82976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; dec dl ;Next drive 83076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; cmp dl, 80h 83176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; jae FindBoot ;Check from ffh..80h 83276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ; *** end of 1.4 changes *** 83376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 83476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov si,NoBootCD ;No booted CD found, 83576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call print_string 83676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jmp NoEndAddr ;Do not install driver 83776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 83876d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanFoundBoot: 83976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; mov dl, [SpecPkt+2] ; 1.4 change 84076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ; *** next line at c57 in 1.4, at c3d in 1.3 *** 84176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov [DriveNumber],dl ;Booted CD-ROM found, 84276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ; so save Drive # 84376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 84476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call keyflag 84576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman and al, 8 ; alt key ? 84676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jz extread 84776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 84876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov si, CDStat 84976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call print_string 85076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov si, SpecPkt ;Point to returned CD SpecPkt 85176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov cx, 19 ; containing 19 bytes 85276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanStatDump: mov al, ' ' ;Print a space 85376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call print_char 85476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov al, byte [si] ;Hexdump a SpecPkt byte 85576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call print_hex8 85676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman inc si ;Point to next byte 85776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman loop StatDump 85876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 85976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov si, LineEnd ;Print a CR/LF 86076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call print_string 86176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 86276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanextread: 86376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;See how many CD Sector bytes are returned by an Extended Read 86476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov byte [SpecPkt],16 ;SpecPkt Size 86576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov byte [SpecPkt+1],0 ;Reserved 86676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov word [SpecPkt+2],1 ;Transfer one sector 86776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov word [SpecPkt+6],cs ;Into our Buffer 86876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov word [SpecPkt+4],Buffer 86976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov word [SpecPkt+8],16 ;From CD Sector 16 87076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov word [SpecPkt+10],0 87176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov word [SpecPkt+12],0 87276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov word [SpecPkt+14],0 87376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 87476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov si, SpecPkt ;Set ds:si --> SpecPkt 87576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov dl, [DriveNumber] 87676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ah, 42h ;Extended Read 87776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int 13h 87876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jnc SecSize ;If success 87976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 88076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ah, 42h ;Always make 2 read attempts 88176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int 13h 88276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ;How many bytes did we get? 88376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanSecSize: std ;Count down 88476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ax,cs ;Point to end of Buffer 88576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov es,ax 88676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov di,Buffer+2047 ;Find end of read data 88776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov si,Buffer+2048 88876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov cx,2049 88976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman repe cmpsb ;cx = number of bytes read 89076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 89176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cld ;Restore count direction to up 89276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov si,CDBytes ;Display number of bytes read 89376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call print_string 89476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 89576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov al, [DriveNumber] 89676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call print_hex8 89776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 89876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov si,CDBytesA ;Remainder A of message 89976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call print_string 90076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 90176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov al,ch ;Hex-dump cx 90276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman and al,0Fh ;Second nibble 90376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call print_hex8 ; (don't need the First) 90476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov al,cl 90576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call print_hex8 ; (don't need the First) 90676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 90776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov si,CDBytesB ;Remainder B of message 90876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call print_string 90976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 91076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cmp cx,2048 ;Did we read 2048 bytes? 91176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman je ParseParm ;If yes <-- O.K. 91276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 91376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov byte [ReadBytes],1 91476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cmp cx,1024 ;Did we read 1024 bytes? 91576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman je ParseParm ;If yes <-- O.K. 91676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 91776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov byte [ReadBytes],2 91876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cmp cx,512 ;Did we read 512 bytes? 91976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jne NoEndAddr ;If not, do not load driver 92076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 92176d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanParseParm: mov bx,word [cs:ReqHdrLoc] ;Parse command line 92276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov es,word [cs:ReqHdrLoc+2] ; parameters 92376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov si,[es:bx+18] ;Get BPB array ptr into DS:SI 92476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ds,[es:bx+20] 92576d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanFindParm: inc si 92676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanFindParm1: cmp byte [si],0Dh ;CR? (End of parameters) 92776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman je EndOfParms 92876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 92976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cmp byte [si],0Ah ;LF? 93076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman je EndOfParms 93176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 93276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cmp byte [si],'/' ;A parameter? 93376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jne FindParm 93476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 93576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman inc si 93676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cmp byte [si],'D' ;Device Name parameter? 93776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jne FindParm1 93876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 93976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman inc si 94076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cmp byte [si],':' 94176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jne FindParm1 94276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 94376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;bbb 94476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman push si 94576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov si, DevName ;Device Name is at ds:si 94676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman push ds ;Keep ptr to Device Name 94776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ax, cs 94876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ds, ax 94976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call print_string 95076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pop ds ;Retrieve Device Name ptr 95176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pop si 95276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov cx, 8 ;Get next 8 chars 95376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman inc si ; = Device Name 95476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ax, cs 95576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov es, ax 95676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov di, DeviceName 95776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanNextChar: cmp byte [si],' ' 95876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ja AboveSpace 95976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 96076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ax,cs ;Pad end of Device Name with 96176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ds,ax ; spaces if necessary 96276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov si,DblSpace ;A space 96376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanAboveSpace: mov al, [si] 96476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call print_char 96576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman movsb ;ds:[si] --> es:[di] 96676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman loop NextChar 96776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 96876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov si,LineEnd 96976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ax,cs 97076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ds,ax 97176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call print_string 97276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 97376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ax,Init-2 ;Last byte of driver to keep 97476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jmp EndAddr ;Install driver 97576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 97676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanEndOfParms: 97776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ax, cs ; Restore segment registers (fix) 97876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ds, ax 97976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov es, ax 98076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 98176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov si,NoDevName ;No Device Name Found 98276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call print_string 98376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 98476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanNoEndAddr: mov ax,0 ;Do not install driver 98576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 98676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanEndAddr: mov es,[ReqHdrLoc+2] ;Write End Address 98776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov bx,[ReqHdrLoc] 98876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov [es:bx+14],ax 98976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov [es:bx+16],cs 99076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov bx,ax ;Hold onto install status 99176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 99276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov si, DrvInst ;Display driver install status 99376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call print_string 99476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov si, DrvInst1 ;Assume driver installed 99576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cmp bx,0 ;Was driver installed? 99676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jne DrvStatus ;If yes 99776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov si, NoDrvInst ;Driver not installed 99876d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanDrvStatus: call print_string 99976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 100076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ax,0 ;Set Return Status = success 100176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cmp bx,0 ;Was INIT successful? 100276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jne InitStat ;If yes 100376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ax,800Ch ;Status = General Failure 100476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanInitStat: 100576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman push ax ;Save Return Status 100676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 100776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call keyflag 100876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman and al, 8 ; alt key ? 100976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jz InitExit 101076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 101176d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanWaitHere: 101276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov si, WaitMsg ;Display Halted message 101376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call print_string 101476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 101576d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanAltWait: 101676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call keyflag 101776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman and al, 8 ; Alt key? 101876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jnz AltWait ; Pressed? yes -> wait 101976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 102076d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanInitExit: 102176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pop ax ;Retrieve Return Status 102276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TRACER 'i' 102376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman retn ;That's it for Init! 102476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 102576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ; *** start 1.4 changes at ded *** 102676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanSpecGo: mov si,SpecPkt 102776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int 13h 102876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman retn 102976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 103076d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanScanDrives: push ax ; at df3 in 1.4 103176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman push si 103276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov dl, 7fh ;Start at Drive 0x80 103376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanNextDrv: inc dl 103476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman clc 103576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ax,4B01h ;Get Bootable CD-ROM Status 103676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov BYTE [SpecPkt],0 ;Clear 1st byte of SpecPkt 103776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman call SpecGo 103876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Carry is not cleared in buggy Dell BIOSes, 103976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; so I'm checking packet size byte 104076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; some bogus bioses (Dell Inspiron 2500) returns packet size 0xff when failed 104176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; Dell Dimension XPsT returns packet size 0x14 when OK 104276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 104376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cmp BYTE [SpecPkt], 13h ; anything between 13h and 20h should be OK 104476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jb FindFail 104576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cmp BYTE [SpecPkt], 20h 104676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ja FindFail ; in 1.4 at e16 104776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jmp short SendFound ; in 1.4 at e26 104876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 104976d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanFindFail: cmp dl, 0ffh 105076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman je SendFail ; Check from 80h..ffh 105176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jmp short NextDrv ;Next drive 105276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanSendFail: xor dl,dl 105376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman stc 105476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jmp short ThingDone 105576d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanSendFound: mov dl, [SpecPkt+2] 105676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman clc 105776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanThingDone: pop si 105876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pop ax 105976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman retn 106076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ; *** end 1.4 changes *** 106176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 106276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;============================================================================= 106376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 106476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;------------------------------------------------------------ 106576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; keyboard flags - return keyboard flags in AL 106676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman; bit 3 = ALT key 106776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmankeyflag: ; at dbc in 1.3, at e2e in 1.4 106876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman push bx 106976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mov ah, 2 107076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int 16h 107176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pop bx 107276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman retn 107376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 107476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;============================================================================= 107576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 107676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanDrvNumMsg db ' Diskemxx.bin returned drive number=', 0 107776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanNoBootCD db ' No booted CD-ROM found.',CR,0 107876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 107976d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanCDStat db ' INT 13h / AX=4B01h Specification Packet for ' 108076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman db 'Booted CD-ROM:',CR,' ', 0 108176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 108276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanCDBytes db ' Drive ', 0 108376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanCDBytesA db ' returns ', 0 108476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanCDBytesB db 'h bytes per Sector.',CR,0 108576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 108676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanDevName db ' Device Name: ', 0 108776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanNoDevName db ' No Device Name found. ' 108876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman db 'Usage: device=eltorito.sys /D:<DevName>',CR,0 108976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 109076d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanDrvInst db ' Driver ', 0 109176d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanNoDrvInst db 7,'not ' ;7 = Ctrl-G = Beep 109276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanDrvInst1 db 'installed',CR,0 109376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 109476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanWaitMsg db ' Alt pressed, waiting...', CR, 0 109576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;ContMsg db ' Continuing...' 109676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLineEnd db CR,0 109776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 109876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 109976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman;============================================================================= 1100