[comp.sources.apple2] v001SRC009: ProDOS Saturn 64/128K Ramdisk Driver

jac@yoko.rutgers.edu (Jonathan A. Chandross) (12/02/90)

Submitted-by: NONE
Posting-number: Volume 1, Source:9
Archive-name: prodos/ramdisk/saturn
Architecture: ANY_2
Version-number: 1.00

This is a ProDOS ramdisk driver for Saturn 64/128K cards.

Enjoy. 


=Manual
-
-
-
-
-
-
-
-
-
-         ProDOS driver for Saturn 64/128K ramcards
-
-                        Version 1.00
-
-
-
-
-The following code is posted as freeware. I expect no
-compensation other than due credit for the creation of this
-source code. If you adapt and improve on this driver I'd
-like to hear from you.
-
-
-I created this driver several years ago when I purchased a
-Saturn 128K card for my Apple ][+.  The driver has several
-limitations, the biggest of which is that it only supports a
-single card in a slot 0.  The other limitations are:
-
-     (1)  Currently the driver is a BRUN-able program that
-          tests for the presense of 64K or 128K of Saturn
-          compatible ram in slot 0.
-
-     (2)  Upon finding sufficient RAM the driver takes over
-          the complete card except for the 16k that ProDOS
-          uses in block 0.
-
-     (3)  The 16 bytes of the ProDOS global page used for
-          Apple's copyright notice are also consumed.  Since
-          a few other programs use this area as scratchpad
-          RAM, conflicts are possible.  Unpredictable
-          results will occur if these bytes are overwritten
-          after the ramcard has been initialized.
-
-     (4)  The core of the ram disk driver resides from $D000
-          through $D0FF in bank 2 of block 0. This is the
-          section of unused memory right below the ProDOS
-          quit code. As in note 3, overwriting this code
-          will have unpredictable result.
-
-
-
-The operation of the driver is quite simple.
-
-     (A)  The user's application makes a call to the ProDOS
-          MLI to access the ramdisk.
-
-     (A)  The ProDOS MLI does bank switching and passes the
-          request to the ProDOS kernel.
-
-     (C)  The ProDOS kernel decides it needs a certain block
-          from the ramdisk so it sets up some bytes in zero
-
-
-
-
-
-
-
-
-
-                           - 2 -
-
-
-          page and calls the driver through the driver
-          vectors in the ProDOS global page.
-
-     (D)  The ProDOS global page driver vectors pass control
-          to a short routine installed in place of the Apple
-          Copyright notice in the ProDOS global page.
-
-     (E)  The short routine installed in place of the Apple
-          Copyright notice does bank switching to make the
-          main core of the driver available for execution
-          and then jumps to it.
-
-     (F)  The main core of the routine analyzes the
-          parameters placed in zero page by the ProDOS
-          kernel and sets up a few parameters of its own.
-
-     (G)  With everything in order, the ramdisk driver swaps
-          a read/write routine with a section of zero page
-          memory.
-
-     (H)  The swapped read/write routine does the requested
-          action and returns to the ramdisk driver.
-
-     (I)  The ramdisk driver then re-swaps the read/write
-          routine with the section of stored zero page
-          memory.
-
-     (J)  The ramdisk driver cleans up shop and returns to
-          the short routine installed in place of the Apple
-          Copyright notice.  This routine then bank switches
-          the ProDOS kernel back in.  Control then returns
-          to the ProDOS kernel which then cleans up and
-          exits.  This, in turn, returns to the ProDOS MLI,
-          which then cleans up and then returns to the
-          calling Application.
-
-This may seem like a lot of steps, but it is small and quite
-fast.
-
-
-Have fun with the code. If you improve on it, let me have a
-copy back.  There are others who would gain from continued
-work on this program.  I've helped you, now you have a
-chance to help others.
-
-
-
-                    Matthew Lee Stier
-                    Sun Microsystems
-                    P.O. Box 13447
-                    RTP, NC  27709-3447
-                    (919) 469-8300
-                    Internet: mstier@east.sun.com
-                    UUCP: sun!sunpix!matthew or rti!sunpix!matthew
-
-
-
-
-
-
-
-
-
-                           - 3 -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
=Manual.tr
-.\"
-.\" Fake a paragraph so MS sets everthing.  (.BG done at first
-.\" paragraph.)  Then reset the modes to what we want.  MS is
-.\" braindamaged.
-.\"
-.\" Don't adjust margins (ragged right) and turn off hyphenation.
-.\" No date.
-.\"
-.pl 11.0i
-.LP
-.na
-.nr HY 0
-.hy 0
-.ND
-.\"
-.\" Title down 3 lines
-.\"
-.rs 
-.sp 3
-.ce
-ProDOS driver for Saturn 64/128K ramcards
-.sp
-.ce
-Version 1.00
-.sp 3
-.LP
-The following code is posted as freeware. I expect no compensation other
-than due credit for the creation of this source code. If you adapt and
-improve on this driver I'd like to hear from you.
-
-.LP
-I created this driver several years ago when I purchased a 
-Saturn 128K card for my Apple ][+.
-The driver has several limitations, the biggest of which is that
-it only supports a single card in a slot 0.  The other limitations
-are:
-.RS
-.IP (1)
-Currently the driver is a BRUN-able program that tests for the presense
-of 64K or 128K of Saturn compatible ram in slot 0.
-.IP (2)
-Upon finding sufficient RAM the driver takes over the complete card except 
-for the 16k that ProDOS uses in block 0.
-.IP (3)
-The 16 bytes of the ProDOS global page used for Apple's
-copyright notice are also consumed.
-Since a few other programs use this area as scratchpad RAM, conflicts
-are possible.
-Unpredictable results will occur if these bytes are overwritten
-after the ramcard has been initialized.
-.IP (4)
-The core of the ram disk driver resides from $D000 through $D0FF
-in bank 2
-of block 0. This is the section of unused memory right below the ProDOS
-quit code. As in note 3, overwriting this code will have unpredictable
-result.
-.RE
-.sp 2
-.LP
-The operation of the driver is quite simple. 
-.RS
-.IP (A)
-The user's application makes a call to the ProDOS MLI to access the
-ramdisk.
-.IP (A)
-The ProDOS MLI does bank switching and passes the request to the ProDOS
-kernel.
-.IP (C)
-The ProDOS kernel decides it needs a certain block from the ramdisk
-so it sets up some bytes in zero page and calls the driver through
-the driver vectors in the ProDOS global page.
-.IP (D)
-The ProDOS global page driver vectors pass control to a short routine
-installed in place of the Apple Copyright notice in the ProDOS global
-page.
-.IP (E)
-The short routine installed in place of the Apple Copyright notice
-does bank switching to make the main core of the driver available
-for execution and then jumps to it.
-.IP (F)
-The main core of the routine analyzes the parameters placed in zero 
-page by the ProDOS kernel and sets up a few parameters of its own.
-.IP (G)
-With everything in order, the ramdisk driver swaps a read/write routine
-with a section of zero page memory.
-.IP (H)
-The swapped read/write routine does the requested action and returns 
-to the ramdisk driver.
-.IP (I)
-The ramdisk driver then re-swaps the read/write routine with the
-section of stored zero page memory.
-.IP (J)
-The ramdisk driver cleans up shop and returns to the short routine
-installed in place of the Apple Copyright notice.  This routine then
-bank switches the ProDOS kernel back in.  Control then returns to
-the ProDOS kernel which then cleans up and exits.  This, in turn,
-returns to the ProDOS MLI, which then cleans up and then returns to
-the calling Application.
-.RE
-.LP
-This may seem like a lot of steps, but it is small and quite fast.
-.sp
-.LP
-Have fun with the code. If you improve on it, let me have a copy back.
-There are others who would gain from continued work on this program.
-I've helped you, now you have a chance to help others.
-.sp 3
-.in 2.0i
-.nf
-Matthew Lee Stier
-Sun Microsystems
-P.O. Box 13447
-RTP, NC  27709-3447
-(919) 469-8300
-Internet: mstier@east.sun.com
-UUCP: sun!sunpix!matthew or rti!sunpix!matthew
-.fi
-.in 0
=Read.Me
-
-Manual		on-line readable version of manual
-Manual.tr	troff/nroff source to Manual
-driver		Saturn driver code
-roff		Unix shell script to produce Manual given Manual.tr
-
=driver
-
-;
-; ProDOS disk driver for
-; 64k/128k Saturn ramcard
-;
-; Matthew Lee Stier
-; Sun Microsystems
-; P.O. Box 13447
-; RTP, NC  27709-3447
-; (919) 469-8300
-; Internet: mstier@east.sun.com
-; UUCP: sun!sunpix!matthew or rti!sunpix!matthew
-;
-; Copyright (c) 1986
-;
-JMP       EQU  $4C
-LDA       EQU  $B1            ;INDIRECT,Y
-STA       EQU  $91            ;INDIRECT,Y
-FORMAT.C  EQU  $4
-WR.BLK.C  EQU  $81
-GET.TIME  EQU  $82
-NO.EC     EQU  $00
-IO.EC     EQU  $27
-WP.EC     EQU  $28
-ZPAGE     EQU  $0
-CMD       EQU  $42
-BUFFER    EQU  $44
-BLK.NUM   EQU  $46
-MLI       EQU  $BF00
-DATETIME  EQU  $BF06
-DEVADR31  EQU  $BF16
-DEVCNT    EQU  $BF31
-DEVLST    EQU  $BF32
-COPYRITE  EQU  $BF40
-DATE      EQU  $BF90
-LC        EQU  $C080
-ROMBNK2WE EQU  LC+$1
-LCBNK2WE  EQU  LC+$3
-LCBNK1WE  EQU  LC+$B
-BLK0      EQU  LC+$4
-ROMBNK1WE EQU  LC+$9
-BLK7      EQU  LC+$F
-;
-          ORG  $2000
-          LST  ON,NOA,NOV,GEN
-;
-          LDY  #7
-NXTBLK16  LDX  LC.INDEX,Y     ;TEST FOR RAMCARD
-          LDA  LC,X           ; SIZE
-          BIT  LCBNK2WE       ;ENABLE BANK 2
-          BIT  LCBNK2WE
-          TYA
-          STA  $D000
-          DEY
-          BPL  NXTBLK16
-          BIT  BLK7
-          LDY  $D000          ;GET RAMCARD SIZE
-          BIT  BLK0           ;RESTORE BLOCK 0
-          BIT  ROMBNK1WE      ; BANK 1
-          BIT  ROMBNK1WE
-          CPY  #8             ;ILLEGAL BANK SIZE?
-          BCS  TESTRTN        ; YES...
-          TYA
-          ASL  
-          TAY
-          LDX  BLKSIZE+1,Y    ;GET RAMCARD SIZE
-          LDA  BLKSIZE,Y      ; IN PRODOS BLOCKS
-          BNE  INSTALL        ;IF NOT 0 THEN INSTALL
-          SEC                 ;ELSE FLAG AN ERROR
-TESTRTN   RTS                 ; AND QUIT
-;
-LC.INDEX  DB   $4,$5,$6,$7,$C,$D,$E,$F
-BLKSIZE   DW   0,0,0,96,0,0,0,224
-;
-INSTALL   STX  MAX.BLK+1      ;SET I/O ROUTINE
-          STA  MAX.BLK        ; MAX BLOCK
-          STX  B2.D+1+$2A     ;SET DIRECTORY 
-          STA  B2.D+1+$29     ; MAX BLOCK
-          CPY  #3*2           ;IF 64K RAMCARD
-          BNE  VBM128
-          LDY  B1.96          ;USE 96 BLOCK VBM 
-SET.VBM   LDA  B1.96,Y
-          STA  B1.D,Y
-          DEY
-          BPL  SET.VBM
-VBM128    JSR  MLI            ;GET CURRENT TIME
-          DB   GET.TIME
-          DW   0000
-          LDY  #3
-MOV.DATE  LDA  DATE,Y         ;MOVE IT TO DIRECTORY
-          STA  B2.D+1+$1C,Y   ; HEADER
-          DEY
-          BPL  MOV.DATE
-DO.MOVE1  BIT  ROMBNK2WE
-          BIT  ROMBNK2WE
-          LDY  #0
-MOVE1     LDA  CHCK.CMD,Y     ;MOVE I/O ROUTINE
-          STA  CHCK.CMD+OS,Y  ; TO BANK 2 @ $D000
-          INY
-          BNE  MOVE1
-          LDY  #15
-MOVE2     LDA  LC.ENTER,Y     ;MOVE LC.ENTER
-          STA  COPYRITE,Y     ; TO PRODOS GLOBAL
-          DEY                 ; PAGE
-          BPL  MOVE2
-          LDA  #<COPYRITE     ;INSTALL RAMCARD
-          STA  DEVADR31+1     ; VECTOR IN DRIVE TABLE
-          LDA  #>COPYRITE
-          STA  DEVADR31
-          INC  DEVCNT         ;INSTALL RAMCARD IN
-          LDY  DEVCNT         ; LIST OF ATTACHED DRIVES
-          LDA  #$3F           ;SLOT 3, DRIVE 2, TYPE-RAM
-          STA  DEVLST,Y
-          LDA  #2             ;FIRST DIRECTORY BLOCK
-          LDX  #<B2.D
-          LDY  #>B2.D
-          JSR  WR.BLOCK
-          LDA  #3             ;LAST DIRCETORY BLOCK
-          LDX  #<B3.D
-          LDY  #>B3.D
-          JSR  WR.BLOCK
-          LDA  #1             ;VOLUME BITMAP
-          LDX  #<B1.D
-          LDY  #>B1.D
-          JSR  WR.BLOCK
-          CLC
-          RTS                 ;AND END
-;
-WR.BLOCK  STA  WR.BLK.P+4     ;SETUP BLK.NUM
-          LDA  #00
-          STA  WR.BLK.P+5
-          STX  LENGTH+2       ;SETUP DATA POINTER
-          STY  LENGTH+1
-          STX  MOVDATA+2
-          STY  MOVDATA+1
-          LDY  #0               
-          LDA  #0
-ZBUFR     STA  BW.BUFR,Y      ;ZERO I/O BUFFER
-          STA  BW.BUFR+256,Y
-          INY
-          BNE  ZBUFR
-LENGTH    LDX  BW.BUFR        ;GET LENGTH OF INFO
-MOVDATA   LDA  BW.BUFR,X
-          STA  BW.BUFR-1,X    ;MOVE DATA TO I/O BUFFER
-          DEX
-          BNE  MOVDATA
-          JSR  MLI            ;AND WRITE IT TO /RAM
-          DB   WR.BLK.C
-          DW   WR.BLK.P
-          RTS
-;
-WR.BLK.P  DB   3              ;NUMBER OF PARAMETERS
-          DB   $30            ;SLOT/DRIVE NUMBER
-          DW   BW.BUFR        ;DATA BUFFER
-          DW   0000           ;BLOCK NUMBER
-;
-B2.D      DB   B2.END-*-1
-          DW   0              ;PREVIOUS.DIRECTORY.BLOCK
-          DW   3              ;NEXT.DIRECTORY.BLOCK
-VTYPE     DB   $F3            ;VTYPE/VN.LEN
-VNAME     ASC  'RAM'          ;VNAME
-          DS   VNAME+15-*,0
-          DS   8,0            ;RESERVED
-          DW   0              ;CREATION.DATE
-          DW   0              ;CREATION.TIME
-          DB   1              ;CREATION.VERSION
-          DB   0              ;MINIMUM.VERSION
-          DB   %01000011      ;ACCESS BITS
-          DB   39             ;SIZE DIR ENTRIES
-          DB   13             ;ENTRIES PER BLOCK
-          DW   0              ;ACTIVE FILES
-          DW   1              ;VBM
-          DW   0              ;# OF BLOCKS
-B2.END    EQU  *
-;
-B3.D      DB   B3.END-*-1
-          DW   2              ;PREVIOUS.DIRECTORY.BLOCK
-          DW   0              ;NEXT.DIRECTORY.BLOCK
-B3.END    EQU  *
-;
-B1.D      DB   B1.END-*-1
-          DB   %00001111      ;BLOCKS 0,1,2,3 ARE USED
-          DS   27,$FF         ;ALL THE REST ARE FREE
-B1.END    EQU  *
-;
-B1.96     DB   B1.96END-*-1
-          DB   $0F            ;BLOCKS 0,1,2,3 ARE USED
-          DS   11,$FF         ;ALL THE REST ARE FREE
-B1.96END  EQU  *
-;
-LC.ENTER  CLD                 ;ALL ROUTINE BEGIN WITH
-          BIT  LCBNK2WE       ;ENABLE BANK 2
-          JSR  CHCK.CMD+OS    ; AND GOTO IT
-LC.EXIT   PHP                 ;SAVE THE STATUS REGISTER
-          BIT  LCBNK1WE       ;ENABLE BANK 1
-          BIT  LCBNK1WE
-          PLP                 ;RESTORE THE STATUS REG.
-          RTS                 ;AND RETURN
-;
-          DS   >0-*,0
-OS        EQU  $D000-*        ;OFFSET TO LANGUAGE CARD
-;
-CHCK.CMD  BIT  LCBNK2WE       ;ENSURE BANK 2 IS SELECTED
-          LDA  CMD            ;GET THE COMMAND
-          BEQ  STATUS         ; IS IT 'STATUS'...
-          CMP  #FORMAT.C      ; IS IT 'FORMAT'
-          BCC  RD.WR          ; NO, READ OR WRITE...
-          BNE  IO.EXIT        , NO, I/O ERROR
-          LDA  #WP.EC         ;ITS FORMAT
-          SEC                 ; MARK DRIVE AS
-          RTS                 ; WRITE PROTECTED
-;
-IO.EXIT   LDA  #IO.EC         ;ITS AN I/O ERROR
-          SEC
-          RTS
-;
-STATUS    LDY  MAX.BLK+OS+1   ;GET VOLUME SIZE
-          LDX  MAX.BLK+OS
-STATUS2   LDA  #NO.EC         ;AND RETURN
-          CLC
-          RTS
-;
-MAX.BLK   DW   0              ;NUMBER OF BLOCKS
-;
-RD.WR     LDA  BLK.NUM+1      ;CHECK VALID BLOCK NUM
-          CMP  MAX.BLK+OS+1
-          BNE  RD.WR2
-          LDA  BLK.NUM
-          CMP  MAX.BLK+OS     ;IF GREATER THAN
-RD.WR2    BCS  IO.EXIT        ; MARK AS I/O ERROR...
-          PHA
-          LSR  A              ;GET RAMCARD
-          LSR  A              ; BLOCK NUMBER
-          LSR  A
-          LSR  A
-          LSR  A
-          TAY
-          LDA  B16TBL+OS,Y    ;CONVERT TO I/O ADDRESS
-          STA  RC.BLK+OS+1
-          PLA
-          AND  #%00011111     ;GET BLOCK NUMBER
-          CMP  #8
-          BCS  NO.FIX         ;SET CORRECT BANK
-          ADC  #8
-NO.FIX    PHA
-          LDA  #LCBNK2WE
-          BCC  NO.FIX2
-          LDA  #LCBNK1WE
-NO.FIX2   STA  RC.BNK+OS+1
-          PLA
-          ASL  A
-          ADC  #$C0           ;AND RAMCARD ADDRESS
-          TAX
-          LDA  CMD
-          AND  #%00000010     ;SETUP RAMCARD POINTERS
-          TAY
-          LDA  #00
-          STA  S1+OS,Y
-          STA  S2+OS,Y
-          TXA
-          STA  S1+OS+1,Y
-          INX
-          TXA
-          STA  S2+OS+1,Y
-          TYA
-          ASL
-          ASL
-          ASL
-          TAY
-RC.BLK    LDA  #00
-          STA  MOVLOOP+OS+1,Y
-RC.BNK    LDA  #00
-          STA  MOVLOOP+OS+4,Y
-          LDA  CMD
-          EOR  #%00000011     ;SETUP MAIN MEM. POINTERS
-          AND  #%00000010
-          TAY
-          LDX  BUFFER+1
-          LDA  BUFFER
-          STA  S1+OS,Y
-          STA  S2+OS,Y
-          TXA
-          STA  S1+OS+1,Y
-          INX
-          TXA
-          STA  S2+OS+1,Y
-          TYA
-          ASL
-          ASL
-          ASL
-          TAY
-          LDA  #LCBNK1WE
-          STA  MOVLOOP+OS+1,Y
-          LDA  #BLK0
-          STA  MOVLOOP+OS+4,Y
-          PHP
-          SEI                 ;DISABLE INTERUPTS
-          JSR  SWAP+OS        ;PUT R/W IN ZPAGE
-          JSR  ZPAGE          ; DO READ/WRITE
-          JSR  SWAP+OS        ;PUT ZPAGE BACK
-          PLP                 ;RESTORE INTERUPT FLAG
-          JMP  STATUS2+OS     ;AND EXIT
-;
-B16TBL    DB   $85,$86,$87,$8C,$8D,$8E,$8F
-;
-SWAP      LDY  #RWR.END-RWR   ;GET LENGTH OF RWR
-SWAP2     LDX  RWR+OS,Y       ;AND SWAP ZPAGE
-          LDA  ZPAGE,Y        ; WITH RWR
-          STA  RWR+OS,Y
-          STX  ZPAGE,Y
-          DEY
-          BPL  SWAP2
-          RTS
-;
-RWR       LDY  #00            ;INIT INDEX POINTER
-MOVLOOP   BIT  LC             ;ENABLE SOURCE
-          BIT  LC
-          DB   LDA,S1-RWR     ;GET THE DATA
-          STA  T1-RWR
-          DB   LDA,S2-RWR
-          STA  T2-RWR
-          BIT  LC             ;ENABLE DESTINATION
-          BIT  LC
-          LDA  T1-RWR         ;SAVE THE DATA
-          DB   STA,D1-RWR
-          LDA  T2-RWR
-          DB   STA,D2-RWR
-          INY                 ;DONE?
-          BNE  MOVLOOP        ;NO...
-          BIT  BLK0           ;RESET TO RAMCARD
-          BIT  LCBNK2WE       ; BLOCK 0, BANK 2
-          RTS                 ; AND RETURN
-;
-S1        DW   0              ;SOURCE 1
-D1        DW   0              ;DESTINATION 1
-S2        DW   0              ;SOURCE 2
-D2        DW   0              ;DESTINATION 2
-T1        DB   0              ;DATA 1
-T2        DB   0              ;DATA 2
-RWR.END   EQU  *
-;
-          DS   >0-*,0
-BW.BUFR   EQU  *              ;I/O BUFFER
-*
-
=roff
-nroff -ms Manual.tr > Manual
+ END OF ARCHIVE