Mercurial > hg > Members > kono > nitros9-code
diff level2/modules/ramd_coco3fpga.asm @ 3150:37737e5ec640
Add coco3fpga RAM disk and RTC driver
Added clock2_coco3fpga.as to level1/modules.
Added ramd_coco3fpga.asm & r0_ramd_coco3fpga.asm to level2/modules.
Build them on level2/coco3.
Added definitions to "coco3/modules/makefile" to build
'ramd_coco3fpga.dr", "r0_ramd_cocofga.dd" & "clock2_coco3fpga".
author | Bill Pierce <merlinious999@gmail.com> |
---|---|
date | Mon, 06 Feb 2017 22:25:15 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/level2/modules/ramd_coco3fpga.asm Mon Feb 06 22:25:15 2017 +0100 @@ -0,0 +1,217 @@ +******************************************************************** +* RAMD SDRAM Disk Driver for CoCo3FPGA +* +* $Id: ramd.asm,v 1.0 2016/12/09 14:52:42 gbecker Exp $ +* +* Ed. Comments Who YY/MM/DD +* ------------------------------------------------------------------ +* 1 Initial driver Gary Becker 16/12/09 +* +* 2 Updated to conform to NitrOS9 Repo Bill Pierce 17/02/04 +* + +* $FF84: SDRAM Control Register (Write) +RAMDCON equ $00 +* Bit Signal +* 0 R/W +* +* $FF84: Disk Flag (Read) +RAMDSTA equ $00 +* Bit Signal +* 7 Operation Finished +* 0 R/W +* $FF85-$FF86: DATA (Read / Write) +RAMDDAT equ $01 +* +* $FF87-88: Block Address +RAMDADD equ $03 +* +N.Drives equ 1 number of drives to support +* +* Command equates +* +* + nam RAMD + ttl os9 device driver + + use os9.d + use rbf.d + use coco.d + +tylg set Drivr+Objct +atrv set ReEnt+rev +rev set $01 + + org 0 + mod eom,name,tylg,atrv,start,size + fcb $ff + +u0000 rmb DRVBEG+(DRVMEM*N.Drives) + +size equ . + + fcb $FF This byte is the driver permissions +name fcs /RAMD/ + fcb 1 edition #1 + +start bra INIT 3 bytes per entry to keep RBF happy + nop + bra READ + nop + bra WRITE + nop + bra GETSTA + nop + bra SETSTA + nop + bra TERM + nop + +* Read +* +* Entry: +* B = MSB of LSN +* X = LSB of LSN +* Y = address of path descriptor +* U = address of device memory area +* +* Exit: +* CC = carry set on error +* B = error code +* +READ lda #$01 1=READ the sector + tstb Make sure 3rd byte of LSN is 0 + bne ERROR + pshs x,y Save these registers for later + tst ,s Check high bit of X (Low 16 bits of LSN) + bmi ERROR2 Should equal 0 + bsr GetSect Go read the sector + puls x,y + tfr x,d + tstb Test one byte of saved X + bne TERM + tsta Test other byte of saved X + bne TERM +* LSN0, standard OS-9 format + ldy PD.BUF,y address of buffer + leau DRVBEG,u point to the beginning of the drive tables + ldb #DD.SIZ copy bytes over +copy.0 lda ,y+ grab from LSN0 + sta ,u+ save into device static storage + decb Finished when B=0 + bne copy.0 + bra TERM Return + +* +* Entry: +* B = MSB of LSN +* X = LSB of LSN +* Y = address of path descriptor +* U = address of device memory area +* +* Exit: +* CC = carry set on error +* B = error code +* +GetSect +* orcc #IntMasks Kill interrupts + pshs x save 2 byte LSN + ldx V.PORT,u get address of hardware + sta RAMDCON,x Setup for a READ + puls d Get 2 byte LSN + std RAMDADD,x Put it in the address + ldy PD.BUF,y address of buffer + lda #$80 128 2 byte transfers + pshs a On stack + lda RAMDDAT+1,x Start transfer +LP0 tst RAMDSTA,x Is transfer completed? + bpl LP0 + ldd RAMDDAT,x Yes, read 2 bytes from RAM + std ,y++ Store them in buffer + dec ,s Are we finished? + bne LP0 No + puls b clear b +* andcc #^(IntMasks) Renable Interrupts + rts + +ERROR2 puls x,y +ERROR ldb E$SeekRg Only error is Seek out of Range + comb Set carry bit + rts + +* Init +* +* Entry: +* Y = address of device descriptor +* U = address of device memory area +* +* Exit: +* CC = carry set on error +* B = error code +* +INIT + leax DRVBEG,u point to the beginning of the drive tables + ldd #$8000 Number of total sectors + stb DD.TOT,x $00 + std DD.TOT+1,x $8000 + ldd #$0100 A=$01 B=$00 + stb V.NDRV,u $01 +* lda #$FF Probably not needed +* sta V.TRAK,u + +TERM +* no SetSta calls - return, no error, ignore +SETSTA +* no GetSta calls - return, no error, ignore +GETSTA + andcc #^Carry clear carry + rts + +* +* Entry: +* B = MSB of LSN +* X = LSB of LSN +* Y = address of path descriptor +* U = address of device memory area +* +* Exit: +* CC = carry set on error +* B = error code +* +WRITE clra 0 =WRITE to disk + tstb Make sure 3rd byte of LSN is 0 + bne ERROR + pshs x,y Save these registers for later + tst ,s Check high bit of X (Low 16 bits of LSN) + bmi ERROR2 Should equal 0 +* Get Sector comes here with: +* Entry: A = read/write command code (0/1) +* B = MSB of the disk's LSN +* X = LSW of the disk's LSN +* Y = path dsc. ptr +* U = Device static storage ptr +* Exit: CC = carry set on error +* A = error status from command register +PutSect +* orcc #IntMasks Kill interrupts + ldx V.PORT,u get address of hardware + sta RAMDCON,x Setup for a READ + ldy PD.BUF,y address of buffer + puls d Get 2 byte LSN + std RAMDADD,x Put it in the address + lda #$80 128 2 byte transfers + pshs a On stack +LP2 ldd ,y++ get 2 bytes + std RAMDDAT,x write them to th RAM +LP1 tst RAMDSTA,x is the transfer completed? + bpl LP1 + dec ,s + bne LP2 + puls b clear b + puls y +* andcc #^(IntMasks) Renable Interrupts + bra TERM + + emod + +eom equ * \ No newline at end of file