[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