changeset 1187:df263e490f85

New booters added (moved from 3rdparty/booters)
author boisy
date Fri, 30 May 2003 21:11:42 +0000
parents 0836a89b1eac
children aaae5eac20e1
files level1/modules/boot_burke.asm level1/modules/boot_idelba.asm level1/modules/boot_rampak.asm level1/modules/boot_wd1002.asm
diffstat 4 files changed, 1014 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/modules/boot_burke.asm	Fri May 30 21:11:42 2003 +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
+         use   rbfdefs
+         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
+Pad      fill  $39,$1D0-3-*
+
+         emod
+eom      equ   *
+         end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/modules/boot_idelba.asm	Fri May 30 21:11:42 2003 +0000
@@ -0,0 +1,214 @@
+********************************************************************
+* Boot - IDE Boot Module (LBA Mode)
+*
+* $Id$
+*
+* 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 Boot Module (LBA Mode)
+
+         ifp1
+         use   defsfile
+         use   rbfdefs
+         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
+Pad      fill  $39,$1D0-3-*
+         ENDC
+
+
+         emod  
+eom      equ   *
+         end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/modules/boot_rampak.asm	Fri May 30 21:11:42 2003 +0000
@@ -0,0 +1,134 @@
+********************************************************************
+* Boot - Disto RAMPak Boot Module
+*
+* $Id$
+*
+* Ed.    Comments                                       Who YY/MM/DD
+* ------------------------------------------------------------------
+* 5      Created                                        ADK
+* 6      Fixed small bugs, improved speed               BGP 98/10/20
+
+         nam   Boot
+         ttl   Disto RAMPak Boot Module
+
+* Disassembled 94/06/25 11:37:47 by Alan DeKok
+
+         ifp1  
+         use   defsfile
+         use   rbfdefs
+         endc  
+
+tylg     set   Systm+Objct
+atrv     set   ReEnt+rev
+rev      set   $00
+edition  set   6
+
+         mod   eom,name,tylg,atrv,start,size
+
+* on-stack buffer to use
+         org   0
+size     equ   .
+
+name     equ   *
+         fcs   /Boot/
+         fcb   edition
+
+start    orcc  #IntMasks  ensure IRQ's are off.
+
+         pshs  x,d        save 4 bytes of junk
+R.D      equ   1
+R.X      equ   3
+
+         lda   >MPI.Slct  get current slot
+         pshs  a          save off
+         lda   >PakSlot,pcr get multipak slot number
+         bmi   cont       if >127, invalid slot number
+         anda  #$03       force it to be legal
+         ldb   #$11
+         mul              put it into both nibbles
+         stb   >MPI.Slct  go to the desired slot
+
+cont     ldd   #$0001     request one byte (will round up to 1 page)
+         os9   F$SRqMem   request the memory
+         bcs   L00AE      exit on error
+* U is implicitely the buffer address to use
+
+         ldx   #$0000     X=0: got to sector #$0000
+         bsr   GetSect    load in LSN0, and point Y to the buffer
+         bcs   L00AE
+
+         ldd   <DD.BSZ,u  size of the bootstrap file
+         std   R.D,s      save it on the stack (0,s is junk)
+         ldx   <DD.BT+1,u get starting sector of the bootstrap file
+
+         pshs  x          save the starting sector number
+         ldd   #$0100     one page of memory
+         os9   F$SRtMem   return the copy of LSN0 to free memory
+
+         ldd   R.X,s      get size of boot memory to request
+         ifgt  Level-1
+         os9   F$BtMem    ask for the boot memory
+         else
+         os9   F$SRqMem   ask for the boot memory
+         endc
+         puls  x          restore the starting sector number
+         bcs   L00AE      no memory: exit with error
+
+         stu   R.X,s      save start address of memory allocated
+         std   R.D,s      and the size of the boot memory
+         beq   L00A7      if no memory allocated, exit
+
+SectLp   pshs  x,d        save sector #, size of boot
+         bsr   GetSect    read one sector
+         bcs   L00AC      if there's an error, exit
+         puls  x,d        restor sector, size of boot
+
+         leau  $0100,u    go up one page in memory
+         leax  $01,x      go to the next sector
+         subd  #$0100     take out one sector, need value in B, too.
+         bhi   SectLp     loop until all sectors are read
+
+L00A7    puls  a
+         sta   >MPI.Slct
+         clrb             clear carry
+         puls  d          return size of boot memory to user
+         bra   L00B0      and go exit
+
+L00AC    leas  $04,s      remove X,D off of stack
+L00AE    puls  a
+         sta   >MPI.Slct
+         leas  $02,s      kill D off of the stack
+
+L00B0    puls  x          restore start address of memory allocated
+*         leas  size,s     remove the on-stack buffer
+         clr   >DPort     stop the disk
+L00BA    rts   
+
+* GetSect: read a sector off of the disk
+* Entry: X = sector number to read
+GetSect  pshs  d,x,y
+         ldy   >Address,pcr grab the device address
+         tfr   x,d        move 16 bit LSN into 2 8-bit registers
+         sta   2,y        save HB LSN
+         stb   1,y        save LB LSN
+         leax  ,u         get buffer address to write into
+         clrb             and start out at byte zero
+
+ReadLp   stb   ,y         save byte number
+         lda   3,y        grab the byte
+         sta   ,x+        save in the buffer
+         incb             go to the enxt byte
+         bne   ReadLp
+         clrb             no errors
+         puls  d,x,y,pc   restore registers and return
+
+         ifgt  Level-1
+Pad      fill  $39,$1D0-6-*
+         endc
+
+Address  fdb   $FF40      address of the device to boot from
+PakSlot  fcb   $01        multipak slot number
+
+         emod  
+eom      equ   *
+         end   
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/modules/boot_wd1002.asm	Fri May 30 21:11:42 2003 +0000
@@ -0,0 +1,335 @@
+********************************************************************
+* Boot - Eliminator WD1002-05 Boot Module
+*
+* $Id$
+*
+* WD 1002-05 OS-9 Boot Subroutine (called by OS9p1)
+* Copyright 1988, 1989 Bruce Isted
+* All Rights Reserved
+*
+* Ed.    Comments                                       Who YY/MM/DD
+* ------------------------------------------------------------------
+* 2      Created by Bruce Isted                         BRI ??/??/??
+
+         nam   Boot
+         ttl   Eliminator WD1002-05 Boot Module
+
+* These equates should be set before assembly:
+FDStep   equ   $09        see Step Rate Table
+HDStep   equ   $0F        see step rate table
+
+*Step Rate Table:
+*+------------------+------------------+------------------+------------------+
+*! Value=FD/HD Rate ! Value=FD/HD Rate ! Value=FD/HD Rate ! Value=FD/HD Rate !
+*+------------------+------------------+------------------+------------------+
+*!  $00=40mS/7.5mS  !  $04=16mS/5.5mS  !  $08=08mS/3.5mS  !  $0C=03mS/1.5mS  !
+*!  $01=25mS/7.0mS  !  $05=14mS/5.0mS  !  $09=06mS/3.0mS  !  $0D=02mS/1.0mS  !
+*!  $02=20mS/6.5mS  !  $06=12mS/4.5mS  !  $0A=05mS/2.5mS  !  $0E=01mS/0.5mS  !
+*!  $03=18mS/6.0mS  !  $07=10mS/4.0mS  !  $0B=04mS/2.0mS  !  $0F=15uS/ 35uS  !
+*+------------------+------------------+------------------+------------------+
+
+         ifp1  
+         use   defsfile
+         use   rbfdefs
+         endc  
+
+* These equates should not have to be changed:
+BEdtn    equ   2
+BVrsn    equ   1
+MaxCyls  equ   1024       maximum cylinders supported
+MaxHeads equ   16         maximum heads supported
+MaxSctrs equ   64         maximum sectors per track supported
+PhysDrv0 equ   %10000000  SDH register mask for HD0
+PhysDrv1 equ   %10001000  SDH register mask for HD1
+PhysDrv2 equ   %10010000  SDH register mask for HD2
+PhysDrv3 equ   %00011000  SDH register mask for FD0
+PhysDrv4 equ   %00011010  SDH register mask for FD1
+PhysDrv5 equ   %00011100  SDH register mask for FD2
+PhysDrv6 equ   %00011110  SDH register mask for FD3
+ReadSctr equ   %00100000  read sector command
+Restore  equ   %00010000  base restore command
+SelfTest equ   %10010000  WD 1002-05 diagnostic test command
+
+* HCA memory map:
+         org   0
+WDData   rmb   2          WD 1002-05 sector buffer/task files
+         rmb   2          reserved - do not use
+PA       equ   .          PIA PA offset
+DDRA     rmb   1          PIA DDRA offset
+CRA      rmb   1          PIA CRA offset
+PB       equ   .          PIA PB offset
+DDRB     rmb   1          PIA DDRB offset
+CRB      rmb   1          PIA CRB offset
+
+* WD 1002-05 register definitions:
+         org   0
+WDBuff   rmb   1          WD 1002-05 sector buffer address
+ErrReg   equ   .          error register address (read)
+WPCReg   rmb   1          write precomp register address (write)
+SctrCnt  rmb   1          sector count register address
+SctrReg  rmb   1          sector number register address
+CylLow   rmb   1          cylinder LSB register address
+CylHigh  rmb   1          cylinder MSB register address
+SDHReg   rmb   1          Size/Drive/Head register address
+StatReg  equ   .          status register address (read)
+CmdReg   rmb   1          command register address (write)
+
+         org   0
+U.BSZ    rmb   2          boot file size
+U.BSct   rmb   1          number of sectors in boot file
+U.BT     rmb   3          boot file start LSN
+U.BtStrt rmb   2          boot file start address
+U.CrtCyl rmb   2          current cylinder number
+U.CrtSct rmb   1          current sector number
+U.CrtSid rmb   1          current side (head) number
+U.Restor rmb   1          restore command incl. step rate code
+U.SDH    rmb   1          base WD Size/Drive/Head register copy
+U.Sides  rmb   1          number of disk sides (heads)
+U.SPC    rmb   2          sectors per cylinder
+U.SPT    rmb   2          sectors per track
+U.StSctr rmb   1          start sector number (HD=0, FD=1)
+BootMem  equ   .
+
+         mod   BEnd,BNam,Systm+Objct,ReEnt+BVrsn,BExec,$00
+BNam     fcs   "Boot"
+         fcb   BEdtn      edition number
+
+* base SDH register table
+SDHTable equ   *
+         fcb   PhysDrv0,PhysDrv1,PhysDrv2 base SDH for hard drives
+         fcb   PhysDrv3,PhysDrv4,PhysDrv5,PhysDrv6 base SDH for floppys
+***
+* Boot subroutine module
+*
+* INPUT: none
+*
+* OUTPUT: [D]=size of bootstrap file
+*         [X]=start address of bootstrap file in memory
+*         y,u registers altered
+*
+* ERROR OUTPUT: [CC]=carry set
+*               [B]=error code
+BExec    ldy   <D.WDAddr  get HCA base address (set by auto-boot EPROM)
+         cmpy  #$FF40     base address too low?
+         blo   UnitErr    yes, go report error...
+         cmpy  #$FF7F     base address too high?
+         bhi   UnitErr    yes, go report error...
+         lda   <D.WDBtDr  get boot drive number (set by auto-boot EPROM
+         cmpa  #$07       legal drive number?
+         blo   InitPIA    yes, go initialize PIA...
+UnitErr  ldb   #E$Unit
+         coma  
+         rts   
+
+DumpRead clr   PB,y       set WD address to sector buffer
+DumpR0   lda   WDData,y   get a byte from WD sector buffer
+         decb             done yet?
+         bne   DumpR0     no, go dump another byte
+         rts   
+LSN0Info ldb   #DD.FMT    load number of bytes to dump
+         bsr   DumpRead   go dump LSN0 up to DD.FMT
+         lda   WDData,y   get DD.FMT (disk density, sides)
+         anda  #$01       mask out all but disk sides bit
+         inca             correction to bit coding
+         sta   U.Sides,u  save disk sides (not valid if HD > 2 heads)
+         ldd   WDData,y   get DD.SPT (sectors per track)
+         std   U.SPT,u
+         ldb   #DD.BT-DD.RES load number of bytes to dump
+         bsr   DumpRead   go dump LSN0 from DD.RES to DD.BT
+         lda   WDData,y   get DD.BT (boot file start LSN) MSB
+         sta   U.BT,u
+         ldd   WDData,y   get DD.BT (boot file start LSN) LSBs
+         std   U.BT+1,u
+         ldd   WDData,y   get DD.BSZ (boot file size)
+         std   U.BSZ,u
+         ldb   U.StSctr,u floppy drive? (start sector = 1)
+         bne   GotInfo    yes, sides info OK, go return
+         ldb   #DD.OPT+(PD.SID-PD.OPT)-DD.DAT load number of bytes to dump
+         bsr   DumpRead   go dump LSN0 from DD.DAT to number of sides in option table
+         lda   WDData,y   get number of sides from DD.OPT section
+         sta   U.Sides,u
+GotInfo  rts   
+
+InitPIA  clr   CRA,y      enable PIA DDRA
+         ldd   #$033E     [A]=DDRA:  PA bits 7-2 = inputs, bits 1-0 = outputs
+         std   DDRA,y     [B]=CRA:  PIA CA2 out high, PA slct, CA1 low to high, no IRQs
+         clr   CRB,y      enable PIA DDRB
+         lda   #$FF       [A]=DDRB:  PB bits 7-0 all outputs
+         std   DDRB,y     [B]=CRB:  PIA CB2 out high, PB slct, CB1 low to high, no IRQs
+         leas  -BootMem,s open up some space for variables
+         leau  ,s         point [U] to start of variables
+         ldb   #BootMem   number of bytes to clear
+         leax  ,u         point [X] to start of variables
+ClrLoop  clr   ,x+        initialize a byte to 0
+         decb             done yet?
+         bne   ClrLoop    no, go clear another byte
+         lda   #SelfTest  WD 1002-05 internal diagnostic command
+         lbsr  CmdUpdat   go issue WD command, ensure everything is ready...
+         bcs   ReadErr    error, go report it...
+         lda   #Restore!($0F&^HDStep) default to Restore with HD step rate
+         ldb   <D.WDBtDr  get boot drive number
+         cmpb  #$03       hard drive?
+         blo   SaveRstr   yes, go save HD Restore command...
+         inc   U.StSctr,u set start sector to 1 for floppy disks
+         lda   #Restore!($0F&^FDStep) get Restore with FD step rate
+SaveRstr sta   U.Restor,u
+         leax  SDHTable,pc
+         lda   b,x        get base SDH register
+         sta   U.SDH,u    save it...
+* restore head to track 0
+         lbsr  SetupTF    go update WD task files (except command)
+         lda   U.Restor,u load WD restore command code
+         lbsr  CmdUpdat   go issue WD command
+         bcs   ReadErr    error, go report it...
+* read cylinder 0, head 0, first sector
+         lbsr  GetSctr    go set up, issue read command
+         bcs   ReadErr    error, go report it...
+         bsr   LSN0Info   go get disk info from LSN0
+         ldd   U.BSZ,u    get boot file size/cylinder offset number
+         bne   ChkInfo    must be boot file size, go check other LSN0 info...
+         ldd   U.BT+1,u   get offset cylinder number
+         beq   ReadErr    must not be boot disk, go report error...
+         cmpd  #MaxCyls   offset cylinder number OK?
+         bhs   ReadErr    no, go return error...
+         std   U.CrtCyl,u save offset cylinder
+* read offset cylinder, head 0, first sector
+         lbsr  GetSctr    go set up, issue read command
+         bcs   ReadErr    error, go exit...
+         lbsr  LSN0Info   go get disk info from offset LSN0
+         ldd   U.BSZ,u    get boot file size
+         beq   ReadErr    must not be boot disk, go report error...
+* check LSN0 info
+ChkInfo  ldd   U.SPT,u    get sectors per track
+         beq   ReadErr    0 sectors per track, go return error
+         cmpd  #MaxSctrs  sectors per track OK?
+         bhi   ReadErr    no, go return error
+         lda   U.Sides,u  get disk sides (heads)
+         beq   ReadErr    0 sides, go return error
+         cmpa  #MaxHeads  number of heads OK?
+         bhi   ReadErr    no, go return error
+         mul              calculate sectors per cylinder
+         std   U.SPC,u    save sectors per cylinder
+         ldd   U.BSZ,u    get boot file size
+         addd  #$00FF     round up to even sector...
+         sta   U.BSct,u   save number of sectors in boot file
+* calculate boot file start cylinder, head, & sector
+         ldd   U.BT+1,u   get boot file LSN LSBs
+         ldx   U.CrtCyl,u get current (offset) cylinder number
+CylLoop  subd  U.SPC,u    subtract sectors/cylinder
+         blo   ChkBtMSB   [D] underflow, go check boot file LSN MSB
+CylLoop0 leax  1,x        increment current cylinder number
+         bne   CylLoop    no overflow, go do another subtraction
+ReadErr  ldb   #E$Read
+         coma             set Carry for error
+         leas  BootMem,s  restore stack pointer
+         rts   
+ChkBtMSB tst   U.BT,u     boot file LSN MSB = 0?
+         beq   GotCyl     yes, go determine head number
+         dec   U.BT,u     decrement boot file LSN MSB
+         bra   CylLoop0   go on...
+GotCyl   addd  U.SPC,u    restore sector number
+         stx   U.CrtCyl,u save current cylinder number
+TrkLoop  subd  U.SPT,u    subtract sectors/track
+         blo   GotSide    [D] underflow, go save current sector number
+         inc   U.CrtSid,u increment current side number
+         bra   TrkLoop    go do another subtraction
+GotSide  addd  U.SPT,u    restore sector number
+         stb   U.CrtSct,u save it
+* request boot file memory
+         pshs  u          save data pointer
+         ldd   U.BSZ,u    get boot file size
+         os9   F$SRqMem
+         tfr   u,x        move start address into [X]
+         puls  u          recover data pointer
+         bcs   BtExit0    go return F$SRqMem error
+         stx   U.BtStrt,u save boot file start address
+         ldd   U.CrtCyl,u get cylinder number
+         bra   ChkCyl     go check cylinder & get first sector
+
+* load boot file into memory
+BootLoad inc   U.CrtSct,u move on to next sector
+         lda   U.SPT+1,u  get sectors per track LSB (MSB is always 0)
+         cmpa  U.CrtSct,u done track?
+         bhi   LoadSctr   no, go get sector
+         clr   U.CrtSct,u reset current sector number to 0
+         inc   U.CrtSid,u move on to next side
+         lda   U.CrtSid,u get side number
+         cmpa  U.Sides,u  done cylinder?
+         blo   LoadSctr   no, go get sector
+         clr   U.CrtSid,u reset side number to 0
+         ldd   U.CrtCyl,u get cylinder number
+         addd  #1         move on to next cylinder
+         std   U.CrtCyl,u save cylinder number
+ChkCyl   cmpd  #MaxCyls   cylinder number OK?
+         bhs   ReadErr    no, go return error
+LoadSctr bsr   GetSctr    go get current sector from WD 1002-05
+         bcs   ReadErr    error, go exit
+         clrb             transfer 256 bytes
+         stb   PB,y       set WD sector buffer address
+ReadLoop lda   WDData,y   get byte from WD 1002-05
+         sta   ,x+        save byte to buffer
+         decb             done yet?
+         bne   ReadLoop   no, go get another byte
+         dec   U.BSct,u   count down boot file sectors remaining
+         bne   BootLoad
+         clrb             clear carry
+         ldd   U.BSZ,u    get boot file size
+         ldx   U.BtStrt,u get boot file start address
+BtExit0  leas  BootMem,s  restore stack pointer
+         rts   
+
+GetSctr  bsr   SetupTF    go set up WD task files (except command)
+         lda   #ReadSctr  load WD read sector command code
+CmdUpdat ldb   #CmdReg    load WD command register address
+         bsr   TFUpdat    go issue command...
+BusyWait ldb   #StatReg
+         stb   PB,y       set WD status register address
+BusyW0   ldb   WDData,y   get WD 1002-05 status
+         bitb  #%00000010 valid data?  (WD 1002-05 powered & connected?)
+         bne   BWErr      no, go report error...
+         tstb             ensure [CC] sign flag is current
+         bmi   BusyW0     yes, go check again
+         ldb   WDData,y   get valid controller status
+         rorb             rotate error bit into carry
+         bcc   NoError
+         ldb   #ErrReg
+         stb   PB,y       set WD error register address
+         ldb   WDData,y   get error register contents
+         bne   BWErr
+NoError  clrb  
+         rts   
+BWErr    comb             error, set [CC] Carry...
+         rts   
+
+SetupTF  ldd   #$01*256+SctrCnt single sector commands only
+         bsr   TFUpdat
+         lda   U.CrtCyl,u get current cylinder number MSB
+         ldb   #CylHigh
+         bsr   TFUpdat
+         lda   U.CrtCyl+1,u get current cylinder number LSB
+         ldb   #CylLow
+         bsr   TFUpdat
+         lda   U.CrtSct,u get current sector number
+         adda  U.StSctr,u add offset...
+         ldb   #SctrReg
+         bsr   TFUpdat
+         clrb             default extended head disabled
+         lda   U.CrtSid,u get current side (head) number
+         cmpa  #$08       extended head?
+         blo   StdHead    no, go on...
+         incb             set enable code
+         anda  #$07       mask out all but standard head number
+StdHead  stb   PA,y       set extended head enable/disable
+         ora   U.SDH,u    mask in base SDH copy
+         ldb   #SDHReg
+TfUpdat  stb   PB,y       set WD register address
+         sta   WDData,y   write data to WD 1002-05
+         rts   
+
+* pad Boot module out to $01D0 exactly
+Pad      fill  $39,$1D0-3-*
+
+         emod  
+BEnd     equ   *
+         end   
+