Mercurial > hg > Members > kono > nitros9-code
changeset 393:faba76628bfd
Added B&B hard drive boot module
author | boisy |
---|---|
date | Sun, 25 Aug 2002 19:36:44 +0000 |
parents | df43967d6a46 |
children | 369698ee11f4 |
files | 3rdparty/booters/boot_burke.asm |
diffstat | 1 files changed, 331 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/3rdparty/booters/boot_burke.asm Sun Aug 25 19:36:44 2002 +0000 @@ -0,0 +1,331 @@ +******************************************************************** +* Boot - Burke & Burke Boot Module +* +* $Id$ +* +* Burke & Burke boot module... needs to be patched for OS9Boots that are +* far into the device. +* Track is the literal cylinder #, Cylinder would be including all heads +* of that track +* +* Ed. Comments Who YY/MM/DD +* ------------------------------------------------------------------ + + nam Boot + ttl Burke & Burke Boot Module + + org 0 +buffptr rmb 2 Pointer to sector buffer in memory +numcyl rmb 2 Number of tracks for drive geometry init +sechead rmb 2 # of logical sectors/physical sector +numhead rmb 1 # of heads (sides) +seccyl rmb 2 # of sectors/cylinder (# of heads*sectors per head) +track rmb 2 Cylinder number last calculated ($9 - $A) +head rmb 1 Drive/head number (drive always 0) +sector rmb 1 Sector number (0-63) +vars equ 13-buffptr Size of stack variables buffer + + + ifp1 + use defsfile + endc + +tylg set Systm+Objct +atrv set ReEnt+rev +rev set $02 +edition set 2 + + mod eom,name,tylg,atrv,start,size + +u0000 rmb 0 +size equ . + +name fcs /Boot/ + fcb edition + +start ldb >MPI.Slct Set up Multipak properly for us + lda #$10 + mul + ldb #$11 + mul + stb >MPI.Slct + leas -vars,s Reserve work area on stack of 13 bytes + tfr s,u U points to beginning of 13 byte buffer + pshs u,y,x,b,a Preserve registers + ldd #$0200 512 bytes for each read from XT-GEN + std numcyl,u # of cyls on drive + sta sechead+1,u # of sectors/head + sta numhead,u # of heads on drive + os9 F$SRqMem Request 512 byte buffer from OS9P1 + lbcs L00B6 Error + tfr u,d d=Starting address of 512 byte block + ldu $06,s Get back pointer to 13 byte buffer + std buffptr,u Preserve buffer pointer + + clr >$FF51 Reset controller + + clr >$FF53 Set controller mode to 0 (part of init) + lbsr drvtype Set drive geometry (type of drive) + clrb Set initial LSN to 0 + ldx #$0000 + lbsr GetSect Figure out track/head/sector for LSN0 + bcs L00B6 Error occured in read + ldy buffptr,u Get buffer pointer + ldd DD.NAM+PD.CYL,y Get real # cylinders on drive + std numcyl,u Preserve + ldd DD.NAM+PD.SCT,y Get real # sectors/track + std sechead,u Preserve + lda DD.NAM+PD.SID,y Get real # heads + sta numhead,u Preserve + leay DD.BT,y Point to OS9Boot information + ldd DD.BSZ-DD.BT,y Get size of OS9Boot + std ,s Preserve on stack + ldb DD.BT-DD.BT,y Get MSB of starting LSN of OS9Boot + ldx DD.BT-DD.BT+1,y Get LSW of starting LSN of OS9Boot + pshs x,b Push on stack + lbsr drvtype Set up drive for real drive specs + ldd #$0200 Get size of our buffer + ldu buffptr,u Get pointer to our 512 byte buffer + os9 F$SRtMem Deallocate our old sector buffer + ldd $03,s Get back size of OS9Boot + inca Increase size by 1 block (256 bytes) + ifeq Level-1 + os9 F$SRqMem + else + os9 F$BtMem Allocate memory for boot file + endc + bcs L00B0 Error + stu $05,s Preserve pointer to start of OS9boot memory + ldu $09,s Get back pointer to local variables + ldd $05,s Get pointer to start of OS9Boot memory + std buffptr,u Move disk buffer pointer to there + ldd $03,s Get size of bootfile + beq L00A9 If zero, do someting + pshs b,a Otherwise push on stack +ReadBt std ,s Store # bytes left in boot on stack + ldb $02,s Get MSB of start sector of boot + ldx $03,s Get LSW of start sector of boot + bsr GetSect Convert to track/head/sector + bcs L00B4 If an error in getting, do something + inc buffptr,u Bump up buffer pointer by a page + ldx $03,s Bump up LSW of sector number + leax $01,x + stx $03,s And put it back + bne L00A0 If no carry over needed, proceed + inc $02,s Bump up MSB of sector number +L00A0 ldd ,s Get current boot size left to do + subd #$0100 Subtract 256 from it + bhi ReadBt If not zero yet, keep reading + leas $02,s Eat our temporary size left +L00A9 leas $03,s Eat our current LSN to get + clrb Clear carry (No error) + puls b,a pull off multipak settings (?) + bra BtExit +L00B0 leas $03,s Purge stack + bra L00B6 +L00B4 leas $05,s Purge stack + +L00B6 leas $02,s Purge stack + +BtExit pshs a + lda #$FF + sta >$FF51 Reset controller + sta >MPI.Slct Reset multipak + sta >$FFD9 Double speed on + puls u,y,x,a Get exit parameters for Boot + leas vars,s Reset stack + rts Exit from Boot + +* Get 512 byte sector from controller +* Entry X:B = 24 bit Logical sector number to get + +GetSect pshs x,b Preserve registers + ldx #$FFFF (Init X so it will be 0 in loop) + +* 24 bit divide routine. Stack=LSN (3 bytes) +* Entry: u=pointer to our local variable list + +cyldiv leax $01,x # of loops through subtract + ldd $01,s Get original x (0) + subd seccyl,u Subtract # sector/cylinder + std $01,s Preserve it back + ldb ,s Continue subtract with borrow for 24 bit + sbcb #$00 + stb ,s + bcc cyldiv If not trying to borrow again, continue + stx track,u Got track # + ldd $01,s Reset value to last in loop + addd seccyl,u + clr head,u Set head # to 0? +hddiv inc head,u Increase head #? + subd sechead,u Subtract # sectors/head? + bcc hddiv Continue subtracting until it wraps + dec head,u Adjust head to not include wrap + addd sechead,u Adjust leftover to not include wrap + lsrb Divide b by 2 (256 byte sector to 512) + stb sector,u Preserve sector # + leas $03,s Clear stack of 24 bit number + + pshs cc Preserve odd sector flag (carry bit) + + bsr cmdstrt Set up controller for new command + lda #$08 Read sector command + ldb head,u Drive/head byte (Drive always 0) + bsr dblsend Send to controller + ldd track,u Get msb of track + lsra Move right 2 bits into left two for the + rora controller + rora + ora sector,u mask in the sector number into remaining 6 bits +* ldb track+1,u Get LSB of track + bsr dblsend Send to controller + ldd #$0100 1 sector to read/no error correction/3 ms step + bsr dblsend Send that to controller + ldx buffptr,u Get pointer to sector buffer +* new code is here + puls cc Get back odd sector 1/2 indicator + bcc normal Even sector, use 1st half + bsr Eat256 Odd sector, use 2nd half + bsr Read256 Read 256 bytes off of controller + lbra chkcmplt See if command is complete +normal bsr Read256 Read 1/2 of sector + bsr Eat256 Eat half of sector + lbra chkcmplt See if command is complete + +Eat256 clrb Eat 256 bytes off of controller +Eatlp lbsr nxtready Get byte from controller + decb counter + bne Eatlp Keep eating until 256 bytes done + clrb + rts + +* Read 256 bytes from controller +* Entry: X=Pointer to current position in 512 physical sector buffer + +Read256 clrb Set counter for 256 byte read +ReadLp lbsr nxtready Go get a byte from controller + sta ,x+ Put in buffer + decb keep doing until all 256 are read + bne ReadLp + +middle clrb Clear carry for no error & return + rts + +* Send 2 bytes to the controller +* Entry: a=1st byte to send +* b=2nd byte to send + +dblsend pshs b,a Preserve d for a moment + bsr sendbyte Go send what is in a to controller + tfr b,a Send what was in b to the controller + bsr sendbyte + puls pc,b,a Return with a and b intact + +* Sends a byte to the controller when it is ready for it +* Entry: a=byte to send + +sendbyte pshs a Preserve a for a moment +waitsend bsr stable Make sure status register is stable and get it + anda #%00001011 Mask out bits + cmpa #$09 Is it expecting next byte of data packet? + bne waitsend + puls a Yes, get the byte we are sending next + sta >$FF50 Store in data register + rts + +* Sends out command packet (6 bytes). Hard coded for drive 0, head 0, +* track 0, sector 0, interleave 0, no error correction, 3 ms step rate + +cmdpckt pshs a Preserve command for a moment + bsr cmdstrt Go initialize controller for command start + puls a Get back command byte + clrb 1st option byte to 0 + bsr dblsend Send both to controller + clra + bsr dblsend Send 4 more 0's to controller + bsr dblsend (sent command byte and 5 zero bytes for command + rts packet) + +cmdstrt bsr stable + anda #%00001001 Mask out all but bits 0 and 3 + bne cmdstrt If controller command is not complete or expecting + clr >$FF52 data, keep reading status register until it is ready + rts Otherwise initialize command start + +* Make sure controller's status register is stable + +stable lda >$FF51 Get status from controller + cmpa >$FF51 Keep getting until it stabilizes + bne stable + rts + +* Set the drive type (set to 512 track - may be the error) +* Using the initialize drive geometry command +* Exit: Carry set if non-recoverable error + +drvtype lda #$0C Initialize drive geometry command + bsr cmdpckt Go init + ldd numcyl,u Get # of cylinders on media + bsr dblsend Send it out (indicates drive has 512 tracks) + ldb sechead+1,u Get # of sectors/head + lda numhead,u Get # of heads on media + lsrb Divide OS9 sectors by 2 + bsr sendbyte Send out # of heads for drive geometry + lslb Multiply WD sectors by 2 to get OS9 sectors again. + mul + std seccyl,u # sectors per cylinder (all heads on a track) + ldd numcyl,u Get # of tracks back + subd #$0001 Reduce write track=last track-1 + bsr dblsend Send out reduced write track # + bsr dblsend Also use as write precomp track # + lda #$04 Maximum ECC burst length correctable=4 + bsr sendbyte Send it out + +* Make sure command has completed +* Exit: Carry set if controller reported a non-recoverable error +* Carry clear if everything went fine + +chkcmplt bsr stable When status register is stable get it + anda #%00000111 Keep checking until controller indicates that + cmpa #%00000111 command completion code is ready to be read + bne chkcmplt + lda >$FF50 Get command completion code + bita #%00000010 Was there in error in completing the command? + beq noerror Nope, everything fine setting drive geometry + lda #$03 Error, Request Sense Status from the drive + bsr cmdpckt send Request Sense Status code + bsr nxtready Go get response from controller + anda #%00111111 Mask out all but error type and error code + pshs a Preserve it for a second + bsr eat2 Go eat next 4 bytes from controller (remaining 3 + bsr eat2 from Sense Status & command completion code) + puls a Get back original error byte + tsta No error occured? + beq noerror No error; exit without error + cmpa #%00011000 Type 1, error 8 (correctable data error)? + beq noerror Yes, return without error + comb Set carry to indicate error + rts return +noerror clrb + rts + +* Reads two byte from controller without caring what they are + +eat2 bsr nxtready + +* Waits until next byte coming from controller is ready, then gets it +* Exit: a=byte from controller + +nxtready bsr stable Make sure status register is stable and get it + anda #%00001011 Controller ready to send me next byte? + cmpa #%00001011 + bne nxtready Nope, keep waiting + lda >$FF50 Yes, get byte and return + rts Padding to get $1D0 Size +* Pad to $1d0 bytes exactly + rts +* fcc /0/ + + emod +eom equ * + end