Mercurial > hg > Members > kono > nitros9-code
changeset 280:a1145468aca1
moved to booters dir
author | boisy |
---|---|
date | Sun, 21 Jul 2002 07:14:58 +0000 |
parents | 20e8c354b914 |
children | dc8e5781c23f |
files | 3rdparty/drivers/ide/boot_ide.asm |
diffstat | 1 files changed, 0 insertions(+), 265 deletions(-) [+] |
line wrap: on
line diff
--- a/3rdparty/drivers/ide/boot_ide.asm Sun Jul 21 07:13:05 2002 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,265 +0,0 @@ -******************************************************************** -* Boot - IDE Boot module -* -* $Id$ -* -* Ed. Comments Who YY/MM/DD -* ------------------------------------------------------------------ -* 1 Created BGP 99/05/11 - - - nam Boot - ttl Ken-Ton Boot module - - ifp1 - use defsfile - use rbfdefs - endc - -tylg set Systm+Objct -atrv set ReEnt+rev -rev set 0 -edition set 1 - -dataport equ $FF76 - - mod eom,name,tylg,atrv,start,size - -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 - bsr Init - -* 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 #%11111110 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 - -* Initialize IDE interface -Init ldx #$1500 - ldy hwport,pc -RdyIni1 tst 7,y Wait for drive ready - bpl GoInit - leax -1,x - bne RdyIni1 - lbeq ENotRdy Timed out ... give up on drive - -GoInit ldd #$AF20 Drive is ready -- initialize -* For IDE command $91, DrvHd reg = 101xhhhh binary - sta 6,y $10 heads (x=0-master/1-slave; hhhh=#heads) - stb 2,y $20 sectors/track - lda #$91 - sta 7,y Give drive the Init Drive Parameters IDE command -RdyIni2 tst 7,y - bmi RdyIni2 Wait *forever* until drive is ready - clrb - rts -ENotRdy comb - ldb #E$NotRdy - rts - -* -* READ -* -* B = MSB of OS-9 disk LSN -* X = LSB of OS-9 disk LSN -* -read10 lbsr SetIDE - bcs Ret - leax ,u - lda #$20 - pshs a - ldy hwport,pc -ReadLp lda ,y - ldb ,y - std ,x++ - lda ,y - ldb ,y - std ,x++ - lda ,y - ldb ,y - std ,x++ - lda ,y - ldb ,y - std ,x++ - dec ,s - bne ReadLp - puls a - -* -* After read or write, check drive status -* Return value = CC, true=error, false=OK -* -WaitOK lda #$80 Is DRQ still true? Just one check necessary - ldy hwport,pc - bita 7,y If it is, sector isn't fully transferred - bne WaitOK - lda #$01 Wait *forever* for drive ready - bita 7,y - bne CmdErr - clrb Nope -- clear CC - rts -CmdErr comb Yep -- set CC - rts - -* -* Setup IDE read or write operation -* trashes D and X -* -SetIDE pshs b,x - ldx #$A000 -CmdLp1 ldy hwport,pc - tst 7,y - bpl SetRdy Should go to ChkDRDY ????? - leax -1,x - bne CmdLp1 - puls b,x - bra ENotRdy - -SetRdy lda 2,s Sector first - anda #$1F - adda #$01 - sta 3,y Store calculated sector number - puls x - tfr x,d - rolb - rola - rolb - rola - rolb - rola - anda #$0F - ora #$A0 - sta 6,y Store calculated drive number - ldd ,s Last, the cylinder number (2-bytes) - rora - rorb - anda #$7F - sta 5,y Store calculated CylHi - stb 4,y Store calculated CylLo - lda #$01 - sta 2,y Sector count = 1 - ldb #$20 - stb 7,y Lastly, push the command to the drive - ldb #$40 - lda #$08 Wait for Drive ready -CmdLp2 bita 7,y - bne CmdDone - decb - bne CmdLp2 - ldx #$0001 If we time out, sleep 1 tick, then loop *forever* - os9 F$Sleep -CmdLp3 bita 7,y - beq CmdLp3 -CmdDone puls b,x - clrb All right, drive ready -- return - rts - -* 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 *