Mercurial > hg > Members > kono > nitros9-code
view 3rdparty/booters/boot_ide.asm @ 170:23ccca4f595a
Changed
author | boisy |
---|---|
date | Thu, 11 Jul 2002 19:56:14 +0000 |
parents | 0c12245b7bdc |
children | df43967d6a46 |
line wrap: on
line source
******************************************************************** * Boot - SCSI Boot module * * $Id$ * * This module allows booting from a hard drive that uses RGB-DOS * and is controlled by a TC^3 or Ken-Ton SCSI controller. * * It was later modified to handle hard drives with sector sizes * larger than 256 bytes, and works on both 256 byte and larger drives, * so it should totally replace the old SCSI boot module. * * Instructions followed by +++ in the comment field were added for this fix. * * Ed. Comments Who YY/MM/DD * ------------------------------------------------------------------ * ? Disassembled AD 94/06/25 * 6 Redone for IDE PTB 99/08/17 * 7 Added use of LSN bits 23-16 BGP 02/06/27 nam Boot ttl IDE booter for LBA mode ifp1 use defsfile endc tylg set Systm+Objct atrv set ReEnt+rev rev set 2 edition set 7 * Disassembled 94/06/25 11:37:47 by Alan DeKok * ReDone by Paul T. Barton 99/08/17, for IDE * Port equ $FF70 still leaves room for SSPak & SSP & MPI RData equ 0 data 0..7 WData equ 0 data 0..7 ErrReg equ 1 Has the errors SecCnt equ 2 always =1 SecNum equ 3 CylLow equ 4 CylHigh equ 5 DevHead equ 6 0,1,0,DEV,0,0,0,0 Status equ 7 Results of read/write CmdIde equ 7 Commands Latch equ 8 Latch ReadCmd equ $20 Diagnos equ $90 BusyBit equ %10000000 BUSY=1 DrdyBit equ %01000000 drive ready=1 DscBit equ %00010000 seek finished=1 DrqBit equ %00001000 data requested=1 ErrBit equ %00000001 error_reg has it RdyTrk equ %01010000 ready & over track RdyDrq equ %01011000 ready w/ data Master equ %11100000 LBA MODE Slave equ %11110000 LBA MODE WhchDriv equ Master Drive to use (Master or Slave) mod eom,name,tylg,atrv,start,size * on-stack buffer to use org 0 btmem rmb 2 btsiz rmb 2 btloc rmb 3 size equ . name fcs /Boot/ fcb edition start orcc #IntMasks ensure IRQ's are off. leas -size,s clr >$FF40 stop the disk lbsr Init ldd #$0001 request one byte (will round up to 1 page) os9 F$SRqMem request the memory bcs L00B0 exit on error * U is implicitely the buffer address to use clrb ldx #$0000 X=0: got to sector #$0000 bsr GetSect load in LSN0, U = buffer start bcs L00B0 ifne NitrOS9 lda #'0 --- loaded in LSN0 jsr <D.BtBug --- endc ldd <DD.BSZ,u size of the bootstrap file std btsiz,s save it on the stack (0,s is junk) lda <DD.BT,u get starting sector bits 23-16 ldx <DD.BT+1,u get starting sector of the bootstrap file sta btloc,s stx btloc+1,s ldd #256 one page of memory os9 F$SRtMem return the copy of LSN0 to free memory ldd btsiz,s get size of boot memory to request ifeq Level-2 os9 F$BtMem ask for the boot memory else os9 F$SRqMem ask for the boot memory endc bcs L00AE no memory: exit with error std btsiz,s stu btmem,s save start address of memory allocated ldd btsiz,s and the size of the boot memory beq L00B0 if no memory allocated, exit pshs d save off temp size SectLp ldb btloc+2,s bsr GetSect read one sector bcs L00AE if there's an error, exit ifne NitrOS9 lda #'. dump out a period for boot debugging jsr <D.BtBug do the debug stuff endc leau 256,u leax 1,x go to the next sector bne Sect2 incb stb btloc+2,s Sect2 ldd ,s subd #256 take out one sector, need value in B, too. std ,s bhi SectLp loop until all sectors are read L00A7 clrb clear carry ldd btsiz+2,s L00AE leas $02,s kill D off of the stack ldx btmem,s L00B0 leas size,s remove the on-stack buffer L00BA rts Address fdb Port * GetSect: read a sector off of the disk * Entry: B,X = sector number to read * Memory: U = where to put it GetSect pshs b,x,y ldy <Address,pcr grab the device address bsr ChkBusy RdyHuh1 lda Status,y is IDE ready for commands? anda #DrdyBit ready ? beq RdyHuh1 loop until Drdy =1 lda #WhchDriv sta DevHead,y 0L0d/0hhh device=LBA lda #$01 only one at a time sta SecCnt,y only one at a time stb CylHigh,y bits 23-16 tfr x,d sector number to read sta CylLow,y hi-byte stb SecNum,y leax ,u where to put the sector lda #ReadCmd read one sector sta CmdIde,y finish process Blk2 lda Status,y is IDE ready to send? anda #DrqBit DRQ, data request beq Blk2 loop while DRQ =0 clr ,-s BlkLp lda RData,y A <- IDE ldb Latch,y std ,x++ into RAM inc ,s bpl BlkLp go get the rest puls b lda Status,y check for error-bit clrb puls b,x,y,pc * ------------------------------------------ ChkBusy lda Status,y anda #BusyBit 1xxx-xxxx bne ChkBusy if =1 then loop rts exit when BUSY =0 Init pshs d,y ldy <Address,pcr bsr ChkBusy could be spinning up... lda #Diagnos hits all drives sta CmdIde,y ./ bsr ChkBusy wait 'til both done clrb no errors puls d,y,pc ifeq Level-2 fcb 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 fcb 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 fcb 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 fcb 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 fcb 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 fcb 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 fcb 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 fcb 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 fcb 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 fcb 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 fcb 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 fcb 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 fcb 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 fcb 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 fcb 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 fcb 0,1,2,3,4,5,6,7 ifeq NitrOS9 fcb 0,1,2,3,4,5,6,7 endc endc emod eom equ *