ingoldsby@calgary.UUCP (11/06/86)
Very soon now (my birthday is on Nov. 7) I hope to be the
proud owner of a CoCo III. Since RS, in their infinite wisdom have
decided not to release OS9 Level II until February, we need some
software to take advantage of the extra RAM in the CoCo III in
the meantime. A true hacker and OS9 wizard friend of mine has
written a RAMdisk driver for public use. Here follows the source
and installation instructions.
Terry Ingoldsby
...ihnp4!alberta!calgary!ingoldsby
Here is a ramdisk driver for the coco3. It consists of
the device descriptor "tmp" and the driver "ccrdisk"
assemble the following two files and put them in /d0/cmds
(or in your boot file), then load them up, and format "/tmp"
*before* accessing that directory. You should get 56K of
free space.
Installation notes:
- when assembling, be liberal with memory... give asm about 12K to
work with!
- you only need to format /tmp when you are powering up, if you
are only rebooting, don't bother with formatting, the ramdisk
will survive the reboot.
- i recommend putting "tmp" and "ccrdisk" in the boot file; the idea
is that since the ramdisk will get a lot of use, it might as well
be in there.
- don't rely on the ramdisk too much. If you happen to write a
program which 'features' a wild pointer, it is *possible* to
screw up the ramdisk, but this is not too likely since the ramdisk
is not usually in the address space of the cpu; so your program
must be mucking around with the MMU before it can access the
ramdisk content. There may be a way to safeguard against this,
but until i find out more about the GIME, i can't say.
----- file: tmp (device descripor) -----
*
* Copyright 1986 by Caveh Jalali
* Permission granted to use, distribute and modify
* for non profit use only and only if this
* copyright notice is included
*
*
* NOTE:
* page $35 gets munged by a reset, so it is not used by the ramdisk.
* due to this, you only get 56K of usable ramdisk space. this area seems
* not to be affected by rebooting os9; even if you have to go back to basic
* to type 'dos'
*
* the base is $060000 on 128K machines, $000000 for 512K
* ioman only copies 2 bytes, so the actual value to be
* stored in it.port is the (base addr)/256
*
mod modsiz,modnam,$f1,$81,fileman,driver
fcb $ff -mode
fcb $00,$06,$00
fcb $0f itbl size
fcb 1 rbf device
fcb 0 drive 0
fcb $00 step rate
fcb $20 dev type
fcb $01 double dens
* 7 cyl on 128K machines, 55 on 512K
* each cyl is one page
fdb 7 cylinders
fcb 1 sides
fcb 1 0=verify
fdb 32 se/tr
fdb 32 se/tr0
fcb 1 interleave
fcb $10 min seg alloc
modnam fcs "tmp"
fcb 3
driver fcs "ccrdisk"
fileman fcs "rbf"
emod
modsiz equ *
end
----- end of tmp ---
----- file: ccrdisk (the device driver) -----
*
* Copyright 1986 by Caveh Jalali
* permission granted to use, distribute and modify
* for non profit use only.
*
ifp1
use /d0/defs/os9defs
use /d0/defs/rbfdefs
MMU0 equ $ffa0
RAMBASE equ $0000
MAGICPG equ $34 (this page gets munged on reset)
endc
org DRVBEG
drivetbl equ .
rmb DRVMEM
savemmu0 rmb 1
savestk rmb 2
count rmb 1
physbase rmb 1
track rmb 1
rdbuf rmb 2
ramsiz equ .
mod modsiz,modnam,$e1,$81,entry,ramsiz
fcb $FF
modnam fcs 'ccrdisk'
fcb 3
********************
entry
lbra init
lbra read
lbra write
lbra getstt
lbra setstt
lbra term
********************
init
leax drivetbl,u
ldd #$0001
sta dd.tot,x
stb dd.tot+2,x
lda #1
sta v.ndrv,u
ldd v.page+1,u (base is / 256)
lslb
rola
lslb
rola
lslb
rola
sta physbase,u
clrb
rts
********************
read
* stu >$f0 debugging
pshs dp,y
exg d,u
tfr a,dp
exg d,u
leau drivetbl,u
bsr doseek
bcs read.q
pshs x
ldx rdbuf
ldy pd.buf,y
bsr scopy
ldx ,s++
bne read.e
ldx 1,s
ldx pd.buf,x
ldb #dd.siz
next.14
lda b,x
sta b,u
decb
bpl next.14
read.e
clrb
read.q
puls dp,y,pc
********************
write
pshs dp,y
exg d,u
tfr a,dp
exg d,u
leau drivetbl,u
bsr doseek
bcs write.q
ldx pd.buf,y
ldy rdbuf
bsr scopy
clrb
write.q
puls dp,y,pc
********************
* copy ,x to ,y
scopy
pshs cc,d,x,y,u
sts savestk
orcc #$50
lda mmu0
sta savemmu0
lda track
sta mmu0
* clrb
*scpy.2
* lda ,x+
* sta ,y+
* decb
* bne scpy.2
leas ,x
leau 252,y
lda #14
sta count
scpy.2
puls d,x,y
pshu d,x,y
puls d,x,y
pshu d,x,y
puls d,x,y
pshu d,x,y
dec count
bne scpy.2
leau 256,u
puls d,x
pshu d,x
lda savemmu0
sta mmu0
lds savestk
puls cc,d,x,y,u,pc
********************
doseek
pshs d
tstb
bne e.lsn
cmpx dd.tot+1,u
bhs e.lsn
tfr x,d
tfr b,a
lsrb
lsrb
lsrb
lsrb
lsrb
addb physbase
cmpb #MAGICPG (skip over this one!)
blo doseek.2
incb
doseek.2
stb track
anda #$1f
clrb
adda #RAMBASE/256
std rdbuf
clrb
puls d,pc
e.lsn
comb
puls d
ldb #e$sect
rts
********************
setstt
ldx pd.rgs,y
ldb r$b,x
cmpb #ss.reset
beq zz.reset
cmpb #ss.wtrk
beq zz.wtrk
comb
ldb #e$unksvc
rts
zz.reset
zz.wtrk
term
clrb
rts
getstt
comb
ldb #e$unksvc
rts
********************
emod
modsiz
end
----- end ccrdisk -----
That's all folks.