-; Various functions for the Interaction with the CPM Filesystem
+; RAM disk driver
;
-; Copyright (C) 2010 Frank Zoll
+; Copyright (C) 2010 Leo C.
;
; This file is part of avrcpm.
;
; $Id$
;
-#ifndef RAMDSK_SUPPORT
- #define RAMDSK_SUPPORT 0
+#ifndef RAMDISKCNT
+ #define RAMDISKCNT 0
#endif
-#if RAMDSK_SUPPORT
+#if RAMDISKCNT
+
+#if DRAM_8BIT
+
+; -------------- RAM disk (8-bit DRAM) --------------
+
+ .dseg
+rdskbuf:
+ .byte 32
+
+ .cseg
+; ----------------------------------------------
+
+rdsk_adr:
+ ldi zl,0
+ lds zh,seeksec
+ lds temp2,seektrk
+ lsr zh
+ ror zl ;Col 0..7
+
+ mov temp,temp2
+ andi temp,0x0f
+ swap temp
+ or zh,temp ;Row 0..7
+
+ ldi yl,~((1<<RAM_A10)|(1<<RAM_A9)|(1<<RAM_A8)) ;Col 8..10
+ mov yh,yl ;Row 8..10
+ lds temp,seekdsk
+ subi temp,RAMDISKNR
+
+ sbrc temp2,4
+ sbr yl,(1<<RAM_A8)
+ sbrc temp2,5
+ sbr yh,(1<<RAM_A8)
+ sbrc temp2,6
+ sbr yl,(1<<RAM_A9)
+ sbrc temp2,7
+ sbr yh,(1<<RAM_A9)
+ sbrc temp,0
+ sbr yl,(1<<RAM_A10)
+ sbrc temp,1
+ sbr yh,(1<<RAM_A10)
+ ret
+
+;----------------------------------------------
+
+rdsk_read:
+ lds xl,dmaadr
+ lds xh,dmaadr+1
+ rcall rdsk_adr
+ ldi temp3,4
+rdsk_rdlo:
+; cli
+ out PORTB,yh ; Row 8..10
+ out PORTD,zh ; Row 0..7
+ out PORTC,_RAS0
+ out PORTB,yl ;1 Col 8..10
+ push yh
+ push yl
+
+ ldi yl,low (rdskbuf)
+ ldi yh,high(rdskbuf)
+ ldi temp2,32
+rdsk_rdli:
+ out PORTD,zl ;1 Col 0..7
+ out PORTC,_CAS0 ;1
+ out DDRD,_0 ;1
+ out PORTC,_OE ;1
+ inc zl ;1
+ dec temp2 ;1
+ dram_wait DRAM_WAITSTATES ;
+ in temp,PIND ;1
+ out PORTC,_RAS0 ;1
+ out DDRD,_255 ;1
+ st y+,temp ;2
+ brne rdsk_rdli ;2 --> 12 * 128 = 1536 = 77µs
+ out PORTC,_255 ;1
+; sei
+ out PORTB,_255 ;1
+
+ ldi yl,low (rdskbuf)
+ ldi yh,high(rdskbuf)
+ ldi temp2,32
+rdsk_rdstl:
+ ld temp,y+ ;2
+ mem_write_d x ;14 (?)
+ adiw x,1 ;2 --> 18 * 128 = 2304 = 115µs
+ dec temp2
+ brne rdsk_rdstl
+ pop yl
+ pop yh
+ dec temp3
+ brne rdsk_rdlo
+ ret
+
+
+rdsk_write:
+ lds xl,dmaadr
+ lds xh,dmaadr+1
+ rcall rdsk_adr
+ ldi temp3,4
+ push yh
+ push yl
+rdsk_wrlo:
+ ldi yl,low (rdskbuf)
+ ldi yh,high(rdskbuf)
+ ldi temp2,32
+rdsk_wrldl:
+ mem_read_s x
+ st y+,temp
+ adiw x,1
+ dec temp2
+ brne rdsk_wrldl
+
+ pop yl
+ pop yh
+ push yh
+ push yl
+ ldi temp2,32
+; cli
+ out PORTB,yh
+ out PORTD,zh
+ out PORTC,_RAS0
+ out PORTB,yl ;1
+ ldi yl,low (rdskbuf)
+ ldi yh,high(rdskbuf)
+rdsk_wrli:
+ out PORTD,zl
+ out PORTC,_CAS0
+ ld temp,y+
+ out PORTD,temp
+ out PORTC,_WE
+ out PORTC,_RAS0
+ inc zl
+ dec temp2
+ brne rdsk_wrli
+
+ out PORTC,_255
+; sei
+ out PORTB,_255
+ dec temp3
+ brne rdsk_wrlo
+ pop yl
+ pop yh
+ ret
+
+#else /* 4-bit DRAM */
+
;-------------------------------------- Defines for RAMDISK Structures
or xh,temp ;Row 0..7
ldiw z,rdskbuf
- ldi temp3,128
+ ldi temp3,128
DRAM_SETADDR xh, ~0,(1<<ram_ras), ~0,(1<<ram_a8)|(1<<ram_oe)
cbi P_RAS,ram_ras
.if DISK_DEBUG > 1
+ printstring " "
mov temp,xh
rcall printhex
printstring " "
ret
-#else
+
+#endif /* DRAM_8BIT */
+
+
+#else /* no ram disk */
rdsk_read:
ret
rdsk_add_partition:
ret
-#endif
+#endif /* RAMDISKCNT */
+