IMD 1.16: 1/09/2008 12:11:07 84-93420-04 200 f42004 macros/demos product diskette    @0|)wwЀЀtQql)  " }gA `_8M@IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIOS4 MF282081611121300820816111213 820816111213 >F42004 VOLMACROS/DEMOS PRODUCT DISKETTE 84-93420-04 G200   IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII_8M@iGyy GGG`HZ@ b G`^Y e IQ BBp@;:9 :7P@ G:پN 8!0. * C'xC# b# }B @0DAJL w+™ЀЀΖQA1"   i ž} š} @EEFF)DEۄF8 џ} ԟ} ̟} * `jUBBI,v BI, # @ G9H@pܾrCHC C GTq` Lg"gEXC P+s=胾P+c fQN p $Rxnj  ޔniZ ތ⊞ } }HGž Ÿ@ALS)"$ C k20j.h( +$`%ꂜ\1 !M' y %'+os慾)sY ed|{ @8 o O m J K i gN )V% t%sLn`"E F. F„ D>) =`;nrgy w"G,{Kq1 A&}E*`(t@% ;c  765y342(.OS:: SYS"iwvc Bc A@6<# Ic B# gIjHc r TITL RTX4 DEMO PROGRAM 93410-10-F000 LOAD REINI: LOAD DEBUG4 * * THIS PROGRAM TESTS THE TICK CLOCK SERVICES. * * THE TEST CONSISTS OF TWO TASKS, THE MASTER * AND THE TIMER. THE MASTER IS THE INITIAL *  TASK AND THERE IS ONLY ONE ACTIVITY OF * IT. THIS ACTIVITY BEGINS AN ACTIVITY OF * THE TIMER TASK EACH TIME CONSOLE INTERRUPT * IS PRESSED, UNTIL 16 ACTIVITIES OF THE TIMER * TASK ARE BEGUN. FURTHER CONSOLE INTERRUPTS * ARE IGNORED. * * THE TIMER TASK MAKES A TICK CLOCK REQUEST * ACCORDING TO THE PARAMETERS IN ITS Y SCRATCHPAD. * WHEN THE TIMER EXPIRES IT COMPLEMENTS A * BIT IN THE CONSOLE WORD REGISTER AND REPEATS. * TBLSIZ EQU 8 NUMBER OF WORD/TABLE ENTRY * * BEGIN MASTER TASK WITH: A=0 * Q=0 * X=0 * Y=TABLE * AT PRIORITY :100 WITH :200 WORDS OF FREEPOOL * INIT:A 0,0,0,TABLE,ECB1,MSTRTD,:100,:200 TITL MASTER TASK * * THIS TASK BEGINS THE TIMER TASK. * EACH TIME CONSOLE INTERRUPT IS PRESSED * A NEW TIMER ACTIVITY IS CREATED. * * * MASTER TASK WILL HAVE Y EQUAL TO TABLE * : 35 WORDS OF STACK, SYSTEM ALLOCATED * 1 POSSIBLE CONCURRENT EXECUTIONS * TDB:A MSTRTD,MASTER,0,0,:35,0,1 MASTER EQU $ COPY =16,Q ALLOW ONLY 16 TIMERS LOOP EQU $ JEQD Q,NOMORE  IF 16 TIMERS ALREADY R:CINT R:BGIN TDB(Y) BEGIN TIMER ACTIVITY ADD =TBLSIZ,Y MOVE TABLE POINTER TO NEXT ENTRY JMP LOOP REPEAT * 16 TIMERS ARE RUNNING, IGNORE FURTHER CONSOLE INTERRUPTS NOMORE EQU $ R:CINT JMP NOMORE LPOOL TITL TIMER -- DELAY N TICKS * * * TIMER TASK * * * TIMER TASK WILL HAVE: Y OF ACTIVITY DOING BEGIN * :20 WORDS OF STACK SPACE, SYSTEM ALLOCATED *  16 POSSIBLE CONCURRENT EXECUTIONS * TDB:A TMRTD,TIMER,0,0,:20,0,16 * * DELAYS N TICKS THEN TOGGLES CONSOLE WORD REGISTER BIT * BEGAN WITH Y= TABLE ENTRY * TIMER EQU $ R:ITIC ID(Y) INITIATE TIMER REQUEST  IMS DELAYS(Y) BUMP DELAY COUNTER NOP JSK OUT TOGGLE CONSOLE WORD REGISTER BIT  R:WAIT *SEMADR(Y) WAIT FOR TIMER TO EXPIRE JMP TIMER REPEAT TITL OUT -- OUTPUTS TO CONSOLE WORD REGISTER * COMPLEMENTS THE ADDRESSED BIT * CALLED WITH Y= TABLE ENTRY * OUT EQU $ COPY BIT(Y),Q  GET BIT TO TOGGLE SHIFT Q,LO,4 POSITION TO K4 FIELD OF CBIT INSTRUCTION R:WAIT CDR REQUEST USE OF CONSOLE WORD REGISTER IN CONDA:+CDR:,A READ CONSOLE WORD REGISTER XNX Q INDEX CBIT INSTRUCTION WITH BIT ADDRESS CBIT 0,A COMPLEMENT ADDRESSED BIT SELP A,CONDA:+CDR: OUTPUT TO CONSOLE WORD REGISTER R:SIG CDR GIVE UP USE OF CONSOLE WORD REGISTER RSK RETURN * *  * SEMAPHORE TO CONTROL CONSOLE WORD REGISTER ACCESS * * SDB:A CDR,1 LPOOL TITL TABLE -- TIMER TASK PARAMETERS * * THIS TABLE DEFINES THE PARAMATERS FOR EACH ACTIVITY * OF THE TIMER TASK. * FORMAT IS: * TDB EQU 0  TASK DESCRIPTOR BLOCK ADDRESS PRI EQU 1 PRIORITY TO BEGIN ACTIVITY AT ID EQU 2  ID TO USE IN TIMER REQUESTS SEMADR EQU 4 ADDRESS OF TICK REQUEST SEMAPHORE TICKS EQU 5 NUMBER OF TICKS TO REQUEST DELAYS EQU 6 NUMBER OF REQUEST MADE SO FAR BY ACTIVITY BIT EQU 7 BIT TO TOGGLE * * * TABLE EQU $ WORD TMRTD,:100,0,:3004,SEM3,4,0,3 WORD TMRTD,:100,0,:2003,SEM2,3,0,2 WORD TMRTD,:100,0,:C00D,SEMC,:D,0,:C WORD TMRTD,:100,0,:6007,SEM6,7,0,6 WORD TMRTD,:100,0,:E00F,SEME,:F,0,:E WORD TMRTD,:100,0,:4005,SEM4,5,0,4 WORD TMRTD,:100,0,:8009,SEM8,9,0,8 WORD TMRTD,:100,0,:0001,SEM0,:1,0,0 WORD TMRTD,:100,0,:900A,SEM9,:A,0,9 WORD TMRTD,:100,0,:F010,SEMF,:10,0,:F WORD TMRTD,:100,0,:7008,SEM7,8,0,7 WORD TMRTD,:100,0,:D00E,SEMD,:E,0,:D WORD  TMRTD,:100,0,:A00B,SEMA,:B,0,:A WORD TMRTD,:100,0,:5006,SEM5,6,0,5 WORD TMRTD,:100,0,:B00C,SEMB,:C,0,:B WORD TMRTD,:100,0,:1002,SEM1,2,0,1 TITL TIMER SEMAPHORES SDB:A SEM0,0 SDB:A SEM1,0 SDB:A SEM2,0 SDB:A   SEM3,0 SDB:A SEM4,0 SDB:A SEM5,0 SDB:A SEM6,0 SDB:A SEM7,0 SDB:A SEM8,0 SDB:A SEM9,0 SDB:A SEMA,0 SDB:A SEMB,0 SDB:A SEMC,0 SDB:A SEMD,0 SDB:A SEME,0 SDB:A SEMF,0 TITL ENVIRONMENT INFORMATION * * DEFINE ENVIRONMENT CONTROL BLOCK * ECB:A ECB1,0 END TMRTD,:100,0,:1002,SEM1,2,0,1 TITL TIMER SEMAPHORES SDB:A SEM0,0 SDB:A SEM1,0 SDB:A SEM2,0 SDB:A / RTXDEMO:ANL --- ASSEMBLE & LINK RTXDEMO (93411-70-F000) / ALL SOURCE FILES ASSUMED TO BE ON UF /  CREATES OBJECT & LISTING ON UF / CREATES ERROR LISTING ON SL / CREATES BINARY & MAP ON UF / /MACRO RTXDEMO(D=SF.GEN+SF.RTX,L=) / /PAUSE --- PROCEED TO LINK? / /AS X4 LO /AS LO RTXDEMO.MAP /LINK RTXDEMO(RL=100)+RTX /AS LO X4 / /CO OC=RTXDEMO.MAP(FL) 820816111213820816111213820816111213 TITL SFM IOS DEMO PROGRAM - SFMDEMO - 93440-10-E400 SHARABLE SFMDEMO: SFMDEMO: REL SPACE 3 * LENGTH OF MESSAGE MACRO LNM WORD #1-$-1*2 ENDM SPACE 3 CI EQU 'CI' LO EQU 'LO' LIST OUTPUT SL EQU 'SL' SYSTEM LOG SPACE 3 * Y SCRATCHPAD INLUN EQU 0 INPUT IOB INIOB EQU 0 INCRI EQU 2 INFC EQU 3 INBCT EQU 4 INBUF EQU 5 INACT EQU 6 INST EQU 7 OUTLUN EQU 8 OUTPUT IOB OUTIOB EQU 8 OUTCRI EQU 10 OUTFC EQU 11 OUTBCT EQU 12 OUTBUF EQU 13 OUTACT EQU 14 OUTST EQU 15 SPACE 3 INFP EQU 16 INPUT FILE POINTER OUTFP EQU 18 OUTPUT FILE POINTER SPACE 3 NAMPTR EQU 20 VOLPTR EQU 21 PUN EQU 22 FNO EQU NAMPTR+FNO: LUN EQU NAMPTR+LUN: MOD EQU LUN INXT EQU NAMPTR+INXT: SEXT EQU NAMPTR+SEXT: RECLN EQU NAMPTR+RLN: NAM EQU RECLN+1 VOL EQU NAM+7 ENDY EQU VOL+7 IBUFF EQU ENDY+1 INPUT BUFFER ENDB EQU IBUFF+256 END OF Y-SPAD FOR COPY SAVE LOAD DEBUG4 LOAD FM:SVC END TITL IOS4 DEMO PROGRAM SHARABLE SFMDEMO: SFMDEMO: REL NAM G:A NAM IODEMO NAM R:INIT NAM BUF:N NAM UAT:S NAM DIRPL NAM OPCODE  NAM UNIT,DIRPUN,DIRLUN NAM LUNPP NAM INXTPP,SEXTPP,RLNPP NAM NAME,VOLUME NAM LUNF,LUNT NAM HAD,IBUF,BP NAM MSG,BUFSM NAM FILESM NAM RDIOB NAM RDFC EXTR MES0,MES1,MES2,MES3,MES4 EXTR CRE:A,DEL:A,ASS:A,COP:A,VIE:A,IDI:A EXTR MOV EXTR MES5 EXTR MES6 EXTR MES6A EXTR MES9 EXTR ERR1,ERR2,ERR3,ERR4,ERR5,ERR6,ERR7,ERR8,ERR9,ERR10 EXTR ERR10A,ERR9A EXTR ERR11,ERR12 EXTR ERR14 EXTR IOERR EXTR SLU EXTR DEBUG4 SPACE 6 G:A EQU $ UAT:AA UAT:S UAT:EE 'TY',D:TY00 UAT:EE 'CR',D:CR00 UAT:EE 'LP',D:LP00 UAT:EE 'PR',D:PR00 UAT:EE 'PP',D:PP00 UAT:EE 'CI',D:TY00 UAT:EE 'LO',D:TY00 UAT:EE 'SL',D:TY00 U AT:EE 1,D:DF00 DISKS UAT:EE 2,D:DF01 UAT:EE 3,D:DM00 UAT:EE 4,D:DM01 UAT:EE 5,D:DH00 UAT:EE 'DR',0 DIRECTORY LUN DUMPLU EQU $ DUMPUT EQU $+1 DUMP UNIT UAT:EE 'DU',0 FILELU EQU $  START OF FILE LU'S FOR COPY UAT:EE 'F1',0 FILE LUNS FOR COPY UAT:EE 'F2',0 FILE LUNS FOR COPY  UAT:EE 'F3',0 UAT:EE 'F4',0 UAT:EE 'F5',0 UAT:EE 'F6',0 UAT:EE 'F7',0 UAT:EE 'F8',0 NFILE EQU $-FILELU/2 NUMBER OF LOGICAL UNITS FOR FILES UAT:ZZ SPACE 9 SDB:A FILESM,NFILE SEMAPHORE FOR FILE LU'S BUF:R 5 SPACE 3 INIT:A 0,0,0,0,ECB,TDB,:1000,:400 TDB:A TDB,IODEMO,0,0,:100,0,1  ECB:A ECB,UAT:S SPACE 60 CMDLN EQU 6 CMDTBL EQU $ WORD CMDLN+1/2 WORD LENGTH OF A COMMAND BYTE 'ASSIGN' WORD ASSIGN BYTE 'COPY ' WORD COPY BYTE 'CREATE' WORD CREATE BYTE 'DELETE' WORD DELETE BYTE  'DUMP ' WORD DUMP BYTE 'EXTEND' WORD EXTEND BYTE 'IDIR ' WORD IDIR BYTE 'MOUNT ' WORD MOUNT BYTE 'VIEW ' WORD VIEW BYTE 'DEBUG ' WORD DEBUG4 WORD 0 SPACE 9 MODTBL EQU $ COPY MODIFIER TABLE WORD 1 1 WORD PER ENTRY BYTE 'FA' WORD FA: BYTE 'FB' WORD FB: BYTE 'FS' WORD FS: BYTE 'UF'  WORD UF: WORD 0 SPACE 9 HEXTAB EQU $ HEX ASCII TABVLE BYTE '0123456789' BYTE 'ABCDEF' DIRPL WORD ROOT PL TO CONNECT ROOT TO 'DR' WORD 0 VOL NOT SPECIFIED DIRPUN RES 1,0 DIB ADDR WORD 0 FNO DIRLUN WORD 'DR' LUN TO CONNECT TO ROOT BYTE '. ' NAME OF ROOT SPACE 6 T1 RES 1,0 TEMP T2 RES 1,0 TEMP T3 RES 1,0 TEMP TC RES 1,0  ISM DELIMETER NC RES 1,0 ISM COUNT INPUT DV RES 1,0 DECIMAL VALUE DF RES 1,0  DECIMAL FLAG HF RES 1,0 HEX FLAG HV RES 1,0 HEX VALUE COPEXT RES 1,0  COPY OR EXTEND FLAG, 0 FOR COPY 1 FOR EX SBUF RES 7,0 SYMBOL BUFFERR BP RES 1,0 BUFFER POINTER IBUF  RES 64,0 CI INPUT BUFFER SPACE 3 NAMPP RES 1,0 NAME POINTER VOLPP RES 1,0  VOLUME NAME POINTER UNIT RES 1,0 RES 1,0 FOR FNO LUNPP EQU $ INXTPP RES 1,0 INIT EXTENT SEXTPP RES  1,0 SECONDARY EXTENT RLNPP RES 1,0 RECORD LENGTH OPCODE RES 1,0 LUNF RES 1,0 FROM LOGICAL UNIT LUNT RES 1,0 TO LOGICAL UNIT NAME RES 7,0 FILE NAME NAME1 RES 7,0  TO FILE NAME VOLUME RES 7,0 VOLUME NAME SPACE 3 SDB:A BUFSM,0 COMMAND INPUT BUFFER SEMAPHORE SPACE 9 * BEGIN PL'S CREPL WORD CRE:A WORD :1000 DELPL WORD DEL:A WORD :1000 ASSPL WORD ASS:A WORD :1000 COPYPL WORD COP:A WORD :1000 VIEWPL WORD VIE:A WORD :1000 IDIRPL WORD IDI:A WORD :1000 SPACE 6 IODEMO EQU $ COPY =D:TY00,X COPY DI:FLG(X),A RBIT DIF:FC,A COPY A,DI:FLG(X) SET FOR NO FORM CONTROL COPY DI:ELI( X),X IMS 0(X) IOD1 JST MSG ANNOUNCE 'IODEMO' WORD MES0 JST READ GET COMMAND WORD 80 WORD IBUF COPY:M =0,A,BP RESET BUFFER POINTER COPY A,COPEXT TESET COPY EXTEND FLAG SPACE 3 JSK ISM GET COMMAND JSK COMMA CHECK FOR COMMA JNE A,IOD1 SYNTAX ERROR JST LOOKUP SEARCH FOR COMMAND WORD CMDTBL JEQ A,IOD3 GOT IT JST  MSG INVALID COMMAND WORD ERR2 JMP IOD1 TRY AGAIN SPACE 3 IOD3 EQU $ JSK 0(X) GO PROCESS COMMAND R:CINT WHIFON CONSOL INTERUPT R:WAIT BUFSM WAIT UNTIL COMMAND IS THROUGH WITH BUFFER JMP IODEMO START AGAIN LPOOL SPACE 9 CREATE EQU $  JSK GNVU GET NAME VOL & UNIT JNE A,CRE14 BAD UNIT JNE A,CRE14 ERROR JSK CNVU CHECK NAME VOL & UNIT JSK ISM GET INITIAL EXTENT COPY DF,A JNE A,CRE12 INVALID DECIMAL NUMBER COPY:M DV,A,INXTPP SPACE 3 JSK ISM GET SECONDARY EXTENT COPY DF,A JNE A,CRE12 INVALID DECIMAL NUMBER COPY:M DV,A,SEXTPP SPACE 3  JSK ISM GET RECORD LENGTH COPY DF,A JNE A,CRE12 INVALID DECIMAL NUMBER  COPY:M DV,A,RLNPP R:BGIN CREPL START ACTIVITY CRE10 EQU $ RSK SPACE 3 CRE12 JST MSG BAD NUMBER WORD ERR6 CRE14 EQU $ R:SIG BUFSM RELESASE BUFFER JMP CRE10 LPOOL SPACE 60 DELETE EQU $ JSK GNVU GET NAME,VOL,& UNIT JNE A,DEL12 BAD UNIT JSK CNVU CHECK NAME, VOL, & UNIT JNE A,DEL12 ERROR R:BGIN DELPL START ACTIVITY DEL10 RSK SPACE 3 DEL12 R:SIG BUFSM RELEASE BUFFER JMP DEL10 SPACE 60 ASSIGN EQU $ JSK GNVU GET NAME,VOL,UNIT JNE A,ASS12 BAD UNIT COPY:M BP,A,T1  JSK ISM GET LUN COPY NC,A CLSN A,=2 JMP ASS3 GOOD JST MSG  WORD ERR1 SYNTAX ERROR JMP ASS12 SPACE 3 ASS3 EQU $ COPY:M SBUF,A,LUNPP LUN  R:BGIN ASSPL START ACTIVITY ASS10 RSK SPACE 3 ASS12 R:SIG BUFSM RELEASE BUFFER JMP  ASS10 SPACE 60 VIEW EQU $ JSK GPUN GET UNIT JNE A,VIE12 BAD UNIT R:BGIN VIEWPL START ACTIVITY VIE10 EQU $ RSK SPACE 3 VIE12 R:SIG BUFSM RELEASE BUFFER  JMP VIE10 LPOOL SPACE 60 EXTEND EQU $ EXTEND FILE IMS COPEXT SET FLAG TO EXTEND JMP COPY GO USE COPY LOGIC SPACE 9 IOB:A COPIOB,0,FU:,OP:,0,0,COPFP COPFP RES 2,0 SPACE 6 COP12J JMP COP12 COP16J JMP COP16 COP22J JMP COP22 LPOOL SPACE 3 COPY EQU   $ JSK ISM GET MODE JST LOOKUP LOOK IT UP WORD MODTBL JNE A,COP12J  BAD COPY X,OPCODE JSK GFL GET FROM FILE JNE A,COP16J BAD FILE NAME COPY:M LUNPP,A,LUNF FROM LU FOR DEVICE COPY T1,A CHECK FOR FILE NAME COPY A,NAME SET IN CASE OF DEVICE JEQ A,COP3 JUST DEVICE SPACE 3 COPY =NAME,Q MOVE FILE NAME HERE  COPY =7,A COPY =SBUF,X JSK MOV SPACE 3 JSK GFLU GET AN LU FOR THE FILE  JNE A,COP14 ERROR COPY X,LUNF LU GOTTEN COPY X,LUNPP SET UP TO CONNECT IT  COPY =NAME,A COP3 COPY A,NAMPP F:CONN NAMPP JEQ A,COP22J FILE DOESN'T EXIST SPACE 6  COPY:M LUNF,A,COPIOB+IO:LUN I:IO COPIOB OPEN FROM FILE JMP COP18 ERROR COPY  COPIOB+IO:ACT,A RECORD LENGTH IF FILE JNE A,COP3A RLN NOT UNDEFINED COPY =512,A ASSUME THIS FOR UNDEFINED COP3A EQU $ COPY NAMPP,Q JNE Q,COP4 FILE, SO ALL SET COPY UNIT,X  DIB COPY =512,A MAX RECORD LENGTH FOR COPY CSK A,DI:CPL(X) TRUNCATE TO LINE LENGTH JMP $+2 O.K. COPY DI:CPL(X),A TRUNCATE COP4 COPY A,RLNPP RECORD LENGTH SPACE 3  JSK GFL GET TO FILE JNE A,COP16 BAD FILE NAME COPY:M LUNPP,A,LUNT LU FOR DEVICE  COPY:M =0,A,NAMPP INIT COPY T1,A JEQ A,COP5 DEVICE ONLY SPACE 3 COPY =NAME1,Q MOVE FILE NAME HERE COPY =7,A COPY =SBUF,X JSK MOV JSK GFLU GET LU FOR IT JNE A,COP14 ERROR COPY X,LUNT TO LU COPY:M =NAME1,A,NAMPP SET UP TOCREATE IT COPY COPEXT,Q JNE Q,COP4A EXTEND, SO FILE ALREADY EXISTS COPY:M =10,A,INXTPP INIT EXTENT  COPY:M =10,A,SEXTPP SECONDARY F:CREA NAMPP JLT A,COP18 I/O ERROR JEQ A,COP20  ALREADY EXISTS SPACE 3 COP4A EQU $ COPY:M LUNT,A,LUNPP SET UP FOR CONNECT COP5 EQU $ F:CONN NAMPP JLT A,COP18 I/O ERROR JEQ A,COP22 FILE DOESN'T EXIST R:BGIN COPYPL START ACTIVITY COP10 EQU $ RSK SPACE 3 COP12 EQU $ JST MSG BAD MODE WORD ERR5 COP14 EQU $ R:SIG BUFSM RELEASE BUFFER JMP COP10 SPACE 3 COP16 JST MSG BAD FILE NAME WORD ERR8 JMP COP14 SPACE 3 COP18 JST MSG I/O ERROR WORD ERR11 JMP COP14  SPACE 3 COP20 COPY =7,A COPY NAMPP,X ADDR OF FILE ANME COPY =ERR9A,Q JSK MOV  MOVE FILE NAME TO MESSAGE JST MSG FILE ALREADY E ISTS WORD ERR9 JMP COP14 SPACE 3 COP22 COPY =7,A COPY NAMPP,X ADDR OF FILE ANME COPY =ERR10A,Q JSK MOV MOVE  FILE NAME TO MESSAGE JST MSG FILE DOSNT EXIST WORD ERR10 JMP COP14 SPACE 60 IDIR EQU $ JSK GPUN GET PUN JNE A,IDI12 BAD UNIT COPY UNIT,A JEQ A,IDI12  UNIT NOT SPECIFIED R:BGIN IDIRPL START ACTIVITY IDI10 EQU $ RSK SPACE 3 IDI12 R:SIG  BUFSM RELEASE BUFFER JMP IDI10 LPOOL SPACE 60 DUM12J JMP DUM12 DUM14J JMP DUM14  SPACE 3 DUMP EQU $ DUMP SECTORS JSK GPUN GET UNIT JNE A,DUM12J BAD UNIT JSK ISM GET SECTOR COPY HF,A JNE A,DUM14J DAB VALUE COPY:M HV,A,DUFP+1 SECTOR COPY TC,A SUB =',',A JNE A,DUM1 NO TO SECTOR JSK ISM GET LAST SECTOR COPY HF,A JNE A,DUM14J BA D VALUE DUM1 EQU $ COPY:M HV,A,T2 LAST SECTOR TO DO COPY UNIT,X COPY X,DUMPUT UNIT IN UAT COPY =BUF:LN,A DO A BUFFER AT A TIME  COPY A,DUIOB+IO:BCT EXCH:M DULO,MESIOB+IO:LUN SET UP OUTPUT LU FOR DUMP DUM1A EQU $ COPY UNIT,X  COPY T2,Q SEE IF LESS THAN ADD =1,Q ONE BUFFER TO DO LEFT SUB DUFP+1,Q SECTORS LEFT TOT DO SUB DI:SBF(X),Q JGE Q,DUM1B ATLEAST ONE BUFFER TO DO ADD DI:SBF(X),Q  COPY =0,A MUL DI:BPS(X),AQ BYTES LEFT TO DO COPY Q,DUIOB+IO:BCT SPACE 3 DUM1B EQU $  COPY:M =0,A,BP COPY DUFP+1,A SECTOR JSK HAD CONVERT TO ASCII COPY =IBUF,X  COPY =2,A COPY =MES6A,Q JSK MOV MOVE T MESSAGE JST MSG SECTOR NUMBER WORD MES6 I:IO DUIOB READ SECTOR JMP DUM16 I/O ERROR COPY:M =0,A,T1 BYTE COUNTER FOR SECTOR DUM2 EQU $ COPY:M =0,A,BP START OF BUFFER COPY T1,A ADDR OF LINE IN SECTOR JSK HAD CONVERT WORD TO ASCII & PUT IN BUFFER JSK STB SPACE TO BUFFER  SPACE 3 DUM3 COPY =DUBUF,Y COPY T1,X COPY 0(Y,X),A WORD FROM SECTOR SPACE 3 DUM5 JSK  HAD CONVERT WORD TO ASCII & PUT IN BUFFER JSK STB SPACE TO BUFFER IMS T1  NEXT WORD COPY T1,A AND =7,A 8 WORDS,PER LINE JNE A,DUM3 NOT DONE WITH THIS LINE SPACE 3 COPY T1,A SUB =8,A BACK TO START OF LINE COPY A,T1 JSK STB SEPARATION IN FRONT OF ASCII JSK STB JSK STB JSK STB DUM6 COPY T1,X BUFFER POINTER COPY =DUBUF,Y COPY 0(Y,X),A WORD FROM BUFFER JSK ATB PUT WORD IN BUFFER IF ASCII IMS T1 NEXT WEORD COPY T1,A AND =7,A JNE A,DUM6 LINE NOT DONE  SPACE 3 JST MSG PRINT LINE WORD BP COPY T1,A ADD A,A BYTES DONE THI S SECTOR SUB DUIOB+IO:ACT,A JLT A,DUM2 SPACE 3 COPY T2,A SUB DUFP+1,A SEE IF DONE WITH SECTORS JGE A,DUM1A MORE SECTORS TO DO EXCH:M DULO,MESIOB+IO:LUN RESTORE LU FOR MSG DUM10 EQU $ JST MSG DUMP COMPLETE WORD MES5 R:SIG BUFSM RSK SPACE 3 DUM12 EQU $ JMP DUM10 SPACE 3 DUM14 EQU $ JMP DUM10 SPACE 3 DUM16 EQU $ EXCH:M DULO,MESIOB+IO:LUN RESTORE LU FOR MSG JSK IOERR JMP DUM10 LPOOL SPACE 9 IOB:A DUIOB,'DU',RE:,FA:,0,DUBUF,DUFP DULO WORD LO DUMP OUTPUT LU DUFP RES 2,0 DUBUF RES 256,0 SPACE 9 HAD EQU $ HEX TO ASCII TO DUMP BUFFER PUSH :40 COPY:M =-4,Q,T3 4 CHARS PER WORD COPY A,Q PUT WORD IN Q HAD2 EQU $ ROTATE Q,L,4 PUT NEXT DIGIT IN PLACE COPY Q,A AND =:F,A ISOLATE DIGIT COPY =HEXTAB,Y SBIT BY:,S XNX A COPY 0(Y),A CHAR RBIT BY:,S  JSK BTB BYTE TO BUFFER IMS T3 JMP HAD2 WORD NOT DONE POP RSK  SPACE 9 STB EQU $ SPACE TO BUFFER COPY =' ',A SEPARATE WORDS BTB EQU $ BYTE TO BUFFER ENTRY COPY BP,X COPY =IBUF,Y BUFFER ADDR SBIT BY:,S COPY A,0(Y,X) RBIT BY:,S  IMS BP RSK SPACE 9 ATB EQU $ CHECK WORD FOR ATCII & PUT IN BUFFER COPY A,Q AND =:FF,Q SHIFT A,RO,8 SPLIT BYTES IN A & Q CLSN A,=' ' SPACE IS O.K. JMP ATB3  SPACE CSK A,='*' IF NOT BETWEEN '*' - 'Z' THEN COPY ='*',A SUBSTITUTUTE '*' TO AVOID CSK A,='Z' PRINTING CONTROL CHARACTERS JMP $+2 OK COPY ='*',A ATB3 CLSN Q,=' ' SPACE IS O.K. JMP ATB5 SPACE CSK Q,='*' COPY ='*',Q CSK Q,='Z' JMP $+2 OK COPY ='*',Q SPACE 3 ATB5 EQU $ JSK BTB BYTE TO BUFFER COPY Q,A JSK BTB BYTE TO BUFFER RSK LPOOL SPACE 60 MOUNT EQU $ MOUNT DISK JSK ISM GET VOL COPY =7,A COPY =SBUF,X COPY =VOLUME,Q MOVE IT TO HERE JSK MOV COPY =VOLUME,X VOL PTR COPY 0(X),A SUB =' ',A CHECK FOR NULL JNE A,MOU5 SPECIFIED COPY =0,X NOT SPECIFIED MOU5 COPY X,VOLPP SPACE 3  JSK GPUN GET UNIT JNE A,MOU10 BAD UNIT COPY UNIT,A JEQ A,MOU12  NOT SPECIFIED F:MONT VOLPP CHECK MOUNTING JST MSG MONUT COMPLETE WORD MES9 MOU10 R:SIG BUFSM RSK SPACE 3 MOU12 JST MSG UNIT NOT SPECIFIED WORD ERR7 JMP MOU10  SPACE 60 GFLU EQU $ GET LU FOR FILE R:WAIT FILESM WAIT FOR AN LU TO BE AVAILABLE   COPY =FILELU,Y COPY =0,X FLU3 COPY 1(Y,X),A SEE IF ASSIGNED JEQ A,FLU5 UNASSIGNED, GOT ONE EXCH X,A CHECK IF FILE OPEN COPY FC:FLG(X),Q TBIT FCF:OP,Q JF OV,FLU4 NOT OPEN SO LU AVAILABLE COPY A,X RESTORE INDEX ADD =2,X NEXT LU CSK  X,=NFILE*2 SEE IF SEARCH OVER JMP FLU3 NO NOP JMP FLU12 SERIOUS PROBLEM , THIS SHOULD'T HAPPEN FLU4 COPY A,X RESTORE INDEX FLU5 COPY 0(Y,X),X LU COPY =0,A GOOD RETURN FLU10 RSK SPACE 3 FLU12 EQU $ JST MSG FILE LU ERROR WORD ERR14 COPY =1,A  JMP FLU10 SPACE 9 GFL EQU $ GET FILE JSK ISM GET UNIT COPY NC,A CLSN A,=4 CHECK FOR VALID LENGTH JMP $+2 GOOD JMP GFL12 BAD  JSK SPU FIND DIB ADDR JNE A,GFL16 NOT FOUND COPY X,UNIT DIB ADDR COPY Q,LUNPP LU OF DEVICE COPY =0,A COPY A,T1 INIT COPY A,T2 COPY TC,A  SUB ='.',A CHECK FOR DISK FILE JNE A,GFL9 NOT DISK FILE COPY:M BP,A,T1 START OF FILE NAME JSK ISM COPY NC,A JEQ A,GFL18 NULL FILE NAME COPY A,T2 LENGTH GFL9 COPY =0,A GFL10 RSK SPACE 3 GFL12 JST MSG INVALID UNIT NAME WORD ERR4 GFL14 COPY =1,A JMP GFL10 SPACE 3 GFL16 JST MSG UNIT NOT FOUND WORD ERR7 JMP GFL14 SPACE 3 GFL18 JST MSG INVALID FILE NAME WORD ERR8 JMP GFL14 LPOOL SPACE 9 CNVU EQU  $ CHECK NAME VOL & UNIT FOR CREATE & DELETE COPY NAME,A SUB =' ',A JEQ A,CNV12  NAME NOT SPECIFIED, ERROR COPY VOLUME,A EITHER UNIT OR VOLUME MUST BE SPECIFIED SUB =' ',A  OR UNIT,A JEQ A,CNV14 NEITHER SPECIFIED COPY =0,A CNV10 RSK SPACE 3 CNV12 JST MSG  BAD FILE BAME WORD ERR8 COPY =1,A JMP CNV10 SPACE 3 CNV14 JST MSG NETHER VOL OR UNIT THERERE WORD ERR12 COPY =1,A JMP CNV10 LPOOL SPACE 9 LOOKUP ENT  TABLE LOOKUP COPY *LOOKUP,Y TABLE ADDR COPY 0(Y),A LENGTH OF COMMAND IN WORDS ADD A,A IN BYTES SUB NC,A SEE IF VALID LENGTH JLT A,LKP9 TOOO LONG COPY =0,Q LKP3 EQU $ COPY =SBUF,X ADDR OF REQUESTED COMMAND SBIT BY:,S XNX Q COPY 2(Y),A CHAR FROM TABLE RBIT BY:,S EXCH X,Y COPY A,T1 SBIT BY:,S XNX Q COPY  0(Y),A RBIT BY:,S COPY X,Y ADDR IN TABLE SUB T1,A JNE A,LKP7 NOT IT  ADD =1,Q NEXT CHAR CSK Q,NC SEE IF DONE JMP LKP3 NOT DONE SPAC  E 3 NOP COPY *LOOKUP,X COPY 0(X),X LENGTH OF TABLE ENTRY COPY 1(Y,X),X ENTRY FOUND COPY =0,A JMP LKP10 SPACE 3 LKP7 COPY *LOOKUP,X ADDR OF TABLE ADD 0(X),Y BUMP Y TO NEXT ENTRY ADD =1,Y COPY 1(Y),A JNE A,LKP3 NOT END OF TABLE LKP9  EQU $ COPY =1,A SPACE 3 LKP10 EQU $ IMS LOOKUP JMP *LOOKUP SPACE 9 GNVU EQU $ GET NAME,VOL,& UNIT JSK ISM GET NAME COPY =SBUF,X MOVE NAME COPY =7,A WORDS TO MOVE COPY =NAME,Q PLACE TO MOVE IT TO JSK MOV SPACE 3  JSK ISM GET VOL COPY =VOLUME,Q PLACE TO MOVE IT TO COPY =7,A WORDS TO MOVE  COPY =SBUF,X MOVE VOLUME NAME JSK MOV SPACE 3 SPACE 3 JSK GPUN GET UNIT GNV10 RSK SPACE 9 GPUN EQU $ GET PUN JSK ISM GET UNIT COPY NC,A COPY A,X IN CASE NOR SPECIFIED JEQ A,GPU7 NOT SPECIFIED CLSN A,=4  JMP GPU5 GOOD JMP GPU12 BAD GPU5 JSK SPU LOOK UP UNIT JNE A,GPU12 UNIT NOT FOUND GPU7 EQU $ COPY X,UNIT DIB ADDR COPY =0,A GPU10 RSK SPACE 3 GPU12 JST MSG BAD UNIT WORD ERR4 COPY =1,A JMP GPU10 SPACE 9 SPU EQU $  LOOK UP UNIT THRU UAT COPY =UAT:S,Y UAT ADDR COPY 0(Y),X NUMBER OF ENTRIES ADD  X,X 2 WORDS PER SUB =1,X SPU3 COPY X,T1 SAVE INDEX COPY 4(Y,X),X NEXT DIB  JEQ X,SPU5 NOT IT COPY DI:NAM(X),A DIB NAME COPY DI:NAM+1(X),Q SUB SBUF,A  JNE A,SPU5 NOT IT SUB SBUF+1,Q JEQ Q,SPU9 GOT IT SPU5 COPY T1,X INDEX TO UAT SUB =2,X NEX TENTRY JGT X,SPU3 NOT DONE COPY =1,X JMP SPU10  NOT FOUND SPACE 3 SPU9 COPY =0,A GOT IT EXCH T1,X COPY 3(Y,X),Q LUN  COPY T1,X DIB ADDR SPU10 RSK SPACE 9 COMMA EQU $ CHECK FOR COMMA COPY TC,A SUB =',',A JEQ A,COM5 O.K. JST MSG WORD ERR1 SYNTAX ERROR COPY =1,A COM5 RSK SPACE 9 ************************************************************ *  * * MESSAGE SUBROUTINE * * CALLING SEQUENCE  * * * * JST MSG  * * WORD MESSAGE ADDRESS * * * ************************************************************ MSG EQU $ PRINT MESSAGE ENT COPY *MSG,X   ADDR OF MESSAGE COPY:M 0(X),A,MESIOB+IO:BCT LENGTH ADD =1,X ADDR OF BYTE COPY X,MESIOB+IO:BUF MSG5 I:IO MESIOB JMP MSG5 RETRY ON ERROR IMS MSG BUNP RETURN OVER PARAMETER JMP *MSG LPOOL IOB:A MESIOB,SL,WR:,FA:,0,0,0 ************************************************************ *  * * READ COMMAND INPUT SUBROUTINE * *  * * CALLING SEQUENCE * *  * * JST READ * * WORD NUMBER OF CHARACTERS * * WORD BUFFER ADDR * * * *  OUTPUTS * * NC NUMBER OF CHARACTERS INPUT * *  TC LAST CHARACTER INPUT * * * * INPUT BUFFER IS INITIALIZED TO BLANKS * * * ************************************************************ READ ENT COPY:M =0,A,NC INITIALIZATION COPY *READ,X BYTE COUNT IMS READ COPY *READ,Y BUFFER ADDR COPY X,RDIOB+IO:BCT COPY Y,RDIOB+IO:BUF  COPY:M =' ',A,TC COPY =' ',A ADD =1,X SHIFT X,RO,1 WORDS TO BLANK READ5 COPY A,0(Y,X)  JEQD X,READ5 READ6 I:IO PROMPT NOP READ7 I:IO RDIOB NOP COPY =CI,A SEE IF CI & SL ARE THE SAME JSK SLU COPY X,T1 COPY =SL,A JSK SLU COPY 1(X),A DIB OF SL COPY T1,X SUB 1(X),A JEQ A,READ10 THE SAME DO('T ECHO IT COPY:M RDIOB+IO:ACT,A,BP  LENGTH OF INPUT JST MSG ECHO COMMAND ON SL WORD BP READ10 EQU $ COPY:M RDIOB+IO:ACT,X,NC BYTES INPUT COPY RDIOB+IO:BUF,X SBIT BY:,S COPY 0(Y,X),A RBIT BY:,S COPY A,TC SUB  =1,X IMS READ JMP *READ LPOOL IOB:A RDIOB,CI,RE:,FA:,0,0,RDFP RDFC EQU RDIOB+IO:FC RDFP RES 2,0 IOB:A PROMPT,CI,WR:,WP:,1,PCHAR,0 PCHAR BYTE '>' PROMPT CHAR SPACE 60 ISM EQU $  INPUT SYMBOL COPY =0,A COPY A,DV INIT COPY A,DF COPY A,HV COPY A,HF COPY A,NC COPY =' ',A COPY =0,Q COPY =SBUF,X BLANK BUFFER ISM1 XNX Q COPY A,0(X) ADD =1,Q CLSN Q,=7 JMP $+2 DONE JMP ISM1 NOT DONE SPACE 3 ISM2 COPY =IBUF,Y INPUT BUFFER COPY BP,X BUFFER POINTER COPY X,Q  CSK Q,RDIOB+IO:ACT SEE IF INPUT EXAUSTED JMP $+3 NO NOP JMP ISM10 NOTHING LEFT IN BUFFER SPACE 3 IMS BP BUNP POINTER NOP SBIT BY:,S COPY 0(Y,X),A   GET CHARACTER RBIT BY:,S COPY A,TC CSK A,='0' CHECK FOR DECIMAL JMP ISM10 DELEIMITER CSK A,='9'+1 JMP ISM3 O.K. FOR HEX OR DECIMAL IMS DF NOT  SPACE 3 CSK A,='A' CHECK FOR HEX IMS HF NOT CSK A,='F' JMP $+2  HEX IMS HF NOT HEX SUB =7,A SET TO HEX VALUE SPACE 3 ISM3 EQU  $ COPY DV,Q SHIFT Q,LO,3 *8 ADD DV,Q *9 ADD DV,Q *10  SUB ='0',A ADD A,Q COPY Q,DV CUURENT DECIMAL VALUE COPY HV,Q SHIFT Q,LO,4 ADD A,Q ADD NEXT DIGIT COPY Q,HV COPY NC,X CLSN X,=4 LIMIT FOR DECIMAL IMS DF NOT DECIMAL CLSN X,=4 IMS HF NOT HEX CLSN X,=14  CHECK FOR LIMIT JMP ISM8 HIT LIMIT COPY TC,A RESTORE CHAR COPY =SBUF,Y SBIT BY:,S COPY A,0(Y,X) PUT CHARACTER INTO SYMBOL BUFFER RBIT BY:,S IMS NC BUMP PCOUNTER NOP ISM8 JMP ISM2 SPACE 3 ISM10 EQU $ COPY A,TC SAVE DELIMITER RSK  LPOOL END TITL IOS4 DEMO PROGRAM SHARABLE SFMDEMO: SFMDEMO: REL NAM G:B NAM CRE:A,DEL:A,ASS:A,COP:A,VIE:A,IDI:A NAM MOV NAM SLU NAM MES0,MES1,MES2,MES3,MES4 NAM IOERR NAM MES5 NAM MES6 NAM MES6A NAM MES9 NAM ERR1,ERR2,ERR3,ERR4,ERR5,ERR6,ERR7,ERR8,ERR9,ERR10 NAM ERR10A,ERR9A NAM ERR11,ERR12 NAM ERR14 EXTR RDIOB EXTR RDFC EXTR UAT:S EXTR MSG,BUFSM EXTR FILESM EXTR NAME,VOLUME EXTR INXTPP,SEXTPP,RLNPP EXTR LUNPP EXTR UNIT,DIRPUN,DIRLUN EXTR LUNF,LUNT EXTR OPCODE EXTR DIRPL EXTR HAD,IBUF,BP SPACE 9 G:B EQU $ MOV EQU $ MOVE WORDS JEQD A,MOV10 NOTHING TO DO  PUSH :40 COPY Q,Y TO ADDR MOV5 COPY 0(X),Q COPY Q,0(Y) ADD =1,X ADD =1,Y JNED A,MOV5 NOT DONE POP MOV10 RSK SPACE 9 ISP EQU $ INIT SCRATCH PAD  COPY =0,Q COPY =0,X ISP5 COPY Q,0(Y,X) ADD =1,X SUB =1,A JNE A,ISP5 NOT DONE RSK SPACE 9 TNVU EQU $ XFER NAME,VOL & UNIT TO Y SPAD COPY =ENDY,A LENGTH OF SPAD JSK ISP ZERO IT COPY =NAME,X MOVE NAME COPY =7,A WORDS TO MOVE COPY =NAM,Q ADD Y,Q JSK MOV MOVE FROM BUFFER TO SCRATCHPAD COPY =7,A  WORDS TO MOVE COPY =VOLUME,X MOVE VOLUME NAME COPY =VOL,Q ADD Y,Q JSK MOV  MOVE FROM BUFFER TO SCRATCHPAD COPY:M UNIT,A,PUN(Y) DIB ADDR COPY Y,A ADD =NAM,A   ADDR OF NAME COPY NAM(Y),Q SEE IF EXISTS SUB =' ',Q JNE Q,TNV2 EXISTS COPY =0,A NULL TNV2 EQU $ COPY A,NAMPTR(Y) COPY Y,A ADD =VOL,A COPY VOL(Y),Q  SEE IF VOL SPECIFIED SUB =' ',Q JNE Q,TNV3 SPECIFIED COPY =0,A NOT SPECIFIED TNV3 EQU $ COPY A,VOLPTR(Y) RSK SPACE 9 SLU EQU $ COPY =UAT:S,X UAT ADDR COPY 0(X),Q LENGTH ADD Q,Q 2 WORDS PER ENTRY SUB =2,Q ADD =4,X POINT TO FIRST ENTRY SLU3 ADD Q,X ADDR OF NEXT ENTRY CSK A,0(X) SERCH FOR LU  JMP SLU5 NOT IT JMP SLU5 NOT IT JMP SLU9 GOT IT SLU5 SUB Q,X SUB =2,Q NEXT ENTRY JGE Q,SLU3 MORE TO SEARCH SLU9 RSK SPACE 9 FMSG ENT  FILE MESSAGE R:WAIT BUFSM WAIT FOR BUFFER CONTROL COPY NAMPTR(Y),X MOVE FILE NAME TO MESSAGE JNE X,FMS2 DISK FILE COPY UNIT,X DIB OF UNIT ADD =DI:NAM,X ADDR OF DVICE NAME COPY Y,Q ADD =NAM,Q MOVE IT TO HERE COPY =7,A JSK BFN CLEAR OUT OLD FILE NAME COPY =2,A 2 WORDS LONG JSK MOV COPY Y,X ADD =NAM,X FMS2 EQU $ COPY *FMSG,Q COPY Q,FMS5 MESSAGE ADDR ADD =4,Q ADDR TO MOVE FILE NAME TO COPY =7,A LENGTH OF NAME JSK MOV JST MSG FMS5 RES 1,0 R:SIG BUFSM  LET GO OF BUFFER IMS FMSG JMP *FMSG LPOOL BFN EQU $ BLANK FILE NAME PUSH :40 SUB =1,A COPY Q,X ADDR OF NAME COPY =' ',Q BFN3 COPY Q,0(X) ADD =1,X NEXT WORD  JNED A,BFN3 NOT DONE POP RSK SPACE 9 SPACE 60 TDB:A CRE:A,CRE:S,ENDY,0,:100,0,10 CRE:S EQU $ CREATE ACTIVITY JSK TNVU TRANSFER NAME,VOL, & UNIT TO Y-SPAD COPY:M INXTPP,A,INXT(Y) SET UP REST OF PL COPY:M SEXTPP,A,SEXT(Y) IN SPAD COPY:M RLNPP,A,RECLN(Y) R:SIG BUFSM FREE BUFFER F:CREA NAMPTR(Y) CREATE FILE JEQ A,CREA12 FILE ALREADY EXISTS  JST FMSG TELL USER FILE CREATED WORD MES1 CREA10 EQU $ R:END SPACE 3 CREA12 JST FMSG  FILE ALREADY EXISTS WORD ERR9 JMP CREA10 SPACE 60 TDB:A DEL:A,DEL:S,ENDY,0,:100,0,10 DEL:S  EQU $ DELETE ACTIVITY JSK TNVU TRANSFER NAME,VOL, & UNIT TO Y-SPAD R:SIG BUFSM  FREE BUFFER F:DELE NAMPTR(Y) DELETE FILE JEQ A,DELE12 FILE NOT FOUND JST FMSG  FILE DELETED WORD MES2 DELE10 EQU $ R:END SPACE 3 DELE12 JST FMSG FILE NOT FOUND WORD ERR10 JMP DELE10 SPACE 60 TDB:A ASS:A,ASS:S,ENDY,0,:100,0,10 ASS:S EQU $ ASSIGN ACT  IVITY JSK TNVU TRANSFER NAME,VOL, & UNIT TO Y-SPAD COPY:M LUNPP,A,LUN(Y) COPY A,INLUN(Y)  SUB ='CI',A IF COMMAND INPUT BEING CHANGED JNE A,ASSI3 NO COPY:M =FU:%4+CL:,A,RDFC  I:IO RDIOB CLOSE OLD FILE NOP SPACE 3 ASSI3 EQU $ F:CONN NAMPTR(Y) CONNECT FILE JEQ A,ASSI12 FILE NOT FOUND COPY:M LUN(Y),A,MES3B LUN TO MESSAGE SUB =CI,A JNE A,ASSI8 COPY:M =FU:%4+OP:,A,RDFC I:IO RDIOB OPEN NEW FILE JMP ASSI14 ERROR COPY:M =RE:%4+FA:,A,RDFC SPACE 3 ASSI8 EQU $ R:SIG BUFSM FREE BUFFER JST FMSG  FILE CONNECTED WORD MES3 ASSI10 EQU $ R:END SPACE 3 ASSI12 R:SIG BUFSM JST MSG FILE NOT FOUND WORD ERR10 JMP ASSI10 SPACE 3 ASSI14 COPY =RDIOB,A SUB Y,A TO COMPENSATE FOR IOERR ADDING Y JSK IOERR OPEN ERROR ASSI16 F:CONN TTYPL PUT CI BACK TO TTY R:SIG BUFSM  JMP ASSI10 SPACE 3 EXTR D:TY00 CONN:A TTYPL,0,0,TY00,CI LPOOL SPACE 60  TDB:A VIE:A,VIE:S,ENDY,0,:100,0,10 VIE:S EQU $ VIEW ACTIVITY COPY =ENDY,A JSK ISP  INIT SPAD COPY:M UNIT,A,PUN(Y) DIB ADDR COPY A,DIRPUN F:CONN DIRPL CONNECT TO DIRECTORY JLE A,VIEW12 CAN'T MAKE NO CONNECTION COPY:M DIRLUN,A,INLUN(Y) SET UP IOBS COPY:M =16,A,INBCT(Y) COPY A,OUTBCT(Y) COPY:M =FU:%4+OP:,A,INFC(Y) OPEN COPY A,OUTFC(Y) COPY Y,A  ADD =NAM,A BUFFER ADDR COPY A,INBUF(Y) COPY A,OUTBUF(Y) COPY Y,A ADD =INFP,A  COPY A,INCRI(Y) COPY:M =SL,A,OUTLUN(Y) I:IO INIOB(Y) OPEN DIRECTORY JMP VIEW14  ERROR I:IO OUTIOB(Y) OPEN LO DEVICE JMP VIEW16 ERROR COPY:M =RE:%4+FS:,A,INFC(Y) READ STREAM COPY:M =WR:%4+FA:,A,OUTFC(Y) WRITE ASCII SPACE 3 VIEW1 EQU $ I:IO INIOB(Y) READ DIRECTORY ENTRY JMP VIEW18 ERROR COPY NAM(Y),A FNO COPY ='',Q JNE A,VIEW2  FILE EXISTS COPY NAM+1(Y),A SEE IF EVER USED JEQ A,VIEW1 NEVER USED COPY ='D ',Q  DELETED VIEW2 COPY Q,NAM(Y) I:IO OUTIOB(Y) LIST ENTRY JMP VIEW20 ERROR JMP VIEW1 KEEP ON GOING SPACE 3 VIEW5 EQU $ COPY:M =FU:%4+CL:,A,INFC(Y) CLOSE I:IO INIOB(Y)  CLOSE DIRECTORY JMP VIEW22 ERROR COPY:M =FU:%4+CL:,A,OUTFC(Y) CLOSE I:IO OUTIOB(Y)  CLOSE 'LO' JMP VIEW22 ERROR VIEW10 EQU $ JST MSG VIEW COMPLETE WORD MES7  R:SIG BUFSM FREE BUFFER R:END SPACE 3 VIEW12 EQU $ JST MSG DIRECTORY NOT FOUND  WORD ERR15 JMP VIEW10 SPACE 3 VIEW14 EQU $ COPY =INIOB,A JSK IOERR ANNOUNCE  I/O ERROR JMP VIEW10 SPACE 3 VIEW16 EQU $ COPY:M =FU:%4+CL:,A,INFC(Y) CLOSE I:IO INIOB(Y) CLOSE DIRECTORY JMP VIEW22 ERROR COPY =OUTIOB,A JSK IOERR ANNOUNCE I/O ERROR JMP VIEW10 SPACE 3 VIEW18 EQU $ COPY IO:ST+INIOB(Y),A SOFTWARE STATUS SUB  =EOF:,A CHECK FOR END OF FILE JEQ A,VIEW5 GO FINISH UP COPY =INIOB,A JSK IOERR  ANNOUNCE I/O ERROR JMP VIEW5 GO CLOSE VIEW20 EQU $ COPY:M =FU:%4+CL:,A,INFC(Y) CLOSE  I:IO INIOB(Y) CLOSE DIRECTORY JMP VIEW22 ERROR COPY =OUTIOB,A JSK IOERR  ANNOUNCE I/O ERROR JMP VIEW10 SPACE 3 VIEW22 EQU $ JSK IOERR ANNOUNCE I/O ERROR  JMP VIEW10 LPOOL SPACE 60 TDB:A IDI:A,IDI:S,ENDY,0,:100,0,10 IDI:S EQU $ INIT DIRECTROY ACTIVITY COPY =ENDY,A JSK ISP INIT YSPAD COPY:M UNIT,A,PUN(Y) DIB COPY A,DIRPUN FOR DIRECTORY COPY:M =0,A,VOLPTR(Y) NO VOLUME NAME SPECIFIED COPY Y,A ADD =NAM,A ADDR OF FILE NAME COPY A,NAMPTR(Y) SUB =1,A 1 WORD FOR FNO COPY A,INBUF(Y)  COPY:M =16,A,INBCT(Y) BYTES PER ENTRY COPY:M DIRLUN,A,INLUN(Y) LU OF DIRECTORY COPY:M =FU:%4+OP:,A,INFC(Y) OPEN COPY Y,A ADD =INFP,A ADDR OF FILE POINTER COPY A,INCRI(Y) F:CONN DIRPL  CONNECT TO DIRECTORY JEQ A,IDIR12 BAD CONNECT I:IO INIOB(Y) OPEN DIRECTORY JMP  IDIR17 ERROR COPY:M =RE:%4+FS:,A,INFC(Y) READ STREAM SPACE 4 IDIR5 I:IO INIOB(Y) READ DIRECTORY JMP IDIR7 ERROR COPY *INBUF(Y),A FNO JEQ A,IDIR5 EMPTY ENTRY SUB =5,A CHECK FOR SYSTEM ENTRIES JLE A,IDIR5 DON'T DELETE SYSTEM ENTRIES F:DELE NAMPTR(Y) DELETE FILE JEQ A,IDIR17 SOMETHING FUNNY,FILE NOT FOUND JMP IDIR5 SPACE 4 IDIR7 COPY INST(Y),A CHECK FOR EOF SUB =EOF:,A JNE A,IDIR16 ERROR IDIR8 COPY:M =FU:%4+CL:,A,INFC(Y)  I:IO INIOB(Y) CLOSE DIRECTORY JMP IDIR17 ERROR IDIR10 EQU $ JST MSG DONE WORD MES8 R:SIG BUFSM FREE BUFFER R:END SPACE 3 IDIR12 EQU $ JST MSG DIRECTORY NOT FOUND WORD ERR15 JMP IDIR10 SPACE 3 IDIR16 EQU $ COPY =INIOB,A JSK IOERR JMP IDIR8 SPACE 3 IDIR17 EQU $ COPY =INIOB,A JSK IOERR ANNOUNCE I/O ERROR  JMP IDIR10 LPOOL SPACE 60 TDB:A COP:A,COP:S,ENDB,0,:100,0,10 COP:S EQU $ COPY ACTIVITY COPY =ENDB,A LENGHT OF YSPAD JSK ISP INIT YSPAD COPY =7,A MOVE FROM FILE NAME TO SPAD COPY =NAME,X COPY =NAM,Q ADD Y,Q JSK MOV COPY:M OPCODE,A,MOD(Y)  MODIFIER COPY:M LUNF,A,INLUN(Y) SET UP LOGICAL UNITS COPY:M LUNT,A,OUTIOB(Y) COPY:M RLNPP,A,INBCT(Y)  RECORD LENGTH SPACE 3 COPY:M =0,A,RECLN(Y) INIT RECORD COUNTER COPY:M =FU:%4+OP:,A,INFC(Y) OPEN  COPY A,OUTFC(Y) COPY Y,A ADD =IBUFF,A COPY A,INBUF(Y) COPY A,OUTBUF(Y) COPY  Y,A ADD =INFP,A COPY A,INCRI(Y) COPY Y,A ADD =OUTFP,A COPY A,OUTCRI(Y) SPACE 3 I:IO OUTIOB(Y) OPEN OUTPUT FILE JMP COPY14 ERROR R:SIG BUFSM FREE BUFFER SPACE 3 COPY =RE:%4,A READ OR MOD(Y),A ADD MODIFIER COPY A,INFC(Y)  COPY =WR:%4,A OR MOD(Y),A ADD MODIFIER COPY A,OUTFC(Y) SPACE 3 COPY8 EQU $ COPY INLUN(Y),A SET UP PROMPT COPY A,PROMPT+IO:LUN I:IO PROMPT PROMPT INPUT JMP COPY16  ERROR I:IO INIOB(Y) IMPUT JMP COPY16 ERROR COPY:M INACT(Y),A,OUTBCT(Y) WRITE THAT WHICH WAS WRITTEN JEQ A,COPY8 NULL INPUT I:IO OUTIOB(Y) WRITE JMP COPY18 ERROR IMS RECLN(Y) BUMP RECORD COUNTER NOP COPY RECLN(Y),A SELP A,4  DISPLAY RECORD NUMBER JMP COPY8 SPACE 3 COPY9 EQU $ COPY:M =FU:%4+CL:,A,INFC(Y) I:IO INIOB(Y) CLOSE INPUT FILE JMP COPY22 ERROR COPY9A EQU $ COPY:M =FU:%4+CL:,A,OUTFC(Y)  I:IO OUTIOB(Y) CLOSE OUTPUT FILE JMP COPY19 ERROR SPACE 3 JSK RFL RELEASE FILE LOGICAL UNITS R:WAIT BUFSM WAIT FOR CONTROL COPY:M =0,A,BP SET TO CONVERT RECORD LENGTH COPY RECLN(Y),A HEX NIMBER OF RECORDS JSK HAD CONVERT TO ASCII COPY =2,A  MOVE TO MESSAGE COPY =IBUF,X FROM HERE COPY =MES4B,Q JSK MOV COPY =NAM,X CHECK FOR FILE ADD Y,X COPY 0(X),A JNE A,COPY9B FILE COPY INLUN(Y),A LU  JSK SLU FIND UNIT COPY 1(X),X DIB ADDR ADD =DI:NAM,X NAME ADDR COPY  =MES4A,Q COPY =7,A JSK BFN CLEAR OUT OLD FILE NAME COPY =2,A JMP COPY9C COPY9B COPY =MES4A,Q COPY =7,A COPY9C JSK MOV MOVE FILE OR DEVICE NAME TO MESSAGFE JST MSG  PRINT NUMBER OF RECORDS COPIED WORD MES4 COPY10 EQU $ R:SIG BUFSM LET GO OF BUFFER R:END  THROUGH COPY9J JMP COPY9 LPOOL SPACE 3 COPY14 EQU $ COPY:M =FU:%4+CL:,A,INFC(Y)  I:IO INIOB(Y) CLOSE INPUT FILE JMP COPY22 ERROR COPY =OUTIOB,A JSK IOERR  I/O ERROR JMP COPY20 SPACE 3 COPY16 EQU $ COPY INST(Y),A SUB =EOF:,A CHECK FOR END OF FILE JEQ A,COPY9J EOF GO DO NORMAL TTUFF JSK RFL RELEASE FILE LOGICAL UNITS   JMP COPY22 GO CLOSSE OUPUT FILE COPY17 EQU $ COPY =INIOB,A JSK SIOERR I/O ERROR  JMP COPY20 SPACE 3 COPY18 EQU $ COPY:M =FU:%4+CL:,A,INFC(Y) I:IO INIOB(Y) CLOSE INPUT FILE JMP COPY22 ERROR COPY19 EQU $ JSK RFL RELEASE FILE LOGICAL UNITS COPY =OUTIOB,A JSK SIOERR I/O ERROR JMP COPY20 SPACE 3 COPY20 EQU $ JMP COPY10  SPACE 3 COPY22 EQU $ COPY:M =FU:%4+CL:,A,OUTFC(Y) I:IO OUTIOB(Y) CLOSE OUTPUT FILE NOP  JMP COPY17 SPACE 6 RFL EQU $ RELEASE FILES COPY INLUN(Y),A JSK RFLU  RELEASE FINPUT FILE LU COPY OUTLUN(Y),A JSK RFLU RELEASE OUTPUT FILE LU RSK LPOOL IOB:A PROMPT,0,WR:,WP:,1,PCHAR,0 PCHAR BYTE '>' SPACE 60 RFLU EQU $ RELEASE FILE LU  JSK SLU FIND FCB COPY 1(X),X FCB ADDR COPY FC:FLG(X),Q CHECK IF FCB JGE  Q,RFL10 NOT FCB R:SIG FILESM SIGNAL FILE LU SEMAPHORE RFL10 RSK SPACE 9 SIOERR EQU $  SEMAPHORE ENTRY PUSH :40 SAVE IOB DISP IN A R:WAIT BUFSM POP IOERR EQU $  I/O ERROR MESSAGE ROUTINE COPY A,X ADD Y,X IOB ADDR COPY:M IO:LUN(X),Q,ERR11B LU INTO MESSAGE COPY IO:ST(X),A STATUS COPY:M =0,Q,BP START OF IBUF JSK HAD CONVERT CODE TO ASCII COPY =IBUF,X MOVE CODE TO MESSAGE COPY =2,A 4 CHARS COPY =ERR11A,Q JSK MOV JST MSG WORD ERR11 I/O ERROR RSK LPOOL SPACE 9 MES0 LNM MES1 BYTE 'IODEMO' MES1 LNM MES2 BYTE 'FILE ' MES1A BYTE ' ' BYTE ' CREATED' MES2 LNM MES3 BYTE 'FILE ' MES2A BYTE ' ' BYTE ' DELETED' MES3 LNM MES4 BYTE 'FILE ' MES3A BYTE '  ' BYTE ' ASSIGNED TO ' MES3B BYTE ' ' MES4 LNM MES5 BYTE 'FILE ' MES4A BYTE ' ' BYTE ' :' MES4B BYTE ' ' BYTE ' RECORDS COPIED' MES5 LNM MES6 BYTE 'DUMP COMPLETE' MES6 LNM MES7 BYTE 'SECTOR ' MES6A BYTE ' ' MES7 LNM MES8 BYTE 'VIEW COMPLETE' MES8 LNM MES9 BYTE 'DIRECTORY INITIALIZED' MES9 LNM MES10  BYTE 'MOUNT COMPLETE' MES10 EQU $ ERR1 LNM ERR2 BYTE 'SYNTAX ERROR' ERR2 LNM ERR3 BYTE 'INVALID COMMAND' ERR3 LNM ERR4 ERR4 LNM ERR5 BYTE 'INVALID UNIT NAME' ERR5 LNM ERR6 BYTE 'INVALID MODE' ERR6 LNM ERR7 BYTE 'INVALID DECIMAL NUMBER' ERR7 LNM ERR8 BYTE 'UNIT NOT FOUND' ERR8 LNM ERR9 BYTE 'INVALID FILE NAME' ERR9 LNM ERR10 BYTE 'FILE ' ERR9A BYTE ' ' BYTE ' ALREADY EXISTS' ERR10 LNM ERR11 BYTE 'FILE ' ERR10A EQU $ BYTE ' ' BYTE ' NOT FOUND' ERR11 LNM ERR12 BYTE 'I/O ERROR' BYTE ' ' ERR11A BYTE  ' ' BYTE ' ON ' ERR11B BYTE ' ' ERR12 LNM ERR14 BYTE 'NEITHER UNIT OR VOLUME SPECIFIED' ERR14 LNM  ERR15 BYTE 'FILE LU ERROR' ERR15 EQU $ LPOOL END FOUND' ERR8 LNM ERR9 BYTE 'INVALID FILE NAME' ERR9 LNM ERR10 BYTE 'FILE ' ERR9A BYTE ' ' BYTE ' ALREADY EXISTS' ERR10 LNM ERR11 BYTE 'FILE '/ SFMDEMO.JCL --- JCL TO ASSEMBLE & LINK SFM DEMO PROGRAM / (93441-7A-E600) / THE FOLLOWING DIRECTORY ASSIGNMENTS ARE ASSUMED: / UF CONTAINS THE SFM DEMO SOURCE (SFMDEMO.ASM) / SF CONTAINS THE MACRO FILES / X2 CONTAINS THE RTX LIBRARY (RTX.LIB) / X2 CONTAINS THE IOS LIBRARY (IOS.LIB) / X2 CONTAINS THE SFM LIBRARY (SFM.LIB) / /PAUSE --- ARE ALL ASSIGNMENTS CORRECT? / /MACRO SFMDEMO(D=SF.GEN+SF.RTX+SF.IOS+SF.IOSD+SF.SFM+SF.SFMD) /DI SF /PAUSE --- IF SYSTEM IS ON FLOPPY, LOAD LINKER FLOPPY INTO SF /MO SF /LINK SFMDEMO(RL=100)+X2.SFM+X2.IOS+X2.RTX /DI SF /PAUSE --- IF SYSTEM IS ON FLOPPY, LOAD SYSTEM FLOPPY INTO SF /MO SF / /JO SFM DEMO PROGRAM CREATED ON UF X2 CONTAINS THE RTX LIBRARY (RTX.LIB) / X2 CONTAINS THE IOS LIBRARY (IOS.LIB) / X2 CONTAINS THE SFM LIBRARY (SFM.LIB) / /PAUSE --- ARE ALL ASSIGNMENTS CORRECT? TITL GEN.MAC - GENERAL EQUATES & MACROS (93420-1A-E100) TITL .... C O N T E N T S *************** * * * GEN.MAC * * * *************** * * ASCII EQUATES * CONTEXT BLOCK (STACK) EQUATES * SYMATT BIT VALUE EQUATES * DIO INTERRUPT VECTOR EQUATES * CONSOLE DEVICE ADDRESS & FUNCTION CODES * STATUS REGISTER EQUATES * FIXED MEMORY ADDRESS ASSIGNMENTS * BIT:??? MACROS * COPY:M MACRO * EXCH:M MACRO * RET: MACRO * DUP: MACRO * DOOR SERVICE CALL MACRO TITL .... M I S C E L L A N E O U S E Q U A T E S * ASCII EQUATES * PARTY: EQU :00 SET PARITY BIT OFF NU: SET :00++PARTY: ASCII NULL LF: SET :0A++PARTY: ASCII LINE FEED FF:  SET :0C++PARTY: ASCII FORM FEED CR: SET :0D++PARTY: ASCII CARRIAGE RETURN RO: SET :7F++PARTY: ASCII RUBOUT * * CONTEXT BLOCK (STACK) EQUATES * LAST:L EQU 0 CALLER'S L REGISTER LAST:S EQU 1 CALLER'S S REGISTER LAST:A EQU 2 CALLER'S A REGISTER LAST:Q EQU 3 CALLER'S Q REGISTER LAST:X EQU 4 CALLER'S X REGISTER LAST:Y EQU 5 CALLER'S Y REGISTER LAST:P EQU 6 CALLER'S P REGISTER (RETURN ADDRESS) CBL: EQU LAST:P+1 LENGTH OF CONTEXT BLOCK * * SYMATT BIT VALUE EQUATES * ABSBT: EQU :8000 ABSOLUTE RELBT: EQU :4000 RELATIVE REGBT: EQU :2000 REGISTER EXT: EQU :1000 EXTERNAL 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 EVALUATION ERROR BYTRL: EQU :10 BYTE RELOCATABLE TITL * DIO INTERUPT VECTOR EQUATES * IV:AIO EQU 0 AUTO I/O IV:CNT EQU 1 BYTE COUNT IV:BUF EQU 2 BUFFER ADDRESS IV:JSK EQU 4 JSK $+1 IV:EOB EQU 5 EOB ADDRESS * * CONSOLE DEVICE ADDRESS & 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 F UNCTION CODE TITL .... S T A T U S R E G I S T E R E Q U A T E S * STATUS REGISTER BIT POSITION EQUATES * 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 * * STATUS REGISTER BIT VALUE EQUATES * 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 MODE 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 .... F I X E D M E M O R Y E Q U A T E S * 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 TITL .... B I T : ? ? ? M A C R O S ** MACRO: BIT:EQU, BIT:SET, & BIT:WORD * BUILD A 16-BIT ARRAY OF BITS AND ASSIGN IT APPROPRIATELY * * CALLING SEQUENCE: (LABEL) BIT:??? (BIT1),(BIT2),...,(BIT8) * BIT1-BIT8 = BIT POSITIONS TO BE TURNED ON ** SPACE 2 BIT:EQU MACRO EQU MACLAB BIT:SET MACENT SET MACLAB BIT:WORD MACENT WORD MACLAB A: SET 0 * BIT:LOOP MACENT NULL IFT #(1,?) A: SET 1//#(1)++A: BIT:LOOP #(2),#(3),#(4),#(5),#(6),#(7),#(8) ENDC * IFF #(0,'NULL') #(-1) #(0) A: ENDC ENDM TITL .... C O P Y M E M O R Y - M E M O R Y M A C R O ** MACRO: COPY:M * COPY THE CONTENTS OF ONE MEMORY CELL TO ANOTHER * * CALLING SEQUENCE: (LABEL) COPY:M MEM1,REG,MEM2 * MEM1 = ADDRESS OF SOURCE MEMORY CELL * REG = REGISTER TO BE USED FOR TRANSFER * MEM2 = ADDRESS OF DESTINATION MEMORY CELL ** SPACE 2 COPY:M MACRO COPY #(1),#(2) COPY #(2),#(3) ENDM TITL .... E X C H M E M O R Y - M E M O R Y M A C R O ** MACRO: EXCH:M * EXCHANGE THE CONTENTS OF TWO MEMORY CELLS * * CALLING SEQUENCE: (LABEL) EXCH:M MEM1,MEM2 * MEM1,MEM2 = MEMORY ADDRESSES OF CELLS TO BE EXCHANGED ** SPACE 2 EXCH:M MACRO EXCH #(1),A EXCH A,#(2) EXCH A,#(1) ENDM TITL .... R E T U R N M A C R O ** MACRO: RET: * RETURN WITH A VALUE IN THE A REGISTER * * CALLING SEQUENCE: (LABEL) RET:A VALUE * VALUE = VALUE TO RETURNED IN THE A REGISTER ** SPACE 2 RET: MACRO COPY =#(1),A RSK ENDM TITL .... D U P ( L I C A T E ) M A C R O  ** MACRO: DUP * DUPLICATE THE GIVEN BYTE THE NUMBER OF TIMES SPECIFIED. * * CALLING SEQUENCE: (LABEL) DUP 'TEXT',NUM * 'TEXT' = BYTE STRING (DUPLICATION STARTS IN COLUMN 1) * NUM = NUMBER OF TIMES TO DUPLICATE ** SPACE 2 DUP MACRO A:: SET #(1,?)-1 IFT #(2)>0 #(1,2,A::) Q:: SET #(2)-1 DUP #(1),Q:: ENDC ENDM TITL .... S Y S T E M S E R V I C E C A L L M A C R O ** MACRO: * GENERATE A CALL TO A SYSTEM SERVICE THROUGH THE DOOR * * CALLING SEQUENCE: (LABEL) * SERVICE NAME = NAME OF SYSTEM SERVICE * PBA = PARAMETER BLOCK ADDRESS (CALL DEPENDENT) * THE PBA MAY BE ANY VALID M4D12 ADDRESS OR * ANY DIRECT OR INDIRECT UNINDEXED ADDRESS ** SPACE 2 F:CFNO MACRO F:CFNO/26 F:CONN MACENT F:CONN/24 F:CREA MACENT F:CREA/22 F:DELE MACENT F:DELE/23 F:DMNT MACENT F:DMNT/29 F:MONT MACENT F:MONT/25 * I:IO MACENT I:IO/7 I:LOAD MACENT I:LOAD/30 I:LD410S MACENT I:LD410S/31 I:OVL MACENT I:OVL/35 * R:ABUF MACENT R:ABUF/13 R:AWAL MACENT R:AWAL/17 R:BGIN MACENT R:BGIN/3 R:CINT MACENT R:CINT/8+:8000 R:CTIC MACENT R:CTIC/19 R:CWAL MACENT R:CWAL/21 R:DBUG MACENT R:DBUG/0+:8000 R:END MACENT R:END/4+:8000 R:GATD MACENT R:GATD/27 R:GPRI MACENT R:GPRI/6+:8000 R:GTOD MACENT R:GTOD/16+:8000 R:ITIC MACENT R:ITIC/11 R:IWAL MACENT R:IWAL/18 R:MTIC MACENT R:MTIC/20 R:PAUS MACENT R:PAUS/12 R:RECV MACENT R:RECV/10 R:RBUF MACENT R:RBUF/14 R:SATD MACENT R:SATD/28 R:SEND MACENT R:SEND/9 R:SIG MACENT R:SIG/1 R:SPRI MACENT R:SPRI/5 R:STOD MACENT R:STOD/15+:8000 R:WAIT MACENT R:WAIT/2 R:AFB MACENT R:AFB/32+:8000 R:RFB MACENT R:RFB/33 R:EX MACENT R:EX/34 * * * X: SET #(0,'/')-1 LOAD #(0,1,X:) X: SET X:+2 Y: SET #(0,X:,30) IFT #(1,?) S: SYMATT #(1) X: SET NXBT:++PNXBT:**S:=0 X: SET INDBT:**S:<>0+X:*X://13 ENDC IFF #(1,?) X: SET Y:**:8000//-14--3//13  ENDC * WORD Y:**:00FF++:1A00++X: STRAP INSTRUCTION IFT X: IFT #(1,?) WORD #(1,) DIRECT OR INDIRECT UNINDEXED PARAMETER ENDC IFF #(1,?) WORD 0 NO PARAMETER ENDC ENDC IFF X: M4D12 #(1) M4D12 PARAMETER ENDC * IFF \Y://-15**:00000001=#(?) NOTE E,'INCORRECT NUMBER OF PARAMETERS' ENDC ENDM SPACE 3 SAVE END (0,X:,30) IFT #(1,?) S:  IFF #?>1 WORD -7 DI:SPB ENDC IFT #?>1 WORD #(2) ENDC WORD 1 DI:WBT WORD 0 READ MASK WORD 0 WRITE MASK WORD 0 POSITION MASK WORD :1F FUNCTION MASK WORD 0 RESERVED WORD 0 RESERVED V: SET 0 IFT #?>4 V: SET #(5,?)-2%11++:8000 ENDC WORD V: DI:DVS V: SET 0 IFT #?>2 V: SET #(3)%2 IFT #?>3 V: SET V:++#(4) ENDC ENDC WORD 0 DI:OPT WORD V:%8 WORD BPO:02 WORD BPO:03 WORD BPO:04 WORD BPO:05 WORD BPO:06 WORD BPO:08 WORD BPO:08  WORD BPO:09 WORD BPO:10 WORD BPO:11 IFT #?>4 BYTE #(5) DI:SID   ENDC ORG O: ENDM TITL BISYNC PICO OPTION TABLE MACRO * * BISYNC PICO OPTION TABLE MACRO * BPO:02 SET :0016 DEFAULT SYNC CHARACTER BPO:03 SET :1610 DEFAULT DLE CHARACTER BPO:04 SET :FF1F DEFAULT PAD AND ITB CHARACTERS BPO:05 SET :1703 DEFAULT ETB AND ETX CHARACTERS BPO:06 SET :0102  DEFAULT SOH AND STX CHARACTERS BPO:08 SET :0405 DEFAULT EOT AND ENQ CHARACTERS BPO:09 SET :1530  DEFAULT NAK AND ACK0 CHARACTERS BPO:10 SET :313B DEFAULT ACK1 AND WACK CHARACTERS BPO:11 SET :3C05 DEFAULT RVI AND TTD CHARACTERS * DBP:O MACRO IFF #?=16 NOTE 5,'WRONG NUMBER OF PARAMETERS' ENDC BPO:02 SET #(2) BPO:03 SET #(2)%8++#(1) BPO:04 SET #(3)%8+#(4) BPO:05 SET #(5)%8+#(6) BPO:06 SET #(7)%8+#(8) BPO:08 SET #(9)%8+#(10) BPO:09 SET #(11)%8+#(12) BPO:10 SET #(13)%8+#(14) BPO:11 SET #(15)%8+#(16)  ENDM TITL BISYNC PICO CIB MACRO * * BISYNC PICO CIB MACRO * CIB:BP MACRO LPOOL O: SET  $ TABLE: REL SHARABLE TABLE: SYSTEM C:#(1,1,3) NAM C:#(1,1,3) EXTR BP:FUN,BP:EOB CHAN CIB:  CI:PER RES 2,0 HEAD BP:#(1,3,3) CI:DIB WORD :7600 CI:PRI WORD #(2)  CI:DA WORD #(3) CI:IV WORD 0 CI:UNI WORD 0 CI:RD  WORD 0 CI:WRT WORD 0 CI:POS WORD BP:FUN CI:FUN JST R:SA12  INTERRUPT SEQUENCE COPY =$-CI:EOB-1,X JMP *$+1 WORD BP:EOB DOUBLE 0  CI:T1, CI:T2 WORD 0 CI:APR WORD 0 CI:TIB WORD 1 CI:USM  RES 3,0 RESERVED ORG O: ENDM SAVE END NI WORD 0 CI:RD  TITL S F M D . M A C - SFM DEVELOPMENT EQUATES & MACROS (93421-18-E200) TITL ..... CONTENTS ************************* *  * * SFMD.MAC * * * ************************* * * VOLUME CONTROL BLOCK EQUATES * BUFFER CONTROL WORD EQUATES * FLIST ENTRY EQUATES * FLIST ENTRY FILE INFO EQUATES ***************************************************************************** * * REVISION HISTORY: * * REV E200 - ADDED VC:FAM TO VCB EQUATES. THIS IS THE DISK FAMILY * IDENTIFIER WHICH IS COPIED FROM THE VCB TO THE DIB ON A * MOUNT. *  CWK 08/AUG/82. * ***************************************************************************** TITL ... VOLUME CONTROL BLOCK & BUFFER CONTROL WORD EQUATES * VOLID: EQU :C1 VOLUME ID FOR AUSTIN DISK FORMAT VC:BPS EQU 3 BYTES PER SECTOR VC:SPT EQU 4 SECTORS PER TRACK VC:TPC EQU 5 TRACKS PER CYLINDER VC:CPD EQU  6 CYLINDERS PER DISK VC:SID EQU 7 SPECIAL ID VC:SPA EQU 8 SECTOR PER ALLOCATION UNIT VC:FLP EQU 9 FLIST POINTER VC:FLG EQU 10 FLAGS VC:CRE EQU 11 CREATE INFORM ATION VC:CYR EQU 12 CREATE YEAR VC:CMO EQU 13 CREATE MONTH VC:CDA EQU 14 CREATE DAY VC:CHR EQU 15 CREATE HOUR VC:CMI EQU 16 CREATE MINUTE VC:CSE EQU 17 CREATE SECOND VC:CTI EQU 15 VC:MOD EQU 18 MODIFICATION INFORMATION VC:MYR EQU 19 MODIFICATION YEAR VC:MMO EQU 20 MODIFICATION MONTH VC:MDA EQU 21 MODIFICATION DAY VC:MTI EQU 22 MODIFICATION VC:MMR EQU 22 MODIFICATION HOUR VC:MMI EQU 23 MODIFICATION MINUTE VC:MSE EQU 24  MODIFICATION SECOND VC:BKP EQU 25 BACKUP INFORMATION VC:BYR EQU 26 BACKUP YEAR VC:BMO EQU 27 BACKUP MONTH VC:BDA EQU 28 BACKUP DAY VC:BTI EQU 29 BACKUP VC:BHR EQU  29 BACKUP HOUR VC:BMI EQU 30 BACKUP MINUTE VC:BSE EQU 31 BACKUP SECOND VC:FAM EQU 33 FAMILY NAME VC:NLN EQU 56 NAM LENGTH VC:NAM EQU 57 VOLUME NAME VC:TLN EQU VC:NLN TITLE LENGTH VC:TTX EQU VC:NAM TITLE TEXT * * * BUFFER CONTROL WORD EQUATES * BUF:LN EQU 512 BF:CLK EQU 0 CHAIN LINK BF:SLK EQU 1 STATIC LINK BF:SEM EQU 2 SEMAPHORE BF:DIB EQU 3 DIB ADDRESS BF:FCB EQU 4 FCB ADDRESS BF:FLG EQU 5 FLAG WORD BF:LEN EQU 6 BUFFER LENGTH BF:SEC EQU 7 SECTOR NUMBER BF:ACB EQU 9 ACB ADDR BF:T4 EQU 12 TEMP BF:T3 EQU 13 TEMP BF:T2 EQU 14 TEMP BF:T1 EQU 15 TEMP BF:BUF EQU 16 START OF DATA BUFFER * * BUFFER FLAG WORD EQUATES * BFF:NO EQU 0 NOT ON LIST BFF:WP EQU 1 WRITE PENDING BFF:AQ EQU 2 AQUIRE FLAG FOR DUMPIMG TITL ... FLIST EQUATES * FLIST ENTRY EQUATES * FL:FNO EQU 0 F NUMBER FL:FLK EQU 1 FORWARD LINK FL:BLK EQU 2  BACKWARD LINK FL:TYP EQU 3 F ENTRY TYPE FL:NED EQU 4 NUMBER OF EXTENT DESCRIPTORS FL:EXP EQU 5 EXTENT POINTER FL:LEX EQU 6 EXTENT LENGTH * * FLIST ENTRY FILE INFO EQUATES * FL:UID EQU 0 USER ID FL:GID EQU 1 GROUP ID FL:EID EQU 2 EXECUTION ID FL:TLN EQU 3 TITLE NUMBER FL:NDL EQU 4 NUMBER OF DIECTORY LINKS FL:LEN EQU 5 LENGTH IN BYTES, 2 WORDS FL:CID EQU 7 CREATION ID FL:CDA EQU 8 CREATION DATE FL:CTI EQU 11 CREATION TIME FL:MID EQU 14 MODIFICATION ID FL:MDA EQU 15 MOD DATE FL:MTI EQU 18 MOD TIME FL:AID EQU 21 LAST ACCESS ID FL:ADA EQU 22 ACCESS DATE FL:ATI EQU 25 ACCESS TIME FL:SEX EQU 28 SECONDARY EXTENT SIZE FL:RLN EQU 29 RECORD LENGTH FL:IFL EQU 49 FILE INFO LENGTH SAVE END EN EQU 5 LENGTH IN BYTES, 2 WORDS FL:CID EQU 7 CREATION ID FL:CDA EQU 8 CREATION DATE FL:CTI EQU 11 CREATION TIME FL:MID EQU 14 MODIFICATION ID F / SFMDEMO:ANL.JCL --- ASSEMBLE & LINK SFM DEMO PROGRAM (93441-7A-F100) / ALL SOURCE FILES ASSUMED TO BE ON UF / CREATES OBJECT & LISTING ON UF / CREATES BINARY & MAP ON UF / /MACRO SFMDEMO(D=SF.GEN+SF.RTX+SF.IOS+SF.IOSD+SF.SFM+SF.SFMD,L=) / /PAUSE --- PROCEED TO LINK? TYPE "C", OTHERWISE TYPE "X" /JOB /ASSIGN X4=LO /ASSIGN LO=SFMDEMO.MAP / /LINK SFMDEMO(RL=100)+SFM+IOS+RTX / /ASSIGN LO=X4 20816111213 M A C R O ** MACRO: MAIL: & MAIL:A * GENERATE A PARAMETER BLOCK FOR MAILBOX SERVICES * * CALLING SEQUENCE: LABEL MAIL:(A) BOXID,(ENVID) * MAIL:(A) LABEL,BOXID,(ENVID) (ARCHAIC) * LABEL = ADDRESS OF PARAMETER BLOCK * BOXID = MAILBOX IDENTIFIER * ENVID = ENVIRONMENT IDENTIFIER ** SPACE 2 MAIL: MACRO MAIL:A MACENT P: SET 1 L: SET #(?) IFF #(-1,?) L: SET L:-1 #(1) MAIL:: #(2),#(3) ENDC * MAIL:: MACENT IFT #(-1,?) IFT #(2,?) P: SET P:+1 ENDC WORD #(2)+0 ENVIRONMENT IDENTIFIER WORD #(1) MAILBOX IDENTIFIER IFF L:>=P: NOTE E,'INCORRECT NUMBER OF PARAMETERS' ENDC ENDC ENDM TITL .... M D B : ( A ) M A C R O ** MACRO: MDB: & MDB:A * GENERATE A MAILBOX DESCRIPTOR BLOCK * * CALLING SEQUENCE: (LABEL) MDB:(A) BOXID,(ENVID) * * BOXID = MAILBOX IDENTIFIER * ENVID = ENVIRONMENT IDENTIFIER ** SPACE 2 MDB: MACRO MACLAB MDB:A MACENT MACLAB LPOOL O: SET $ SHARABLE TABLE: TABLE: REL P: SET 1 IFT #(-1,?) NAM #(-1) ENDC #(-1) CHAN R:MBXL MD:PER - PEER LINK WORD 0 MD:FLG - FLAG WORD WORD 1 MD:MBX - MAILBOX USAGE SEMAPHORE WORD 0 MD:MSG - MESSAGE SIGNALLING SEMAPHORE DOUBLE 0 MD:A,MD:Q - 32-BIT MESSAGE RES 3,0 WORDS 6-8 RESERVED IFT #(2,?) P: SET P:+1 ENDC WORD #(2)+0 MD:ECB - ENVIRONMENT IDENTIFIER WORD #(1) MD:ID - MAILBOX IDENTIFIER WORD MD:CHK MD:CHW - MDB CHECKWORD IFF #(?)>=P: NOTE E,'INCORRECT NUMBER OF PARAMETERS' ENDC ORG O:  ENDM TITL .... S I N G L : M A C R O ** MACRO: SINGL: * GENERATE A CANNED INIT BLOCK AND TASK DESCRIPTOR BLOCK, * (USER'S ECB MUST BE CALLED R:ECB1) * * CALLING SEQUENCE: (LABEL) SINGL: EXADD,STAMT,STREG * EXADD = EXECUTION ADDRESS OF INITIAL TASK * STAMT = AMOUNT OF STAMT TO ALLOCATE * STREG = INITIAL STATUS REGISTER ** SPACE 2 SINGL: MACRO EXTR R:ECB1 P: SET 3 INIT: 0,0,0,0,R:ECB1,R:TSK1,100,4*BLKSZ: R:TSK1 TDB:A #(1),0,R:STK1,#(2),#(3) R:STK1 RES #(2),0 LOAD UAT:S IFF #(?)=P: NOTE E,'INCORRECT NUMBER OF PARAMETERS' ENDC ENDM TITL .... S D B : ( A ) M A C R O ** MACRO: SDB: & SDB:A * GENERATE A SEMAPHORE DESCRIPTOR BLOCK * * CALLING SEQUENCE: LABEL SDB:(A)  (VALUE),(FLAGS) * SDB:(A) LABEL,(VALUE),(FLAGS) (ARCHAIC) * LABEL = ADDRESS OF SEMAPHORE DESCRIPTOR BLOCK * VALUE = INITIAL VALUE OF SEMAPHORE (0 <= VALUE <= 255) * FLAGS = INITIAL VALUE OF FLAGS (NONE CURRENTLY DEFINED) ** SPACE 2 SDB: MACRO MACLAB SDB:A MACENT MACLAB P: SET 0 L: SET #(?) IFF #(-1,?) L: SET L:-1 #(1) SDB:: #(2),#(3) ENDC * SDB:: MACENT MACLAB IFT #(-1,?) LPOOL O: SET $ SHARABLE TABLE: TABLE: REL CHAN R:SL SD :PER - PEER LINK IFT #(1,?) P: SET P:+1 ENDC IFT #(2,?) P: SET P:+1 ENDC WORD #(1)+0++#(2)+0 SD:FLG - FLAGS & INITIAL VALUE NAM #(-1) #(-1) WORD #(1)+0 SD:SEM - VALUE FOR WAITING TASK WORD SD:CHK SD:CKW - SDB CHECKWORD IFF L:>=P: NOTE E,'INCORRECT NUMBER OF PARAMETERS' ENDC ORG O: ENDC ENDM TITL .... T D B : ( A ) M A C R O ** MACRO: TDB: & TDB:A * GENERATE A TASK DESCRIPTOR BLOCK * * CALLING SEQUENCE: * LABEL TDB:(A) EXADD,YSCRA,STACK,STAMT,(FLAGS),(COACT),(SEMA4) * TDB:(A) LABEL,EXADD,YSCRA,STACK,STAMT,(FLAGS),(COACT), * (SEMA4) (ARCHAIC) * * LABEL = ADDRESS OF TASK DESCRIPTOR BLOCK * EXADD = EXECUTION ADDRESS * YSCRA = AMOUNT OF Y-SCRATCH TO ALLOCATE * "*" INDICATES MULTI-TASKING TEMPLATE EXPANSION * STACK = ADDRESS OF STACK * STAMT = AMOUNT OF STACK TO ALLOCATE * FLAGS = NONE DEFINED * COACT = NUMBER OF CONCURRENT EXECUTIONS * SEMA4 = CONCURRENCY SEMAPHORE ADDRESS (MUST BE SET AT RUNTIME) ** SPACE 2 TDB: MACRO MACLAB TDB:A MACENT MACLAB P: SET 4 L: SET #(?) IFF #(-1,?) L: SET L:-1 #(1) TDB:: #(2),#(3),#(4),#(5),#(6),#(7),#(8) ENDC * TDB:: MACENT MACLAB IFT #(-1,?) LPOOL O: SET $ SHARABLE TABLE: TABLE: REL #(-1) NAM #(-1) IFT #(5,?) P: SET P:+1 ENDC CHAN R:TDBL TD:PER - PEER LINK IFF #(2,?)=1&#(2,'*') IF NO MULTI-TASKING WORD 0 TD:FLG - FLAG WORD ENDC IFT #(2,?)=1&#(2,'*') IF MULTI-TASKING WORD :8000 TD:FLG - MULTI-TASKING BIT SET ENDC A: SET 1 DEFAULT CONCURRENT EXECUTIONS IFT #(6,?) A: SET #(6) USER SPECIFIED CONCURRENT EXECUTIONS P: SET P:+1 ENDC IFT #(7,?) WORD #(7) TD:USA - USER SPECIFIED CONCURRENCY SEMAPHORE ADDRESS P: SET P:+1 ENDC IFF #(7,?) WORD $+6 TD:USA - DEFAULT CONCURRENCY SEMAPHORE ADDRESS ENDC WORD A: TD:NOX - CONCURRENT EXECUTIONS IFF #(2,?)=1&#(2,'*') IF NO MULTI-TASKING WORD #(2)+0 TD:Y - Y SCRATCHPAD ALLOCATION ENDC IFT #(2,?)=1&#(2,'*') IF MULTI-TASKING TASK #(-1) DECLARE TASK TEMPLATE #(-1) TD:Y - POINTER TO TEMPLATE LOAD R:TMPL TEMPLATE PROCESSOR ENDC WORD #(3)+0 TD:AD - STACK ADDRESS WORD #(4) TD:AMT - STACK ALLOCATION WORD #(1) TD:P - EXECUTION ADDRESS WORD A: TD:CSA - DEFAULT CONCURRENCY SEMAPHORE RES 2,0 WORDS 9-10 RESERVED WORD TD:CHK TD:CKW - TDB CHECKWORD IFF L:>=P: NOTE E,'INCORRECT NUMBER OF PARAMETERS' ENDC ORG O: ENDC ENDM TITL .... T I C K : ( A ) M A C R O ** MACRO: TICK: & TICK:A *  GENERATE A PARAMETER BLOCK FOR TICK CLOCK SERVICES * * CALLING SEQUENCE2 * LABEL TICK2(A) TIMAD,SEMA4,TICKS,(ENVID) * TICK:(A) LABEL,TIMID,SEMA4,TICKS,(ENVID) (ARCHAIC) * * LABEL = ADDRESS OF PARAMETER BDOCK * TIMID = TIMER IDENTIFIER * SEMA4 = ADDRESS OF SEMAPHORE * TICKS = TICK COUNT * ENVID = ENVIRONMENT IDENTIFIER ** SPACE 2 TICK: MACRO TICK:A MACENT P: SET 3 L: SET #(?) IFF #(-1,?) L: SET L:-1 #(1) TICK:: #(2),#(3),#(4),#(5) ENDC * TICK:: MACENT IFT #(-1,?) IFT #(4,?) P: SET P:+1 ENDC WORD #(4)+0 ENVIRONMENT IDENTIFIER WORD #(1) TIMER IDENTIFIER WORD #(2) SEMAPHORE WORD #(3) TICK COUNT IFF L:>=P: NOTE E,'INCORRECT NUMBER OF PARAMETERS' ENDC ENDC EN DM TITL .... W A L L : ( A ) M A C R O ** MACRO: WALL: & WALL:A * GENERATE A PARAMETER BLOCK FOR WALL CLOCK SERVICES * * CALLING SEQUENCE: * LABEL WALL:(A) TIMID,SEMA4,HITOD,LOTOD,(ENVID) * WALL:(A) LABEL,TIMID,SEMA4,HITOD,LOTOD,(ENVID) (ARCHAIC) * * LABEL = ADDRESS OF PARAMETER BLOCK * TIMID = TIMER IDENTIFIER * SEMA4 = ADDRESS OF SEMAPHORE * HITOD = HI-ORDER TIME OF DAY * LOTOD = LO-ORDER TIME OF DAY * ENVID = ENVIRONMENT IDENTIFIER ** SPACE 2 WALL: MACRO WALL:A MACENT P: SET 4 L: SET #(?) IFF #(-1,?) L: SET L:-1 #(1) WALL:: #(2),#(3),#(4),#(5),#(6)  ENDC * WALL:: MACENT IFT #(-1,?) IFT #(5,?) P: SET P:+1 ENDC WORD #(5)+0 ENVIRONMENT IDENTIFIER WORD #(1) TIMER IDENTIFIER WORD #(2) SEMAPHORE ADDRESS WORD #(3) HI-ORDER TIME OF DAY WORD #(4) LO-ORDER TIME OF DAY IFF L:>=P: NOTE E,'INCORRECT NUMBER OF PARAMETERS' ENDC ENDC ENDM SPACE 3 SAVE END ENVID = ENVIRONMENT IDENTIFIER ** SP TITL S F M . M A C - SFM GENERAL EQUATES & MACROS (93421-17-E200) TITL .... CONTENTS ********************** *  * * SFM.MAC * * * ********************** * * E:GFN (FILE MANAGER SERVICE) PL EQUATES * CONN:A MACRO * DELE:A MACRO * CREA:A MACRO * MONT:A MACRO * PARAM: MACRO * FCB:SA MACRO * FCB EQUATES TITL .... E:GFN PL EQUATES * (E:GFN) 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 ************************************************************ * 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 - PUN  * * #5 - LUN * ************************************************************  MACRO CONN:A #1 EQU $ PARAM: #2 PARAM: #3 D: SET 0 PARAM: D:#4 WORD 0  FNO WORD #5 ENDM TITL ... DELE:A ************************************************************ *  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 - PUN * * ONLY 1 OF #3 & #4 MUS T BE SUPPLIED * ************************************************************ MACRO DELE:A #1 EQU  $ WORD #2 PARAM: #3 D: SET 0 PARAM: D:#4 WORD 0 FNO ENDM TITL .....  CREA:A ************************************************************ * CREA:A MACRO - F:CREA PARAMETER LIST * * * * CREA:A #1,#2,#3,#4,#5,#6,#7 * *  * * #1 - LABEL * *  #2 - ADDR OF FILE NAME * * #3 - ADDR OF VOLUME NAME * *  #4 - PUN * * #5 - INITIAL EXTENT, DEFAULT=10 * *  #6 - SECONDARY EXTENT, DEFAULT=10 * * #7 - RECORD LENGTH, DEFAULT=0 * ************************************************************ 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 ************************************************************ * 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 - PUN * ************************************************************ 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 ..... PARAM: * 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 * 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 * MFM FCB EQUATES * FC:PTR EQU 3 FCB BUFFER INDEX POINTER FC:RECZ EQU 4 RECORD SIZE FC:MBKZ EQU 5 MAX. BLOCK SIZE FC:BLKZ EQU 6 BLOCK SIZE FC:BCT EQU 10 FCB BLOCK COUNT * * MFM FCB FLAG WORD EQUATES * FCF:UBUF EQU 5 USER SUPPLYING THE BUFFER FLAG FCF:EOV EQU 6 DO AN EOV FUNCTION IF WRITE CREATING A NEW VOL FCF:NTRN EQU 7 FILE IS NOT TO BE TRANSLATED FCF:EBCD EQU 8 FILE IS AN EBCDIC FILE FCF:FWRT EQU 10 FILE WRITE WRITE FLAG FCF:ULB EQU 11 MAG. FILE POSITION AT USER LABELS IF ANY FCF:RDBK EQU 12 BLOCK HAS BEEN READ NEEDS BACKSPACE FCF:EOF EQU 13 FILE HAS ENCOUNTERED AN EOF FCF:WRT EQU 14 BUFFER FILE WRITE FLAG FCF:FCB EQU 1//15 YES MARTHA, I'M AN FCB * * MFM FDB EQUATES * FD:NAM EQU 1 NAME OF DATA SET FD:BUF EQU 9 USER SUPPLIED BUFFER ADDRESS TITL .... FCB:SA ************************************************************ * FCB:SA MACRO * *  * * FOR CREATING A PERMANENT SFM FCB * *  * * CALLING SEQUENCE * * * * FCB:SA LABEL,FNO,PUN * * * ************************************************************ MACRO FCB:SA LPOOL O: SET $ TABLE: REL SHARABLE TABLE:  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 ORG O: ENDM SAVE END  TITL ANALOG/DIGITAL DIGITAL/ANALOG EQUATES AND MACROS (93420-10-E100) TITL PARAMETER LIST EQUATES * * MACRO FILE FOR IOS ANALOG/DIGITAL IO HANDLER ROUTINES * (ADA.MAC) * DRES MACRO MACLAB OFFSET SET OFFSET+#(1) #(-1) EQU OFFSET-#(1) ENDM SPACE 3 OFFSET SET 0 SPACE 1 YREL: DRES 1 -Y- SAVE AND OFFSET LOCATION A2D:CIB DRES 1 A/D D/A CONTROL INFORMATION BLOCK ADDRESS NUMSCR: EQU OFFSET NUMBER OF SCRATCH ALLOCATIONS SPACE 1 MCH: DRES 1 CHANNEL NUMBER TO START I/O SPACE 1 MODE: DRES 0 D2A MODE IGAIN: DRES 1 A2D GAIN FACTOR SPACE 1 OUTLOC: DRES 0 D2A VALUES ADDRESS NUMR: DRES 1 A2D NUMBER OF INPUTS SPACE 1 ISTAT4: DRES 0 D2A STATUS WORD ITRIG: DRES 1 A2D TRIGGER SCR:OUT EQU OFFSET SCRATCH LOCATIONS OUTPUT SPACE 1 MULT: DRES 1 A2D TRIGGER MULTIPLIER INBUF: DRES 1 A2D BUFFER ADDRESS ISTAT7: DRES 1 A2D STATUS WORD SCR:IN EQU OFFSET SCRATCH LOCATIONS FOR INPUT TITL CONTROL INFORMATION BLOCK AND ERROR EQUATES OFFSET SET 0 NEXT: DRES 1 CHAIN TO NEXT CIB WORD EOBI:SEQ DRES 2 EOB INITIALIZATION SEQUENCE EOBX:SEQ DRES 3 EOB EXIT SEQUENCE EOBX:ERR DRES 1 EOB ERROR FLAG CH:STRT DRES 1 STARTING CHANNEL NUMBER FOR BOARD(MUST BE EVEN) CH:IN DRES 1 NUMBER OF INPUT CHANNELS ON THIS BOARD CH:OUT DRES 1 NUMBER OF OUTPUT CHANNELS ON THIS BOARD DEV:ADD DRES 1 DEVI CE ADDRESS FOR THIS BOARD INT:ADD DRES 1 I/O INTERRUPT ADDRESS FOR THIS BOARD CONV: DRES 1 CONVERSION SETTING; BINARY OR TWO'S COMPLEMENT LOCK: DRES 1 BOARD INTERLOCK SEMAPHORE ADDRESS I:OWAIT DRES 1 I/O SEMAPHORE ADDRESS SPACE 1 OFFSET SET 0 PARMCNT: DRES 1 NUMBER OF PARAMETERS IN LIST ADDRBIT: DRES 1 ADDRESS MODIFIER BITS PARSTRT: EQU OFFSET STARTING LOCATION OF PARM LIST PARAMETERS SPACE 1 INTENSE EQU :C000 INTENSIFY ERRBIAS EQU 5 VALUE TO ADJUST ERROR CODES FOR FORTRAN RETURN CODES * NOTE: THE FOLLOWING ERROR CODES ARE USED INTERNALLY. 'ERROR' IS * ADDED TO CREATE THE STATUS VALUES RETURNED TO THE USER. NORMAL EQU -4 NORMAL COMPLETION EOBERR EQU -3 END OF BLOCK ERROR PARMERR EQU -2 PARAMETER ERROR INVALID EQU -1 INVALID CHANNEL NUMBER OUTPUT EQU 0 OUTPUT CHANNEL SPECIFIED INPUT EQU 1 INPUT CHANNEL SPECIFIED NOOUT EQU 2 OUTPUT CONVERSON DID NOT OCCUR RATERR EQU 3 RATE/OVERRUN ERROR RETURN CODE TITL CONTROL INFORMATION BLOCK MACRO * ADATBL MACRO. THIS MACRO IS USED TO GENERATE AN INFORMATION TABLE * FOR AN ANALOG CONTROLLER BOARD. AN ADATBL MACRO MUST BE SUPPLIED * FOR EACH BOARD. THE MACRO CALL IS: * ADATBL  A,B,C,D,E,F,G * WHERE: A=TABLE NUMBER (0 FOR FIRST BOARD, THEN 1, ETC) * B=FIRST CHANNEL NUMBER ON THIS BOARD *  C=TOTAL NUMBER OF INPUT CHANNELS ON THIS BOARD * D=TOTAL NUMBER OF OUTPUT CHANNELS ON THIS BOARD * E=DEVICE ADDRESS OF BOARD * F=AUTO I/O INTERRUPT ADDRESS * G (OPTIONAL) = THE CHARACTER STRING 'TWO' IF 2'S COMPLEMENT * CONVERSION IS REQUESTED, OR * = THE CHARACTER STRING 'BIN' IF BINARY CONVERSION * IS REQUESTED * ADATBL XMACRO NAM ADTBL:#(1) EXTR AD:EOBI,AD:EOBX ADTBL:#(1) CHAN A2D: JST *$+3 CALL EOB INITIALIZATION SEQUENCE COPY P,X SETUP RELATIVELY CIB POINTER IN X JMP *$+2 BRANCH TO EOB EXIT SEQUENCE WORD AD:EOBI ADDRESS OF EOB INITIALIZATION SEQUENCE WORD AD:EOBX ADDRESS OF EOB EXIT SEQUENCE WORD 0 END OF BLOCK ERROR FLAG WORD #(2)+0 FIRST CHANNEL ON THIS BOARD WORD #(3)+0 TOTAL INPUT CHANNELS WORD #(4)+0 TOTAL OUTPUT CHANNELS WORD #(5)+0//3 DEVICE ADDRESS WORD #(6)+0 INTERRUPT LOCATION IFT #(?)<6 NOTE E,'TOO FEW PARAMETERS' ENDC IFT #(?)>7 NOTE E,'TOO MANY PARAMETERS' ENDC IFT #(?)=6 WORD 3 2'S COMP CONVERSION ENDC IFT #(?)=7 IFT #(7,'TWO')=1 WORD 3 2'S COMP CONVERSION ENDC IFT #(7,'BIN')=1 WORD 0 BINARY CONVERSION ENDC IFF #(7,'TWO')=1 IFF  #(7,'BIN')=1 WORD 3 2'S COMP CONVERSION NOTE E,'INVALID 7TH PARAM' ENDC ENDC ENDC WORD 1 BOARD INTERLOCK SEMAPHORE WORD 0 AUTO I/O EOB SEMAPHORE ENDM TITL PARAMETER BLOCK INFORMATION MACROS * * ADDRESS: GETS THE ADDRESS OF A FORTRAN PARAMETER AND PUTS IT INTO * A USER BLOCK * ADDRESS: XMACRO MACLAB SPACE 1 #(-1) COPY =#(1)-NUMSCR:,A GET PARAMETER NUMBER IN FORTRAN BLOCK JSK ADRPARM: EVALUATE IT COPY A,#(1)(Y) PUT IT IN USER BLOCK ENDM SPACE 3 * * CONTENT: GETS CONTENTS OF A FORTRAN PARAMETER AND PUTS IT INTO * A USER BLOCK * CONTENT: XMACRO MACLAB SPACE 1 #(-1) COPY =#(1)-NUMSCR:,A GET PARAMETER NUMBER IN FORTRAN BLOCK JSK ADRPARM: EVALUATE IT EXCH A,X SAVE -X- COPY 0(X),X GET CONTENTS COPY X,#(1)(Y) PUT IT IN USER BLOC K EXCH X,A RESTORE -X- ENDM SAVE END LOCK * ADDRESS: XMACRO MACLAB SPACE 1 #(-1) COPY =#(1)-NUMSCR:,A GET PARAMETER NUMBER IN FORTRAN BLOCK JSK ADRPARM: EVALUATE IT COPY A,#(1)(Y) PUT IT IN USER BLOCK ENDM SPACE 3 * * CONTENT: GETS CONTENTS OF A FORTRAN PARAMETER AND PUTS IT INTO * A USER BLOCK * CONTENT: XMACRO MACLAB SPACE 1 #(-1) COPY =#(1)-NUMSCR:,A GET PARAMETER NUMBER IN FORTRAN BLOCK JSK ADRPARM: EVALUATE IT EXCH A,X SAVE -X- COPY 0(X),X GET CONTENTS COPY X,#(1)(Y) PUT IT IN USER BLOC TITL SCOUT MULTI-CHANNEL SERIAL I/O MACROS (93723-60-F100) TITL SCOUT MCS DIB ****************************************************************************** * * REVISION HISTORY * * REV F100 - START OF HISTORY * ****************************************************************************** DIB:MCTV MACRO TV001 *** CRT DIB MACRO *** DIB:MCTY MACENT TY002  *** TELETYPE PRINTER *** DIB:MCTK MACENT TK003 *** TELETYPE KEYBOARD *** DIB:MCTR MACENT TR004 *** TELETYPE READER *** DIB:MCTP MACENT TP005 *** TELETYPE PUNCH *** DIB:MCLP MACENT LP006 *** LINE PRINTER ***  LPOOL O: SET $ TABLE: REL SHARABLE TABLE: SYSTEM DEV: SET '##(0,1,2)' TYPE:#(1,3,4) SYMVAL #(0,5,5) GET TYPE OF DEVICE CH:#(1,3,4) SYMVAL #(1,4,4)+4 FLG: BIT:SET DIF:NT,DIF:FC SPB:  SET 0 DI:SPB - TIMER SHIFT PER BYTE WBT: SET -1 DSW1: BIT:SET FA:,UF:,CD: DSW2: BIT:SET FA:,UF:,WP: DSW4: BIT:SET WF:,TF:,SC:,OP:,CL:,WC: CPL: SET 80 BMI: SET :0006 BMO: SET :0023 EDT:  SET :08 EOL: SET 1 TOF: SET 1 ELI: SET 1 PU: SET 1 BOF: SET 0 BOTTOM OF FORMS LPP: SET 0 LINES PER PAGE MASK: SET :3800 STATUS ERROR MASK IFF DEV:--'LP' FLG:  BIT:SET DIF:FC SPB: SET -3 TIMER SHIFT PER BYTE IFT #(9,?) SPB: SET #(9)  ENDC WBT: SET 4*8 TIMER BASE TIME DSW1: SET 0 READ DSW2: BIT:SET FA:,UF: WRITE FUNCTIONS DSW4: BIT:SET OP:,CL:,WF:,SC:,TF: LINE PRINTER FUNCTIONS CPL: SET 80 IFT #(6,?) CPL:  SET #(6) ENDC BOF: SET 3 BOTTOM OF FORMS COUNT LPP: SET 57 LINES PER PAGE  IFT #(7,?) LPP: SET #(7) ENDC BMI: SET 0 CONTROL WORD FOR INPUT BMO: SET  :0023 CONTROL WORD FOR OUTPUT ENDC IFT DEV:--'LP' IFT DEV:--'TV' CPL: SET  72 EDT: SET '_' IFF DEV:--'TP' FLG: SET 0 WBT: SET 10*8 BMI: SET 0 DSW1: SET 0 DSW2: BIT:SET FA:,UF:,FB: PAPER TAPE PUNCH DSW4: BIT:SET WF:,PL:,OP:,CL: CPL: SET :7FFF TOF:  SET 0 EDT: SET 0 ELI: SET 0 ENDC IFF DEV:--'TR' FLG: SET 0 WBT: SET 10*8 DSW1: BIT:SET FA:,UF:,FB:,CD: PAPER TAPE READER DSW2: BIT:SET WP: DSW4: BIT:SET OP:,CL:,WC: CPL: SET :7FFF EOL: SET 0 TOF: SET 0 ELI: SET 0 BMI: SET :0026 BMO: SET   0 EDT: SET '_' PU: SET 0 ENDC ENDC ENDC WDLEN: SYMVAL #(3)  WORD LENGTH GIVEN ? IFT WDLEN:=0 WDLEN2: SET 3%2 DEFAULT IS 8 BITS IFF DEV:--'TV' WDLEN2: SET 2%2 ENDC ENDC IFT WDLEN:<>0 SKIP ALL IF ALREADY DEFAULTED IFT WDLEN:=5 WDLEN2: SET 0 AS DEFINED IN HARWARE SPEC. ENDC IFT WDLEN:=6 WDLEN2: SET 1%2  " " " ENDC IFT WDLEN:=7 WDLEN2: SET 2%2 " " "  ENDC IFT WDLEN:=8 WDLEN2: SET 3%2 " " " ENDC IFT WDLEN:<5 WDLEN2: SET 0 DEFAULT TO FIVE NOTE W,'INVALID CHAR.LENGTH,DEFAULTS TO 5' ENDC IFT WDLEN:>8 WDLEN2: SET 3%2 DEFAULTS TO EIGHT NOTE W,'INVALID CHAR.LENGTH,DEFAULTS TO 8' ENDC  ENDC STPBIT1: SET '##(4,1,2)' STOP BIT GIVEN ? 1.5 MAYBE ? STPBIT2: SET '##(4,2,3)' " " " " " PRTYBI:: SET '##(5)' EVEN OR ODD PARITY ? IF ANY. IFT STPBIT1:=0 NULL PARAMETER ? STPBIT: SET  2%6 1 STOP BITS DEFAULT ENDC IFT STPBIT1:<>0 SOME PARAMETER GIVEN (1.5 ?) IFT STPBIT1:='1.' IFT STPBIT2:='.5' IF 1.5 THEN VALUE IS 1 STPBIT: SET 1%6 ENDC ENDC IFF STPBIT2:='.5' NOT 1.5 ? STPBIT1: SET #(4) NOT IN ASCII IFT STPBIT1:=1 1? STPBIT: SET 2%6 VALUE IS 2 ENDC IFT STPBIT1:=2 2? STPBIT: SET 3%6 VALUE 3 ENDC IFT STPBIT1:>2 >2? NOTE E,'INVALID STOP BITS PARAMETER' ENDC ENDC ENDC IFT PRTYBI::=0 IF PARITY IS DEFAULTED.. PRTYBIT: SET 0 IFT WDLEN:=0 IF WORD LENGTH IS ALSO DEFAULTED IFF DEV:--'TV' AND DEVICE IS 'TV' PRTYBIT: SET 3%4 DEFAULT TO 'EVEN' PARITY FOR 'TV' MASK: SET :3000 DISREGARD PARITY ERROR IN THIS CASE ENDC ENDC ENDC IFT PRTYBI::='E' PRTYBIT: SET 3%4 'E' MEANS ENABLE PARITY (EVEN) ENDC IFT PRTYBI::='O' 'O' MEANS ENABLE PARITY (ODD) PRTYBIT: SET 1%4 ENDC * NAM D:#(1) D:#(1) CHAN D:#(1,1,3) DI:PER WORD FLG: DI:FLG - FLAG WORD WORD C:#(1) DI:CIB - CIB ADDRESS WORD 0  DI:FCB - FCB ADDRESS IFT #(2,?) IS THERE A DEVICE NAME ? BYTE '##(2)' DI:NAME - DEVICE NAME 4 ASCII CHAR.S ENDC IFF #(2,?) IS IT NULL? BYTE '##(0,1,4)' DI:NAM - DEVICE NAME 4 ASCII CHAR.S ENDC RES 2,0 WORD SPB: DI:SPB - TIMER SHIFT PER BYTE WORD WBT: DI:WBT - TIMER BASE TIME WORD DSW1: DI:DSW(1) READ WORD DSW2: DI:DSW(2) WRITE WORD 0 DI:DSW(3) POSITION WORD DSW4: DI:DSW(4) FUNCTION RES 2,0   WORD CPL: DI:CPL - CHAR.S PER LINE BYTE BOF:,LPP: DI:LPP - BOTTOM OF FORMS CNT/LINES PER PAGE WORD BMI: DI:BMI - BRANCH/MODE (INPUT) WORD BMO: DI:BMO - BRANCH/MODE (OUTPUT)  IFT DEV:--'LP' IFT EOL:<>0 EXTR TYEOL: WORD TYEOL: DI:EOL - POINTER TO END OF SEQUENCE ENDC IFT EOL:=0 WORD 0 ENDC IFT TOF:<>0 EXTR TYTOF:  WORD TYTOF: ENDC IFT TOF:=0 WORD 0 ENDC WORD MASK: DI:ERM - ERROR MASK FOR STATUS WORD 0 DI:LC - LINE COUNTER WORD EDT: DI:EDT - EDIT CHARACTER IFT ELI:<>0 EXTR TYELI: WORD TYELI: ENDC IFT ELI:=0 WORD 0 ENDC WORD #(1)BF: DI:BUF - POINTER TO 2 WORD INTERNAL BUFFER IFT PU:<>0 WORD TYEOL: DI:EOL - POINTER TO END OF LINE SEQUENCE ENDC IFT PU:=0 WORD 0 DI:EOL - NULL POINTER TO EOL SEQ. ENDC ENDC IFF DEV:--'LP' IFT #(8,?) NEED LINE FEED?  EXTR DPEOL: YES, STORE POINTER WORD DPEOL: AUTOMATIC LINE FEED ENDC IFF #(8,?) EXTR LPEOL: WORD LPEOL: NO AUTOMATIC LINE FEED ENDC EXTR LPTOF:,LPPUF: WORD LPTOF: TOP OF FORM SEQUENCE WORD :3800 DI:ERM - ERROR MASK FOR STATUS  WORD -LPP: DI:LC - LINE COUNTER WORD 0 DI:EDT - EDIT CHARACTER WORD 0  DI:ELI - ADDR.OF EOL SEQ. ON INPUT WORD #(1)BF: DI:BUF - POINTER TO 2 WORD INTERNAL BUFFER WORD LPPUF: DI:PU - POINTER TO POWER UP SEQUENCE ENDC IFT TYPE:#(1,3,4)<=3 AUTOECHO? WORD  CH:#(1,3,4)%12++9 DI:CTRL - AUTOECHO IN BOARD ENDC IFT TYPE:#(1,3,4)>=4 NO AUTOECHO ?  WORD 0 ENDC WORD STPBIT:++PRTYBIT:++WDLEN2:++:2 DI:MODE - MODE CONTROL WORD TYPE:#(1,3,4) DI:TYPE - DEVICE TYPE OPT: SYMVAL OPT:MC#(1,3,4) IFT OPT:=0 WORD 0 ENDC IFT OPT:<>0 WORD OPT:MC#(1,3,4) ENDC WORD 0 DI:UTBL - USER'S SPECIAL CHAR.TABLE POINTER #(1)BF: RES 2,0 TWO WORD INTERNAL BUFFER ORG O: ENDM TITL TITL OPTIONAL SPECIAL CHARACTER TABLE GENARATING MACRO SPACE 1 * THIS MACRO WILL ALLOW THE USER TO GENERATE A SPECIAL CHARATER * TABLE OF 256 CHARATERS. THERE ARE 3 WAYS TO USE THIS MACRO: * * 1) OPT:MC MCXX,PAR,PAR,PAR,...,ETC. (UP TO 12 PARAMETERS) * WHERE XX=DIB IDENTIFICATION * PAR=HEX.VALUE OF THE CHARACTER * * 2) OPT:MC *MCXX,PAR,PAR,...,ETC. (UP TO 12 PARAMETERS) * WHERE * INDICATES A CONTINUATION OF THE TABLE * IDENTIFIED BY THE DIB XX * * 3) OPT:MC * (NO PARAMETERS AT ALL) TO INDICATE THE END OF THE TABLE * THIS FORM OF THE MACRO  MUST FOLLOW THE LAST MACRO * USING THE * FOR ALL DIB TABLES. * * TO SUMMARIZE: * THE OPT:MC MACRO WITH PARAMETERS (MAX.12) AND NO * * MUST ALWAYS BE USED TO BEGIN A SPECIAL CHARACTER TABLE FOR ANY DIB * IF MORE THAN 12 CHARACTERS ARE TO BE REQUIRED THEN THE SAME MACRO * WITH AN * IN THE IDENTIFYING PARAMETER MUST BE USED. AS MANY AS * NEEDED OF THESE MACRO MAY BE USED, WITH THE ONLY CONDITION THAT * FOLLOWING THE LAST CONTINUATION MACRO AN ENDING MACRO WITH NO * * OR PARAMETERS AT ALL BE USED. * * THE REASONING BEHIND TAKING THIS APPROACH IS THE MANNER IN WHICH * THE TABLE IS BUILT AND THE NEED TO RESTORE AT THE END OF THE * TABLE, THE LOCATION COUNTER OF THE BLANK SEGMENT. * * EACH TABLE WILL CONTAIN THE TOTAL NUMBER OF CHARACTERS FOR THAT * TABLE IN THE FIRST WORD OF THE TABLE * * IN ORDER TO ACCOMPLISH THIS RESULT CERTAIN CHECKS WERE INCLUDED * IN THE MACRO WHICH ITS RESULT WILL VARY FROM THE 1ST AND 2ND PASS * OF THE MACRO ASSEMBLER. THE MAIN CODE TO BE CONCERNED IS THAT WHICH * TAKES CARE OF ADDING THE TOTAL COUNT OF CHARACTERS EACH TIME THE * MACRO USING THE * IN THE 1ST IDENTIFYING PARAMETER IS FOUND. TITL TITL SPACE 2 OPT:MC MACRO CNT: SET #(?)  IFT CNT:=0 ORG O: ENDC IFT CNT:<>0 CNT: SET #(?)-1 IFF #(1,'*') LPOOL O: SET $ TABLE: REL SHARABLE TABLE: SYSTEM TRICK: SYMVAL M:#(1,3,4)  IFT TRICK:=0 M:#(1,3,4) SET 0 ENDC OPT:MC#(1,3,4) WORD M:#(1,3,4)+CNT: ENDC IFT #(1,'*') M:#(1,4,5) SET M:#(1,4,5)+CNT: ENDC CNT: SET $+CNT: ENDC OPT:GEN MACENT IFT $:F ADDR2: SET :F0&ADDR: LETS ASSUME THER  E MIGHT SOMETHING IFT ADDR:<>ADDR2: IN LOWER NIBBLE NOTE E,'INVALID DEVICE ADDRESS' ENDC  ENDC IFT ADDR:=0 ADDR: SET MCSDA: DEFAULT DEVICE ADDRESS ENDC CHAN: SYMVAL #(1,4,4)  RETRIEVE CHANNEL NO. IFT CHAN:>=4 NOTE W,'CHAN.NO.MUST BE 0-3' ENDC WORD CHAN:%1+ADDR: CI:DA - DEVICE ADDRESS + CHANNEL NO. VECT: SYMVAL #(3) GET INTERRUPT ADDR. VALUE IFT VECT:=0 VECT: SET MCSIV: DEFAULT INTERRUPT VECTOR ADDRESS ENDC IFT VECT:>:1FFF MUST BE BELOW 8K OF MEMORY NOTE E,'INTERRUPT VECTOR ADDRESS IS TOO LARGE' ENDC WORD VECT: CI:IV  - INTERRUPT VECTOR WORD 0 CI:UNI - RESERVED WORD MC:RD CI:RD - ENTRY POINT TO READ WORD MC:WRT CI:WRT - ENTRY POINT TO WRITE WORD 0 CI:POS - ENTRY POINT TO POSITION WORD MC:FUN CI:FUN - ENTRY POINT TO FUNCTION JST R:SA12 DISABLE EOB INTERRUPTS  SIN 4 COPY =:20,X DISABLE I/O FUNCTION JMP !LOW  DO REST OF EOB WORD 0 CI:T1 - TEMP CELL WORD 0 CI:T2 - TEMP CELL  WORD 0 CI:APR - PRIORITY OF ACTIVITY WORD 0 CI:TIB - TIB ADDWORDS WORD 1 CI:USM - CONTROLLER USAGE SEMAPHORE WORD 0 CI:TIM - TIMER WORD 0  CI:CSM - COMPLETION SEMAPHORE WORD 0 CI:CFL - COMPLETION FLAG !LOW EXTR I:EOB WORD  CHAN:%1++ADDR:++:2209 OUT INSTRUCTION (X-REG) COPY =$-CI:EOB2-1,X CIB ADDRESS JMP *$+1 WORD I:EOB ORG O: ENDM END WORD 0 CI:TIB - TIB ADDWORDS WORD / RTXDEMO:ANL --- ASSEMBLE & LINK RTXDEMO (93411-70-F200) / ALL SOURCE FILES ASSUMED TO BE ON UF /  CREATES OBJECT & LISTING ON UF / CREATES BINARY & MAP ON UF / /MACRO RTXDEMO(D=SF.GEN+SF.RTX,L=) / /PAUSE --- PROCEED TO LINK? TYPE "C", OTHERWISE TYPE "X" /JOB /ASSIGN X4 LO /ASSIGN LO RTXDEMO.MAP / /LINK RTXDEMO(RL=100)+RTX / /ASSIGN LO X4 820816111213820816111213820816111213/ SFMDEMO:ANL.JCL --- ASSEMBLE & LINK SFM DEMO PROGRAM (93441-7A-F200) / ALL SOURCE FILES ASSUMED TO BE ON UF / CREATES OBJECT & LISTING ON UF / CREATES BINARY & MAP ON UF / /MACRO SFMDEMO(D=SF.GEN+SF.RTX+SF.IOS+SF.IOSD+SF.SFM+SF.SFMD,L=) / /PAUSE --- PROCEED TO LINK? TYPE "C", OTHERWISE TYPE "X" /JOB /ASSIGN X4=LO /ASSIGN LO=SFMDEMO.MAP / /LINK SFMDEMO(RL=100)+SFM+IOS+RTX / /ASSIGN LO=X4 20816111213 SHARABLE TABLE: SYSTEM D:#(1) NAM D:#(1) CHAN BP:#(1,3,3) WORD 0 WORD C:BP#(1,3,3)  DI:CIB WORD 0 DI:FCB BYTE '##(1)' DI:NAM WORD 0 DI:DN W! ORD 0 DI:DS IFF #?>1 WORD -7 DI:SPB ENDC IFT #?>1 WORD #(2) ENDC WORD 1 DI:WBT WORD 0 READ MASK WORD 0  WRITE MASK WORD 0 POSITION MASK WORD :1F FUNCTION MASK WORD 0  RESERVED WORD 0 RESERVED V: SET 0 IFT #?>4 V: SET #(5,?)-2%11++:8000  ENDC WORD V: DI:DVS V: SET 0 IFT #?>2 V: SET #(3)%2 IFT  #?>3 V: SET V:++#(4) ENDC ENDC WORD 0 DI:OPT WORD V:%8 WORD BPO:02 WORD BPO:03 WORD BPO:04 WORD BPO:05 WORD BPO:06 WORD BPO:08  WORD BPO:08 WORD BPO:09 WORD BPO:10 WORD BPO:11 IFT #?>4 BYTE #(5) DI:SID ENDC ORG O: ENDM TITL BISYNC PICO OPTION TABLE MACRO * * BISYNC PICO OPTION TABLE MACRO * BPO:02 SET :0016 DEFAULT SYNC CHARACTER BPO:03 SET :1610 DEFAULT DLE CHARACTER BPO:04 SET :FF1F DEFAULT PAD AND ITB CHARACTERS BPO:05 SET :1703 DEFAULT ETB AND ETX CHARACTERS BPO:06 SET :0102 DEFAULT SOH AND STX CHARACTERS BPO:08 SET :0405 DEFAULT EOT AND ENQ CHARACTERS BPO:09 SET :1530 DEFAULT NAK AND ACK0 CHARACTERS BPO:10 SET :313B DEFAULT ACK1 AND WACK CHARACTERS BPO:11  SET :3C05 DEFAULT RVI AND TTD CHARACTERS * DBP:O MACRO IFF #?=16 NOTE 5,'WRONG NUMBER OF PARAMETERS' ENDC BPO:02 SET #(2) BPO:03 SET #(2)%8++#(1) BPO:04 SET #(3)%8+#(4) BPO:05 SET #(5)%8+#(6) BPO:06 SET #(7)%8+#(8) BPO:08 SET #(9)%8+#(10) BPO:09 SET #(11)%8+#(12) BPO:10 SET #(13)%8+#(14) BPO:11  SET #(15)%8+#(16) ENDM TITL BISYNC PICO CIB MACRO * * BISYNC PICO CIB MACRO * CIB:BP MACRO  LPOOL O: SET $ TABLE: REL SHARABLE TABLE: SYSTEM C:#(1,1,3) NAM C:#(1,1,3) EXTR BP:FUN,BP:EOB CHAN CIB: CI:PER RES 2,0 HEAD BP:#(1,3,3) CI:DIB WORD :7600 CI:PRI WORD #(2) CI:DA WORD #(3) CI:IV WORD 0 CI:UNI WORD 0  CI:RD WORD 0 CI:WRT WORD 0 CI:POS WORD BP:FUN CI:FUN JST R:SA12 INTERRUPT SEQUENCE COPY =$-CI:EOB-1,X JMP *$+1 WORD BP:EOB  DOUBLE 0 CI:T1, CI:T2 WORD 0 CI:APR WORD 0 CI:TIB WORD  1 CI:USM RES 3,0 RESERVED ORG O: ENDM SAVE END NI WORD 0  CI:RD WORD 0 CI:WRT WORD 0 CI:POS WORD BP:FUN CI:FUN JST R:SA12 INTERRUPT SEQUENCE COPY =$-CI:EOB-1,X JMP *$+1 WORD BP:EOB " IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII# IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIe820816111213820816111213820823145727e&L820816111213820816111213820907185409$ e 820816111213820816111213820816111213e820816111213820816111213820816111213820816111213820816111213820816111213e u8106031639567581060316395850820816160314e8208231454367582082314543825820830155818e`J8101151510410081011515104800820816160344d e% 8208231455142582082314551575820830155848 eq8103021417515081030214175375820816160358 e >8208061025000082080610250575820816160409 e(N8103021426150081030214262000820816160422 e878109211522530081092115225725820816160432eT`8209071417140082090714172950820907185442e8103021426490081030214265125820816160506& e :8208121033202582081210332250820816160512e )8103021413045081030214130650820816160519e !8111021657490081110216575150820816160907e98110281716127581102817161725820830155910e8208231133532582082311335850820823113434' ( ) . RTXDEMO ASMRTXDEMO JCLSFMDEMO ASM SFMDEMO JCL GEN MAC RTX MAC RTXD MAC IOS MACIOSD MACSFM MACSFMD MACADA MACBSC MACMCSDIBCIB MACSFMDEMO JCL TITL R T X D . M A C - RTX DEVELOPMENT EQUATES & MACROS (93421-16-E100) * * C O N T E N T S * ******************* *  * * RTXD.MAC * * * ******************* * * TDB EQUATES * ACB " * ECB " * RTX EXCEPTION VALUES * MISC. EQUATES * DEFBP: DEFINE BASE PAGE MACRO * CHKBP: CHECK " " " * RTX BASE PAGE DEFINITIONS * PUSH: PUSH REGISTERS ONTO STACK MACRO * POP: * POP REGISTERS FROM STACK MACRO * MOM: HA HA * COPY: COPY WITH K-REL ADDRESSING MACRO * EXCH:  EXCHANGE WITH K-REL ADDRESSING MACOR * ASTAK: ALLOCATE TEMP CELLS ON STACK MACRO * RSTAK: RELEASE TEMP CELLS TO STACK MACRO * PUSH:R STORE REGISTER ON STACK MACRO * POP:R REMOVE REGISTER FROM STACK MACRO *  PUSH:E EXCHANGE STACK POINTER & INDEX REGISTER MACRO * PUSH:C CHECK FOR INDEX REGISTER USAGE MACRO *  COPY:B * R:4REG DETERMINE IF AN ARGUMENT IS A 4REG * CHK: CHECK BLOCK FOR CORRECT TYPE * SYS:A GENERATE CANNED ACTIVITY ACB & STACK MACRO ************************************************************ TITL * TASK DESCRIPTOR BLOCK EQUATES * TD:PER EQU 0 PEER LINK TD:FLG EQU 1 FLAGS TDF:TMPL EQU 15 TEMPLATE EXPANSION BIT TD:USA EQU 2 USAGE COUNT 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:AWL EQU 10 ACB WAIT LIST 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:MWL EQU 14 EMP WAIT LIST ED:MRO EQU 13 MAP REGISTER OFFSET (48) ED:EVT EQU 16 EXCEPTION VECTOR 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 ED:UMPA EQU 41 USER DEFINED EMP ADDRESS + ED:MPL EQU 42 USER DEFINED EMP LENGTH * * 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:TMPL EQU 13+EX:RTX ILLEGAL TEMPLATE OR EXPANSION ERROR 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 * STKMN: EQU 20 MINIMUM STACK TO BEGIN A TASK. SEMAX: EQU :FF 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 * * 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 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 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 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:RSRV RESERVE FOR 64 BIT I/O MODULE 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 DEFBP: 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 DEFBP: R:ECBH ECB LIST HEAD 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 NUMBER 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 S. IN 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:Y=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 EXTR R:TABL 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 LPOOL O: SET $ TABLE: REL SHARABLE TABLE: * ACTIVITY STACK #4 EQU $ STACK LIMIT RES SKAMT:-CBL: RESERVED FOR 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 ORG O: ENDM SPACE 3 SAVE END 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 ORG O: ENDM SPACE 3 SAVE0  TITL I O S . M A C - IOS GENERAL EQUATES & MACROS (93420-1B-F100) TITL ..... CONTENTS ******************* *  * * IOS.MAC * * * ******************* * * UAT:AA MACRO * UAT:EE MACRO * UAT:ZZ MACRO *  BUF:R MACRO * IOB:A MACRO * IOB EQUATES * IOU: MACRO * IOR: MACRO * I/O ERROR BLOCK EQUATES * I:LOAD PARAMETER BLOCK (LOAD:) EQUATES * LOAD: MACRO * OVL:A MACRO * OVL: MACRO TITL ... UAT:AA UAT:EE UAT:ZZ UA:CHK EQU :F09E * UAT:AA LABEL START UNIT ASSIGNMENT TABLE * * UAT:EE LUN,ADDRESS UAT ENTRY * * UAT:ZZ END OF UAT * * LABEL LABEL TO ASSOCIATED WITH UAT * LUN  LOGICAL UNIT NAME * ADDRESS ADDRESS OF DIB OR FCB * * UAT:AA MACRO MACLAB LPOOL O: SET $ SHARABLE TABLE: TABLE: REL LOAD I:IO WORD UA:CHK #1 WORD UAT:ND-$-4%-1 RES 3,0 UAT:NV SET 0 ENDM * UAT:EE MACRO WORD #1 S: SYMATT #2 IFT S:&UNDBT: EXTR #2 ENDC WORD #2 UAT:NV SET UAT:NV+1 ENDM * UAT:ZZ MACRO S: SYMATT #1 IFF S:&NULL: IFT #(1,'FORTRAN')>0 SNAM UAT:ND ENDC  ENDC UAT:ND EQU $ IFF S:&NULL: IFT #(1,'FORTRAN')>0 RES UAT:NV*2,0 ENDC  ENDC ORG O: ENDM TITL .... BUF:R MACRO ************************************************************ * BUFFER POOL GENERATION MACROS + * * * CALLING SEQUENCE * * BUF:R #1 * *  * * #1 - NUMBER OF BUFFERS * ************************************************************ * BUF:LN EQU 512 * * BUF:R - GENERATE BUFFER POOL * BUF:R MACRO LPOOL O: SET $ TABLE: REL SHARABLE TABLE: LOAD FM:SFM NAM BUF:N BUF:N EQU #(1) P: SET BUF:N BUF:LOOP MACENT IFT P: CHAN BUF: CHAIN LINK CHAN BUF:: STATIC LINK RES 4,0 WORD BUF:LN LENGTH RES 2,0 SECTOR RES 7,0 RES BUF:LN/2,0 BUFFER LENGTH P: SET P:-1 BUF:LOOP ENDC IFF P: ORG O: P: SET 1 ENDC ENDM TITL .... IOB:A MACRO * 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 * WR: 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 * FS: EQU 8 FORMATTED STREAM * DS: EQU 12 DIRECT STREAM * * BCT REQUESTED BYTE COUNT * BUF I/O BUFFER ADDRESS * CGI ADDRESS OF CURRENT FILE INDEX OR ZERO * OPO OPTIONAL MODE OF OPERATION * SB: EQU 11 START IN SECOND BYTE 1 OF BUFFER * ER: EQU 12 DON'T CALL DOIO ERROR ROUTINE, GO TO USER * * TITL 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 CFI 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 * BISYNC PICO ONLY IO:HED EQU IO:BUF FIRST BCB ON CHAIN IO:LST EQU IO:ACT  LAST BCB PROCESSED * * 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 * UNKNOWN OPEN: EQU 4 OPEN CLOSE: EQU 5 CLOSE * ASYNCH MUX ONLY SBU: EQU 4 SEND BUFFER SNL: EQU 6 SEND END-OF-LINE SEQUENCE ('SEND NEW LINE') SBK: EQU 5 SEND 'BREAK' SCC: EQU 7 SEND CONTROL CHARACTER WMR: EQU :C WRITE MODEM REGISTER WOT: EQU :D WRITE OPTION TABLE WSC: EQU  :E WRITE SPECIAL CHAR TABLE * BISYNC PICO ONLY IR: EQU 8 IMMEDIATE RETURN ON OPEN IR:V EQU  1%IR: BIT MASK * * * 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 CD: EQU :2 SCOUT MULTI-CHANNEL SERIAL CHAR. DETECT (EOB) 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 * MAGTAPE ONLY SBF: EQU 8 SKIP BLOCKS FORWARD SBR: EQU 9 SKIP BLOCKS REVERSE SKF: EQU 10 SKIP FILES FORWARD * * 2 SCOUT MULTI-CHANNEL SERIAL HANDLER ONLY * WC: EQU 14 TRANSFER USER'S SPEC. TABLE PTR. TO DIB * * 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 * MAGTAPE ONLY RWD: EQU 8 REWIND OFL: EQU 9 OFF-LINE EBL: EQU 10 ERASE BLOCK EFM: EQU 11 ERASE FILE MARK EOV: EQU 12 DO END OF VOLUME UBF: EQU 13 USER SUPPLIED BUFFER FUNCTION MOD. * * FOR OPEN BL: EQU 1 BLOCK I/O * * FOR ASYNCH MUX * ROT: EQU 1 READ OPTION TABLE CM: EQU 1 SPECIAL CHARACTER MATCH OPTION (ADD TO RBF:) RMR: EQU 2 READ MODEM REGISTER RM: EQU 2 RANGE MATCH OPTION (ADD TO RBF:) RBF: EQU 4 READ BUFFER AE: EQU 8 FIRMWARE AUTO ECHO OPTION (ADD TO RBF:) * TO: EQU 7 BIT NUMBER IN IO:FC TO INHIBIT HARDWARE WRITE ON WOT, WSC ID: EQU 7 BIT NUMBER IN IO:FC TO INHIBIT DATA TRANSFER ON RBF * * BISYNC PICO ONLY DOT: EQU 0 DUMP OPTION TABLE OPN: EQU 1 OPEN CLS: EQU 2 CLOSE EXU: EQU 3 EXECUTE REQUEST SAA: EQU 4  SET AUTO ANSWER * * * SOFTWARE STATUS * IOERR: EQU 15 ERROR CAUSED I/O TERMINATION * BISYNC PICO ONLY IOCOM: EQU 14 OPERATION COMPLETION FLAG * 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 * ASYNCH MUX ONLY RANGM: EQU 8 RANGE MATCH OCCURRED ON RECEIVE LBK: EQU 7 TRANSMIT STATUS ONLY, LINE BREAK SEEN BY RECV HALF CHARM: EQU 7 CHARACTER MATCH OCCURRED ON RECEIVE * * 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 TITL .... IOU: IOR: MACROS * MACROS FOR IOS4 ERROR CODES * IOR: FOR RECOVERABLE * IOU: FOR UNRECOVERABLE * MACRO IOU: #1 EQU 1%6+#2 ENDM MACRO IOR: #1  EQU #2 ENDM * * 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 IOR: MNTAPE:,11 MOUNT NEXT VOLUME (MAG TAPE ONLY) * 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 I3 OU: 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: LDSR:,29 DSR NOT UP (ASYNCH MUX ONLY) IOU: BRKDT:,30 'BREAK' DETECTED ON RECEIVE (ASYNCH MUX ONLY) IOU:  PE:,31 PARITY ERROR ON RECEIVE (ASYNCH MUX ONLY) IOU: OE:,32 OVERRUN ERROR ON RECEIVE (ASYNCH MUX ONLY) IOU: UBTSM:,33  USER'S BLOCK TO SMALL IOU: ONOOR:,34 OVERLAY NUMBER OUT OF RANGE IOU: DVNAL:,35 DEVICE NOT ALLOCATED TO USER (BISYNC PICO) IOU: DVNOP:,36 DEVICE NOT OPENED (BISYNC PICO) IOU: ILLCM:,37 ILLEGAL COMMAND (BISYNC PICO) IOU: DVINO:,38 DEVICE INOPERATIVE (BISYNC PICO) IOU: EOTPD:,39 EOT FAILED PAD CHECK (BISYNC PICO) IOU: NAKPD:,40 NAK FAILED PAD CHECK (BISYNC PICO) IOU: MSGAB:,41 MESSAGE ABORTED (BISYNC PICO) IOU: BCCER:,42 BCC ERROR (BISYNC PICO) IOU: ILLCC:,43 ILLEGAL CONTROL CHARACTER (BISYNC PICO) IOU: RCVOR:,44 RECEIVE OVERRUN (BISYNC PICO) IOU: LGOVR:,45 LEADING GRAPHICS OVERRUN (BISYNC PICO) IOU: RTXER:,63 RTX ERROR * * 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 WITH ERROR IOE:DI EQU 3 DIB ADDR IOE:TI EQU 4 TIB ADDR TITL I:LOAD & I:LD410S PARAMETER BLOCK EQUATES & MACROS * PARAMETER BLOCK EQUATES * LD:LUN EQU 0 LOAD FILE LUN LD:BUF EQU 1 FILE INPUT BUFFER ADDRESS LD:OFF EQU 2 RELOCATION OFFSET LD:HLL EQU 3 HIGH LOAD LIMIT LD:LLL EQU 4 LOW LOAD LIMIT LD:XAD EQU 5 EXECUTION ADDRESS LD:HAD EQU 6 HIGHEST ADDRESS LOADED LD:FLG EQU 7 FLAG WORD LD:SDA EQU 8 SLAVE DEVICE ADDRESS (410S ONLY) LD:STP EQU 8 TOP-DOWN LOAD STEP VALUE (I:LOAD ONLY) LD:SIZE EQU 9 SIZE OF LOAD SERVICE PARAMETER BLOCK * * LD:FLG (FLAG WORD) EQUATES * LDF:ERR EQU 15 ERROR OCCURRED DURING LOAD LDF:IOE EQU 14 I/O ERROR LDF:BTC EQU 13 BAD TYPE CODE ERROR LDF:ADE EQU 12 ADDRESSING ERROR LDF:NOS EQU 11 NO 410S AT SPECIFIED DEVICE ADDRESS (410S ONLY) LDF:MAE EQU 10  MEMORY ADDRESS ERROR (16-32K) (410S ONLY) * LDF:PM EQU 2 PUBLIC MEMORY IN UPPER 32K (410S ONLY) LDF:EXA EQU 1 EXECUTION ADDRESS SPECIFIED (410S ONLY) LDF:EX EQU 0 INITIATE 410S EXECUTION (410S ONLY) TITL * PARAMETER BLOCK GENERATION MACRO * * LABEL LOAD: LUN,OFF,(BUF),(HLL),(LLL),(XAD),(FLG),(SLV) * LOAD: MACRO WORD #(1) LD:LUN .. LUN WORD #(3)+0 LD:BUF .. INPUT BUFFER ADDRESS WORD #(2) LD:OFF .. RELOCATION OFFSET WORD #(4)+0 LD:HLL .. HIGH LOAD LIMIT WORD #(54 )+0 LD:LLL .. LOW LOAD LIMIT WORD #(6)+0 LD:XAD .. EXECUTION ADDRESS (410S ONLY) WORD 0 LD:HAD .. HIGH LOAD ADDRESS/NEXT FREE ADDRESS WORD #(7)+0 LD:FLG .. FLAG WORD (410S ONLY) IFT #(8,?) WORD #(8) LD:SDA .. USER SLAVE DEVICE ADDRESS (410S ONLY) ENDC IFF #(8,?) WORD :F0 LD:SDA .. DEFAULT SLAVE DEVICE ADDRESS (410S ONLY) ENDC * S: SET #(?)<2 S: SET #(?)>8++S: IFT S: NOTE E,'INCORRECT NUMBER OF PARAMETERS' ENDC ENDM TITL I:OVL PARAMETER BLOCK EQUATES AND MACROS * * OV:A BLOCK EQUATES * OVA:LUN EQU 0 LUN ENTRY IN OV:A BLOCK OVA:ADR EQU 1 DIRECTORY ADDRESS ENTRY IN OV:A BLOCK OVA:LEN EQU 2 LENGTH ENTRY IN OV:A BLOCK * OVL:A MACRO #(1) WORD #(2) LUN TO USE FOR OVERLAYS WORD #(3) ADDRESS OF USER'S DIRECTORY BLOCK WORD #(4) LENGTH OF USER'S DIRECTORY BLOCK ENDM OVL: MACRO MACLAB OVL:A #(-1),#(1),#(2),#(3) ENDM  SPACE 2 SAVE END NOTE E,'INCORRECT NUMBER OF PARAMETERS' ENDC ENDM TITL I:OVL PARAMETER BLOCK EQUATES AND MACROS  TITL I O S D . M A C - IOS DEVELOPMENT EQUATES & MACROS (93421-1A-F300) TITL .... CONTENTS ************************* *  * * IOSD.MAC * * * ************************* * * DIB EQUATES *  CIB EQUATES * TIB EQUATES * DIO DEVICE EQUATES * NON-DIO DEVICE EQUATES * BIT:WORD MACRO * BIT:EQU MACRO * BIT:SET MACRO * INT:SEQ MACRO * DIB:ST MACRO * CIB:ST MACRO * TVDIBCIB MACRO * CIB:DK MACRO * CIB:DF MACRO * CIB:DFQ MACRO * CIB:DP: MACRO * OPT:DS MACRO * DIB:DK MACRO * DIB:DM MACRO * DIB:DH MACRO * DIB:DF MACRO * DIB:DFQ MACRO * DIB:DS MACRO * CIB:DM MACRO * CIB:DH MACRO * CIB:DS MACRO * DIB:DP MACRO * CIB:DP MACRO * COND  MACRO * COND1 MACRO * D:AC MACRO * DIB:TV MACRO * DIB:LP MACRO * C:AC MACRO *  CIB:TV MACRO * CX:AC MACRO * DIB:MT MACRO * CIB:MT MACRO * DIB:BP MACRO * DBP:O MACRO * CIB:BP MACRO * * * REV E500 - ADDED FIFTH PARAMETER TO DIB:LP TO SPECIFY TIME-OUT * SHIFT COUNT VALUE (FOR THE AXIOM IMP-2 PRINTER) * MSS RICHARDSON * * REV E600 - REA 10156 FIXED (CX:AC MACRO); REA'S 10168, 10173 * FIXED (CIB:BP MACRO) * DCR 15/JAN/81 * * REV E700 - CHANGED LINE PRINTER TO 81 COLUMNS. SLM 2/MAR/81 * * REV F000 - INT:SEQ MACRO FIXED SD 2/APR/81 * FIXED FS: IN READ/WRITE DSW WORDS FOR DISK BLOCK I/O * EQUATED FROM DFQDA: TO DFDA: FOR QUAD FLOPPY DIB *  DIB:DFQ TO GENERATE CORRECT CHAN NAME. * (REAS FIXED: 10192,12979,12977,12976) * * REV F100 - ADDED DIB:DK, CIB:DK, DISK FAMILIES. * ALSO, INCLUDES CHANGES FOR SCOUT MULTI-CHANNEL SERIAL * IO HANDLER. * CWK 24/SEP/81. * * * REV F101 - CHANGED DI:ERM FROM :2000 TO :3B14 FOR USE IN *  IOSTTY.ASM (CHARACTER DRIVER). * VAW & CWK 02/OCT/81. * * CHANGED CIB:DK 5 TO CORRECT FAMILY LOGIC. * ALSO, FIXED RD,WRT,POS&FUN ENTRY POINTS * FOR DFQ.  ALSO, INCLUDED DFQ IN EOB SEQUENCE. * CHANGED FAM:PHXN AND FAM:PHXA EQU NAMES TO FAM:PHWS *  AND FAM:PHNS. THIS CHANGES ITS MEANING; IT * NOW REFERS TO WHETHER OR NOT THE DRIVE HAS *  SPO OPTION SO WE CAN MAKE SURE DH REFERS TO * THE FIXED VOLUME. *  MDB & CWK 07/OCT/81. * * * REV F200 - CHANGED 'TPC:' TO 'SPA:' IN PHOENIX DIB AREA, *  BEING PREVIOUSLY INCORRECT. * CWK 13/OCT/81 * * * REV F300 - ADDED 16-MB DEFAULT TO PHOENIX SIZE IN DIB * ADDED FD: AND SPCH OPTIONS TO CX:AC MACRO * FOR ASYNCH MUX. * ADDED EDT: OPTION TO D:AC FOR ASYNCH MUX * MOVED DI:LPP AND DI:CPL DOWN IN ASYNCH MUX *  DIB FOR USE BY DRIVER. * PFT 4/FEB/82 * * - ADDED SCOUT WINCHESTER DISKS TO DIB:DK AND * CIB:DK MACROS. THE FAMILY IDENTIFIER * IS SWI. *  CWK 08/AUG/82. * * - MADE THE TIMEOUT VALUE FOR ALL WINCHESTER *  DISKS 7*8 AND SPB IS :FFFF FOR SCOUT * WINCHESTER DISKS. *  CWK 07/SEP/82. * *** TITL DIB EQUATES * 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 DIFAM: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:MC EQU 8 SCOUT MULTI-CHANNEL PSEUDO-OPEN FLAG DIF:NCFL EQU 2 FLIST IS NONCONTIGUOUS 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 6  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 SCOUT MULTI-CHANNEL SERIAL IO HANDLER * DI:CTRL EQU 28 BOARD CONTROL WORD (AUTO-ECHO INCLUDED) DI:MODE EQU 29 MODE WORD (CHAR. LENGTH, NO. OF BYTES, ETC.) DI:TYPE EQU 30 TYPE OF DEVICE (TV, LP, TK, ETC. (#) ) DI:SPC EQU 31 CONFIG. SPECIAL CHAR. TABLE ADDR. PTR. DI:UTBL EQU 32 USER'S SPECIAL CHAR. TABLE ADDR. PTR. * * 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:FAM EQU 27 DISK DEVICE FAMILY. 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:BPA EQU 32 BYTES PER AU DI:APD EQU 31 AU'S PER DISK 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 * * DEVICE INFORMATION BLOCK FOR MINI-FLOPPY * DI:BMW EQU 21 DI:INT EQU 40 DI:SCT EQU 41 DI:SEC EQU 42 * * DEVICE INFORMATION BLOCK FOR MAGTAPE * DI:BLKCT EQU 16 BLOCK COUNT DI:SERV EQU 17 ADDRESS OF MAGTAPE SERVICE ROUTINES DI:BMR EQU 20 BRANCH/MODE WORD REWIND DI:OMW EQU  21 ORIGINAL MODE WORD DI:MASK EQU 24 ERROR MASK DI:FLAG EQU 25 ERROR FLAGS DI:THWS EQU 26 TEMPORARY H/W STATUS TITL * DEVICE INFORMATION BLOCK FOR ASYNCH MUX * DI:FIO EQU 18 ADDRESS OF FORMATTED I/O ROUTINE DI:CNFG EQU 19 ADDRESS OF CONFIGURATION ROUTINE * * FLAGWORD BITS FOR ASYNCH MUX DIB * DIF:DC EQU 3 SET FOR DYNAMIC CONFIGURATION DIF:FA EQU 4 SET IF FA: HANDLER LOADED * * DEVICE INFORMATION BLOCK FOR BISYNC PICO * DI:DVS EQU 16 DEVICE STATE WORD DI:OPT  EQU 17 OPTION TABLE DI:SID EQU 29 STATION IDENTIFIER TITL CIB EQUATES * CONTROLLER INFORMATION BLOCK (CIB) * CI:PER EQU 0 PEER POINTER CI:FLG EQU 1 CIB FLAGWORD CI:MST EQU 2 7  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 TITL * CONTROLLER INFORMATION BLOCK FOR FLOPPY * 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 * * CONTROLLER INFORMATION BLOCK FOR MINI-FLOPPY * CI:CLK EQU 27 * * CONTROLLER INFORMATION BLOCK FOR MAGTAPE * CI:RTY EQU 24 RATE ERROR RETRY COUNT CI:WCNT EQU 26 WAIT RETRY COUNT CI:TIC EQU 27 WAIT TIMER VALUE CI:MODE EQU 28 LAST PICO MODE WORD * *  CONTROLLER INFORMATION BLOCK FOR ASYNCH MUX * CI:OPT EQU 24 ADDRESS OF CHANNEL OPTION TABLE OP:SCT EQU 2 OFFSET OF SPEC CHAR TABLE IN CIB EXTENSION * * CONTROLLER INFORMATION FOR SCOUT MULTI-CHANNEL SERIAL * CI:EOB2 EQU 24 2ND PART IN EOB ROUTINE TITL TIB EQUATES * 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 8 TI:SOF EQU 7 SOFTWARE STATUS TI:PRI EQU 13 TEMPOARY SAVE 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 SCOUT MULTI-CHANNEL SERIAL IO HANDLER * TI:CMD EQU 10 COMMAND CONTROL WORD TI:IV EQU 19 RECEIVE/TRANSMIT INTERRUPT VECTOR LOCATION TI:CHR EQU 20 NEGATIVE COUNT SPECIAL CHARS. TI:SAVE1 EQU 21 TEMPORARY STORAGE TI:SAVE2 EQU 22 " " " " " " * * 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 FOR MAGTAPES * TI:FCSS EQU 21 FILE MANAGER FUNCTION CODE SAVE TI:BCSS EQU 22 BLOCK COUNT SAVE * * TIB FOR ASYNCH MUX * TI:UTL EQU TI:CRI UTILITY PARAMETER TI:OPT EQU 18 ADDR OF OPTION TABLE GOES HERE TI:SCT EQU 19 ADDR OF SPECIAL CHAR TABLE GOES HERE TI:GCB EQU 20 FLAG SET IF CIB OCCUPIED TI:KSAVE EQU 21 SAVE K REG HERE ON ENTRY TI:SYSTM EQU 22 NON-ZERO TO ALLOW TIMOUT * * TIB FOR BISYNC PICO * TI:IST EQU 10 DEVICE STATUS (FROM INTERRUPT ROUTINE) TI:FLG EQU 18 FLAG FOR NON-BCB OPERATION TI:BCB EQU 19 ADDRESS OF BCB CURRENTLY BEING PROCESSED TI:CAF EQU 20 COMPARE ADDRESS FLAG ON READ TI:PFE EQU 21 FLAG FOR POWER FAIL TERMINATION TI:STT EQU 22 STATUS RETURNED FOR BCB CHAIN * * 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:TVW EQU TI:QUO TV WAIT COUNT 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 DIO DEVICE EQUATES * 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: S9 ET 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 TAPE 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 DEVICE EQUATES * NON-DIO * DFCN: SET :11 DFDA:  SET DFCN:%3 DISK, STANDARD FLOPPY * DFQDA: SET DFDA: DISK, QUAD FLOPPY * DMCN: SET :14 DMDA: SET DMCN:%3  DISK, MEDIUM CAPACITY * DHCN: SET :15 DHDA: SET DHCN:%3 DISK, HIGH CAPACITY SWDA: SET DHCN:%3 DISK, SHUGART WINCHESTER QWDA: SET DHCN:%3 DISK, QUANTUM WINCHESTER PHDA: SET DHCN:%3 DISK, PHOENIX * DSDA: SET :30 DISK, SCOUT DSIA: SET :C8 INTERRUPT VECTOR ADDRESS (SAME AS MT) DSMOD: SET :8407 IBM FORMAT, 8", SINGLE DENSITY MAX:SPT SET 26 MAXIMUM SECTORS ON A TRACK = 26 FGAP: SET 26 26 BYTE GAP3 (BETWEEN DATA AND NEXT HEADER) FGAP2: SET 54 54 BYTE GAP3 FOR DOUBLE DENSITY * DPDA: SET 6 DEFAULT PICO-FLOPPY CHANNEL IS 6 * ETIODAD: SET :F CHANNEL NO. FOR IOD WITH EXTRA TV-S ETIODIB: SET :C0 INTERRUPT VECTOR BASE FOR THAT IOD MCSDA: SET :40 DEFAULT DEVICE ADDRESS FOR SCOUT MULTI-CHANNEL SERIAL * * THE INTERRUPT ADDRESS SPACE FOR THE SCOUT MCS WAS ALLOCATED * BELOW LOCATION :200 BECAUSE IT MUST ALSO FUNCTION IN CONJUNCTION * WITH THE SCOUT SPI BOARD WHICH INTERRUPTS TO THE SAME LOCATIONS * AS THE DIO. INTERRUPT VECTOR ADDRESS MUST BE BELOW 8K. * MCSIV: SET :180 DEFAULT INTERRUPT BASE ADDRESS TITL DIB & CIB GENERATION SUPPORT EQUATES & MACROS * * MISCELLANEOUS EQUATES * R:SA12 EQU :3F LF: EQU :A FF: EQU :C CR: EQU :D * *  EQUATES FOR DISK DEVICE FAMILIES. * FAM:DM EQU :1 PERTEC MEDIUM CAPACITY DISK DRIVES FAM:DH EQU :2 CDC STORAGE MODULE DISK DRIVES FAM:SWIN EQU :3 NM4 SHUGART WINCHESTER DISK DRIVES FAM:QWIN EQU :4 NM4 QUANTUM WINCHESTER DIS: K DRIVES FAM:PHWS EQU :5 CDC PHOENIX DISK WITH SPO OPTION FAM:PHNS EQU :6 CDC PHOENIX DISK WITHOUT SPO OPTION FAM:SWNS EQU :13 NM4 SHUGART WINCHESTER DISK DRIVES ON SCOUT FAM:QWNS EQU :14 NM4 QUANTUM WINCHESTER DISK DRIVES ON SCOUT FAM:SWI EQU :15 SCOUT WINCHESTER DRIVES FAM:HARD EQU :20 HARD DISK CEILING * FAM:DF EQU :20 STANDARD FLOPPY DRIVES FAM:DP EQU :21 MINI-FLOPPY DRIVES FAM:DFQ EQU :22 QUAD FLOPPY DRIVES * * FAM:DS EQU :40 SCOUT FLOPPY DRIVES * * 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 INTERRUPT SEQUENCE * INT:SEQ MACRO JST R:SA12 COPY =$-CI:EOB-1,X CIN ADDR JMP *$+1 IFF #(1,?) EXTR I:EOB WORD I:EOB ENDC IFT #(1,?) EXTR #1 WORD #(1) ENDC ENDM * * STANDARD DIB MACRO * * SUPPORTS: TK00 TY00 TP00 TR00 TV00 * LP00 (81,57,LF:) CR00 PP00 PR00 * DF00 DF01 DF02 DF03 (ALL FLOPPIES ARE SINGLE DENSITY) * DM00 DM01 (BOTH ARE 5MB) * DM02 DM03 (BOTH ARE 10MB) * DH00 (40MB) * DH01 (80MB) * DH02 (150MB) * DH03 (300MB) * DIB:ST MACRO LOAD D:#(1) ENDM * * STANDARD CIB MACRO FOR DM0 AND DH0 * CIB:ST MACRO LOAD C:#(1,1,3) ENDM TITL ** MACRO: TVDIBCIB * * USAGE: TO CREATE DIB'S AND CIB'S FOR OTHER CRT'S ADDED * TO THE SYSTEM.... * * TVDIBCIB NAME,CHAN * TVDIBCIB NAME,BDAD,CHAN,VECT * * NAME = DEVICE NAME (4 CHARACTERS) * CHAN = CHANNEL NUMBER FOR THIS DEVICE * BDAD = BOARD ADDRESS (DEFAULT = :F) * VECT = BASE VECTOR FOR THE BOARD (DEFAULT = :C0) * * EXAMPLE: TVDIBCIB TV01,3 * * THIS CREATES DIB & CIB FOR TV01 ON CHANNEL 3 * * TVDIBCIB TV02,:C,3,:80 * * THIS CREATES DIB & CIB FOR TV02 AT DEVICE ADDR :C6 * AND WITH A DATA VECTOR AT :98 (:80 + 3*8) * ** SPACE 1 TVDIBCIB MACRO * * GENERATE DIB FOR THIS TERMINAL * DIB:TV #(1),#(2),#(3),#(4) * * GENERATE CIB FOR THIS TERMINAL * CIB:TV #(1),#(2),#(3),#(4) ENDM TITL SCOUT DIB CONFIGURING MACRO * *  OPTIONAL CONFIGURATION MACRO FOR SCOUT FLOPPY DIB * OPT:DS MACRO DS DSMOD: SET DSMOD:&:7F++:8400 ONLY FIELD NOT REQUIRED IS 'GAP=' IFT #(1,'MINI') DSMOD: SET DSMOD:--:600 ENDC IFT #(2,'MINI') DSMOD: SET DSMOD:--:600  ENDC IFT #(3,'MINI') DSMOD: SET DSMOD:--:600 ENDC IFT #(4,'MINI') DSMOD: SET DSMOD:--:600  ENDC IFT #(1,'UNI') DSMOD: SET DSMOD:--:8000 ENDC IFT #(2,'UNI') DSMOD: SET DSMOD:--:8000  ENDC IFT #(3,'UNI') DSMOD: SET DSMOD:--:8000 ENDC IFT #(4,'UNI') DSMOD: SET DSMOD:--:8000 ENDC IFT #(1,'GAP=') YYY: SET #(1,?) DSMOD: SET #(1,5,YYY:)--DSMOD:&:7F--DSMOD: ENDC IFT ;  #(2,'GAP=') YYY: SET #(2,?) DSMOD: SET #(2,5,YYY:)--DSMOD:&:7F--DSMOD: ENDC IFT #(3,'GAP=') YYY: SET #(3,?) DSMOD: SET #(3,5,YYY:)--DSMOD:&:7F--DSMOD: ENDC IFT #(4,'GAP=') YYY: SET #(4,?) DSMOD: SET #(4,5,YYY:)--DSMOD:&:7F--DSMOD: ENDC IFT #(1,'REV') DSMOD: SET DSMOD:--:400 ENDC IFT #(2,'REV') DSMOD: SET DSMOD:--:400 ENDC IFT #(3,'REV') DSMOD: SET DSMOD:--:400 ENDC IFT #(4,'REV') DSMOD: SET DSMOD:--:400 ENDC ENDM TITL DISK DIB MACROS * * THIS IS THE GENERALIZED DIB:DK MACRO WHERE A STANDARD * FORMAT GIVEN BELOW CAN BE FOLLOWED TO SET UP A DIB FOR * ANY DEVICE. * * HOS/UNIT WORD - SINCE THERE ARE TWO VOLUMES PER UNIT (AS WITH * THE PERTEC DRIVES), IT IS NECESSARY TO SET THE UNIT BYTE * TO "1" WHICH WILL CAUSE THE UNIT NUMBER DESIRED TO BE * SHIFTED 1 BIT TO THE RIGHT THUS OBTAINING THE ACTUAL *  UNIT NUMBER. * * SPO OPTION - THE SPO OPTION IS AVAILABLE IF A USER DESIRES TO * AUTOLOAD FROM THE FIXED PLATTER. AS OPPOSED TO NON-SPO, * THE SPO OPTION SWITCHES WHICH DRIVE YOU ARE TALKING TO - * IN OTHER WORDS, THE FIXED BECOMES THE REMOVABLE AND VICE * VERSA. TO OVERCOME THIS PROBLEM, THE TABLE BELOW IS USED *  TO KEEP THE FIXED VOLUME AS DH00, DH02 ... & * TO KEEP THE REMOVABLE AS DH01, DH03 ... * ALL THAT IS NEEDED IS TO TOGGLE THE VOLUME CONTROL BIT * OF THE HOS WORD. * * LOGICAL/PHYSICAL DEVICE HOS(NO SPO) HOS(SPO) * ----------------------- ----------- -------- * 0 / 0  :10 0 * 1 / 0 0 :10 * 2 / 1  :10 0 * 3 / 1 0 :10 * ETC..... * * * FORMAT --- * * DIB:DK ,[,] * * -- TWO LETTER CODE FOR THE FAMILY TYPE * EG. DM,DH,DF,DS,DP * WHERE DH IS USED FOR PHNS,PHWS,QWIN,SWIN,QWNS,SWNS * DF IS USED FOR DFQ * * -- IS THE SPECIFIC FAMILY FOR THE DIB. THE LIST * OF ALL POSSIBLE FAMILY NAMES IS GIVEN ABOVE IN THE * EQU'S WHERE QWNS AND SWNS HAVE NOT BEEN AS YET * IMPLEMENTED AND ARE IN FOR FUTURE USE. * * -- ARGUMENTS 3 TO N CORRESPOND TO ARGUMENTS 2 TO * N-1 IN THE STANDARD CALLS (EG: DIB:DM, DIB:DH ...) * DIB:DK MACRO FAM:  SET FAM:#(2) SET FAMILY TYPE. DIB: #(1),#(3),#(4),#(5),#(6),#(7) ENDM * DIBS FOR THE PME/PLU DISK CONTROLLERS, THE SCOUT AND * NM4 FLOPPY DISK CONTROLLERS, AND THE MINIFLOPPY * PICO. * DIB: MACRO DIB:DM MACENT DM *** DISK CARTRIDGE DRIVE DIB MACRO *** DIB:DH MACENT DH *** DISK PACK DRIVE DIB MACRO *** DIB:DF MACENT DF *** STANDARD FLOPPY DISK DIB MACRO *** DIB:DFQ MACENT DFQ *** QUAD FLOPPY DISK DIB MACRO *** DIB:DS MACENT DS *** SCOUT FLOPPY<  DISK DIB MACRO *** DIB:DP MACENT DP *** MINIFLOPPY PICO DIB MACRO *** LPOOL O: SET $ TABLE: REL SHARABLE TABLE:  SYSTEM XXX: SET 1 (FIX THE BUG IN MACRO) YYY: SET 1 (DITTO) BMW: SET -1 UNIT: SET 0 SET THE UNIT TO 0, CHANGE LATER IF DM,PHWS,PHNS IFT #(0,?) FAM: SET FAM:#(0) SET FAMILY NAME IF NOT DIB:DK  ENDC IFT FAM:=FAM:DS UNIT: SET '##(1,4,4)'-'0'&3 SET UNIT TO IF SCOUT ENDC HOS: SET  0 SET HOS TO 0, CHANGE LATER IF DM,PHWS,PHNS IFF FAM:=FAM:DS BPS: SET 512 ALLL HARD DISKS ARE 512 BYTE SECTORS MB: SYMVAL #(2) MEGABYTES IFT FAM:=FAM:DM UNIT: SET 1 FOR MCDC, UNIT = SHIFT COUNT HOS: SET '##(1,4,4)'-'0'&1*2 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 FAM:=FAM: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 IFT FAM:=FAM:SWIN TPC: SET 2 CPD: SET 256 SPT: SET 16 SPA: SET  1 IFT MB:=10 TPC: SET 4 ENDC ENDC * IFT FAM:=FAM:QWIN TPC: SET 2 CPD: SET  512 SPT: SET 16 SPA: SET MB:/10 IFT MB:=20 TPC: SET 4 ENDC IFT MB:=40 TPC: SET 8 ENDC ENDC * T1: SET FAM:=FAM:PHWS IFT FAM:=FAM:PHNS++T1: IFF #(2,?) MB: SET 16 DEFAULT PHOENIX DISK CAPACITY IN MB ENDC TPC: SET MB:/16 UNIT: SET 1 SET UNIT TO 1 FOR SHIFT IN MCDC CPD: SET 823 SPT:  SET 32 SPA: SET 1 IFT MB:=48 SPA: SET 4 ENDC IFT MB:=80 SPA: SET 8 ENDC DN: SET #(1,4,4) T1: SET DN:/2*2=DN: IFT T1: HOS: SET :10 SET HOS TO :10 IF UNIT IS EVEN ENDC IFT FAM:=FAM:PHWS HOS: SET :10-HOS: TOGGLE HOS IF FAMILY IS PHWS ENDC ENDC * ENDC IFT FAM:=FAM:SWI TPC: SYMVAL #(2) CPD: SYMVAL #(3) IFF #(2,?) TPC: SET 4 ENDC IFF #(3,?) CPD: SET 300 ENDC SPT: SET 16 SPA: SET 1 ENDC T1: SET FAM:=FAM:DF IFT FAM:=FAM:DFQ++T1: IFT FAM:=FAM:DFQ BPS: SET 256 ENDC IFT FAM:=FAM:DF BPS: SET 128 ENDC SPT: SET 26 CPD: SET BPS:/128*77 SPA: SET 512/BPS: TPC: SET 1 ENDC IFT FAM:=FAM:DP BPS: SET 128 SPT: SET 16 CPD: SET 35 SPA: SET 4 TPC: SET 1 BMW: SET :200 ENDC IFT FAM:=FAM:DS BMW: SET DSMOD:++:1900 TPC: SET 1 BPS: SET 128 SD SECTOR SIZE DEFAULT = 128 BYTES XXX: SET #(2,?) YYY: SET #(3,?) CPD: SET 77 8 IN. DISKS USUALLY HAVE 77 TRACKS SPT: SET 5208-73 IFT BMW:&:200 IS IT A 5 1/4 IN. DRIVE? SPT: SET 3125-67 BIT TIMES PER TRACK (LESS HEADER) CPD= : SET 35 DEFAULT IS 35 TRACKS PER DISK ENDC IFT #(2,?)>0 BPS: SYMVAL #(2) IFT  '##(2,XXX:,XXX:)'='D' BMW: SET BMW:+:80 SET DOUBLE DENSITY FLAG IFT XXX:=1 BPS: SET 256 DD SECTOR SIZE DEFAULT = 256 BYTES ENDC ENDC ENDC IFT #(3,?) IFF '##(3,1,1)'='*' CPD: SYMVAL #(3) ENDC XXX: SET #(3,?)-1 IFT '##(3,XXX:,YYY:)'='*2' TPC: SET 2 XXX: SET #(3,?)-2 IFT XXX:>0 CPD: SYMVAL #(3,1,XXX:) ENDC ENDC ENDC XXX: SET BPS:+33+FGAP: SPT: SET SPT:-33 SECTORS PER TRACK LESS ONE SECTOR O/H IFT BMW:&:80 XXX: SET BPS:+61+FGAP2: BYTE TIMES PER SECTOR SPT: SET SPT:+SPT:+5 (61 NOT 66 OVERHEAD BYTES) ENDC SPT: SET SPT:-BPS: DATA IN THAT FIRST SECTOR SPT: SET SPT:*97/100 ALLOW 3% SPEED VARIATION SPT: SET SPT:/XXX:+1 NUMBER OF SECTORS PER TRACK IFT SPT:>MAX:SPT SPT: SET MAX:SPT ENDC SPA: SET 512/BPS: IFT SPA:=0 SPA:  SET 1 ENDC ENDC APD: SET SPT:*TPC:*CPD:/SPA: AU'S PER DISK NAM D:#(1) D:#(1) CHAN #(1,1,2): WORD 0 DI:FLG WORD C:#(1,1,3) DI:CIB HEAD Z:#(1) DI:FCB BYTE '##(1)'  DI:NAM WORD 0 DI:DN WORD 0 DI:DS SPB: SET -9 WBT: SET 1*8 T1:  SET FAM:=FAM:DS T1: SET FAM:=FAM:DF++T1: T1: SET FAM:=FAM:DFQ++T1: IFT FAM:=FAM:DP++T1: SPB: SET -6 WBT: SET 2*8 ENDC T1: SET FAM:=FAM:SWIN T1: SET FAM:=FAM:QWIN++T1: IFT FAM:=FAM:SWI++T1: WBT: SET 7*8 IFT FAM:=FAM:SWI SPB: SET -1 ENDC ENDC WORD SPB: DI:SPB  WORD WBT: DI:WBT BIT:WORD FA:,FB:,FS:,DA:,DB:,UF: BIT:WORD FS:,DA:,DB:,UF: BIT:WORD BIT:WORD OP:,CL:  RES 2,0 WORD BPS: DI:BPS XXX: SYMVAL SEC:TRK USER SPECIFIED SECTORS/TRACK? IFT XXX:  WORD SEC:TRK DI:SPT ENDC IFF XXX: WORD SPT: DI:SPT ENDC WORD  TPC: DI:TPC WORD CPD: DI:CPD WORD SPA: DI:SPA WORD BMW:  DI:BMW IFT FAM:=FAM:SWI BYTE 1,10 DI:TRY ENDC IFF FAM:=FAM:SWI BYTE 3,10 DI:TRY ENDC WORD 1 DI:VTS WORD 1 DI:ATS BYTE  UNIT:,HOS: DI:HOS -- UNIT AND HEAD OFFSET WORD 0 WORD FAM: DI:FAM -- DEVICE FAMILY WORD APD:/2 DI:FLP WORD CPD: DI:FLN WORD APD:/2+CPD: POINTER TO FREE AU MAP WORD APD: DI:APD WORD BPS:*SPA: DI:BPA IFT BPS:>256 FOR LARGE SECTOR DISKS, BUFFER=SECTOR WORD 1 DI:SBF ENDC IFF BPS:>256 FOR SMALL SECTOR DISKS, BUFFER=512 BYTES  WORD 512/BPS: DI:SBF ENDC RES 6,0 DI:SAU - DI:FAU IFT FAM:=FAM:DS >  IFF DSMOD:&:200 IF A STANDARD FLOPPY DRIVE XXX: SET :AF24 IFT #(4,?) XXX: SET #(4)--:F+1%12--XXX:&:F000--XXX: ENDC IFT #(5,?) XXX: SET #(5)+1&:FE--XXX:&:FF--XXX: ENDC IFT #(6,?) XXX: SET #(6)+15%4--XXX:&:0F00--XXX: ENDC ENDC IFT DSMOD:&:200 IF A MINI-FLOPPY XXX: SET :2F18 IFT #(4,?) XXX: SET #(4)+1/2--:F+1%12--XXX:&:F000--XXX: ENDC IFT #(5,?) XXX:  SET #(5)+3/2&:FE--XXX:&:FF--XXX: ENDC IFT #(6,?) XXX: SET #(6)+31%3--XXX:&:0F00--XXX:  ENDC ENDC WORD XXX: DI:INT INTERVAL TIMER SPECS. ENDC IFT FAM:=FAM:DP WORD -1 DI:INT WORD 0 DI:SCT WORD 0 DI:SEC ENDC ORG O: ENDM  TITL DISK CIB MACROS * MINIFLOPPY CIB MACRO (REFORMATTER) * CIB:DP MACRO IFT #(?)>1 CIB:DP: DP00,#(1)%3+#(2)%1 ENDC IFF #(?)>1 CIB:DP: DP00 ENDC ENDM * * THIS IS THE GENERALIZED CIB MACRO FOR ALL BUT THE MINIFLOPPY * PICO. IT HAS THE FOLLOWING FORMAT: * * CIB:DK ,[,,] * * -- DM,DH,DS,DF,DP * WHERE DH IS USED FOR: QWIN,SWIN,PHWS,PHNS * DF IS USED FOR: DFQ * * -- SET TO 00. * * -- FAMILY NAME (SEE DIB:DK FOR LIST). * * -- DEVICE ADDRESS (USES DEFAULT IF NOT SPECIFIED). * * -- INTERRUPT ADDRESS (APPLICABLE TO SCOUT AND MINI ONLY) * (USES DEFAULT IF NOT SPECIFIED). * CIB:DK MACRO FAM: SET FAM:#(2)  CIB: #(1),#(3),#(4),#(2) ENDM CIB: MACRO DK CIB:DM MACENT DM CIB:DH MACENT DH CIB:DS MACENT DS CIB:DF MACENT DF CIB:DFQ MACENT DFQ CIB:DP: MACENT DP IFF #(0,'DK') FAM: SET FAM:#(0) SET FAM: IF NOT CIB:DK ENDC LPOOL O: SET $ TABLE: REL SHARABLE TABLE: SYSTEM NAM C:#(1,1,3) C:#(1,1,3) CHAN CIB: CI:PER DEVAD: SYMVAL #(2) IFF #(2,?) IFT #(4,?) DEVAD: SET #(4,1,2)DA: SET DEVAD: IF FAMILY NAME GIVEN ENDC IFF #(4,?) DEVAD: SET #(0,1,2)DA: SET DEVAD: IF FAMILY NAME NOT GIVEN (NOT CIB:DK). ENDC ENDC IFT DEVAD:<:20 T1: SET FAM:=FAM:DS IFF FAM:=FAM:DP++T1: DEVAD: SET DEVAD:%3 ENDC IFT FAM:=FAM:DP DEVAD: SET ETIODAD:%3+DEVAD:%1 ENDC ENDC WORD 0 CI:FLG - FLAG WORD HEAD CIB: CI:MST - MASTER CIB LINK HEAD #(1,1,2): CI:DIB WORD :7600 CI:PRI WORD DEVAD: IFT  FAM:<:20 CHECK IF HARD DISK EXTR DK:RD,DK:WRT,DK:FUN WORD 0,0,DK:RD,DK:WRT,0,DK:FUN ENDC T1: SET FAM:=FAM:DFQ CHECK IF DF OR DFQ IFT FAM:=FAM:DF++T1: " " EXTR DF:RD,DF:WRT,DF:FUN  WORD 0,0,DF:RD,DF:WRT,0,DF:FUN ENDC IFT FAM:=FAM:DP EXTR DP:RD,DP:WRT,DP:FUN XXX: SYMVAL #(3) IFF #(3,?) XXX: SET DEVAD:&:E%2+ETIODIB: ENDC WORD XXX:,0,DP:RD,DP:WRT,0,DP:FUN ?  ENDC IFF FAM:=FAM:DS INT:SEQ I:EOB ENDC IFT FAM:=FAM:DS EXTR UF:RD,UF:WRT,UF:FUN XXX: SYMVAL #(3) IFF #(3,?) XXX: SET DSIA: CI:IV ENDC WORD XXX:,0,UF:RD,UF:WRT,0,UF:FUN DSMOD: SET :8407 RESTORE DEFAULT VALUE TO DSMOD INT:SEQ UF:EOB ENDC  RES 4,0 WORD 1 CI:USM WORD 0,0,0,0,0,0 IFF FAM:=FAM:DP RES 6,0 T1: SET FAM:=FAM:DFQ IFF FAM:=FAM:DF++T1: WORD 0,C:#(1,1,3)+CI:DIV ENDC RES 4,0 IFT FAM:=FAM:DF++T1: JSK C:#(1,1,3)+CI:EOB WORD 0 ENDC JSK C:#(1,1,3)+CI:EOB ENDC IFT FAM:=FAM:DP WORD -2 CI:CLK ENDC ORG O: ENDM TITL ASYNC MUX OPTIONS MACRO * MACRO TO CONDITIONALLY GENERATE A SYMBOLIC REFERENCE OR ZERO WORD * COND MACRO 0 COND1 MACENT 1 IFT #(2) IF CONDITION TRUE WORD #(1) GENERATE SYMBOLIC REFERENCE ENDC IFF #(0) IF ALTERNATE ENTRY, DON'T ASM IFF #(2) IF CONDITION FALSE WORD 0 GENERATE ZERO WORD ENDC ENDC ENDM * * USEFUL VALUES * DIF:DC EQU 3 BIT NUMBER FOR DYNAMIC CONFIGURATION DIF:FA EQU 4 BIT NUMBER TO SELECT FA: HANDLER DIF:AB EQU 7 BIT NUMBER TO REQUEST AUTO-BAUDING OPT:DC EQU 1%DIF:DC SET THE BIT OPT:FA EQU 1%DIF:FA SET THE BIT OPT:FC EQU 1%DIF:FC SET THE BIT FOR FORM CONTROL OPT:AB EQU 1%DIF:AB SET THE BIT * * BAUD RATE VALUES * BD:50 EQU 0 BD:75 EQU 1 BD:110 EQU 2 BD:135 EQU 3 BD:150 EQU 4 BD:300 EQU 5 BD:600 EQU 6 BD:1200 EQU 7 BD:1800 EQU 8 BD:2000 EQU 9 BD:2400 EQU :A BD:3600 EQU :B BD:4800 EQU :C BD:7200 EQU :D BD:9600 EQU :E BD:19200 EQU :F TITL ASYNCH MUX DIB MACRO * * THIS MACRO GENERATES A DIB FOR AN ASYNC MUX CHANNEL * * THE CALLING SEQUENCE IS * * 0 1 2 3 4 5 6 7 8 * D:AC CCDD[,OPTS,DEV,EDT,LPOPTS] * * WHERE 'CCDD' IS THE 4 CHAR IDENTIFIER TO FORM DIB ENTRY * POINT NAME 'D:CCDD'. * A REFERENCE TO CIB NAME 'C:CCDD' WILL BE GENERATED. * THE OPTIONAL 'OPTS' FIELD MAY CONTAIN THE OPTION SPECIFIERS: * * OPT:DC  MEANING, DYNAMICALLY CONFIGURE AT FIRST OPEN * OPT:FA MEANING, LOAD FA: HANDLER * OPT:AB MEANING, REQUEST AUTO-BAUDING DURING CONFIG * OPT:FC MEANING, 1ST CHAR IS FORM CONTROL * * IF MORE THAN ONE OPTION IS TO BE SPECIFIED, THE OPTIONS ARE SEPARATED * BY PLUS (+) SIGNS. * AUTO-BAUDING IS EFFECTIVE AT THE FIRST OPEN ONLY IF DYNAMIC CON- * FIGURATION IS ALSO SPECIFIED. * * THE OPTIONAL 'DEV' FIELD MAY CONTAIN THE FOLLOWING ASYNC MUX * CHANNEL DEVICES: * * TV MEANING CHANNEL IS FOR STANDARD TV USE * LP MEANING CHANNEL IS FOR STANDARD LP USE * NULL MEANING CHANNEL IS GENERAL PURPOSE * * THE OPTIONAL 'EDT' FIELD CONTAINS A HEX REPRESENTATION OF THE * EDIT CHARACTER. THE STANDARD DEFAULT IS ':08'. * * THE OPTIONAL 'LPOPTS' FIELD IS SIGNIFICANT ONLY IF THE 'DEV' FIELD IS * 'LP'. IN THIS CASE THE PARAMETERS IN THIS FIELD HAVE THE SAME FUNCTIONS * AS PARAMETERS 2 IN THE DIB:LP MACRO. * * NON-STANDARD DEVICES CAN BE INTERFACED USING THE GENERAL PURPOSE 'DEV' * OPTION APPROPRIATELY PATCHED USING THE PATCH MACRO. * **********************************************@ ********************** * * THERE IS ALSO AN ENTRY POINT FOR DIB:TV AND DIB:LP. * THEIR CORRESPONDING FORMATS ARE: * * DIB:TV  TVnn[,address],cn[,inta] * * WHERE: TVnn is the name of any device used in this DIB * (e.g. TV00, TV01...) * * address is the device address; default is :F (shifted * with channel number :C6) * * cn is the channel number for this device * * inta is the interrupt vector address specified by the * board switch; default is :C0 * * * DIB:LP LPnn[,cpl][,lpp][,LF:][,spb] * * WHERE: LPnn is the device name (e.g. LP00, LP01) * * cpl is the number of characters per line printed by *  the device plus 1 (format control); default is 81 * * lpp is the number of lines per page printed by the *  device; default is 57. * * LF: specifies that the printer does not have the *  automatic line feed capability; default is * automatic line feed * * spb watchdog timer (shifts per byte). Defines the * number of positions the byte count needs to be *  shifted in order to form the time in seconds for * watchdog timer calculations. Refer to Topic 7.2 *  for details. * D:AC MACRO AC DIB:TV MACENT TY DIB:LP MACENT LP LPOOL O: SET $ TABLE: REL SHARABLE TABLE: SYSTEM NAM D:#(1) ASYNC CHANNEL DIB ENTRY POINT NAME IFT #(0,'LP') D:#(1) CHAN D:#(1,1,3) ENDC IFF #(0,'LP') D:#(1) WORD 0 DI:PER PEER POINTER (NO PEERS) ENDC P2: SET 2 PARAMETER OFFSETS P3: SET 3 P4: SET 4 P5: SET 5 IFT #(0,'AC') P2: SET 5 P3: SET 6 P4: SET 7 P5: SET 8 IFT #(3,'TV') EXTR TYEOL:,TYTOF:,TYELI: ENDC EXTR AC:CNFG DYNAMIC CONFIGURATION ROUTINE ENTRY POINT EXTR AC:FIO FORMATTED I/O ROUTINE ENTRY POINT D:: SET 0 PREPARE FOR DEFAULT 'OPTS' FIELD IFT #(2,?) IF 'OPTS' FIELD EXISTS D:: SET #(2) EVALUATE OPTIONS ENDC WORD D:: ASSEMBLE FLAGWORD ENDC IFT #(0,'TY') EXTR TYEOL:,TYTOF:,TYELI: BIT:WORD DIF:NT,DIF:FC DI:FLG FLAGWORD ENDC IFT #(0,'LP') BIT:WORD DIF:FC EXTR C:#(1,1,3) ENDC IFF #(0,'LP') WORD C:#(1) ENDC IFT #(0,'LP') WORD C:#(1,1,3) ENDC WORD 0 DI:FCB FCB ADDR (NOT USED) BYTE '##(1)' DI:NAM DEVICE NAME WORD 0 WORD 0 IFF #(0,'LP')++#(3,'LP') WORD 0 DI:SPB WATCHDOG SHIFTS/BYTE WORD -1 DI:WBT WATCHDOG BASE TIME (NO WATCHDOG) ENDC IFT #(0,'LP')++#(3,'LP') SPB:: SET -3 DEFAULT SHIFT COUNT IFT #(P5:,?) SHIFT COUNT SPECIFIED? SPB:: SET #(P5:) THEN USE IT! ENDC WORD SPB:: DI:SPB (SHIFTS/BIT) WORD 4*8 DI:WBT WATCHDOG BASE TIME ENDC * O:: SET $ IFT #(0,'AC') TRAILER OF ASYNC MUX DIB WORD -1,-1,0,-1 ALL READ, WRITE, FUNCTION ALLOWED RES 2,0 LAST TWO WORDS OF STANDARD DIB RES 2,0 FIRST TWO WORDS OF AMUX SPECIFIC DIB IFT D::&OPT:DC ASSEMBLE IF DYNAMIC CONFIG CALLED FOR COND AC:FIO,D::&OPT:FA REFERENCE FIO OR SPACER WORD AC:CNFG REFERENCE CONFIGURATOR ENDC IFF D::&OPT:DC ASSEMBLE IF NO CONFIGURATION COND1 AC:FIO,D::&OPT:FA REFERENCE FIO OR ASSEMBLE NOTHING WORD 0 ENDC ENDC ORG O:: IFT #(0,'TY')++#(3,'TV') BIT:WORD FA:,UF: READ BIT:WORD FA:,UF:,WP: WRITE BIT:WORD 0 POSITION BIA T:WORD WF:,TF:,SC:,OP:,CL: FUNCTION RES 2,0 LAST TWO WORDS OF STANDARD DIB WORD 80 DI:CPL - CHARACTERS PER LINE WORD 0 DI:LPP - BOTTOM OF FORMS CT/LINES PER PAGE IFT #(0,'AC') ORG $+2 FIELDS ALREADY PLACED ENDC IFF #(0,'AC') WORD :1618 DI:BMW - BRANCH MODE WORD FOR INPUT WORD :1612 DI:BMO - BRANCH MODE WORD FOR OUTPUT ENDC WORD TYEOL: DI:EOL - POINTER TO EOL SEQUENCE WORD TYTOF: DI:TOF - POINTER TO TOF SEQUENCE WORD :2000 DI:ERM - ERROR MASK FOR STATUS WORD 0 DI:LC - LINE COUNTER IFT #(4,?) IS THE 'EDT' CHAR SPECIFIED? WORD #(4) YES, THEN USE THE SPECIFIED CHAR ENDC IFF #(4,?) IS THE 'EDT' CHAR NOT SPEC'D WORD :08 DI:EDT - DEFAULT EDIT CHARACTER ENDC WORD TYELI: DI:ELI - ADDRESS OF EOL SEQUENCE ON INPUT WORD #(1)BF: DI:BUF - POINTER TO 2 WORD INTERNAL BUF WORD TYEOL: DI:PU - POINTER TO POWER UP SEQUENCE #(1)BF: RES 2,0 TWO WORD INTERNAL BUFFER ENDC IFT #(0,'LP')++#(3,'LP') WORD 0 NO READS BIT:WORD FA:,UF: WRITE FUNCTIONS ALLOWED WORD 0 NO POSITION FUNCTIONS ALLOWED BIT:WORD OP:,CL:,WF:,SC:,TF: ALLOWED OTHER FUNCTIONS LPP: SET 57 LINES/PAGE BOF: SET 3 BOTTOM OF FORMS COUNT (LINES) CPL: SET 81 DEFAULT LINE LENGTH IS 81 CHARS IFT #(P2:,?) CPL: SET #(P2:) ENDC IFT #(P3:,?) LPP: SET #(P3:) ENDC RES 2,0 LAST TWO WORD OF THE STANDARD DIB WORD CPL: DI:CPL - CHARACTERS PER LINE BYTE BOF:,LPP: DI:LPP - BOTTOM OF FORMS CT/LINES PER PAGE IFT #(0,'AC') ORG $+2 FIELDS ALREADY PLACED ENDC IFF #(0,'AC') WORD 0 DI:BMW - BRANCH MODE WORD FOR INPUT WORD :1210 DI:BMO - BRANCH MODE WORD FOR OUTPUT ENDC IFT #(P4:,?) EXTR DPEOL: WORD DPEOL: ENDC IFF #(P4:,?) EXTR LPEOL: WORD LPEOL:  ENDC EXTR LPTOF:,LPPUF: WORD LPTOF: WORD :3202 WORD -LPP: DI:LC - LINE COUNT WORD 0 WORD 0 WORD #(1)BF: DI:BUF - POINTER TO 2 WORD INTERNAL BUFFER WORD LPPUF: DI:PU - POINTER TO POWER UP SEQUENCE #(1)BF: RES 2,0 TWO WORD INTERNAL BUFFER ENDC ORG O: ENDM TITL ASYNCH MUX CIB MACRO * * THIS MACRO GENERATES A CIB FOR AN ASYNC MUX CHANNEL * * THE CALLING SEQUENCE IS: * * C:AC CCDD,DA,CN,IV * * WHERE 'CCDD' IS THE 4 CHAR IDENTIFIER TO FORM CIB ENTRY * POINT NAME 'C:CCDD'. * A REFERENCE TO CIB EXTENSION NAME 'CX:ACDD' WILL * BE GENERATED. * 'DA' IS THE 'DIO' STYLE DEVICE ADDRESS (4 BITS), * 'CN' IS THE CHANNEL NUMBER (0-7), AND 'IV' IS THE INTERRUPT * ADDRESS SET BY THE INTERRUPT VECTOR ADDRESS SWITCH ON THE BOARD * C:AC MACRO AC CIB:TV MACENT TY LPOOL O: SET $ TABLE: REL SHARABLE TABLE: SYSTEM NAM C:#(1) ASYNC CHANNEL CIB EXTR #(0):WRT TRANSMIT DRIVER EXTR #(0):RD RECEIVER DRIVER EXTR #(0):FUN FUNCTION DRIVER C:#(1) CHAN CIB: CI:PER PEER LINK WORD 0 CI:FLG FLAGWORD HEAD CIB: CI:MST MASTER LINK WORD D:#(1) LINK TO DIB (CI:DIB) WORD :7400 CI:PRI REQUEST PRIORITY IFT #(3,?) IF DEVICE ADDRESS AND VECTOR SPECIFIED WORD #(2)%3+#(3)%1 DEVICE ADDR WORD #(4)%-7%4+#(3)%3 CI:IV INTERRUPT VECTOR ADDR ENDC IFF #(3,?) IF NO DEVICE ADDR AND VECTOR SPEC IFT #(0,'AC') NOTE E,'NO DEVICE ADDRESS SPECIFIED FOR ASYNC MUX CIB' ENDC WORD ETIODAD:%3+#(2)%1 CI:DA DEVICE ADDRESS WORD #(2)%3+ETIODIB: CI:IV INTERRUPT VECTOR ENDC WORD 0 CI:UNI RESERVED * * SIMPLY REFER TO ALL DRIVER MAIN ENTRIES SINCE THEY ARE ALL * IN THE SAME CONTROL SECTION AND WILL ALL BE LOADED * WORD #(0):RD READ ENTRY WORD #(0):WRT WRITE ENTRY WOB RD 0 NO POSITION ENTRY WORD #(0):FUN FUNCTION ENTRY INT:SEQ I:EOB INTERRUPT SEQUENCE WORD 0 CI:T1 TEMP WORD 0 CI:T2 TEMP WORD 0 CI:APR REQUESTORS SAVED PRIORITY WORD 0 CI:TIB ADDR OF TIB WORD 1 CI:USM CONTROLLER USAGE SEMA4 WORD 0 CI:TIM WATCHDOG COUNTS WORD 0 CI:CSM COMPLETION SEMA4 WORD 0 CI:CFL COMPLETION FLAG IFT #(0,'AC') WORD CX:AC#(1,3,4) CI:OPT ADDR OF OPT+SPEC CHAR TBL ENDC ORG O: ENDM TITL ASYNCH MUX CHAN OPTION TABLE MACRO * * OPTION TABLE CIB EXTENSION FOR ASYNC MUX CHANNEL * * CALLING SEQUENCE IS: * * CX:AC DD,BAUD,FD:,SPCH * * WHERE 'DD' IS A TWO DIGIT STRING USED TO FORM THE CIB EXTENSION * ENTRY POINT NAME 'CX:ACDD' * 'BAUD' IS THE TERMINAL BAUD RATE * "FD:" SPECIFIES AN OFF-SET VECTOR ON RECIEVE FOR FULL-DUPLEX * OPERATION.(SEE 2.1.8.1 OF 53778-91 ASYNCH MUX REF MAN). * DEFAULT IS NO OFF-SET VECTOR * * "SPCH" DESIGNATES SPECIAL CHARACTERS THAT ARE IGNORED BY * THE DRIVER. DEFAULT IS RUBOUT AND UNDERSCORE (:7F5F). * IF ONLY ONE CHAR IS DESIRED, ENTER IT TWICE (:7F7F). * * CX:AC MACRO LPOOL O: SET $ TABLE: REL SHARABLE TABLE: SYSTEM NAM CX:AC#(1) TABLE ADDR CX:AC#(1) EQU $ START OF CIB EXTENSION IFT #(3,?) ANY OFF-SET SPECIFIED? WORD :23CD FULL-DUPLEX OFFSET ENDC IFF #(3,?) NO OFF-SET SPECIFIED?  WORD :21CD NO OFF-SET ENDC WORD BD:#(2)%8+:3037 IFT #(4,?) WORD #(4) ENDC IFF #(4,?) WORD :7F5F SPECIAL CHAR TABLE, ,_ ENDC ORG O: ENDM TITL MAGTAPE DIB MACRO * DIB MACRO * * DIB:MT #(1) --- #(1) = MTXX, XX = UNIT # * DIB:MT MACRO LPOOL O: SET $ TABLE: REL SHARABLE TABLE: SYSTEM D:#(1) NAM D:#(1) CHAN MT: DI:PER WORD 0 DI:FLG  WORD C:MT0 DI:CIB HEAD Z:#(1) DI:FCB BYTE '##(1)' DI:NAM WORD 0 DI:DN WORD 0 DI:DS WORD -4 DI:SPB WORD 3*8 DI:WBT BIT:WORD FA:,FB:,FS:,DB:,UF: DI:DSW - READ BIT:WORD FA:,FB:,FS:,DB:,WP:,UF: DI:DSW - WRITE BIT:WORD SBF:,SBR:,SKF: DI:DSW - POSITION BIT:WORD RWD:,OFL:,EBL:,EFM:,OP:,CL:,SS:,WF: DI:DSW - FUNCTION RES 2,0 RESERVED WORD 0 DI:BLKCT WORD 0 DI:SERV WORD :0230 DI:BMI WORD :0250 DI:BMO WORD :0240 DI:BMR WORD 0 DI:OWM WORD :0005  DI:TRY WORD 1 DI:VTS WORD 0 DI:MASK WORD 0 DI:FLAG WORD 0 DI:THWS ORG O: ENDM TITL MAGTAPE CIB MACRO *  CIB MACRO * * CIB:MT #(1) -- DEVICE ADDRESS / CHANNEL * #(2) -- INTERRUPT VECTOR * * CIB:MT MACRO * * DEFAULTS FOR MAGTAPE * DVICADD: SET :F0 MT DEFAULT DEVICE ADDRESS CHANNEL: SET :02 MT DEFAULT CHANNEL NUMBER INTVECT: SET :C8 MT DEFAULT INTERRUPT VECTOR LPOOL O: SET $ TABLE: REL SHARABLE TABLE: SYSTEM EXTR MT:RD,MT:WRT,MT:POS,MT:FUN C:MT0 NAM C:MT0 CHAN CIB: CI:PER WORD 0 CI:FLG HEAD CIB: CI:MST HEAD MT: CI:DIB WORD :7600 CI:PRI IFF #(1,?) WORD DVICADD:++CHANNEL: CI:DA - DEFAULT ENDC IFT #(1,?) WORD #(1) CI:DA - USER DEFINED ENDC IFF #(2,?) WORD INTVECT: CI:IV - DEFAULT ENDC IFT #(2,?) WORD #(2) CI:IV - USER DEFINED ENDC WORD 0 CI:UNI WORD MT:RD CI:RD WORD MT:WRT CI:WRT WORD MT:POS CI:POS WORD MT:FUN CI:FUN INT:SEQ I:EOB CI:EOB DOUBLE 0 CI:T1,CI:T2 WORD 0 CI:APR WORD 0 CI:TIB WORD 1 CI:USM WORD 0 CI:TIM WORD 0 CI:CSM WORD 0 CI:CFL WC ORD 0 CI:RAT/CI:RTY WORD 0 CI:HRD WORD -720 CI:CNT WORD -2 CI:TIC WORD 0 CI:MODE ORG O: ENDM TITL BISYNC PICO DIB MACRO * * BISYNC PICO DIB MACRO * DIB:BP MACRO LPOOL O: SET $ TABLE: REL  TITL BISYNC PICO DRIVER EQUATES (93420-11-E200) * ************************************************************************ * REVISION HISTORY * REV LEVEL DATE DESCRIPTION * E200 80/12/04 M.DILKS-REA10172-ADDED SYSTEM DIRECTIVE, * SHARABLE ATTRIBUTE, AND PUT INTO * TABLE: SEGMENT. *  E200 80/12/04 M.DILKS-ADDED REVISION HISTORY. * ************************************************************************* * * DEVICE EQUATES * BRCMD: EQU :0200 BRANCH COMMAND RSCMD: EQU :0100 RESET COMMAND SMCMD: EQU :0400 SET MODE COMMAND * OP:RE EQU :06 RECEIVE BUFFER COMMAND OP:WR EQU :03 TRANSMIT BUFFER (RESET BCC IS PLUS 1) OP:WS EQU :02 TRANSMIT CONTROL CHARACTER OP:LO EQU :01 LOAD OPTION TABLE OP:DO EQU :09 DUMP OPTION TABLE OP:TR EQU :11 CONTROL DATA TERMINAL READY OP:CU  EQU :19 CONFIGURE USART OP:WC EQU :21 WAIT FOR INCOMING CALL OP:RL EQU :29 READ EIA SIGNAL LEVELS * BCBEI: EQU :F%7 END OF MESSAGE INDEX MASK * EI:EOT EQU :00 ENDING INDEX VALUE FOR "EOT" EI:ENQ EQU :01 "ENQ" EI:NACK EQU :02 "NACK" EI:ACK0 EQU :03 "ACK0" EI:ACK1 EQU :04 "ACK1" EI:WACK EQU :05 "WACK" EI:RVI EQU :06 "RVI" EI:TTD EQU :07  "TTD" EI:DET EQU :08 "DLE-EOT" EI:ITB EQU :09 "ITB" EI:ETB EQU :0A "ETB" EI:ETX  EQU :0B "ETX" EI:EOH EQU :0D "END OF HEADING" EI:FSS EQU :0E "FAST SELECT SEQUENCE" EI:BUF EQU :0F "END OF BUFFER" * BCBSI: EQU :3%11 START OF MESSAGE INDEX MASK * SI:NO EQU :00  ENDING INDEX VALUE FOR NO STARTING CONTROL SI:SOH EQU :01 "SOH" SI:STX EQU :02 "STX" SI:STT EQU :03 "DLE-STX" * C:EOT EQU :00 CONTROL CHARACTER INDEX FOR "EOT" C:ENQ EQU :01  "ENQ" C:NACK EQU :02 "NACK" C:ACK0 EQU :03 "ACK0" C:ACK1 EQU :04 "ACK1" C:WACK EQU :05 "WACK" C:RVI EQU :06 "RVI" C:TTD EQU :07 "TTD" * BSY: EQU :1  STATUS BIT NUMBER FOR "BUSY" ERR: EQU :0 STATUS BIT NUMBER FOR "ERROR" * D:EOT EQU :01 ERROR INDEX FOR "EOT FAILED PAD CHECK" D:NAK EQU :02 "NACK FAILED PAD CHECK" D:ENQ EQU :03 "MESSAGE ABORTED WITH ENQ" D:BCC EQU :04 "BCC ERROR" D:ICC EQU :05 "ILLEGAL CONTROL CHARACTER" D:ROV EQU :0A "RECEIVE OVERRUN" D:LOV EQU :0E "LEADING GRAPHICS OVERRUN" D:INV EQU :0F "INVALID COMMAND" D:IBC EQU :19 "BCC ERROR ON ITB RECORD" * SPACE 1 * * BCB EQUAD TES * BCB:LK EQU 0 LINK TO NEXT BCB ON CHAIN BCB:BA EQU 1 I/O BUFFER ADDRESS BCB:RC EQU 2 REQUEST COUNT BCB:AC EQU 3 ACTUAL COUNT PROCESSED BCB:FC EQU 4 FUNCTION CODE BCB:ST EQU 5 COMPLETION STATUS * RE:B EQU 0 READ BUFFER "OPERATION CODE" WR:B EQU 1  WRITE BUFFER "OPERATION CODE" WS:B EQU 2 WRITE SUPERVISORY SEQUENCE "OPERATION CODE" * CM:B EQU  14 "OPERATION COMPLETION" FLAG BIT ER:B EQU 15 "TERMINATION STATUS" FLAG BIT FF:B EQU 13  "FINAL" FLAG BIT * BCBCM: EQU 1%CM:B "OPERATION COMPLETION" FLAG MASK BCBER: EQU 1%ER:B "TERMINATION STATUS" FLAG MASK BCBFF: EQU 1%FF:B "FINAL" FLAG MASK * CF:B EQU 15 "CONTINUE" FLAG FOR READ OPERATIONS RC:B EQU 14 "RESET BCC" FLAG FOR SY:B EQU 13 "SEND SYNCS" FLAG FOR WRITE OPERATIONS MA:B EQU 12 "MATCH ADDRESS" FLAG FOR READ SB:B EQU 11 "SECOND BYTE" FLAG FOR READ/WRITE DL:B EQU 3 "TRANSMIT DLE" FLAG FOR WRITE SUPERVISORY * CF:BCB EQU 1%CF:B BIT MASKS FOR ABOVE FLAGS RC:BCB EQU 1%RC:B SY:BCB EQU 1%SY:B SB:BCB EQU 1%SB:B MA:BCB EQU 1%MA:B C:DDLE EQU 1%DL:B * LC:NO  EQU 0 NO LEADING CONTROL CHARACTER LC:SH EQU 1%2 "SOH" LEADING CONTROL CHARACTER LC:ST EQU  2%2 "STX" LEADING CONTROL CHARACTER LC:TT EQU 3%2 "DLE-STX" LEADING CONTROL CHARACTER * TC:NO EQU 0 NO TRAILING CONTROL CHARACTER TC:IB EQU 1 "ITB" TRAILING CONTROL CHARACTER TC:EB EQU 2 "ETB" TRAILING CONTROL CHARACTER TC:EX EQU 3 "ETX" TRAILING CONTROL CHARACTER * SPACE 1 * * BCB GENERATION MACRO * BCB MACRO LPOOL O: SET $ TABLE: REL SHARABLE TABLE: SYSTEM IFT #?<6 NOTE 5,'NOT ENOUGH PARAMETERS' ENDC #(1) WORD #(2) LINK TO NEXT BCB ON CHAIN WORD #(3) I/O BUFFER ADDRESS WORD #(4) REQUEST COUNT WORD 0 ACTUAL COUNT (RETURNED BY DRIVER) V: SET #(5)%4++#(6) IFT #?>6 V: SET #(7)%6++V: IFT #?>7 V:  SET V:++#(8) IFT #?>8 V: SET V:++#(9) IFT #?>9 V: SET V:++#(10) IFT #?>10 V: SET V:++#(11) ENDC ENDC ENDC ENDC ENDC WORD V:  FUNCTION CODE WORD 0 COMPLETION STATUS (RETURNED BY DRIVER) ORG O: ENDM * SPACE 1 * SAVE END SET #(5)%4++#(6) IFT #?>6 V: SET #(7)%6++V: IFT #?>7 V:  SET V:++#(8) IFT #?>8 V: SET V:++#(9) IFT #?>9 V: SET V:++#(10) IFT STT EQU :03 "DLE-STX" * C:EOT EQU :00 CONTROL CHARACTER INDEX FOR "EOT" C:ENQ EQU :01  "ENQ" C:NACK EQU :02 "NACK" C:ACK0 EQU :03 "ACK0" C:ACK1 EQU :04 "ACK1" C:WACKE  EQU :05 "WACK" C:RVI EQU :06 "RVI" C:TTD EQU :07 "TTD" * BSY: EQU :1  STATUS BIT NUMBER FOR "BUSY" ERR: EQU :0 STATUS BIT NUMBER FOR "ERROR" * D:EOT EQU :01 ERROR INDEX FOR "EOT FAILED PAD CHECK" D:NAK EQU :02 "NACK FAILED PAD CHECK" D:ENQ EQU :03 "MESSAGE ABORTED WITH ENQ" D:BCC EQU :04 "BCC ERROR" D:ICC EQU :05 "ILLEGAL CONTROL CHARACTER" D:ROV EQU :0A "RECEIVE OVERRUN" D:LOV EQU :0E "LEADING GRAPHICS OVERRUN" D:INV EQU :0F "INVALID COMMAND" D:IBC EQU :19 "BCC ERROR ON ITB RECORD" * SPACE 1 * * BCB EQUATES * BCB:LK EQU 0 LINK TO NEXT BCB ON CHAIN BCB:BA EQU 1 I/O BUFFER ADDRESS BCB:RC EQU 2 REQUEST COUNT BCB:AC EQU 3 ACTUAL COUNT PROCESSED BCB:FC EQU 4 FUNCTION CODE BCB:ST EQU 5 COMPLETION STATUS * RE:B EQU 0 READ BUFFER "OPERATION CODE" WR:B EQU 1  WRITE BUFFER "OPERATION CODE" WS:B EQU 2 WRITE SUPERVISORY SEQUENCE "OPERATION CODE" * CM:B EQU  14 "OPERATION COMPLETION" FLAG BIT ER:B EQU 15 "TERMINATION STATUS" FLAG BIT FF:B EQU 13  "FINAL" FLAG BIT * BCBCM: EQU 1%CM:B "OPERATION COMPLETION" FLAG MASK BCBER: EQU 1%ER:B "TERMINATION STATUS" FLAG MASK BCBFF: EQU 1%FF:B "FINAL" FLAG MASK * CF:B EQU 15 "CONTINUE" FLAG FOR READ OPERATIONS RC:B EQU 14 "RESET BCC" FLAG FOR SY:B EQU 13 "SEND SYNCS" FLAG FOR WRITE OPERATIONS MA:B EQU 12 "MATCH ADDRESS" FLAG FOR READ SB:B EQU 11 "SECOND BYTE" FLAG FOR READ/WRITE DL:B EQU 3 "TRANSMIT DLE" FLAG FOR WRITE SUPERVISORY * CF:BCB EQU 1%CF:B BIT MASKS FOR ABOVE FLAGS RC:BCB EQU 1%RC:B SY:BCB EQU 1%SY:B SB:BCB EQU 1%SB:B MA:BCB EQU 1%MA:B C:DDLE EQU 1%DL:B * LC:NO  EQU 0 NO LEADING CONTROL CHARACTER LC:SH EQU 1%2 "SOH" LEADING CONTROL CHARACTER LC:ST EQU  2%2 "STX" LEADING CONTROL CHARACTER LC:TT EQU 3%2 "DLE-STX" LEADING CONTROL CHARACTER * TC:NO EQU 0 NO TRAILING CONTROL CHARACTER TC:IB EQU 1 "ITB" TRAILING CONTROL CHARACTER TC:EB EQU 2 "ETB" TRAILING CONTROL CHARACTER TC:EX EQU 3 "ETX" TRAILING CONTROL CHARACTER * SPACE 1 * * BCB GENERATION MACRO * BCB MACRO LPOOL O: SET $ TABLE: REL SHARABLE TABLE: SYSTEM IFT #?<6 NOTE 5,'NOT ENOUGH PARAMETERS' ENDC #(1) WORD #(2) LINK TO NEXT BCB ON CHAIN WORD #(3) I/O BUFFER ADDRESS WORD #(4) REQUEST COUNT WORD 0 ACTUAL COUNT (RETURNED BY DRIVER) V: SET #(5)%4++#(6) IFT #?>6 V: SET #(7)%6++V: IFT #?>7 V:  SET V:++#(8) IFT #?>8 V: SET V:++#(9) IFT #?>9 V: SET V:++#(10) IFT F #?>10 V: SET V:++#(11) ENDC ENDC ENDC ENDC ENDC WORD V:  FUNCTION CODE WORD 0 COMPLETION STATUS (RETURNED BY DRIVER) ORG O: ENDM * SPACE 1 * SAVE END SET #(5)%4++#(6) IFT #?>6 V: SET #(7)%6++V: IFT #?>7 V:  SET V:++#(8) IFT #?>8 V: SET V:++#(9) IFT #?>9 V: SET V:++#(10) IFT  TITL RTX.MAC - RTX USER EQUATES & MACROS (93421-15-E200) TITL .... C O N T E N T S *************** * * * RTX.MAC * * * *************** * * MISCELLANEOUS EQUATES * EDB EXCEPTION VECTOR EQUATES * BGIN:(A) MACRO * ECB:(A) MACRO * EDXVT:(A) MACRO * INIT:(A) MACRO * MAIL:(A) MACRO * MDB:(A) MACRO * SINGL: MACRO * SDB:(A) MACRO * TDB:(A) MACRO * TICK:(A) MACRO * WALL:(A) MACRO ***************************************************************************** * * REVISION HISTORY: * * REV E200 - CHANGED ECB MACRO TO ALLOW FOR AN EXTERNAL PARAMETER; * IN PARTICULAR, THE EMP: AND EMPSIZE: PARAMETERS IN * THE CONFIGURATION FILE. * CWK 06/AUG/82. * ***************************************************************************** TITL .... M I S C E L L A N E O U S E Q U A T E S * SYSTEM FREE POOL BLOCK SIZE * BLKSZ: EQU 12 (DUPPED IN RTXD.MAC) * * INTERNAL BLOCK CHECK VALUE EQUATES * IN:CHK EQU :F00E INIT CHECK VALUE (IN IN:AID) 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 UAT CHECK VALUE (WORD 0) (DUPPED IN IOS.MAC) TITL .... E D B E X C E P T V E C T O R E Q U A T E S * EDB EXCEPTION VECTOR EQUATES * * THE FOLLOWING XV:????? EQUATES SPECIFY LOCATIONS IN THE * EXCEPTION VECTOR OF THE ENVIRONMENT DESCRIPTOR BLOCK * 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 STRAP 0 EXCEPTION XV:DOREX EQU :A DOOR SERVICE EXCEPTION XV:RTXEX EQU :B RTX SYSTEM ERROR * * 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 .... B G I N : ( A ) M A C R O ** MACRO: BGIN: & BGIN:A * GENERATE A PARAMETER BLOCK FOR AN R:BGIN CALL * * CALLING SEQUENCE: LABEL BGIN:(A) TASK,PRI * BGIN:(A) LABEL,TASK,PRI (ARCHAIC) * LABEL = ADDRESS OF PARAMETER BLOCK * TASK = ADDRESS OF TDB * PRI = TASK PRIORITY ** SPACE 2 BGIN: MACRO BGIN:A MACENT P: SET 2 L: SET #(?) IFF #(-G 1,?) L: SET L:-1 #(1) BGIN:: #(2),#(3) ENDC * BGIN:: MACENT IFT #(-1,?) WORD #(1) TCB ADDRESS WORD #(2) PRIORITY IFF L:=P: NOTE E,'INCORRECT NUMBER OF PARAMETERS' ENDC ENDC ENDM TITL .... E C B : ( A ) M A C R O ** MACRO: ECB: & ECB:A * GENERATE AN ENVIRONMENT CONTROL BLOCK * * CALLING SEQUENCE: LABEL ECB:(A) UAT,(PEADD),(MPADD,MPLEN) * ECB:(A) LABEL,UAT,(PEADD),(MPADD,MPLEN) (ARCHAIC) * LABEL = ADDRESS OF PARAMETER BLOCK *  UAT = ADDRESS OF UNIT ASSIGNMENT TABLE * PEADD = ADDRESS OF END OF PROGRAM * MPADD = USER SPECIFIED MEMORY POOL ADDRESS * MPLEN = USER SPECIFIED MEMORY POOL LENGTH ** SPACE 2 ECB: MACRO MACLAB ECB:A MACENT MACLAB P: SET 1 L: SET #(?) IFF #(-1,?) L: SET L:-1 #(1) ECB:: #(2),#(3),#(4),#(5) ENDC * ECB:: MACENT MACLAB IFT #(-1,?) LPOOL O: SET $ SHARABLE TABLE: TABLE: REL #(-1) NAM #(-1) CHAN R:ECBL ED:PER - PEER LINK WORD 0 EC:FLG - FLAG WORD WORD #(-1) EC:EDB - ENVIRONMENT DESCRIPTOR BLOCK WORD 1 EC:LUS - LUN SEMAPHORE (ALIAS EC:PRV) RES 2,0 WORDS 4-5 RESERVED  WORD 0 EC:CNT - NUMBER OF ACTIVITIES WORD 0 EC:ALH - ACB LIST HEAD WORD 0 EC:SUB - SUBORDINATE LIST HEAD WORD 0 EC:MST - MASTER ENVIRONMENT WORD 0 EC:NEC - NECESSARY ENVIRONMENT WORD EC:CHK EC:CKW - CHECK WORD WORD 16 ED:EVO - EXCEPTION VECTOR OFFSET WORD 48 ED:MRO - MAP REGISTER OFFSET RES 2,0 WORDS 14-15 RESERVED RES 16,0 ED:EVT - EXCEPTION VECTOR TABLE WORD #(1) ED:UAT - UNIT ASSIGNMENT TABLE WORD 0 ED:LMA - LOW MEMORY ADDRESS IFT #(2,?) P: SET P:+1 ENDC IFT #(2,?) WORD #(2) ED:MPA - USER SPECIFIED MEMORY POOL ADDRESS ENDC IFF #(2,?) WORD 0 ED:MPA - DEFAULT MEMORY POOL ADDRESS ENDC WORD 0 ED:HMA - HIGH MEMORY ADDRESS WORD 0 ED:EUS - ENVIROMENT USAGE SEMAPHORE WORD :7FFF ED:PRI - MAXIMUM PRIORITY HEAD R:TDBL ED:TLH - TASK LIST HEAD HEAD R:SL ED:SLH - SEMAPHORE LIST HEAD HEAD R:MBXL ED:MLH - MAILBOX LIST HEAD IFF #(3,?) WORD 0 ED:UMPA - USER MEMORY POOL ADDRESS ENDC IFT #(3,?) WORD #(3) ED:UMPA - USER MEMORY POOL ADDRESS ENDC IFF #(4,?) WORD 0 ED:MPL - USER MEMORY POOL LENGTH ENDC IFT #(4,?) WORD #(4) ED:MPL - USER MEMORY POOL LENGTH ENDC IFT #(3,?)+#(4,?) P: SET P:+2 IFF #(3,?) NOTE E,'MUST SPECIFY MEMORY POOL ADDRESS' ENDC IFF #(4,?) NOTE E,'MUST SPECIFY MEMORY POOL LENGTH' ENDC ENDC RES 1,0 WORD 43 IS RESERVED RES 1,0 NUMBER OF TASK ACTIVITY RES 1,0 TDB OF INITIAL TASK RES 1,0 PRIORITY OF INITIAL ACTIVITY RES 1,0 ID OF INITIAL ACTIVITY RES 1,0 MAP OF REGISTER TABLE IFF L:>=P: NOTE E,'INCORRECT NUMBER OF PARAMETERS' ENDC ORG O: ENDC ENDM TITL .... E D X V T : ( A ) M A C R O ** MACRO: EDXVT: & EDXVT:A * GENERATES ENTRIES IN THE EXCEPTION VECTOR TABLE OF THE EDB * THE EXCEPTION ADDRESS SPECIFIED WILL BE JUMPED TO IF THE * SPECIFIED EXCEPTION OCCURS * * CALLING SEQUENCE: EDXVT:(A) ECB,EXCEPT,EXPADD * *  ECB = ADDRESS OF ENVIRONMENT CONTROL BLOCK * EXCEPT = EXCEPTION VECTOR OFFSET * EXPADD = ADDRESS OF EXCEPTION PROCESSOR * * NOTE: CALLS TO THIS MACRO MUST ALL FOLLOW THE CALL TO THE ECB:(A) * MACRO ** SPACE 2 ED:EVT EQU 16 EXCH EPTION VECTOR TABLE (DUPPED IN RTXD.MAC) * EDXVT: MACRO EDXVT:A MACENT P: SET 3 * LPOOL O: SET $ SAVE LOCATION COUNTER  ORG #(1)+ED:EVT+#(2) ORG INTO EDB WORD #(3) INSERT EXCEPTION PROCESSOR ADDRESS ORG O: ORG BACK TO WHERE WE WERE IFF #(?)=P: NOTE E,'INCORRECT NUMBER OF PARAMETERS' ENDC ENDM TITL .... I N I T : ( A ) M A C R O ** MACRO: INIT: & INIT:A * GENERATE AN ENVIRONMENT INITIALIZATION BLOCK * * CALLING SEQUENCE: * INIT:(A) AR,QR,XR,YR,ECB,TDB,PRI,(FPAMT,(FPADD)), * (EMADD) * * AR = INITIAL CONTENTS OF A REGISTER * QR = " "  " Q " * XR = " " " X " * YR = " " " Y " * ECB = ADDRESS OF ENVIRONMENT CONTROL BLOCK * TDB = ADDRESS OF TASK DESCRIPTOR BLOCK * PRI = PRIORITY OF TASK ACTIVATION * FPAMT = AMOUNT OF FREE POOL SPACE (WORDS) * FPADD = ADDRESS OF FREE POOL * EMADD = ADDRESS OF TOP OF MEMORY ** SPACE 2 INIT: MACRO INIT:A MACENT LPOOL O: SET $ SHARABLE TABLE: TABLE: REL P: SET 7 LOAD RTX: R:INIT NAM R:INIT WORD #(1)  IN:A - INITIAL A REGISTER WORD #(2) IN:Q - INITIAL Q REGISTER WORD #(3) IN:X - INITIAL X REGISTER WORD #(4) IN:Y - INITIAL Y REGISTER WORD #(5) IN:ECB - ECB ADDRESS WORD #(6) IN:TDB - TDB ADDRESS WORD #(7)**:7FFF IN:PRI - INITIAL ACTIVITY PRIORITY WORD IN:CHK IN:AID - CHECK WORD * IFT #(8,?) WORD #(8) IN:FPL - USER SPECIFIED FREEPOOL LENGTH P: SET P:+1 ENDC IFF #(8,?) WORD BLKSZ:*4 IN:FPL - DEFAULT FREEPOOL LENGTH ENDC * A: SET #(9,?) DEFAULT FPADD IF NOT SPECIFIED... IFT A:=1 OR IF '0' SPECIFIED A: SET '##(9)'<>'0' ENDC IFT A: WORD #(9) IN:FPA - USER FREE POOL ADDRESS Y: SET 0 P: SET P:+1 IFF #(8,?) NOTE E,'MUST SPECIFY AMOUNT OF FREE POOL = #(8)' ENDC ENDC IFF A: Y: SET BLKSZ:*4 S: SYMATT #(8) IFF S:**:0040 IF FPAMT NOT NULL... IFT S:=:8000 IF FPAMT IS ABSOLUTE... Y: SET #(8) ENDC IFF S:=:8000 IF FPAMT IS SOMETHING ELSE... NOTE E,'FPAMT MUST BE ABSOLUTE IF FPADD IS DEFAULTED' Y: SET 0 ENDC ENDC  WORD $+2 IN:FPA - DEFAULT FREE POOL ADDRESS (AFTER INIT BLOCK) ENDC * IFT #(10,?) P: SET P:+1 WORD #(10) IN:EOM - USER SPECIFIED END OF MEMORY ADDRESS ENDC IFF #(10,?) WORD 0 IN:EOM - DEFAULT END OF MEMORY ADDRESS ENDC * IFT Y:  RES Y:,:8080 RESERVE DEFAULT FREE POOL ENDC * IFF #(?)>=P: NOTE E,'INCORRECT NUMBER OF PARAMETERS' ENDC ORG O:  ENDM TITL .... M A I L : ( A ) M A C R O ** MACRO: MAIL: & MAIL:A * GENERATE A PARAMETER BLOCK FOR MAILBOX SERVICES * * CALLING SEQUENCE: LABEL MAIL:(A) BOXID,(ENVID) * MAIL:(A) LABEL,BOXID,(ENVID) (ARCHAIC) * LABEL = ADDRESS OF PARAMETER BLOCK * BOXID = MAILBOX IDENTIFIER * ENVID = ENVIRONMENT IDENTIFIER ** SPACE 2 MAIL: MACRO MAIL:A MACENT P: SET 1 L: SET #(?) IFF #(-1,?) L: SET L:-1 #(1) MAIL:: #(2),#(3) ENDC * MAIL:: MACENT IFT #(-1,?) IFT #(2,?) P: SET P:+1 ENDC WORD #(2)+0 ENVIRONMENT IDENTIFIER WORD #(1) MAILBOX IDENTIFIER IFF L:>=P: NOTE E,'INCORRECT NUMBER OF PARAMETERS' ENDC ENDC ENDM TITL .... M D B : ( A ) M A C R O ** MACRO: MI DB: & MDB:A * GENERATE A MAILBOX DESCRIPTOR BLOCK * * CALLING SEQUENCE: (LABEL) MDB:(A) BOXID,(ENVID) * * BOXID = MAILBOX IDENTIFIER * ENVID = ENVIRONMENT IDENTIFIER ** SPACE 2 MDB: MACRO MACLAB MDB:A MACENT MACLAB LPOOL O: SET  $ SHARABLE TABLE: TABLE: REL P: SET 1 IFT #(-1,?) NAM #(-1) ENDC #(-1) CHAN R:MBXL MD:PER - PEER LINK WORD 0 MD:FLG - FLAG WORD WORD 1 MD:MBX - MAILBOX USAGE SEMAPHORE WORD 0 MD:MSG - MESSAGE SIGNALLING SEMAPHORE DOUBLE 0 MD:A,MD:Q - 32-BIT MESSAGE RES 3,0 WORDS 6-8 RESERVED IFT #(2,?) P: SET P:+1 ENDC WORD #(2)+0 MD:ECB - ENVIRONMENT IDENTIFIER WORD #(1) MD:ID - MAILBOX IDENTIFIER WORD MD:CHK MD:CHW - MDB CHECKWORD IFF #(?)>=P: NOTE E,'INCORRECT NUMBER OF PARAMETERS' ENDC ORG O: ENDM TITL .... S I N G L : M A C R O ** MACRO: SINGL: * GENERATE A CANNED INIT BLOCK AND TASK DESCRIPTOR BLOCK, * (USER'S ECB MUST BE CALLED R:ECB1) * * CALLING SEQUENCE: (LABEL) SINGL: EXADD,STAMT,STREG * EXADD = EXECUTION ADDRESS OF INITIAL TASK * STAMT = AMOUNT OF STAMT TO ALLOCATE * STREG = INITIAL STATUS REGISTER ** SPACE 2 SINGL: MACRO EXTR R:ECB1 P: SET 3 INIT: 0,0,0,0,R:ECB1,R:TSK1,100,4*BLKSZ: R:TSK1 TDB:A #(1),0,R:STK1,#(2),#(3) R:STK1 RES #(2),0 LOAD UAT:S IFF #(?)=P: NOTE E,'INCORRECT NUMBER OF PARAMETERS' ENDC ENDM TITL .... S D B : ( A ) M A C R O ** MACRO: SDB: & SDB:A * GENERATE A SEMAPHORE DESCRIPTOR BLOCK * * CALLING SEQUENCE: LABEL SDB:(A) (VALUE),(FLAGS) * SDB:(A) LABEL,(VALUE),(FLAGS) (ARCHAIC) * LABEL = ADDRESS OF SEMAPHORE DESCRIPTOR BLOCK * VALUE = INITIAL VALUE OF SEMAPHORE (0 <= VALUE <= 255) * FLAGS = INITIAL VALUE OF FLAGS (NONE CURRENTLY DEFINED) ** SPACE 2 SDB: MACRO MACLAB SDB:A MACENT MACLAB P: SET 0 L: SET #(?) IFF #(-1,?) L: SET L:-1 #(1) SDB:: #(2),#(3) ENDC * SDB:: MACENT MACLAB IFT #(-1,?) LPOOL O: SET $ SHARABLE TABLE: TABLE: REL CHAN R:SL SD:PER - PEER LINK IFT #(1,?) P: SET P:+1 ENDC IFT #(2,?) P: SET P:+1 ENDC  WORD #(1)+0++#(2)+0 SD:FLG - FLAGS & INITIAL VALUE NAM #(-1) #(-1) WORD #(1)+0 SD:SEM - VALUE FOR WAITING TASK WORD SD:CHK SD:CKW - SDB CHECKWORD IFF L:>=P: NOTE E,'INCORRECT NUMBER OF PARAMETERS' ENDC ORG O: ENDC ENDM TITL .... T D B : ( A ) M A C R O ** MACRO: TDB: & TDB:A * GENERATE A TASK DESCRIPTOR BLOCK * * CALLING SEQUENCE: * LABEL TDB:(A) EXADD,YSCRA,STACK,STAMT,(FLAGS),(COACT),(SEMA4) * TDB:(A) LABEL,EXADD,YSCRA,STACK,STAMT,(FLAGS),(COACT), * (SEMA4) (ARCHAIC) * * LABEL = ADDRESS OF TASK DESCRIPTOR BLOCK * EXADD = EXECUTION ADDRESS * YSCRA = AMOUNT OF Y-SCRATCH TO ALLOCATE * "*" INDICATES MULTI-TASKING TEMPLATE EXPANSION * STACK = ADDRESS OF STACK * STAMT = AMOUNT OF STACK TO ALLOCATE * FLAGS = NONE DEFINED * COACT = NUMBER OF CONCURRENT EXECUTIONS * SEMA4 = CONCURRENCY SEMAPHORE ADDRESS (MUST BE SET AT RUNTIME) ** SPACE 2 TDB: MACRO MACLAB TDB:A MACENT MACLAB P: SET 4 L: SET #(?) IFF #(-1,?) L: SET L:-1 #(1) TDB:: #(2),#(3),#(4),#(5),#(6),#(7),#(8) ENDC * TDB:: MACENTJ  MACLAB IFT #(-1,?) LPOOL O: SET $ SHARABLE TABLE: TABLE: REL #(-1) NAM #(-1) IFT #(5,?) P: SET P:+1 ENDC CHAN  R:TDBL TD:PER - PEER LINK IFF #(2,?)=1&#(2,'*') IF NO MULTI-TASKING WORD 0 TD:FLG - FLAG WORD ENDC IFT #(2,?)=1&#(2,'*') IF MULTI-TASKING WORD :8000 TD:FLG - MULTI-TASKING BIT SET ENDC A: SET 1 DEFAULT CONCURRENT EXECUTIONS IFT #(6,?) A:  SET #(6) USER SPECIFIED CONCURRENT EXECUTIONS P: SET P:+1 ENDC IFT #(7,?) WORD #(7) TD:USA - USER SPECIFIED CONCURRENCY SEMAPHORE ADDRESS P: SET P:+1 ENDC IFF #(7,?) WORD $+6 TD:USA - DEFAULT CONCURRENCY SEMAPHORE ADDRESS ENDC WORD A: TD:NOX - CONCURRENT EXECUTIONS IFF #(2,?)=1&#(2,'*') IF NO MULTI-TASKING WORD #(2)+0 TD:Y - Y SCRATCHPAD ALLOCATION  ENDC IFT #(2,?)=1&#(2,'*') IF MULTI-TASKING TASK #(-1) DECLARE TASK TEMPLATE #(-1) TD:Y - POINTER TO TEMPLATE LOAD R:TMPL TEMPLATE PROCESSOR ENDC WORD #(3)+0 TD:AD - STACK ADDRESS WORD #(4) TD:AMT - STACK ALLOCATION WORD #(1) TD:P - EXECUTION ADDRESS WORD A: TD:CSA - DEFAULT CONCURRENCY SEMAPHORE RES 2,0 WORDS 9-10 RESERVED WORD TD:CHK TD:CKW - TDB CHECKWORD IFF L:>=P: NOTE E,'INCORRECT NUMBER OF PARAMETERS' ENDC ORG O: ENDC ENDM TITL .... T I C K : ( A )  M A C R O ** MACRO: TICK: & TICK:A * GENERATE A PARAMETER BLOCK FOR TICK CLOCK SERVICES * * CALLING SEQUENCE2 * LABEL TICK2(A) TIMAD,SEMA4,TICKS,(ENVID) * TICK:(A) LABEL,TIMID,SEMA4,TICKS,(ENVID) (ARCHAIC) * * LABEL = ADDRESS OF PARAMETER BDOCK * TIMID = TIMER IDENTIFIER * SEMA4 = ADDRESS OF SEMAPHORE * TICKS = TICK COUNT * ENVID = ENVIRONMENT IDENTIFIER ** SPACE 2 TICK: MACRO TICK:A MACENT P: SET 3 L: SET #(?) IFF #(-1,?) L: SET L:-1 #(1) TICK:: #(2),#(3),#(4),#(5) ENDC * TICK:: MACENT IFT #(-1,?) IFT #(4,?) P: SET P:+1 ENDC WORD #(4)+0 ENVIRONMENT IDENTIFIER WORD #(1) TIMER IDENTIFIER WORD #(2) SEMAPHORE WORD #(3) TICK COUNT IFF L:>=P: NOTE E,'INCORRECT NUMBER OF PARAMETERS' ENDC ENDC ENDM TITL .... W A L L : ( A ) M A C R O ** MACRO: WALL: & WALL:A * GENERATE A PARAMETER BLOCK FOR WALL CLOCK SERVICES * * CALLING SEQUENCE: * LABEL WALL:(A) TIMID,SEMA4,HITOD,LOTOD,(ENVID) *  WALL:(A) LABEL,TIMID,SEMA4,HITOD,LOTOD,(ENVID) (ARCHAIC) * * LABEL = ADDRESS OF PARAMETER BLOCK * TIMID = TIMER IDENTIFIER * SEMA4 = ADDRESS OF SEMAPHORE * HITOD = HI-ORDER TIME OF DAY * LOTOD = LO-ORDER TIME OF DAY *  ENVID = ENVIRONMENT IDENTIFIER ** SPACE 2 WALL: MACRO WALL:A MACENT P: SET 4 L: SET #(?) IFF #(-1,?) L: SET L:-1 #(1) WALL:: #(2),#(3),#(4),#(5),#(6) ENDC * WALL:: MACENT IFT #(-1,?) IFT #(5,?) P: SET P:+1 ENDC WORD #(5)+0  ENVIRONMENT IDENTIFIER WORD #(1) TIMER IDENTIFIER WORD #(2) SEMAPHORE ADDRESS WORD #(3) HI-ORDER TIME OF DAY WORD #(4) LO-ORDER TIME OF DAY IFF L:>=P: NOTE E,'INCORRECT NUMBER OF PARAMETERS' ENDC ENDC ENDM SPACE 3 SAVE END ENVID = ENVIRONMENT IDENTIFIER ** SPACE 2 WALL: MACRO WALL:A MACENT P: SET 4 L: SET #(?) IFF #(-1,?) L: SET L:-1 #(1) WALL:: #(2),#(3),#(4),#(5),#(6) ENDC * WALL:: MACENT IFT #(-1,?) IFT #(5,?) P: SET P:+1 ENDC WORD #(5)+0 K  ENVIRONMENT IDENTIFIER WORD #(1) TIMER IDENTIFIER WORD #(2) SEMAPHORE ADDRESS WORD #(3) HI-ORDER TIME OF DAY WORD #(4) LO-ORDER TIME OF DAY IFF L:>=P: NOTE E,'INCORRECT NUMBER OF PARAMETERS' ENDC ENDC ENDM SPACE 3 SAVE ENIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIL IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII