.title DSKHD HD: disk driver for Ersatz-11 .nlist bex .enabl lc ; ; Fuzzball HD: disk driver ; ; Supports E11's simple HD: hypothetical disk controller. ; ; By John Wilson . ; ; 11/06/99 JMBW Created. ; .globl dskini,.wait,.sked ; ; Entry symbols ; .globl hddpat ;PROCESS CONTROL VECTOR ; ; System definitions ; .asect .mcall .com,.psa,.dfblk,.dsk,.pat ;DCNLIB DEFINITIONS .com ;DEFINE COMMON DATA .psa ;DEFINE PROCESS SAVE AREA .dfblk ;DEFINE MESSAGE CODES .dsk ;DEFINE DISK PARAMETERS ; ; Device registers: ; hdcs= 00 ;777110 control/status register hdbc= 02 ;777112 byte count register hdblk= 04 ;777114 starting block register hdba= 06 ;777116 bus address register hdatn= 10 ;777120 drive attn register (disk change) hdst= 12 ;777122 ctrlr error/drive status register hdblke= 14 ;777124 starting block register extension hdbae= 16 ;777126 bus address extension ; hdcnt= 8. ;number of error retries ; ; Bits in HDCS: ; cserr= 100000 ;error csunit= 17000 ;unit csrdy= 200 ;ready csie= 100 ;interrupt enable (not on original HD_SYS.EXE) csbae= 60 ;bus address extension (" " " ") csfun= 16 ;function code csgo= 1 ;go bit ; ; Function codes in CSFUN: ; fnack= 0*2 ;medium acknowledge fnread= 1*2 ;read block(s) fnwrit= 2*2 ;write block(s) fngtsz= 3*2 ;get volume size ; ; Process save area extension (HDA) ; .= dasend ;;; .blkw ;can't think of anything we need to save .blkw regend/2+dskstk ;process stack hdaend= . ;end of PSA extension ; ; Procedure segment ; ; Supervisor-state procedure ; DSECTs: R2=DEV, R3=PAR, R4=REG, R5=PSA ; .psect $keri,ro,i ; ; Start I/O operation. ; dskgo: call .wait ;switch to wait state mov dasblk(r5),hdblk(r2) ;get block # clr hdblke(r2) ;zero-extend mov dasadr(r5),hdba(r2) ;get bus address mov #100000,r0 ;pre-set BUM (bypass Unibus map, if any) bisb dasadx(r5),r0 ;insert MSBs mov r0,hdbae(r2) ;set bus addr extension mov dasrwc(r5),r0 ;get word count asl r0 ;byte count mov r0,hdbc(r2) movb dasdrv(r5),r0 ;get unit # swab r0 ;in LH bisb dasadx(r5),r0 ;get MSBs of addr bic #^C7403,r0 ;isolate asl r0 ;unit starting at bit 9, BAE at bit 1 aslb r0 aslb r0 aslb r0 ;BAE in 5:4 (duplicate of HDBAE reg LSBs) bis #csie!fnwrit!csgo,r0 ;compose write command cmpb dasopn(r5),#bc.wrt+chnctl ;it *is* a write, right? beq 10$ add #fnread-fnwrit,r0 ;no, change to read 10$: mov r0,(r2) ;start command rts pc ; ; Device interrupt ; dskint: tst (r2) ;error? bmi 10$ ;yes clr (r2) ;controller will be idle jmp .sked ;later dude 10$: bis #1,regps(r4) ;hard error (emulated hardware retried) mov (r2),(r4) ;in case anyone wants CSR contents clr (r2) ;cause we're nuking them jmp .sked ;sorry about that ; ; Data segment ; .psect $kerd,ro,d ; ; Process header ; hddpat: .pat hdaend,dskini,pri2,<0,0,dskgo,dskint> ; .end