IMD 1.16: 2/09/2008 13:05:57 ios:rom 93708-01-c2 (f70801) 84-93708-01 c2 10/18/79    @0|)v1uo)  " }jA cOMEGA4MOM790111120000OM790111120000OM790111120000IOS:ROM      -M@jjggg@ o G`k_C# b# }B u[ ]e JRiCp@=<; G9P@ Gnrgy w"I {MqD}H.`,tC) >d $:98y675+1OS:: SYS!e%OM790111120000OM790111120000OM790111120000e  @OM790111120000OM790111120000OM790111120000e$OM790111120000OM790111120000OM790111120000eOM790111120000OM790111120000OM790111120000OM790111120000OM790111120000OM790111120000e'$OM790111120000OM790111120000OM790111120000e:0 SNAM  UAT:ND ENDC ENDC UAT:ND EQU $ IFF S:&NULL: IFT #(1,'FORTRAN')>0 RES UAT:NV*2,0 ENDC ENDC ENDM ************************************************************ * BUFFER POOL GENERATION MACROS * * * * CALLING SEQUENCE * * BUF:R #1,#2 * *  * * #1 - NUMBER OF BUFFERS * ************************************************************ * BUF:LN EQU 512 * * BUF:R - GENERATE BUFFER POOL * MACRO BUF:R LOAD FM:SFM NAM BUF:N BUF:N EQU #1 DUP ' BUF:R1',#1 ENDM * * BUF:R1 - GENERATES BUFFERS, CALLED ONLY BY BUF:R MACRO * MACRO BUF:R1 CHAN BUF: CHAIN LINK CHAN BUF:: STATIC LINK RES  4,0 WORD BUF:LN LENGTH RES 2,0 SECTOR RES 7,0 SPARES RES BUF:LN/2,0 ENDM * IOB:A IOB,LUN,OPC,OPM,BCT,BUF,CGI,OPO * * * IOB LABEL TO BE ASSIGNED TO START OF IOB * LUN LOGICAL UNIT NAME OR NUMBER * OPC OPERATION CODE * RE: EQU 0 READ * AR: EQU 1 WRITE *  PO: EQU 2 POSITION * FU: EQU 3 FUNCTION * OPM OPERATION MODIFIER * UF: EQU 0 UNFORMATTED * FA: EQU 1 FORMATTED ALPHANUMERIC * FB: EQU 2 FORMATTED BINARY * DA: EQU 3 DIRECT FORMATTED ALPHA * DB: EQU 4 DIRECT FORMATTED BINARY * WP: EQU 5 WRITE PROMPT * * BCT REQUESTED BYTE COUNT * BUF I/O BUFFER ADDRESS * CGI ADDRESS OF CURRENT GRANULE INDEX OR ZERO * OPO OPTIONAL MODE OF OPERATION * SB: EQU 11 START IN SECOND BYTE OF BUFFER * * MACRO IOB:A IFT #?<7  NOTE 5,'NOT ENOUGH PARAMETERS' ENDC #1 WORD #2 LOGICAL UNIT NAME /NUMBER WORD 0 DEVICE DEDICATION NUMBER WORD #7 OPTIONAL ADDRESS OF CGI S: SYMVAL #8 IFF S:=0 IFT #8>15 S: SET #8 VALUE, NOT BIT EQUATE ENDC IFF #8>15 S: SET 1%#8 ENDC ENDC WORD #3%4+#4+S: WORD #5  BYTE COUNT WORD #6 I/O BUFFER ADDRESS WORD 0 ACTUAL COUNT PROCESSED WORD 0 SOFTWARE STATUS  ENDM TITL * INPUT/OUTPUT BLOCK (IOB) * IO:LUN EQU 0 LOGICAL UNIT NAME/NUMBER IO:DDN EQU 1 DEVICE DEDICATION NUMBER IO:CRI EQU 2 ADDRESS OF CURRENT RECORD INDEX IO:CFI EQU IO:CRI CURRENT FILE INDEX POINTER IO:FC EQU 3 FUNCTION CODE IO:BCT EQU 4 BYTE COUNT REQUESTED IO:BUF EQU 5 I/O BUFFER ADDRESS IO:ACT EQU 6 ACTUAL COUNT PROCESSED IO:ST EQU 7 SOFTWARE STATUS * * FUNCTION CODE BITS * * BITS 15-6 MODE OF OPERATION ER: EQU 12 DON'T CALL DOIO ERROR ROUTINE,GO TO USER SB: EQU 11 START ON SECOND BYTE OF BUFFER HA: EQU 10 USED BY HALT I/O FUNCTION. UD: EQU 9 UN-DEDICATE DEVICE AFTER PERFORMING I/O * ER:V EQU 1%ER: SB:V EQU 1%SB: * * RE: EQU 0 READ WR: EQU 1 WRITE PO: EQU 2 POSITION FU: EQU  3 FUNCTION OPEN: EQU 4 OPEN CLOSE: EQU 5 CLOSE * * * BITS 3-0 OPERATION MODIFIER * READ & WRITE UF: EQU 0 UNFORMATTED FA: EQU :B FORMATTED ALPHANUMERIC FB: EQU :A FORMATTED BINARY FS: EQU :8 FORMATTED STREAM WP: EQU 1 WRITE PROMPT DA: EQU :F  DIRECT ALPHANUMERIC DB: EQU 6 DIRECT BINARY DS: EQU :C DIRECT STREAM BS: EQU FS:  SEQUENTIAL STREAM BINARY SA: EQU :9 SEQUENTIAL STREAM ALPHA RB: EQU FB: SEQUENTIAL RECORD BINARY RA: EQU FA: SEQUENTIAL RECORD ALPHA DSB: EQU DS: DIRECT STREAM BINARY DSA:  EQU :D DIRECT STREAM ALPHA DRB: EQU :E DIRECT RECORD BINARY DRA: EQU DA: DIRECT RECORD ALPHA * * FOR POSITION * * FOR POSITION (PO:) * FAB: EQU 0 FILE POINTER ABSOLUTE BYTES FRB: EQU 1 FILE POINTER RELATIVE BYTES WAB: EQU 2 WRITE POINTER ABSOLUTE BYTES WRB: EQU 3  WRITE POINTER RELATIVE BYTES AR: EQU 4 ABSOLUTE RECORDS RR: EQU 5 RELATIVE RECORDS RFP: EQU 6 READ FILE POINTER RWP: EQU 7 READ WRITE POINTER * * FOR FUNCTION OP: EQU 0 OPEN CL: EQU 1 CLOSE PL: EQU 2 PUNCH LEADER WF: EQU 3 WRITE FILE MARK DF: EQU 4 DEVICE DEPENDENT FUNCTION SS: EQU 5 SELECT HARDWARE STATUS TF: EQU 6 TOP OF FORM SC: EQU 7 SOFTWARE CONTROL * * FOR OPEN BL: EQU 1 BLOCK I/O * * SOFTWARE STATUS * IOERR: EQU 15  ERROR CAUSED I/O TERMINATION * BITS 13-12 DESCRIBE CONCURRENT CONDITIONS TFORM: EQU 1%12 TOP OF FORM BFORM: EQU 2%12 BOTTOM OF FORM * RETRY: EQU 11 A RETRY WAS REQUIRED TO PERFORM THE OPERAT EOM:  EQU 10 END OF MEDIUM ENCOUNTERED DURING OPERATION DELDA: EQU 9 DELETED DATA READ FROM FLOPPY DISK * *  IOS4 ERROR CODES * BITS 0-5 OF STATUS WORD CONTAIN LOWER BYTE OF ORROR CODE * BIT 6 SET FOR UNRECOVERABLE *  ERROR CLASSES ER:IOR EQU 0 I/O RECOVERABLE ER:IOU EQU 1 I/O UNRECOVERABLE SPACE 3 *   NORMAL RETURN CODES NORML: EQU 0 NORMAL I/O COMPLETION EOF: EQU 1 END OF FILE (GOING FORWARD) BOF: SET 3 SPACE 3 * MACROS FOR IOS4 ERROR CODES * IOU: FOR UNRECOVERABLE, IOR: FOR RECOVERABLE MACRO IOU: #1 EQU 1%6+#2 ENDM MACRO IOR: #1 EQU #2 ENDM SPACE 3 * ERROR CODES IOR: HALTD:,1 I/O HALTED IOR: NORDY:,2 NOT READY IOR: WRTPR:,3 WRITE PROTECT IOR: TIMOT:,4 TIME OUT IOR: PWRFL:,5 POWER FAIL & UNABLE TO RECOVER  IOR: DDTNA:,6 DDT NOT AVAILABLE,CFM ONLY IOR: VOLNU:,7 VOLUME NOT ON UNIT IOR: VOLNF:,8  VOLUME NOT FOUND IOR: NOREL:,9 LOGICAL UNIT NOT RELEASED IOR: AGAIN:,10 TRY AGAIN SPACE 3 IOU: CKSUM:,1 BAD CHECK SUM IOU: UNDEV:,2 UNASSIGNED DEVICE IOU: NIUAT:,3  LUN NOT IN UAT IOU: REOM:,4 REACHED END OF MEDIA IOU: HARDW:,5 HARDWARE ERROR IOU:  ILLOP:,6 ILLEGAL OPERATION FOR THIS DEVICE IOU: NEMEM:,7 NON-EXISTANT MEMORY ADDR IOU: INRTX:,8 MEMORY ADDR IN SYSTEM ARTEA IOU: DIRFL:,9 DIRECTORY FULL IOU: NOLAB:,10 DISK NOT LABELED  IOU: FAOV:,11 FILE ADDR OVERFLOW IOU: ILLAU:,12 ILLEGAL AU IOU: AUNF:,13 AU NOT FOUND IOU: WDEOF:,14 WRITE DIRECT HIT EOF IOU: NOTXT:,15 NOT EXTENDABLE IOU: ILLFA:,16  ILLEGAL FILE ADDR IOU: ALOFU:,17 ALLOCATION TABLE FOULED UP IOU: SYSUG:,18 SYSTEM USAGE ONLY  IOU: FCBCH:,19 FCB CHAIN BAD IOU: FILEO:,20 FILE OPEN IOU: NOPEN:,21 FILE NOT OPEN  IOU: FNOP:,21 FILE NOT OPEN IOU: OONWR:,22 OLD OR NEW WRONG, CFM ONLY IOU: ILLFP:,22 ILLEGAL FILE POINTER IOU: NOUNT:,23 UNIT NOT GIVEN IOU: UNFCB:,24 UNASSIGNED FCB IOU: BUFWP:,25 BUFFER HAS WRITE PENDING IOU: NOAU:,26 NO MORE FREE AU'S IOU: BADTC:,27 BAD TYPE CODE IOU: ABORT:,28 ABORT IOU: RTXER:,63 RTX ERROR SPACE 3 * * I/O ERROR BLOCK EQUATES SPACE 3 IOE:AC EQU 0 ACB ADDR OF ERROR ACTIVITY IOE:EC EQU 1 ERROR CODE IOE:K EQU 2 K-REG OF ACTIVITY WITH ERROR IOE:DI EQU 3 DIB ADDR IOE:TI EQU 4 TIB ADDR  SPACE 3 SAVE END WRITE PENDING IOU: NOAU:,26 NO MORE FREE AU'S IOU: BADTC:,27 BAD TYPE CODE IOU: ABORT:,28 ABORT IOU: RTXER:,63 RTX ERROR SPACE 3 * * I/O ERROR BLOCK EQUATES SPACE 3 IOE:AC EQU 0 ACB ADDR OF ERROR ACTIVITY IOE:EC EQU 1 ERROR CODE IOE:K E TITL I O S D . M A C - IOS DEVELOPMENT EQUATES & MACROS (93420-14-C1) * I/O ERROR BLOCK EQUATES * IOE:AC EQU 0  ACB ADDR OF ERROR ACTIVITY IOE:EC EQU 1 ERROR CODE IOE:K EQU 2 K-REG OF ACTIVITY WI  TH ERROR IOE:DI EQU 3 DIB ADDR IOE:TI EQU 4 TIB ADDR TITL * DEVICE INFORMATION BLOCK (DIB) * DI:PER EQU 0 PEER POINTER DI:FLG EQU 1 DIB FLAGWORD DI:CIB EQU 2 MASTER CIB ADDRESS DI:FCB EQU 3 FILE CONTROL BLOCK LIST HEAD DI:NAM EQU 4 DEVICE NAME (4 CHARACTERS) DI:DN EQU 6 DEDICATION NUMBER DI:DS EQU 7 DEDICATION SEMAPHORE DI:SPB EQU 8 WATCHDOG TIMER -- NUMBER OF SHIFTS PER BYT DI:WBT EQU 9 WATCHDOG TIMER -- BASE TIME DI:DSW EQU 10 DEVICE SPECIFICATION WORDS (10-13) *  14-15 RESERVED * * DIB FLAGWORD * EQU 15 ALWAYS ZERO FOR DIB DIF:ND EQU 14  NO DEDICATION ON THIS DEVICE DIF:DP EQU 13 DI:DDN IS A POINTER TO A DEDICATION NUMBER DIF:NT EQU 12  NO TIMER FOR READ DIF:RT EQU 11 RETRY ON POWER FAIL DIF:FC EQU 10 FORM CONTROL DIF:OP EQU 9 DEVICE IS OPEN. DIF:UI EQU 1 DEVICE SUPPORTS UNSOLICITED INPUT DIF:BF EQU 0 BUFFER FLAG FOR CARD READER DIF:MT EQU 0 DISK IS MOUNTED DIF:NM EQU 1 NO AUTOMATIC MOUNT ON DISK TITL * DEVICE INFORMATION BLOCK FOR CHARACTER DEVICES * DI:CPL EQU 16 CHARACTERS PER LINE DI:LPP EQU 17 BOTTOM OF FORM COUNT/LINES PER PAGE DI:BMI EQU 18 BRANCH/MODE WORD FOR INPUT DI:BMO EQU 19 BRANCH/MODE WORD FOR OUTPUT DI:EOL EQU 20 POINTER TO END OF LINE SEQUENCE DI:TOF EQU 21 POINTER TO TOP OF FORM SEQUENCE DI:ERM EQU 22 ERROR MASK FOR STATUS DI:LC EQU 23 LINE COUNTER DI:EDT EQU 24  EDIT CHARACTER DI:ELI EQU 25 END OF LINE SEQUENCE FOR INPUT DI:BUF EQU 26 POINTER TO 2 WORD INTERNAL BUFFER DI:PU EQU 27 POINTER TO POWER UP SEQUENCE * * DEVICE INFORMATION BLOCK FOR CARD READER * *I:CPL EQU 16 CHARACTERS PER CARD *I:LPP EQU 17 =0, NOPAGES ON CARD READER *I:BMI EQU 18  BRANCH/MODE WORD FOR INPUT DI:CBA EQU 19 CURRENT BUFFER ADDR DI:ABA EQU 20 ALTERNATE BUFFER ADDR, =0 FOR NO DOBLE BUF DI:TRT EQU 21 TRANSLATION TABLE ADDR *I:ERM EQU 22 ERROR MASK FOR STATSUS TITL * DEVICE INFORMATION BLOCK FOR DISKS * DI:BPS EQU 16 BYTES PER SECTOR DI:SPT EQU 17  SECTORS PER TRACK DI:TPC EQU 18 TRACKS PER CYLINDER DI:CPD EQU 19 CYLINDERS PER DISK DI:SPA EQU 20 SECTORS PER ALLOCATION UNIT DI:CYL EQU 21 CUURRENT CYLINDER FOR FLOPPY DI:TRY EQU 22  HARD/RATE ERROR RETYR COUNT DI:VTS EQU 23 VTOC SEMAPHORE DI:ATS EQU 24 ALLOCATION TABLE SEMAPHORE DI:HOS EQU 25 HEAD OFFSET DI:HSA EQU 26 HEAD SEMAPHORE ADDR DI:SCS EQU 27  SEEK COMPLETE SEMAPHORE ADDR DI:FLP EQU 28 FLIST POINTER IN AU DI:FLN EQU 29 FLIST LENGTH IN SECTORS DI:ALO EQU 30 ALLOCATION TABLE SECTOR ADDR DI:APD EQU 31 AU PER DISK DI:BPA EQU  32 BYTES PER AU DI:SBF EQU 33 SECTORS PER BUFFER DI:SAU EQU 34 DI:BIT EQU 35 BIT # DI:CUR EQU 36 CURRENT COUNT DI:REQ EQU 37 REQUESTED NUMBER OF AUS DI:FND EQU 38  NUMBER FOUND DI:FAU EQU 39 FOUND AU START TITL * CONTROLLER INFORMATION BLOCK (CIB) * CI:PER EQU 0 PEER POINTER CI:FLG EQU 1 CIB FLAGWORD CI:MST EQU 2 MASTER LINK CI:DIB EQU 3  SUBORDINATE LINK (DIB LIST HEAD) CI:PRI EQU 4 REQUEST PRIORITY CI:DA EQU 5 DEVICE ADDRESS CI:IV EQU  6 DEVICE INTERRUPT VECTOR LOCATION CI:RD EQU 8 ENTRY POINT TO READ CI:WRT EQU 9 ENTRY POINT TO WRITE CI:POS EQU 10 ENTRY POINT TO POSITION CI:FUN EQU 11 ENTRY POINT TO FUNCTION CI:EOB EQU 12 12-15 EOB SEQUENCE * JST R:SA12 USE SYSTEM STACK * COPY TIB,Y  TIB ADDR OBVIOUSLY * JMP *$+1 * DATA I:EOB EOB ADDR CI:T1 EQU 16 TEMP CI:T2 EQU  17 TEMP CI:APR EQU 18 SAVEED PRIORITY OF ACTIVITY USING CIB CI:TIB EQU 19 TIB ADDR CI:USM EQU 20 CONTROLLER USAGE SEMAPHORE CI:TIM EQU 21 WATCH DOG TIMER CALCULATED INTERVAL CI:CSM EQU 22 COMPLETION SEMAPHORE CI:CFL EQU 23 COMPLETION FLAG * * CIB FLAGWORD * CIF:PU EQU 14 POWER UP OCCURED CIF:TO EQU 13 TIME OUT CAUSED COMPLETION CIF:OO EQU 12 OVERLAPPED OPERATIONS TITL * CONTROLLER INFORMATION BLOCK FOR DISK * CI:RAT EQU 24 RATE ERROR RETRY COUNT CI:HRD EQU 25 HARD ERROR RETRY COUNTER CI:OPC EQU 27 OP CODE CI:DCB EQU CI:OPC  START OF DISK CONTROL BLOCK CI:UNT EQU 28 UNIT CI:CYL EQU 29 CYLINDER CI:SEK EQU 30  RELATIVE SEEK COUNT CI:SEC EQU 31 SECTOR CI:CNT EQU 32 WORD COUNT CI:BUF EQU 33  BUFFER ADDR CI:IEA EQU 34 INTERUPT ENABLE & ADDR * * CONTROLLER INFORMATION BLOCK FOR HIGH CAPACITY DISK * CI:IOB EQU 35 NEXT IOB ADDR CI:WP EQU 36 WORDS PROCESSED CI:CST EQU 37  CONTROLLER SATTUS CI:DST EQU 38 DRIVE STATUS CI:DIV EQU 39 INTERUPT VECTOR, JSK CI:EOB CI:SSA EQU 40 SEEK COMPLETE SEMAPHORE ADDR * * FLOPPY DISK CONTROLLER INFORMATION BLOCK * CI:FWP EQU 35  WORDS PROCESSED CI:FST EQU 36 STATUS CI:FIV EQU 37 INTERUPT VECTOR CI:FT1 EQU 38  TEMP CI:EIV EQU 39 ERROR INTERUPT VECTOR TITL * TEMPORARY INPUT BLOCK (TIB) - USER'S STACK * TI:IOB EQU 0 IOB ADDRESS TI:FCB EQU 1 FCB ADDR TI:DIB EQU 2 DIB ADDRESS TI:CIB EQU 3 CIB ADDRESS TI:BCT EQU 4 REQUESTED BYTE COUNT TI:BUF EQU 5 BUFFER ADDRESS TI:FC EQU 6 FUNCTION CODE TI:SOF EQU 7 SOFTWARE STATUS TI:PRI EQU 13 TEMPOARY SA  VE FOR ACTIVITIES PRIORITY. * * TIB ON ENTRY TO HANDLERS * TI:CRI EQU 12 ADDR OF CURRENT RECORD INDEX * *  TIB FOR DIO * TI:TIM EQU 8 WATCHDOG TIMER VAQLUE TI:ACT EQU 9 ACTUAL BYTE COUNT TI:BMW EQU  10 BRANCH/MODE WORD TI:IBF EQU 11 INTERMEDIATE BUFFER ADDR * * TIB FOR DISKS * *TI:TIM EQU 8 WATCHDOG TIMER VAQLUE TI:SEC EQU 9 SECTOR NUMBER TI:TRK EQU 10 TRACK NUMBER (HEAD NUMBER) TI:CYL EQU 11 CYLINDER NUMBER * * TIB ON RETURN FROM HANDLERS * *TI:ACT EQU 9  ACTUAL BYTE COUNT TI:HWS EQU 10 HARDWARE STATUS (TWO WORDS) TI:HW2 EQU 11 HARDWARE STATUS WORD 2 * * TIB EQUATES * TI:T1 EQU 14 TEMP CELL TI:T2 EQU 15 TEMP CELL TI:T3 EQU 16  TEMP CELL TI:T4 EQU 17 TEMP CELL TI:QUO EQU 18 RELATIVE AU TI:REM EQU 19 REMIANDER OF SECTOR OR AU CALCULATION TI:RAU EQU 20 EXTENT RELATIVE AU BASE TI:PAU EQU 21 EXTENT PHYSICAL AU BASE TI:NAU EQU 22 NUMBER OF AUS IN EXTENT TI:FP1 EQU 23 WORKING FILE POINTER TI:FP2 EQU 24 WORKING FILE POINTER TI:WRQ EQU 25 WORKING REQUEST COUNT TI:PL EQU TI:WRQ PARAMETER LIST ADDR TI:WAC EQU 26 WORKING ACTUAL COUNT TI:FNO EQU TI:WAC FNO TI:WSF EQU 27 WOKING SOFTWARE STATUS TI:UBX EQU 28 USERS BUFFER INDEX TI:CAU EQU 29 CURRENT AU TI:CNX EQU 30 CURRENT INDEX TI:T5 EQU 31 TEMP CELL TI:T6 EQU 32 TEMP CELL TI:FCS EQU 33 FUNCTION CODE SAVE TI:BCS EQU 34 BYTE COUNT SAVE TI:BUS EQU 35 BUFFER ADDR SAVE TIBLN: EQU 36 TIB LENGTH TITL * DISTRIBUTED I/O * IODAD: SET :F IOD ADDRESS (MAY ONLY BE :C,:D,:E OR :F) IODIB: SET :C0 IOD INTERRUPT ADDRESS BASE * CRCN: SET 0  CARD READER CHANNEL NUMBER CRDA: SET IODAD:%3+CRCN:%1 . DEVICE ADDRESS CRIA: SET CRCN:%3+IODIB: . INTERRUPT ADDRESS * MTCN: SET 1 MAGNETIC TAPE CONTROLLER CHANNEL NUMBER MTDA: SET IODAD:%3+MTCN:%1 . DEVICE ADDRESS MTIA: SET MTCN:%3+IODIB: . INTERRUPT ADDRESS * TVCN: SET 2 CRT CHANNEL NUMBER TVDA: SET IODAD:%3+TVCN:%1 .  DEVICE ADDRESS TVIA: SET TVCN:%3+IODIB: . INTERRUPT ADDRESS * IECN: SET 3 IEEE INTELLIGENT CABLE CHANNEL NUMBER IEDA: SET IODAD:%3+IECN:%1 . DEVICE ADDRESS IEIA: SET IECN:%3+IODIB: . INTERRUPT ADDRESS * TYCN: SET 4 TELETYPEWRITER CHANNEL NUMBER TYDA: SET IODAD:%3+TYCN:%1 . DEVICE ADDRESS TYIA: SET TYCN:%3+IODIB: . INTERRUPT ADDRESS * PRCN: SET 5 HIGH SPEED PAPER TAPE READER CHANNEL NUMBER PRDA: SET IODAD:%3+PRCN:%1 . DEVICE ADDRESS PRIA: SET PRCN:%3+IODIB: . INTERRUPT ADDRESS * PPCN: SET 6 HIGH SPEED PAPER TAP  E PUNCH CHANNEL NUMBER PPDA: SET IODAD:%3+PPCN:%1 . DEVICE ADDRESS PPIA: SET PPCN:%3+IODIB: .  INTERRUPT ADDRESS * LPCN: SET 7 LINE PRINTER CHANNEL NUMBER LPDA: SET IODAD:%3+LPCN:%1 . DEVICE ADDRESS LPIA: SET LPCN:%3+IODIB: . INTERRUPT ADDRESS TITL *  NON-DIO * DFCN: SET :11 DISK, FLOPPY DFDA: SET DFCN:%3 . DEVICE ADDRESS * DMCN: SET :14 DISK, MEDIUM CAPACITY DMDA: SET DMCN:%3 . DEVICE ADDRESS * DHCN: SET :15  DISK, HIGH CAPACITY DHDA: SET DHCN:%3 . DEVICE ADDRESS TITL * MISCELLANEOUS EQUATES * CI:EOB EQU :C R:SA12 EQU :3F LF: EQU :A FF: EQU :C CR: EQU :D * * BUILD A WORD OF BITS MACRO * BIT:WORD MACRO WORD MACLAB BIT:EQU MACENT EQU MACLAB BIT:SET MACENT SET MACLAB BIT:SET SET 0 * BIT:LOOP MACENT NULL IFT #(1,?) BIT:SET SET 1//#(1)++BIT:SET BIT:LOOP #(2),#(3),#(4),#(5),#(6),#(7),#(8) ENDC IFF '##(0,1,1)'='N' #(-1) #(0) BIT:SET ENDC ENDM TITL * MACRO FOR INTERUPT SEQUENCE * INT:SEQ MACRO EXTR I:EOB JST R:SA12  COPY =$-CI:EOB-1,X CIN ADDR JMP *$+1 WORD I:EOB ENDM * * PATCH MACRO * PATCH:  MACRO CORG: SET $ ORG #(1) WORD #(2) ORG CORG: ENDM * * STANDARD DIB MACRO * DIB:ST MACRO LOAD D:#(1) ENDM TITL * MEDIUM/HIGH CAPACITY DISK DIB MACRO * DIB:DM MACRO DM DIB:DH MACENT DH MB: SYMVAL #2 MEGABYTES IFT #(0,'DM') SPT: SET 12 SECTORS PER TRACK TPC: SET 2 TRACKS PER CYLINDER SPA: SET 1 SECTORS PER AU CPD: SET 203 CYLINDERS PER DISK, 5MB IFT MB:=10 CPD: SET 406 ENDC ENDC IFT #(0,'DH') TPC: SET 5 SPT: SET 32 CPD: SET 823 SPA: SET 8 IFT MB:=40 CPD: SET 411 SPA: SET 4 ENDC IFT MB:=150 TPC: SET 19 CPD: SET 411 ENDC IFT MB:=300 SPA: SET 16 TPC: SET 19 ENDC ENDC APD: SET SPT:*TPC:*CPD:/SPA: AU'S PEWR DISK NAM D:#(1) D:#(1) CHAN #(0):  DI:PER WORD 0 DI:FLG WORD C:#(1,1,3) DI:CIB CHAN Z:#(1) DI:FCB  BYTE '##(1)' DI:NAM RES 1,0 DI:DN WORD 0 DI:DS WORD -9  DI:SPB WORD 1*8 DI:WBT BIT:WORD FA:,FB:,DA:,DB:,UF: BIT:WORD FA:,FB:,DA:,DB:,UF: BIT:WORD  BIT:WORD OP:,CL: RES 2,0 WORD 512 DI:BPS WORD SPT: DI:SPT WORD TPC: DI:TPC WORD CPD: DI:CPD WORD SPA: DI:SPA WORD -1 DI:CYL  BYTE 3,10 DI:TRY WORD 1 DI:VTS WORD 1 DI:ATS IFT #(0,'DM')  BYTE 1,'##(1,4,4)'-'0'&1*2 DI:HOS ENDC IFT #(0,'DH') WORD 0 DI:HOS ENDC WORD 0,0 WORD APD:/2 DI:FLP WORD CPD: DI:FLN WORD APD:/2+CPD: WORD APD: DI:APD WO  RD 512*SPA: DI:BPA WORD 1 DI:SBF RES 6,0 ENDM TITL * MEDIUM/HIGH CAPACITY DISK CIB MACRO * CIB:DM MACRO DM CIB:DH MACENT DH DEVAD: SYMVAL #(2) IFT #(2,?)=0 DEVAD: SET #(0)DA: STANDARD DEVICE ADDR ENDC IFT DEVAD:<:20 DEVAD: SET DEVAD:%3 ENDC NAM C:#(1,1,3) EXTR DK:RD,DK:WRT,DK:FUN C:#(1,1,3) CHAN CIB: CI:PER RES 2,0 CHAN #(0): CI:DIB WORD :7600 CI:PRI WORD DEVAD: WORD 0,0 WORD DK:RD,DK:WRT,0,DK:FUN  INT:SEQ CI:EOB RES 4,0 WORD 1 CI:USM WORD 0,0,0 RES 15,0  JSK C:#(1,1,3)+CI:EOB LPOOL ENDM TITL * LINE PRINTER DIB MACRO * DIB:LP MACRO LP CPL: SET  80 CHARACTERS PER LINE LPP: SET 57 LINES PER PAGE BOF: SET 3 BOTTOM OF FORM COUNT IFF #(2,?)=0 CPL: SET #(2) ENDC IFF #(3,?)=0 LPP: SET #(3) ENDC  NAM D:#(1) D:#(1) CHAN #(1,1,3): BIT:WORD DIF:FC DI:FLG - FLAG WORD EXTR C:#(1,1,3) WORD C:#(1,1,3) WORD 0 BYTE '##(1)' RES 1,0 WORD 0 WORD -3 WORD 4*8 BIT:WORD BIT:WORD FA:,UF: BIT:WORD BIT:WORD OP:,CL:,WF:,SC:,TF: RES 2,0 WORD CPL: BYTE BOF:,LPP:  WORD 0 WORD :1210 WORD !LP:CR WORD !LP:TF WORD :3202 WORD -LPP:  WORD 0 WORD 0 WORD !LP:BF WORD !LP:PU !LP:PU WORD 3 BYTE :FF,CR:,LF:,0 !LP:CR WORD 2 IFT #(4,?)=0 BYTE ' ',CR: ENDC IFF #(4,?)=0 BYTE CR:,#4 ENDC !LP:TF WORD 2  BYTE FF:,CR: !LP:BF RES 2,0 ENDM SPACE 3 SAVE END WORD CPL: BYTE BOF:,LPP:  WORD 0 WORD :1210 WORD !LP:CR WORD !LP:TF WORD :3202 WORD -LPP:  WORD 0 WORD 0 WORD !LP:BF WORD !LP:PU !LP:PU WORD 3 BYTE :FF,CR:,LF:,0 !JUAT:S O0SEGMENTBLANK oLR:LOW KD:DH00 D:DM01 D:DF01 KI:IO D:TY00 D:TR00 KD:TP00 D:TK00 D:PR00 KD:PP00 D:LP00 D:DM00 KD:DF00 D:CR00 ihg CRt LPt PPt PRtTKtTPtTRtTYtF0t F1tD0t D1tH0tJI:SLU I:RET I:STUR JI:STU0 I:POWR I:NEOB JI:FINI I:WAIT I:STUP JI:DOIO I:IO O0SEGMENTBLANK ROM o ?LR:LOW KI:ERS1 I:ERTB I:DOER KI:DOSV I:ABRT I:ECTT KR:SACT R:SPRI R:ISIG  KR:GPR R:IWAI C:HEAD KI:WDT iig h C @C @C @C @C @C @ `p҄GI@DEF LA1MH F@6EQM@IG k F@6IM IāM/p $p# J ho6Mekk@6M_@6;Zttttt tt @Р1MIAB C # ABx# g !@BJ+ B CJS8@9  @X yJK QEJN BJR # g  BCF09FXB +  N1C 6C&F09C +g HF@6E o# g# g BKQ]6ǀF#   IDL 1 N6H 1 N Bȉ@AH# g MCMC+CM # # gC+C # g /ph@phC+C?ph@kph# ttt tt ttg C6# 6B # # g 섁@ +b @1# t JI:INIT I:WDAC I:KWDT JI:LWDT R:RTCI I:DOGY JI:WDT O0SEGMENTBLANK ROM o +KKTTLF4: R:ITIC R:ISIG KR:IWAI C:HEAD I:POWR ifxgig  Hܕ ܄+6Ϡ j@F@ `+11Xdtdtttdtdig>gg@dg.i1g A s⑂@ @AF ## # tdddJI:ERS3 I:ERS2 I:ERS1 JI:ERTB O0SEGMENTBLANK oiggggJI:DOER I:DOSV I:ABRT O0SEGMENTBLANK ROM o iiggg# JD:TV00 O0SEGMENTBLANK oKTYTOF: TYEOL: TYBUF: KTYELI: C:TY0 NTY: igktTV00PPtt tttJD:TK00 O0SEGMENTBLANK oKTYTOF: TYEOL: TYBUF: KTYELI: C:TY0 NTY: igktTK00PHtt _tttJD:TY00 O0SEGMENTBLANK oKTYTOF: TYEOL: TYBUF: KTYELI: C:TY0 NTY: igktTY00PHtt _tttJD:TP00 O0SEGMENTBLANK oKTYEOL: TYBUF: C:TY0 NTY: igktTP00P t ttJD:TR00 O0SEGMENTBLANK oKTYBUF: C:TY0 NTY: igktTR00P   _tJTYELI: TYTOF: TYEOL: JTYBUF: C:TY0 O0SEGMENTBLANK o"KI:EOB TY:FUN TY:WRT KTY:RD NTY: CIB: igkktttt?tg g g gJD:LP00 O0SEGMENTBLANK o%KC:LP0 NLP0: igktLP00 P9!2#   JC:LP0 O0SEGMENTBLANK  oKI:EOB LP:FUN LP:WRT NLP0: CIB: igkkttt?tJD:CR00 O0SEGMENTBLANK ogKCR:TAB C:CR0 NCR: igktCR00PtPJC:CR0 O0SEGMENTBLANK oKI:EOB CR:WRT CR:FUN KCR:RD NCR:  CIB: igkktttt?tJD:PP00 O0SEGMENTBLANK o KC:PP0 NPP: igktPP00  JC:PP0 O0SEGMENTBLANK oKI:EOB PP:FUN PP:WRT NPP: CIB: igkkttt?tJD:PR00 O0SEGMENTBLANK oKC:PR0 NPR: igktPR00  _JC:PR0 O0SEGMENTBLANK oKI :EOB I:OPEN PR:RD NPR: CIB: igkktttt?tJD:DF03 O0SEGMENTBLANK o(KC:DF0 NZ:DF03 DF: igktkDF03AA M MGJD:DF02 O0SEGMENTBLANK o(KC:DF0 NZ:DF02 DF: igktkDF02AA M MGJD:DF01 O0SEGMENTBLANK o(KC:DF0 NZ:DF01 DF: igktkDF01AA M MGJD:DF00 O0SEGMENTBLANK o(KC:DF0 NZ:DF00 DF: igktkDF00AA M MGJC:DF0 O0SEGMENTBLANK o)KI:EOB DF:FUN DF:WRT KDF:RD NDF: CIB: igkktttt?tfdJD:DM01 O0SEGMENTBLANK o(KC:DM0 NZ:DM01 DM: igktkDM01AA    OJD:DM00 O0SEGMENTBLANK o(KC:DM0 NZ:DM00 DM: igktkDM00AA    OJC:DM0 O0SEGMENTBLANK o)KI:EOB DK:FUN DK:WRT KDK:RD NDM: CIB: igkkvttt?tdJD:DH00 O0SEGMENTBLANK o(KC:DH0 NZ:DH00 DH: igktkDH00AA  7  &7 @LJC:DH0 O0SEGMENTBLANK o)KI:EOB DK:FUN DK:WRT KDK:RD NDH: CIB: igkkvttt?tdJC:HEAD O0SEGMENTBLANK oNCIB: igkJPP:FUN LP:FUN TY:FUN JPP:WRT LP:WRT TY:WRT JPR:RD TY:RD O0SEGMENTBLANK ROM o |KI:OPCL I:VCNT I:SIV KFBW: FBR: I:STAT KI:ECTT I:RST I:SDIO KI:TRTB I:TRLL I:RET KI:EMEM I:FINI I:NEOB KI:WAIT I:DIO I:STUP iiggg EDπF ĠB΋QG F ʀDt TRt DׄDI3BJEK xC FqDOF B6E@6ArP + 1 0y vBC ܗD+KU PB ЄP# GGc󟊟tttttt t t  O YDFF 6EEKdddcb F@0 CXJQB1v 6ǀy C DD+ KFFBJ[D Xܗ 1VD+K B,y GG'C tt t  Ҟw@KQB@6 1R@ KCNĂ܄ 6À# @ KQQJDI@lJ HJICIIBΝQ ;ʙNyJQKQ/6/tttt tttLPtgg IED'DDF  EKBF A @JF àC IHGKF@ 6y}@*  &I D `DF6BK FJQC kƀF6OKbt ttA KĀy}MKI IIMDNIttt|Dt DIIzDFXJQF KIM6A*%* '} CРB̘Q ICB1C D FFI@6 C K% 'BK K C K@ K C%' BK+ IM1I@AIC uIMMDOD F@6 @M 6@FKK D BKFF AǠBy@QD}  M DRI IIF) 6A+%+ / * +'II 'CđB@1B ttt qttt A[ggg BJF / . ̠ K D II /* ӠB1P1{D+KB  I瞲  B K D IIF   FBRyD SBID@DĞD DDDI1kD+KG aCI I ZBBܗI I CF  - @KQB@6X tttttt  B  KB =KI D ItLPTYTKPPTPqJFBW: FBR: O0SEGMENTBLANK ROM o KI:SIV I:SDIO I:ECTT KI:RET I:STAT I:VCNT KI:RST I:NEOB I:STUP KI:FINI I:WAIT I:DIO iig DIBK̈́JSC DIFF I ED؞ҞОсKy  D5 ΠC FK ICD EKnC CFF DBK CILUCC IDGKC Ȟ{wtt t tttttt؞g DIBK̈́JFGF b0 DCIĐ IK  ֠CKD@yNq āJIpGFCDEK ?CC9`DI6 6݀FF DCB K Ā#"I! I G}wDI @lJ_6D/6Bht tt )KF@6+%'6*  6|EK+D@*l# JCR:WRT CR:FUN CR:RD O0SEGMENTBLANK ROM o KI:VCNT I:OPCL I:ECTT KI:EMEM I:RET I:NEOB KI:RST I:TRLT I:STAT KI:TRLL I:WAIT I:STUP KI:FINI I:DIO iig EDрF PDIB NCDIEKמ؞ٞ DIDBJ1B 6GBK' B /6yF  ̠BǀII  F ^D DBP KDB ā BKB6À  }J/6wurt tt tt t t"tt ttttg cg @ SjB TtJI:TRLT O0SEGMENTBLANK ROM o 3iig C )@aE+ 6֤ N 6LN 6?Z' DUP ' WORD BLANKS',:30  ORG CR:TAB+:20 BYTE '-JKLMNOPQ !$*);\R ' DUP ' WORD BLANKS',:30 ORG CR:TAB+:40 BYTE '&ABCDEFGH ^. TITL IOSSUB - HANDLER SUBROUTINES - 93431-14 B3 TITL IOS4 HANDLER SUBROUTINES 93435-20A0 S43520 NAM I:STAT,I:RST NAM I:TRLL,I:TRTB,I:DIO,I:SDIO,I:SIV,I:RPF NAM I:EMEM NAM I:EOB NAM I:COMP  NAM I:ECTT NAM I:VCNT NAM I:OPEN NAM I:OPCL SPACE 3 EXTR R:SSIG EXTR R:RE12 EXTR R:HIGH,R:LOW EXTR I:RET SPACE 3 SPACE 3 * TRN_UNCATE A TO LINE LENGTH *  SPACE 1 ROM REL SPACE 1 I:TRLL EQU $ RBIT 15,A TRUNCATE TO 32K ALWAYS COPY TI:DIB(Y),X DIB ADDR  COPY DI:CPL(X),Q LINE LENGTH SUB A,Q JGE Q,TRL5 NO TRUNCATION COPY DI:CPL(X),A MAX LINE LENGTH TRL5 RSK SPACE 3 * TRUNCATE TRAILING BLANKS * I:TRTB EQU $ COPY Y,Q Y NEEDED AS BASE FOR BYTE ADDRING COPY TI:BUF(Y),Y USER BUFFER ADDR SBIT BY:,S SET BYTE MODE TRT5 SUB =1,A TRUNCATE BLANK JLE A,TRT7 BUFFER ALL BLANK COPY A,X COPYB 0(Y,X),X POSSIBLE TRAILING BLANK RBIT 7,X JUST IN CASE PARITY SET TO 1 SUB =:20,X JEQ X,TRT5 TRAILING BLANK TRT7 EQU $ RBIT BY:,S SET WORD MODE ADD =1,A COUNT COPY Q,Y  RESTORE TIB ADDR RSK SPACE 6 AIB AIB 0 AUTO I/O SKELETON JSK JSK *$+1 FOR EOB SPACE 3 I:DIO EQU $ DISTRIBUTED I/O SUBROTINE JSK I:SIV SET UP INTERUPT VECTOR SPACE 1 I:SDIO EQU $ START DIO JSK I:RPF RESET POWER FAIL FLAG COPY TI:BMW(Y),A BRANCH MODE WORD COPY TI:CIB(Y),X CIB ADDR COPY CI:DA(X),Q DEVICE ADDR XNX Q  PUT DEVICE ADDR IN COMMAND OUT A,1 START U/O COPY:M TI:TIM(Y),A,CI:TIM(X) RET: 0 SPACE 3 * SET UP INTERUPT VECTOR SPACE 1 I:SIV EQU $ COPY TI:CIB(Y),X CIB ADDR  COPY CI:DA(X),Q DEVICE ADDR COPY X,A ADD =CI:EOB,A EOB ADDR COPY CI:IV(X),X INTERUPT VECTOR COPY A,IV:EOB(X) OR AIB,Q PUT DEVICE ADDR IN AUTO I/O SKELETON COPY TI:FC(Y),A SET FOR WRITE IF NOT READ AND =:0030,A LEAVE ONLY FUNCTION CODE SUB =RE:%4,A =0 IF READ  JEQ A,SIV3 READ SBIT 13,Q SET FOR AOB SIV3 EQU $ COPY Q,IV:AIO(X) COPY:M JSK,A,IV:JSK(X) FOR CALL TO EOB ROUTINE COPY TI:BCT(Y),Q BYTE COUNT COPY TI:IBF(Y),A BUFFER ADDR,)  WORD NEG Q,Q SUB =1,A JGE A,SIV5 IN LOWER 32K RBIT 15,Q BUFFER IN UPPER 64K SIV5 ADD A,A MAKE INTO BYTE ADDR-1 ADD =1,A COPY A,IV:BUF(X) COPY Q,IV:CNT(X) COPY TI:FC(Y),A CHECK FUNCTION WORD FOR SECOND BYTE TBIT SB:,A JF OV,SIV8 NOT SECOND BYTE IMS IV:BUF(X) POIUNT TO SECOND BYTE SIV8 RSK SPACE 3 SPACE 6 * RESETS COMPLETIOM SEMAPPHORE & FLAG * RESETS POWER UP FLAG * RESETS TIME OUT FLAG * * I:RPF EQU $ COPY TI:CIB(Y),X COPY CI:FLG(X),A FLAG WORD RBIT CIF:PU,A POWER UP RBIT CIF:TO,A TIMEOUT COPY A,CI:FLG(X) RESET FLAGS I:COMP EQU $ RESET COMPLETION ENTRY POINT COPY =0,A CLEAR COMPLETION SEMAPHORE COPY A,CI:CSM(X) AND COMPLETION FLAG COPY A,CI:CFL(X) RSK SPACE 6 I:STAT COPY TI:CIB(Y),X INPUT STAUS FOR DIO COPY CI:DA(X),A PUT DEVICE ADDR IN INPUT STATUS INST XNX A IN  1,A COPY TI:DIB(Y),X COPY A,Q COPY DI:ERM(X),X SHIFT X,RO,8 MASK OFF NON ERROR BITS AND X,A COPY TI:DIB(Y),X COPY DI:ERM(X),X AND =:FF,X XOR X,A ANY BITS LEFT SET IN A INDICATE AN ERROR RSK SPACE 3 RESET EQU :100 RESET COMMAND WORD I:RST EQU $ RESET DEVICE COPY =RESET,A FOR DIO COPY TI:CIB(Y),X COPY CI:DA(X),Q XNX Q PUT DEVICE ADDR IN OUT A,1 RESET RSK SPACE 6 * I:EMEM EQU $  CHECK FOR VALID MEMEORY ADDR,COMES IN A COPY TI:FC(Y),Q GET FUNCTION CODE TBIT SB:,Q CHECK IF 2ND BYTE JF OV,$+2 SKIP IF NOT ADD =1,A ELSE, ADD ONE FOR 1ST WORD SUB =1,A FORM COVERED QUOTIENT BY TWO SHIFT A,RO,1 YIELDS OFFSET OF LAST WORD OF BUFFER COPY X,TI:PRI(Y) ADDC WOM'T GO REG-REG RBIT CY:,S RESET CARRY BIT ADDC TI:PRI(Y),A ADDR OF END OF BUFFER+1 JF CY,MEM5 WRAP AROUND IF TRUE RET: -NEMEM: ADDR IN NON-EXISTANT MEMORY MEM5 EQU $ COPY =R:LOW,Q START OF RTX CSM A,Q JMP MEM15 BELOW RXT, O.K. NOP  COPY =R:HIGH,Q END OF RTX CSM Q,X JMP MEM15 ABOVE RTX, AOK NOP RET: -INRTX: ADDR IS IN RTX MEM15 SUB X,A RETURN LENGTH ADD =1,X ADJUST FOR WORD COUNT RSK SPACE 6 I:EOB EQU $ COMMON EOB ROUTINE IMS CI:CFL(X) SET COMPLETION FLAG ADD =CI:CSM,X  COMPLETION SEMAPHORE ADDR JSK R:SSIG SIGNAL COMPLETEION SEMAPHORE JMP R:RE12 RETURN FROM INTERUPT SPACE 6 I:ECTT EQU $ ERROR CODE TO TIB COPY A,X PRESERVE ERROR CODE IN A  JGE A,ECT3 NEG X,X ECT3 EQU $ COPY X,Q CSK Q,=EX:RTX SEE IF I/O ERROR JMP $+3 YES NOP COPY =RTXER:,X NO IT IS RTX ERROR ECT5 JGE A,ECT7 NOT BAD ERROR *  SBIT 15,X SET ERROR BIT ECT7 COPY TI:SOF(Y),Q AND =:7F80,Q KEEP OTHER FLAGS OR  X,Q COPY Q,TI:SOF(Y) RSK SPACE 6 I:VCNT EQU $ COUNT FROM INTERUPT VECTOR COPY TI:CIB(Y),X COPY CI:IV(X),X INTERUPT VECTOR ADDR COPY IV:CNT(X),A RBIT 15,A GET RID OF BUFFER ADDR BIT RSK SPACE 6 I:OPEN EQU $ DUMMY OPEN CLOSE ROUTINE COPY =0,A JSK  I:ECTT JMP I:RET SPACE 3 LPOOL SPACE 60 * * JSK I:OPCL * A-REGISTER RETURNS * =-1 ALREADY OPEN OR CLOSED * =0 NORMAL COMPLETION * =1 NOT AN OPEN OR CLOSE FUNCTION * * THIS ROUTINE MAINTAINS THE OPEN FLAG (DIF:OP) IN THE DIB. * IT SETS IT FOR AN OPEN OPERATION AND RESETS IT FOR A CLOSE. * I:OPCL EQU $ COPY TI:DIB(Y),X ADDRESS OF DIB TO X. COPY TI:FC(Y),A LOAD IOB FUNCTION CODE. AND =:F,A ISOLATE OPERATION MODIFIER. SUB =OP:,A IS IT AN OPEN REQUEST? SIN 6 FIRST,HOLD OFF INTERRUPTS TO ELIMINATE COPY DI:FLG(X),Q TIMING BUGS. COPY CURRENT STATE OF TBIT DIF:OP,Q DIF:OP TO Q. JNE A,NOTOPE JUMP UNLESS THIS IS AN OPEN REQUEST.  SBIT DIF:OP,Q TURN ON DIF:OP TO INDICATE OPEN DEVICE. COPY Q,DI:FLG(X) JT OV,ALREDY IF PREVIOUSLY OPEN, REPORT IT. JMP DONE NOTOPE SUB =CL:-OP:,A IS IT A CLOSE REQUEST? JNE A,NEITHR JUMP IF NOT OPEN OR CLOSE. RBIT DIF:OP,Q TURN OFF THE OPEN FLAG. COPY Q,DI:FLG(X) JT OV,DONE NORMAL IF PREVIOUSLY OPEN. ALREDY COPY =-1,A ABNORMAL IF ALREADY IN REQUESTED STATE. JMP DONE NEITHR COPY =1,A NOT OPEN OR CLOSE. DONE RSK END DEVICE. COPY Q,DI:FLG(X) JT OV,ALREDY IF PREVI TITL IOSDK - DISK HANDLERS - 93431-15 B3 TITL IOX-4 FLOPPY DISK HANDLER NAM DF:RD,DF:WRT NAM DF:FUN EXTR I:DCAL,I:EMEM,I:STUP,I:FINI,I:WAIT,I:NEOB,I:DKIC,I:SRTC EXTR I:RPF,I:DKIO,I:RET,I:HARD,I:RATE EXTR I:ECTT EXTR I:USEC EXTR I:DEOF EXTR I:OPEN SPACE 3 SEEK EQU 9 SEEK OPCODE READ EQU 7 READ ALL DATA WRITE EQU 2 WRITE NON-DELETEDD ENDTRK EQU 2  END OF TRACK & NOT ALL WORD READ DELDAT EQU 9 DELETED WORD ENCOUNTERED(IN FLOPPY STATUS) SPACE 3 ROM REL SPACE 1 DF:RD EQU $ READ ENTRY POINT DF:WRT EQU $ WRITE ENTRY POINT COPY TI:BUF(Y),X CHECK IF BUFFER EXIST& NOT IN RTX COPY TI:BCT(Y),A LENGTH OF BUFFER JSK I:EMEM VALID USER BUFFER? JLT A,FL150J IN RTX, OR NOT IN MEMORY FLP1 JSK I:DCAL POSITION CALCULATIONS JNE A,FL150J END OF MEDIA SPACE 4 JSK I:STUP SET UP JGE A,FLP2 GOT CIB FL150J JMP FLP150 HALT I/O FLP2 JEQ A,FLP3 O.K. FL101J JMP FLP101 SPACE 4 FLP3 EQU $ JSK+  I:SRTC SET UP RETRY COUNTERS COPY TI:DIB(Y),X COPY DI:CYL(X),A POSITION KNOWN JGE A,FLP20 YES FLP5 JSK RES RESTOR TO CYL=0 JEQ A,FLP20 OK JMP FLP101 ERROR ON RESTORE SPACE 6 FLP20 COPY TI:CIB(Y),X COPY TI:SEC(Y),A SET UP CONTROL BLOCK ADD =1,A SECTORS START AT 1 COPY A,CI:SEC(X) SECTOR COPY:M =0,A,TI:ACT(Y) NO BYTES DONE YET COPY TI:BCT(Y),A CONVERT BYTE COUNT TO WORDS ADD =1,A IN CASE OF ODD COUNT SHIFT A,RO,1 COPY A,CI:CNT(X) WORD COUNT COPY:M TI:BUF(Y),A,CI:BUF(X) BUFFER ADDR COPY:M TI:CYL(Y),A,CI:CYL(X) CYLINDER COPY A,Q NEW CYL TO GO INTO DIB COPY TI:DIB(Y),X DIB ADDR SUB DI:CYL(X),A RELATIVE SEEK OUNT COPY Q,DI:CYL(X) COPY DI:NAM+1(X),Q GET UNIT AND =3,Q GOT IT COPY  TI:CIB(Y),X CIB ADDR COPY Q,CI:UNT(X) UNIT INTO DCB COPY A,CI:SEK(X) COPY =READ,A  ASSUME READ OPCODE COPY TI:FC(Y),Q SHIFT Q,RO,4 AND =3,Q OPCODE ONLY SUB =RE:,Q JEQ Q,FLP24 READ COPY =WRITE,A FLP24 COPY A,CI:OPC(X) SET OPCODE FLP25 JSK I:DKIO  START I/O JEQ A,FLP200 INCOMPLETE SPACE 3 COPY TI:CIB(Y),X CIB ADDR COPY CI:FST(X),A CHECK FOR ERROR TBIT DELDAT,A SEE IF WE READ ANY DELETED DATA. JF OV,FLP30 SKIP AROUND IF WE DIDN'T. COPY TI:SOF(Y),Q SBIT DELDA:,Q SET THE DELETED WORD FLAG IN SOFT STATUS. COPY Q,TI:SOF(Y) FLP30 EQU $ COPY A,Q AND =:FB,Q JNE Q,FLP300 ERROR COPY TI:ACT(Y),A UPDATE COUNT DONE ADD CI:FWP(X),A WORDS + WORDS = BYTES ADD CI:FWP(X),A WORDS + WORDS = BYTES COPY A,TI:ACT(Y) COPY CI:FST(X),A CHECK FOR END OF TRACK TBIT ENDTRK,A JF OV,FLP100 NO , SO ALL DONE SPACE 6 COPY TI:DIB(Y),X DIB ADDR IMS DI:CYL(X) NEXT CYL  NOP COPY TI:CIB(Y),X CIB ADDR IMS CI:CYL(X) NEXT CYL NOP COPY:M =1,A,CI:SEC(X) 1ST SECTOR COPY A,CI:SEK(X) SEEK ONE TRACK COPY CI:BUF(X),A UPDATE BUFFER ADDR ADD CI:FWP(X),A COPY A,CI:BUF(X) COPY CI:CNT(X),A UPDATE COUNT TO DO SUB CI:FWP(X),A COPY A,CI:CNT(X) JMP FLP25 GO DO MORE I/O SPACE 5 FLP100 JSK I:USEC UPDATE SECTOR JSK I:DEOF CHECK FOR EOF FLP101 JSK I:FINI CLEAN UP EXIT JMP I:RET SPACE 3 FLP150 JSK I:ECTT ERROR CODE TO TIB, IN A  JMP EXIT SPACE 5 LPOOL FLP200 EQU $ JSK I:DKIC INCOMPLETE I/O COPY A,Q  KEEP A ADD =PWRFL:,Q JNE A,FLP101 NOT POWER FAIL JSK RES RESTORE JNE A,FLP101 ERROR ON RESTORE JMP FLP25 RETRY SPACE 3 FLP300 TBIT 1,A JF OV,F, LP310 NOT RATE ERROR JSK I:RATE CHECK FOR MORE RETRIES LEFT JNE A,FLP350 NO MORE  COPY TI:CIB(Y),X CIB ADDR COPY:M =0,A,CI:SEK(X) ON CYL JMP FLP25 RETRY FLP310 TBIT 0,A  JF OV,FLP320 NOT NOT READY COPY =-NORDY:,A NOT READY JMP FLP350 FLP320 TBIT 3,A JF OV,FLP330 NOT WRITE PROTECT COPY =-WRTPR:,A WRITE PROTECT JMP FLP350 FLP330 JSK I:HARD  CHECK FOR HARD ERROR RETRIES JNE A,FLP350 NO MORE COPY TI:CIB(Y),X COPY:M CI:OPC(X),A,CI:FT1(X) SAVE OP CODE JSK RES RESTORE JNE A,FLP101 ERROR ON RESTORE COPY TI:CIB(Y),X COPY:M CI:FT1(X),A,CI:OPC(X) RESOTRE OP CODE COPY:M TI:CYL(Y),A,CI:SEK(X) SET RELATIVE SEEK JMP FLP25 RETRY FLP350 COPY:M CI:FST(X),Q,TI:HWS(Y) HARDWARE STATUS TO TIB JMP FLP101 GO FINISK UP SPACE 6 RES EQU $ RESTORE COPY TI:DIB(Y),X DIB ADDR COPY:M =-1,A,DI:CYL(X) HEAD POSITION UNKNOWN COPY TI:CIB(Y),X CIB ADDR COPY:M =SEEK,A,CI:OPC(X) SET CONTROL BLOCK FOR SEEK COPY:M =4,A,CI:SEK(X) GET ONTO DISK COPY X,A ADD =CI:FIV,A INTERUPT VECTOR ADDR COPY A,CI:IEA(X) COPY TI:DIB(Y),X DIB ADDR COPY DI:NAM+1(X),A UNIT AND =3,A COPY TI:CIB(Y),X CIB ADDR COPY A,CI:UNT(X) RES5 JSK I:DKIO START SEEK JGT A,RES10 O.K. SPACE 4 RES7  EQU $ JSK I:DKIC NOT COMPLETE COPY A,Q ADD =PWRFL:,Q JEQ Q,RES5 POWER FAIL JMP RES50 HALT I/O OR TIMEOUT SPACE 4 RES10 COPY TI:CIB(Y),X COPY CI:FST(X),A  TBIT 0,A CHECK FOR READY JT OV,RES60 NOT READY COPY:M =-80,A,CI:SEK(X) BACK TO START OF DISK JSK I:DKIO START SEEK JEQ A,RES7 NOT COMPLETE COPY TI:CIB(Y),X CIB ADDR COPY CI:FST(X),A TBIT 0,A JT OV,RES60 NOT READY COPY TI:DIB(Y),X DIB ADDR COPY:M =0,A,DI:CYL(X) RESTORED RET: 0 GOOD RETURN SPACE 3 RES50 RSK RES60 COPY =-NORDY:,A NOT READY JMP RES50 SPACE 9 EOF WORD '/*' DF:FUN COPY TI:FC(Y),A AND =:F,A SUB =CL:,A JEQ A,FUN5 JMP I:OPEN DUMMY OPEN FUN5 COPY:M =EOF,A,TI:BUF(Y) COPY:M =2,A,TI:BCT(Y) JMP FLP1 END TITL IOS4 DISK HANDLER NAM DK:RD,DK:WRT NAM DK:FUN SPACE 3 EXTR I:EMEM,I:STUP,I:FINI,I:NEOB,I:DCAL,I:SRTC EXTR I:DKIO,I:DKIC,I:RATE,I:HARD EXTR R:IWAI,R:ISIG,I:ECTT,I:RET EXTR I:EOB,R:RE12 EXTR I:OPEN,I:DEOF,I:USEC EXTR R:SSIG SPACE 3 OVSEEK SET  1 OVERLAPPED SEEKS OVSEEK SET 0 NO OVERLAPPED SEEKS SPACE 3 * OPCODE EQUATES TESTIO EQU 0 TEST I/O WRITE EQU 2 WRITE DATA READ EQU 4 READ DATA SEEK EQU - 9 SEEK ONLY * * CONTROLLER STATUS EQUATES NRDY EQU 0 NOT READY RATE EQU 1  RATE ERROR WRITPROT EQU 3 WRITE PROTECT OPCOP EQU 10 OP COMPLETE HARD EQU :2F4  HARD ERROR MASK EOM EQU 11 END OF MEDIA * EOBADR EQU 3 ADDR OF EOB ROUTINE IN CI:EOB SPACE 3 ROM REL SPACE 1 DK:RD EQU $ READ ENTRY DK:WRT EQU $ WRITE ENTRY COPY TI:BUF(Y),X CHECK IF BUFFER EXIST& NOT IN RTX COPY TI:BCT(Y),A LENGTH OF BUFFER JSK I:EMEM  CHECK BUFFER JLT A,DK150J IN RTX, OR NOT IN MEMORY JSK I:DCAL CALCULATE POSITION JEQ A,DK2 ON DISK SPACE 3 DK150J JMP DK150 DK140J JMP DK140 SPACE 3 DK2 EQU $ IFT  OVSEEK COPY TI:DIB(Y),X COPY DI:HSA(X),X HEAD SEMAPHORE ADDR JSK R:IWAI WAIT FOR CONTROL OF HEAD ENDC SPACE 3 JSK I:STUP SET UP JLT A,DK150J HALT I/O JGT A,DK140J GOT CXIB BUT ERROR SPACE 3 IFT OVSEEK COPY TI:CIB(Y),X COPY CI:FLG(X),A CHECK IF POWER FAILED TBIT CIF:PU,A JF OV,DK5 JSK TIO ACTIVATE SEEK INTERUPTS ENDC SPACE 3 DK5 COPY TI:CIB(Y),X COPY:M =0,A,CI:T1(X) RESET COUNT DONE JSK I:SRTC SET UP RETRY COUNTERS COPY TI:DIB(Y),X COPY DI:NAM+1(X),Q FOR UNIT AND =3,Q UNIT COPY DI:HOS(X),A SHIFT A,RO,8 BITS TO SHIFT UNIT JEQD A,DK7 IT IS FINE JUST LIKE IT IS SHIFT A,LO,4 XNX A SHIFT Q,RO,1 UNIT DK7 EQU $ COPY TI:CIB(Y),X COPY Q,CI:UNT(X) COPY X,A ADD =CI:DIV,A EOB ADDR COPY A,CI:IEA(X) DK8 EQU $ COPY:M TI:CYL(Y),A,CI:CYL(X) CYLINDER COPY:M TI:TRK(Y),A,CI:SEK(X) HEAD OR TRACK COPY:M TI:SEC(Y),A,CI:SEC(X) SECTOR SPACE 3 IFT OVSEEK SPACE 3 COPY DI:SCS(X),X SEEK COMPLETE SEMAPHORE ADDR COPY:M =0,A,0(X) CLEAR IT COPY TI:CIB(Y),X SET UP CONTROL BLOCK FOR SEEK COPY:M =SEEK,A,CI:OPC(X) OPCODE COPY:M =SEKEOB,A,CI:EOB+EOBADR(X) SET FOR SEEK COMPLETE INTERUP SPACE 3 JSK I:DKIO START SEEK JNE A,DK140J NOT STARTED COPY TI:DIB(Y),X COPY DI:SCS(X),X ADDR OF SEEK COMPLERE SEMAPHORE SUB =1,X ADDR OF TIMER COPY:M TI:TIM(Y),A,0(X) SET TIMER COPY TI:CIB(Y),X ADD =CI:USM,X  JSK R:ISIG SIGNAL CIB SEMAPHORE COPY TI:DIB(Y),X COPY DI:SCS(X),A COPY TI:CIB(Y),X COPY A,CI:SSA(X) SEEK SEMAPHORE TO BE SIGNALED COPY A,X JSK R:IWAI WAIT ON SEEK COMPLETE SPACE 3 COPY TI:DIB(Y),X COPY DI:SCS(X),X SUB =1,X ADDR OF TIMER COPY:M =0,A,0(X) DEACTIVATE IT COPY TI:CIB(Y),X ADD =CI:USM,X JSK R:IWAI WAIT TO GET CONTROL OF CIB ENDC .  SPACE 60 COPY =READ,Q SET UP CONTROL BLOCK COPY TI:FC(Y),A AND =3%4,A ISOLATE OPCODE SUB =RE:,A JEQ A,DK10 COPY =WRITE,Q COPY TI:CIB(Y),X DK10 COPY Q,CI:OPC(X)  COPY:M TI:BUF(Y),A,CI:BUF(X) BUFFER ADDR COPY:M =I:EOB,A,CI:EOB+EOBADR(X) SET NORMAL EOB ROUTINE COPY TI:BCT(Y),A BYTE COUNT ADD =1,A IN CASE OF ODD COUNT SHIFT A,RO,1 WORD COUNT COPY A,CI:CNT(X)  SPACE 4 COPY TI:DIB(Y),X COPY DI:NAM(X),A SUB ='DM',A JNE A,DK30 NOT MEDIUM SO DON'T WORRY ABOUT FUNNY STUFF COPY  TI:BCT(Y),Q SEE IF IT GOES OVER TRACK BOUNDARY COPY =0,A COPY TI:DIB(Y),X DIV DI:BPS(X),AQ NUMBER OF SECTORS TO DO JEQ A,DK12 NO PARTIAL ADD =1,Q DK12 ADD TI:SEC(Y),Q ADD START  CSK Q,DI:SPT(X) COMPARE TO SECTORS PER TRACK JMP DK30 ALL ON TRACK JMP DK15 EXCEEDS TRACK JMP DK30 JUST MAKES IT SPACE 3 DK15 COPY DI:SPT(X),Q FIGURE NUMBER OF BYTES LEFT ON THE TRACK SUB TI:SEC(Y),Q COPY =0,A MUL DI:BPS(X),AQ SHIFT Q,RO,1 WORDS LEFT ON THE TRACK COPY TI:CIB(Y),X COPY Q,CI:CNT(X) SPACE 4 SPACE 3 DK30 JSK I:DKIO START I/O JEQ A,DK200 NOT COMPLETE SPACE 3 IFT OVSEEK JSK TIO CHECK SEEKS ENDC SPACE 3 COPY TI:CIB(Y),X COPY CI:CST(X),A CONTROLLER STATUS TBIT 15,A  JT OV,DK300 ERROR COPY CI:WP(X),A WORDS PROCESSED ADD CI:WP(X),A BYTES COPY A,TI:ACT(Y) I:USEC USES THIS ADD CI:T1(X),A BUMP COUNT DONE COPY A,CI:T1(X) JSK I:USEC UPDATE SECTOR IN TI:CRI SPACE 3 COPY TI:CIB(Y),X COPY CI:WP(X),Q ADD Q,Q BYTES DONE COPY TI:BCT(Y),A BYTES LEFT TO DO SUB Q,A BYTES LEFT TO DO JLE A,DK50 ALL DONE COPY A,TI:BCT(Y)  BYTES LEFT TO DO JSK I:DCAL CALCULATE NEW POSITION JNE A,DK140 END OF MEDIA COPY TI:CIB(Y),X COPY CI:WP(X),A UPDATE BUFFER ADDR ADD TI:BUF(Y),A COPY A,TI:BUF(Y) CONTINUE WHERE OPERATIO LEFT OFF JMP  DK8 GO READ NEXT TRACK SPACE 4 DK50 EQU $ JSK I:DEOF SPACE 3 IFT OVSEEK  COPY TI:DIB(Y),X COPY DI:HSA(X),X HEAD SEMAPHORE ADDR JSK R:ISIG SIGNAL HEAD SEMAPHORE ENDC SPACE 3 DK140 EQU $ COPY TI:CIB(Y),X COPY:M CI:T1(X),Q,TI:ACT(Y) COUNT DONE TO TIB JSK I:FINI ERROR CODE IN A, GO CLEAN UP EXIT JMP I:RET RETURN TO DOIO SPACE 6 DK150 JSK I:ECTT ERROR CODE TO TIB JMP EXIT SPACE 3 LPOOL DK200 JSK I:DKIC INCOMPLETE I/O  COPY A,Q SUB =PWRFL:,Q JEQ Q,DK12 POWER FAIL RETRY SPACE 3 IFT OVSEEK  COPY TI:CIB(Y),X COPY A,CI:T1(X) SAVE ERROR CODE JSK TIO TAKE CARE OF SEEKS COPY /  TI:CIB(Y),X COPY CI:T1(X),A ERROR CODE ENDC SPACE 3 JMP DK140 FINISH UP DK300 COPY A,Q AND =HARD,Q JEQ Q,DK303 NOT HARD ERROR JSK I:HARD DK30J EQU $ JEQ A,DK30 RETRY JMP DK140 ERROR DK303 TBIT RATE,A JF OV,DK305 NOT RATE ERROR JSK  I:RATE JNE A,DK140 ERROR JMP DK30 RETRY DK305 TBIT WRITPROT,A JF OV,DK307 NOT WRITE PROTECT COPY =-WRTPR:,A JMP DK140 DK307 TBIT NRDY,A JF OV,DK309 NOT NOT READY JSK I:HARD JEQ A,DK30J RETRY ON NOT READY COPY =-NORDY:,A NOT READY JMP DK140 DK309 TBIT EOM,A JF OV,DK311 NOT END OF MEDIA COPY =-EOM:,A JMP DK140 DK311 COPY =-HARDW:,A HARDWARE ERROR JMP DK140 EOF WORD '/*' DK:FUN COPY TI:FC(Y),A AND =:F,A SUB =CL:,A JEQ  A,FUN5 JMP I:OPEN FUN5 COPY:M =EOF,A,TI:BUF(Y) COPY:M =2,A,TI:BCT(Y) JMP DK5 SPACE 60  IFT OVSEEK TIO EQU $ ISSUES TEST I/O AND SIGNALS SEEK COMPLETE COPY TI:CIB(Y),X FOR ANY DRIVE NOT SEEKING COPY:M =TESTIO,A,CI:OPC(X) OPCODE COPY:M =0,A,CI:DST(X) CLEAR DRIVE STATUS & COPY A,CI:CST(X) CONTROLLER STATUS COPY X,A ADD =CI:DCB,A CONTROL BLOCK ADDR COPY CI:DA(X),Q  DEVILE ADDR XNX Q INTO OUT INST OUT A,0 ISSUE TEST I/O COPY CI:CST(X),A TBIT OPCOP,A IF OP COMPLETE, THEN NO ONE SEEKING JF OV,TIO50 SOMEONE IS SEEKING SO INTERUPT WILL COME TIO3 SHIFT A,LO,1 COPY CI:DIB(X),X JT OV,TIO5 STILL SEEKING COPY X,Q  COPY DI:SCS(X),X JSK R:ISIG SIGNAL SEEK COMPLETE COPY Q,X TIO5 COPY DI:PER(X),X JNE X,TIO3 NEXT DRIVE TIO50 RSK SPACE 6 SEKEOB EQU $ SEEK EOB ROUTINE COPY TI:CIB(Y),X  COPY CI:SSA(X),X ADDR OF SEEK SEMAPHORE TO SIGNAL JSK R:SSIG JMP R:RE12 RETRUN FROM INTERUPT LPOOL ENDC END TITL IOX-4 DISK HANDLER SUBROUTINES NAM I:DKIO,I:SRTC,I:DKIC NAM I:DEOF NAM I:USEC NAM I:URC NAM I:DCAL NAM I:HARD,I:RATE EXTR I:RPF,I:WAIT,I:NEOB SPACE 3 ROM REL SPACE 1 DR EQU 2 DIRECT MODIFIER BIT * I:DCAL EQU $ DISK CALCULATIONS COPY TI:CRI(Y),X POINTER TO SECTOR NUMBER COPY 0(X),A COPY 31 BIT SECTOR NUMBER TO AQ  COPY 1(X),Q COPY TI:DIB(Y),X DIB ADDR DIV DI:SPT(X),AQ SECTORS/SECTORS PER TRACK COPY A,TI:SEC(Y) SECTOR COPY =0,A UPPER 15 BITS CLEAR DIV DI:TPC(X),AQ TRACKS/TRACKS PER CYL  COPY Q,TI:CYL(Y) CYLINDER COPY DI:HOS(X),Q AND =:FF,Q HEAD OFFSET ADD Q,A COPY A,TI:TRK(Y) HEAD COPY TI:CYL(Y),Q CSK Q,DI:CPD(X) END OF MEDIA CHECK JMP DCAL5 0  O.K. NOP COPY TI:SOF(Y),A SBIT EOM:,A END OF MEDIA COPY A,TI:SOF(Y) RET: -REOM: END OF MEDIA DCAL5 RET: 0 GOOD RETURN SPACE 6 I:DKIO EQU $ START DISK I/O & WAIT FOR COMPLETEE JSK I:RPF RESET POWER FAIL, CLEAR COMPLETION STUF COPY TI:CIB(Y),X CIB ADDR COPY X,A CIB ADDR ADD =CI:DCB,A CONTROL BLOCK ADDR COPY CI:DA(X),Q DEVICE ADDR XNX Q OUT A,0 START I/O COPY:M TI:TIM(Y),A,CI:TIM(X) SET TIMER JSK I:WAIT WAIT ON COMPLETION SEMAPHORE RSK SPACE 6 I:SRTC EQU $ SET RETRY COUNTERS COPY TI:DIB(Y),X DIB ADDR COPY DI:TRY(X),A HARD/RATE COUNT COPY A,Q SHIFT A,RO,8 HARD COUNT AND =:FF,Q RATE COUNT NEG A,A SO IMS CAN BE USED NEG Q,Q COPY TI:CIB(Y),X CIB ADDR COPY A,CI:HRD(X) SET HARD COUNTER COPY Q,CI:RAT(X) SRT RATE COUNT RSK  SPACE 6 I:DKIC EQU $ INCOMPLETE DISK I/O COPY TI:CIB(Y),X CIB ADDR COPY CI:DA(X),A RESET DISK CONTROLLER XNX A SELP A,4 RESET JSK I:NEOB PUT ERROR CODE IN TIB RSK SPACE 6 I:RATE EQU $ BUMP RATE ERROR COUNT COPY TI:SOF(Y),A SET RETRY BIT IN STATUS WORD SBIT RETRY:,A COPY A,TI:SOF(Y) COPY TI:CIB(Y),X CIB ADDR IMS CI:RAT(X)  JMP RAT5 MORE RETRIES LEFT RET: -HARDW: HARDWARE ERROR RAT5 RET: 0 GOOD RETURN SPACE 6 I:HARD EQU $ BUMP HARD ERROR COUNT COPY TI:SOF(Y),A SET RETRY BIT IN STATUS WORD SBIT RETRY:,A COPY A,TI:SOF(Y) COPY TI:CIB(Y),X CIB ADDR IMS CI:HRD(X) JMP  HRD5 MORE RETRIES LEFT RET: -HARDW: HARDWARE ERROR HRD5 COPY TI:DIB(Y),X COPY DI:TRY(X),A RESET RATE ERROR COUNT AND =:FF,A NEG A,A SO IMS CAN BE USED COPY TI:CIB(Y),X CIB ADDR COPY A,CI:RAT(X) RET: 0 GOOD RETURN SPACE 6 I:USEC EQU $ UPDATE SECTOR FOR DISK COPY TI:FC(Y),A TBIT DR,A CHECK FOR DIRECT JT OV,SEC9 DIRECT , DON'T UPDATE COPY TI:ACT(Y),Q BYTES DONE COPY =0,A COPY TI:DIB(Y),X DIV DI:BPS(X),AQ DIVIDE BY BYTES PER SECTOR JEQ A,SEC5 CHECK FOR PARTIAL SECTOR ADD =1,Q ADD 1 FOR PARTIAL SECTOR I:URC EQU $ UPDATE RECORD COUNT,INCREMENT IN Q SEC5 COPY TI:CRI(Y),X ADDR OF CURRENT SECTOR ADDC 1(X),Q ADD SECTORS DONE JF CY,SEC7 NO CARRY IMS 0(X) CARRY TO UPEER 15 BITS RBIT CY:,S NOP SEC7 EQU $ COPY Q,1(X) SEC9 RSK SPACE 6 I:DEOF EQU $ CHECK FOR EOF IF ASCII COPY TI:FC(Y),A COPY A,Q SHIFT A,RO,4 AND =:F,A FUNCTION AND =:F,1 Q MODIFIER SUB =RE:,A JNE A,EOF20 NOT READ COPY Q,A SUB =FA:,A JEQ A,EOF5 ASCII SUB =DA:,Q JNE Q,EOF20 NOT ASCII EOF5 COPY *TI:BUF(Y),A SUB  ='/*',A JNE A,EOF20 NOT EOF COPY =EOF:,A JMP EOF21 EOF20 COPY =0,A EOF21 RSK LPOOL END PY TI:FC(Y),A COPY A,Q SHIFT A,RO,4 AND =:F,A FUNCTION AND =:F,Q MODIFIER SUB =RE:,A JNE A,EOF20 NOT READ COPY Q,A SUB =FA:,A JEQ A,EOF5 ASCII SUB =DA:,Q JNE Q,EOF20 NOT ASCII EOF5 COPY *TI:BUF(Y),A SUB  TITL IOSDIBCIB - DIB'S AND CIB'S - 93431-16 BO TITL D:TV00 CRT DIB NAM D:TV00 EXTR C:TY0 EXTR TYELI:,TYBUF:,TYEOL:,TYTOF: D:TV00 CHAN TY: DI:PER - PEER POINTER BIT:WORD DIF:NT,DIF:FC DI:FLG - FLAG WORD WORD C:TY0 DI:CIB - CIB ADDRESS WORD 0 DI:FCB - FCB LIST HEAD BYTE 'TV00' DI:NAM - DEVICE NAME , 4 CHARACTERS RES 1,0 DI:DN - DEDICATION NUMBER WORD 0 DI:DS - DEDICATION SEMAPHORE  WORD 0 DI:SPB - TIMER, SHIFTS PER BYTE WORD 10*8 DI:WBT - TIMER, BASE TIME * EQU $  DI:DSW - DEVICE SPECIFICATION WORDS BIT:WORD FA:,UF: READ BIT:WORD FA:,UF:,WP: WRITE BIT:WORD POSITION BIT:WORD WF:,TF:,SC:,OP:,CL: FUNCTION RES 2,0 WORDS 14-15 ARE RESERVED WORD 80 DI:CPL - CHARACTERS PER LINE WORD 0 DI:LPP - BOTTON OF FORM COUNT/LINES PER P WORD :1618 DI:BMI - BRANCH/MODE WORD FOR INPUT WORD :1612 DI:BMO - BRANCH/MODE WORD FOR OUTPUT WORD TYEOL: DI:EOL - POINTER TO ENDOF LINE SEQUENCE WORD TYTOF: DI:TOF - POINTER TO TOP OF FORM SEQUENCE WORD :2000 DI:ERM - ERROR MASK FOR STATUS  WORD 0 DI:LC - LINE COUNTER WORD :08 DI:EDT - EDIT CHARACTER WORD TYELI: DI:ELI - ADDRESS OF EOL SEQUENCE ON INPUT WORD TYBUF: DI:BUF - POINTER TO 2 WORD INTERNAL BUFFE WORD TYEOL: DI:PU - POINTER TO POWER UP SEQUENCE END TITL TELETYPE DIB FOR KEYBOARD & PRINTER NAM D:TK00 EXTR C:TY0 EXTR TYELI:,TYBUF:,TYEOL:,TYTOF: SPACE 3 D:TK00 CHAN TY: DI:PER - PEER POINTER BIT:WORD DIF:NT,DIF:FC DI:FLG - FLAG WORD WORD C:TY0 DI:CIB - CIB ADDRESS WORD 0 DI:FCB - FCB LIST HEAD BYTE 'TK00' DI:NAM - DEVICE NAME , 4 CHARACTERS RES 1,0 DI:DN - DEDICATION NUMBER WORD 0 DI:DS  - DEDICATION SEMAPHORE WORD 0 DI:SPB - TIMER, SHIFTS PER BYTE WORD 10*8 DI:WBT - TIMER, BASE TIME *  EQU $ DI:DSW - DEVICE SPECIFICATION WORDS, 10-13 BIT:WORD FA:,UF: READ BIT:WORD FA:,UF:,WP: WRITE BIT:WORD POSITION BIT:WORD WF:,TF:,SC:,OP:,CL: FUNCTION RES 2,0 WORDS 14-15 ARE RESERVED WORD 72 DI:CPL - CHARACTERS PER LINE WORD 0 DI:LPP - BOTTOM OF FORM COUNT/LINES PER P WORD :1618 2  DI:BMI - BRANCH/MODE WORD FOR INPUT WORD :1612 DI:BMO - BRANCH/MODE WORD FOR OUTPUT WORD TYEOL: DI:EOL - POINTER TO ENDOF LINE SEQUENCE WORD TYTOF: DI:TOF - POINTER TO TOP OF FORM SEQUENCE WORD :2000 DI:ERM - ERROR MASK FOR STATUS WORD 0 DI:LC - LINE COUNTER WORD '_' DI:EDT - EDIT CHARACTER WORD TYELI:  DI:ELI - ADDRESS OF EOL SEQUENCE ON INPUT WORD TYBUF: DI:BUF - POINTER TO 2 WORD INTERNAL BUFFE WORD TYEOL: DI:PU - POINTER TO POWER UP SEQUENCE END TITL TELETYPE DIB NAM D:TY00 EXTR C:TY0  EXTR TYELI:,TYBUF:,TYEOL:,TYTOF: SPACE 3 D:TY00 CHAN TY: DI:PER - PEER POINTER BIT:WORD DIF:NT,DIF:FC DI:FLG - FLAG WORD WORD C:TY0 DI:CIB - CIB ADDRESS WORD 0 DI:FCB - FCB LIST HEAD BYTE 'TY00'  DI:NAM - DEVICE NAME , 4 CHARACTERS RES 1,0 DI:DN - DEDICATION NUMBER WORD 0 DI:DS - DEDICATION SEMAPHORE WORD 0 DI:SPB - TIMER, SHIFTS PER BYTE WORD 10*8 DI:WBT - TIMER, BASE TIME * EQU $ DI:DSW - DEVICE SPECIFICATION WORDS, 10-13 BIT:WORD FA:,UF: READ BIT:WORD FA:,UF:,WP: WRITE BIT:WORD POSITION BIT:WORD OP:,CL:,SC:,TF:,WF: FUNCTION RES 2,0 WORDS 14-15 ARE RESERVED WORD 72 DI:CPL - CHARACTERS PER LINE WORD 0 DI:LPP - BOTTOM OF FORM COUNT/LINES PER P WORD :161C  DI:BMI - BRANCH/MODE WORD FOR INPUT WORD :1612 DI:BMO - BRANCH/MODE WORD FOR OUTPUT WORD TYEOL: DI:EOL - POINTER TO ENDOF LINE SEQUENCE WORD TYTOF: DI:TOF - POINTER TO TOP OF FORM SEQUENCE WORD :2000 DI:ERM - ERROR MASK FOR STATUS WORD 0 DI:LC - LINE COUNTER WORD '_' DI:EDT - EDIT CHARACTER WORD TYELI: DI:ELI - ADDRESS OF EOL SEQUENCE ON INPUT WORD TYBUF: DI:BUF - POINTER TO 2 WORD INTERNAL BUFFE WORD TYEOL: DI:PU - POINTER TO POWER UP SEQUENCE END TITL TELETYPE PUNCH DIB NAM D:TP00 EXTR C:TY0  EXTR TYBUF:,TYEOL: SPACE 3 D:TP00 CHAN TY: DI:PER - PEER POINTER WORD 0 DI:FLG - FLAG WORD WORD C:TY0 DI:CIB - CIB ADDRESS WORD 0 DI:FCB - FCB LIST HEAD BYTE 'TP00' DI:NAM - DEVICE NAME , 4 CHARACTERS RES 1,0 DI:DN - DEDICATION NUMBER WORD 0 DI:DS - DEDICATION SEMAPHORE  WORD 0 DI:SPB - TIMER, SHIFTS PER BYTE WORD 10*8 DI:WBT - TIMER, BASE TIME * EQU $ DI:DSW - DEVICE SPECIFICATION WORDS, 10-13 BIT:WORD READ BIT:WORD FA:,UF:,FB: WRITE BIT:WORD POSITION  BIT:WORD OP:,CL:,WF:,PL: FUNCTION RES 2,0 WORDS 14-15 ARE RESERVED WORD :7FFF DI:CPL - CHARACTERS PER LINE WORD 0 DI:LPP - BOTTOM OF FORM COUNT/LINES PER P WORD 0 DI:BMI - BRANCH/MODE WORD FOR INPUT WORD :1612 DI:BMO - BRANCH/MODE WORD FOR OUTPUT WORD TYEOL: DI:EOL - POINTER TO ENDOF LINE SEQUENCE WORD 0 DI:TOF - POINTER TO TOP OF FORM SEQUENCE WORD :2000 DI:ERM - ERROR MASK FOR STATUS WORD 03  DI:LC - LINE COUNTER WORD 0 DI:EDT - EDIT CHARACTER WORD 0 DI:ELI - ADDRESS OF EOL SEQUENCE ON INPUT WORD TYBUF: DI:BUF - POINTER TO 2 WORD INTERNAL BUFFE WORD TYEOL: DI:PU - POINTER TO 2 WORD INTERNAL BUFFER END TITL TELETYPE READER DIB NAM D:TR00 EXTR C:TY0 EXTR TYBUF:  SPACE 3 D:TR00 CHAN TY: DI:PER - PEER POINTER WORD 0 DI:FLG - FLAG WORD WORD C:TY0 DI:CIB - CIB ADDRESS WORD 0 DI:FCB - FCB LIST HEAD BYTE 'TR00' DI:NAM - DEVICE NAME , 4 CHARACTERS  RES 1,0 DI:DN - DEDICATION NUMBER WORD 0 DI:DS - DEDICATION SEMAPHORE WORD 0 DI:SPB - TIMER, SHIFTS PER BYTE WORD 10*8 DI:WBT - TIMER, BASE TIME * EQU $ DI:DSW - DEVICE SPECIFICATION WORDS, 10-13 BIT:WORD FA:,UF:,FB: READ BIT:WORD WP: WRITE BIT:WORD POSITION BIT:WORD OP:,CL: FUNCTION  RES 2,0 WORDS 14-15 ARE RESERVED WORD :7FFF DI:CPL - CHARACTERS PER LINE WORD 0  DI:LPP - BOTTOM OF FORM COUNT/LINES PER P WORD :1614 DI:BMI - BRANCH/MODE WORD FOR INPUT WORD 0 DI:BMO - BRANCH/MODE WORD FOR OUTPUT WORD 0 DI:EOL - POINTER TO ENDOF LINE SEQUENCE WORD 0 DI:TOF - POINTER TO TOP OF FORM SEQUENCE WORD :2000 DI:ERM - ERROR MASK FOR STATUS WORD 0 DI:LC - LINE COUNTER WORD '_' DI:EDT - EDIT CHARACTER WORD 0 DI:ELI - ADDRESS OF EOL SEQUENCE ON INPUT WORD TYBUF: DI:BUF - POINTER TO 2 WORD INTERNAL BUFFE WORD 0 DI:PU - POINTER TO POWER UP SEQUENCE END TITL TELETYPE CIB NAM C:TY0 NAM TYBUF:,TYEOL:,TYTOF:,TYELI: EXTR TY:RD,TY:WRT,TY:FUN SPACE  3 C:TY0 CHAN CIB: CI:PER - PEER POINTER WORD 0 CI:FLG - FLAG WORD WORD 0 CI:MST - MASTER LINK CHAN TY: CI:DIB - DIB LIST HEAD WORD :7400 CI:PRI - REQUEST PRIORITY WORD TYDA: CI:DA - DEVICE ADDRESS WORD TYIA: CI:IV - INTERUPT VECTOR ADDRESS RES 1,0 CI:UN1 - RESERVED WORD TY:RD CI:RD - ENTRY POINT TO READ WORD TY:WRT CI:WRT - ENTRY POINT TO WRITE WORD 0 CI:POS - ENTRY POINT TO POSITION WORD TY:FUN CI:FUN - ENTRY POINT TO FUNCTION INT:SEQ CI:EOB - END OF BLOCK ROUTINE  RES 1,0 CI:T1 - TEMP CELL RES 1,0 CI:T2 - TEMP CELL RES 1,0 CI:APR - PRIORITY OF ACTIVIY RES 1,0 CI:TIB - TIB ADDRESS WORD 1 CI:USM - CONTROLLER USAGE SEMAPHORE WORD 0 CI:TIM - TIMER WORD 0 CI:CSM - COMPLETION SEMAPHORE WORD 0 CI:CFL - COMPLETION FLAG SPACE 6 TYEOL: WORD 2 END OF LINE SEQUENCE BYTE CR:,LF: TYTOF: WORD 4 TOP OF FORM SEQUENCE BYTE CR:,LF: BYTE LF:,LF: TYELI: WORD 1 INPUT END OF LINE BYTE CR:,LF: TYBUF: RES 2,0 INTERNAL BUFFER LPOOL END TITL CENTRONICS LINE PRINTER DIB NAM 4  D:LP00 EXTR C:LP0 SPACE 3 D:LP00 CHAN LP0: DI:PER - PEER POINTER BIT:WORD DIF:FC DI:DLG - FLAG WORD WORD C:LP0 DI:CIB - CIB ADDRESS WORD 0 DI:FCB - FCB LIST HEAD BYTE 'LP00' DI:NAM - DEVICE NAME , 4 CHARACTERS RES 1,0 DI:DN - DEDICATION NUMBER WORD 0 DI:DS - DEDICATION SEMAPHORE WORD -3 DI:SPB - TIMER, SHIFTS PER BYTE WORD 4*8 DI:WBT - TIMER, BASE TIME * EQU $  DI:DSW - DEVICE SPECIFICATION WORDS, 10-13 BIT:WORD READ BIT:WORD FA:,UF: WRITE BIT:WORD POSITION BIT:WORD OP:,CL:,WF:,SC:,TF: FUNCTION RES 2,0 WORDS 14-15 ARE RESERVED WORD 80 DI:CPL - CHARACTERS PER LINE BYTE 3,57 DI:LPP - BOTTOM OF FORM COUNT/LINES PER PAGE WORD 0 DI:BMI - BRANCH/MODE WORD FOR INPUT WORD :1210 DI:BMO - BRANCH/MODE WORD FOR OUTPUT WORD LPEOL DI:EOL - POINTER TO ENDOF LINE SEQUENCE WORD LPTOF DI:TOF - POINTER TO TOP OF FORM SEQUENCE WORD :3202 DI:ERM - ERROR MASK FOR STATUS WORD -57 DI:LC - LINE COUNTER WORD 0 DI:EDT - EDIT CHARACTER WORD 0 DI:ELI - ADDRESS OF EOL SEQUENCE ON INPUT WORD LPBUF DI:BUF - POINTER TO 2 WORD INTERNAL BUFFE WORD LPPU DI:PU - POINTER TO POWER UP SEQUENCE SPACE 6 LPPU WORD 3 POWER UP BYTE :FF,CR: BYTE LF:,0 LPEOL WORD 2 END OF LINE  BYTE ' ',CR: LPTOF WORD 2 TOP OF FORM BYTE FF:,CR: LPBUF RES 2,0 INTERNAL BUFFER  END TITL LINE PRINTER CIB NAM C:LP0 EXTR LP:WRT,LP:FUN SPACE 3 C:LP0 CHAN CIB: CI:PER - PEER POINTER WORD 0 CI:FLG - FLAG WORD WORD 0 CI:MST - MASTER LINK CHAN LP0: CI:DIB - DIB LIST HEAD WORD :7400 CI:PRI - REQUEST PRIORITY WORD LPDA: CI:DA - DEVICE ADDRESS WORD LPIA: CI:IV - INTERUPT VECTOR ADDRESS RES 1,0 CI:UN1 - RESERVED WORD 0 CI:RD - ENTRY POINT TO READ WORD LP:WRT CI:WRT - ENTRY POINT TO WRITE WORD 0 CI:POS - ENTRY POINT TO POSITION WORD LP:FUN CI:FUN - ENTRY POINT TO FUNCTION INT:SEQ CI:EOB - END OF BLOCK ROUTINE RES 1,0 CI:T1 - TEMP CELL RES 1,0 CI:T2 - TEMP CELL RES 1,0 CI:APR - PRIORITY OF ACTIVIY RES 1,0 CI:TIB - TIB ADDRESS WORD 1 CI:USM - CONTROLLER USAGE SEMAPHORE WORD 0  CI:TIM - TIMER WORD 0 CI:CSM - COMPLETION SEMAPHORE WORD 0 CI:CFL - COMPLETION FLAG  LPOOL END TITL CARD READER DIB NAM D:CR00 EXTR C:CR0,CR:TAB SPACE 3 D:CR00 CHAN CR: DI:PER - PEER POINTER WORD 0 DI:FLG - FLAG WORD WORD C:CR0 DI:CIB - CIB ADDRESS WORD 0 DI:FCB - FCB LIST HEAD BYTE 'CR00' DI:NAM - DEVICE NAME , 4 CHARACTERS RES 1,0  DI:DN - DEDICATION NUMBER WORD 0 DI:DS - DEDICATION SEMAPHORE WORD -5 DI:SPB - TIMER, SHIFTS PER BYT5 E WORD 3*8 DI:WBT - TIMER, BASE TIME * EQU $ DI:DSW - DEVICE SPECIFICATION WORDS, 10-13 BIT:WORD FA:,UF: READ BIT:WORD WP: WRITE BIT:WORD POSITION BIT:WORD OP:,CL: FUNCTION RES 2,0  WORDS 14-15 ARE RESERVED WORD 80 DI:CPL - CHARACTERS PER CARD WORD 0 DI:LPP - =0, NO PAGES WORD :210 DI:BMI - BRANCH/MODE WORD FOR INPUT WORD CRCBA DI:CBA - CURRENT BUFFER ADDRESS WORD 0  DI:ABA - ALTERNATE BUFFER ADDRESS WORD CR:TAB DI:TRT - TRANSLATION TABLE ADDRESS WORD :1702 DI:ERM - ERROR MASK FOR STATUS SPACE 6 CRCBA RES 80,0 PRIMARY BUFFER END TITL CARD READER CIB  NAM C:CR0 EXTR CR:RD,CR:FUN EXTR CR:WRT SPACE 3 C:CR0 CHAN CIB: CI:PER - PEER POINTER WORD 0 CI:FLG - FLAG WORD WORD 0 CI:MST - MASTER LINK CHAN CR: CI:DIB - DIB LIST HEAD WORD :7400 CI:PRI - REQUEST PRIORITY WORD CRDA: CI:DA - DEVICE ADDRESS WORD CRIA: CI:IV - INTERUPT VECTOR ADDRESS RES 1,0 CI:UN1 - RESERVED WORD CR:RD CI:RD - ENTRY POINT TO READ WORD CR:WRT CI:WRT - ENTRY POINT FOR WRITE WORD 0 CI:POS - ENTRY POINT TO POSITION WORD CR:FUN CI:FUN - ENTRY POINT TO FUNCTION INT:SEQ CI:EOB - END OF BLOCK ROUTINE RES 1,0 CI:T1 - TEMP CELL RES 1,0 CI:T2 - TEMP CELL RES 1,0 CI:APR - PRIORITY OF ACTIVIY RES  1,0 CI:TIB - TIB ADDRESS WORD 1 CI:USM - CONTROLLER USAGE SEMAPHORE WORD 0 CI:TIM - TIMER WORD 0 CI:CSM - COMPLETION SEMAPHORE WORD 0 CI:CFL - COMPLETION FLAG LPOOL END TITL HSPT PUNCH DIB NAM D:PP00 EXTR C:PP0 SPACE 3 D:PP00 CHAN PP: DI:PER - PEER POINTER WORD 0 DI:FLG - FLAG WORD WORD C:PP0 DI:CIB - CIB ADDRESS WORD 0 DI:FCB - FCB LIST HEAD BYTE 'PP00' DI:NAM - DEVICE NAME , 4 CHARACTERS RES 1,0 DI:DN - DEDICATION NUMBER WORD 0  DI:DS - DEDICATION SEMAPHORE WORD -3 DI:SPB - TIMER, SHIFTS PER BYTE WORD 4*8 DI:WBT - TIMER, BASE TIME * EQU $ DI:DSW - DEVICE SPECIFICATION WORDS, 10-13 BIT:WORD READ BIT:WORD FA:,FB:,UF: WRITE BIT:WORD POSITION BIT:WORD OP:,CL:,PL:,WF:,SC:,TF: FUNCTION RES 2,0 WORDS 14-15 ARE RESERVED WORD :7FFF DI:CPL - CHARACTERS PER LINE WORD 0 DI:LPP - BOTTOM OF FORM COUNT/LINES PER P WORD 0 DI:BMI - BRANCH/MODE WORD FOR INPUT WORD :1210 DI:BMO - BRANCH/MODE WORD FOR OUTPUT WORD PPEOL DI:EOL - POINTER TO ENDOF LINE SEQUENCE WORD 0 DI:TOF - POINTER TO TOP OF FORM SEQUENCE WORD :1600 DI:ERM - ERROR MASK FOR STATUS WORD 0 DI:LC - LINE COUNTER WORD 0 DI:EDT - EDIT CHARACTER WORD 0 DI:ELI - ADDRESS OF EOL SEQUENCE ON INPUT WORD PPBUF DI:BUF - POINTER TO 2 WORD INTERNAL BUFFE6  WORD PPEOL DI:PU - POINTER TO POWER UP SEQUENCE SPACE 6 PPEOL WORD 2 END OF LINE BYTE CR:,LF: PPBUF RES 2,0 INTERNAL BUFFER END TITL HSPT PUNCH CIB NAM C:PP0  EXTR PP:WRT,PP:FUN SPACE 3 C:PP0 CHAN CIB: CI:PER - PEER POINTER WORD 0 CI:FLG - FLAG WORD WORD 0 CI:MST - MASTER LINK CHAN PP: CI:DIB - DIB LIST HEAD WORD :7400 CI:PRI - REQUEST PRIORITY WORD PPDA: CI:DA - DEVICE ADDRESS WORD PPIA: CI:IV - INTERUPT VECTOR ADDRESS RES  1,0 CI:UN1 - RESERVED WORD 0 CI:RD - ENTRY POINT TO READ WORD PP:WRT CI:WRT - ENTRY POINT TO WRITE WORD 0 CI:POS - ENTRY POINT TO POSITION WORD PP:FUN CI:FUN - ENTRY POINT TO FUNCTION INT:SEQ CI:EOB - END OF BLOCK ROUTINE RES 1,0 CI:T1 - TEMP CELL RES 1,0 CI:T2 - TEMP CELL RES 1,0 CI:APR - PRIORITY OF ACTIVIY RES 1,0 CI:TIB - TIB ADDRESS WORD 1  CI:USM - CONTROLLER USAGE SEMAPHORE WORD 0 CI:TIM - TIMER WORD 0 CI:CSM - COMPLETION SEMAPHORE WORD 0 CI:CFL - COMPLETION FLAG LPOOL END TITL HSPT READER DIB NAM D:PR00 EXTR C:PR0 SPACE 3 D:PR00 CHAN PR: DI:PER - PEER POINTER WORD 0 DI:FLG - FLAG WORD WORD C:PR0 DI:CIB - CIB ADDRESS WORD 0 DI:FCB - FCB LIST HEAD BYTE 'PR00' DI:NAM - DEVICE NAME , 4 CHARACTERS RES 1,0 DI:DN - DEDICATION NUMBER WORD 0 DI:DS - DEDICATION SEMAPHORE WORD -5 DI:SPB - TIMER, SHIFTS PER BYTE WORD 2*8 DI:WBT - TIMER, BASE TIME * EQU $  DI:DSW - DEVICE SPECIFICATION WORDS, 10-13 BIT:WORD FA:,FB:,UF: READ BIT:WORD WP: WRITE BIT:WORD POSITION  BIT:WORD OP:,CL: FUNCTION RES 2,0 WORDS 14-15 ARE RESERVED WORD :7FFF DI:CPL - CHARACTERS PER LINE WORD 0 DI:LPP - BOTTOM OF FORM COUNT/LINES PER P WORD :1210 DI:BMI - BRANCH/MODE WORD FOR INPUT WORD 0 DI:BMO - BRANCH/MODE WORD FOR OUTPUT WORD 0 DI:EOL - POINTER TO ENDOF LINE SEQUENCE WORD 0 DI:TOF - POINTER TO TOP OF FORM SEQUENCE WORD :200 DI:ERM - ERROR MASK FOR STATUS WORD 0  DI:LC - LINE COUNTER WORD '_' DI:EDT - EDIT CHARACTER WORD 0 DI:ELI - ADDRESS OF EOL SEQUENCE ON INPUT WORD PRBUF DI:BUF - POINTER TO 2 WORD INTERNAL BUFFE WORD 0 DI:PU - POINTER TO POWER UP SEQUENCE SPACE 6 PRBUF RES 2,0 INTERNAL BUFFER END TITL HSPT READER CIB NAM C:PR0 EXTR PR:RD,I:OPEN SPACE 3 C:PR0 CHAN CIB: CI:PER - PEER POINTER WORD 0 CI:FLG - FLAG WORD WORD 0 CI:MST - MASTER LINK CHAN PR: CI:DIB - DIB LIST HEAD WORD :7400  CI:PRI - REQUEST PRIORITY WORD PRDA: CI:DA - DEVICE ADDRESS WORD PRIA: CI:IV - INTERUPT VECTOR ADDRESS 7  RES 1,0 CI:UN1 - RESERVED WORD PR:RD CI:RD - ENTRY POINT TO READ WORD PR:RD CI:WRT - ENTRY FOR WRITE WORD 0 CI:POS - ENTRY POINT TO POSITION WORD I:OPEN CI:FUN - ENTRY POINT TO FUNCTION INT:SEQ CI:EOB - END OF BLOCK ROUTINE RES 1,0 CI:T1 - TEMP CELL RES 1,0 CI:T2 - TEMP CELL RES 1,0 CI:APR - PRIORITY OF ACTIVIY RES 1,0 CI:TIB - TIB ADDRESS WORD 1 CI:USM - CONTROLLER USAGE SEMAPHORE WORD 0 CI:TIM - TIMER WORD 0 CI:CSM - COMPLETION SEMAPHORE WORD 0 CI:CFL - COMPLETION FLAG LPOOL END TITL FLOPPY DISK DIB NAM D:DF03 EXTR C:DF0 SPACE 3 D:DF03 CHAN DF: DI:PER - PEER POINTER WORD 0 DI:FLG - FLAG WORD WORD C:DF0 DI:CIB - CIB ADDRESS CHAN Z:DF03 DI:FCB - FCB LIST HEAD BYTE 'DF03' DI:NAM - DEVICE NAME , 4 CHARACTERS RES 1,0 DI:DN - DEDICATION NUMBER WORD 0 DI:DS - DEDICATION SEMAPHORE WORD -7 DI:SPB - TIMER, SHIFTS PER BYTE WORD 2*8 DI:WBT - TIMER, BASE TIME * EQU  $ DI:DSW - DEVICE SPECIFICATION WORDS, 10-13 BIT:WORD FA:,FB:,DA:,DB:,UF: READ BIT:WORD FA:,FB:,DA:,DB:,UF: WRITE BIT:WORD POSITION BIT:WORD OP:,CL: FUNCTION RES 2,0 WORDS 14-15 ARE RESERVED WORD 128 DI:BPS - BYTES PER SECTOR WORD 26 DI:SPT - SECTORS PER TRACK WORD 1 DI:TPC - TRACKS PER CYLINDER WORD 77 DI:CPD - CYLINDERS PER DISK WORD 4 DI:SPA - SECTORS PER ALLOCATION UNIT WORD -1 DI:CYL - CURRENT CYLINDER FOR FLOPPY WORD :30A DI:TRY - HARD ERROR/RATE ERROR RETRY COUNT WORD 1  DI:VTS - VTOC SEMAPHORE WORD 1 DI:ATS - ALLOCATION TABLE SEMAPHORE WORD 0 DI:HOS - HEAD OFFSET WORD 0 DI:HSA - HEAD SEMAPHORE ADDR WORD 0 DI:SCS - SEEK COMPLETE SEMAPHORE ADDR WORD 26*77/4/2  DI:FLP - FLIST POINTER, AU WORD 77 DI:FLN - FLIST LENGTH WORD 26*77/4/2+77 DI:ALO - ALLOCATION TABLE ADDR WORD 26*77/4 DI>APD - AU'S PER DISK WORD BUF:LN DI:BPA - BYTES PER AU WORD 4 DI:SBF - SECTORS PER BUFFER RES 1,0 DI:SAU - AU START OF BUFFER RES 1,0 DI:BIT - BIT # RES 1,0 DI:CUR - CURRENT COUNT RES 1,0 DI:REQ - REQUESTED # OF AUS RES 1,0 DI:FND - FOUND COUNT RES 1,0 DI:FUA - FOUND AU END TITL FLOPP DISK DIB NAM D:DF02 EXTR C:DF0 SPACE 3 D:DF02 CHAN DF: DI:PER - PEER POINTER WORD 0 DI:FLG - FLAG WORD WORD C:DF0 DI:CIB - CIB ADDRESS CHAN Z:DF02 DI:FCB - FCB LIST HEAD BYTE 'DF02' DI:NAM - DEVICE NAME , 4 CHARACTERS RES 1,0 DI:DN - DEDICATION NUMBER WORD 0 DI:DS - DEDICATION SEMAPHORE WORD -7 DI:SPB - TIMER, SHIFTS PER BYTE WORD 2*8 DI:WBT - TIMER, BASE TIME * EQU 8  $ DI:DSW - DEVICE SPECIFICATION WORDS, 10-13 BIT:WORD FA:,FB:,DA:,DB:,UF: READ BIT:WORD FA:,FB:,DA:,DB:,UF: WRITE BIT:WORD POSITION BIT:WORD OP:,CL: FUNCTION RES 2,0 WORDS 14-15 ARE RESERVED WORD 128 DI:BPS - BYTES PER SECTOR WORD 26 DI:SPT - SECTORS PER TRACK WORD 1 DI:TPC - TRACKS PER CYLINDER WORD 77 DI:CPD - CYLINDERS PER DISK WORD 4 DI:SPA - SECTORS PER ALLOCATION UNIT WORD -1 DI:CYL - CURRENT CYLINDER FOR FLOPPY WORD :30A DI:TRY - HARD ERROR/RATE ERROR RETRY COUNT WORD 1  DI:VTS - VTOC SEMAPHORE WORD 1 DI:ATS - ALLOCATION TABLE SEMAPHORE WORD 0 DI:HOS - HEAD OFFSET WORD 0 DI:HSA - HEAD SEMAPHORE ADDR WORD 0 DI:SCS - SEEK COMPLETE SEMAPHORE ADDR WORD 26*77/4/2  DI:FLP - FLIST POINTER, AU WORD 77 DI:FLN - FLIST LENGTH WORD 26*77/4/2+77 DI:ALO - ALLOCATION TABLE ADDR WORD 26*77/4 DI>APD - AU'S PER DISK WORD BUF:LN DI:BPA - BYTES PER AU WORD 4 DI:SBF - SECTORS PER BUFFER RES 1,0 DI:SAU - AU START OF BUFFER RES 1,0 DI:BIT - BIT # RES 1,0 DI:CUR - CURRENT COUNT RES 1,0 DI:REQ - REQUESTED # OF AUS RES 1,0 DI:FND - FOUND COUNT RES 1,0 DI:FUA - FOUND AU END TITL FLOPPY DISK DIB NAM D:DF01 EXTR C:DF0 SPACE 3 D:DF01 CHAN DF: DI:PER - PEER POINTER WORD 0 DI:FLG - FLAG WORD WORD C:DF0 DI:CIB - CIB ADDRESS CHAN Z:DF01 DI:FCB - FCB LIST HEAD BYTE 'DF01' DI:NAM - DEVICE NAME , 4 CHARACTERS RES 1,0 DI:DN - DEDICATION NUMBER WORD 0 DI:DS - DEDICATION SEMAPHORE WORD -7 DI:SPB - TIMER, SHIFTS PER BYTE WORD 2*8 DI:WBT - TIMER, BASE TIME * EQU  $ DI:DSW - DEVICE SPECIFICATION WORDS, 10-13 BIT:WORD FA:,FB:,DA:,DB:,UF: READ BIT:WORD FA:,FB:,DA:,DB:,UF: WRITE BIT:WORD POSITION BIT:WORD OP:,CL: FUNCTION RES 2,0 WORDS 14-15 ARE RESERVED WORD 128 DI:BPS - BYTES PER SECTOR WORD 26 DI:SPT - SECTORS PER TRACK WORD 1 DI:TPC - TRACKS PER CYLINDER WORD 77 DI:CPD - CYLINDERS PER DISK WORD 4 DI:SPA - SECTORS PER ALLOCATION UNIT WORD -1 DI:CYL - CURRENT CYLINDER FOR FLOPPY WORD :30A DI:TRY - HARD ERROR/RATE ERROR RETRY COUNT WORD 1  DI:VTS - VTOC SEMAPHORE WORD 1 DI:ATS - ALLOCATION TABLE SEMAPHORE WORD 0 DI:HOS - HEAD OFFSET WORD 0 DI:HSA - HEAD SEMAPHORE ADDR WORD 0 DI:SCS - SEEK COMPLETE SEMAPHORE ADDR WORD 26*77/4/2  DI:FLP - FLIST POINTER, AU WORD 77 DI:FLN - FLIST LENGTH WORD 26*77/4/2+77 DI:ALO - ALLOCATION TABLE ADDR WORD 26*77/4 DI>APD - AU'S PER DISK WORD BUF:LN DI:BPA - BYTES PER AU WORD 4 DI:SBF - SECTORS PER BUFFER RES 1,0 DI:SAU - AU START OF BUFFER RES 1,0 DI:BIT - BIT # RES 1,9 0 DI:CUR - CURRENT COUNT RES 1,0 DI:REQ - REQUESTED # OF AUS RES 1,0 DI:FND - FOUND COUNT RES 1,0 DI:FUA - FOUND AU END TITL FLOPP DISK DIB NAM D:DF00 EXTR C:DF0 SPACE 3 D:DF00 CHAN DF: DI:PER - PEER POINTER WORD 0 DI:FLG - FLAG WORD WORD C:DF0 DI:CIB - CIB ADDRESS CHAN Z:DF00 DI:FCB - FCB LIST HEAD BYTE 'DF00' DI:NAM - DEVICE NAME , 4 CHARACTERS RES 1,0 DI:DN - DEDICATION NUMBER WORD 0 DI:DS - DEDICATION SEMAPHORE WORD -7 DI:SPB - TIMER, SHIFTS PER BYTE WORD 2*8 DI:WBT - TIMER, BASE TIME * EQU  $ DI:DSW - DEVICE SPECIFICATION WORDS, 10-13 BIT:WORD FA:,FB:,DA:,DB:,UF: READ BIT:WORD FA:,FB:,DA:,DB:,UF:  WRITE BIT:WORD POSITION BIT:WORD OP:,CL: FUNCTION RES 2,0 WORDS 14-15 ARE RESERVED WORD 128 DI:BPS - BYTES PER SECTOR WORD 26 DI:SPT - SECTORS PER TRACK WORD 1 DI:TPC - TRACKS PER CYLINDER WORD 77 DI:CPD - CYLINDERS PER DISK WORD 4 DI:SPA - SECTORS PER ALLOCATION UNIT WORD -1 DI:CYL - CURRENT CYLINDER FOR FLOPPY WORD :30A DI:TRY - HARD ERROR/RATE ERROR RETRY COUNT WORD 1  DI:VTS - VTOC SEMAPHORE WORD 1 DI:ATS - ALLOCATION TABLE SEMAPHORE WORD 0 DI:HOS - HEAD OFFSET  WORD 0 DI:HSA - HEAD SEMAPHORE ADDR WORD 0 DI:SCS - SEEK COMPLETE SEMAPHORE ADDR WORD 26*77/4/2  DI:FLP - FLIST POINTER, AU WORD 77 DI:FLN - FLIST LENGTH WORD 26*77/4/2+77 DI:ALO - ALLOCATION TABLE ADDR WORD 26*77/4 DI>APD - AU'S PER DISK WORD BUF:LN DI:BPA - BYTES PER AU WORD 4 DI:SBF - SECTORS PER BUFFER RES 1,0 DI:SAU - AU START OF BUFFER RES 1,0 DI:BIT - BIT # RES 1,0 DI:CUR - CURRENT COUNT RES 1,0 DI:REQ - REQUESTED # OF AUS RES 1,0 DI:FND - FOUND COUNT RES 1,0 DI:FUA - FOUND AU END TITL FLOPPY DISK CIB NAM C:DF0 EXTR DF:RD,DF:WRT,DF:FUN SPACE 3 C:DF0 CHAN CIB: CI:PER - PEER POINTER WORD 0  CI:FLG - FLAG WORD WORD 0 CI:MST - MASTER LINK CHAN DF: CI:DIB - DIB LIST HEAD WORD :7400  CI:PRI - REQUEST PRIORITY WORD DFDA: CI:DA - DEVICE ADDRESS WORD 0 CI:IV - INTERUPT VECTOR ADDRESS RES 1,0 CI:UN1 - RESERVED WORD DF:RD CI:RD - ENTRY POINT TO READ WORD DF:WRT CI:WRT - ENTRY POINT TO WRITE WORD 0 CI:POS - ENTRY POINT TO POSITION WORD DF:FUN CI:FUN - ENTRY POINT TO FUNCTION  INT:SEQ CI:EOB - END OF BLOCK ROUTINE RES 1,0 CI:T1 - TEMP CELL RES 1,0  CI:T2 - TEMP CELL RES 1,0 CI:APR - PRIORITY OF ACTIVIY RES 1,0 CI:TIB - TIB ADDRESS WORD 1 CI:USM - CONTROLLER USAGE SEMAPHORE WORD 0 CI:TIM - TIMER WORD 0 CI:CSM - C: OMPLETION SEMAPHORE WORD 0 CI:CFL - COMPLETION FLAG RES 1,0 CI:RAT - RATE ERROR RETRY COUNTER RES 1,0 CI:HRD - HARD ERROR RETRY COUNTER RES 1,0 CI:UN2 - RESERVED * EQU  $ CI:DCB - DISK CONTROL BLOCK RES 1,0 CI:OPC - OPCODE RES 1,0 CI:UNT - UNIT RES 1,0 CI:CYL - CYLINDER RES 1,0 CI:SEK - HEAD OR RELATIVE SEEK COUNT  RES 1,0 CI:SEC - SECTOR RES 1,0 CI:CNT - WORD COUNT RES 1,0 CI:BUF - BUFFER ADDRESS RES 1,0 CI:IEA - INTERUPT ENABLE & ADDRESS RES 1,0 CI:FWP - WORDS PROCESSED RES 1,0 CI:FST - STATUS JSK C:DF0+CI:EOB CI:FIV - INTERUPT VECTOR RES 1,0  CI:FT1 - TEMP CELL JSK C:DF0+CI:EOB CI:EIV - ERROR INTERUPT VECTOR LPOOL END TITL MEDIUM CAPACITY DISK DIB NAM D:DM01 EXTR C:DM0 SPACE 3 D:DM01 CHAN DM: DI:PER - PEER POINTER WORD 0 DI:FLG - FLAG WORD WORD C:DM0 DI:CIB - CIB ADDRESS CHAN Z:DM01 DI:FCB - FCB LIST HEAD BYTE 'DM01' DI:NAM - DEVICE NAME , 4 CHARACTERS RES 1,0 DI:DN - DEDICATION NUMBER WORD 0 DI:DS - DEDICATION SEMAPHORE WORD -9 DI:SPB - TIMER, SHIFTS PER BYTE WORD 1*8  DI:WBT - TIMER, BASE TIME * EQU $ DI:DSW - DEVICE SPECIFICATION WORDS, 10-13 BIT:WORD FA:,FB:,DA:,DB:,UF: READ BIT:WORD FA:,FB:,DA:,DB:,UF: WRITE BIT:WORD POSITION BIT:WORD OP:,CL: FUNCTION RES 2,0 WORDS 14-15 ARE RESERVED WORD 512 DI:BPS - BYTES PER SECTOR WORD 12 DI:SPT - SECTORS PER TRACK WORD 2 DI:TPC - TRACKS PER CYLINDER WORD 203 DI:CPD - CYLINDERS PER DISK WORD 1  DI:SPA - SECTORS PER ALLOCATION UNIT WORD -1 DI:CYL - CURRENT CYLINDER FOR FLOPPY WORD :30A DI:TRY - HARD ERROR/RATE ERROR RETRY COUNT WORD 1 DI:VTS - VTOC SEMAPHORE WORD 1 DI:ATS - ALLOCATION TABLE SEMAPHORE WORD :102 DI:HOS - HEAD OFFSET WORD 0 DI:HSA - HEAD SEMAPHORE ADDR WORD 0 DI:SCS - SEEK COMPLETE SEMAPHORE ADDR WORD 12*2*203/2 DI:FLP - FLIST POINTER, AU WORD 203 DI:FLN - FLIST LENGTH WORD 12*2*203/2+203 DI:ALO - ALLOCATION TABLE ADDR WORD 12*2*203 DI:APD - AU'S PER DISK WORD BUF:LN DI:BPA - BYTES PER AU WORD BUF:LN/512 DI:SBF - SECTORS PER BUFFER RES 1,0 DI:SAU - AU START OF BUFFER RES  1,0 DI:BIT - BIT # RES 1,0 DI:CUR - CURRENT COUNT RES 1,0 DI:REQ - REQUESTED # OF AU'S RES 1,0 DI:FND - FOUND COUNT RES 1,0 DI:FAU - FIRST AU FOUND  END TITL MEDIUM CAPACITY DISK DIB NAM D:DM00 EXTR C:DM0 SPACE 3 D:DM00 CHAN DM: DI:PER - PEER POINTER WORD 0 DI:FLG - FLAG WORD WORD C:DM0 DI:CIB - CIB ADDRESS CHAN ;  Z:DM00 DI:FCB - FCB LIST HEAD BYTE 'DM00' DI:NAM - DEVICE NAME , 4 CHARACTERS RES 1,0 DI:DN - DEDICATION NUMBER WORD 0 DI:DS - DEDICATION SEMAPHORE WORD -9 DI:SPB - TIMER, SHIFTS PER BYTE WORD 1*8 DI:WBT - TIMER, BASE TIME * EQU $ DI:DSW - DEVICE SPECIFICATION WORDS, 10-13 BIT:WORD FA:,FB:,DA:,DB:,UF: READ BIT:WORD FA:,FB:,DA:,DB:,UF: WRITE BIT:WORD POSITION BIT:WORD OP:,CL: FUNCTION RES 2,0 WORDS 14-15 ARE RESERVED WORD 512 DI:BPS - BYTES PER SECTOR WORD 12  DI:SPT - SECTORS PER TRACK WORD 2 DI:TPC - TRACKS PER CYLINDER WORD 203 DI:CPD - CYLINDERS PER DISK WORD 1 DI:SPA - SECTORS PER ALLOCATION UNIT WORD -1 DI:CYL - CURRENT CYLINDER FOR FLOPPY WORD :30A DI:TRY - HARD ERROR/RATE ERROR RETRY COUNT WORD 1 DI:VTS - VTOC SEMAPHORE WORD 1 DI:ATS - ALLOCATION TABLE SEMAPHORE WORD :100 DI:HOS - HEAD OFFSET WORD 0 DI:HSA - HEAD SEMAPHORE ADDR WORD 0  DI:SCS - SEEK COMPLETE SEMAPHORE ADDR WORD 12*2*203/2 DI:FLP - FLIST POINTER, AU WORD 203 DI:FLN - FLIST LENGTH WORD 12*2*203/2+203 DI:ALO - ALLOCATION TABLE ADDR WORD 12*2*203 DI:APD - AU'S PER DISK WORD BUF:LN  DI:BPA - BYTES PER AU WORD BUF:LN/512 DI:SBF - SECTORS PER BUFFER RES 1,0 DI:SAU - AU START OF BUFFER RES 1,0 DI:BIT - BIT # RES 1,0 DI:CUR - CURRENT COUNT RES 1,0  DI:REQ - REQUESTED # OF AU'S RES 1,0 DI:FND - FOUND COUNT RES 1,0 DI:FAU - FIRST AU FOUND END TITL MEDIUM CAPACITY DISK CIB NAM C:DM0 EXTR DK:RD,DK:WRT,DK:FUN  SPACE 3 C:DM0 CHAN CIB: CI:PER - PEER POINTER WORD 0 CI:FLG - FLAG WORD WORD 0 CI:MST - MASTER LINK CHAN DM: CI:DIB - DIB LIST HEAD WORD :7600 CI:PRI - REQUEST PRIORITY WORD DMDA:  CI:DA - DEVICE ADDRESS WORD 0 CI:IV - INTERUPT VECTOR ADDRESS RES 1,0 CI:UN1 - RESERVED WORD DK:RD CI:RD - ENTRY POINT TO READ WORD DK:WRT CI:WRT - ENTRY POINT TO WRITE WORD 0 CI:POS - ENTRY POINT TO POSITION WORD DK:FUN CI:FUN - ENTRY POINT TO FUNCTION INT:SEQ CI:EOB - END OF BLOCK ROUTINE RES 1,0 CI:T1 - TEMP CELL RES 1,0 CI:T2 - TEMP CELL RES 1,0  CI:APR - PRIORITY OF ACTIVIY RES 1,0 CI:TIB - TIB ADDRESS WORD 1 CI:USM - CONTROLLER USAGE SEMAPHORE WORD 0 CI:TIM - TIMER WORD 0 CI:CSM - COMPLETION SEMAPHORE WORD 0 CI:CFL - COMPLETION FLAG RES 1,0 CI:RAT - RATE ERROR RETRY COUNTER RES 1,0 CI:HRD - HARD ERROR RETRY COUNTER RES 1,0 CI:UN2 - RESERVED * EQU $ CI:DCB - DISK CONTROL BLOCK  RES 1,0 CI:OPC - OPCODE RES 1,0 CI:UNT - UNIT RES 1,0 CI:CYL - CY< LINDER RES 1,0 CI:SEK - HEAD OR RELATIVE SEEK COUNT RES 1,0 CI:SEC - SECTOR  RES 1,0 CI:CNT - WORD COUNT RES 1,0 CI:BUF - BUFFER ADDRESS RES 1,0 CI:IEA - INTERUPT ENABLE & ADDRESS RES 1,0 CI:IOB - NEXT IOB ADDRESS RES 1,0 CI:WP - WORDS PROCESSED RES 1,0 CI:CST - CONTROLLER STATUS RES 1,0 CI:DST - DRIVE STATUS  JSK C:DM0+CI:EOB CI:DIV - INTERUPT VECTOR LPOOL END TITL HIGH CAPACITY DISK DIB NAM D:DH00 EXTR C:DH0 SPACE 3 SPA80 EQU 8 SPA40 EQU 4 MB80 EQU 823 CYLINDERS PER DISK 80MB MB40 EQU 411 CYLINDERS PER DISK 40 CPD EQU MB80 SPA EQU SPA80 SECTORS PER AU  SPACE 3 D:DH00 CHAN DH: DI:PER - PEER POINTER WORD 0 DI:FLG - FLAG WORD WORD C:DH0 DI:CIB - CIB ADDRESS CHAN Z:DH00 DI:FCB - FCB LIST HEAD BYTE 'DH00' DI:NAM - DEVICE NAME , 4 CHARACTERS RES 1,0 DI:DN - DEDICATION NUMBER WORD 0 DI:DS - DEDICATION SEMAPHORE WORD -9  DI:SPB - TIMER, SHIFTS PER BYTE WORD 1*8 DI:WBT - TIMER, BASE TIME * EQU $ DI:DSW - DEVICE SPECIFICATION WORDS, 10-13 BIT:WORD FA:,FB:,DA:,DB:,UF: READ BIT:WORD FA:,FB:,DA:,DB:,UF: WRITE BIT:WORD POSITION BIT:WORD OP:,CL: FUNCTION RES 2,0 WORDS 14-15 ARE RESERVED WORD 512 DI:BPS - BYTES PER SECTOR WORD 32 DI:SPT - SECTORS PER TRACK WORD 5 DI:TPC - TRACKS PER CYLINDER WORD CPD  DI:CPD - CYLINDERS PER DISK WORD SPA DI:SPA - SECTORS PER AU WORD -1 DI:CYL - CURRENT CYLINDER FOR FLOPPY WORD :30A DI:TRY - HARD ERROR/RATE ERROR RETRY COUNT WORD 1 DI:VTS - VTOC SEMAPHORE WORD 1 DI:ATS - ALLOCATION TABLE SEMAPHORE WORD 0 DI:HOS - HEAD OFFSET WORD 0 DI:HSA - HEAD SEMAPHORE ADDR WORD 0 DI:SCS - SEEK COMPLETE SEMAPHORE ADDR WORD 32*5*CPD/SPA/2 DI:FLP - FLIST POINTER AU WORD CPD  DI:FLN - FLIST NUMBER OF ENTRIES WORD 32*5*CPD/2+CPD+SPA-1/SPA DI:ALO - ALLOCATION TABLE ADDR WORD 32*5*CPD/SPA DI:APD - AU'S PER DISK WORD 512*SPA DI:BPA - BYTES PER AU WORD BUF:LN/512 DI:SBF - SECTORS PER BUFFER RES  1,0 DI:SAU - AU START OF BUFFER RES 1,0 DI:BIT - BIT # RES 1,0 DI:CUR - CURRENT COUNT RES 1,0 DI:REQ - REQUESTED # OF AU'S RES 1,0 DI:FND - FOUND COUNT  RES 1,0 DI:FAU - FIRST AU FOUND END TITL HIGH CAPACITY DISK CIB NAM C:DH0  EXTR DK:RD,DK:WRT,DK:FUN SPACE 3 C:DH0 CHAN CIB: CI:PER - PEER POINTER WORD 0 CI:FLG - FLAG WORD WORD 0 CI:MST - MASTER LINK CHAN DH: CI:DIB - DIB LIST HEAD WORD :7600  CI:PRI - REQUEST PRIORITY WORD DHDA: CI:DA - DEVICE ADDRESS WORD 0 CI:IV - INTERUPT VECTOR ADDRESS =  RES 1,0 CI:UN1 - RESERVED WORD DK:RD CI:RD - ENTRY POINT TO READ WORD DK:WRT CI:WRT - ENTRY POINT TO WRITE WORD 0 CI:POS - ENTRY POINT TO POSITION WORD DK:FUN CI:FUN - ENTRY POINT TO FUNCTION  INT:SEQ CI:EOB - END OF BLOCK ROUTINE RES 1,0 CI:T1 - TEMP CELL RES 1,0  CI:T2 - TEMP CELL RES 1,0 CI:APR - PRIORITY OF ACTIVIY RES 1,0 CI:TIB - TIB ADDRESS WORD 1 CI:USM - CONTROLLER USAGE SEMAPHORE WORD 0 CI:TIM - TIMER WORD 0 CI:CSM - COMPLETION SEMAPHORE WORD 0 CI:CFL - COMPLETION FLAG RES 1,0 CI:RAT - RATE ERROR RETRY COUNTER  RES 1,0 CI:HRD - HARD ERROR RETRY COUNTER RES 1,0 CI:UN2 - RESERVED * EQU $  CI:DCB - DISK CONTROL BLOCK RES 1,0 CI:OPC - OPCODE RES 1,0 CI:UNT - UNIT  RES 1,0 CI:CYL - CYLINDER RES 1,0 CI:SEK - HEAD OR RELATIVE SEEK COUNT RES  1,0 CI:SEC - SECTOR RES 1,0 CI:CNT - WORD COUNT RES 1,0 CI:BUF - BUFFER ADDRESS RES 1,0 CI:IEA - INTERUPT ENABLE & ADDRESS RES 1,0 CI:IOB - NEXT IOB ADDRESS RES 1,0 CI:WP - WORDS PROCESSED RES 1,0 CI:CST - CONTROLLER STATUS RES 1,0 CI:DST - DRIVE STATUS JSK C:DH0+CI:EOB CI:DIV - INTERUPT VECTOR LPOOL END TITL IOX-4 HEAD OF CIB LIST NAM C:HEAD C:HEAD CHAN CIB: END OUNT RES 1,0 CI:BUF - BUFFER/ / IOS:ASM --- ASSEMBLE ALL IOS FILES (93431-70-C1) / /MACRO IOSUAT(D=GEN+SF.RTX+SF.RTXD+IOS+IOSD+SFM(S),ER,L=TV), IOSIOS(ER,L=TV), IOSDIBCIB(ER,L=TV), IOSTTY(ER,L=TV), IOSCR(ER,L=TV), IOSDK(ER,L=TV), IOSSUB(ER,L=TV) / OM790111120000OM790111120000OM790111120000/ IOS:LIB --- CREATE IOS LIBRARY (93431-71-C1) / ALL OBJECT FILES ASSUMED TO BE ON UF / CREATES LIBRARY ON UF / /DE IOS.LIB /CO IOS.LIB=IOSUAT.OBJ /CO IOS.LIB=IOS.LIB+IOSIOS.OBJ /CO IOS.LIB=IOS.LIB+IOSDIBCIB.OBJ /CO IOS.LIB=IOS.LIB+IOSTTY.OBJ /CO IOS.LIB=IOS.LIB+IOSAMX.OBJ /CO IOS.LIB=IOS.LIB+IOSCR.OBJ /CO IOS.LIB=IOS.LIB+IOSDK.OBJ /CO IOS.LIB=IOS.LIB+IOSSUB.OBJ OM790111120000OM790111120000OM790111120000/ / IOS:ASM --- ASSEMBLE ALL IOS FILES (93431-70-C1) / /MACRO IOSUAT(D=GEN+SF.RTX+SF.RTXD+IOS+IOSD+SFM(S),NOO), IOSIOS(NOO), IOSDIBCIB(NOO), IOSTTY(NOO), IOSCR(NOO), IOSDK(NOO), IOSSUB(NOO) / OM790111120000OM790111120000OM790111120000>  TITL G E N . M A C - GENERAL EQUATES & MACROS (93420-10-C1) * BIT POSITIONS * CY: EQU 0 CARRY. OV: EQU 1 OVERFLOW. BY: EQU 2 BYTE MODE. CI: EQU 4 CONSOLE INTERRUPT ENABLED. RI: EQU 5  REAL TIME CLOCK INTERRUPT ENABLED. XA: EQU 6 EXTENTED ADDRESSING MODE. INT: EQU 8 INTERRUPTS ENABLED. IM12: EQU 12 LEVEL 0 WORD INTERRUPT MASK. IM13: EQU 13 LEVEL 0 EVENT INTERRUPT MASK. UX: EQU  13 EXCEPTION RETURN FOR UNRECOVERABLE ERROR RX: EQU 14 EXCEPTION RETURN FOR RECOVERABLE ERROR * * BIT VALUES * CY:V EQU 1 CARRY. OV:V EQU 2 OVERFLOW. BY:V EQU 4 BYTE MODE. B3:V EQU :8  RESERVED STATUS BIT 3 CI:V EQU :10 CONSOLE INTERRUPT ENABLED. RI:V EQU :20 REAL TIME CLOCK INTERRUPT ENABLED. XA:V EQU :40 EXTENDED ADDRESSING. B7:V EQU :80 RESERVED STATUS BIT 7 INT:V EQU :100 INTERRUPTS ENABLED. IM12:V EQU :1000 LEVEL 0 WORD INTERRUPT MASK IM13:V EQU :2000 LEVEL 0 EVENT INTERRUPT MASK. TITL * CONTEXT BLOCK (STACK) EQUATES * LAST:L EQU 0 LAST:S EQU 1 LAST:A EQU 2 LAST:Q EQU 3 LAST:X EQU 4 LAST:Y EQU 5 LAST:P EQU 6 CBL: EQU LAST:P+1 LENGTH OF CONTEXT BLOCK TITL ** MACRO: DUP * * DUPLICATE THE GIVEN BYTE THE NUMBER OF TIMES SPECIFIED. * * CALLING SEQUENCE: * DUP 'TEXT',NUM * 'TEXT' = BYTE STRING (DUPLICATION STARTS IN COLUMN 1) * NUM = NUMBER OF TIMES TO DUPLICATE * ** SPACE 1 DUP MACRO * N::: SET  #(1,?)-1 LAST CHAR OF TEXT * IFT #(2)>0 #(1,2,N:::) N2::: SET #(2)-1 DUP #(1),N2::: ENDC * ENDM TITL * EXCHANGE MEMORY TO MEMORY MACRO - EXCH:M * CALLING SEQUENCE * EXCH:M MEM1,MEM2 * * THE CONTENTS OF MEM1 & MEM2 ARE EXCHANGED MACRO EXCH:M EXCH #1,A EXCH A,#2 EXCH  A,#1 ENDM TITL * RETURN WITH A VALUE IN THE A-REGISTER MACRO RET: COPY =#1,A RSK ENDM TITL * COPY MEMORY TO MEMORY, SECOND PARAMETER IS THE REGISTER USED MACRO COPY:M COPY #1,#2 COPY #2,#3 ENDM TITL * THE FOLLOWING SYMBOLS WORK WITH SYMATT * ABSBT: EQU :8000 ABSOLUTE RELBT: EQU :4000 RELATIVE SRLBT: EQU :2000 SCRATCH PAD EXT: EQU :1000 INDBT: EQU :800 INDIRECT LITBT: EQU :400  LITERAL NXBT: EQU :200 POST INDEXED PNXBT: EQU :100 PRE INDEXED UNDBT: SET :80 UNDEFINED NULL: EQU :40 NULL SYMER: EQU :20 AN ERROR OCC TITL * SR: -- SYSTEM REQUEST TO DOOR * * SR * SR FIELD * SR M4D12 * * WHERE FIELD IS A DIRECT OR INDIRECT REFERENCE TO * ANY LOCATION IN MEMORY. M4D12F IS ANY VALID M4D12 * ADDRESS EXPRESSION. * SR: MACRO R:DBUG MACENT :8000 R:SIG MACENT 1 R:WAIT MACENT 2 R:BGIN MACENT 3 R:END MACENT 4+:8000 R:SPRI MACENT 5 R:GPRI MACENT 6+:8000 I:IO MACENT 7 R:CINT MACENT 8+:8000 R:SEND MACENT 9 R:RECV  MACENT 10 R:ITIC MACENT 11 R:PAUS MACENT 12 R:ABUF MACENT 13 R:RBUF MACENT 14 R:STOD MACENT 15+:8000 R:GTOD MACENT 16+:? 8000 R:AWAL MACENT 17 R:IWAL MACENT 18 R:CTIC MACENT 19 R:MTIC MACENT 20 R:CWAL MACENT 21 F:CREA MACENT 22 F:DELE MACENT 23 F:CONN MACENT 24 F:MONT MACENT 25 F:CFNO MACENT 26 R:GATD MACENT 27 R:SATD MACENT 28 F:DMNT MACENT 29 STVAL: SET #(0)&:FF TWOOP: SET 1 IFT #(0)&:8000 TWOOP: SET 0 ENDC ADMOD: SET 1 IFF #?=0 ADMOD: SET  0 S: SYMATT #(1) IFF NXBT:;PNXBT:&S: ADMOD: SET 1 IFT #(1,'*')=1 ADMOD: SET 2 ENDC  ENDC ENDC WORD ADMOD:%13;:1A00;STVAL: IFT TWOOP: IFF ADMOD: M4D12 #(1) ENDC  IFT ADMOD: WORD #(1) ENDC ENDC IFF TWOOP: WORD 0 ENDC IFF TWOOP:=#(?) NOTE E,'WRONG NUMBER OF OPERANDS' ENDC ENDM TITL * CONSOLE DEVICE ADDRESS AND FUNCTION CODES * CONDA: EQU 0%3  CONSOLE DEVICE ADDRESS. CSSFC: EQU 0 CONSOLE SENSE SWITCH FUNCTION CODE. CIRFC: EQU 1 CONSOLE INTERRUPT RESET FUNCTION CODE. CDR: EQU 4 CONSOLE DATA REGISTER FUNCTION CODE * * DIO INTERUPT VECTOR EQUATES * IV:AIO EQU 0 AUTO I/O IV:CNT EQU 1 BYTE COUNT IV:BUF EQU 2 BUFFER ADDR IV:JSK EQU 4 JSK $+1 IV:EOB EQU 5 EOB ADDR * * NON-PRINTING ASCII CHARACTER VALUES * PARTY: EQU 0  BIT 7 OFF NU: SET :0;PARTY: NULL LF: SET :A;PARTY: LINE FEED FF: SET :C;PARTY: FORM FEED CR: SET :D;PARTY: CARRIAGE RETURN RO: SET :7F;PARTY: RUBOUT TITL * FIXED MEMORY ADDRESS ASSIGNMENTS * PUPA: EQU :80  POWER UP ADDRESS UITA: EQU :84 UNIMPLEMENTED INSTRUCTION TRAP ADDRESS UMTA: EQU :88 UNINSTALLED MEMORY TRAP ADDRESS PFTA: EQU :8C POWER FAILURE TRAP ADDRESS EACA: EQU :90 EFFECTIVE ADDRESS CALCULATION ADDRESS RTCNC: EQU :91 REAL TIME CLOCK INCREMENT ADDRESS RTCIA: EQU :92 READ TIME CLOCK INTERRUPT ADDRESS CONIA: EQU :94 CONSOLE INTERRUPT ADDRESS CNTA: EQU :98 CHARACTER/NUMERIC EXCEPTION TRAP ADDRESS SOTA: EQU :9C  STACK OVERFLOW TRAP ADDRESS SETA: EQU :9C STACK EXCEPTION TRAP ADDRESS USTA: EQU :A0 USER TRAP ADDRESS SYTA: EQU :A4 SYSTEM TRAP ADDRESS AETA: EQU :A8 ARITHMETIC EXCEPTION TRAP ADDRESS SPACE 3 SAVE END SS RTCNC: EQU :91 REAL TIME CLOCK INCREMENT ADDRESS RTCIA: EQU :92 READ TIME CLOCK INTERRUPT ADDRESS CONIA: EQU :94 CONSOLE INTERRUPT ADDRESS CNTA: EQU :98 CHARACTER/NUMERIC EXCEPTION TRAP ADDRESS SOTA: EQU :9C  STACK OVERFLOW TRAP ADDRESS SETA: EQU :9C STACK EXCEPTION TRAP ADDRESS USTA: EQU :A0 USER TRAP ADDRESS SY TITL R T X . M A C - RTX GENERAL EQUATES & MACROS (93420-11-C1) * INIT:A AR,QR,XR,YR,ECB,TDB,PRI * INIT:A AR,QR,XR,YR,ECB,TDB,PRI,AMTFREE * INIT:A AR,QR,XR,YR,ECB,TDB,PRI,AMTFREE,ADRFREE * INIT:A AR,QR,XR,YR,ECB,TDB,PRI,AMTFREE,ADRFREE,ADRERROR * INIT:A AR,QR,XR,YR,ECB,TDB,PRI,,,ADRERROR * INIT:A AR,QR,XR,YR,ECB,TDB,PRI,AMTFREE,,ADRERROR * *  AR INITIAL CONTENTS OF A REGISTER. * QR INITIAL CONTENTS OF Q REGISTER. * XR I@ NITIAL CONTENTS OF X REGISTER. * YR INITIAL CONTENTS OF Y REGISTER. * ECB ADDRESS OF ENVIRONMENT CONTROL BLOCK. * TDB ADDRESS OF TASK DESCRIPTOR BLOCLK. * PRI PRIORITY OF ACTIVITY OF TASK. * AMTFREE AMOUNT OF FREEPOOL SPACE (WORDS) * ADRFREE ADDRESS OF FREEPOOL. * ADRERROR ADDRESS OF ERROR ROUTINE * BLKSZ: EQU 12 MACRO INIT:A LOAD RTX: LOAD R:LOW R:INIT WORD #1,#2,#3,#4,#5,#6,#7&:7FFF WORD IN:CHK S: SET 0 SV: SYMATT #8 IFF NULL:&SV: SV: SYMATT #9 IFF NULL:&SV: WORD #8 WORD #9 ENDC IFT NULL:&SV: S: SET #8 ENDC ENDC SV: SYMATT #8 IFT NULL:&SV: S: SET 2*BLKSZ: ENDC IFT S: WORD S: WORD $+2 ENDC SV: SYMATT #10  IFF NULL:&SV: WORD #10 ENDC IFT NULL:&SV: WORD 0 ENDC IFT S: RES S:,:8080  ENDC ENDM TITL * SINGL: START,STACK * SINGL: START,STACK,FLAGS * * START START ADDRESS OF TASK * STACK AMOUNT OF STACK SPASE REQUIRED * FLAGS NONXA: - BEGIN WITHOUT EXTENDED ADDRESSING * BM:V - BEGIN WITH BYTE MODE * OV:V - BEGIN WITH OVERFLOW SET *  CY:V - BEGIN WITH CARRY SET * MACRO SINGL: EXTR R:ECB1 INIT:A 0,0,0,0,R:ECB1,R:TSK1,100,4*BLKSZ: TDB:A R:TSK1,#1,0,R:STK1,#2,#3 R:STK1 RES #2,0 LOAD UAT:S ENDM TITL * TDB:A LABEL,START,YSCRATCH,STACKAD,STACKAMT * TDB:A LABEL,START,YSCRATCH,STACKAD,STACKAMT,FLAGS * TDB:A LABEL,START,YSCRATCH,STACKAD,STACKAMT,FLAGS,USAGE * TDB:A LABEL,START,YSCRATCH,STACKAD,STACKAMT,FLAGS,USAGE,SEMA4 * * LABEL LABEL TO BE ASSIGNED TO START OF TDB. * START START ADDRESS OF TASK. * YSCRATCH AMOUNT OF Y-SCRATCHPAD USED BY TASK. * STACKAD ADDRESS OF PREALLOCATED STACK, OR ZERO. * STACKAMT AMOUNT OF STACK SPACE USED BY TASK. * FLAGS OPTIONAL FLAGS. * BM:V =BM: ON IN INITIAL STATUS * OV:V  =OV: ON IN INITIAL CONTEXT * CY:V =CY: ON IN INITIAL STATUS * USAGE NUMBER OF CONCURRENT ACTIVITIES OF THIS TASK. * SEMA4 OPTIONAL ADDRESS OF CONCURRENCY SEMAPHORE. * (WHICH MUST BE SET TO 1 OR USAGE BY USER) * MACRO TDB:A #1 CHAN R:TDBL TD:PER S: SET 0 SV: SYMATT #6 IFF NULL:&SV: IFT XA:V COMPLEMENT XA BIT IN TD:FLG WORD \XA:V ENDC IFF XA:V WORD XA:V;#6 ENDC S: SET 1 ENDC IFF S: WORD 0 TD:FLG ENDC D: SET 1 DV: SYMATT #7 IFF NULL:&DV: D: SET #7 ENDC DV: SYMATT #8 IFT NULL:&DV: WORD $+6 TD:SEM  ENDC IFF NULL:&DV: WORD #8 TD:SEM ENDC WORD D: TD:NOX WORD #3 TD:Y WORD #4  TD:AD WORD #5 TD:AMT WORD #2 TD:P IFT NULL:&DV: WORD D: CONCURRENCY SEMAPHORE A  ENDC RES 2,0 WORD TD:CHK TD:CKW ENDM TITL * ECB:A LABEL,UAT * ECB:A LABEL,UAT,ENDMEM * * LABEL LABEL TO BE ASSIGNED TO START OF ECB. * UAT ADDRESS OF UNIT ASSIGNMENT TABLE. *  ENDMEM ADDRESS OF LOCATION FOLLOWING LAST WORD * OF USER'S PROGRAM. (OPTIONAL). *  MACRO ECB:A #1 CHAN R:ECBL ED:PER WORD 0 EC:FLG WORD #1 EC:EDB WORD 1  EC:LUS ALIAS EC:PRV RES 2,0 WORDS 4-5 RESERVRVED WORD 0 EC:CNT WORD 0  EC:ALH WORD 0 EC:SUB WORD 0 EC:MST WORD 0 EC:NEC WORD EC:CHK EC:CKW * REST OF ENVIRNMENT DESCRIPTOR BLOCK WORD 16 ED:EVO WORD 48 ED:MRO RES 2,0 14-15 RESERVED FOR FUTUTE USE RES 16,0 ED:EVT WORD #2 ED:UAT WORD 0 ED:LMA SV: SYMATT #3 IFF NULL:&SV: WORD #3 ED:MPA ENDC IFT NULL:&SV: WORD 0 ED:MPA ENDC WORD 0 ED:HMA WORD 0 ED:EUS WORD  :7FFF ED:PRI CHAN R:TDBL ED:TLH CHAN R:SL ED:SLH CHAN R:MBXL  ED:MLH RES 8,0 41-48 RESERVED FOR FUTURE USE * 41-43 EMPTY *  44 NUMBER OF ACTIVITY * 45 TDB OF INITIAL TASK * 46 PRIORITY OF INITIAL ACTIVITY * 47 ID OF INITIAL ACTIVITY * 48 MAP OF REGISTER TABLE ENDM TITL * BGIN:A LABEL,TASK,PRI * * LABEL ADDRESS OF ARGUMENT LIST WHICH FOLLOWS * TASK ADDRESS OF TCB AS GIVEN IN THE TDB:A MACRO * PRI PRIORITY OF THE TASK *  MACRO BGIN:A S: SET #?=3 IFF S: NOTE 'THIS MACRO CALL HAS'..#?..'PARAMETERS' ENDC  IFT S: #1 EQU $ WORD #2 WORD #3 ENDC ENDM TITL * TICK:A LABEL,TID,SEMA,TCOUNT(,EID) * *  LABEL ADDRESS OF ARGUMENT LIST WHICH FOLLOWS * TID TIMER ID TO CANCEL OR MODIFY THE REQUEST * SEMA ADDRESS OF SEMAPHORE TO BE SIGNALLED * TCOUNT NUMBER OF TICKS ELLAPSED *  EID MASTER ENVIRONMENT ID (OPTIONAL) * MACRO TICK:A S: SET 3<#?<6 IFF S:  NOTE 'THIS MACRO CALL HAS'..#?..'PARAMETERS' ENDC IFT S: V: SET 0 IFT #?=5 V: SET #5 ENDC #1 EQU $ WORD V: WORD #2 WORD #3 WORD #4 ENDC ENDM TITL * WALL:A LABEL,TID,SEMA,UPPER,LOWER(,EID) * * LABEL ADDRESS OF ARGUMENT LIST WHICH FOLLOWS * TID TIMER ID TO CANCEL OR MODIFY THE REQUEST * SEMA ADDRESS OF SEMAPHORE TO BE SIGNALLED * UPPER  TIME OF DAY UPPER * LOWER TIME OF DAY LOWER * EID MASTER ENVIRONMENT ID (OPTB IONAL) * MACRO WALL:A S: SET 4<#?<7 IFF S: NOTE 'THIS MACRO CALL HAS'..#?..'PARAMETERS'  ENDC IFT S: V: SET 0 IFT #?=6 V: SET #6 ENDC #1 EQU $ WORD V: WORD #2 WORD #3 WORD #4 WORD #5 ENDC ENDM TITL * MAIL:A LABEL,IDENT(,ENVIRONMENT) * * LABEL  ADDRESS OF ARGUMENT LIST WHICH FOLLOWS * IDENT MAILBOX ID * ENVIRONMENT ENVIRONMENT ID * MACRO MAIL:A IFF 1<#?<4 NOTE 'THIS MACRO CALL HAS'..#?..'PARAMETERS' ENDC IFT 1<#?<4 V: SET 0 IFT #?=3 V: SET #3 ENDC #1 WORD V: WORD #2 ENDC ENDM TITL *  SDB:A LABEL,VALUE * * WHERE LABEL IS THE LABEL TO BE APPLIED TO THE SEMAPHORE. * VALUE IS THE INITIAL VALUE OF THE SEMAPHORE. * MACRO SDB:A IFF 0<#?<4 NOTE 'ERROR,THIS MACRO CALL HAS'...#?...'PARAMETERS'  ENDC IFT 0<#?<4 CHAN R:SL IFT #?=1 ONLY ONE ARGUMENT WORD 0 SEMAPHORE INITIALZED TO 0 #1 WORD 0 ENDC IFT #?=2 TWO ARGUMENTS WORD #2 FLAGS SET TO 0 #1 WORD #2 SEMAPHORE INITIALIZED TO #2 ENDC IFT #?=3 3 ARGUMENTS WORD #3%8;#2  FLAGS AND INITIAL VALUE #1 WORD #2 SEMAPHORE INITIALIZED TO #2 ENDC WORD SD:CHK ENDC ENDM TITL * MDB:A IDENT(,EID) * * IDENT MAILBOX ID * EID ENVIRONMENT ID, OPTIONAL * * MACRO MDB:A IFF 0<#?<3 NOTE 'ERROR, THIS MACRO CALL HAS'...#?...'PARAMETERS' ENDC  IFT 0<#?<3 V: SET 0 IFT #?=2 V: SET #2 ENDC CHAN R:MBXL PEER POINTER WORD 0 FLAGS WORD 1 MAILBOX USAGE SEMAPHORE WORD 0 MESSAGE SIGNALLING SEAPHORE  WORD 0 A-REGISTER OF MESSAGE WORD 0 Q-REGISTER OF MESSAGE RES 3,0 RESERVED WORD V: MASTER ENVIRONMENT ID WORD #1 MAILBOX IDENTIFIER WORD MD:CHK CHECKWORD  ENDC ENDM TITL * INTERNAL BLOCK CHECK VALUE EQUATES * IN:CHK EQU :F00E TD:CHK EQU :F01E TDB CHECK VALUE (IN TD:CKW) AC:CHK EQU :F02E ACB CHECK VALUE (IN AC:CKW) SD:CHK EQU :F03E SDB CHECK VALUE (IN SD:CKW) CC:CHK EQU :F04E CCB CHECK VALUE (IN CC:CKW) EC:CHK EQU :F06E ECB CHECK VALUE ( IN EC:CKW ) MD:CHK EQU :F07E MDB CHECK VALUE (IN MD:CKW) UA:CHK EQU :F09E TITL EDB EXCEPTION VECTOR EQUATES * * EDB EXCEPTION VECTOR EQUATES * * THE FOLLOWING XV:XXXXX SYMBOLS SPECIFY LOCATIONS IN THE EXCEPTION * VECTOR LOCATIONS OF THE ENVIRONMENT DESCRIPTOR TABLE (EDB). * XV:UINTP EQU :0 UNIMPLEMENTED INSTRUCTION TRAP XV:MEMTP EQU :1 MEMORY EXCEPTION TRAP XV:CNMTP EQU :2 CHARACTER/NUMERIC EXCEPTION TRAP XV:USRTP EQU :3 USER TRAP XV:AERTP EQU :4 ARITHMETIC EXCEPTION TRAP XV:STKTP EQU :5 STACK EXCEPTION TRAP XV:STKSV EQU :6 STACK EXCEPTION REGISTER SAVE AREA XV:USTEX EQU :8 UNIMPLEMENTED STRAP EXCEPTION XV:ST0EX EQU :9 STRAPC  0 EXCEPTION XV:DOREX EQU :A DOOR SERVICE EXCEPTION XV:RTXEX EQU :B RTX SYSTEM ERROR SPACE 3 * * STACK EXCEPTION REGISTER SAVE AREA EQUATES * STKSV:A EQU 0 A REGISTER SAVE AREA STKSV:Q EQU 1 Q REGISTER SAVE AREA STKSV:X EQU 2 X REGISTER SAVE AREA STKSV:Y EQU 3 Y REGISTER SAVE AREA TITL ** MACRO: EDXVT:A * * GENERATE ENTRIES IN THE EXCEPTION VECTOR TABLE OF THE EDB. * THE EXCEPTION ADDRESS SPECIFIED WILL BE JUMPED TO IF THE * SPECIFIED EXCEPTION OCCURS. * * USAGE: * EDXVT:A ECB,EXCEPTION,ADDRESS * ECB = MUST MATCH FIRST PARAMETER OF ECB MACRO * EXCEPTION = EXCEPTION VECTOR OFFSET * ADDRESS = ADDRESS OF USER SUPPLIED EXCEPTION PROCESSOR * * NOTE: * IF ENVIRONMENT EXCEPTION PROCESSING IS TO BE SPECIFIED, THE * EDXVT:A MACRO MUST FOLLOW THE ECB:A MACRO. * ** SPACE 1 MACRO EDXVT:A !LOC::: SET $ SAVE LOCATION COUNTER ORG #1+ED:EVT+#2 ORG INTO EDB WORD #3 INSERT EXCEPTION PROCESSOR ADDRESS ORG !LOC::: ORG BACK TO WHERE WE WERE ENDM SPACE 3 SAVE END EDXVT:A ECB,EXCEPTION,ADDRESS * ECB = MUST MATCH FIRST PARAMETER OF ECB MACRO * EXCEPTION = EXCEPTION VECTOR OFFSET * ADDRESS = ADDRESS OF USER SUPPLIED EXCEPTION PROCESSOR * * NOTE: * IF ENVIRONMENT EXCEPTION PROCESSING IS TO BE SPECIFIED, THE * EDXVT:A MACRO MUST FOLLOW THE EC TITL R T X D . M A C - RTX DEVELOPMENT EQUATES & MACROS (93420-12-C1) * TASK DESCRIPTOR BLOCK EQUATES * TD:PER EQU 0 PEER LINK TD:FLG EQU 1 FLAGS TD:USA EQU 2 USAGE SEMAPHORE ADDRESS TD:NOX EQU 3 NUMBER OF CONCURRENT EXECUTIONS ALLOWED TD:Y EQU 4 Y-SCRATCHPAD SPECIFICATION TD:AD EQU 5 STACK LENGTH OR ADDRESS TD:AMT EQU 6 STACK LIMIT TD:P EQU 7 ADDRESS OF START OF TASK TD:CKW EQU 11  CHECK WORD (CONTAINS TD:CHK) * * ACTIVITY CONTROL BLOCK EQUATES * AC:PER EQU 0 PEER LINK AC:FLG EQU 1 FLAFS AC:PRI EQU 2 PRIORITY AC:K EQU 3 K-REGISTER AC:Y EQU  4 Y-REGISTER AC:L EQU 5 L-REGISTER AC:LST EQU 7 ENVIRONMENT ACTIVITY LIST PEER LINK AC:TDB EQU 8 TASK DESCRIPTOR BLOCK AC:ECB EQU 9 ENVIRONMENT CONTROL BLOCK AC:ID EQU  10 IDENTIFIER AC:CKW EQU 11 CHECK WORD (CONTAINS AC:CHK) * * ACB FLAGS * ACF:OD EQU 4  INDICATES EXECUTION OUTSIDE THE DOOR. TITL * ENVIRONMENT CONTROL BLOCK EQUATES * EC:PER EQU 0  PEER LINK EC:FLG EQU 1 FLAGS EC:EDB EQU 2 ENVIRONMENT DESCRIPTOR BLOCK POINTER EC:LUS EQU  3 LOGICAL UNIT SEMAPHORE EC:CNT EQU 6 # OF ACTIVITIES EC:ALH EQU 7 ACTIVITY LIST HEAD EC:SUB EQU 8 SUBORDINATE LIST HEAD EC:MST EQU 9 MASTER ENVIRONMENT EC:NEC EQU 10  NECESSARY ENVIRONMENT EC:CKW EQU 11 CHECK WORD (CONAINS EC:CHK) * * ENVIRONMENT DESCRIPTOR BLOCK EQUATES * ED:ECB EQU 0 ECB ADDRESS *WORDS 1-11 ARE A COPY OF ECB WORDS 1-11 IN THE ECB ED:EVO EQU 12  EXCEPTION VECTOR OFFSET (16) ED:MRO EQU 13 MAP REGISTER OFFSET (48) ED:EVT EQU 16 EXCEPTION VED CTOR TABLE ED:UAT EQU 32 UNIT ASSIGNMENT TABLE ADDRESS ED:LMA EQU 33 LOW MEMORY ADDRESS ED:MPA  EQU 34 MEMORY POOL ADDRESS ED:HMA EQU 35 HIGH MEMORY ADDRESS ED:EUS EQU 36 ENVIRONMENT USAGE SEMAPHORE ED:PRI EQU 37 MAXIMUM PRIORITY ED:TLH EQU 38 TASK LIST HEAD ED:SLH EQU  39 SEMAPHORE LIST HEAD ED:MLH EQU 40 MAILBOX LIST HEAD * * ECB FLAGS * ECF:ND EQU 15  THIS ECB NOT DISPATCHABLE ECF:DA EQU 12 ECB WAS DYNAMICALLY ALLOCATED TITL * RTX EXCEPTION VALUES * ER:RTX EQU 2 RTX ERRORS, CLASS 2 EX:RTX EQU ER:RTX%8 EX:SEM EQU 1+EX:RTX SEMAPHORE EXCEPTION EX:STP EQU  2+EX:RTX STRAP OUT OF RANGE EX:STK EQU 3+EX:RTX INSUFFICIENT STACK SPECIFICATION EXCEPTION EX:EMP EQU 4+EX:RTX  UNABLE TO FILL E.M.P. REQUEST EX:SFP EQU 5+EX:RTX UNABLE TO FILL SYSTEM FREEPOOL REQUEST EX:PRI EQU 6+EX:RTX NEGATIVE ACTIVITY PRIORITY EX:CCB EQU 7+EX:RTX CCB EXCEPTION EX:TRP EQU 8+EX:RTX HARDWARE TRAP EXCEPTION EX:TBL EQU 9+EX:RTX DEBUG VERSION TABLE ID CHECK FAILURE EXCPT EX:SYS EQU 10+EX:RTX DEBUG VERSION, SYSTEM ACTIVITY VIOLATION EX:WCB EQU 11+EX:RTX CCB EXCEPTION, WALL CLOCK EX:MBX EQU 12+EX:RTX MAILBOX ID CHECK (INVALID ID) EX:ISS EQU :800 UNIMPLEMENTED SYSTEM SERVICE. EX:DBG EQU :900 STRAP 0 (REALTIME DEBUG BREAKPOINT) EX:UMT EQU :A00 UNINSTALLED MEMORY TRAP EX:SOT EQU :B00 STACK OVERFLOW TRAP EX:CNT EQU :C00 CHARACTER/NUMERIC TRAP EX:UIT EQU :D00 UNIMPLEMENTED INSTRUCTION TRAP EX:AET EQU :E00 ARITHMETIC ERROR TRAP EX:UST EQU :F00 USER TRAP TITL * MISCELLANEOUS EQUATES * R:CHEK SET 0  SELECT NON-DEBUGGING VERSION CHKOT: SET 1 TRUE FOR INHOUSE CHECK OUT. CHKOT: SET 0 FALSE FOR RELEASE STKMN: EQU 20 MINIMUM STACK TO BEGIN A TASK. SEMAX: EQU :100 SEMAPHORE MAXIMUM VALUE TCPRI: EQU :7000  TICK CLOCK PRIORITY WCPRI: EQU :6B00 WALL CLOCK ACTIVITY PRIORITY MAXIN: EQU :7FFF MAXIMUM TIC CLOCK INTERVAL SKAMT: EQU 23 STACK AMOUNT FOR CANNED ACTIVITY WALCP: EQU 30 WALL CLOCK PERIOD (MULTIPLES OF 8.33 MS) NDWCP: EQU 25 WALL CLOCK PERIOD FOR 50HZ LF RTC * * GENERAL CONTEXT BLOCK EQUATES * PEER: EQU 0 PEER LINK FLAGS: EQU 1 FLAGS MASTR: EQU 9 MASTER IDENT: EQU 10 IDENTIFIER CHECK: EQU 11 REDUNDANCY CHECK * * BEGIN CONTEXT BLOCK EQUATES * BEG:A EQU 1 A REGISTER BEG:Q EQU  2 Q REGISTER BEG:X EQU 3 X REGISTER BEG:Y EQU 4 Y REGISTER BEG:EC EQU 5 ECB ADDRESS BEG:TD EQU 6 TDB ADDRESS BEG:PR EQU 7 PRIORITY TITL * R:INIT BLOCK EQUATES * IN:A EQU 0  INITIAL A VALUE IN:Q EQU 1 INITIAL Q VALUE IN:X EQU 2 INITIAL X VALUE IN:Y EQU 3 INITIAL Y VALUE IN:ECB EQU 4 ECB ADDRESS FOR INITIAL ACTIVITY IN:TDB EQU 5 E  INITIAL TASK TO BE STARTED IN:PRI EQU 6 PRIORITY TO START INITIAL TASK AT IN:AID EQU 7 INITIALIZATION BLOCK ID IN:FPL EQU 8 FREEPOOL LENGTH (WORDS) IN:FPA EQU 9 FREEPOOL ADDRESS IN:EOM EQU 10 END-OF-MEMORY ADDRESS * * ENVIRONMENT MEMORY POOL EQUATES * EM:LEN EQU 0 IFT R:CHEK EM:XTR EQU 2 LEAVE TWO WORDS FOR DEBUG INFO ENDC IFF R:CHEK EM:XTR EQU 0 NOT DEBUG VERSION, NO EXTRAS NEEDED ENDC EM:PTR EQU EM:XTR+1 POINTER TO NEXT BLOCK TITL * CLOCK CONTROL BLOCK EQUATES * CC:PER EQU 0 PEER LINK CC:FLG EQU 1 FLAGS CC:TU EQU 2 WALL CLOCK EXPIRATION -- UPPER CC:TIC EQU CC:TU TICK CLOCK EXPIRATION CC:TL EQU 3 WALL CLOCK EXPIRATION -- LOWER CC:STS EQU 4 SEMAPHORE OR ADDRESS OF SEMAPHORE CC:BBA EQU CC:STS BEGIN BLOCK ADDRESS CC:ECB EQU 9  MASTER ENVIRONMENT CC:ID EQU 10 IDENTIFIER CC:CKW EQU 11 CHECK WORD (CONTAINS CC:CHK) TITL * SEMAPHORE DEFINITION BLOCK (SDB) EQUATES * SD:PER EQU 0 PEER LINK SD:FLG EQU 1  FLAGS SD:SEM EQU 2 SEMAPHORE SD:CKW EQU 3 CHECK WORD (CONTAINS SD:CHK) * * SEMAPHORE CONTROL EQUATES * SC:SEM EQU 0 SEMAPHORE WORD SC:CKW EQU 1 CHECKWORD * * MAILBOX DEFINITION BLOCK (MDB) EQUATES * MD:PER EQU 0 PEER POINTER MD:FLG EQU 1 FLAGS MD:MBX EQU 2  MAILBOX USAGE SEMAPHORE (IV=1) MD:MSG EQU 3 MESSAGE SIGNALLING SEMAPHORE (IV=0) MD:A EQU 4  A-REGISTER OF MESSAGE MD:Q EQU 5 Q-REGISTER OF MESSAGE MD:ECB EQU 9 MASTER ENVIRONMENT MD:ID EQU 10 IDENTIFIER MD:CKW EQU 11 CHECK WORD (CONTAINS MD:CHK) TITL * DEFBP: LABEL DEFINE LOCATION IN RTX BASE PAGE, * DEFBP: LABEL,N DEFINE N LOCATIONS IN RTX BASE PAGE, * * WHERE LABEL IS LABEL TO BE APPLIED TO LOCATION, * N IS OPTIONAL NUMBER OF CELLS. * MACRO DEFBP: #1 EQU BPLC: IFT #?=1 BPLC: SET BPLC:+1 ENDC IFF #?=1 BPLC: SET BPLC:+#2 ENDC ENDM * * * * CHKBP: LABEL CHECKS THAT THE LABEL CORRESPONDS TO * ITS ALLOCATION IN RTX BASE PAGE, * * WHERE LABEL IS THE LABEL ASSIGNED TO THE CURRENT * LOCATION COUNTER VALUE IN RTX BASE PAGE. * MACRO CHKBP: IFT #1-$ NOTE B,'ERROR IN BASE PAGE ALLOCATION' ENDC ENDM TITL * RTX BASE PAGE DEFINITIONS * R:SCRA EQU :20 START OF RTX SCRATCH PAD USAGE BPLC: SET R:SCRA DEFBP: R:ECBH DEFBP: R:ACT CURRENT ACTIVITY POINTER DEFBP: R:RDY READY LIST HEAD DEFBP: R:INTQ INTERRUPT QUEUE LIST HEAD  DEFBP: R:EMEM END OF REAL MEMORY DEFBP: R:FPH FREEPOOL LIST HEAD DEFBP: R:FPT FREEPOOL LIST TAIL DEFBP: R:NSRT R:WAIT DEFBP: R:SEMX RM:SEM X TEMPCELL DEFBP: R:SEMY RM:SEM Y TEMPCELL DEFBPF : R:SVA STACK EXCEPTION, HOLDS A DEFBP: R:CCBH CCB LIST HEAD FOR TICK CLOCK REQUESTS DEFBP: R:WCBH  CCB LIST HEAD FOR WALL CLOCK REQUESTS DEFBP: R:INVL CURRENT TIC CLOCK INTERVAL DEFBP: R:CLKS TICK CLOCK WAIT SEMAPHORE DEFBP: R:NUIN TIC CLOCK INTERVAL TEMP CELL DEFBP: R:TODU TIME OF DAY UPPER DEFBP: R:TODL TIME OF DAY LOWER DEFBP: R:CHKQ CHK: MACRO TEMP CELL BPLC: SET :39 DEFBP: R:SAVE,6 CONTEXT SAVE ROUTINE DEFBP: R:SA12 INTERRUPT CONTEXT SAVE ROUTINE * * SYSTEM FREEPOOL BLOCK SIZE * BLKSZ: EQU 12 TITL * PUSH: -- PUSH REGISTER(S) ON STACK. * * PUSH: 4REG SIZE=5 * PUSH:  4REG,4REG =7,9 * PUSH: 4REG,4REG,4REG =9,11 * PUSH: 4REG,4REG,4REG,4REG  =13 * * WHERE 4REG IS ANY OF (A,Q,X,Y). NO REGISTER VALUES * EXCEPT K WILL CHANGE. STACK EXCEPTION MAY OCCUR. *  SIN WILL COVER NEXT INSTRUCTION. USES MACRO PUSH:1. * SECOND SIZE IS IF BOTH X AND Y ARE PUSHED. * MACRO PUSH:  PUSH:C #?,#1,#2,#3,#4 DETERMINE X AND Y USAGE. DUP ' JSK $+1',#? GET STACK SPACE SIN PUSH:X&PUSH:Y%1+#?+2 PROTECT THE SEQUENCE. PUSH:E EXCHANGE K AND INDEX REGISTER. PUSH:R #1,#?-1 PUSH FIRST. IFT #?>1 PUSH:R #2,#?-2 PUSH SECOND. ENDC IFT #?>2 PUSH:R #3,#?-3 PUSH THIRD. ENDC  IFT #?>3 PUSH:R #4,#?-4 PUSH FOURTH. ENDC PUSH:E RESTORE K AND INDEX REGISTER.  ENDM TITL * POP: -- POP REGISTER(S) FROM STACK. * * POP: 4REG SIZE=5 * POP: 4REG,4REG  =6,8 * POP: 4REG,4REG,4REG =7,9 * POP: 4REG,4REG,4REG,4REG =10 * * WHERE 4REG IS ANY OF (A,Q,X,Y). NO REGISTER VALUES * EXCEPT K WILL CHANGE. REGISTERS ARE POP:ED IN * REVERSE ORDER FROM LIST SO CORRESPONDING PUSH: AND * POP: CAN HAVE SAME ARGUMENT LIST. * SECOND SIZE IS IF BOTH X AND Y ARE PUSHED. *  MACRO POP: PUSH:C #?,#1,#2,#3,#4 DETERMINE X AND Y USAGE. SIN PUSH:X&PUSH:Y%1+#?+3 PROTECT THE SEQUENCE PUSH:E POP:R #1,#?-1 IFT #?>1 POP:R #2,#?-2 ENDC IFT #?>2 POP:R #3,#?-3 ENDC IFT #?=4 POP:R #4,#?-4 ENDC IFT PUSH:Y ADD =#?,X ENDC IFF PUSH:Y ADD =#?,Y ENDC PUSH:E ENDM TITL * COPY: -- COPY WITH K-RELATIVE ADDRESSING. * *  COPY: OFFSET(K),4REG * COPY: 4REG,OFFSET(K) * * WHERE OFFSET IS AN EXPRESSION FOR THE RELATIVE * LOCATION ON THE STACK. FOR EXAMPLE, OFFSET=0 IS * THE TOP OF THE STACK. (K) MEANS INDEXED BY K. * 4REG IS ANY OF (A,Q,X,Y). *  MACRO COPY: COPY:B COPY,#1,#2 ENDM TITL * EXCH: -- EXCH WITH K-RELATIVE ADDRESSING. * * EXCH: OFFSET(K),4REG * EXCH: 4REG,OFFSET(K) * * SEE DESCRIPTION OF COPY: * MACRO EXCH: COPY:B EXCH,#1,#2 ENDM TITL * ASTAK: -- ALLOCATE TEMP CELLS ON STACK. * * ASTAK: 4REG * ASTAK: NUMBER * WHERE NUMBER IS THE NUMBEG R OF TEMP CELLS DESIRED. * 4REG IS ANY OF (A,Q,X,Y) WHICH CONTAINS NUMBER. * IF 4REG IS GIVEN, IT WILL BE USED AS WORKING CELL. * IF NUMBER IS GIVEN, INTERRUPTS WILL BE DISABLED. * AFTER ASTAK:, K POINTS TO BLOCK OF TEMP CELLS. *  MACRO ASTAK: R:4REG #1 FIND OUT IF ARG IS NUMBER OR 4REG. IFT R:REG JSK $+1 4REG.  SUB =1,#1 JNE #1,$-2 ENDC IFF R:REG ASTA:N SET #1/6*6 DIVIDE BY 6 LOCATIONS PER PUSH. ASTA:N SET #1-ASTA:N REMAINDER IS NUMBER OF JSK'S. IFT #1/6 IF MORE THAN 6 LOCATIONS, DUP ' PUSH :40',#1/6 ENDC IFT ASTA:N PERFORM REQUIRED NUMBER OF JSK'S. DUP ' JSK $+1',ASTA:N ENDC ENDC ENDM TITL * RSTAK: -- RELEASE TEMP CELLS TO STACK. * * RSTAK: 4REG * RSTAK: NUMBER * * WHERE NUMBER IS THE NUMBER OF TEMP CELLS TO BE RELEASED. * 4REG IS ANY OF (A,Q,X,Y) WHICH CONTAINS NUMBER. * MACRO RSTAK: R:4REG #1 FIND OUT IF ARG IS NUMBER OR 4REG. IFT R:REG ADD #1,K 4REG. ENDC IFF R:REG SIN 3 NUMBER. EXCH A,K ADD =#1,A EXCH A,K ENDC ENDM TITL * PUSH:R -- STORE A REGISTER IN THE STACK. * * PUSH:R 4REG,RELK * * WHERE 4REG IS ANY OF (A,Q,X,Y). RELK IS RELATIVE *  POSITION IN STACK WHERE REGISTER IS STORED (0-3). * MACRO PUSH:R IFT PUSH:Y IS X REGISTER BEING USED AS INDEX? IFT #(1,'X')>0 EXCH A,K YES, K CONTAINS USER'S X. COPY A,#2(X) EXCH A,K  ENDC IFT #(1,'X')=0 COPY #1,#2(X) NO, PUSH SPECIFIED REGISTER. ENDC ENDC IFF PUSH:Y IS Y REGISTER BEING USED AS INDEX? IFT #(1,'Y')>0 EXCH A,K YES, K CONTAINS USER'S Y. COPY A,#2(Y) EXCH A,K ENDC IFT #(1,'Y')=0 COPY #1,#2(Y) NO, COPY SPECIFIED REGISTER. ENDC ENDC ENDM TITL * POP:R -- REMOVE A REGISTER FROM THE STACK. * * POP:R 4REG,RELK * * WHERE 4REG IS ANY OF (A,Q,X,Y). RELK IS RELATIVE * POSITION IN STACK. * MACRO POP:R IFT PUSH:Y IS X BEING USED AS INDEX? IFT #(1,'X')>0 COPY A,K YES, POP INTO K INSTEAD. COPY #2(X),A EXCH A,K  ENDC IFT #(1,'X')=0 COPY #2(X),#1 ENDC ENDC IFF PUSH:Y IS Y BEING USED AS INDEX? IFT #(1,'Y')>0 COPY A,K YES, POP INTO K INSTEAD. COPY #2(Y),A EXCH A,K ENDC IFT #(1,'Y')=0 COPY #2(Y),#1 ENDC ENDC ENDM TITL * PUSH:E -- EXCHANGE STACK POINTER AND INDEX REGISTER. * * PUSH:E * * PUSH:Y INDICATES WHETHER Y IS BEING PUSHED. * MACRO PUSH:E IFT PUSH:Y IS Y BEING PUSHED? EXCH X,K YES, USE X FOR PUSHING. ENDC IFF PUSH:Y NO, USE Y FOR PUSHING. EXCH Y,K ENDC ENDM TITL * PUSH:C -- CHECK FOR INDEX REGISTER USAGE * * PUSH:C #?,#1,#2,#3,#4 * * DETERMINES IF ARGUMENTS TO PUSH: OR POP: INCLUDE X OR Y. * PUSH:X=0 IFF NO REFERENCE TO X. * PUSH:YH =0 IFF NO REFERENCE TO Y. MACRO PUSH:C PUSH:X SET 0 RESET BOTH FLAGS. PUSH:Y SET 0 IFT #(2,'X')>0 PUSH:X SET 1 ENDC IFT #(2,'Y')>0 PUSH:Y SET 1 ENDC IFT #1=2 IS THERE A SECOND?  IFT #(3,'X')>0 PUSH:X SET 1 ENDC IFT #(3,'Y')>0 PUSH:Y SET 1 ENDC ENDC IFT #1=3 IS THERE A THIRD? IFT #(4,'X')>0 PUSH:X SET 1 ENDC IFT #(4,'Y')>0 PUSH:Y SET  1 ENDC ENDC IFT #1=4 IS THERE A FOURTH? PUSH:X SET 1 YES, UNLESS REGISTERS ARE DUPLICATED, PUSH:Y SET 1 THEN BOTH X AND Y MUST BE PRESENT. ENDC ENDM TITL MACRO COPY:B SIN  3 COPY:L SET #(2,'(K)')-1 IFT COPY:L>0 IFT #(3,'Y')>0 EXCH K,X #(1) #(2,1,COPY:L)(X),Y EXCH K,X ENDC IFF #(3,'Y')>0 EXCH K,Y #(1) #(2,1,COPY:L)(Y),#(3)  EXCH K,Y ENDC ENDC IFF COPY:L>0 COPY:L SET #(3,'(K)')-1 IFT #(2,'Y')  EXCH K,X #(1) #(3,1,COPY:L)(X),Y EXCH K,X ENDC IFF #(2,'Y') EXCH K,Y #(1) #(3,1,COPY:L)(Y),#(3) EXCH K,Y ENDC ENDC ENDM TITL * R:4REG -- DETERMINE IF AN ARGUMENT IS A 4REG. * * R:4REG #N * * WHERE #N IS THE ARGUMENT TO BE TESTED. * R:REG=1 IFF ARGUMENT IS ANY OF (A,Q,X,Y). * MACRO R:4REG R:REG SET 0 IFT #(1,?)=1 TEST FOR ONLY ONE CHARACTER IFT #(1,'A')+#(1,'Q')+#(1,'X')+#(1,'Y')>0 R:REG SET 1 ENDC ENDC ENDM TITL * CHK: -- MAKE SURE A BLOCK IS OF THE CORRECT TYPE. * * CHK: 4REG,CKW,(OFFSET) * * WHERE 4REG IS ANY OF (A,Q,X,Y), WHICH CONTAINS THE ADDRESS OF * A BLOCK WHICH IS TO BE VERIFIED. OFFSET IS OPTIONAL. IT * SPECIFIES THE DISPLACEMENT OF THE CHECKWORD FROM THE BEGINNING *  OF THE BLOCK, THE DEFAULT VALUE IS CHECK:. CHW MAY BE EITHER * THE LABEL OF A LOCATION CONTAINING THE CHECK VALUE, OR A LITERAL * PRECEDED BY AN EQUAL SIGN. * MACRO CHK: IFT R:CHEK CS: SET CHECK: IFT #?=3 CS: SET #3 ENDC * IFT #(1,'X');#(1,'Y') SIN 3 COPY Q,R:CHKQ COPY #2,Q  CSK Q,CS:(#1) SIN 1 JST R:TABL COPY R:CHKQ,Q ENDC * IFF #(1,'X');#(1,'Y') EXCH #1,X SIN 3 COPY Q,R:CHKQ COPY #2,Q CSK Q,CS:(X) SIN  1 JST R:TABL COPY R:CHKQ,Q EXCH #1,X ENDC ENDC ENDM TITL * SYS:A -- GENERATE CANNED ACTIVITY ACB AND STACK * * SYS:A ACB,PRI,START,R:L,R:K * * WHERE ACB IS ADDRESS OF THE ACTIVITY ACB *  PRI IS THE PRIORITY OF THE ACTIVITY * START IS THE BEGIN EXECUTION ADDRESS * R:L IS THE ACTIVITY STACK LIMIT *  R:K IS THE INITIAL K REGISTER VALUE * * NOTE: * SKAMT: IS THE STACK AMOUNT ALLOCATED TO A * CANNED SYSTEM ACTIVITY * MACRO SYS:A * ACTIVITY STACK #4 EQU $ STACK LIMIT RES SKAMT:-CBL: RESERVED FI OR STACK EXPANSION * INITIAL CONTEXT #5 WORD #4 L-REGISTER WORD XA:V STATUS RES 4,0  ALL REGISTER 0 WORD #3 P-REGISTER * * ACTIVITY ACB * #1 EQU $ ACB LABEL  RES 2,0 DUMMY PEER POINTER,FLAGS WORD #2 PRIORITY WORD #5 K OF INITIAL CONTEXT RES 1,0 NO Y-SCRACH PAD WORD #4 STACK LIMIT RES 5,0 DUMMY ECB,TCB,.... WORD AC:CHK DEBUG TABLE ID ENDM SPACE 3 SAVE END D XA:V STATUS RES 4,0  ALL REGISTER 0 WORD #3 P-REGISTER * * ACTIVITY ACB * #1 EQU $ ACB LABEL  TITL S F M . M A C - SFM GENERAL EQUATES & MACROS (93420-15-C1) * FILE MANAGER SERVICE PL EQUATES * NAMPT: EQU 0  NAME POINTER VOLPT: EQU 1 VOLUME NAME POINTER PUN: EQU 2 UNIT FNO: EQU 3  DIRECTORY FNO LUN: EQU 4 LOGICAL UNIT INXT: EQU 4 INITIAL EXTENT SEXT: EQU  5 SECONDARY EXTENT RLN: EQU 6 RECORD LENGTH TITL ************************************************************ * CONN:A MACRO - F:CONN PARAMETER LIST * *  * * CONN:A #1,#2,#3,#4,#5 * *  * * #1 - LABEL * * #2 - ADDR OF FILE NAME * * #3 - ADDR OF VOLUME NAME * * #4 - DIB NAME * *  #5 - LOGICAL UNIT * ************************************************************ MACRO CONN:A #1 EQU $ PARAM: #2 PARAM: #3 D: SET 0 PARAM: D:#4 WORD 0 FNO WORD #5 ENDM TITL ************************************************************ * DELE:A MACRO - F:DELE PARAMETER LIST * * * * DELE:A #1,#2,#3,#4  * * * * #1 - LABEL  * * #2 - ADDR OF FILE NAME * * #3 - ADDR OF VOLUME NAME  * * #4 - DIB NAME * * ONLY 1 OF #3 & #4 MUST BE SUPPLIED  * ************************************************************ MACRO DELE:A #1 EQU $ WORD #2 PARAM: #3 D: SET 0 PARAM: D:#4 WORD 0 FNO ENDM TITL ************************************************************ * CREA:A MACRO - F:CREA PARAMETER LIST * *  * * CREA:A #1,#2,#3,#4,#5,#6,#7 * *  * * #1 - LABEL * * #2 - ADDR OF FILE NAME J  * * #3 - ADDR OF VOLUME NAME * * #4 - DIB NAME  * * #5 - INITIAL EXTENT, DEFAULT=10 * * #6 - SECONDARY EXTENT, DEFAULT=10 * *  #7 - RECORD LENGTH, DEFAULT=:7FFF * ************************************************************  MACRO CREA:A #1 EQU $ WORD #2 PARAM: #3 D: SET 0 PARAM: D:#4 WORD 0 FNO  PARAM: #5,10 PARAM: #6,10 PARAM: #7 ENDM TITL ************************************************************ * MONT:A MACRO - F:MONT PARAMETER LIST * *  * * #-1 MONT:A #1,#2 * * MONT:A #1,#2,#3  * * * * #-1,#1 - LABEL * *  #1,#2 - VOLUME NAME POINTER (OPT) * * #2,#3 - DIB NAME * ************************************************************ MONT:A MACRO * IFF #(-1,?) #(1) EQU $ PARAM: #(2) D: SET 0 WORD D:#(3) ENDC * IFT #(-1,?) PARAM: #(1) D: SET 0 WORD D:#(2) ENDC * ENDM TITL * PARAMETER MACRO * *  PARAM: #1,#2 * * #1 PARAMETER TO PUT IN WORD STATEMENT * #2 VALUE IF #1 IS NULL, DEFAULT IS ZERO *  MACRO PARAM: SV: SYMATT #1 IFF SV:&NULL: WORD #1 PARAMETER EXISTS ENDC IFT SV:&NULL: S: SYMATT #2 IFT S:&NULL: WORD 0 DEFUALT VALUE FOR NULL PARAMETER ENDC IFF S:&NULL: WORD #2 USE DEFAULT VALUE SUPPLIED ENDC ENDC ENDM TITL * FCB EQUATES * FC:CHK EQU :F0AF FCB CHECK VALUE FC:PER EQU 0 PEER POINTER FC:FLG EQU 1 FLAG WORD FC:FDB EQU 2 FDB ADDR FC:AMA EQU 7 ACCESS MANAGER ADDRESS FC:FCB EQU 8 SUBORDINATE FCB LIST FC:DIB EQU  9 DIB ADDR FC:FNO EQU 10 F ENTRY NUMBER * * FCB FLAG WORD EQUATES * FCF:OP EQU 9 OPEN FCF:BL EQU 0 BLOCK I/O * * FDB EQUATES * FD:FLG EQU 0 FLAG WORD FD:WPT EQU 1 WRITE POINTER, 2 WORDS FD:WPS EQU 3 WRITE POINTER SEMAPHORE FD:RAU EQU 4 RELATIVE AU FD:PAU EQU 5 PHYSICAL AU FD:NAU EQU 6 NUMBER OF AUS IN EXTENT FD:RLN EQU 7 RECORD LENGTH FD:ERR EQU 8 ERROR CODE FROM I/O FD:NLK EQU 9 NUMBER OF LINKS TO FDB FDF:WA EQU 0 WRITE POINTER ALTERED FLLAG FDF:LA EQU  1 FILE LENGTH ALTERED FALG TITL ************************************************************ * FCB:SA MACRO * * * * FOR CREATING A PERMANENT SFM FCB * * * * CALLING SEQUENCE * * * * FCB:SA LABK EL,FNO,PUN * * * ************************************************************ MACRO FCB:SA EXTR FM:SFM WORD FC:CHK #1 EQU $ CHAN Z:#3 WORD :8000 RES 5,0 WORD FM:SFM RES 1,0 WORD D:#3 WORD #2 WORD FC:CHK ENDM SPACE 3 SAVE END * * * * FCB:SA LABEL,FNO,PUN * * * ************************************************************ MACRO FCB:SA EXTR FM:SFM WORD FC:CHK #1 EQU $ CHAN Z:#3 WORD :8/ / IOS:ASM --- ASSEMBLE ALL IOS FILES (93431-70-C1) / /MACRO IOSUAT(D=GEN+RTX+RTXD+IOS+IOSD+SFM(S),NOO), IOSIOS(NOO), IOSDIBCIB(NOO), IOSTTY(NOO), IOSCR(NOO), IOSDK(NOO), IOSSUB(NOO) / OM790111120000OM790111120000OM790111120000L