[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: USCD Pascal on a CFFA drive



> Wulf, what you are suggesting is entirely feasible for harddrives, and
> maybe the CF card.  I did this several years ago when I used a FCP
> Sider harddrive.  Made an attached driver for units 13-20 which mapped
> blockoffsets to files(volume images) on units 4,5,9,10,11,12.  Worked
> real well for my purposes.  Big caveat is not to Krunch a unit 4..12
> while a unit 13..20 was mapped to a file on it.  My sider is dead but
> I may have a diskette with the drivers and mounting pgm on it.  I'll
> look for it this weekend.  I don't know where to post it for you to
> look at but I could email an attachment.  (Google hides full email
> address so you'd have to email me a real address.  Mine is <steven-
> nelson at uiowa.edu>.)
>
>   --Steve

Probably a big no-no in googlegroups, but here goes.

Driver code to be assembled and installed via system.attach.  Note
this installs a driver for units 13..20, 128..143.  Next message will
be pascal code to be compiled which will mount/unmount files on units
4,5,9..12.

  ;
  ;  Sub-volume manager
  ;  by Steven E. Nelson
  ;  10/15/88
  ;  10/05/89 expanded for 13..20 128..143
  ;
  Routine         .equ    2
  Return          .equ    4
  PAB             .equ    6       ;^packed array of bytes from
UNITSTATUS
  Control         .equ    PAB+2   ;word
  Temp            .equ    Control+2
  Error           .equ    Temp+4
  .proc   subdir
  dwrite          .equ    15.
  dread           .equ    18.
  dinit           .equ    21.
  dstatt          .equ    48.
  udrwi           .equ    57.
  psubdrv         .equ    60.
  ;               jmp     start
  ;               .word   tbl
  start           sta     temp    ;unitnum
  stx     temp+1  ;code
  sty     temp+2  ;y-reg
  pla             ;pop return
  sta     return
  pla
  sta     return+1
;
  ;       Get new unitnum
  ;
  lda     #0      ;zero error
  sta     error
          lda     temp
  cmp     #128.   ;128..143 ?
  bcc     $1
  sbc     #107.
  $1              sec
  sbc     #12.+1
  jsr     mult6
  tay
    lda     tbl,y
  ;               beq     decodex
  sta     temp    ;new unitnum
  ;
  ;       Check operation
  ;
  decodex         cpx     #04
  beq     status
  cpx     #02
  beq     init
  cpx     #01
  beq     write
  cpx     #00
  beq     read
  BRK             ;Ouch!
  status          .equ    *
  pla             ;pop parms
  sta     PAB
  pla
  sta     PAB+1
  pla
  sta     Control
  pla
  sta     Control+1
  ;               lda     Control
  ;               and     #2      ;test for purpose
  ;               beq     Stat
  ;               lda     Control+1
  ;               and     #0E0    ;bits 13-15 of Control word
  ;               beq     Ctrl1
  ;               lda 0c081
  ;               jmp 0ff59
  ;               bne     Ctrl2
  lda     #2
  bit     Control ;test for purpose
  beq     Stat
  lda     #1
  bit     Control ;test for direction
  beq     Ctrl1
  bne     Ctrl2
  init            .equ    *
  jmp     out
  read            .equ    *
  write           .equ    *
  jsr     setup
      lda     error
  bne     $1
  lda     temp ;check for valid unit#
  bne     $2
  lda     #2
  sta     error
  $1              jmp     errorrw
  $2              cmp     #128.
  bcs     $3
                  ldy     #psubdrv+1
  bne     $4
  $3              ldy     #udrwi+1
  $4              lda     @0e2,y
  sta     routine
  iny
  lda     @0e2,y
  sta     routine+1
  ;
  ;       Now, go to real driver
  ;
  lda     return+1
  pha
  lda     return
  pha
  ldy     temp+2
  ldx     temp+1
  lda     temp
  lda 0c081
  jmp 0ff59
  jmp     @routine  ;and gone!
  Stat            .equ    *
  lda     temp
  bne     $1
  lda     #2
  sta     error
  jmp     out
  ;       pass 1 word back = #blocks
  $1              ldx     #0
  sec
  lda     tbl+4,y ;eblk lo
  sbc     tbl+2,y ;bblk lo
  sta     @PAB,x
  lda     tbl+5,y ;eblk hi
  sbc     tbl+3,y ;bblk hi
  inc     PAB
  bne     $2
  inc     PAB+1
  $2              sta     @PAB,x
  jmp     out
  Ctrl1           .equ    *
  tya
  tax
  ldy     #0
                          $1              lda     tbl,x       ;get
byte
  sta     @PAB,y
  inx
  iny
  cpy     #6
  bne     $1
  jmp     out
  Ctrl2           .equ    *
          tya
  tax
  ldy     #0
  $1              lda     @PAB,y
  sta     tbl,x
  inx
  iny
  cpy     #6
  bne     $1
  jmp     out
  errorrw         pla             ;blocknum
  pla
  pla             ;length
  pla
  pla             ;array ptr
  pla
  pla             ;unitnum
  pla
  pla             ;mode
  pla
  out            .equ    *
  lda     return+1
 0pha
  lda     return
  pha
  lda     temp
  ldx     error
  ldy     temp+2
  rts
  ;
  ;       Multiply a-reg by 6
  ;
  mult6           .equ    *
  pha
  asl     a       ;*2
  sta     temp+3
  pla
  clc
  adc     temp+3
  asl     a       ;*2
  sta     temp+3
  rts
  ;
  ;       Setup parms for read/write
  ;
  setup           .equ    *
  tsx             ;get stack pointer
  lda     temp
  beq     done    ;not valid
  sta     109,x   ;new unit#
  ;               tya             ;save y-reg
                  ;               pha
  ;               ldy     temp    ;unitnum
  ;               dey
  ;               tya
  ;               asl     a       ;*2
  ;               tay             ;index into disknum table
  ;               lda     @0ea,y  ;disknum, lo
  ;               sta     109,x
  ;               iny
  ;               lda     @0ea,y
  ;               sta     10a,x
  ;               pla
  ;               tay             ;restore y-reg
  clc
  lda     103,x ;blocknum lo
  adc     tbl+2,y   ;bblock lo
  sta     103,x
  lda     104,x ;blocknum hi
  adc     tbl+3,y   ;bblock hi
  sta     104,x
  sec
  lda     103,x ;updated blocknum lo
  sbc     tbl+4,y   ;eblock lo
  lda     104,x ;updated blocknum hi
  sbc     tbl+5,y   ;eblock hi
  bcc     done    ;in range
  lda     #0ff    ;make block num out of range
  sta     103,x
  sta     104,x
  lda     #0
  sta     temp
  lda     #17.
  sta     error
  done            rts
  ;
  ;    Table of subdir's attached
  ;
  tbl             .equ    *
                  unit13          .word   0
  .word   0
  .word   0
unit14          .word   0
  .word   0
  .word   0
unit15          .word   0
  .word   0
  .word   0
unit16          .word   0
  .word   0
  .word   0
unit17          .word   0
  .word   0
  .word   0
unit18          .word   0
  .word   0
  .word   0
unit19          .word   0
  .word   0
  .word   0
unit20          .word   0
  .word   0
  .word   0
unit128         .word   0
  .word   0
  .word   0
unit129         .word   0
  .word   0
  .word   0
unit130         .word   0
  .word   0
  .word   0
unit131         .word   0
  .word   0
  .word   0
unit132         .word   0
  .word   0
  .word   0
unit133         .word   0
  .word   0
  .word   0
unit134         .word   0
  .word   0
  .word   0
unit135         .word   0
  .word   0
  .word   0
unit136         .word   0
  .word   0
  .word   0
unit137         .word   0
  .word   0
  .word   0
   unit138         .word   0
  .word   0
  .word   0
unit139         .word   0
  .word   0
  .word   0
unit140         .word   0
  .word   0
  .word   0
unit141         .word   0
  .word   0
  .word   0
unit142         .word   0
  .word   0
  .word   0
unit143         .word   0
  .word   0
  .word   0
  ;
  .end