dml@loral.UUCP (Dave Lewis) (02/14/86)
-------------------------------
Here it is at long last...what you need to do to NewDisk to make it get
along with OS-9 Version 2. It's not thoroughly tested yet but it seems OK --
let me know if there are any problems out there. Version 2 uses a thing
called the Virtual Interrupt to shut off the drive motors where in Version 1
I think it's done in the kernel. (Many thanks to Chuck Buche for the info
on Virtual Interrupts).
My source of Version 2 for testing was one of those Deskmate disks, which
has no pipes or /T1 in its bootfile. Also, if you have to deal with one of
these critters, watch out for SysGo. For some reason when it initializes it
points the working and execution directories at /H0 and /H0/CMDS respectively.
I have no idea how it ever managed to get started before but when I replaced
CCDisk with NewDisk.V2 I had to patch those two strings to /D0 and /D0/CMDS -
then it worked fine. It may have something to do with the disk descriptors
because I replaced them too.
The entire Version 2 disk driver is now included on my source disk which
is still available for $10. Space is getting short on the standard 35-track
single sided format and I may have to exclude some of the large assortment
of disk descriptor binaries to make room. The sources will NOT get squeezed
out even if enough stuff accumulates to crowd out the binaries. If it gets
big enough I'll format 40 tracks double-sided if you can read that, or add a
second disk and ask $15 for the set.
*****************************************************************
*
* Changes necessary to make NewDisk run under
* OS-9 Version 2.0
*
* Copyright 1986 by Dave Lewis
* 4417 Idaho apt. 4
* San Diego, CA 92116
* Released to public domain February, 1986
*
*****************************************************************
*
* Change the revision level
*
REV EQU 2
*
* Add this line to the big block of EQUates near the beginning
* (unless you're using Version 2 and have the new DEFS files)
*
F$VIRQ EQU $27 Virtual Interrupt code
*
* Add this line just after the MOD declaration block
* (after the Version number FCB)
*
D.IRQPAK FCB 0,1,10 IRQ service entry data
*
* Add this line to the storage declarations just after
* the line that allocates Q.SEEK
*
VI.VAR RMB 5 Virtual Interrupt data
*
* Replace the first line of INIT with this
*
INIT CLR VI.VAR+1,U Zero disk rundown timer
*
* Add this code immediately after the NMI jump vector
* storage (the line STA >NMIVECT)
*
PSHS Y Save Y register
LEAY VI.VAR+4,U Point to status byte
TFR Y,D Put address in correct reg
LEAY IRQ.SVC,PCR Point to IRQ service routine
LEAX <D.IRQPAK,PCR Point to IRQ service data
OS9 F$IRQ Create an IRQ table entry
PULS Y Restore Y register
BCS RETURN1 Exit if error
*
* Numerous changes to DSKSTART; make it look like this:
*
DSKSTART TST VI.VAR+1,U Are drives already running?
BNE SPINRDY Ready, no need to wait
CLR DRVS.RDY,U No drives are ready
LDD #$80B Motor on, wait 550 mSec
STA >DPORT Start spindle motors
BSR WAIT50MS Wait for motors to start
PSHS Y Save path descriptor address
LEAY VI.VAR,U Point to VIRQ data
CLR 4,Y Clear status byte -- one shot
LDX #1 Install entry
LDD #DISKRUN Initial count value
OS9 F$VIRQ Set virtual interrupt
PULS Y Restore path descriptor
BCS RETURN3 Exit if error
SPINRDY LDA PD.DRV,Y Get drive number
CMPA V.NDRV,U Test for valid drive #
BHS ERR.UNIT Return error if not
LEAX TABL.ORG,U Compute address of active
LDB #DRVMEM drive's parameter table
MUL TABL.ORG + (D# * tablesize)
LEAX D,X Add computed offset to origin
LDA PD.DRV,Y Get drive number again
LSLA Set corresponding drv select
BNE NOTDRV0 bit -- 1 for D1, 2 for D2
INCA Set bit 0 for drive 0
NOTDRV0 TFR A,B Copy select bit
ORB #$28 Enable double density
ORCC #INTMASKS Disable IRQ and FIRQ
STB >DPORT Enable drive
STB DPRT.IMG,U Set image byte
CLR Q.SEEK,U Clear same drive/track flag
CMPX DRV.ACT,U Is this the same drive?
BNE NEWDRIVE If not, leave flag zeroed
LDB #$FF Indicate successive accesses
STB Q.SEEK,U to the same drive.
NEWDRIVE STX DRV.ACT,U Store table address
BITA DRVS.RDY,U Has this drive been ready
BNE DRVRDY since the motors started?
PSHS A Save drive select bit
LDD #$D405 Force int, allow 250 mSec
LBSR COMDEX Look for index pulse
PSHS CC Save carry flag condition
BSR KILLCOMD Clear index-pulse NMI state
PULS CC,A Restore carry flag and A
BCS RETURN3 Error if no index pulse
DRVRDY ORA DRVS.RDY,U Set corresponding drive
STA DRVS.RDY,U ready flag
LDA >STATREG Clear interrupt condition
LDD #DISKRUN Restart the disk rundown
STD VI.VAR,U VIRQ counter
CLRB Return no error
RETURN3 RTS
*
ERR.UNIT COMB Set carry flag
LDB E$UNIT Set error code
RTS
*
* And add this code to finish it up:
*
IRQ.SVC LEAY VI.VAR,U Point to VIRQ data
CLR 1,Y Clear counter LSB
CLR 4,Y Clear status byte
CLR >DPORT Stop disk motors
RTS
*
EMOD CRC bytes
SIZE EQU *
END
-------------------------------
Dave Lewis Loral Instrumentation San Diego
sdcsvax--\ gould9 --\
ihnp4 ---->-->!sdcc3 ---->--->!loral!dml (uucp)
sdcrdcf -/ crash ---/
"It would seem that I could ride away without being shot down."
"To ambush me later? I'm afraid I can't permit it. It has become a matter of
future self-defense." -- Dilvish (Roger Zelazny)
-------------------------------