Mercurial > hg > Members > kono > nitros9-code
changeset 732:339845ea3507
Backported rammer.asm from NitrOS-9 to OS-9 Level Two
author | boisy |
---|---|
date | Sun, 05 Jan 2003 22:45:08 +0000 |
parents | bd7c8348adec |
children | 26d34f1c5aeb |
files | level2/modules/makefile level2/modules/r0.asm level2/modules/rammer.asm |
diffstat | 3 files changed, 363 insertions(+), 17 deletions(-) [+] |
line wrap: on
line diff
--- a/level2/modules/makefile Sun Jan 05 21:48:33 2003 +0000 +++ b/level2/modules/makefile Sun Jan 05 22:45:08 2003 +0000 @@ -22,7 +22,7 @@ clock_smart clock_harris clock_tc3 clock_soft FMGRS = scf.mn rbf.mn pipeman.mn pipeman_named.mn DRIVERS = cc3disk.dr cc3hdisk.dr cc3io.dr modpak.dr \ - vrn.dr piper.dr printer.dr sio.dr ram.dr sspak.dr \ + vrn.dr piper.dr printer.dr sio.dr rammer.dr sspak.dr \ sacia.dr dacia.dr IOSUBS = windint.io vdgint.io keydrv joydrv_joy \ joydrv_6551L joydrv_6552L joydrv_6551M joydrv_6552M snddrv @@ -107,29 +107,29 @@ $(AS) $< $(ASOUT)$@ $(AFLAGS) $(DSDD80) -aDNum=2 # RAM Disk descriptors -r0_8k.dd: rx.asm - $(AS) $< $(ASOUT)$@ $(AFLAGS) -aSectors=32 +r0_8k.dd: r0.asm + $(AS) $< $(ASOUT)$@ $(AFLAGS) -aRAMSize=8 -ddr0_8k.dd: rx.asm - $(AS) $< $(ASOUT)$@ $(AFLAGS) -aSectors=32 -aDD=1 +ddr0_8k.dd: r0.asm + $(AS) $< $(ASOUT)$@ $(AFLAGS) -aRAMSize=8 -aDD=1 -r0_96k.dd: rx.asm - $(AS) $< $(ASOUT)$@ $(AFLAGS) -aSectors=384 +r0_96k.dd: r0.asm + $(AS) $< $(ASOUT)$@ $(AFLAGS) -aRAMSize=96 -ddr0_96k.dd: rx.asm - $(AS) $< $(ASOUT)$@ $(AFLAGS) -aSectors=384 -aDD=1 +ddr0_96k.dd: r0.asm + $(AS) $< $(ASOUT)$@ $(AFLAGS) -aRAMSize=96 -aDD=1 -r0_128k.dd: rx.asm - $(AS) $< $(ASOUT)$@ $(AFLAGS) -aSectors=512 +r0_128k.dd: r0.asm + $(AS) $< $(ASOUT)$@ $(AFLAGS) -aRAMSize=128 -ddr0_128k.dd: rx.asm - $(AS) $< $(ASOUT)$@ $(AFLAGS) -aSectors=512 -aDD=1 +ddr0_128k.dd: r0.asm + $(AS) $< $(ASOUT)$@ $(AFLAGS) -aRAMSize=128 -aDD=1 -r0_192k.dd: rx.asm - $(AS) $< $(ASOUT)$@ $(AFLAGS) -aSectors=768 +r0_192k.dd: r0.asm + $(AS) $< $(ASOUT)$@ $(AFLAGS) -aRAMSize=192 -ddr0_192k.dd: rx.asm - $(AS) $< $(ASOUT)$@ $(AFLAGS) -aSectors=768 -aDD=1 +ddr0_192k.dd: r0.asm + $(AS) $< $(ASOUT)$@ $(AFLAGS) -aRAMSize=192 -aDD=1 cc3go_rom: cc3go.asm $(AS) -aROM=1 $(AFLAGS) $< $(ASOUT)$@
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/level2/modules/r0.asm Sun Jan 05 22:45:08 2003 +0000 @@ -0,0 +1,54 @@ +******************************************************************** +* R0 - RAMMER Device Descriptor +* +* $Id$ +* +* Ed. Comments Who YY/MM/DD +* ------------------------------------------------------------------ +* NitrOS-9 2.00 distribution + + nam R0 + ttl RAMMER Device Descriptor + + ifp1 + use defsfile + endc + +tylg set Devic+Objct +atrv set ReEnt+rev +rev set $01 + +RAMSize set 128 +SAS set 4 + + mod eom,name,tylg,atrv,mgrnam,drvnam + + fcb DIR.+SHARE.+PREAD.+PWRIT.+PEXEC.+READ.+WRITE.+EXEC. mode byte + fcb HW.Page extended controller address + fdb $FFE0 physical controller address + fcb initsize-*-1 initilization table size + fcb DT.RBF device type:0=scf,1=rbf,2=pipe,3=scf + fcb $00 drive number + fcb $00 step rate + fcb $20 drive device type + fcb $01 media density:0=single,1=double + fdb RAMSize + fcb $01 number of sides + fcb $01 verify disk writes:0=on + fdb 4 # of sectors per track + fdb 4 # of sectors per track (track 0) + fcb $01 sector interleave factor + fcb SAS minimum size of sector allocation +initsize equ * + + IFNE DD +name fcs /DD/ + ELSE +name fcs /R0/ + ENDC +mgrnam fcs /RBF/ +drvnam fcs /Rammer/ + + emod +eom equ * + end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/level2/modules/rammer.asm Sun Jan 05 22:45:08 2003 +0000 @@ -0,0 +1,292 @@ +******************************************************************** +* Rammer - OS-9 Level Two RAM Disk +* +* $Id$ +* +* Alan DeKok's version of RAMMER - Based on original Keving Darling version +* +* Ed. Comments Who YY/MM/DD +* ------------------------------------------------------------------ +* 4 Original Kevin Darling Version +* 5 Several changes by L. Curtis Boyle LCB 00/03/14 +* 1) Allowed driver to go past 400K 00/05/09 +* 2) Attempted some fixes for handling /MD, so +* that setting vfy=0 on /R0 would not +* completely crash the system. +* 3) Fixed some error reporting bugs that would +* crash the system +* 4) Moved entry table to between READ/WRITE to +* allow short branches to both +* +* NOTE: For some reason, when DEINIZing /r0, the INIT routine gets called... +* but it still deallocates memory! + +* Following CAN be set higher, but will take another page of system RAM then. +* 200 will allow maximum of 1,638,400 byte RAM drive. +MAXBLOCK set 201 Maximum # of MMU blocks allowed in RAM drive + + nam Rammer + ttl OS-9 Level Two RAM Disk + + ifp1 + use defsfile + use rbfdefs + endc + +tylg set Drivr+Objct +atrv set ReEnt+rev +rev set $02 +edition set 5 + + mod eom,name,tylg,atrv,start,size + +* Device mem stuff - can make MMUTable bigger, but will take 2 pages of system +* RAM then for device memory +u0000 rmb DRVBEG+DRVMEM Reserve room for 1 entry drive table +MDFlag rmb 1 0=R0 descriptor, <>0=MD descriptor +numofBlk rmb 1 # of MMU blocks allocated for RAM drive +MMUTable rmb MAXBLOCK Table of MMU Block #'s being used. +size equ . + + fcb DIR.+SHARE.+PREAD.+PWRIT.+PEXEC.+READ.+WRITE.+EXEC. + +name fcs /Rammer/ + fcb edition + +* Terminate routine - deallocates RAM +L0024 lda <numofBlk,u Get # blocks we had allocated + beq L003D If none, exit + leay <MMUTable,u Point to MMU block table + IFNE H6309 + clre Hi byte of block # to allocate (always 0) +L002E ldf ,y Get block # + ELSE +L002E ldb ,y + ENDC + clr ,y+ Zero it out in table + IFNE H6309 + tfr w,x Block # to deallocate + ELSE + pshs a + clra + tfr d,x + puls a + ENDC + ldb #$01 1 block to deallocate + os9 F$DelRAM Deallocate the block + deca Dec # of blocks to clean out + bne L002E Do until entire RAM drive is deallocated +L003D clrb Exit w/o error + rts + +* Deallocate RAM allocated so far, exit with no RAM error +L003F bsr L0024 Deallocate all RAM Drive ram blocks +L0041 comb Exit no RAM left error + ldb #E$MemFul + rts + +* Init routine - only gets called once per driver inited. +* Called if you INIZ the device as well +* Entry: Y=Address of device descriptor +* U=Device mem area +* NOTE: All of device mem (Except V.PORT) is cleared to 0's +Init lda #1 + sta V.NDRV,u only can handle 1 drive descriptor + leax DRVBEG,u Point to start of drive table + sta DD.TOT+2,x Set DD.TOT to non 0 value + lda <M$Opt,y Get # of bytes in device descriptor table + deca +* Following is if 1st access to RAMMER is on /MD + beq GetStat 0 (/MD desciptor), then exit w/o error + ldb <IT.CYL+1,y Get LSB of # of cylinders + lda <IT.SID,y Get # of heads + mul Calculate # head/cyls total + lda <IT.SCT+1,y Get # of sectors/track + mul Calculate # of sectors for RAM drive + subd <IT.SCT,y Subtract 1 tracks worth + addd <IT.T0S,y Add in the special track 0's # sectors/track + std DD.TOT+1,x Save as # sectors on drive + addd #$001F Round up to nearest 8K block + IFNE H6309 + rold Shift # of 8K blocks needed into A + rold + rold + ELSE + rolb + rola + rolb + rola + rolb + rola + ENDC + cmpa #MAXBLOCK If higher than max, exit with mem full error + bhi L0041 + leax <MMUTable,u Point to RAM block table + IFNE H6309 + tfr a,e # blocks left to allocate + ENDC +L0078 ldb #$01 Try to allocate 1 8K RAM block + IFEQ H6309 + pshs a + ENDC + os9 F$AllRAM + IFEQ H6309 + puls a + ENDC + bcs L003F If error, deallocate RAM, and exit + inc <numofBlk,u Bump up # of blocks allocated + stb ,x+ Save MMU block # allocated in table + IFNE H6309 + dece Do until done all blocks requested + ELSE + deca + ENDC + bne L0078 + clrb No error & return + rts + +* Entry: B:X=LSN to read (only X will be used, even with 2 MB) +* Y=Path dsc. ptr +* U=Device mem ptr +Read pshs y,x Preserve path & device mem ptrs + bsr L00C8 Calculate MMU block & offset for sector + bcs L00A5 Error, exit with it + bsr L00AE Transfer sector from RAM drive to PD.BUF + puls y,x Restore ptrs + leax ,x Sector 0? + bne GetStat No, exit without error + ldx PD.BUF,y Get buffer ptr + leay DRVBEG,u Point to start of drive table + IFNE H6309 + ldw #DD.SIZ Copy the info we need into drive table + tfm x+,y+ + ELSE + ldb #DD.SIZ Copy the info we need into drive table +ReadLp lda ,x+ + sta ,y+ + decb + bne ReadLp + ENDC +* GetStat/SetStat - no calls, just exit w/o error +GetStat clrb +L00A7 rts + +L00A5 puls y,x,pc + +start bra Init + nop + bra Read + nop + bra Write + nop + bra GetStat + nop + bra GetStat Actually SetStat (no calls, so same routine) + nop + lbra L0024 Terminate (returns memory) + +* Entry: B:X = LSN to write +* Y=Path dsc. ptr +* U=Device mem ptr +Write bsr L00C8 Calculate MMU Block & offset for sector + bcs L00A7 Error,exit with it + exg x,y X=Sector buffer ptr, Y=Offset within MMU block +* Transfer between RBF sector buffer & RAM drive image sector buffer +* Called by both READ and WRITE (with X,Y swapping between the two) +L00AE orcc #IntMasks Shut IRQ's off + pshs x Preserve X + ldx <D.SysDAT Get ptr to system DAT image + ldb 1,x Get original System MMU block #0 + puls x Get X back + sta >$FFA0 Map in RAM drive block into block #0 + IFNE H6309 + ldw #$0100 256 byte transfer + tfm x+,y+ Copy between the two buffers + ELSE + clrb +WriteLp lda ,x+ + sta ,y+ + decb + bne WriteLp + ENDC + stb >$FFA0 Remap in system block 0 + andcc #^(IntMasks+Carry) Turn IRQ's back on & no error + rts + +* Subroutine to calculate MMU block # and offset based on sector # requested +* Entry: Y=path dsc. ptr +* U=device mem ptr +* B:X=LSN to calculate for +* Exit: A=MMU block # we need to map in +* X=offset within MMU block to get sector from (always <8K) +* Y=Sector buffer ptr for RBF +* MDFlag,u=0 if NOT MD, else MD +L00C8 clr MDFlag,u Flag that we are on "real" RAM Drive + IFNE H6309 + ldw PD.DEV,y Get our Device table entry ptr + ldw V$DESC,w Get device descriptor ptr + lda M$Opt,w Get size of options table + ELSE + pshs x + ldx PD.DEV,y Get our Device table entry ptr + ldx V$DESC,x Get device descriptor ptr + lda M$Opt,x Get size of options table + puls x + ENDC + deca + bne L00DB Not MD, skip ahead + inc MDFlag,u Flag we are on MD + sta <PD.SIZ,y + sta <PD.SIZ+3,y + sta <PD.SSZ,y + ldd <D.BlkMap+2 Get end of block memory ptr + subd <D.BlkMap Calc # of blocks of RAM + lda #32 * 32 for # of 'sectors' + mul + std <PD.SIZ+1,y Save as middle word of file size + std <PD.SSZ+1,y Save as segment size + bra L00DE Skip ahead (sector # will allow all 2 MB) + +L00DB tstb Test MSB of sector # + bne L010F <>0, exit with Sector error +L00DE pshs x Preserve LSW of sector # + ldd ,s Load it again into D + tst MDFlag,u We on MD? + bne L00EE Yes, skip ahead + leax DRVBEG,u Point to drive table + cmpd DD.TOT+1,x LSW of sector compared to table's # of sectors + bhs L010E Sector # too large, exit with error +L00EE equ * + IFNE H6309 + rold A=MMU block offset in RAM drive image + rold + rold + ELSE + rolb + rola + rolb + rola + rolb + rola + ENDC + tst MDFlag,u We on /MD? + bne L0100 Yup, skip calculating MMU stuff + leax <MMUTable,u Point to MMU table + lda a,x Get MMU block # we want + beq L010E If 0, exit with sector error +L0100 pshs a Save block # + clrb Calculate offset within 8k block we want + lda 2,s + anda #$1F Mask out all but within 8K address offset + std 1,s Save offset + ldy PD.BUF,y Get sector buffer address + puls x,a,pc Get offset, MMU block & return + +L010E leas 2,s Eat X on stack +L010F comb Exit with bad sector # + ldb #E$Sect + rts + + emod +eom equ * + end