File M5.PA (PAL assembler source file)

Directory of image this file is from
This file as a plain text file

/******** TOPS-8 MONITOR (M5) ********
XLIST -LTEXT-1&XLISTX
/***************************************************************
/*********   S Y S T E M   I N I T I A L I S A T I O N  ********
/***************************************************************

/THIS IS THE POWERUP CODE FOR MULTI8- A CHAPTER OF ITS OWN.
/IT RESIDES IN FIELD ONE STARTING JUST BEHIND THE OS8 USER
/SERVICE ROUTINES. IT BEHAVES LIKE AN ORDINARY OS8 PROGRAM,
/CALLING UPON THE COMMAND DECODER AND PERFORMING NORMAL OS8
/FILE OPERATIONS. HOWEVER, IN FACT IT IS PREPARING THE
/REVOLUTION, AND SUDDENLY OS8 WILL BE TILTED...
/
/THE CONSPIRACY HAS THE FOLLOWING STAGES:
/
/- THE USR IS BROUGHT INTO CORE WITH THE USRIN REQUEST AND
/  FILE "TSKLIB.M8" IS LOOKED FOR ON THE SYSTEM DEVICE
/  THIS FILE MUST BE PRESENT AND IS ASSUMED TO HAVE THE
/  FOLLOWING STRUCTURE:
/  BLOCK 0: 'BITMAP' OF THE TASKLIBRARY, EACH WORD INDICATES
/           THE PRESENCE OR ABSENCE OF A TASK IMAGE IN ONE
/           BLOCK OF THE FILE. THE FIRST WORD CORRESPONDS WITH
/           THE FIRST BLOCK OF THIS FILE, THUS THE WORD WE ARE
/           TALKING ABOUT. THUS THIS WORD (AND A FEW MORE) ARE
/           SET TO -1. WORDS THAT CORRESPOND WITH BLOCKS WHICH
/           ACTUALLY HOLD A TASKIMAGE CONTAIN THE NAME OF THAT
/           TASK. ALL THIS IS NOT IMPORTANT FOR THIS PROGRAM,
/           BUT IS SETUP AND USED BY THE TASKBUILDER PROGRAM.
/  BLOCK 1: THIS BLOCK, AND THE FOLLOWING ONES CONTAIN AN IMAGE
/           OF THE DATAAREA: FROM 'DATORG' TO 'COREND'.
/  BLOCK N+:THE REST OF THE FILE CONTAINS TASKIMAGES, READY TO
/           RUN. THEY WILL BE READ INTO CORE AT RUNTIME, WHEN-
/           EVER THEY ARE CALLED FOR
/
/- ON ALL DEVICES RKB3:,RKA3:,RKB2:, .... ,RKB0: AND SYS:
/  ALL FILES OF THE FORM DSKX.M8 ARE LOOKED UP, WHERE X IS 0-7.
/  ANY IDENTIFIED FILE IS REGISTRATED IN A COPY OF DSKTAB: 
/  DRIVER TASK NAME, UNIT #, START BLOCK AND ENDING BLOCK.
/
/- AFTER READING THE COPY OF THE DATAAREA INTO CORE, THE BLOCK-
/  NUMBERS IN THE TASK CONTROL BLOCK TABLE (TCBTAB) ARE UPDATED.
/  THE COPY OF DSKTAB IS MOVED INTO PLACE.

XLIST -LPWRUP-1&XLISTX /EQUATES: JSW=7746 /ADDRESS OF OS/8 JOB STATUS WORD NO=1000 /DON'T RESTART BIT IN JSW SYSHND=7607 /ENTRYPOINT OF SYSTEM HANDLER USR=200 /USER SERVICE ROUTINE. FETCH=1 /FETCH HANDLER REQUEST CODE LOOKUP=2 /FILENAME LOOKUP REQUEST CODE USRIN=10 /CALL USR INTO CORE REQUEST CODE USROUT=11 /DISMISS USR REQUEST CODE INQUIRE=12 /GET DEVICE NUMBER REQUEST CODE TEMP=20 /FREE LOCATION IN USR TEMP1=21 /FREE LOCATION IN USR TEMP2=22 /FREE LOCATION IN USR OS8DATE=7666 /LOCATION WITH DATE IN OS8 IFNZRO MONFLD < FIELD 0 IFNZRO BGMAX < /FOR USER FLAG TEST *1 CDF CIF 10 JMP I 0 / > *200 CLA CLL CDF CIF 10 JMP I .+1 PWRUP / >
IFZERO MONFLD-10 <FLDERR,XERROR /MONFLD SHOULD NOT BE 10 > IFNZRO DOTF10-1&4000 <PWRERR,XERROR /NO ROOM FOR POWERUP IN FLD 1> FIELD 1 *4000 /BEHIND THE USER SERVICE ROUTINES PWRUP, CLA CLL TAD (NO //SET NOT-RESTART BIT CDF 0 DCA I (JSW CDF 10 JMS I (PDPTST /SEE IF WE'VE GOT A REASON. MACHINE TAD PWRUP /CLA CLL CDF MONFLD DCA I (SKP0 //RESTORE SKIPCHAIN CDF 10 JMS I (7700 /GET THE USR INTO CORE USRIN /LOOKUP THE VIRTUAL DISK FILES /I'D LIKE TO SEE IT WORK ON A FOUR DRIVE RK8E SYSTEM ! / /TABLES: /DEVTAB,DEVICE RKB3 /IFDEF SYRK8E <TASKNA SY> /IFNDEF SYRK8E <TASKNA RK> / 3 /UNIT NUMBER / DEVICE RKA3 / / ..... /ETC. /FILTAB,FILENAME DSK0.M8 / XDEVTAB-1 / FILENAME DSK1.M8 / XDSKTAB+4-1 / FILENAME DSK2.M8 / .... /ETC. LOOK0, TAD I DVTAB SNA JMP PWR0A /ZERO IS END OF LIST DCA LOOK1 ISZ DVTAB TAD I DVTAB /SECOND WORD OF DEVICE NAME DCA LOOK1+1 ISZ DVTAB TAD (DATORG+1 /TWO-PAGE HANDLER OK DCA LOOK1+2 JMS I (USR FETCH /WE'RE GOING TO FETCH THAT HANDLER INTO LOOK1, ZBLOCK 3 /FIELD ZERO JMP LOOK2 /THIS DEVICE IS NOT PRESENT HERE, SKIP IT TAD (FILTAB /TABLE OF FILE NAMES DCA TEMP
LOOK3, TAD I TEMP /GET FILE NAME. ZERO ? SNA CLA JMP LOOK2 /DONE WITH THIS DEVICE TAD TEMP /STILL POINTING TO THE FILENAME DCA LOOK4 /DROP IT IN LOOKUP REQUEST TAD TEMP /BUMP AUTO17 PAST FILE NAME TAD (4 DCA TEMP /AND EXTENSION TAD LOOK1+1 /GET INTERNAL DEVICE NUMBER (OS/8) JMS I (USR LOOKUP LOOK4, ZBLOCK 2 JMP LOOK5 /THIS FILE NOT ON THIS DEVICE TAD I TEMP /GET POINTER IN DEVTAB FROM FILTAB DCA AUTO16 /THAT'S WHERE WE STORE THE PARAMETERS TAD I DVTAB /GET (MULTI8) HANDLER TASK NAME DCA I AUTO16 / TAD DVTAB IAC DCA TEMP1 TAD I TEMP1 /GET (MULTI8) UNIT NUMBER DCA I AUTO16 TAD LOOK4 /GET STARTING BLOCK NUMBER DCA I AUTO16 TAD LOOK4+1 CIA TAD LOOK4 /END BLOCK NUMBER DCA I AUTO16 /THATS THE LAST THING WE WANTED TO KNOW LOOK5, ISZ TEMP JMP LOOK3 /TRY NEXT FILE NAME LOOK2, ISZ DVTAB /NEXT DEVICE ISZ DVTAB JMP LOOK0 DVTAB, XDVTAB /POINTER TO TABLE WITH DEVICE NAMES PWR0A, IFZERO MONFLD <IFNDEF ONLY4K <IFNZRO COREND-7600&4000 < /IF SYSTEM HANDLER IS OK: DON'T OVERWRITE MONFLD /BY GIVING THE COMMAND .R MONDUM. /THAT MEANS: WE CHAIN TO MONDUM.SV! AC0001 /1=SYS: JMS I (USR LOOKUP MONDUM 0 JMP PWR6A /NO MONDUM.SV, NON-FATAL TAD .-3 DCA MDBLCK /STARTING BLOCK #
CIF 0 JMS I (SYSHND /READ CCB OF MONDUM.SV 0100 DATORG MDBLCK, 0 /BLOCK # JMP PWR6B /READ ERROR, NON-FATAL CDF 0 ISZ I (DATORG //DATORG SHOULD BE 7777 JMP PWR6C //BAD CCB, NON-FATAL TAD (DATORG DCA AUTO10 TAD I AUTO10 //STARTING FIELD (6213) DCA I (7772 TAD (TCF //JUST FOR SURE DCA I (7773 AC0001 //CHAIN TO START. ADDR.+1 TAD I AUTO10 DCA I (7775 //SET STARTING ADDRESS (2001) AC0001 TAD MDBLCK //BLOCK # DCA I (7762 ISZ AUTO10 //SKIP JSW JMP I (PWR0C PWR6A, JMS I (TXTOUT /*MONDUM.SV NOT FOUND ON SYS:* MSG11 JMP I (PWR0B PWR6B, JMS I (TXTOUT /*ERROR READIND CCB OF SYS:MONDUM.SV* MSG17 JMP I (PWR0B PWR6C, CDF 10 JMS I (TXTOUT /*SYS:MONDUM.SV HAS BAD CCB* MSG18 >>>/END OF ZERO MONFLD JMP I (PWR0B PAGE
IFZERO MONFLD < IFNDEF ONLY4K <IFNZRO COREND-7600&4000 < PWR0C, TAD I AUTO10 DCA I (7761 //CORE ADDRESS (2000) TAD I AUTO10 DCA I (7760 //FUNCTION WORD (0610) TAD (5372 //JUST FOR SURE DCA I (7764 TAD (SYSHND //JUST FOR SURE DCA I (7756 CDF 10 /THAT'S IT. >>> PWR0B, AC0001 /1=SYS: JMS I (USR LOOKUP PBLOCK, TSKLIB /LOOKUP 'TSKLIB.M8' ON SYS: 0 /GETS FILE LENGTH JMP I (ERROR1 /*TSKLIB.M8 NOT FOUND* AC0001 TAD PBLOCK /GET STARTBLOCK+1 DCA PBLCK /STORE IN READ-REQUEST FOR DATAAREA CIF 0 JMS I (SYSHND /CALL OS/8 SYSTEM HANDLER TO READ /COPY OF DATA AREA INTO CORE. COREND-DATORG+200%2&3700+MONFLD DATORG PBLCK, 0 /GETS STARTBLOCK OF TSKLIB.M8 + 1 JMP I (ERROR2 /*ERROR READING TSKLIB.M8* /UPDATE BLOCK NUMBERS OF TASKS IN TASK CONTROL BLOCK TABLE: CDF MONFLD // TAD (LOADPT+3 //START OF DISK RESIDENT TASKS PWR1, DCA TEMP TAD I TEMP //FETCH RELATIVE BLOCK NUMBER SNA //IF ZERO, W'RE PAST THE LAST ONE JMP PWR1A //DONE TAD PBLOCK //ADD STARTBLOCK OF TSKLIB.M8 DCA I TEMP //STORE UPDATED BLOCK NUMBER TAD TEMP TAD (10 //NEXT BLOCK # IS 10 WORDS FURTHER JMP PWR1 //CYCLE
/COPY XDSKTAB TO DSKTAB /NOTE ! ENTERED AND EXIT WITH DF=MONFLD ! PWR1A, TAD (XDSKTAB-1 /COPY XDSKTAB TO DSKTAB DCA AUTO17 TAD (DSKTAB-1 DCA AUTO16 TAD (-40 DCA TEMP1 DSKCO1, CDF 10 TAD I AUTO17 CDF MONFLD DCA I AUTO16 ISZ TEMP1 JMP DSKCO1 /LINK THE FREECORE BLOCKLETS PWR2, TAD (-FREEMAX+1 DCA TEMP TAD I (FHEAD //ADDRESS OF FIRST BLOCK PWR3, DCA TEMP1 // TAD TEMP1 // TAD (10 //COMPUTE ADDRESS OF NEXT BLOCK DCA I TEMP1 //AND STORE IN LINK WORD TAD I TEMP1 ISZ TEMP //DONE ? JMP PWR3 //NO, CYCLE DCA TEMP1 //YES, THIS IS THE LAST ONE DCA I TEMP1 //WHICH GETS A ZERO LINK CDF 10 / IFNZRO BGMAX < IFZERO BGMAX-2&4000 < /INCASE MORE THAN ONE BG: /LOOKUP THE SWAP-FILE 'SWPFIL.M8' AC0001 JMS I (USR /LOOKUP 'SWPFIL.M8' ON SYS: LOOKUP SWPBLK, SWPFIL /THIS GETS THE STARTING BLOCK # SWPLEN, 0 /THIS GETS MINUS THE LENGTH JMP I (ERROR3 /*SWPFIL.M8* NOT FOUND* TAD SWPLEN /CHECK IF SWAPFILE LONG ENOUGH TAD (BGMAX^SWAPLG^BGFLDS%2 /RK8E USES FULL CYLINDER /FOR 4K, OTHER DISKS JUST 4K/4K SMA SZA CLA JMP I (ERROR4 /*SWPFIL.M8 TOO SMALL* TAD SWPBLK /SEE IF SWPFIL STARTS AT NICE BOUND IFDEF SYRK8E <AND (37 /SHOULD START AT CYLINDER > IFDEF RFORDF <AND (7 /SHOULD START AT TRACKBOUND > IFDEF SY3010 <AND (37 /SHOULD START AT CYLINDER BOUND > SZA CLA JMP I (ERROR5 /*SWPFIL BAD LOCATED*
TAD (-BGMAX DCA TEMP2 /COUNTER FOR NUMBER OF BG'S TAD (BGDATA CDF MONFLD PWR3X1, DCA TEMP TAD TEMP TAD (USWAP DCA TEMP1 TAD I TEMP1 TAD SWPBLK //ADD SWPBLK TO OFFSET FOR EACH BG DCA I TEMP1 TAD TEMP TAD (UNEXT //OFFSET OF POINTER TO NEXT BG DCA TEMP1 TAD I TEMP1 //BASE OF NEXT BG ISZ TEMP2 //ALL BG'S DONE ? JMP PWR3X1 //NO, CYCLE CLA CDF 10 >/END OF BGMAX-2&4000 CIF 0 JMS I (SYSHND /READ THE BOOTBLOCK (BLOCK 0) IN A BUFFER 210 BOOBUF 0 JMP I (ERROR6 /*ERROR READING BLOCK #0 OF SYS:* JMP I (PWR4 /SKIP TO NEXT PAGE PAGE
PWR4, TAD (-FAKLEN /COPY THE FAKEHANDLER OVER SYSTEMHANDLER DCA TEMP /HANDLER TAD (FAKHND DCA TEMP1 TAD (FAKSYS DCA TEMP2 /MOVE FAKEHANDLER OVER SYSTEM-HANDLER PWR4A, TAD I TEMP1 DCA I TEMP2 ISZ TEMP1 ISZ TEMP2 ISZ TEMP /DONE ? JMP PWR4A /NO, CYCLE TAD (BGFLDS-1^10 DCA I (BGCORW /PUT CORESIZE IN USERS BG. /CLEAR DEVICE RESIDENCY TABLE TAD (DVRSTB-1 DCA AUTO10 TAD (-17 DCA TEMP DCA I AUTO10 ISZ TEMP JMP .-2 /PUT FAKEHANDLER ENTRY POINTS IN DEVICE RESIDENCY TABLE TAD (DEVLST /POINTER TO LIST OF FAKABLE DEVICE NAMES DCA TEMP JMP PWR5B PWR5, DCA DEVNAM ISZ TEMP TAD I TEMP DCA DEVNAM+1 /SECOND WORD OF DEVICE NAME ISZ TEMP /TEMP POINTS TO FAKEHANDLER ENTRYPOINT JMS I (USR INQUIRE /ASK USR WHAT INTERNAL DEVICE # IT HAS DEVNAM, ZBLOCK 3 /GETS DEVICE NAME JMP PWR5A /DEVICE DOES NOT EXIST, THAT'S /A PITY FOR HIM TAD DEVNAM+1 /THIS IS THE INTERNAL DEV NUMBER NOW TAD (DVRSTB-1 /INDEX IN DEVICE RESIDENCY TABLE /(THE ONE THAT IS IN THE BOOTBUFFER) DCA TEMP2 TAD I TEMP /GET ENTRYPOINT IN FAKEHANDLER DCA I TEMP2 /AND DROP IN DEVICE RESIDENCY TABLE. /SO OS/8 WILL THINK THE HANDLER IS /CORESIDENT WITH SYS: ISZ TEMP TAD DEVNAM+1 TAD (DVTYPT-1 DCA TEMP2 TAD I TEMP DCA I TEMP2 /SET CORRECT DEVICE TYPE
SKP PWR5A, ISZ TEMP ISZ TEMP PWR5B, TAD I TEMP SZA /DONE ? JMP PWR5 /NO, CYCLE IFZERO BGMAX-1 < PTEM0, -200 /CLA ! TAD (4510 /DEV. NR^10, FILE STRUCTURED DCA I (DVTYPT /TELL TO BG SO SQUISH GOES WELL TAD (4510 DCA I (DVTYPT+1 /THIS IS FOR DSK: TAD (BOOBUF-1 /MOVE THE BOOTBLOCK IN BG-CORE DCA AUTO10 TAD (BOOBUF+200-1 DCA AUTO11 BG1LP, TAD I AUTO10 CDF BGFLD+10 DCA I PTEM0 CDF 10 TAD I AUTO11 CDF BGFLD DCA I PTEM0 CDF 10 ISZ PTEM0 /POINTER AND COUNTER IN ONE ! JMP BG1LP >/END OF BGMAX-1 PWR7, AC0001 /NOW LOOKUP THE FILE BOOBLK.M8 JMS I (USR LOOKUP BOOBLK 0 JMP I (ERROR7 /*BOOBLK.M8 NOT FOUND* TAD .-3 /GET THE START BLOCK DCA .+5 /AND DROP IT IN A WRITE-REQUEST CIF 0 JMS I (SYSHND 4210 /WRITE THE FAKED BOOTBLOK IN BOOBLK.M8 BOOBUF 0 /GETS BLOCK # JMP I (ERROR8 /*ERROR WRITING BOOBLK.M8* TAD .-2 CDF MONFLD DCA I (BOTBLK //STORE BOOTBLOCK NUMBER IN DATAAREA CDF 10 IFZERO BGMAX-1 < JMP I (PTEM2 PAGE >
IFNZRO BGMAX-1 < /IF MORE THAN ONE BG JMS I (TXTOUT /*WARM START ?* MSG14 JMS I (ANSWER JMP I (PTEM2 /DON'T INITIALISE SWPFIL.M8 TAD (-BGMAX /FOR ALL BG'S ... DCA TEMP2 TAD I (SWPBLK TAD (17 SWPINI, DCA SBLCK1 /STORE BLOCK # OF 07400 IN WRITE REQ. TAD TEMP2 TAD (BGMAX+1 CLL RTL RAL TAD (4500 /DEVICE TYPE 5X, FILE STRUCT. DCA I (DVTYPT TAD I (DVTYPT DCA I (DVTYPT+1 CIF 0 JMS I (SYSHND 4210 BOOBUF SBLCK1, 0 JMP I (ERRR11 /*ERROR WRITING SWPFIL.M8* TAD SBLCK1 TAD (SWAPLG^3%4-10 /50 (RK8E) OR 20 (REST) JMP I (PWR7A PAGE
PWR7A, DCA SBLCK2 /STORE BLOCK # OF 17400 IN SEC. WRITE REQ. CIF 0 JMS I (SYSHND 4210 BOOBUF-200 SBLCK2, 0 JMP I (ERRR11 TAD I (SBLCK1 TAD (SWAPLG^BGFLDS%2 ISZ TEMP2 /ALL BG'S DONE ? JMP I (SWPINI /NO, DO NEXT ONE SKP CLA /YES > >/END OF BGMAX PTEM1, -FIELDS PTEM2, CLA IAC JMS I (USR PTEM3, USROUT /DISMISS USR FROM CORE IFZERO FIELDS-2&4000 < /IF MORE THEN ONE FOREGROUND FIELD /NOW WE SETUP THE FOREGROUND PAGE 0'S PWR8, TAD (-200 DCA PTEM2 /COUNTS ONE PAGE DCA PTEM3 /POINTER STARTS AT ZERO PWR9, CDF MONFLD TAD I PTEM3 /GET A WORD FROM MONFLD PWR10, CDF MONFLD+10 DCA I PTEM3 /PUT A WORD INTO ANOTHER FIELD ISZ PTEM3 /BUMP THE POINTER ISZ PTEM2 /200 DONE ? JMP PWR9 /NO, CYCLE TAD PWR10 DCA I (MYCDF AC0001 TAD PWR10 DCA I (MYCIF AC0002 TAD PWR10 DCA I (MYCDIF TAD PWR10 TAD (10 DCA PWR10 ISZ PTEM1 JMP PWR8 /NEXT FIELD >
/FILL IN CLRTAB WITH THE ORIGINAL CLEAR-IOT'S FROM THE SKIPCHAIN PWR11, CDF MONFLD TAD (-INTDEV+1 DCA ZTEM2 /WE MAY USE THE ZTEM'S NOW! TAD (CLRTAB-1 DCA AUTO10 TAD (SKP0-1+4 PWR12, DCA ZTEM1 TAD I ZTEM1 DCA I AUTO10 TAD ZTEM1 TAD (4 ISZ ZTEM2 JMP PWR12 CDF 10 CLA CLL IFDEF FYSUNTRP < /SETUP THE TRAP/UNTRAP RAM TAD (-1000 DCA ZTEM1 TAD ZTEM1 6177 /TRAP THIS IOT ISZ ZTEM1 JMP .-3 /LOOP TAD (TRPTAB-1 DCA AUTO10 TAD I AUTO10 SNA /ZERO ENDS THE LIST JMP PWR13 6176 /UNTRAP THIS IOT JMP .-4 / > IFDEF MEMMNG < /SETUP UNTRAP RAM: TAD (TRPTAB-1 DCA AUTO10 TAD I AUTO10 SNA JMP .+3 6235 /LOAD TRAP REGISTER JMP .-4 /CLA ? TAD (-7 DCA ZTEM1 TAD (BGFLD DCA ZTEM2 TAD ZTEM2 6245 /LOAD RELOCATION REGISTER; CLA TAD ZTEM2 TAD (11 ISZ ZTEM1 /DONE ? JMP .-6 /NO, CYCLE 6265 /SET MEMMNG ENABLE ! CLA / >
/NOW COMES A DIRTY PIECE OF CODE, THAT INITIALIZES ALL SORTS /OF PERIPHERALS; MAYBE YOU HAVE TO EDIT THIS PART FOR YOUR /SPECIALTIES ! PWR13, IFZERO PDPTYP-PDP8E <CAF> IFNZRO PDPTYP-PDP8E<HLT> TAD (214 /RESET DISPLAY SCREENS TLS /THATS AN EASY ONE IFDEF KL8E2 <6016+KL8E2 > IFDEF KL8E3 <6016+KL8E3 > IFDEF KL8E4 <6016+KL8E4 > IFDEF KL8E5 <6016+KL8E5 > IFDEF KL8E6 <6016+KL8E6 > IFDEF KL8E7 <6016+KL8E7 > CLA IFDEF PP8E <6024> IFDEF KL8P <6016+KL8P> IFDEF LE8E <6666> IFDEF CENTRON <6156> IFDEF DR8EA <6500> /DISABLE INTERRUPTS IFDEF LE8C <6501> / ENABLE INTERRUPTS' /STARTING THE CLOCKS: IFDEF RFCLOCK <6601 TAD (RFINTS 6615 > IFDEF FYSCLOCK <6174> IFDEF KW8IA <6137> IFDEF DK8EA <6131> IFDEF DK8EC <6131> IFDEF DK8EP < TAD (-1750 6133 /AC IS NOT CLEARED, BUT ... TAD (5410+1750 6132 CLA > IFDEF XY8E <6507> IFDEF AX08 <6342 /DISABLE AX08 > IFDEF FYSCLOCK <6060 /(DISABLE KV08 INTERRUPTS) > JMP I (.+200&7600 /TO NEXT PAGE NOW PAGE
/NOW WE WILL SCHEDULE A LIST OF TASKS TO GET THE WORLD /GOING. BECAUSE THIS POWERUP CODE IS NOT ALWAYS IN A /FOREGROUND FIELD, WE CAN'T SIMULATE IT TO BE A TASK, /THAT CALLS THE OTHER TASKS. THUS WE MUST STRING THEM /IN THE SYSTEM'S QUEUE'S AND SET THEIR BACKLINK BUSY /'BY HAND'. PWR14, TAD (RUNTAB /TABLE OF INITIALLY RUNNABLE TASKS DCA ZTEM1 PWR14X, CDF 10 TAD I ZTEM1 /GET A TASKNAME OR TCBP(-4) ISZ ZTEM1 SNA /ZERO ? JMP PWR15 /YES, THAT'S THE END SMA /NAME OR TCBP ? JMS I (PWRNAM /NAME, SEARCH IN NAMTAB DCA ZTEM2 /POINTER TO FIRST LOC OF TCB AC0001 CDF MONFLD DCA I ZTEM2 //SET HIS BACKLINK TO 'BUSY' ISZ ZTEM2 //BUMP POINTER TO 'THREAD' TAD I (MTAIL //HANG THIS TASK IN THE P-QUEUE DCA ZTEM3 TAD ZTEM2 DCA I ZTEM3 TAD ZTEM2 DCA I (MTAIL DCA I ZTEM2 //SET HIS THREAD TO NIL ISZ ZTEM2 //BUMP POINTER, GOES TO START ADDRESS TAD ZTEM2 TAD (5 DCA ZTEM4 TAD I ZTEM2 DCA I ZTEM4 //SET PC TO START ADDRESS! JMP PWR14X //NEXT ONE PLEASE PWR15, CLA CLL /THERE WE GO !!!!!!!! CDF CIF MONFLD JMP I (DISPATCH /............... PAGE PWRNAM, 0 /ROUTINE TO SEARCH NAME IN NAMETABLE CDF MONFLD CIA DCA ZTEM2 TAD (NAMLST-1 DCA AUTO10 TAD (-MAXNAM DCA ZTEM3 PWRNA1, TAD ZTEM2 TAD I AUTO10 SNA CLA /MATCH ? JMP PWRNA2 /YES ISZ ZTEM3 /END OF LIST ? JMP PWRNA1 /NO, CYCLE CDF 10 TAD ZTEM2 CIA AND (40 SNA TAD (140 TAD (140 TAD ZTEM2 CIA DCA I PMSG9 JMS I (TXTOUT PMSG9, MSG9 /*XX NOT LOADED* JMS I (CRLF CDF MONFLD JMP I (PWR14X /SKIP IT PWRNA2, TAD AUTO10 TAD (-NAMLST /INDEX IN NAMLST CLL RAL /*8 RTL TAD (TCBTAB JMP I PWRNAM /EXIT WITH POINTER TO BACKLINK
PDPTST, 0 /A SUBROUTINE THAT TESTS IF WE ARE CLA CLL /AT A REASONABLE KIND OF MACHINE. /TEST IF WE WORK IN THE BACKGROUND. (6254 ONLY FOR MULTI8) TCF TSF SKP JMP I (ERROR0 /*NOGO FROM BACKGROUND ! /TEST IF THIS IS A PDP8E CLA IAC BSW /100 ON A 8E, 1 ON A 8I TAD (-100 SZA CLA IFZERO PDPTYP-PDP8E < /IF HE TOLD US HE HAS A 8E ! JMP I (ERRR12 /BUT HE HASN'T !, FATAL ERROR. > IFNZRO PDPTYP-PDP8E < /IF HE SPECIFIED SOME OTHER MACHINE JMP NO8E /THAT'S OK JMS I (TXTOUT /SHOW HIM WE KNOW IT, BUT LET HIM TRY MSG16 /*THIS IS A PDP8E !* JMS I (CRLF NO8E, > /CORE TEST, WORKS ONLY IN FIELD 0 TAD I PTEM4 /MOVE THE CORE-TEST TO FIELD ZERO CDF 0 /WHERE IT BELONGS. DCA I PTEM5 /USE THE DATA-AREA (WILL LATER BE CDF 10 /OVERLAID FROM TSKLIB.M8) ISZ PTEM4 ISZ PTEM5 ISZ PTEM6 JMP .-7 CDF CIF 0 JMS I (CORTST /RETURNS WITH 1ST NONEXISTING FIELD TAD (-FIELDS-BGFLDS SNA JMP TRAPTST /CORE OK. SPA CLA JMP I (ERRR10 /*NOT ENOUGH CORE* JMS I (TXTOUT /*YOU HAVE MORE CORE !* MSG12 JMS I (CRLF
/TEST IF THE TIMESHARE JUMPER ON THE KM8E-MODULE IS REMOVED TRAPTST, IFNZRO BGMAX < IFNDEF FYSUNTRP < IFNDEF MEMMNG < IFZERO MONFLD < TAD (JMP I 0 /WE USE THE INTERRUPT CDF 0 /PREPARE RETURN AFTER INTERRUPT DCA I (ZTEM1 CDF 10 / > SUF /SET USER FLAG ION /CAN ONLY BE CLEARED BY INTERRUPT JMP .+1 /AND WORKS ONLY AFTER A JMP IOF /IF NO TRAP, CLEAR INT, ELSE NOP CINT /CLEAR USER INTERRUPT FLAG RIB /GET SAVE FIELD AND (100 /TIME SHARE BIT SNA CLA /MUST BE NON-ZERO JMP I (ERRR13 /TEST FAILED, PRINT A NICE MESG. >>> /TEST IF THE DATE IS DEFINED AND PASS IT TO THE FOREGROUND. TAD I (OS8DATE /IS THE OS/8 DATE DEFINED ? SNA JMP I (ERROR9 /*NO DATE !* CDF MONFLD DCA I (DATE CDF 10 JMP I PDPTST PTEM4, CORTS1 PTEM5, CORTST PTEM6, -CORSIZ-1+CORTST PAGE
/ERROR HANDLING CODE /ALL FOLLOWING ERRORS ARE FATAL ERROR0, JMS TXTOUT /*CAN'T RUN MULTI8 WITHIN MULTI8 OR RTS8* MSG0 JMP7600,CDF CIF /EXIT TO OS/8 JMP I P7600 ERROR1, JMS TXTOUT /*TSKLIB.M8 NOT FOUND* MSG1 JMP JMP7600 ERROR2, JMS TXTOUT /*ERROR READING TSKLIB.M8* MSG2 JMP JMP7600 IFNZRO BGMAX < IFZERO BGMAX-2&4000 < ERROR3, JMS TXTOUT /*SWPFIL.M8 NOT FOUND ON SYS:* MSG3 JMP JMP7600 ERROR4, JMS TXTOUT /*SWPFIL.M8 TOO SMALL* MSG4 JMP JMP7600 ERROR5, JMS TXTOUT /*SWPFIL.M8 DOESN'T START AT MSG5 /CYLINDER/TRACK JMP JMP7600 >/END OF BGMAX-2&4000 ERROR6, JMS TXTOUT /*ERROR READING BLOCK #0 OF SYS:* MSG6 JMP JMP7600 ERROR7, JMS TXTOUT /*BOOBLK.M8 NOT FOUND ON SYS:* MSG7 JMP JMP7600 ERROR8, JMS TXTOUT /*ERROR WRITING BOOBLK.M8 ON SYS:* MSG8 JMP JMP7600 >/END OF BGMAX ERROR9, JMS TXTOUT /*NO DATE !* MSG10 JMP JMP7600 ERRR10, JMS TXTOUT /*NOT ENOUGH CORE.* MSG13 JMP JMP7600 ERRR11, JMS TXTOUT /*ERROR WRITING IN SWPFIL.M8* MSG15 JMP JMP7600
IFZERO PDPTYP-PDP8E < ERRR12, JMS TXTOUT /*THIS IS NOT A PDP8/E !* MSG16 JMP JMP7600 > IFNZRO BGMAX < ERRR13, JMS TXTOUT /*REMOVE THE JUMPER ON THE KM8E* MSG19 JMP JMP7600 > TXTOUT, 0 CDF 10 P7600, 7600 /CLA TAD I TXTOUT /GET POINTER TO STRING DCA TXTPNT ISZ TXTOUT TXT1, TAD I TXTPNT CLL RTR RTR RTR JMS SIXBIT /PRINT LEFTBYTE TAD I TXTPNT JMS SIXBIT /PRINT RIGHT BYTE ISZ TXTPNT /BUMP THE POINTER JMP TXT1 SIXBIT, 0 AND (77 SNA JMP I TXTOUT /ZERO BYTE IS END-OF-STRING TAD (240 /FLIP BIT 40 AND (77 TAD (240 JMS OUT JMP I SIXBIT OUT, 0 TLS TSF JMP .-1 CLA JMP I OUT CRLF, 0 TAD (215 JMS OUT TAD (212 JMS OUT JMP I CRLF
ANSWER, 0 /SKIP IF NOT "Y"ES TAD (200 KSF JMP .-1 KRS DCA TXTPNT TAD TXTPNT TAD (-203 /^C ? SNA JMP JMP7600 /YES, THAT'S NO ANSWER. TAD (203-"Y SZA CLA JMP .+4 JMS TXTOUT YMSG JMP .+4 ISZ ANSWER JMS TXTOUT NMSG JMS CRLF JMP I ANSWER TXTPNT, 0 YMSG, TEXT *YES* NMSG, TEXT *NO* PAGE
TSKLIB, FILENAME TSKLIB.M8 IFNZRO BGMAX < IFZERO BGMAX-2&4000 < SWPFIL, FILENAME SWPFIL.M8 > BOOBLK, FILENAME BOOBLK.M8 > IFZERO MONFLD < MONDUM, FILENAME MONDUM.SV > SELF, FILENAME MULTI8.SV MSG0, TEXT *CAN'T RUN MULTI8 WITHIN MULTI8 OR RTS8* MSG1, TEXT *TSKLIB.M8 NOT FOUND ON SYS:* MSG2, TEXT *ERROR READING SYS:TSKLIB.M8* IFNZRO BGMAX < IFZERO BGMAX-2&4000 < MSG3, TEXT *SWPFIL.M8 NOT FOUND ON SYS:* MSG4, TEXT *SWPFIL.M8 TOO SMALL* IFDEF SYRK8E < MSG5, TEXT *SWPFIL DOES NOT START AT CYLINDER BOUND* > IFDEF SY3010 < MSG5, TEXT *SWPFIL DOES NOT START AT CYLINDER BOUND* > IFDEF RFORDF < MSG5, TEXT *SWPFIL DOES NOT START AT TRACK BOUND* >> MSG6, TEXT *ERROR READING BLOCK #0 OF SYS:* MSG7, TEXT *BOOBLK.M8 NOT FOUND ON SYS:* MSG8, TEXT *ERROR WRITING BOOBLK.M8* > MSG9, TEXT *XX NOT LOADED* MSG10, TEXT *NO DATE !* IFZERO MONFLD < MSG11, TEXT *MONDUM.SV NOT FOUND ON SYS:* > MSG12, TEXT *YOU CAN USE MORE CORE !* MSG13, TEXT *NOT ENOUGH CORE.* MSG14, TEXT *WARM START ? * MSG15, TEXT *ERROR WRITING IN SWPFIL.M8* MSG16, IFZERO PDPTYP-PDP8E < TEXT *THIS IS NOT A PDP8/E !* > IFNZRO PDPTYP-PDP8E < TEXT *THIS IS A PDP8/E !* > IFZERO MONFLD < IFNDEF ONLY4K < IFNZRO COREND-7600&4000 < MSG17, TEXT *ERROR READING CCB OF SYS:MONDUM.SV* MSG18, TEXT *SYS:MONDUM.SV HAS BAD CCB* >>> IFNZRO BGMAX < MSG19, IFZERO PDPTYP-PDP8E < TEXT *YOU DIDN'T REMOVE THE JUMPER ON YOUR KM8E-MODULE !* > IFNZRO PDPTYP-PDP8E < TEXT *THE KT8I-MODULE IS MISSING IN YOUR MACHINE !* >>
/SUBROUTINE TO DETERMINE CORE SIZE /THIS SUBROUTINE WORKS ON ANY PDP-8 FAMILY /COMPUTER. THE VALUE, FROM 1 TO 10 (OCTAL), /OF THE FIRST NON-EXISTING MEMORY FIELD IS /RETURNED IN THE AC. /NOTE -- THIS ROUTINE MUST BE PLACED IN FIELD 0 CORTS1, RELOC DATORG CORTST, .-. COR0, CDF 0 /(NEEDED FOR PDP-8L) TAD CORSIZ /GET FIELD TO TEST CLL RTL RAL AND COR70 /MASK USEFUL BITS TAD COR0 DCA .+1 /SET UP CDF TO FIELD COR1, CDF 10 /FIELD TO TEST TAD I CORLOC /SAVE CURRENT CONTENTS COR2, NOP /(HACK FOR PDP-8!) DCA COR1 TAD COR2 /7000 IS A "GOOD PATTERN DCA I CORLOC COR70, 70 /(HACK FOR PDP-8.,NO-OP) TAD I CORLOC /TRY TO READ BACK 7000 CORX, 7400 /(HACK FOR PDP-8.,NO-OP) TAD CORX /GUARD AGAINST "WRAP AROUND" TAD CORV /TAD (1400) SZA CLA JMP COREX /NONEXISTING FIELD EXIT TAD COR1 /RESTORE CONTENTS DESTROYED DCA I CORLOC ISZ CORSIZ /TRY NEXT HIGHER FIELD JMP COR0 COREX, TAD CORSIZ CDF CIF 10 JMP I CORTST CORLOC, CORX /ADDRESS TO TEST IN EACH FIELD CORV, 1400 /7000+7400+1400=0 CORSIZ, 1 /CURRENT FIELD TO TEST RELOC
IFNZRO BGMAX < FAKHND, RELOC 7607 FSYS, 0 /ENTRY SYSTEM HANDLER JMS FGENIO 00 /AC-CODE^10+UNIT BITS FDSK0, 0 /DSK0: JMS FGENIO 10 FDSK1, 0 /DSK1: JMS FGENIO 11 FDSK2, 0 /DSK2: JMS FGENIO 12 FDSK3, 0 /DSK3: JMS FGENIO 13 FDSK4, 0 /DSK4: JMS FGENIO 14 FDSK5, 0 /DSK5: JMS FGENIO 15 FDSK6, 0 /DSK6: JMS FGENIO 16 FDSK7, 0 /DSK7: JMS FGENIO 17 IFDEF TAPE < FDTA0, 0 /DTA0: JMS FGENIO 20 FDTA1, 0 /DTA1: JMS FGENIO 21 FDTA2, 0 /DTA2: JMS FGENIO 22 FDTA3, 0 /DTA3: JMS FGENIO 23 IFNZRO 0 < FDTA4, 0 /DTA4: JMS FGENIO 24 FDTA5, 0 /DTA5: JMS FGENIO 25 FDTA6, 0 /DTA6: JMS FGENIO 26 FDTA7, 0 /DTA7: JMS FGENIO 27 >>/END OF TAPE. FLPT, 0 /LPT: JMS FGENIO 30 FGENIO, 0 /SETUP DTV,ISUE 6000 ACM2 TAD FGENIO /AC POINTS TO ENTRY OF HANDLER TAD F1400 /FORM TAD FSYS, TAD FDTA0,... DCA FGTMP /EXECUTE INLINE FGTMP, 0 /INSTRUCTION OR POINTER DCA FGTMP /FGTMP IS MOVED ENTRY NOW TAD I FGTMP /GET FUNCTION ISZ FGTMP DCA FUNC /FIRST WORD OF DTV TAD I FGTMP /GET CORE ADDRESS ISZ FGTMP DCA FUNC+1 TAD I FGTMP /GET BLOCK ISZ FGTMP DCA FUNC+2 RDF /SET RETURN FIELD CDF 0 TAD FCDIF DCA FEXIT TAD 7773 /SEE IF THE UNWANTED TCF IS THERE TAD MTCF SNA CLA DCA 7773 TAD I FGENIO /GET UNIT+FUNCTION 6000 /THE REST IS NOT OUR BISNESS JMP .+4 /SKIP THE PARAMETER WORDS FUNC, ZBLOCK 3 /THE 3 PARAMETERS SNA /ERROR ? ISZ FGTMP /NORMAL RETURN FEXIT, CDF CIF /CDF CIF RETURN JMP I FGTMP /RETURN FCDIF, CIF CDF 0 F1400, 1400 MTCF, -TCF FAKLEN=.-7607 /LENGTH OF FAKEHANDLER CODE IFNZRO 7743-.&4000 <FAKERR,XERROR> RELOC
DEVLST, DEVICE SYS SYSHND 4500 DEVICE DSK SYSHND /FORCE DSK=SYS 4500 DEVICE DSK0 FDSK0 6500 DEVICE DSK1 FDSK1 6510 DEVICE DSK2 FDSK2 6520 DEVICE DSK3 FDSK3 6530 DEVICE DSK4 FDSK4 6540 DEVICE DSK5 FDSK5 6550 DEVICE DSK6 FDSK6 6560 DEVICE DSK7 FDSK7 6570 IFDEF TAPE < IFDEF TC08 <TAPEDCB=4160> IFDEF TD8E <TAPEDCB=4210> DEVICE DTA0 FDTA0 TAPEDCB DEVICE DTA1 FDTA1 TAPEDCB DEVICE DTA2 FDTA2 TAPEDCB DEVICE DTA3 FDTA3 TAPEDCB IFNZRO 0 < DEVICE DTA4 FDTA4 TAPEDCB DEVICE DTA5 FDTA5 TAPEDCB DEVICE DTA6 FDTA6 TAPEDCB DEVICE DTA7 FDTA7 TAPEDCB >> DEVICE LPT FLPT 1040 0000 /END OF LIST ! >
IFDEF FYSUNTRP < TRPTAB, SGT /TABLE OF UNTRAPPED IOT'S FOR FYSUNTRAP SYSTEM CDF CIF CDF CIF CDF 10 CIF 10 CDF CIF 10 RDF RIF 6050 6060 6070 6063 6064 6065 6066 6071 6072 6073 6074 /MF8E SCOPE CONTROL IOT'S 6550 6550 6560 6570 6554 6555 6556 6557 6560 6561 6562 6563 6564 6565 6566 6567 6570 6571 6572 6573 6574 6575 6576 6577 0000 /END OF LIST > IFDEF MEMMNG < TRPTAB, 6000 6010 6020 6030 6040 6051 /KV08 IOT'S 6061 6071 6100 6110 6120 6130 6140 6150 6160 6170 6200 /CDF 0, ETC. 6210 /CDF 10, ETC. 6220 6230 6240 6250 6260 6270 IFZERO BGFLDS-1&4000 <6201> IFZERO BGFLDS-2&4000 <6211> IFZERO BGFLDS-3&4000 <6221> IFZERO BGFLDS-4&4000 <6231> 6300 6310 6320 6330 6340 6350 6360 6370 6400 6410 6420 6430 6440 6450 6460 6470 6500 6510 6520 6530 6540 6551 /MF8/E IOT'S 6561 6571 6600 6610 6620 6630 6640 6650 6660 6670 6700 6710 6720 6730 6740 6750 6760 6770 0000 / >
XDSKTAB, "S^100+"Y&3777 0 0 IFDEF SYRK8E <6260> IFDEF SY3010 <6260> IFDEF SYRF08 <2000^SYRF08> IFDEF SYDF32 <200^SYDF32 "S^100+"Y&3777 0;0;200^SYDF32 > IFDEF SYRK8E < "S^100+"Y&3777;1;0;6260 "S^100+"Y&3777;2;0;6260 "S^100+"Y&3777;3;0;6260 "S^100+"Y&3777;4;0;6260 "S^100+"Y&3777;5;0;6260 "S^100+"Y&3777;6;0;6260 "S^100+"Y&3777;7;0;6260 FILTAB, FILENAME DSK0.M8 XDSKTAB-1 FILENAME DSK1.M8 XDSKTAB+4-1 FILENAME DSK2.M8 XDSKTAB+10-1 FILENAME DSK3.M8 XDSKTAB+14-1 FILENAME DSK4.M8 XDSKTAB+20-1 FILENAME DSK5.M8 XDSKTAB+24-1 FILENAME DSK6.M8 XDSKTAB+30-1 FILENAME DSK7.M8 XDSKTAB+34-1 0000
IFDEF SYRK8E <RKNAME="S^100+"Y&3777> IFDEF SY3010 <RKNAME="S^100+"Y&3777> IFNDEF RKNAME<RKNAME="R^100+"K&3777> XDVTAB, DEVICE RKB3 RKNAME 7 DEVICE RKA3 RKNAME 6 DEVICE RKB2 RKNAME 5 DEVICE RKA2 RKNAME 4 DEVICE RKB1 RKNAME 3 DEVICE RKA1 RKNAME 2 DEVICE RKB0 RKNAME 1 DEVICE DSK0 RKNAME 1 DEVICE RKA0 RKNAME 0 DEVICE RF "R^100+"F&3777 0 DEVICE DF "D^100+"F&3777 0 DEVICE SYS "S^100+"Y&3777 0 0000
RUNTAB, "T^100+"I&3777 /TIMER TASK "C^100+"D&3777 /COMMAND DECODER TASK "B^100+"B&3777 /WATCHDOG TASK IFDEF CMPCOP < "L^100+"8&3777 /START NETWORK SERVICE TASK > IFDEF DAYTIM < "I^100+"T&3777 /INITIALIZE TIME-OF-DAY > IFNZRO BGMAX < KHIBG1 /INPUT READER #1 IFZERO BGMAX-2&4000 < "B^100+"S&3777 /BG-SCHEDULER KHIBG2 /INPUT READER #2 IFZERO BGMAX-3&4000 < KHIBG3 /INPUT READER #3 IFZERO BGMAX-4&4000 < KHIBG4 /INPUT READER #4 IFZERO BGMAX-5&4000 < KHIBG5 /INPUT READER #5 IFZERO BGMAX-6&4000 < KHIBG6 /INPUT READER #6 IFZERO BGMAX-7&4000 < KHIBG7 /INPUT READER #7 >>>>>>> 0000 /END-OF-LIST IFNZRO BGMAX < BOOBUF, ZBLOCK 400/BUFFER IN WHICH THE BOOTBLK IS ASSEMBLED DVRSTB=BOOBUF+47 /SYS:-ENTRY DEVICE RESIDENCY TABLE DVTYPT=BOOBUF+160 /SYS:-ENTRY IN DEVICE TYPE TABLE FAKSYS=BOOBUF+207 /POSITION OF SYS: ENTRYP. IN BLOCK 0 BGCORW=BOOBUF+377 /BACKGROUND CORE-WORD > /END OF BGMAX PWREND=.-1 XLIST 1 EJECT ******** MULTI8 MONITOR SYMBOLS ******** XLIST -LPWRUP-1&XLISTX $



Feel free to contact me, David Gesswein djg@pdp8online.com with any questions, comments on the web site, or if you have related equipment, documentation, software etc. you are willing to part with.  I am interested in anything PDP-8 related, computers, peripherals used with them, DEC or third party, or documentation. 

PDP-8 Home Page   PDP-8 Site Map   PDP-8 Site Search