~~ I>~~~~~~~~~ q qa ~~ ; ; DISK PACK DRIVER. ; .TITL DKPDR .NREL .ENT DKPDC ;DCT ADDRESS .EXTN DSKDT ;COMMAND DISPATCH TABLE .EXTN RDCBK,RDLBK,RDNBK ;READ BLOCKS .EXTN PREAD ;PRE-READ FUNCTION .EXTN DKINIT ;DEVICE INITIALIZATION .EXTN DKRLSE ;DEVICE RELEASE FROM SERVICE .EXTN DIVI ;INTEGER DIVIDE .EXTN SETFL,RSTFL ;SET/RESET BITS .EXTN DISMIS ;DISMISS INTERRUPT .EXTN DKPL,SYSTM .EXTN NSECT,NHEAD,NCYL,NPBLK ; ; PARAMETERS. ; DPSKR=1B10 ;SEEK ERROR DPEOC=1B11 ;END OF CYLINDER DPADR=1B12 ;ADDRESS ERROR/UNSAFE DPCKR=1B13 ;CHECK WORD ERROR DPDLR=1B14 ;DATA LATE ERROR DPSKC=2  ;SEEK COMMAND DPRCL=3  ;RECALIBRATE COMMAND DPSKG=1B0 ;SEEKING STATUS DPSKD=1B1 ;SEEK DONE STATUS ; ; PHYSICAL PARAMETERS. ; MXUN=4  ;MAX. NUMBER OF UNITS ; ; DCT ; DKPDC: DKP  ;DEVICE CODE MSDKP+MSLPT+MSPTP+MSTTI+MSTTO ;MASK DCDIR  ;DEVICE CHARS. 0  ;DCT LINK WORD DKPIT  ;INTERRUPT ROUTINE ADDRESS OF+CF+RS+RL+WS+WL+RR+WR+OA ;COMMAND ENABLE DSKDT  ;COMMAND DISPATCH TABLE RDCBK  ;READ CURRNET BLOCK PREAD  ;PRE-READ DKPIN  ;INITIATE INPUT DKPOU  ;INITIATE OUTPUT 0  ;CURRENT I/O REQUEST POINTER DKPL  ;DCT LINK INDEX RDLBK  ;READ LAST BLOCK RDNBK  ;READ NEXT BLOCK DPINT  ;DEVICE INIT DKRLSE  ;RELEASE DEVICE FROM SERVICE NPBLK  ;NUMBER OF BLOCKS ON DEVICE ; CONSTANTS FOR DEVICE SECTX: NSECT HEADX: NHEAD CYLX: NCYL HDTAB: .BLK MXUN ;HEAD POSITION/STATUS TABLE ; ; INITIATE INPUT/OUTPUT. ; ; AC2: BUFFER ADDRESS ; JSR DKPIN/DKPOU ; MODE=TMP ;COMMAND SW. SECT=TMP+1 ;SECTOR ADDRESS HEAD=TMP+2 ;HEAD CYL=TMP+3 ;CYLINDER DKPIN: MOVO 0,0,SKP ;INPUT - SET CARRY DKPOU: MOVZ 0,0 ;OUTPUT STA@ 3,CSP ;SAVE RETURN SAVE  ;SAVE REGISTERS SUBL 0,0 ;SET MODE WORD FROM CARRY STA 0,MODE,3 ;SAVE IN STACK FOR LATER LDA 1,BQCA,2 ;LOGICAL DEVICE ADDRESS LDA 2,SECTX ;SECTOR INDEX JSR@ .IDIV ;DIVIDE STA 0,SECT,3 ;REMAINDER IS SECTOR LDA 2,HEADX JSR@ .IDIV STA 0,HEAD,3 ;HEAD IS NEXT LDA 2,CYLX JSR@ .IDIV STA 0,CYL,3 ;CYLINDER ADDRESS LDA 2,OAC2,3 ;BUFFER ADDRESS LDA 0,BQUN,2 ;UNIT NUMBER MOVZR 0,0 MOVR 0,0 MOVR 0,0 ;UNIT = BITS 0,1 LDA 1,HEAD,3 ;HEAD MOVS 1,1 ADD 1,0  ;DRIVE,HEAD LDA 1,SECT,3 ;SECTOR MOVOL 1,1 MOVOL 1,1 MOVOL 1,1 MOVOL 1,1 ADD 1,0  ;DRIVE,HEAD,SECTOR,COUNT (=-1) STA 0,BQDST,2 ;SAVE FOR DOC COMMAND SKPBZ DKP JMP .-1 JMP .+1 SKPBZ DKP JMP .-4 LDA 0,MXER ;MAX RETYR COUNT STA 0,BQERC,2 ;SET IN BUFFER ENTRY LDA 0,BQST,2 ;STATUS WORD LDA 1,ERBIT ;ERROR BIT JSR@ RSF ;OFF LDA 1,IOPB ;I/O IN PROGRESS JSR@ SETF ;ON LDA 1,RDCM ;COMMAND BIT LDA 3,MODE,3 ;MODE SW MOVR# 3,3,SZC ;WHICH ? JMP WRCM JSR@ SETF ; READ - SET BIT IOCOM: STA 0,BQST,2 ;PUT STATUS BACK LDA 0,BQUN,2 ;UNIT NUMBER LDA 3,HTABD ;HEAD TABLE ADDRESS ADD 0,3  ;LOCATE HEAD STATUS WORD LDA 0,0,3 LDA 1,RDYMS ;HEAD READY MASK AND# 0,1,SZR ;READY ? JMP CKSEK ;NO - GO CHECK STATUS SKOK: LDA 3,CSP ;HEAD IS SEEKED TO NOTED POSITION LDA 1,C377 ;CYLINDER MASK AND 1,0 LDA 1,CYL,3 ;DESIRED CYLINDER SUB# 0,1,SZR ;ARE WE THERE ? JMP SEEK ;NO - GO SEEK LDA 0,MODE,3 ;COMMAND MOVS 0,0 ;TO RIGHT HALF ADD 1,0  ;COMMAND,CYL LDA 2,OAC2,3 ;BUFFER ADDRESS LDA 3,DCTAD ;DCT ADDRESS MOVL 2,2 MOVZR 2,2 ;BIT 0 OFF ! STA 2,DCCRQ,3 ;CURRENT REQUEST POINTER (I/O ONLY) LDA 1,BQDST,2 ;DOC STUFF DOA 0,DKP ;MODE,CYLINDER DOB 2,DKP ;CORE ADDRESS DOCS 1,DKP ;START ER UP RTRN WRCM: JSR@ RSF JMP IOCOM SKOK1: LDA 0,0,3 ;HEAD STATUS LDA 1,SKDON ;DONE STATUS AND 1,0 STA 0,0,3 ;DONE BIT OFF. JMP SKOK ; ; STUFF. ; RSF: RSTFL .IDIV: DIVI SETF: SETFL ERBIT: QTER IOPB: QTIOP RDCM: QTCMD DCTAD: DKPDC C377: 377 MXER: SCMER HTABD: HDTAB RCCM: DPRCL*400 ;RECALIBRATE COMMAND SEEKER: DPSKR  ;SEEK ERROR BIT SKCM: DPSKC*400 ;SEEK COMMAND SKDON: -DPSKD-1 RDYMS: DPSKG+DPSKD ;READY MASK ; ; CHECK SEEK STATUS ; AC0: SEEK STATUS WORD ; LDA 0,0,3 ;SEEK STATUS WORD CKSEK: MOVL 0,0,SNC ;SEEKING ? JMP NWAIT ;NO, NO WAITING ( 3 CHAIRS ?) INTDS  ;TURN THE WORLD OFF LDA 3,@.UST ; GET THE USER WAIT WORD NEG 3,1 ; DOES HE WANT MOVZR 1,1,SZR ; WANT TO WAIT? JSR 0,3 ;YES INTEN LDA 3,BQUN,2 ;GET UNIT NUMBER LDA 0,HTABD  ;GET HEAD TABLE ADDRESS ADD 0,3  ;LOCATE STATUS WORD JMP CKSEK-1  ;AND LOOP NWAIT: MOVL# 0,0,SNC ;SEEK DONE ? JMP SKOK ;NO - CURRENT ADDRESS IS GOOD LDA 1,BQDST,2 ;SEEK DONE - CHECK FOR ERROR ON THIS UNIT DOC 1,DKP ;SELECT PROPER UNIT DIA 1,DKP ;GET STATUS FROM OUR UNIT LDA 0,SEEKER ;SEEK ERROR ? AND# 0,1,SNR JMP SKOK1 ;NO - DONE OK SUBZR 0,0 ;SEEK ERROR - RECALIBRATE STA 0,0,3 ;SET STATUS TO CYL ZERO LDA 0,RCCM ;RECAL. COMMAND DOA 0,DKP ;SEND COMAND LDA 1,BQDST,2 ;UNIT SELECTION DOCP 1,DKP ;SELECT AND START JMP CKSEK-1 ;GO WAIT .UST: UST+USTWA ; ; INITIATE A SEEK ; SEEK: LDA 0,SKCM ;SEEK COMMAND WORD ADD 1,0  ;SEEK,CYL LDA 1,BQDST,2 ;UNIT SELECTION DOA 0,DKP ;SEND COMMAND DOCP 1,DKP ;SELECT UNIT,START SEEK LDA 1,CYL,3 LDA 0,BQUN,2 ;UNIT LDA 3,HTABD ADD 0,3 ADDOR 1,1 ;SET SEEKING BIT STA 1,0,3 ;SET IN HEAD TABLE JMP CKSEK-1 ;GO WAIT ; ; DISK PACK INTERRUPT SERVICE ROUTINE ; DKPIT: ISZ@ ST  ;UPDATE CLOCK JMP .+1 DIA 0,DKP ;COLLECT STATUS DOA 0,DKP ;RESET THESE MOVL 0,0,SNC ;READ/WRITE DONE ? JMP NORW ;NO LDA 1,RDERS ;READ ERROR MASK LDA 2,DCCRQ,2 ;CURRENT BUFFER REQUEST POINTER AND# 0,1,SZR ;READ/WRITE ERRORS ? JMP DKER ;YES - GO RESOLVE IT LDA 3,MSK ;RESET MASK LDA 1,BQST,2 ;STATUS OWRD AND 3,1  ;RESTET BITS STA 1,BQST,2 ;PUT BACK NORW: LDA 2,HDL ;TABLE LENGTH LDA 3,HTABD ;HEAD TABLE LOOP: MOVL 0,0,SNC ;SEEK DONE ? JMP LPEND ;NO. LDA 1,0,3 ;HEAD STATUS MOVZL 1,1 ;BIT 0 OFF MOVZL 1,1 MOVOR 1,1 ;BIT 1 ON MOVZR 1,1 STA 1,0,3 ;PUT BACK IN SLOT LPEND: INC 3,3 INC 2,2,SZR JMP LOOP JMP@ .+1 DISMIS ST: SYSTM HDL: -MXUN MSK: -QTMOD-QTIOP-1 HDTB1: HDTAB RDERS: DPADR+DPCKR+DPDLR*2 ;DATA ERRORS DKER: STA 0,TMP,3 ;ERROR - SAVE STATUS WORD ON STACK LDA 0,BQST,2 ;BUFFFR STATUS DSZ BQERC,2 ;ENUF RETRYS ? JMP RETRY ;NO - TRY AGAIN LDA 1,IOPB ;I/O BIT OFF JSR@ RSF LDA 1,ERBIT ;ERROR BIT ON JSR@ SETF STA 0,BQST,2 SKCOM: LDA 0,TMP,3 ;STATUS JMP NORW ;LOOK FOR SEEKS DONE RETRY: LDA 1,RDCM ;READING OR WRITING AND# 0,1,SNR SUBZL 0,0,SKP SUB 0,0 MOVS 0,0 LDA 3,HDTB1 ;HEAD TABLE ADDRESS LDA 1,BQUN,2 ;UNIT NUMBER ADD 1,3 LDA 1,0,3 ;HEAD STATUS LDA 3,C377 AND 3,1  ;CYLINDER ADDRESS ADD 1,0  ;COMMAND,CYL LDA 1,BQDST,2 ;DOC STUFF DOA 0,DKP DOB 2,DKP DOCS 1,DKP ;START AGAIN JMP SKCOM ; ; SPECIAL CODE FOR DISK PACK INIT ; DPINT: STA@ 3,CSP ;SAVE RETURN SAVE  ;SAVE REGISTERS LDA 3,HDTB ;HEAD TABLE ADDRESS LDA 0,DCBUN,2 ;UNIT NUMBER ADD 0,3  ;HEAD ENTRY ADCZR 0,0 ;077777 MOVZR 0,0 ;037777 STA 0,0,3 ;FORCES SEEK 0 ON DEVICE JSR@ .DKINI ;DO REST OF INIT JMP .+1 ISZ ORTN,3 ;SUCCESS REUTRN RTRN .DKINI: DKINI HDTB: HDTAB .END *U*U*U*U a$