diff level1/modules/boot_wd1002.asm @ 1187:df263e490f85

New booters added (moved from 3rdparty/booters)
author boisy
date Fri, 30 May 2003 21:11:42 +0000 (2003-05-30)
parents
children 10957d54bf16
line wrap: on
line diff
--- /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   
+