TITLE DPDINT - DATA PRODUCTS DISK INTERRUPT SERVICE SUBTTL A. BLACKIGNTON/CMF TS 12 JAN 69 V401 XP VDPDIT,401 DCB=204 ;DATA-CONTROL-B DF=270 ;DISK-FILE DSK=DF ;THIS NEXT CONSTANT MUST BE SET TO MATCH CAPACITY OF THE PARTICULAR DISK FILE--- INTERNAL LBHIGH ;HIGHEST LEGAL LOGICAL BLOCK NUMBER LBHIGH: 130000-1 ;START A WRITE ON DISK FILE ;AT ENTRY, C(TAC 18-35)= LOGICAL BLOCK NUMBER ; C(TAC1) = IOWD INTERNAL DFWRT,DFRED EXTERNAL DSKX8,DCBBIT,DSKBIT,DSKCHN,DCBCHN.ERRPNT,DSKX9 ENTRY LDDINT LDDINT: DFWRT: DFWRT1: MOVEM TAC1,IOWRD MOVE TAC1,[BLKO DCB,IOWRD] JSR DFRW ;SET UP DISK ADDRESS TLO TAC,WLE ;ENABLE WRITE LOCK ERROR HRRI TAC,DSKCHN ;TURN ON DISK IORI TAC,WRT+CLE+EIS+ENE STARTDV DSK HRRZI TAC,DCBCHN CONO DCB,OUT+DAR+BR+P18+DFNUM(TAC) ;TURN ON DATA-CONTROL-B POPJ PDP, ;SIMILAR ROUTINE FOR READ DFRED: DFRED1: MOVEM TAC1,IOWRD MOVE TAC1,[BLKI DCB,IOWRD] JSR DFRW HRRI TAC,DSKCHN IORI TAC,RED+CLE+EIS+ENE ;TURN ON DISK STARTDV DSK HRRZI TAC,DCBCHN CONO DCB,XMOVE+P18+DFNUM(TAC) POPJ PDP, ;SERVICE INTERRUPT ON DATA-CONTROL-B INTERNAL FTCHECK,FTMONP IFE FTCHECK+FTMONP,< INTERNAL DCBINT DCBINT: Z > DCBIN1: MOVEM TAC,ACSAV HRRZI TAC,DCBBIT CONO PI,1000(TAC) ;TURN OFF DCB CHANNEL CONI DCB,DCBERR ;SAVE STATUS OF DATA CONTROL HRRZI TAC,DSKCHN CONSO DCB,OUT ;SKIP IF WRITING CONO DF,END+EIS(TAC) MOVE TAC,ACSAV JEN @DCBINT JSRDCB: JSR DCBINT ;JSR STORED IN INTERRUPT CELL ;DISK & DCB FLAGS ADE=1B29 ;ADDRESS ERROR ADT=1B20 ;ADDRESS TERMINATED ALM=1B30 ;ALARM CME=1B27 ;COMMAND ERROR DCE=1B26 ;DATA CLOCK ERROR MISS=1B23 ;DATA MISSED FLAG DRLATE=1B31 ;DATA REQUEST LATE RCE=1B32 ;READ COMPARE ERROR PAR=1B33 ;PARITY ERROR IDS=1B18 ;IDLE STATE (1 IF IDLE) NOPR=1B35 ;OPERABLE (1 IF NOT) WLE=1B28 ;WRITE-LOCK ERROR OUT=1B27 ;OUTPUT INDICATION CLE=1B28 ;CLEAR ERROR FLAGS FER=1B34 ;FILE ERROR DVERAS=DRLATE+RCE+PAR+ADE+CME+DCE+ALM+NOPR+FER BR=1B26 ;BUFFER REQUEST FLAG FOR DCB DAR=1B25 ;DATA ACCUMULATOR REQUEST DFNUM=5B32 ;DISK NUMBER DOR DATA CONTROL END=1B23 ;END-SECTOR EIS=1B32 ;ENABLE IDLE STATE XMOVE=1B24 ;BUFFER ACCUMULATOR MOVE FLAG P18=3B29 ;PACK 2 18-BIT BYTES RED=1B26 ;READ INDICATOR WRT=2B26 ;WRITE INDICATOR ENE=1B29 ;ENABLE ERROR INTERRUPT ;INTERRUPT ROUTINE TO HANDLE SECTOR-END FLAG. ;CHECK FOR ERRORS. IF THE JOB IS COMPLETED (SIOWD = 0), GO TO ;DEVICE INDEPENDENT PACKAGE, ELSE CONTINUE THE JOB. INTERN DSKINT EXTERNAL DFINT,DSKSAV DSKINT: CONSO DF,@DSKCON JRST DSKINT ;ALTERED BY INITIALIZATION JSR DSKSAV HRRZI TAC,DCBBIT CONO PI,1000(TAC) ;MAKE SURE DCB IS OFF HLLZS DSKCON MOVEI IOS,0 SKIPE DSKIOS ;ERROR WAIT? JRST DSKIN3 ;YES MOVEI TAC1,DVERAS CONSZ DCB,OUT TRO TAC1,WLE CONSZ DF,(TAC1) ;ERROR? SETZM SIOWD ;YES, DO NOT DO MORE NOW MOVE TAC,DCBERR ;PICK UP DATA-CONTROL STATUS TRNN TAC,MISS ;DATA-MISSED FLAG ON? CONSZ DF,DVERAS-PAR ;NO, DISK ERRORS? ORI IOS,IODERR ;YES, SET DEVICE ERROR FLAG. CONSZ DF,PAR ;PARITY ERROR? IORI IOS,IODTER ;YES TRZ TAC1,DVERAS CONSZ DF,(TAC1) ;WRITE-LOCK? ORI IOS,IOIMPM ;YES CONO DF,CLE ;CLEAR DISC ERRORS JUMPN IOS,DSKIN2 SKIPN SIOWD ;JOB DONE? JRST DFINT ;YES, RETURN TO DEV, INDEP, ROUT. ;WITH ERROR FLAGS MOVE TAC,SRECN ; AND BLOCK NUMBER ADDI TAC,1 IMULI TAC,^D44 MOVE TAC1,SIOWD CONSO DCB,OUT JRST DFRED1 JRST DFWRT1 DSKIN2: HRRZI TAC,DSKCHN CONO DF,END+EIS(TAC) ;SEND END AND ENABLE FOR IDLE ;FOLLOWING ERROR MOVEM IOS,DSKIOS ;SAVE ERROR FLAGS MOVEI IOS,IDS+DVERAS HRRM IOS,DSKCON POPJ PDP,0 ;DISMISS DSKIN3: MOVE IOS,DSKIOS ;PICK CONO DF,0 JRST DFINT ;SET UP FOR READ AND WRITE IFE FTCHECK+FTMONP,< DFRW: Z > DFRW1: MOVEM TAC1,DSKX8 ;SET UP INTERRUPT LOC ;CONVERT FROM LOGICAL TO PHYSICAL SECTOR NUMBER. ;ENTER WITH LOGICAL NUMBER IN TAC CNVBLK: MOVEM TAC,SLBLK CNVBK2: HRRZS TAC IFN FTRCHK,< CAMLE TAC,LBHIGH ;LOGICAL BLOCK NUMBER IN RANGE ;(COMPARE WITH HIGHEST LEGAL)? HALT CNVERR ;NO, HALT - IF CONTINUE PUSHED, ;THEN FLAG AS DEVICE ERROR > IDIVI TAC,^D44 MOVEM TAC,SRECN ;SAVE THE BLOCK NUMBER SETZM SIOWD ;CLEAR SAVED IOWD LSH TAC,6 ADD TAC,TAC1 CONO DCB,0 ;INSURANCE DATAO DF,TAC ;SEND OUT ADDRESS HLRZ TAC,IOWRD ;WILL THIS I/O CAUSE A CHANGE CAIL TAC,-200 ; IN POSITION ARM DURING READ OR JRST CNVBK1 ; WRITE? SUBI TAC1,^D44 ;MAYBE. LSH TAC1,7 CAIL TAC,(TAC1) JRST CNVBK1 ;NO, GO AHEAD AS IS. MOVE TAC,IOWRD ;PUT SMALLER SIZE IN IOWD. HRLM TAC1,IOWRD MOVMS TAC1 ;STASH AWAY NEXT. HRLS TAC1 ADD TAC,TAC1 MOVEM TAC,SIOWD CNVBK1: CONSO DF,ADT ;ADDRESS GO OK? JRST .-1 ;WAIT FOR IT HRRZI TAC,DCBBIT CONO PI,2000(TAC) ;TURN ON DCB CHANNEL MOVSI TAC,IDS+DVERAS SETZM DSKIOS JRST @DFRW IFN FTRCHK,< CNVERR: MOVEI IOS,IODERR ;HERE ONLY IF OPERATOR PUSHES CONTINUE JRST DFINT ;FLAG AS DEVICE ERROR > ; WAIT FOR DISK TO BE TURNED ON INTERNAL DISKUP DISKUP: SETZM DSKX8 ;ZERO THE BLKI/BLKO WORD MOVE TAC,JSRDCB MOVEM TAC,DSKX9 ;STORE JSR EXECUTED ON BLKI/BLKO COMPLETION CONSZ DF,NOPR JRST .-1 HRRZI TAC,DSKBIT IORI TAC,DCBBIT CONO PI,2200(TAC) POPJ PDP, IFN FTCHECK+FTMONP,< EXTENRAL SRECN,SIOWD,DSKIOS,SLBLK,DFRW,ACSAV,DCBERR,DCBINT,IOWRD,DSKCON INTERNAL DCBIN1,DFRW1 > IFE FTCHECK+FTMONP,< INTERNAL DSKCON SRECN: Z ;SAVE OF BLOCK NUMBER SIOWD: Z ;NEXT IOWD TO USE DSKIOS: Z ; ERROR FLAGS SLBLK: Z ;LOGICAL BLOCK NUMBER LAST SELECTED ;CLEARED ON EACH CALL TO DFWRT OR DFRED DSKCON: 0 IOWRD: 0 DCBERR: 0 ACSAV: 0 > DPDEND: END