diff 3rdparty/booters/boot_tc3.asm @ 45:2ce754e62499

Moved booters to 3rdparty directory
author boisy
date Sat, 20 Apr 2002 13:36:45 +0000
parents
children 02a065f8428c
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/3rdparty/booters/boot_tc3.asm	Sat Apr 20 13:36:45 2002 +0000
@@ -0,0 +1,296 @@
+********************************************************************
+* Boot - Cloud-9 TC3 Boot module
+*
+* $Id$
+*
+* This module allows booting from a hard drive that uses RGB-DOS
+* and is controlled by a Cloud-9 TC3 SCSI controller.
+*
+* Ed.    Comments                                       Who YY/MM/DD
+* ------------------------------------------------------------------
+* 1      Original Roger Krupski distribution version
+* 1b     Added code to allow booting from any sector    BGP 96/??/??
+*        size hard drive
+
+
+         nam   Boot
+         ttl   Cloud-9 TC3 Boot module
+
+         ifp1
+         use   defsfile
+         endc
+
+tylg     set   Systm+Objct
+atrv     set   ReEnt+rev
+rev      set   2
+edition  set   1
+
+* Hard Disk Interface registers for the TC3
+dataport equ   $FF76
+status   equ   dataport+1
+select   equ   dataport+1
+
+* Status register equates
+req      equ   1
+busy     equ   2
+msg      equ   4
+cmd      equ   8
+inout    equ   $10
+ack      equ   $20
+sel      equ   $40
+rst      equ   $80
+
+*SCSI common command set
+c$rstr   equ   1
+c$rdet   equ   3
+c$rblk   equ   8
+c$wblk   equ   10
+
+* Optional command
+c$ststop equ   $1b                     park head
+
+* misc
+errsta   equ   2
+bsybit   equ   8
+
+****************************************************
+bootdrv  equ   0
+****************************************************
+
+         mod   eom,name,tylg,atrv,start,size
+
+* Data equates; subroutines must keep data in stack
+v$cmd    rmb   1
+v$addr0  rmb   1
+v$addr1  rmb   2
+v$blks   rmb   1
+v$opts   rmb   1
+v$error  rmb   4
+
+blockloc rmb   2                       pointer to memory requested
+blockimg rmb   2                       duplicate of the above
+bootloc  rmb   3                       sector pointer; not byte pointer
+bootsize rmb   2                       size in bytes
+size     equ   .
+
+name     fcs   /Boot/
+         fcb   edition
+
+start    clra
+         ldb   #size
+clean    pshs  a
+         decb
+         bne   clean
+         tfr   s,u                     get pointer to data area
+         pshs  u                       save pointer to data area
+
+         lda   #$d0                    forced interrupt; kill floppy activity
+         sta   $FF48                   command register
+         clrb
+pause    decb
+         bne   pause
+         lda   $FF48                   clear controller
+         clr   $FF40                   make sure motors are turned off
+         sta   $FFD9                   fast clock
+
+* Recalibrate hard drive
+         lbsr  restore
+
+* Request memory for LSN0
+         ldd   #1
+         os9   F$SRqMem                request one page of RAM
+         bcs   error
+         bsr   getpntr
+
+* Get LSN0 into memory
+         clrb                          MSB sector
+         ldx   #0                      LSW sector
+         bsr   mread
+         bcs   error
+         ldd   bootsize,u
+         beq   error
+         pshs  d
+
+* Return memory
+         ldd   #$100
+         ldu   blockloc,u
+         os9   F$SRtMem
+         puls  d
+         os9   F$BtMem
+         bcs   error
+         bsr   getpntr
+         std   blockimg,u
+
+* Get os9boot into memory
+         ldd   bootsize,u
+         leas  -2,s                    same as a PSHS D
+getboot  std   ,s
+         ldb   bootloc,u               MSB sector location
+         ldx   bootloc+1,u             LSW sector location
+         bsr   mread
+         ldd   bootloc+1,u             update sector location by one to 24bit word
+         addd  #1
+         std   bootloc+1,u
+         ldb   bootloc,u
+         adcb  #0
+         stb   bootloc,u
+         inc   blockloc,u              update memory pointer for upload
+         ldd   ,s                      update size of file left to read
+         subd  #$100                   file read one sector at a time
+         bhi   getboot
+
+         leas  4+size,s                reset the stack    same as PULS U,D
+         ldd   bootsize,u
+         ldx   blockimg,u              pointer to start of os9boot in memory
+         andcc #^Carry                 clear carry
+         rts                           back to os9p1
+
+error    leas  2+size,s
+         ldb   #E$NotRdy               drive not ready
+         rts
+
+getpntr  tfr   u,d                     save pointer to requested memory
+         ldu   2,s                     recover pointer to data stack
+         std   blockloc,u
+         rts
+
+mread    tstb
+         bne   read10
+         cmpx  #0
+         bne   read10
+         bsr   read10
+         bcc   readlsn0
+         rts
+
+readlsn0 pshs  a,x,y
+         ldy   blockloc,u
+         lda   DD.Bt,y                 os9boot pointer
+         ldx   DD.Bt+1,y               LSW of 24 bit address
+         sta   bootloc,u
+         stx   bootloc+1,u
+         ldx   DD.BSZ,y                os9boot size in bytes
+         stx   bootsize,u
+         clrb
+         puls  a,x,y,pc
+
+* Generic read
+read10   lda   #c$rblk
+         bsr   setup
+         bra   command
+
+setup    pshs  b
+         sta   v$cmd,u
+         stb   v$addr0,u
+         stx   v$addr1,u
+         ldb   #1
+         stb   v$blks,u
+         clr   v$opts,u
+         puls  b,pc
+
+wakeup   ldx   #0
+wake     lda   status
+         bita  #busy+sel
+         beq   wake1
+         leax  -1,x
+         bne   wake
+         bra   wake4
+wake1    bsr   wake3
+         lda   #1			SCSI ID!
+         sta   dataport
+         bsr   wake3
+         sta   select
+         ldx   #0
+wake2    lda   status
+         bita  #busy
+         bne   wake3
+         leax  -1,x
+         bne   wake2
+wake4    leas  2,s
+         comb
+         ldb   #E$NotRdy
+wake3    rts
+
+command  bsr   wakeup
+         leax  v$cmd,u
+         bsr   send
+         bsr   waitrq
+         bita  #cmd
+         bne   getsta
+         ldx   blockloc,u
+         bsr   read
+getsta   bsr   instat
+         bita  #bsybit
+         bne   command
+         bita  #errsta
+         beq   done
+         comb
+done     rts
+
+send     bsr   waitrq
+         bita  #cmd
+         beq   done
+         bita  #inout
+         bne   done
+         lda   ,x+
+         sta   dataport
+         bra   send
+
+waitrq   pshs  b,x
+wait10   lda   status
+         bita  #req
+         beq   wait10
+         puls  b,x,pc
+
+* Patch to allow booting from sector sizes > 256 bytes - BGP 08/16/97
+* We ignore any bytes beyond byte 256, but continue to read them from
+* the dataport until the CMD bit is set.
+read
+* next 2 lines added
+         clrb                          +++ use B as counter
+read2
+         bsr   waitrq
+         bita  #cmd
+         bne   done
+         lda   dataport
+         sta   ,x+
+* next line commented out and next 8 lines added
+* bra read
+         incb                          +++
+         bne   read2                   +++
+read3
+         bsr   waitrq                  +++
+         bita  #cmd                    +++
+         bne   done                    +++
+         lda   dataport                +++
+         bra   read3                   +++
+
+instat   bsr   waitrq
+         lda   dataport
+         anda  #%00001111
+         pshs  a
+         bsr   waitrq
+         clra
+         sta   dataport
+         puls  a,pc
+
+restore  lda   #c$rstr
+         clrb
+         ldx   #0
+         lbsr  setup
+         clr   v$blks,u
+         bra   command
+
+* Fillers to get to $1D0
+         fcc   /9999999999/
+         fcc   /9999999999/
+         fcc   /9999999999/
+         fcc   /9999999999/
+         fcc   /9999999999/
+         fcc   /9999999999/
+         fcc   /9999999999/
+         fcc   /9999999999/
+         fcc   /99999999/
+
+         emod
+
+eom      equ   *