ASMB,R,Q,C HED RTE IV B CONFIGURATOR 92067-16516 * NAME: $CNFG * SOURCE: 92067-18114 * RELOC: PART OF 92067-16516 * PGMR: S.K.,D.J.V.,J.M.N * * *************************************************************** * * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980. ALL RIGHTS * * * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, * * * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT* * * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. * * *************************************************************** * NAM $CNFG,16 92067-1X114 REV.2040 800730 IN REL 92067-16516 * SUP ENT $CNFG,$EXIT,$PCHN,$WRRD,$USRS,$ABDP,$SMTB ENT $TRTB,$TREN,$NPGQ,$GDPG,$SAVE * EXT $SBTB,$OSAM,$SSCT EXT $XSIO,$CMST,$ENDS,$MRMP,$XCQ,$LIST EXT $CNV3,$PRSE,$PLP,$MATA,$MNP,$CNV1 * * A EQU 0 B EQU 1 JSBCI EQU 5 EQTA EQU 1650B EQT# EQU 1651B DRT EQU 1652B LUMAX EQU 1653B INTBA EQU 1654B INTLG EQU 1655B KEYWD EQU 1657B EQT1 EQU 1660B EQT3 EQU 1662B EQT4 EQU 1663B EQT5 EQU 1664B EQT6 EQU 1665B EQT7 EQU 1666B EQT8 EQU 1667B EQT9 EQU 1670B EQT10 EQU 1671B EQT11 EQU 1672B EQT12 EQU 1771B TBG EQU 1674B SYSTY EQU 1675B SKEDD EQU 1711B DUMMY EQU 1737B BPA2 EQU 1743B LBORG EQU 1745B SECT2 EQU 1757B * HED CONSTANTS AND MESSAGES * * $SAVE IS A 14 WORD TABLE USED TO SAVE SOME LOCATIONS IN THE SYSTEM * THAT WILL BE OVERLAYED DURING THE CONFIGURATOR USE. MOST OF THESE * LOCATIONS ARE NEEDED FOR SYSTEM INITIALIZATION, THEY WILL BE RESTORED * BEFORE EXITING $CNFG * THE CONTENTS OF $SAVE ARE: * WORD 0 -- SYSTY+3 I.E. WORD 4 OF SYSTEM CONSOLE EQT * WORD 1 THRU 4 -- EQT1 THRU EQT4 IN SYSTEM COMMUNICATION AREA * WORD 5 -- DUMMY - LOCATION OF PRIV I/O CARD * WORD 6 -- SKEDD - ADDRESS OF SCHEDULE LIST * WORD 7 -- $LIST - ENTRY POINT IN SCHEDULER * WORD 8 -- ADDRESS OF WORD 4 OF LIST DEVICE EQT * WORD 9 -- 1 IF SYSTEM CONSOLE EQT WAS BUFFERED, 0 OTHERWISE * WORD 10 -- 1 IF LIST DEVICE EQT WAS BUFFERED, 0 OTHERWISE * WORD 11 -- TRAP CELL CONTENTS FOR POWER FAIL (LOC 4) * WORDS 12 & 13 -- EQT5 AND EQT6 IN SYSTEM COMMUNICATION AREA * $SAVE BSS 9 NOP NOP BSS 3 TBGSV NOP CONTENTS OF TBG FROM SYSTEM COMM. AREA PRVSV NOP CONTENTS OF PRIV I O CARD FROM SYSTEM COMM. AREA ACN1 DEF CN1 MRSET OCT 150077 * .3 DEC 3 .4 DEC 4 .5 DEC 5 .6 DEC 6 .7 DEC 7 .8 DEC 8 .12 DEC 12 .13 DEC 13 .14 DEC 14 .15 DEC 15 .16 DEC 16 .31 DEC 31 .32 DEC 32 .44 DEC 44 .168 DEC 168 * N1 DEC -1 N3 DEC -3 N4 DEC -4 N6 DEC -6 * B10 EQU .8 B37 EQU .31 B40 EQU .32 B41 OCT 41 B74 OCT 74 B75 OCT 75 B177 OCT 177 B1777 OCT 177700 B377 OCT 377 B1774 OCT 177400 B1776 OCT 1776 HLT4 OCT 102004 * YE ASC 1,YE NO ASC 1,NO * MSG4 ASC 13,CURRENT I/O CONFIGURATION: MSG5 ASC 8,SELECT CODE = MSG6 ASC 6,EQT ,TYPE MSG8 ASC 4,PRIV I/O MSG10 ASC 25,CURRENT SELECT CODE#,NEW SELECT CODE# ?(/E TO END) MSG12 ASC 20,NEW I/O CONFIGURATION PERMANENT?(YES/NO) MSG21 ASC 13,PHYSICAL MEM SIZE?(#PAGES) AMSG5 DEF MSG5 AMSG6 DEF MSG6 AMSG8 DEF MSG8 ACNFX DEF *+1 SWREG ASC 3,$CNFX ***OVERLAYED AFTER $CNFX ID SEGMENT FOUND TEMP EQU ACNFX CTRCL EQU SWREG+1 CINTB EQU SWREG+2 LTRCL NOP LINTB NOP OLSTB BSS 56 * * HED SET UP FOR CONFIGURATOR * *** FOLLOWING CODE UPTO START OF RECONFIGURATION IS OVERLAYED *** AFTER BEING EXECUTED ONCE *** THE TABLES THAT WILL RESIDE IN THIS CODE ARE: *** TRPCL - 70 OCTAL WORDS LONG - CONTAINS CHANGES MADE TO TRAP CELLS *** PRMTB - PARAMETER TABLE USED FOR XSIO CALLS, PRMTB IS THE LAST *** LOCATION OF TABLE - TABLE GROWS UPWARD *** THIS TABLE OCCUPIES SAME AREA AS TRPCL *** INTBL - 70 OCTAL WORDS LONG - CONTAINS CHANGES MADE TO INTERRUPT TABLE *** EQTBL - 70 OCTAL WORDS LONG - CONTAINS ADDRESS OF EQT 4 OF OLD SC *** IF THERE WAS AN EQT POINTING TO THIS SELECT CODE *** RDBUF - 80 WORDS LONG - USED FOR BUFFER TO READ USER INPUT *** PRSBF - 32 WORDS LONG - USED FOR PARSED USER INPUT * $CNFG NOP CURNT CLC 0 CLEAR ALL INTERRUPTS LDA SYSTY GET CONSOLE EQT ADDRESS ADA .3 POINT TO WORD 4 OF CONSOLE EQT STA $SAVE SAVE IT SVTBL LDA .4,I TRAP CELL CONTENTS FOR POWER FAIL STA $SAVE+11 SLOT LDA HLT4 INSERT HALT 4 IN TRAP CELL SO THAT THE SYSTEM STA .4,I HALTS ON POWER FAIL DURING CONFIGURATION LDA DUMMY SAVE PRIV INT CARD LOC STA $SAVE+5 FROM BASE PAGE STA PRVSV LDA TBG STA TBGSV LDA SKEDD SAVE CONTENTS STA $SAVE+6 CLB CLEARSYSTY TO PREVENT USER FROM STB SYSTY GETTING OPERATOR ATTENTION STB DUMMY & DUMMY TO LET INTERRUPTS COME THRU STB SKEDD PREVENT PROG FROM BEING SCHEDULED LDA $LIST SAVE CONTENTS RSTBL STA $SAVE+7 ISZ $LIST DLD EQT1 SAVE EQT WORDS 1-6 ON DST $SAVE+1 BASE PAGE COMMUNICATION AREA DLD EQT3 DST $SAVE+3 DLD EQT5 DST $SAVE+12 * LDB ACNFX GET $CNFX'S ID SEGMENT ADDRESS JSB TNAME SEZ PRESENT? CLB NO STB CNXID ID SEGMENT ADDRESS * LIA 1 READ THE SWITCH REGISTER CONTENTS STA SWREG AND SAVE IT CLB CLEAR THE SWITCH REGISTER OTB 1 SSA,RSS BIT 15 SET? OLD JMP MEMLD NO,LOAD MEM RES & DRIVER PARTNS * CCA YES,INITIALIZE SVTBL TO -1 LDB .48 INITIALIZE CURNT(4 WORDS), SVTBL(16 WORDS), JSB SETM RSTBL (24 WORDS), OLD (4 WORDS) WFLAG DEF CURNT STARTING FROM LOC CURNT TEMP1 LDA SWREG TEMP2 ALF,ALF GET NEW DISC SC IN BITS 0-5 TEMP3 RAL,RAL TEMP4 AND B77 MASK DISC SC TEMP5 SZA,RSS 0? OLDSC JMP MEMLD YES, DISC SC DOES NOT CHANGE NEWSC STA NEWSC TEMP6 CLA TRPCL LDB NEWSC CPB TBG USED TO BE TBG? STA TBG YES, THEN CLEAR TBG CPB $SAVE+5 USED TO BE PRIV I/O CARD? STA $SAVE+5 YES, THEN CLEAR PRIV I/O CARD * LDA .2 FIND EQT WORD 4 FOR LU 2 JSB LUSUB STA RSTBL+5 SAVE FOR NOW LDA A,I GET CONTENTS OF EQT WORD 4 AND B77 GET OLD SELECT CODE FOR DISC STA OLD SAVE FOR SENDING MESSAGE LATER CPA NEWSC SAME AS NEW? JMP MEMLD YES, SKIP DISC RECONFIGURATION * LDA ASVTB SAVE NEWSC'S ORIGINAL TRAP CELL, JSB SVENT INTERRUPT TABLE & EQT WORD 4 ADDRESS LDB RSTBL+5 EQT WORD 4 FOR OLD SC JSB EQTCN SET EQT WORD 4 FOR NEW SELECT CODE LDA INTBA INTERRUPT TABLE ADDRESS ADA OLDSC ADD OLD SELECT CODE # ADA N6 ADJUST ADDRESS LDB A,I GET CONTENTS OF INTRPT TBL ENTRY INA POINT TO NEXT SC IN INTRPT TBL CPB A,I BOTH SELECT CODES THE SAME? CCA,RSS YES CLA STA TEMP -1 IF 2 SC'S FOR DISC, 0 OTHERWISE JSB INTRP SET TRAP CELL AND INTRPT TBL FOR NEW SC LDA TEMP SSA,RSS 2 DISC SC'S? JMP MEMLD NO, THEN LOAD MEMORY ISZ NEWSC YES,SECOND SELECT CODE# FOR DISC ISZ OLDSC SECOND SELECT CODE FOR DISC LDA ASVTB ADA .4 ENTER SECOND SC ENTRIES IN SVTBL JSB SVENT JSB INTRP SET UP TRAP CELL & INTRPT TBL FOR 2ND SC CCA GET OLD SC BACK TO ORIGINAL VALUE ADA OLDSC OLD SC - 1 CCB ADB NEWSC NEW SC - 1 PRMTB DST OLDSC RESTORE THEM * HED LOAD DRIVER PARTITIONS AND MEMORY RESIDENT PROGARAMS * * $SBTB TABLE IS SET UP BY THE GENERATOR CONTAINING INFORMATION * USED TO LOAD THE DRIVER PARTITIONS AND MEMORY RESIDENT PROGRAMS * THE FORMAT OF $SBTB IS: * WORD 1 -- DISC ADDRESS FOR START OF DRIVER PARTITIONS * WORD 2 -- # OF PAGES FOR ALL DRIVER PARTITIONS * WORD 3 -- DISC ADDRESS FOR MEMORY RESIDENT BASE PAGE * WORD 4 -- # OF PAGES FOR MEMORY RESIDENT BASE PAGE * (ALWAYS 1 IF MEM RES PROGRAMS ARE PRESENT) * WORD 5 -- DISC ADDRESS FOR MEMORY RESIDENT LIBRARY * WORD 6 -- # OF PAGES FOR MEMORY RESIDENT LIBRARY * * * $SBTB RESIDES IN TABLE AREA II * HED LOAD DRIVER PARTITIONS * * MEMLD LDA $SBTB+1 GET # OF PAGES IN DRIVER PARTITIONS SZA,RSS ANY GENERATED INTO SYSTEM? DRPGS JMP MEMRS NO, LOAD MEMORY RESIDENT PROGRAMS STA DRPGS USE THIS AS COUNTER LDA B41 BUILD DISC RESIDENT PROGRAM LDB $CMST MAP TO LOAD DRIVER PARTITIONS ADB N1 MWOCM CBX # OF PAGES TO BE LOADED NPGS CLB,INB START LOADING FROM PAGE 1 XMS TRANSFER SEQUENTIAL MEMORY STA MEMLD A REG POINTS TO NEXT MAP REG# LDB $ENDS START PAGE OF DRIVER PARTITIONS STB MEMLD+1 LDB $CMST # OF PAGES IN THE MAX.ADDRESSABLE CMB,INB SPACE WITHOUT COMMON ADB .31 STB MWOCM SAVE IT LDA $SBTB DISC ADDRESS OF DRIVER PARTNS JSB DSCAD SEPARATE TRACK AND SECTOR #'S * LDA $CMST START PAGE OF COMMON LSL 10 MULTIPLY BY 2000B STA TEMP3 LOAD FOR DRIVER PARTN DRVLD LDA DRPGS LDB DRPGS # OF PAGES IN DRIVER PARTITIONS CMB,INB # OF PAGES LEFT TO BE LOADED ADB MWOCM > MAX ADDRESS SPACE IN MAP? SSB LDA MWOCM YES,#PGS TO LOAD AT ONE TIME=MWOCM STA NPGS # OF PAGES OF DRVR PARTN TO BE LOADED CAX BUILD THE REST OF THE DISK RES MAP DLD MEMLD XMS LOAD MAP DST MEMLD SAVE NEW VALUES OF A&B REG LDA NPGS BUILD TRIPLETS TO READ DATA LSL 10 FROM DISC W/OUT CROSSING TRACK BOUNDARY STA TEMP SAVE # OF WORDS IN BUFFER JSB LOAD LOAD NPGS OF DRIVER PARTITION LDA NPGS # PAGES LOADED CMA,INA ADA DRPGS #PAGES THAT HAD TO BE LOADED SZA,RSS ANY LEFT? JMP MEMRS NO, DONE LOADING DRIVER PARTNS * STA DRPGS #PAGES LEFT TO BE LOADED ISZ PRMAR ADDRESS OF PARAMETER ARRAY LDB PRMAR,I GET # OF WORDS IN LAST TRIPLET LSR 6 DIVIDE IT BY 64 CBX SAVE B REG VALUE ISZ PRMAR GET TRACK / SECTOR # FOR LAST TRIPLET LDA PRMAR,I JSB DSCAD SEPARATE DISC ADDRESS CXB GET X REG IN B ADB TEMP2 B REG HAS NEW SECTOR # CMB -(NEW SECTOR# + 1) ADB SECT2 # OF SECTORS/TRACK ON SYS DISC SSB,RSS NEW SECT#># SECTORS/TRACK ON SYS DISC? JMP DRVLD NO ISZ TEMP1 YES, INCREMENT TRACK# BY 1 CLA SECTOR# IS 0 STA TEMP2 SECTOR# FOR SETUP JMP DRVLD LOAD THE NEXT PAGES * * * INTRP - THIS PROCEDURE IS PERFORMED TO ENTER * INTERRUPT TABLE AND TRAP CELL VALUES FOR DISC * SELECT CODES * * CALLING SEQUENCE: JSB INTRP * INTRP NOP LDB OLDSC,I TRAP CELL VALUE FOR OLD SELECT CODE STB NEWSC,I STORE VALUE IN NEWSC'S TRAP CELL * LDA INTBA INTERRUPT TABLE ADDRESS ADA N6 STA TEMP2 SAVE THIS ADDRESS LDB OLDSC OLD SELECT CODE ADB A POINT INTO INTERRUPT TABLE LDA B,I OLD SC'S INTERRUPT TABLE VALUE LDB NEWSC ADB TEMP2 STA B,I SAVE OLDSC VALUE IN NEWSC ENTRY JMP INTRP,I IN INTERRUPT TABLE - RETURN * * * TNAME - SEARCH KEYWORD LIST FOR PROGRAM NAME * CALLING SEQUENCE: B REG = ADDRESS OF ASCII PROGRAM NAME * JSB TNAME * RETURNS: A REG = 0 IF PROGRAM NOT FOUND (E=1) * B REG = ID SEGMENT ADDRESS OF REQUESTED PROGRAM * E REG = 0 IF STANDARD ID SEGMENT * E REG = 1 IF SHORT ID SEGMENT OR NOT FOUND * * TNAME NOP TNTM3 STB TNTM3 ADDRESS OF NAME 1 AND 2 TNTM4 INB INCREMENT TO CHAR 3 AND 4 ADDR TNTM5 STB TNTM4 SAVE IT INB INCR TO CHAR 5 ADDR LDA B,I ASCII NAME CHAR 5 AND X AND B1774 MASK OFF X STA TNTM5 SZA IF NULL CHAR. FORCE ERROR RETURN LDA KEYWD STA TEMP TN005 LDA TEMP,I CHECK IF AT END OF LIST CCE,SZA,RSS JMP TNAME,I END OF LIST RETURN ADA .12 LDB A,I ID SEG ASCII NAME CHARS 1 AND 2 CPB TNTM3,I COMPARE WITH REQUESTED CHAR 1,2 INA,RSS COMPARES JMP TN030 DOES NOT COMPARE-GO TO NEXT PROG LDB A,I ID SEG ASCII NAME CHARS 5,X CPB TNTM4,I COMPARE WITH REQUESTED CHARS 3,4 INA,RSS COMPARES JMP TN030 DOES NOT COMPARE-GO TO NEXT PROG LDA A,I ID SEG ASCII NAME CHARS 5,X STA B SAVE FOR SHORT ID TEST AND B1774 MASK OFF X CPA TNTM5 COMPARE CHAR 5 JMP TN040 COMPARES-SO PROGRAM FOUND * TN030 ISZ TEMP INCREMENT KEYWORD ADDRESS JMP TN005 GO TO COMPARE CHARS TN040 LSR 4 MOVE SHORT ID BIT TO LEAST B ERB SET E FOR RETURN LDB TEMP,I LOAD B WITH ID SEG ADDRESS JMP TNAME,I EXIT * HED LOAD MEMORY RESIDENT PROGRAMS AND LIBRARY * MEMRS LDA B40 LOAD THE MEMORY RESIDENT MAP IN DMS REG LDB .32 32 REGISTERS CBX LDB $MRMP MEM RES MAP XMM TRANSFER MEM TO MAPS * LDA $SBTB+3 # OF PAGES IN MEM RESIDENT BASE PAGE SZA,RSS MEM RES PROGRAMS EXIST? JMP IOCNF NO, THEN CONFIGURE I/O * LDA B1776 1776B WORDS TO LOAD FOR STA TEMP MEM RESIDENT BASE PAGE LDA $SBTB+2 DISC ADDRESS FOR MEM RES BASE PAGE JSB DSCAD LDA .2 START ADDRESS IS 2 STA TEMP3 JSB LOAD LOAD MEM RES BASE PAGE LDA $SBTB+5 #PAGES FOR MEM RES LIB & PROGS LSL 10 MULTIPLY BY 2000B STA TEMP # OF WORDS IN BUFFER LDA $SBTB+4 DISC ADDRESS FOR MEM RES LIB & PROGS JSB DSCAD LDA LBORG STARTING MEM ADDRESS STA TEMP3 FOR RESIDENT LIBRARY JSB LOAD LOAD THE MEM RES PROGS & LIB * HED RECONFIGURE DISC SELECT CODES IOCNF LDA SWREG RE-CONFIGURATION REQUESTED? SSA,RSS BIT 15 IN SWITCH REGISTER SET? JMP $EXIT NO, THEN DONE * CCA YES,INITIALIZE TRPCL,INTBL,EQTBL TO -1 LDB .168 168 ENTRIES POSSIBLE JSB SETM DEF TRPCL START AT LOC TRPCL CCA INITIALIZE OLD SC TABLE TO -1 LDB B70 JSB SETM DEF OLSTB LDA SVTBL DISC I/O SELECT CODE CHANGED? SSA,RSS JMP CNDSC YES, CONFIGURE DISC SC * LDA .2 FIND SC # FOR LU2 JSB LUSUB LDA A,I GET EQT WORD 4 OF LU 2 EQT AND B77 GET SC # STA CURNT SAVE IT IN CURNT ADA INTBA ADD ADDRESS OF INTERRUPT TABLE ADA N6 POINT TO DISC SC ENTRY IN INTERRUPT TABLE LDB A,I GET THE CONTENTS INA CPB A,I NEXT SC ENTRY SAME AS DISC SC ENTRY? RSS YES, THEN DISC HAS 2 SELECT CODES JMP CONSL NO, CONFIGURE SYSTEM CONSOLE SC * LDA CURNT GET FIRST DISC SC INA INCREMENT IT STA CURNT+1 SET SECOND DISC SC IN CURNT LDA OLD GET OLD SELECT CODE FOR DISC SSA,RSS ANY? INA YES, SECOND DISC SC FOR OLD SC STA OLD+1 SAVE JMP CONSL NO, THEN CONFIGURE CONSOLE SC * CNDSC JSB JNENT ENTER DISC SC IN INTBL AND TRPCL NOP ERROR RETURN NOT POSSIBLE LDA NEWSC GET NEW SELECT CODE FOR DISC STA CURNT SAVE IN CURNT FOR LATER CHECKS ADA AEQTB POINT TO NEW DISC SC ENTRY ADA NB10 IN EQTBL LDB RSTBL+5 EQT WORD 4 ADDRESS FOR DISC EQT STB A,I SET UP ENTRY IN EQTBL FOR DISC JSB CLRSC CLEAR SC IN INTERRUPT TABLE &TRAP CELL LDA ARSTB ADDRESS OF RSTBL JSB RSENT MAKE ENTRIES IN RESTORE TABLE LDA SVTBL+4 DISC HAS TWO SELECT CODES? CPA N1 ENTRY MADE IN SVTBL? JMP CONSL NO, THEN CONFIGURE CONSOLE SC ISZ NEWSC YES LDA NEWSC GET THE SECOND DISC SELECT CODE STA CURNT+1 SAVE IT IN CURNT ISZ OLDSC JSB JNENT ENTER 2ND DISC SC IN INTBL & TRPCL NOP DO NOTHING ON ERROR RETURN JSB CLRSC CLEAR SC IN INTERRUPT TABLE & TRAP CELL LDA ARSTB POINTER INTO RSTBL FOR ADA .6 SECOND DISC SC ENTRIES JSB RSENT MAKE ENTRIES IN RSTBL * HED RECONFIGURE SYSTEM CONSOLE SELECT CODE CONSL LDA SWREG GET BITS 0-5 OF SWITCH REGISTER AND B77 GET CONSOLE SELECT CODE SZA 0? JMP CNTTY NO, CONFIGURE NEW CONSOLE SELECT CODE * LDB $SAVE UNBUFFER CONSOLE EQT JSB EQUNB LDA TEMP2 STA $SAVE+9 JMP CONS2 * CNTTY STA NEWSC NO, NEW SELECT CODE FOR CONSOLE JSB CHKSC NEW SYTEM CONSOLE SC IS ONE OF DISC SC'S? JMP EQERR YES, HALT ERROR * LDA SWREG GET SWITCH REGISTER CONTENTS AND B70K MASK BITS 12,13,14 STA TEMP3 SAVE THIS VALUE CPA B10K JUST BIT 12 SET? JMP CONTY YES, THEN USE SAME EQT AS CURRENT SC * CPA B20K BIT 13 SET? RSS YES, USE EQT WITH THE NEW SELECT CODE JMP GTTYP FIND CONSOLE TYPE * LDA NEWSC GET NEW CONSOLE SELECT CODE JSB EQTFN FIND AN EQT POINTING TO NEWSC SSB FOUND ANY? JMP EQERR EQT ERROR -- HALT * ISZ TEMP5 SET UP EQT # FOR SYSTEM CONSOLE INB POINT TO WORD 5 OF SYS CONSOLE EQT LDA B,I GET CONTENTS ALF,ALF EQUIPMENT TYPE CODE IN LOW BYTE AND B77 GET EQUIPMENT TYPE CODE JMP FNDEQ GO SET UP DRT ENTRY FOR SYS CONSOLE * GTTYP LDA $SAVE DETERMINE DRIVER TYPE FOR CURRENT INA SYSTEM CONSOLE - POINT TO WORD 5 LDA A,I OF CURRENT SYSTEM CONSOLE EQT ALF,ALF GET EQUIPMENT TYPE CODE AND B77 INTO BITS 0-7 STA TEMP1 SAVE IT LDA N3 CONFIGURE I/O INSTR TO FIND OUT TYPE CONLP LDB ACN1,I OF CONSOLE ATTACHED TO NEW SC ADB NEWSC STB ACN1,I RESTORE INSTR ISZ ACN1 POINT TO NEXT INSTR INA,SZA ALL INSTR CONFIGURED? JMP CONLP NO LDB .5 LDA MRSET MASTER RESET WORD CN1 CLF 0 CN2 OTA 0 CN3 SFS 0 CLB DVR00 DRIVER CLA CPB TEMP1 IS THIS CONSOLE SAME TYPE AS CURRENT ONE JMP CONTY YES, USE THE SAME EQT FOR NEW SC * STB TEMP1 NO, THEN SAVE NEW CONSOLE TYPE * * FIND AN EQT WITH EQUIPMENT TYPE CODE MATCHING * THE NEW SELECT CODE * LDA NEWSC JSB EQTFN FIND AN EQT # WITH NEW SC SSB,RSS FOUND? JMP FNCNE YES * CNEQT CLA,INA NO FIND EQT WITH RIGHT DRIVER TYPE STA TEMP5 TEMP5 KEEPS COUNT OF EQT'S LOOKED AT LDB EQTA EQUIPMENT TABLE START ADB .4 POINT TO WORD 5 OF THE FIRST EQT EQTLP LDA B,I GET CONTENTS OF WORD 5 OF EQT ALF,ALF EQUIPMENT TYPE CODE IN LOW 6 BITS AND B77 CPA TEMP1 IS IT SAME AS THAT OF NEWSC? JMP FNDEQ YES,THE RIGHT EQT HAS BEEN FOUND LDA TEMP5 CPA EQT# ALL EQT'S DONE? JMP EQERR YES, THEN ERROR ISZ TEMP5 NO, POINT TO NEXT EQT'S WORD 5 ADB .15 JMP EQTLP * FNCNE ISZ TEMP5 SET UP EQT # FOR SYSTEM CONSOLE INB POINT TO WORD 5 OF EQT LDA B,I GET CONTENTS OF WORD 5 OF EQT ALF,ALF AND B77 GET EQUIPMENT TYPE CODE CPA TEMP1 IS IT SAME AS THAT OF NEW CONSOLE? JMP FNDEQ YES, THEN FOUND THE RIGHT EQT JMP CNEQT NO, THEN FIND EQT * EQERR HLT 55B HALT SYSTEM JMP *-1 * CONTY LDB $SAVE DRIVER TYPE SAME FOR JMP EQTTY OLD AND NEW SYSTEM CONSOLE * B10K OCT 10000 B20K OCT 20000 B70K OCT 70000 * * * CLRSC - ROUTINE TO CLEAR INTERRUPT TABLE ENTRY FOR OLDSC * AND TO INSERT A JSB $CIC,I INSTR IN CORRESPONDING * TRAP CELL ENTRY * CALLING SEQUENCE: JSB CLRSC * * CLRSC NOP LDA OLDSC CPA SVTBL IS OLDSC SAME AS NEW DISC SC #1? JMP CLRSC,I YES, THEN RETURN CPA SVTBL+4 IS OLDSC SAME AS NEW DISC SC #2? JMP CLRSC,I YES, RETURN LDA JSBCI JSB $CIC,I INSTR STA OLDSC,I IN TRAP CELL ENTRY FOR OLD SC LDA INTBA INTERRUPT TABLE ADDRESS ADA N6 ADA OLDSC POINTER INTO THE INTERRUPT TABLE CLB CLEAR ENTRY FOR OLD SC IN INTERRUPT TABLE STB A,I JMP CLRSC,I RETURN * * * EQT HAS BEEN FOUND, CHANGE EQT# IN DRT ENTRY FOR * LU1 - THE SYSTEM CONSOLE AND IN BASE PAGE LOC SYSTY * FNDEQ ADB N1 POINT TO WORD 4 OF NEW EQT ADDRESS STB $SAVE SAVE IS WHERE SYSTY+4 IS SAVED CPA .5 IN THIS DVR05 TYPE CONSOLE? JMP NOSUB YES, THEN SUBCHANNEL IS 0 * STDRT LDA LUMAX # OF LOGICAL UNITS DEFINED CMA,INA STA TEMP3 SAVE AS NEGATIVE COUNTER LDB DRT START OF DEVICE REFERENCE TABLE DRTLP LDA B,I GET AN ENTRY FROM DRT AND B77 MASK EQT # CPA TEMP5 SAVE AS NEW SYS CONSOLE'S EQT JMP DRTEN YES, FOUND NEW SYS CONSOLE'S ENTRY IN DRT * INB POINT TO NEXT ENTRY IN DRT ISZ TEMP3 INCREMENT COUNTER JMP DRTLP CHECK NEXT DRT ENTRY * NOSUB LDA TEMP5 EQT # OF NEW SYS CONSOLE RSS DRTEN LDA B,I SET UP DRT ENTRY FOR LU 1 STA DRT,I * EQTTY LDB $SAVE NEW CONSOLE'S EQT WORD 4 ADDRESS LDA B,I GET CONTENTS OF WORD 4 OF EQT AND B77 STA OLDSC OLD SC # FOR CONSOLE STA OLD+2 SAVE FOR PRINTING LATER JSB EQUNB UNBUFFER EQT LDB TEMP2 SAVE BUFFERED/UNBUFFERED STATUS STB $SAVE+9 LDA ASV8 POINT TO ENTRY FOR SYS CONSOLE IN SVTBL JSB SVENT ENTER NEW SC IN SVTBL LDA NEWSC NEW SELECT CODE FOR SYSTEM CONSOLE CPA OLDSC SAME AS OLD SELECT CODE? RSS YES JMP MKENT NO, MAKE ENTRIES IN INTBL AND TRPCL * LDA SVTBL+11 EQT WORD 4 ADDRESS FOR OLD SC CPA $SAVE SAME AS FOR NEW SELECT CODE? RSS YES JMP MKENT NO, CONFIGURE SYTEM CONSOLE SC * CCA RE-INITIALIZE ENTRY FOR SYSTEM LDB .4 CONSOLE IN SVTBL JSB SETM ASV8 DEF SVTBL+8 JMP CONS2 SAVE INTERRUPT TABLE AND TRAP CELL CONTENTS * MKENT JSB JNENT ENTER NEW & OLD SC IN INTBL & TRPCL NOP DO NOTHING ON ERROR RETURN CCA SET FLAG TO INDICATE DO NOT CLEAR STA NOCLR CURRENT EQT'S FOR NEW SC LDA OLDSC GET OLD SELECT CODE # JSB IPROC CONFIGURE INTRPT TBL & TRAP CELL LDA NEWSC NEW SELECT CODE JSB IPROC CONFIGURE NEW SELECT CODE LDA ARSTB POINTER INTO RSTBL FOR CONSOLE SC ADA .12 JSB RSENT MAKE ENTRIES IN RSTBL FOR CONSOLE SC CLA CLEAR FLAG STA NOCLR LDB RSTBL+17 EQT WORD 4 ADDRESS OF CONSOLE ADB N3 POINT TO FIRST WORD OF CONSOLE EQT STA B,I CLEAR THIS WORD * CONS2 LDA $SAVE,I GET WORD 4 OF CONSOLE EQT AND B77 GET THE SELECT CODE STA CURNT+2 SAVE FOR FUTURE CHECKS LDB A,I GET THE TRAP CELL CONTENTS FOR SYS CONSOLE STB CTRCL SAVE TRAP CELL CONTENTS ADA INTBA INDEX INTO THE INTERRUPT TABLE ADA N6 LDA A,I STA CINTB INTERRUPT TABLE ENTRY FOR SYS CONSOLE HED LIST DEVICE RECONFIGURATION STRCN LDB .11 JSB WRTTY DEF MSG0 START RECONFIGURATION * CONFIGURE LIST DEVICE SELECT CODE * LSTDV LDB .8 JSB QUERY ASK FOR DEF MSG1 LIST DEVICE LU? LSTLU LDA PRSBF GET FIRST WORD OF PARSE BUFFER TRTMP SZA,RSS NULL? JMP LUDFL YES, THEN DEFAULT LU# SAVPG LDB APRSB ADDRESS OF PARSE BUFFER SVPG1 LDA LUMAX UPPER LIMIT FOR LU# STA MXLU# CLA,INA LOWER LIMIT FOR LU# JSB TST# TEST LU# MXLU# NOP JMP LUERR RSS LUDFL INA YES, THEN DEFAULT LU IS 1 STA LSTLU LIST DEVICE LU# * * LIST DEVICE SELECT CODE # * CCB LDA LSTLU CPA .1 SAME AS CONSOLE LU? JMP ECHO2 YES, DO NOT ASK FOR SELECT CODE# LDA LSTLU GET EQT# FOR LIST DEVICE LU JSB LUSUB SZA,RSS JMP LUERR BIT BUCKET LU, ERROR * STA $SAVE+8 SAVE ADDR OF WORD 4 OF LIST DEV EQT LDB A ALSO, SAVE ADDR IN B REG LDA A,I GET CONTENTS OF THE EQT WORD 4 AND B77 GET OLD SC AND SAVE STA OLDSC JSB EQUNB UNBUFFER LIST DEV EQT LDA TEMP2 SAVE BUFFERED/UNBUFFERED FLAG STA $SAVE+10 * LULST LDB .13 JSB QUERY DEF MSG2 LIST DEVICE SELECT CODE #? LDB OLDSC GET OLD SELECT CODE FOR LIST DEVICE LDA PRSBF FIRST WORD OF PARSE BUFFER SZA 0? JMP CNLST NO, CONFIGURE LIST DEVICE * STB CURNT+3 SAVE LIST DEV SC FOR FUTURE CHECKS JMP SVLST * CNLST STB OLD+3 SAVE OLD SELECT CODE FOR PRINTING INFO LDB APRSB ADDRESS OF PARSE BUFFER JSB TSTCH TEST VALIDITY OF LIST DEVICE SELECT CODE# JMP LULST SELECT CODE # NOT VALID STA NEWSC NEW SELECT CODE # FOR LIST DEVICE JSB CHKSC MAKE SURE LIST DEVICE SC IS NOT JMP LSTER DISC OR CONSOLE SC * LDA NEWSC STA CURNT+3 SAVE IN CURNT FOR FUTURE CHECKS CPA OLDSC SELECT CODE SAME AS OLD SC? JMP SVLST YES, SKIP RECONFIGURATION FOR LIST DEV * LDA ASVTB ADDRESS OF SVTBL ADA .12 POINT TO LIST DEVICE ENTRIES JSB SVENT MAKE NEWSC ENTRY IN SVTBL JSB JNENT INTBL AND TRPCL ENTRIES NOP DO NOTHING ON ERROR RETURN CCA SET FLAG TO INDICATE DO NOT CLEAR STA NOCLR SC # FROM CURRENT NEWSC EQT'S LDA OLDSC ENTRY IN INTERRPT TABLE AND JSB IPROC AND TRAP CELL FOR OLD SELECT CODE LDA NEWSC AND NEW SELECT CODE FOR LIST DEVICE JSB IPROC LDA ARSTB POINTER INTO RSTBL FOR ADA .18 LIST DEVICE JSB RSENT MAKE ENTRIES IN RSTBL FOR LIST DEVICE CLA STA NOCLR RESET FLAG LDB RSTBL+23 GET EQT WORD 4 ADDR FOR LIST DEV ADB N3 POINT TO FIRST WORD OF LIST DEV EQT STA B,I CLEAR THE WORD JMP ECHOQ * SVLST LDB A,I SAVE LIST TRAP CELL STB LTRCL ADA INTBA SAVE INTERRUPT TABLE ADA N6 FOR LIST DEV LDA A,I STA LINTB * * ECHOQ LDB .7 JSB QUERY ECHO?(YES/NO) DEF MSG3 LDA PRSBF PARSE BUFFER CPA .1 NUMERIC VALUE? JMP ECHOQ YES, THEN ASK AGAIN CCB LDA PRSBF+1 FIRST TWO CHARACTERS CPA NO NO? JMP ECHO2 ECHO NOT REQUIRED? CPA YE YES? RSS JMP ECHOQ ERRONEOUS REPLY, ASK AGAIN ECHO CLB ECHO2 STB ECHO ECHO=0 ECHO WANTED,-1 ECHO NOT WANTED * HED PRINT I/O RECONFIGURATION ALREADY PERFORMED CLA STA TEMP2 SET FOR INDEX COUNT STA TEMP1 SET FLAG FOR PRINTING HEADER LKAGN LDB AOLD ADDRESS OF OLD TABLE ADB TEMP2 INDEX INTO IT LDA B,I GET CONTENTS SSA,RSS ANY DEFINED? JMP PRHED YES, PRINT OLD,NEW SC INFO * INCR LDB TEMP2 GET INDEX CPB .3 DONE? JMP STIO YES * ISZ TEMP2 NO, INCREMENT INDEX JMP LKAGN LOOK AGAIN * * PRHED LDA TEMP1 GET PRINT HEADER FLAG SZA ALREADY SENT OUT? JMP PRINF YES, THEN JUST PRINT SC * CLA,INA SET FLAG TO INDICATE STA TEMP1 HEADER ALREADY PRINTED LDB .19 SEND OUT JSB WRLST I/O RECONFIGURATION ALREADY PERFORMED DEF MSG7 MESSAGE LDB .19 SEND OUT JSB WRLST CURRENT SELECT CODE#,NEW SELECT CODE# DEF MSG10 MESSAGE * PRINF LDA AOLD GET ADDRESS OF OLD TABLE ADA TEMP2 ADD INDEX LDA A,I GET CONTENTS CLE CONVERT TO OCTAL ASCII JSB $CNV1 STA RDBUF SET UP OLD SC IN MESAGE BUFFER LDA SPCCM GET " ," STA RDBUF+1 SET IN OUTPUT BUFFER LDA ACURN GET ADDRESS OF CURRENT SC TABLE ADA TEMP2 ADD INDEX LDA A,I GET NEW SELECT CODE CLE JSB $CNV1 CONVERT TO ASCII OCTAL STA RDBUF+2 * LDA SPACE INTIALIZE NEXT PART OF BUFFER LDB .5 WITH SPACES JSB SETM DEF RDBUF+3 LDA ADEF ADDRESS OF DEF TABLE ADA TEMP2 INDEX INTO IT LDA A,I GET ADDRESS OF MESSAGE LDB ARDBF DESTINATION ADB .7 BUFFER ADDRESS MVW .8 MOVE THE COMMENT INTO MESSAGE LDB SPC2 IF MESSAGE FOR SYSTEM LDA TEMP2 DISC 2 MODIFY THE CPA .1 OUTPUT BUFFER STB RDBUF+13 LDB .15 JSB WRLST XX ,YY *ZZZZZZZZZZZZ DEF RDBUF JMP INCR GET NEXT SELECT CODE * * MSG7 ASC 19,I/O RECONFIGURATION ALREADY PERFORMED: SPCCM ASC 1, , SPC2 ASC 1, 2 ADEF DEF *+1 DEF SYSDS DEF SYSDS DEF SYSCN DEF LIST SYSDS ASC 8,*SYSTEM DISC 1 SYSCN ASC 8,*SYSTEM CONSOLE LIST ASC 6,*LIST DEVICE SPACE ASC 2, AOLD DEF OLD HED PRINT CURRENT I/O CONFIGURATION * PRINT A LIST OF CURRENT I/O CONFIGURATION * STIO DLD .ENT SET UP MESSAGE DST MSG4+2 LDB .13 JSB WRLST DEF MSG4 CURRENT I/O CONFIGURATION: JSB PRNIO * * WANT I/O CONFIGURATION? * WNTIO LDB .14 JSB QUERY DEF MSG9 I/O RECONFIGURATION?(YES/NO) LDA PRSBF+1 CPA NO CNTRP JMP MEMCN I/O CONFIG NOT REQIURED CNINT CPA YE LSTRP RSS LSINT JMP WNTIO ASK QUES AGAIN HED I/O RECONFIGURATION * * * I/O RECONFIGURATION IS DESIRED * IOCN2 LDB .25 JSB WRTTY DEF MSG10 CURRENT SELECT CODE#,NEW SELECT CODE#?(/E TO END) IOCN3 CLB,INB JSB QUERY DEF HYPHN HYPHEN (-) PROMPT LDA PRSBF CPA .2 ASCII? JMP ENDIO CHECK IF END OF LIST LDB APRSB ADDRESS OF PARSE BUFFER JSB TSTCH TEST SELECT CODE VALIDITY JMP IOCN3 NOT VALID ASK AGAIN STA OLDSC OLD SELECT CODE LDA PRSBF+4 SECOND PARAMETER ASCII? CPA .2 RSS YES, CHECK IF IT IS PR JMP NEWCH NO, TEST NEW CHANNEL # LDA PRSBF+5 CPA PI PRIVILEGED I/O CARD TO BE ADDED? RSS YES JMP IOERR NO, THEN ERROR LDA OLDSC OLD SELECT CODE VALUE JSB CHKSC NEW SC VALUE FOR DISC,CONSOLE OR LIST? JMP ERR3 YES, THEN CONFIG ERR 3 LDA OLDSC NO, GET OLDSC # STA $SAVE+5 SET UP DUMMY WORD ON BASE PAGE ADA NB10 ADA AINTB POINT INTO INTBL CLB STB A,I CLEAR THE INTBL ENTRY FOR OLDSC LDA OLDSC CPA TBG TBG CHANNEL? STB TBG YES, CLEAR TBG WORD ON BASE PAGE ADA NB10 ADA ATRPC POINT INTO TRPCL TABLE LDB JSBCI INSERT JSB $CIC,I INSTR IN STB A,I TRPCL ENTRY FOR OLDSC LDA OLDSC ADA NB10 CAX SAVE A REG VALUE ADA AOLSC POINT TO OLD SC TABLE JSB PRVOL RESTORE PREV OLDSC IF NECESSARY CXA GET OLDSC - 10B ADA AOLSC POINT TO OLDSC ENTRY IN OLSTB CCB STB A,I NO OLDSC ASSIGNED CXA GET OLDSC -10B ADA AEQTB EQT TBL STB A,I ENTRY TO -1 JMP IOCN3 ASK FOR MORE * NEWCH LDB APRSB ADB .4 POINT TO VALUES FOR NEW SC LDA B IF THE NEW SELECT CODE # IS 0 INA DO NOT GO THRU TSTCH ROUTINE LDA A,I SZA JMP TSTNS NOT 0 THEN TEST NEW SELEC CODE LDB OLDSC GET OLD SELECT CODE # CPB PRVSV IS IT A PRIV I/O CARD? JMP STNWS YES, THEN 0 FOR NEWSC IS VALID JMP IOERR NO, THEN ERROR TSTNS JSB TSTCH TEST SELECT CODE VALIDITY JMP IOCN3 NOT VALID ASK AGAIN STNWS STA NEWSC NEW SELECT CODE JSB INENT ENTER IN INTBL AND TRPCL JMP ERR3 GIVE CONFIG ERR 3 JMP IOCN3 ASK FOR MORE * ENDIO LDA PRSBF+1 /E ? CPA /E JMP IOCN7 CPA /R RESTART? JMP RSTRT * IOERR LDA A2 INVALID SELECT CODE # RSS ERR3 LDA A3 JSB ERROR JMP IOCN3 * LUERR LDA A1 JSB ERROR INVALID LIST DEVICE LU # JMP LSTDV * LSTER LDA A3 INVALID LIST DEVICE SC JSB ERROR JMP LULST * MSG0 ASC 11,START RECONFIGURATION MSG1 ASC 8,LIST DEVICE LU#? MSG2 ASC 13,LIST DEVICE SELECT CODE#? MSG3 ASC 7,ECHO?(YES/NO) * NOCLR NOP INTBL EQU TRPCL+56 EQTBL EQU INTBL+56 RDBUF EQU EQTBL+56 PRSBF EQU RDBUF+80 ENDT EQU PRSBF+32 END OF OVERLAY TABLES AINTB DEF INTBL $ABDP DEF INTBL ARSTB DEF RSTBL .11 DEC 11 .18 DEC 18 .ENT ASC 2,ENT .25 DEC 25 A1 ASC 1,1 A2 ASC 1,2 A3 ASC 1,3 AEQTB DEF EQTBL PI ASC 1,PI SKP * * LUSUB - THIS SUBROUTINE GIVES THE EQT WORD 4 ADDRESS * CORRESPONDING TO AN LU#. * * CALLING SEQUENCE: A REG = LU # * JSB LUSUB * RETURNS: A REG = 0 IF LU POINTS TO BIT BUCKET * = EQT WORD 4 ADDRESS OF EQT THAT * THE LU POINTS TO * * LUSUB NOP ADA N1 LU# - 1 ADA DRT ADDRESS OF DRT TABLE LDA A,I GET CONTENTS AND B77 LIST DEVICE EQT# IN A REG SZA,RSS BIT BUCKET? JMP LUSUB,I YES, RETURN ADA N1 MPY .15 GET EQT ADDRESS ADA EQTA ADA .3 POINT TO WORD 4 OF LIST DEV EQT JMP LUSUB,I RETURN HED RESTART I/O RECONFIGURATION * * RESTART THE I/O RECONFIGURATION * * RSTRT CCA INITIALIZE TABLES FOR I/O LDB .168 RE-CONFIGURATION TO -1 JSB SETM ATRPC DEF TRPCL CCA LDB B70 SET OLDSC TABLE TO -1 JSB SETM AOLSC DEF OLSTB * LDA TBGSV CHANGE TBG VALUE TO THE NEW SC JSB CHKSC IS IT NEW SC FOR DISC,CONSOLE OR LIST? CLA,RSS YES, THEN CLEAR TBG LDA TBGSV NO STA TBG LDA PRVSV CHANGE PRIV I/O VALUE TO NEW SC JSB CHKSC IS IT NEW SC FOR DISC,CONSOLE OR LIST? CLA,RSS YES LDA PRVSV NO STA $SAVE+5 CLB STB TEMP2 LDA ARSTB ADDRESS OF RESTORE TABLE STA TEMP USE TEMP AS POINTER RSLP LDB TEMP,I OLD SELECT CODE # SSB ENTRY MADE? JMP SKPRS NO, THEN NOTHING TO RESTORE STB OLDSC ADB NB10 RESTORE OLD SC VALUES IN INTBL AND TRPCL JSB RESTR LDB ASVTB ADDRESS OF SAVE TABLE ADB TEMP2 INDEX INTO IT LDB B,I GET NEW SC # ADB NB10 CBX SAVE FOR NOW ADB AOLSC POINT INTO OLDSC TABLE LDA OLDSC STA B,I RESTORE OLDSC VALUE CXB RESTORE B REG VALUE CAX JSB RESTR RESTORE NEW SC VALUES IN TRPCL &INTBL ISZ TEMP CXA ADA AEQTB RESTORE EQT WORD 4 ADDRESS ADA NB10 LDB TEMP,I STB A,I ISZ TEMP RSLPE LDA TEMP2 ALL ENTRIES IN SVTBL RESTORED? CPA .12 JMP IOCN2 YES RESTART I/O CONFIGURATION ADA .4 NO, POINT TO NEXT SET OF ENTRIES STA TEMP2 JMP RSLP SKPRS LDA TEMP * ADA .6 POINT TO NEXT SET OF ENTRIES IN RSTBL STA TEMP JMP RSLPE * MSG9 ASC 14,I/O RECONFIGURATION?(YES/NO) MEM ASC 2,MEM NEW ASC 2,NEW HYPHN ASC 1,- /R ASC 1,/R /E ASC 1,/E N2 DEC -2 B70 OCT 70 #WRDS ABS EQTBL+56-SVTBL LENGTH OF ALL IO TABLES .20 DEC 20 CONSC EQU SVTBL+8 LSTSC EQU SVTBL+12 HED TRANSFER I/O RECONFUGRATION CHANGES TO SYTEM TABLES * * TRANSFER I/O RECONFIGURATION CHANGES TO ACTUAL TRAP CELL, * INTERRUPT TABLE AND EQT ENTRIES IN THE SYSTEM IN MEMORY * IOCN7 LDA INTLG GET LENGTH OF INTERRPUT TABLE ADA N2 CMA,INA STA TEMP2 USE AS -VE COUNTER LDA B10 FIRST SELECT CODE VALUE STA TEMP3 IOLP1 CPA CONSC NEW CONSOLE SELECT CODE? JMP ENIOL YES,DO NOT CHANGE CONSOLE SELECT CODE VALUE CPA LSTSC NEW LIST DEVICE SELECT CODE? JMP ENIOL YES, DO NOT CHANGE IT JSB IPROC TRANSFER INTBL AND TRPCL VALUES RSS ENIOL JSB JPROC CLEAR NEWSC'S PREV EQT'S IF NOT ASSIGNED ISZ TEMP3 TO INTRPT TABLE AND TRAP CELL LDA TEMP3 ISZ TEMP2 INCREMENT COUNTER JMP IOLP1 LDA EQT# # OF EQT'S DEFINED CMA,INA USE AS COUNTER STA TEMP5 LDA EQTA ADDRESS OF START OF EQT TABLES CLB CLREQ STB A,I CLEAR FIRST WORD OF ALL EQT'S ADA .15 ISZ TEMP5 JMP CLREQ * DLD NEW SET UP MESSAGE DST MSG4+2 LDB .11 PRTMP JSB WRLST NEW I/O CONFIGURATION DEF MSG4+2 PRTM2 JSB PRNIO PRINT NEW I/O CONFIGURATION * * HED MAKE I/O RECONFIGURATION PERMANENT PERMQ LDB .20 JSB QUERY NEW I/O CONFIGURATION PERMANENT?(YES/NO) DEF MSG12 LDA PRSBF+1 CPA NO RESPONSE IS NO? JMP MEMCN YES, THEN MEMORY CONFIGURATION CPA YE JMP PRMIO MAKE I/O CONFIG PERMANENT CPA /R RESTART I/O CONFIGURATION? RSS YES JMP PERMQ ERROR IN RESPONSE CCA INITIALIZE ALL I/O RE-CONFIGURATION LDB #WRDS TABLES TO -1 JSB SETM ASVTB DEF SVTBL CCA LDB B70 JSB SETM SET OLD SC TABLE TO -1 DEF OLSTB LDA TBG TBG CHANNEL STA TBGSV LDA $SAVE+5 STA PRVSV JMP STIO START I/O RE-CONFIGURATION * * PRMIO LDA CURNT+2 CURRENT SELECT CODE FOR CONSOLE ADA INTBA SAVE ITS CURRENT INTERRUPT TABLE ADA N6 CONTENTS LDB A,I TO BE DONE BECAUSE A DRIVER CAN CHANGE STB CNINT CAN CHANGE INTERRUPT TABLE ENTRIES LDB CURNT+2,I GET CURRENT TRAP CELL CONTENTS FOR SYS CONSOLE STB CNTRP SAVE THIS VALUE LDB CONSC NEW SELECT CODE FOR SYS CONSOLE? SSB JMP PRM1 NO * LDB RSTBL+15 GET CONTENTS OF ORIGINAL VALUE IN INTERRUPT STB A,I TABLE FOR THE CONSOLE SELECT CODE LDB RSTBL+16 ORIGINAL TRAP CELL VALUE FOR STB CONSC,I THE CONSOLE SELECT CODE JMP CHKLS CHECK LIST DEVICE * PRM1 LDB CINTB STB A,I RESOTRE ORIGINAL INTERRUPT TABLE LDB CTRCL RESTORE ORIGINAL TRAP CELL CONTENTS STB CURNT+2,I * CHKLS LDA CURNT+3 LIST DEVICE SELECT CODE ADA INTBA GET INTERRUPT TABLE VALUE CURRENTLY ADA N6 ASSIGNED TO LIST DEVICE SELECT CODE LDB A,I STB LSINT SAVE THIS VALUE LDB CURNT+3,I STB LSTRP LDB LSTSC NEW SELECT CODE DEFINED FOR LIST DEV? SSB JMP PRM2 NO * LDB RSTBL+21 GET ORIGINAL INTERRUPT TABLE STB A,I VALUE FOR LIST DEVICE LDB RSTBL+22 GET ORIGINAL TRAP CELL VALUE FOR STB LSTSC,I FOR LIST DEVICE JMP PRCNT * PRM2 LDB LINTB RESOTRE INTERRUPT TABLE CONTENTS STB A,I FOR LIST DEVICE LDB LTRCL RESTORE TRAP CELL CONTENTS FOR STB CURNT+3,I LIST DEVICE * PRCNT LDA INTBA ADDRESS OF INTERRUPT TABLE LDB INTLG LENGTH OF INTERRUPT TABLE JSB $TRTB WRITE INTERRUPT TABLE ON DISC LDA B10 WRITE TRAP CELLS ON DISC LDB B70 JSB $TRTB LDB CNTRP GET SAVED VALUE OF TRAP CELL FOR STB CURNT+2,I CONSOLE SELECT CODE LDA CURNT+2 ADA INTBA ADA N6 LDB CNINT RESTORE CURRENT VALUE OF INTERRUPT TABLE STB A,I LDB LSTRP RESTORE CONTENTS OF LIST DEVICE STB CURNT+3,I TRAP CELL LDA CURNT+3 ADA INTBA ADA N6 LDB LSINT RESTORE CONTENTS OF LIST DEVICE STB A,I INTERRUPT TABLE ENTRY * PREQT JSB BUFFR BUFFER CONSOLE AND LIST DEVICE EQT'S CLA STA PRTM2 USE AS COUNTER LDA EQTA START ADDRESS OF EQT TABLES ADA .3 POINT TO WORD 4 OF FIRST EQT STA TEMP3 PREQL CLB JSB $TREN TRANSFER EQT WORD 4 TO DISC ISZ PRTM2 LDA PRTM2 CPA EQT# JMP UNBFR DONE LDA TEMP3 ADA .15 STA TEMP3 POINT TO WORD 4 OF NEXT EQT JMP PREQL UNBFR LDA $SAVE+9 CONSOLE EQT WAS BUFFERED? SZA,RSS JMP LSUNB NO LDA PRTMP YES, RESTORE UNBUFFERED WORD STA $SAVE,I LSUNB LDA $SAVE+10 LIST DEVICE EQT WAS BUFFERED? SZA,RSS JMP PRDRT NO LDA PRTMP+1 RESTORE UNBUFFER STATUS STA $SAVE+8,I * PRDRT LDA DRT ADDRESS OF DRT ENTRY FOR SYSTEM CONSOLE SC CLB MAKE IT PERMANENT JSB $TREN * * LDA ATBG MAKE TBG WORD ON BASE PAGE PERMANENT LDB TBG GET CONTENTS OF TBG WORD FROM BASE PAGE JSB LOCTR TRANSFER IT TO DISC LDA ASYST SYSTY WORD ON BASE PAGE TO BE TRANSFERRED LDB $SAVE CONTENTS OF SYSTY (+3) ARE IN $SAVE ADB N3 POINT TO START OF CONSOLE EQT JSB LOCTR TRANSFER WORD TO DISC LDA ADUMY TRANSFER PRIVILEGED I/O CARD ADDRESS LDB $SAVE+5 CONTENTS OF WORD ON BASE PAGE JSB LOCTR * * I/O CONFIGURATION COMPLETED * HED MEMORY RECONFIGURATION * PRINT INFORMATION ON CURRENT MEMORY SETUP * MEMCN LDB $MNP MAX # OF PARTITIONS ALLOWED BDTMP CMB,INB STB TEMP USE AS COUNTER LDB $MATA GET STARTITNG ADDRESS OF MAT ENTRIES MATLP LDA B,I GET CONTENTS OF FIRST WORD OF THIS ENTRY SSA -1? JMP BCKUP YES, BACKUP TO FIND # PAGES IN MEM ADB .7 NO ISZ TEMP ALL PARTITIONS CHECKED? JMP MATLP NO, IS NEXT ENTRY THE LAST ONE? BCKUP ADB N1 GET CONTENTS OF LAST WORD LDA B,I OF PREVIOUS MAT ENTRY SZA,RSS 0? JMP FOUND YES, THEN NOT A SUBPARTITION ADB N3 POINT TO WORD 3 OF PREVIOUS MAT ENTRY LDA B,I SSA IS IT A MOTHER PARTITION? JMP MFND YES ADB N4 POINT TO LAST ENTRY OF PREV PARTN JMP BCKUP+1 * FOUND ADB N3 POINT TO WORD 3 OF THIS MAT ENTRY MFND LDA B,I GET VALUE AND BIT09 MASK # OF PAGES IN PART'N CAX SVE THIS VALUE INB LDA B,I GET WORD 4 OF THE MAT ENTRY AND BIT09 MASK # PAGES IN PARTITION CXB ADA B CCE,INA CONVERT #PAGES IN PHYSICAL MEM TO ASCII JSB $CNV3 INA DLD A,I GET ASCII VALUE FOR LEAST 4 DIGITS DST MSG23+14 SET UP MESSAGE LDB .19 JSB WRLST CURRENT PHYSICAL MEM SIZE: XXXX PAGES DEF MSG23 * DLD MEM SET UP MESSAGE DST MSG9 MEMC0 LDB .14 MESSAGE LENGTH JSB QUERY DEF MSG9 MEM RECONFIGURATION?(YES/NO) LDA PRSBF+1 CPA NO NO? JMP $EXIT RETURN CONTROL TO SYSTEM CPA YE RSS MEM RECONFIGURATION WANTED JMP MEMC0 ERROR IN RESPONSE * $NPGQ LDB .13 JSB QUERY DEF MSG21 PHSICAL MEM SIZE?(#PAGES) LDA .48 LOWER BOUNDS IS 48 PAGES LDB APRSB ADDRESS OF PARSE BUFFER JSB TST# TEST VALIDITY OF RESPONSE .1024 DEC 1024 UPPER LIMIT JMP NPGSE ERROR IN RESPONSE STA MEMSZ SAVE MEM SIZE ADA N1 GET LAST PAGE # IN MEMORY STA LASTP LDA $SBTB+1 # PAGES IN DRIVER PARTITION ADA $SBTB+5 # OF PAGES IN MEM RES PART'N ADA $SBTB+3 # PAGES IN MEM RES BASE PAGE ADA $ENDS # PAGES IN SYSTEM UPTO SAM DEFAULT STA $USRS START OF SAM EXTENSION CCE CONVERT PAGE# TO ASCII DECIMAL JSB $CNV3 INA DLD A,I GET LAST 4 DIGITS DST MSG22+17 * HED DEFINE BAD PAGES * DEFINE BAD PAGES * A MAXIMUM OF 100 BAD PAGES ARE ALLOWED * THE TABLE CONTAINING BAD PAGE NUMBERS OVERLAYS MEMORY THAT WAS * OCCUPIED BY INTBL * THE END OF BAD PAGE TABLE IS MARKED BY A -1 * BDPAG LDB .25 JSB WRTTY DEFINE BAD PAGES BEGINING AT PAGE XXXX ( E TO END) DEF MSG22 LDA N100 MAX # OF BAD PAGES ALLOWED STA BDTMP USE AS COUNTER LDA $ABDP START OF BAD PAGE LIST ADA N1 MINUS ONE STA TEMP1 TEMP1 WILL BE THE POINTER LDB $USRS INITIALIZE LIST OF BAD PAGES TO ADB N1 LAST PAGE OF MEMORY RESIDENT PROGRAMS STB TEMP1,I BDPGQ CLB,INB WORD COUNT JSB QUERY SEND HYPHEN PROMPT DEF HYPHN LDA PRSBF+1 RESPONSE IS /E? CPA /E JMP ENBDP YES, THEN END BAD PAGE LIST CPA /R RESTART ENTRIES FOR BAD PAGES? JMP BDPAG YES LDA TEMP1,I LOWER LIMIT FOR A BAD PAGE # INA IS PREVIOUS BAD PG# + 1 LDB APRSB POINTER TO BAD PAGE # IN PARSE BUF JSB TST# TEST VALIDITY OF BADE PAGE # LASTP NOP LAST PAGE # IN MEMORY JMP BDPGE BAD PAGE ERROR ISZ TEMP1 INCREMENT POINTER STA TEMP1,I SAVE THE BAD PAGE # IN LIST ISZ BDTMP INCREMENT COUNTER JMP BDPGQ PROMPT FOR NEXT BAD PG # JMP ENBDP 100 PAGES ENTERED DONE * BDPGE LDA A11 BAD PAGE ERROR JSB ERROR JMP BDPGQ * NPGSE LDA A10 # OF PAGES IN MEM ERROR JSB ERROR JMP $NPGQ * ATBG DEF TBG ASYST DEF SYSTY ADUMY DEF DUMMY * MEMSZ NOP MSG22 ASC 25,DEFINE BAD PAGES BEGINNING AT PAGEXXXX (/E TO END) MSG23 ASC 19,CURRENT PHYSICAL MEM SIZE: XXXX PAGES .48 DEC 48 N100 DEC -100 .17 DEC 17 .19 DEC 19 BIT09 OCT 1777 A10 ASC 1,10 A11 ASC 1,11 * ENBDP CCA -1 TO INDICATE END OF BAD PAGE LIST ISZ TEMP1 INCREMENT POINTER STA TEMP1,I * HED LOAD CONFIGURATOR EXTENSION INTO MEMORY * LDA CNXID GET ID SEGMENT ADDRESS FOR $CNFX ADA .21 LDA A,I GET # PAGES WORD ALF,RAL MOVE # PAGES (NO BP) TO LOW BITS RAL AND B37 MASK # PAGES USED FOR $CNFX STA #PGS SAVE CMA SAVE NEGATIVE # OF PAGES PLUS BASE PG STA #NPGS LDA $USRS SAVE START OF SAM EXT PAGE LDB $ABDP SAVE POINTER TO BAD PAGE LIST DST SAVPG POINTER INTO BAD PAGE LIST CHNKL CLA A REG = 0 TO INDICATE CALL FROM SYSTEM MAP JSB $PCHN GET THE NEXT CHUNK OF GOOD PAGES SZA,RSS 0? JMP ABORT YES,THEN NO SPACE TO LOAD $CNFGX ADA #NPGS SPACE LARGE ENOUGH FOR $CNFX? SSA,RSS JMP FCHNK YES * LDA $ABDP,I GET CURRENT BAD PAGE SSA ALL BAD PAGES USED UP? JMP ABORT YES, THEN HLT 22 * INA STA $USRS TRY WITH THIS USER START PAGE JMP CHNKL FIND ANOTHER CHUNK OF MEMORY * FCHNK LDA $PLP LOAD POINT FOR PRIVILEGED PROGRAMS ALF RAL,RAL AND B37 # OF PAGES BEFORE LOAD POINT ADA N1 CAX USE AS COUNTER TO LOAD PAGES LDA B41 START LOGICAL PAGE FOR TABLE AREA I THRU SDA CLB,INB PHYSICAL PAGE # TO BE LOADED XMS LDB #PGS # OF PAGES FOR USER AREA CBX USE AS COUNTER LDB $USRS INB B REG HAS PHYSICAL PAGE XMS TO LOAD USER AREA CLA,INA CAX COUNTER TO LOAD BASE PAGE LDA B40 LOGICAL START PAGE LDB $USRS XMS LDB CNXID GET ID SEG ADDRESS FOR $CNFX SZB,RSS PRESENT? JMP ABORT NO, THEN ABORT CONFIGURATOR ADB .14 POINT TO TYPE WORD IN ID SEG LDA B,I GET CONTENTS AND B37 MASK TYPE OF PROGRAM CPA .3 IS IT A BACKGROUND DISC RESIDENT PROG? RSS YES JMP ABORT NO, THEN ABORT CONFIGURATOR ADB .8 GET WORD 23 OF ID SEGMENT LDA B,I GET CONTENTS STA TEMP3 LOW MAIN ADDRESS CMA,INA INB POINT TO WORD 24 OF ID SEG ADA B,I HIGH MAIN +1 - LOW MAIN STA TEMP SAVE # OF WORDS TO BE LOADED FOR MAIN ADB .3 POINT TO WORD 27 OF ID SEGMENT LDA B,I DISC ADDRESS OF MAIN PROGRAM JSB DSCAD SET UP TRACK & SECTOR #'S FOR SETUP JSB LOAD LDB CNXID ADDRESS OF THE ID SEGMENT ADB .24 POINT TO LOW BASE PAGE ADDR LDA B,I STA TEMP3 CMA,INA INB POINT TO HIGH BASE PAGE ADDR + 1 ADA B,I # OF WORDS IN BASE PAGE STA TEMP SAVE FOR SETUP ROUTINE LDA PRMAR ADDRESS OF LAST TRIPLET JSB NXTAD FIND NEXT DISC ADDRESS LDA TEMP2 GET NEW SECTOR # SLA EVEN #? INA NO, THEN MAKE IT EVEN CPA SECT2 ALL SECTORS ON TRACK TRANSFERRED? RSS YES JMP SETSC NO ISZ TEMP1 INCREMENT TRACK ADDRESS CLA SET SECTOR ADDRESS TO 0 SETSC STA TEMP2 NEW SECTOR ADDRESS JSB LOAD DLD SAVPG RESTORE SAVED VALUES STA $USRS FOR USER PART'N START PAGE STB $ABDP AND BAD PAGE POINTER LDA MEMSZ PASS MEMORY SIZE TO $CNFX STA $PCHN LDA LSTLU PASS LIST DEVICE LU$# TO $CNFX STA $WRRD LDA ECHO STA $TRTB PASS ECHO FLAG TO $CNFX CLA,INA SET THE BASE PAGE FENCE ADA BPA2 LWA OF USER BASE PAGE LINKS IOR BIT10 LFA LDB CNXID GET PRIMARY ENTRY POINT FOR $CNFX ADB .7 LDB B,I UJP B,I ENABLE USER MAP AND JUMP TO $CNFX * * CNXID NOP .24 DEC 24 .21 DEC 21 #PGS NOP #NPGS NOP BIT10 OCT 2000 B63 OCT 63 $SMTB NOP THIS TABLE HOLDS CHUNKS OF SAM EXTENSION NOP THE FORMAT FOR EACH TWO WORD ENTRY IS: NOP WORD 1 - START PHYSICAL PAGE# OF A CHUNK NOP WORD 2 - # PAGES IN THIS CHUNK NOP NOP NOP NOP NOP NOP E$SMT DEF *-1 A$SMT DEF $SMTB AEQT4 DEF EQT4 * ABORT HLT 22B HALT SYSTEM JMP *-1 * HED EXIT CONFIGURATOR $EXIT LDA $GDPG MEMORY RE-CONFIGURATION WAS SSA,RSS MADE PERMANENT? JMP EXIT2 NO, RESET SYTEM MAP FOR SAM EXT LDA AEQT4 YES, MAKE EQT4 WORD ON BASE PAGE LDB $SAVE+4 CONTENTS JSB LOCTR JMP EXIT5 * EXIT2 LDA $SMTB+2 SYSTEM MAP NEEDS TO BE SZA,RSS RESET FOR SAM EXTENSION? JMP EXIT5 NO LDB A$SMT YES, POINTER TO $SMTB STB TEMP LDA $ENDS LOGICAL START PAGE OF SAM EXTENSION SMELP LDB TEMP,I PHYSICAL START PG OF A CHUNK OF SAM EXT SZB,RSS DEFINED? JMP EXIT5 NO, THEN DONE ADB BIT14 WRITE PROTECT SAM EXTENSION ISZ TEMP YES,POINT TO #PGS IN THIS CHUNK OF SAM EXT LDX TEMP,I COUNTER IN X REG XMS TRANSFER SEQUENTIALLY TO DMS REGISTERS LDB E$SMT POINTER TO END OF $SMTB CPB TEMP AT THE END OF THE TABLE? JMP EXIT5 YES, THEN DONE ISZ TEMP NO, THEN SET UP NEXT CHUNK OF SAM EXT JMP SMELP * EXIT5 LDB CNXID ID SEG ADDR OF $CNFX SZB,RSS PRESENT? JMP EXIT1 NO LDA COMMA YES, CHANGE NAME TO ,,,,, ADB .12 STA B,I INB STA B,I INB LDA B,I GET CONTENTS OF NAME 5 WORD AND B377 MASK LOWER BYTE STA B,I SAVE IT LDA COMMA AND B1774 MASK UPPER BYTE ADA B,I STA B,I RESTORE 5TH CHAR OF NAME * EXIT1 LDA SWREG GET THE SWITCH REGISTER SSA,RSS RECONFIGURATION WAS REQUESTED? JMP EXIT4 NO * LDA $SAVE,I GET THE EQT WORD 4 OF SYS CONSOLE EQT STA $SMTB SAVE THE WORD IN A TEMP LOCATION LDA $SAVE ADDRESS OF EQT WORD 4 OF SYS CONSOLE ADA N3 POINT TO EQT WORD 1 LDB .15 # OF WORDS IN EQT JSB DSKRD READ THE EQT FROM DISC * LDA $SMTB GET THE CONTENTS OF EQT 4 SAVED STA $SAVE,I RESTORE IN EQT 4 WORD AND B77 GET SC FOR SYS CONSOLE STA $SMTB SAVE SELECT CODE FOR SYS CONSOLE ADA INTBA INDEX INTO THE INTERRUPT TABLE ADA N6 STA $SMTB+1 SAVE POINTER INTO INTERRUPT TABLE FOR SYS CONSOLE LDA $SAVE ADDRESS OF EQT WORD 4 ADA .8 POINT TO EQT EXTENSION SIZE WORD LDB A,I GET THE EQT EXTENSION SIZE WORD SZB,RSS EQT EXTENSION DEFINED? JMP EXIT8 NO * INA YES, POINT TO EQT EXTENSION ADDRESS LDA A,I JSB DSKRD READ EQT EXTENSION FROM THE DISC * EXIT8 LDA CTRCL GET SAVED CONTENTS OF TRAP CELL LDB CINTB AND INTERRUPT TABLE FOR SYS CONSOLE STA $SMTB,I RESTORE TRAP CELL AND INTERRUPT TABLE STB $SMTB+1,I ENTRIES WITH ORIGINAL CONTENTS * EXIT4 LDA $SAVE RESTORE THE SAVED BASE PAGE ADA N3 POINT TO START OF CONSOLE EQT STA SYSTY DLD $SAVE+1 EQT1 AND EQT2 DST EQT1 DLD $SAVE+3 EQT3 & EQT4 DST EQT3 DLD $SAVE+12 EQT5 & EQT6 DST EQT5 CLA STA EQT7 STA EQT8 STA EQT9 STA EQT10 STA EQT11 STA EQT12 * * SET ORIGINAL SAM DESCRIPTOR BLOCK * SOSAM DLD DEQT1,I GET NEXT BLOCK OF SAM SZA,RSS JMP EXIT3 NONE THEN FINISHED SWP $OSAM IS WORDS/ADDRESS DST OSAM,I ADB A SEE IF NEXT BLOCK IS ISZ DEQT1 CONTIGUOUS ISZ DEQT1 CPB DEQT1,I RSS JMP SOSM1 ISZ DEQT1 THEN COMPUTE TOTAL BLOCK SIZE ADA DEQT1,I STA OSAM,I AND STUFF ISZ DEQT1 SOSM1 ISZ OSAM ISZ OSAM JMP SOSAM * EXIT3 LDA $SAVE+5 DUMMY STA DUMMY LDA $SAVE+6 SKEDD STA SKEDD LDA $SAVE+7 STA $LIST LDA $SAVE+11 TRAP CELL CONTENTS FOR POWER FAIL STA .4,I RESTORE TRAP CELL 4 JSB BUFFR BUFFER CONSOLE AND LIST DEVICE EQT'S * * JMP $CNFG,I RETURN CONTROL TO THE OP SYSTEM * BIT14 OCT 40000 COMMA ASC 1,,, DEQT1 DEF EQT1 OSAM DEF $OSAM+0 HED SUBROUTINES FOR I/O RECONFIGURATION * * * INENT - THIS PROCEDURE IS PERFORMED FOR EVERY OLD AND * NEW SELECT CODEL PAIRS. APPROPRIATE INTERRUPT TABLE * AND TRAP CELL VALUES ARE INSERTED INTO INTBL AND TRPCL * OLDSC AND EQT WORD 4 ADDRESS ARE INSERTED INTO ENTRIES * IN OLSCT AND EQTBL * * JNENT - ENTRY POINT IS USED FOR DISC , CONSOLE AND LIST * DEVICE SC CONFIGURATION * * CALLING SEQUENCE: JSB INENT * OLD AND NEW SELECT CODE VALUES ARE ASSUMED * TO BE IN OLDSC AND NEWSC RESP. * RETURN: P FOR ERROR RETURN IF OLDSC WAS ASSIGNED TO * OR NEWSC IS SC NEWSC FOR DISC,CONSOLE OR LIST DEV * SAME AS DISC , CONSOLE OR LIST DEVICE SC * * INENT NOP CLA CLEAR FLAG TO ALLOW CHECKS FOR STA JNENT OLD SC AGAINST CURNT ENTRIES LDA B10 START SC # STA TEMP3 SAVE IT LDB AOLSC ADDRESS OF OLD SC TABLE OLDSL LDA B,I GET CONTENTS OF ENTRY IN OLDSC TABLE CPA OLDSC OLDSC ALREADY ASSIGNED? RSS YES JMP ENSCL NO LDA TEMP3 SC # TO WHICH OLDSC WAS ASSIGNED JSB CHKSC NEWSC FOR DISC,CONSOLE OR LIST DEV? JMP INENT,I YES, ERROR RETURN LDA NEWSC NEW SC # IS DISC ,CONSOLE OR LIST DEV? JSB CHKSC JMP INENT,I YES, ERROR RETURN LDA TEMP3 TEMP3 IS SC TO WHICH OLDSC WAS ASSIGNED ADA NB10 LDB AINTB ADB A POINT INTO INTBL FOR TEMP3 ENTRY STB TEMP1 SAVE THIS ADDRESS LDB ATRPC ADB A POINT INTO TRPCL TABLE FOR TEMP3 ENTRY STB TEMP2 SAVE IT LDA .N56 COUNTER FOR OLD SC TABLE STA TEMP4 LDB AOLSC START OF OLDSC TABLE OLDS2 LDA B,I INB CPA TEMP3 HAS SC TO WHICH OLD SC WAS ASSIGNED JMP ASGND BEEN ASSIGNED TO ANOTHER SC ISZ TEMP4 NO JMP OLDS2 CCA CCB JMP INEN2 ASGND CLA YES, THEN CLEAR INTBL ENTRY LDB JSBCI AND JSB CIC,I IN THIS SC'S ENTRIES INEN2 STA TEMP1,I SET UP INTBL AND TRPCL ENTRIES FOR PREV SC STB TEMP2,I LDA TEMP3 POINT INTO OLD SC TABLE FOR ADA NB10 PREV ENTRY STA TEMP2 SAVE IT ADA AOLSC CCB STB A,I ERASE IT LDA AEQTB ERASE ENTRY IN EQTBL ADA TEMP2 STB A,I LDA TBGSV CPA TEMP3 WAS IT A TBG? STA TBG YES, RESET TBG LDA PRVSV PRIV I/O? CPA TEMP3 WAS IT A PRIV I/O? STA $SAVE+5 YES, RESET PRIV I/O CARD JMP INEN5 CONTINUE I/O CONFIGURATION * ENSCL ISZ TEMP3 LDA TEMP3 CPA B77 ALL OLDSC TABLE ENTRIES LOOKED AT? JMP INEN3 YES INB NO JMP OLDSL * INEN3 LDA NEWSC JSB CHKSC NEW SC # THAT OF DISC,CONSOLE OR LISTDEV? JMP INENT,I ERROR JMP INEN5 * JNENT NOP ENTRY POINT FOR DISC,CONSOLE AND LIST DEVICE LDA JNENT STA INENT INEN5 CLB LDA NEWSC NEW SELECT CODE # CPA TBG IS NEW SELECT CODE TBG CHANNEL? STB TBG YES CPA $SAVE+5 IS NEW SELECT CODE PRV CHANNEL? STB $SAVE+5 YES, CLEAR IT LDB OLDSC OLD SELECT CODE # CPB TBGSV IS THE OLD SELECT CODE TBG CHANNEL? STA TBG YES, THEN RESET TBG CHANNEL CPB PRVSV IS THE OLD SELECT CODE PRIV I/O CHANNEL? RSS YES JMP INEN7 NO SZA,RSS IS NEW SELECT CODE 0? STB NEWSC YES, SET NEW SELECT CODE TO OLDSC STA $SAVE+5 * INEN7 LDB NEWSC GET NEW SELECT CODE VALUE ADB NB10 PREPARE TO INDEX INTO INTBL AND TRPCL STB TEMP1 LDA AINTB ADDRESS OF INTBL PGSRM ADA B POINT TO NEWSC ENTRY IN INTBL STA TEMP2 SAVE IT LDA ATRPC ADA B POINT TO NEWSC ENTRY IN TRPCL STA TEMP3 SAVE POINTER $USRS LDA N4 IS OLDSC ENTRY MADE IN SVTBL? ENDSM STA TEMP TEMP IS COUNTER LDA ASVTB ADDRESS OF SVTBL SVLP LDB A,I GET VALUE CPB OLDSC OLD SELECT CODE? JMP SVTBE YES ADA .4 NO, LOOK AT NEXT ENTRY ISZ TEMP JMP SVLP * OLD SELECT CODE ENTRY IS NOT IN SVTBL * NEWEN LDA JNENT GET FLAG, CHECK IF CONFIGURING SZA SYSTEM CONSOLE, DISC OR LIST DEV JMP GTTRP YES, SKIP CHECK AGAINST CURNT ENTRIES LDA OLDSC IS OLDSC SAME AS SC FOR DISC, SYS JSB CHKSC CONSOLE OR LIST DEV CURRENT SC? JMP INENT,I YES, ERROR RETURN * GTTRP LDA OLDSC,I GET TRAP CELL ENTRY FOR OLDSC STA TEMP3,I STORE OLDSC VALUE IN NEWSC ENTRY IN TRPCL LDA INTBA INTERRUPT TABLE ENTRY FOR OLDSC ADA N6 ADA OLDSC LDA A,I STA TEMP2,I STORE OLDSC VALUE IN NEWSC ENTRY IN INTBL LDA OLDSC JSB EQTFN FIND EQT WORD 4 ADDRESS FOR OLDSC STEQT LDA AEQTB ADA TEMP1 POINTER INTO EQTBL FOR NEWSC ENTRY STB A,I STORE EQT ADDRESS IN EQTBL ENTOL LDA AOLSC ADA TEMP1 POINT TO OLDSC TABLE ENTRY FOR NEWSC CAX SAVE THIS ADDRESS JSB PRVOL RESTORE PREV OLD SC IF NECESSARY CXA RESTORE ADDRESS INTO AOLSC LDB OLDSC GET OLDSC VALUE STB A,I STORE IT * OLDEN LDB OLDSC OLD SELECT CODE ENTRY ADB NB10 LDA AINTB GET VALUE OF OLDSC IN INTBL ADA B STA TEMP2 SAVE ADDRESS LDA A,I CPA N1 HAS IT BEEN ASSIGNED A VALUE SO FAR? RSS NO JMP RINEN YES,RETURN CLA CLEAR INTBL ENTRY FOR OLDSC STA TEMP2,I LDA ATRPC ADDRESS OF TRPCL ADA B POINT TO OLDSC ENTRY IN TRPCL LDB JSBCI ENTER JSB CIC,I FOR OLD SC STB A,I IN TRPCL JMP RINEN RETURN * OLD SC ENTRY IS IN SVTBL SVTBE INA LDB A,I STB TEMP3,I NEWSC ENTRY IN TRPCL INA LDB A,I STB TEMP2,I NEWSC ENTRY IN INTBL INA LDB A,I EQT PRESENT FOR THIS SC? SSB JMP ENTOL NO JMP STEQT YES, THEN SET EQT ADDRESS * RINEN ISZ INENT GOOD RETURN JMP INENT,I * NB10 OCT -10 .N56 DEC -56 * * * CHKSC - ROUTINE TO CHECK IF GIVEN SC IS SAME AS SC CURRENTLY * USED FOR DISC, CONSOLE OR LIST DEVICE * CALLING SEQUENCE: A REG = SC# * JSB CHKSC * RETURN: P IF SC# MATCHES NEW SC FOR ABOVE * P+1 OTHERWISE * * CHKSC NOP STA EQTFN SAVE LDA N4 COUNTER FOR CURNT STA PRVOL SAVE IT LDB ACURN ADDRESS OF CURNT CHKLP LDA B,I GET A SC # CPA EQTFN MATCHES? JMP CHKSC,I YES INB POINT TO NEXT ENTRY IN CURNT ISZ PRVOL ALL ENTRIES CHECKED? JMP CHKLP NO * ISZ CHKSC JMP CHKSC,I RETURN TO P+1 * ACURN DEF CURNT * * * EQTFN - THIS ROUTINE FINDS ADDRESS OF WORD 4 OF * EQT BELONGING TO SELECT CODE VALUE IN OLDSC * EQT # - 1 IS ALSO RETURNED * * CALLING SEQUENCE: A REG = SC # * JSB EQTFN * RETURNS: B REG = ADDR OF EQT WORD 4 IF EQT PRESENT * = -1 IF EQT NOT FOUND * TEMP5 = EQT # - 1 (VALID ONLY IF EQT FOUND) * * EQTFN NOP STA TEMP6 CLA STA TEMP5 COUNTER TO FIND THE RIGHT EQT LDB EQTA ADDRESS OF EQT ADB .3 POINT TO WORD 4 OF EQT LPEQT LDA B,I GET CONTENTS OF WORD 4 AND B77 MASK SELECT CODE # CPA TEMP6 IS IT SAME AS OLDSC JMP EQTFN,I YES, THEN RETURN ISZ TEMP5 NO LDA TEMP5 CPA EQT# ALL EQT'S LOOKED AT? JMP EXEQT YES ADB .15 NO,POINT TO WORD 4 OF NEXT EQT JMP LPEQT * EXEQT CCB EQT NOT FOUND JMP EQTFN,I RETURN * * * PRVOL - ROUTINE CHECKS IF THIS NEWSC WAS ASSIGNED * A SELECT CODE PREVIOUSLY. IF SO, CHECK IF THIS * PREVIOUS SELECT CODE WAS ASSIGNED A NEW VALUE * IF NO VALUE WAS ASSIGNED DO NOT DESTROY ITS ORIGINAL * VALUE * FOR EG. 12,10 * 13,10 * THEN 12 SHOULD NOT BE DESTROYED * * CALLING SEQUENCE: A REG = POINTER INTO OLSCT FOR NEWSC ENTRY * JSB PRVOL * * PRVOL NOP LDB A,I WAS NEWSC PREVIOUSLY ASSIGNED ANOTHER SC? CPB N1 JMP PRVOL,I NO, THEN RETURN ADB NB10 YES CBY ADB AOLSC LDA B,I CPA N1 DOES IT HAVE AN ASSIGNMENT MADE? RSS NO JMP PRVOL,I YES CYB NO, THEN CHANGE ITS TRPCL AND INTBL ADB ATRPC ENTRIES TO -1 STA B,I CYB ADB AINTB STA B,I CYB ADB AOLSC -1 IN OLDSC ENTRY STA B,I CYB ADB AEQTB -1 IN EQTBL ENTRY STA B,I JMP PRVOL,I RETURN * * * RSENT - ROUTINE TO MAKE ENTRIES IN RSTBL, * THE RESTORE TABLE USED TO SAVE TRPCL,INTBL,EQTBL VALUES * FOR OLD SC AND NEW SC OF DISC, CONSOLE AND LIST DEVICE * FORMAT OF RSTBL IS : ENTRIES FOR DISC SC # 1 * " " " " # 2 * " " CONSOLE * " " LIST DEVICE * * EACH SET OF ENTRIES IS 6 WORDS LONG AS FOLLOWS: * WORD 1 - OLD SC# * WORD 2 - INTBL VALUE FOR OLDSC * WORD 3 - TRPCL VALUE FOR OLDSC * WORD 4 - INTBL VALUE FOR NEWSC * WORD 5 - TRPCL VALUE FOR NEWSC * WORD 6 - EQT WORD 4 ADDRESS FOR NEWSC * * CALLING SEQUENCE: A REG = POINTER INTO RSTBL FOR ENTRIES * JSB RSENT * NOTE: RSENT ASSUMES OLDSC AND NEWSC CONTAIN VALUES * FOR OLD AND NEW SELECT CODES RESPECTIVELY * * RSENT NOP STA TEMP SAVE POINTER INTO RSTBL LDA OLDSC OLD SELECT CODE VALUE STA TEMP,I STORE IT IN RSTBL JSB SVRST STORE OLD SC'S INTBL & TRPCL ENTRIES LDA NEWSC NEW SELECT CODE VALUE JSB SVRST STORE NEW SC'S INTBL & TRPCL ENTRIES ISZ TEMP POINT TO WORD 6 LDA AEQTB ADDRESS OF EQTBL ADA NB10 POINT TO ENTRY FOR NEWSC ADA NEWSC LDA A,I GET EQT WORD 4 ADDRESS STA TEMP,I MAKE ENTRY IN RSTBL JMP RSENT,I RETURN * * * SVRST - ROUTINE TO STORE INTBL AND TRPCL VALUES * OF A GIVEN SELECT CODE INTO RSTBL * CALLING SEQUENCE: A REG = SELECT CODE VALUE * JSB SVRST * NOTE: TEMP IS ASSUMED TO BE POINTING AT ENTRY * PREVIOUS TO THE ONE TO BE MADE BY SVRST * * SVRST NOP ISZ TEMP POINT TO RSTBL ADA NB10 INDEX INTO INTBL STA B ADA AINTB LDA A,I GET VALUE FOR INTBL ENTRY STA TEMP,I STORE IT IN RSTBL ISZ TEMP ADB ATRPC INDEX INTO TRPCL LDA B,I GET VALUE STA TEMP,I STORE VALUE IN RSTBL JMP SVRST,I RETURN * * * RESTR - ROUTINE TO RESTORE INTBL AND TRPCL VALUES * FOR A GIVEN SELECT CODE THAT WERE SAVED IN RSTBL * CALLING SEQUENCE: B REG = SELECT CODE# - 10B (INDEX * VALUE TO BE USED IN INTBL & TRPCL) * JSB RESTR * * RESTR NOP STB TEMP1 SAVE INDEX VALUE ADB AINTB POINTER INTO INTBL ISZ TEMP POINT TO SAVED ENTRY IN RSTBL LDA TEMP,I VALUE OF INTBL ENTRY STA B,I RESTORE IT IN INTBL LDB TEMP1 ADB ATRPC POINTER INTO TRPCL ISZ TEMP POINT TO SAVED ENTRY IN RSTBL LDA TEMP,I VALUE OF TRPCL ENTRY STA B,I RESTORE IT IN TRPCL JMP RESTR,I RETURN * * * IPROC - THIS ROUTINE TRANSFERS A SELECT CODE'S VALUES * FROM INTBL AND TRPCL INTO INTERRUPT TABLE AND TRAP CELL * AND CHANGES SELECT CODE # IN EQT IF NECESSARY * * CALLING SEQUENCE: JSB IPROC * A REG = SELECT CODE # * * IPROC NOP STA TEMP ADA NB10 STA TEMP1 SAVE VALUE ADA AINTB POINT TO SC ENTRY IN INTBL LDB A,I CPB N1 GIVEN A VALUE? JMP IPROC,I NO, THEN RETURN * LDA INTBA ADDRESS OF INTERRUPT TABLE ADA N6 ADA TEMP POINT TO SC ENTRY IN INTERRUPT TABLE STB A,I STORE INTBL VALUE IN INTERRUPT TABLE LDA ATRPC ADDRESS OF TRPCL ADA TEMP1 POINT TO SC ENTRY IN TRPCL LDA A,I STA TEMP,I STORE IT IN TRAP CELL LDA AEQTB ADA TEMP1 LDB A,I GET EQTBL ENTRY FOR THIS SC SSB DEFINED? JMP IPRC5 NO,CLEAR EXISTING EQT ENTRIES FOR NEWSC LDA B,I YES, GET CONTENTS OF EQT WORD 4 AND B77 MASK OLD SELECT CODE # CPA TEMP OLDSC = NEWSC? JMP IPROC,I YES, NO NEED TO CHANGE SC'S STA OLDSC NO, SAVE THIS OLDSC VALUE LDA EQT# # OF EQT'S DEFINED CMA,INA STA TEMP5 USE AS COUNTER LDB EQTA ADDRESS OF START OF EQT TABLES ADB .3 POINT TO WORD 4 LEQT# CPB RSTBL+5 EQT ADDRESS OF SYSTEM DISC? JMP ENEQL YES, LOOK FOR NEXT EQT CPB RSTBL+17 EQT ADDRESS OF SYSTEM CONSOLE? JMP ENEQL CPB RSTBL+23 EQT ADDRESS OF LIST DEVICE? JMP ENEQL YES LDA B,I GET CONTENTS OF WORD 4 OF EQT AND B77 GET OLD SC# CPA OLDSC MATCHES ONE WE ARE LOOKING FOR? RSS YES JMP ENEQL NO, LOOK AT NEXT EQT LDA N3 POINT TO FIRST WORD OF THIS EQT ADA B STA TEMP4 SAVE ADDRESS OF THIS EQT LDA A,I GET CONTENTS OF THE FIRST WORD CPA N1 PREVIOUSLY CHANGED ? JMP ENEQL YES CCA NO,CHANGE TO NEWSC AND SET FLAG STA TEMP4,I TO INDICATE THIS LDA B,I GET CONTENTS OF WORD 4 OF EQT AND B1777 CLEAR BITS FOR SC IOR TEMP INSERT NEW SC STA B,I RESTORE EQT WORD 4 ENEQL ADB .15 POINT TO NEXT EQT'S WORD 4 ISZ TEMP5 INCREMENT COUNTER JMP LEQT# DO NEXT ONE * IPRC5 LDA NOCLR FLAG SET TO SKIP THIS? SSA JMP IPROC,I YES, THEN RETURN JMP IPRC7 JPROC NOP ENTRY POINT FOR CONSOLE AND LIST SC STA TEMP LDA JPROC SET UP RETURN ADDRESS STA IPROC IPRC7 LDA AOLSC START OF OLDSC TABLE LDB .N56 USE AS COUNTER STB TEMP5 OLSLP LDB A,I GET CONTENTS OF ENTRY IN OLDSC TABLE CPB TEMP SAME AS NEW SELECT CODE? JMP IPROC,I YES, RETURN INA NO, LOOK FURTHER ISZ TEMP5 JMP OLSLP LDA EQT# NEW SC IS NOT ASSIGNED TO ANY OTHER SC# CMA,INA THEN CLEAR OUT NEW SC # FROM OLD EQT'S STA TEMP5 LDB EQTA IPRLP LDA B,I GET FIRST WORD OF EQT SSA -1? JMP ENIPR YES, THEN NEW SC IN IT ADB .3 NO CPB RSTBL+5 EQT ADDRESS OF SYSTEM DISC? JMP ENIPR YES, LOOK FOR NEXT EQT CPB RSTBL+17 EQT ADDRESS OF SYSTEM CONSOLE? JMP ENIPR YES, LOOK FOR NEXT EQT CPB RSTBL+23 EQT ADDRESS OF LIST DEVICE? JMP ENIPR YES, LOOK FOR NEXT EQT LDA B,I GET CONTENTS OF WORD 4 OF EQT AND B77 GET SC # CPA TEMP IS THIS SAME AS NEW SC#? RSS YES JMP ENIPR NO, LOOK AT NEXT EQT LDA B,I YES AND B1777 THEN CLEAR SC# STA B,I RESTORE EQT WORD 4 ENIPR ADB .12 POINT TO NEXT EQT ISZ TEMP5 MORE EQT'S LEFT? JMP IPRLP YES JMP IPROC,I NO, RETURN * * * TSTCH - ROUTINE TO TEST THE VALIDITY OF A SELECT CODE# * CALLING SEQUENCE: JSB TSTCH * B REG = POINTER TO PARSE BUFFER * CONTAINING THE 4 WORD SET FOR SELECT CODE# * TO BE TESTED * * RETURN : LOC P IF AN ERROR RETURN * LOC P+1 IF NORMAL RETURN * * TSTCH NOP STB TEMP4 POINTER TO PARSE BUFFER INB STB TEMP5 LDA B,I GET VALUE CLB DIV .10 CONVERT VALUE TO OCTAL ALS CMA,INA ADA TEMP5,I STA TEMP5,I RESTORE VALUE LDB TEMP4 GET POINTER TO PARSE BUFFER LDA B10 10 OCTAL IS LOWER LIMIT JSB TST# TEST THE SELECT CODE # B77 OCT 77 UPPER LIMIT FOR SELECT CODE # JMP CHNLE ERROR ISZ TSTCH VALID SELECT CODE # JMP TSTCH,I NORMAL RETURN TO P+1 LOC * CHNLE LDA A2 JSB ERROR DISPLAY ERROR MESSAGE JMP TSTCH,I * .10 DEC 10 * * * * TST# - ROUTINE TO TEST VALIDITY OF A GIVEN # * CALLING SEQUENCE: A REG=LOWER LIMIT OF RANGE FOR # * B REG=POINTER TO 4 SET OF WORDS * FOR # IN PARSE BUFFER * JSB TST# * DEC(OR OCT) UPRLM UPPER LIMIT * RETURN: LOC P IF ERROR RETURN * LOC P+1 IF NORMAL RETURN * NUMBER IS IN THE A REG * * TST# NOP CBX SAVE CONTENTS OF B REG LDB B,I TYPE OF VALUE CPB .1 NUMERIC? RSS YES JMP TSTE NO THEN ERROR RETURN CXB RETRIEVE VALUE OF B REG INB LDB B,I GET VALUE CMA,INA -VE OF LOWER LIMIT ADA B VALUE-LOWER LIMIT SSA LOW LIMIT > VALUE? JMP TSTE YES, ERROR RETURN LDA B CMA,INA ADA TST#,I UPPER LIMIT-VALUE SSA VALUE > UPPER LIMIT? JMP TSTE YES, ERROR LDA B ISZ TST# NORMAL RETURN TSTE ISZ TST# JMP TST#,I RETURN * * * SVENT - ROUTINE TO MAKE ENTRY IN SVTBL * SVTBL HAS ENTRIES FOR TWO DISC SELECT CODES, * CONSOLE AND LIST DEVICE SELECT CODES IN THAT ORDER * EACH ENTRY IN SVTBL IS 4 WORDS LONG AND * CONTAINS THE FOLLOWING: * WORD 1 - NEW SC # * WORD 2 - ORIGINAL TRAP CELL CONTENTS OF NEW SC * WORD 3 - ORIGINAL INTERRUPT TABLE CONTENTS OF NEW SC * WORD 4 - ORIGINAL EQT WORD 4 ADDRESS OF NEW SC * * CALLING SEQUENCE: A REG = POINTER TO ENTRY IN SVTBL * JSB SVTBL * ASSUME: NEWSC HAS VALUE OF SC FOR SVTBL ENTRY * * SVENT NOP LDB NEWSC NEW SELECT CODE # STB A,I ENTER IN SVTBL INA POINT TO NEXT ENTRY IN SVTBL LDB NEWSC,I VALUE OF NEWSC'S TRAP CELL STB A,I SAVE IT IN SVTBL INA POINT TO NEXT ENTRY IN SVTBL LDB INTBA ADDRESS OF INTERRUPT TABLE ADB N6 ADB NEWSC POINTER TO NEWSC ENTRY IN LDB B,I INTERRUPT TABLE STB A,I STORE INTRPT TABLE VALUE IN SVTBL INA POINT TO NEXT ENTRY STA TEMP SAVE IT LDA NEWSC JSB EQTFN FIND EQT WORD 4 ADDRESS FOR THIS SC STB TEMP,I STORE IT IN SVTBL JMP SVENT,I RETURN * * * EQTCN - INSERT NEW SC IN EQT, FIND OLD SC # AND * UNBUFFER DEVICE IF BUFFERED * CALLING SEQUENCE: B REG = ADDRESS OF EQT WORD 4 * JSB EQTCN * RETURN: TEMP2=0 IF DEVICE NOT BUFFERED * 1 OTHERWISE * EQTCN NOP JSB EQUNB UNBUFFER EQT IF BUFFERED BIT SET LDA B,I VALUE OF EQT WORD 4 AND B77 MASK SELECT CODE STA OLDSC SAVE IT LDA B,I AND B1777 CLEAR LOW 6 BITS ADA NEWSC ADD NEW SELECT CODE STA B,I RESTORE WORD 5 JMP EQTCN,I RETURN * * * EQUNB - ROUTINE TO UNBUFFER EQT WORD 4 IF THE B BIT WAS SET * CALLING SEQUENCE: B REG = ADDRESS OF EQT WORD 4 * JSB EQUNB * RETURNS: TEMP2 = 0 IF EQT BUFFER STATUS WAS NOT CHANGED * = 1 IF EQT BUFFER STATUS WAS CHANGED * NOTE: B REG IS UNCHANGED * * EQUNB NOP CLA STA TEMP2 LDA B,I CONTENTS OF WORD 4 OF EQT RAL,RAL CLE,SLA BUFFERED? - BIT 14 SET? ISZ TEMP2 YES, THEN TEMP2 IS SET ERA,RAR CLEAR BIT 14 IF SET STA B,I RESTORE EQT WORD 4 JMP EQUNB,I RETURN * * * BUFFR - ROUTINE RESTORES THE STATUS OF CONSOLE * AND LIST DEVICE EQT'S TO BUFFERED IF THEY WERE ORIGINALLY * BUFFERED * CALLING SEQUENCE: JSB BUFFR * * BUFFR NOP LDA $SAVE+9 WAS CONSOLE EQT BUFFERED? SZA,RSS JMP LSBUF NO LDA $SAVE,I YES, GET CONTENS OF WORD 4 OF CONSOLE EQT STA PRTMP SAVE IT TEMPORARILY IOR BIT14 RESTORE BUFFER STATUS STA $SAVE,I RESTORE EQT WORD 4 LSBUF LDA $SAVE+10 LIST DEVICE EQT WAS BUFFERED? SZA,RSS JMP BUFFR,I NO, THEN RETURN LDA $SAVE+8,I YES, GET CONTENTS OF WORD 4 OF LIST DEV EQT STA PRTMP+1 SAVE EQT WORD 4 CONTENTS TEMPORARILY IOR BIT14 RESTORE BUFFER STATUS STA $SAVE+8,I RESTORE EQT WORD 4 CONTENTS JMP BUFFR,I RETURN * * * SETM - ROUTINE SETS MEMORY LOCATIONS TO GIVEN VALUE * CALLING SEQUENCE: A REG= VALUE * B REG = # OF LOCATIONS TO BE CHANGED * JSB SETM * DEF LOC STARTING LOCATION * SETM NOP CAX SAVE VALUE OF A REG IN X LDA SETM,I STARTING LOCATION STA TEMP ADDRESS OF LOC ISZ SETM CMB,INB -VE COUNT CXA VALUE IN A SETLP STA TEMP,I STORE VALUE INB,SZB,RSS INCREMENT COUNTER JMP SETM,I RETURN ISZ TEMP POINT TO NEXT MEM LOC JMP SETLP HED SUBROUTINES TO LOAD DATA FROM DISC TO MEMORY * * * DSCAD - ROUTINE TO SEPARATE DISC ADDRESS INTO * TRACK AND SECTOR # * CALLING SEQUENCE: A REG = DISC ADDR BITS 0-6 SECTOR * 7-15 TRACK * JSB DSCAD * RETURNS: TEMP1 IS TRACK #, TEMP2 IS SECTOR # * * DSCAD NOP CLB LSL 9 TRACK # IN B REG STB TEMP1 SAVE IT ALF,ALF SECTOR# RAR STA TEMP2 SAVE IT JMP DSCAD,I RETURN * * * LOAD - ROUTINE TO LOAD DATA FROM DISC INTO MEMORY * CALLING SEQUENCE : JSB LOAD * * LOAD NOP JSB SETUP SET UP TRIPLETS STA PRMAR ADDRESS OF START OF TRIPLETS JSB $XSIO MAKE SYSTEM I/O REQUEST .2 OCT 2 LU# DEF CLOAD COMPLETION ROUTINE ADDRESS NOP FOR SYSTEM USE OCT 1 PRMAR NOP ARRAY ADDRESS DEC 0 BIT15 OCT 100000 LEAVE USER MAP AS IS JMP $XCQ WAIT FOR I/O TO COMPLETE CLOAD JMP LOAD,I RETURN * * * SETUP - THIS ROUTINE IS TAKEN FROM THE DISPATCHER * IT GENERATES PARAMETERS FOR DISC CALL GUARANTEEING * THAT ALL TRACK CROSSING CALLS ARE BROKEN DOWN INTO * SUB-CALLS SUCH THAT THE DISC DRIVER CAN HANDLE THE REQUEST. * THE CALLS ARE BROKEN UP IN TRIPLETS OF * STARTING MEMORY ADDRESS * NUMBER OF WORDS TO TRANSFER * TRACK/SECTOR ADDRESS * THE END OF CALL IS INDICATED BY A ZERO FOLLOWING LAST TRIPLET * CALLING SEQUENCE: * NOTE: THE TABLE OF TRIPLETS IS BUILT BOTTOM-UP. * THE CONTENTS OF LAST WORD OF TABLE MUST BE 0 - THIS WORD'S * ADDRESS IS ASSUMED TO BE APRMT * TEMP = NUMBER OF WORDS * TEMP1 = TRACK ADDRESS * TEMP2 = SECTOR ADDRESS * TEMP3 = STARTING MEMORY ADDRESS * RETURNS : ADDRESS OF START OF TRIPLETS IN PRMAR * * SETUP NOP CLA END OF PRMTBL MARKED BY 0 STA PRMTB LDA APRMT ADDRESS OF END OF PARM TABLE LDB TEMP COMPUTE # OF SECTORS SETU1 SZB,RSS ZERO, SO RETURN JMP SETUP,I ADA N3 SET UP TRIPLET STA PRMAR ADDRESS ADB B177 ROUND UP NUMBER OF SECTORS ASR 7 BLS STB TEMP5 SAVE # OF SECTORS LDA TEMP2 INITIAL SECTOR ADDRESS ADA B LDB SECT2 # OF SECOTRS ON SYSTEM DISC CMB,INB ADA B SUBTRACT # OF SECTORS/TRACK LDB TEMP3 STARTING MEMORY ADDRESS STB PRMAR,I STORE IT IN MEMORY ISZ PRMAR INCREMENT ARRAY ADDRESS CMA,CLE,INA,SZA CLE,SSA,RSS CHECK IF TRACK OVERFLOW JMP SETI0 NO, SO LAST TRIPLET ADA TEMP5 YES,USE REST OF TRACK IF OVER ASL 6 UPSET LDB TEMP1 FORM TRACK BLF,RBL AND RBL,RBL SECTOR ADDRESS ADB TEMP2 DST PRMAR,I STORE LAST 2 WORDS OF TRIPLET ADA TEMP3 UPDATE STARTING ADDRESS STA TEMP3 LDB TEMP2 INCREMENT SECTOR ADDRESS ADB TEMP5 TO START SECTOR FOR SEZ CHECK IF NEW TRACK CLB,RSS RSS NOT NEW TRACK SO SKIP ISZ TEMP1 YES, SO INCREMENT TRACK ADDRESS STB TEMP2 RESET SECTOR LDB PRMAR,I UPDATE NUMBER CMB,INB OF ADB TEMP WORDS STB TEMP TO GO CCA SUBTRACT 1 FOR CORRECT NEXT TRIPLET ADA PRMAR ADDRESS CALCULATION JMP SETU1 GO TO NEXT LOOP * SETI0 LDA TEMP SET FOR LAST JMP UPSET TRIPLET * HED READ AND WRITE MESSAGES TO THE SYSTEM CONSOLE * * ERROR - ROUTINE PRINTS ERROR MESSAGE * CALLING SEQUENCE: A REG = ERROR# IN ASCII * JSB ERROR * ERROR NOP STA ERR00+6 LDB .7 LENGTH OF BUFFER JSB WRTTY DISPLAY ON CONSOLE DEF ERR00 JMP ERROR,I RETURN * ERR00 ASC 7,CONFIG ERR * * * $WRRD- ROUTINE TO PERFORM I/O USING THE SYSTEM * I/O ROUTINE $XSIO * CALLING SEQUENCE: A REG = REQUEST CODE * B REG = BUF LNGTH OR * PRIORITY CODE IF DISC I/O * BIT 15 OF BREG SET IF CALLING FROM USER MAP * Y REG = LU # * 1 IF BUFFER IN USER MAP * JSB $WRRD * DEF BUFAD ADDRESS OF BUFFER * NOTE: SEE WRITE-UP ON $XSIO ROUTINE FOR FURTHER INFO * * $WRRD NOP STA REQCD REQUEST CODE STB TEMP SSB,RSS BIT 15 SET? JMP WRRD5 NO ELB,CLE,ERB CALLING FROM SUER MAP - CLEAR SIGN BIT STB BUFLN SET UP BUFFER LENGTH XLA $WRRD,I GET ADDRESS OF BUFFER IN USER AREA STA TEMP5 SAVE ADDRESS OF BUFFER IN USER MAP LDA ARDBF USE RDBUF TO MOVE USER BUFFER INTO STA BUFAD IT IS ALSO THE BUFFER ADDRESS LDA REQCD GET REQEST CODE SLA IS IT FOR WRITE? JMP WRRD7 NO, IT IS A READ REQUEST CBX BUFFER LENGTH IN X REG FOR MOVE LDB ARDBF DESTINATION BUFFER ADDRESS LDA TEMP5 SOURCE ADDRESS MWF MOVE WORDS FROM USER MAP INTO SYSTEM MAP JMP WRRD7 CONTINUE WITH I/O REQUEST WRRD5 LDA $WRRD,I GET VALUE OF BUFFER LNGTH DST BUFAD STORE BUFFER ADDRESS & LENGTH WRRD7 CYA RETRIVE Y REG STA LU# JSB $XSIO LU# NOP DEVICE LU# DEF CWRRD COMPLETION RETURN ADDRESS NOP FOR SYS USE REQCD NOP REQUEST CODE BUFAD NOP BUFFER ADDRESS BUFLN NOP BUFFER LENGTH DEC 0 MAP WORD=0 SINCE BUFFER ALWAYS IN SYS MAP JMP $XCQ WAIT FOR I/O COMPLETION CWRRD ISZ $WRRD COMPLETION RETRUN LDA TEMP SSA,RSS CALLING FROM SYSTEM MAP? JMP $WRRD,I YES, RETURN LDA REQCD GET REQUEST CODE SLA,RSS READ REQUEST? JMP RWRRD NO, THEN RETURN STB TEMP YES, THEN SAVE TRANSMISSION LOG CBX #OF WORDS READ LDA ARDBF ADDRESS OF READ BUFFER LDB TEMP5 ADDRESS OF DEST BUFFER IN USER MAP MWI MOVE WORDS INTO USER MAP LDB TEMP TRANSMISSION LOG RESTORED IN B REG RWRRD UJP $WRRD,I ENABLE USER MAP AND RETURN * * * QUERY - ROUTINE TO DISPLAY QUESTION ON CONSOLE AND * READ RESPONSE ANDS PARSE IT * * WRTTY - EMBEDDED IN QUERY, DISPLAYS MESSAGE ON CONSOLE * * CALLING SEQUENCE: B REG = # OF WORDS IN BUFFER TO DISPLAY * JSB QUERY(WRTTY) * DEF BUFR MESSAGE TO BE DISPLAYED * QUERY NOP CCA SET FLAG TO INDICATE QUERY ROUTINE JMP CONTQ CONTINUE WRTTY NOP LDA WRTTY STA QUERY CLA CLEAR FLAG TO INDICATE CONSOLE WRITE ROUTINE CONTQ STA WFLAG SET FLAG TO -1 LDA QUERY,I STA QBUFR CLA,INA LU # 1 CAY IN Y REG INA REQ CODE IS 2 FOR WRITE JSB $WRRD QBUFR NOP ISZ WFLAG WRTTY ROUTINE? JMP RQUER YES, RETURN * * READ RESPONSE JSB $XSIO .1 OCT 1 CONSOLE LU DEF CREAD COMPLETION ROUTINE ADDRESS NOP OCT 401 REQUEST CODE ARDBF DEF RDBUF READ BUFFER .80 DEC 80 80 WORDS NOP SYSTEM MAP JMP $XCQ WAIT FOR I/O COMPLETION CREAD LDA ARDBF ADDRESS OF READ BUFFER BLS CONVERT WORD COUNT TO CHAR. COUNT JSB $PRSE SYSTEM ROUTINE TO PARSE APRSB DEF PRSBF PARSE BUFFER RQUER ISZ QUERY JMP QUERY,I RETURN * * * WRLST - ROUTINE TO WRITE BUFFER ON LIST DEVICE AND * THE SYS CONSOLE IF ECHO IS REQUESTED * * CALLING SEQUENCE: B REG = BUFFER LENGTH * BIT 15 OF B REG SET IF CALLING FROM USER MAP * JSB WRLST * DEF BUFR BUFFER ADDRESS * * NOTE: IT IS ASSUMED THAT IF CALLING FROM USER MAP, * THE BUFFER IS ALSO IN THE USER MAP * WRLST NOP STB TEMP4 LDA WRLST,I BUFFER ADDRESS FROM SYSTEM MAP STA CNBF STA LSBF LDA ECHO ECHO REQUIRED? SZA JMP NECHO NO ECHO JSB WRTTY WRITE ON CONSOLE CNBF NOP * NECHO LDA LSTLU LIST LU CAY LU # IN Y REG LDB TEMP4 BUFFER ADDRESS LDA B202 REQUEST CODE,CONTROL INFO JSB $WRRD LSBF NOP ISZ WRLST POINT TO RETURN ADDRESS JMP WRLST,I RETURN * B202 OCT 202 * * * PRNIO - THIS ROUTINE PRINTS I/O CONFIGURATION OF THE SYSTEM * THE FORMAT IS: * CALLING SEQUENCE : JSB PRNIO * * PRNIO NOP LDA AMSG5 SOURCE BUFFER ADDRESS LDB ARDBF DEST BUFFER ADDRESS MVW .8 LDA INTBA ADDRESS OF THE INTERRUPT TABLE ADA .2 POINT TO ENTRY FOR SC 10 OCTAL STA TEMP1 SAVE IT LDB INTLG LENGTH OF THE INTERRUPT TABLE ADB N2 ADJUST TO SKIP I/O SELECT CODES 6 AND 7 CMB,INB USE AS COUNTER STB TEMP2 LDA B10 STA TEMP3 COUNTER FOR SELECT CODE # PRNLP LDA TEMP3 CLE CONVERT SC # TO ASCII JSB $CNV3 SYSTEM ROUTINE TO CONVERT ADA .2 POINT TO LAST DIGITS LDA A,I STA RDBUF+6 SELECT CODE# IN MESSAGE LDA TEMP3 GET SELECT CODE # CPA TBG IS IT THE TBG SELECT CODE? JMP TBGPR YES CPA $SAVE+5 IS IT THE PRIV I/O CARD? JMP PRIV YES * LDA TEMP1,I INTERRUPT TABLE ENTRY SZA,RSS 0? JMP SRCHE YES, SEARCH EQT TABLES FOR AN EQT SSA PROGRAM ID SEGMENT? JMP SRCHE YES, SEARCH EQT TABLES FOR AN EQT ADA .4 EQT ADDRESS SPECIFIED STA TEMP4 SAVE ADDRESS OF WORD 5 OF EQT LDA EQTA START OF EQT TABLE CMA,INA ADA TEMP1,I # WORDS OFFSET TO THE BEGINING OF THIS EQT CLB DIV .15 GET EQT # STA TEMP5 SAVE EQT#-1 JMP CNVE# CONVERT IT TO ASCII * SRCHE LDA TEMP3 GET SC # JSB EQTFN FIND EQT WORD 4 ADDRESS AND EQT # INB POINT TO WORD 5 STB TEMP4 SAVE EQT WORD 5 ADDRESS SZB,RSS FOUND AN EQT? JMP NOEQT NO EQT FOR THIS SC CNVE# LDA AMSG6 SOURCE BUFFER ADDRESS LDB ADEST DEST BUFFER ADDRESS MVW .6 LDA TEMP5 EQT # - 1 FOR THIS DEVICE CCE,INA CONVERT IT TO DECIMAL ASCII JSB $CNV3 ADA .2 POINT TO LAST TWO DIGITS LDA A,I GET ASCII VALUE FOR EQT STA RDBUF+10 STORE IT IN RDBUF LDA TEMP4 GET WORD 5 OF EQT LDA A,I ALF,CLE,ALF EQUIPMENT TYPE CODE IN BITS 0-6 AND B77 JSB $CNV3 CONVERT EQ TYPE CODE TO OCTAL ASCII ADA .2 POINT TO LAST TWO DIGITS LDA A,I GET ASCII VALUE STA RDBUF+14 STORE IT IN BUFFER LDA SPACE CLEAR REMAINING WORD STA RDBUF+15 * PRENT LDA TEMP1,I GET INTERRUPT TABLE ENTRY SZA,RSS IS IT AN ENTRY POINT? JMP ENINS YES SSA IS IT A PROG ID SEGMENT JMP PROGN YES JMP PRNT * NOEQT LDA SPACE LDB .8 JSB SETM SET FIRST PART OF MESSAGE TO BLANKS ADEST DEF RDBUF+8 JMP PRENT * ENINS LDA TEMP3,I GET TRAP CELL VALE FOR SC CPA JSBCI IS IT JSB CIC,I? JMP NOENT YES CLE CONVERT TRAP CELL CONTENTS TO ASCII OCTAL JSB $CNV3 LDB ARDBF ADDRESS OF RDBUF ADB .16 MVW .3 MOVE ASCII VALUE LDB .19 # OF WORDS TO LIST JMP PRNT+1 * NOENT LDA TEMP4 EQT WAS FOUND? SZA JMP PRNT YES, PRINT LINE JMP ENDLP NO, SKIP PRINTING * PROGN CMA,INA MAKE THE ID SEG ADDR +VE ADA .12 POINT TO WORD 13 OF ID SEG STA TEMP5 SAVE ADDRESS DLD A,I GET PROGRAM NAME DST RDBUF+16 LDA TEMP5 ADA .2 GET LAST CHAR OF PROG NAME LDA A,I AND B1774 BLANK THE LOWER BYTE IOR B40 ADD A SPACE STA RDBUF+18 STORE IT IN READ BUFFER LDB .19 JMP PRNT+1 PRINT * TBGPR DLD .TBG TBG SELECT CODE DST ADEST,I LDB .10 JMP PRNT+1 * PRIV LDA AMSG8 PRIVILEGED I/O CARD LDB ADEST MVW .4 LDB .12 RSS * PRNT LDB .15 JSB WRLST DEF RDBUF ENDLP ISZ TEMP3 POINT TO NEXT SELECT CODE # ISZ TEMP1 INCREMENT POINTER TO THE INTERRUPT TBL ISZ TEMP2 INCREMENT COUNTER JMP PRNLP PRINT NEXT SC ENTRY JMP PRNIO,I RETURN * .TBG ASC 2,TBG * HED DISC TRANSFERS FOR PERMANENT RECONFIGURATION * * TRWRD - ROUTINE TRANSFER A WORD FROM SYSTEM IN MEMORY * TO A CORRESPONDING LOCATION ON DISC * CALLING SEQUENCE: A REG = DISC ADDRESS * B REG = CONTENTS OF WORD IN MEMORY * #OFST = # OF WORDS OFFSET IN THE SECTOR * * TRWRD NOP STB TEMP4 SAVE CONTENTS OF MEM LOC STA PRMTB-1 BUILD TRIPLETS FOR $XSIO ROUTINE LDB APRMT ADDRESS OF PARAMETER TABLE ADB N3 STB WRAD1 ADDRESS OF START OF TRIPLET STB WRAD2 LDA ASCBF START MEM ADDRESS STA PRMTB-3 LDB .128 # OF WORDS TO BE READ STB PRMTB-2 LDA .2 CAY LU# CLA,INA REQUEST CODE TO READ CLB READ BUFFER INTO THE SYTEM MAP JSB $WRRD WRAD1 NOP LDA ASCBF ADDRESS OF START OF BUFFER ADA #OFST ADD OFFSET TO IT LDB TEMP4 CONTENTS OF WORD TO BE TRANSFERRED STB A,I CHANGE CORRESP WORD IN BUFFER LDA .2 REQ CODE IS 2 TO WRITE CAY LU# IS ALSO 2 FOR DISC CLB WRITE BUFFER FROM SYSTEM MAP JSB $WRRD WRAD2 NOP JMP TRWRD,I RETURN * APRMT DEF PRMTB .128 DEC 128 * * * MEMDS - ROUTINE TO CONVERT GIVEN MEMORY LOCATION * IN SYSTEM CODE INTO A CORRESPONDING DISC LOCATION * CALLING SEQUENCE: A REG = MEMORY LOCATION * JSB MEMDS * RETURNS: TEMP1 = TRACK# * TEMP2 = SECTOR# * #OFST = # OF WORDS OFFSET INTO SECTOR * * MEMDS NOP LDB SECT2 # OF SECTORS/TRACK ON SYS DISC BLF MULTIPLY BY 100B TO GET RBL,RBL STB NWRDS # OF WORDS / TRACK CLB DIV NWRDS DIVIDE MEM LOC BY # OF WORDS/TRACK STA TEMP1 TRACK # CLA RRR 6 DIVIDE REMAINING WORDS BY 100B ADB $SSCT ADD SECTORS TO ACCOUNT FOR BOOT EXT STB TEMP2 QUOTIENT IS SECTOR# LDB SECT2 # OF SECTORS PER TRACK ON SYS DISC CMB,INB ADB TEMP2 SECTOR# - # SECTORS/TRACK SSB SECTOR # >= # OF SECTORS/TRACK? JMP CALOF NO, CALCULATE OFFSET STB TEMP2 YES,SECTOR# = SECTOR#-#SECTORS/TRACK ISZ TEMP1 INCREMENT TRACK # * CALOF ALF A REG HAS REMAINDER RAL,RAL LDB TEMP2 GET SECTOR # SLB,RSS EVEN SECTOR? JMP SETOF YES * ADB N1 ODD SECTOR, SO MAKE EVEN STB TEMP2 NEW SECTOR # ADA B100 ADD 64 WORDS TO THE OFFSET SETOF STA #OFST # OF WORDS OFFSET INTO SECTOR JMP MEMDS,I RETURN * NWRDS NOP #OFST NOP B100 OCT 100 * * * $TREN - ROUTINE TO TRANSFER A SYSTEM ENTRY POINT VALUE * FROM MEMORY TO A CORRESPONDING LOC ON DISC * CALLING SEQUENCE: A REG = ADDRESS OF ENTRY POINT * B REG = 0 IF CALLING FROM SYSTEM MAP * = -1 IF CALLING FROM USER MAP * JSB $TREN * $TREN NOP RSS LDA A,I RAL,CLE,SLA,ERA REMOVE INDIRECTS FROM ADDRESS JMP *-2 STB TRTMP SAVE VALUE OF B REG LDB A,I GET CONTENTS OF MEM LOC JSB LOCTR TRANSFER WORD TO DISC LDA TRTMP CALLING FROM SYSTEM MAP? SSA,RSS JMP $TREN,I YES,RETURN UJP $TREN,I NO, RETURN TO USER MAP * * * LOCTR - ROUTINE FINDS DISC ADDRESS FOR A GIVEN MEMORY LOCATION * AND TRANSFERS THE CONTENTS OF THIS LOCATION TO A CORRESPONDING * LOCATION IN MEMORY * * CALLING SEQUENCE: A REG = ADDRESS OF LOC IN MEMORY * B REG = CONTENTS OF LOCATION * JSB LOCTR * * LOCTR NOP STB TRTMP+1 SAVE IT JSB MEMDS FIND DISC ADDRESS FOR THIS LOC LDA TEMP1 GET TRACK# ALF,RAL RAL,RAL TRACK # IN BITS 7-15 ADA TEMP2 SECTOR # IN BITS 0-6 LDB TRTMP+1 JSB TRWRD TRANSFER WORD TO DISC JMP LOCTR,I RETURN * * * $TRTB - PROCEDURE USED TO TRANSFER A TABLE FROM * THE SYSTEM AREA IN MEMORY TO A CORRESPONDING LOCATION * ON THE SYSTEM DISC * CALLING SEQUENCE: JSB $TRTB * A REG = START ADDRESS OF TABLE * B REG = LENGTH OF TABLE (BIT 15 SET IF * CALLING FROM USER MAP) * * $TRTB NOP RSS LDA A,I REMOVE INDIRECTS FROM ADDRESS RAL,CLE,SLA,ERA JMP *-2 STA TRTMP SAVE THE ADDRESS OF TABLE SSB,RSS CALLING FROM USER MAP? JMP TRTB1 NO ELB,CLE,ERB YES LDA $TRTB SET BIT 15 OF THE RETURN ADDRESS ADA BIT15 STA $TRTB LDA TRTMP START ADDRESS OF TABLE TRTB1 STB TRTMP+1 JSB MEMDS CONVERT START ADDRESS INTO DISC LOC LDA ASCBF ADDRESS OF SECOTR BUFFER STA TEMP3 LDA .128 # OF WORDS TO BE READ STA TEMP JSB SETUP SET UP A TRIPLET TO READ STA TRBFA THE FIRST SECTOR THE TABLE OCCUPIES STA TRBFB ADDRESS OF TRIPLET LDA .2 LU # CAY CLA,INA REQ CODE TO READ CLB BUFFER IN SYS MAP JSB $WRRD READ THE FIRST SECTOR TRBFA NOP OF THE TABLE LDB #OFST # OF WORDS OFFSET INTO FIRST CMB,INB SECTOR FOR START OF TABLE ADB .128 #WORDS FROM START OF TABLE TO END OF SECTOR LDA TRTMP+1 CMA,INA - ( # OF WORDS IN THE TABLE ) ADA B + (# WORDS TILL END OF SECTOR) SSA,RSS #WORDS IN TABLE <= #WORDS LEFT IN SECTOR? LDB TRTMP+1 YES,#WORDS TO MOVE=# WORDS IN TABLE STB TEMP1 INTO THE FIRST SECTOR LDA TRTMP ADDRESS OF TABLE ADB TRTMP STB TRTMP NEW START LOC OF TABLE STB TEMP3 LDB ASCBF ADDRESS OF SECTOR BUFFER ADB #OFST ADDRESS TO WHICH FIRST PART OF MVW TEMP1 TABLE MUST BE MOVED LDA .2 WRITE BUFFER BACK ON DISC CAY CLB BUFFER IN SYSTEM MAP JSB $WRRD TRBFB NOP * LDA TEMP1 CMA,INA ADA TRTMP+1 LENGTH OF TABLE-# OF WORDS TRANSFERRED STA TRTMP+1 # OF WORDS REMAINING TO BE TRANSFERED CLB RRR 7 DIVIDE BY 200B TO GET BLF,RBL # OF WORDS IN LAST SECTOR OCCUPIED BY TABLE RBL,RBL STB #OFST SAVE THE REMAINDER CMB,INB - ( # OF WORDS IN LAST SECOTR) ADB TRTMP+1 ADD # OF WORDS REMAINING TO BE TRANSFERRED STB TEMP # OF WORDS TO TRANSFER TO DISC IN ONE CHUNK STB TRTMP+1 RESET TO USE LATER LDA TRBFB ADDRESS OF LAST TRIPLET USED JSB NXTAD GET THE NEXT DISC ADDRESS JSB SETUP BUILD TRIPLETS FOR THIS CHUNK OF MEMORY STA TRBFC ADDRESS OF TRIPLETS LDA .2 REQ CODE IS 2 CAY CLB BUFFER IN SYSTEM MAP JSB $WRRD TRBFC NOP * LAST SECTOR OF TABLE TO BE TRANSFERRED LDA TRTMP START MEM ADDRESS FOR LAST CHUNK ADA TRTMP+1 # OF WORDS JUST WRITTEN STA TRTMP START ADDRESS FOR LAST PART OF THE TABLE LDA .128 # OF WORDS TO BE READ FROM DISC STA TEMP LDB TRBFC,I CONTENTS OF FIRST WORD OF LAST TRIPLET LDA TRBFC ADDRESS OF THE LAST TRIPLET USED SZB,RSS WAS LAST TRIPLET EMPTY? LDA TRBFB YES,USE TRIPLET ADDR FROM PREVIOUS TRANSFER JSB NXTAD CALCULATE NEXT DISC ADDRESS LDA ASCBF STA TEMP3 JSB SETUP BUILD THE LAST TRIPLET STA TRBFD ADDRESS OF TRIPLET STA TRBFE LDA .2 CAY CLA,INA REQ CODE IS TO READ SECTOR CLB BUFFER IS IN SYSTEM MAP JSB $WRRD READ SECTOR CONTAINING LAST PART OF THE TABLE TRBFD NOP LDA TRTMP START ADDRESS OF LAST PART OF TABLE LDB ASCBF ADDRESS OF SECTOR BUFFER MVW #OFST # OF WORDS LEFT IN THE TABLE LDA .2 REQ CODE IS 2 TO WRITE CAY CLB BUFFER IS IN SYSTEM MAP JSB $WRRD WRITE LAST PART OF THE TABLE TRBFE NOP LDA $TRTB CALLING FROM USER MAP? SSA,RSS JMP A,I NO, RETURN ELA,CLE,ERA CLEAR SIGN BIT UJP A,I RETURN TO USER MAP * ASCBF EQU ARDBF * * * NXTAD - ROUTINE TO FIND TRACK AND SECTOR # TO BE * USED FOR NEXT SEQUENTIAL DISC ACCESS * CALLING SEQUENCE: A REG = ADDRESS OF LAST TRIPLET USED * JSB NXTAD * RETURNS: TEMP1=NEW TRACK # * TEMP2=NEW SECTOR # * * NXTAD NOP INA POINT TO # OF WORDS IN LAST TRIPLET CAY LDA A,I CLB RRR 6 DIVIDE #OF WORDS BY 100B TO GET # OF SECTORS SZB REMAINDER? INA YES, THEN INCREMENT # OF SECTORS STA TEMP4 SAVE THIS VALUE CYA GET POINTER TO TRIPLET INA POINT TO DISC ADDRESS LDA A,I JSB DSCAD BREAK UP DISC ADDRESS INTO TRACK & SECTOR# LDA TEMP2 GET SECTOR # ADA TEMP4 ADD # OF SECTORS TRANSFERRED CPA SECT2 ALL SECTORS IN TRACK DONE? RSS JMP SECTR NO, SET SECTOR # ISZ TEMP1 INCREMENT TRACK # CLA SECTR STA TEMP2 CLEAR SECTOR # JMP NXTAD,I RETURN * * * DSKRD - ROUTINE TO READ TWO 128 WORD SECTORS FROM DISC AND * MOVE THE REQUIRED PORTION OF THE BUFFER INTO ADDRESS IN MEMORY * * CALLING SEQUENCE: A REG = ADDRESS IN SYTEM AREA * B REG = NUMBER OF WORDS TO TRANSFER * JSB DSKRD * * DSKRD NOP STA PRTMP SAVE ADDRESS IN SYSTEM AREA CMB,INB NEGATIVE # OF WORDS STB PRTMP+1 USE AS COUNTER TO MOVE WORDS JSB MEMDS GET DISC ADDRESS LDA ARDBF BUFFER TO READ DATA FROM DISC STA TEMP3 LDA .256 # OF WORDS TO READ STA TEMP JSB SETUP SET UP TRIPLETS FOR DISC READ STA TRPAD SAVE ADDRESS OF TRIPLETS LDA .2 DISC LU# CAY IN Y REG CLA,INA READ OPERATION CLB PRIORITY CODE JSB $WRRD READ THE 2 SECTORS FROM DISC TRPAD NOP ADDRESS OF TRIPLETS * LDA ARDBF ADDRESS IN READ BUFFER AT WHICH ADA #OFST TO START TRANSFER OF WORDS MVWLP LDB A,I GET THE WORD STB PRTMP,I RESTORE IT IN SYSTEM INA POINT TO NEXT WORD ISZ PRTMP NEXT ADDRESS IN SYSTEM ISZ PRTMP+1 INCREMENT NEGATIVE COUNTER JMP MVWLP * JMP DSKRD,I RETURN * .256 DEC 256 * * * * $GDPG - ROUTINE FINDS THE FIRST POSSIBLE GOOD PAGE * STARTING FROM THE PAGE # PASSED AS PARAMETER * * CALLING SEQUENCE : A REG = STARTING PAGE# * BIT 15 SET IF CALLING FROM USER MAP * JSB $GDPG * RETURNS: LOC P IF ERROR RETURN * LOC P+1 IF NORMAL RETURN * A REG = NEXT GOOD PAGE# * * $GDPG NOP STA PRTMP SAVE A REG SSA CALLING FROM SYSTEM MAP? ELA,CLE,ERA NO, CLEAR SIGN BIT BDPGL CPA MEMSZ PAGE IS EQUAL TO MEMORY SIZE? JMP EXGDP YES, THEN ERROR RETURN LDB A PAGE# IN B REG CMB,INB STB TEMP LDB $ABDP,I GET BAD PAGE# CPB N1 -1? JMP GDPGR YES, END OF BAD PAGE LIST CPB A EQUAL TO START PAGE # PASSED? JMP FNDBD YES, THEN BAD PAGE FOUND ADB TEMP BAD PAGE # > START PAGE? SSB JMP INCBD NO, THEN INCREMENT THE BAD PAGE# GDPGR ISZ $GDPG YES, RETURN EXGDP LDB PRTMP SSB,RSS JMP $GDPG,I RETURN IN SYSTEM MAP UJP $GDPG,I RETURN IN USER MAP FNDBD INA INCREMENT START PAGE # INCBD ISZ $ABDP INCREMENT BAD PAGE POINTER JMP BDPGL TRY AGAIN * * * $PCHN - ROUTINE TO FIND A CHUNK OF MEMORY LARGER THAN * ONE PAGE BETWEEN BAD PAGES * CALLING SEQUENCE : JSB $PCHN * A REG = 0 IF CALLING FROM SYSTEM MAP * = -1 IF CALLING FROM USER MAP * RETURNS: A REG = SIZE OF CHUNK OF MEMORY * * $PCHN NOP STA TEMP1 LDA $USRS GET START OF USER PART'N JSB $GDPG GET THE NEXT GOOD PAGE JMP ZEROP NO, MORE GOOD PAGES STA $USRS NEW GOOD PAGE PCHLP LDA $ABDP,I GET BAD PAGE VALUE CPA N1 END OF BAD PAGE LIST? JMP NBDPG YES LDB $USRS START OF USER PART'N AREA CMB,INB ADA B BAD PAGE# - START OF USER PART'N CPA .1 SIZE OF THIS CHUNK IS 1? JMP ONEPG YES JMP RPCHN * ONEPG LDA $ABDP,I INCREMENT USER PART'N START PG INA JSB $GDPG FIND GOOD PAGE STARTING AT THE NEW JMP ZEROP NO MORE PAGES LEFT STA $USRS NEW USER PART'N START PAGE JMP PCHLP * ZEROP CLA JMP RPCHN RETURN * NBDPG LDA $USRS START OF USER PART'N CMA,INA ADA MEMSZ MEM SIZE - START USER PART'N PAGE CPA .1 ONLY ONE PAGE? JMP ZEROP YES, THEN RETURN WITH 0 PAGES RPCHN LDB TEMP1 SSB,RSS CALLING FROM SYSTEM MAP? JMP $PCHN,I YES, RETURN UJP $PCHN,I NO, ENABLE USER MAP AND RETURN * END $CNFG