File PRVFNC.PA (PAL assembler source file)

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

/[0,3]OS8DISK.DSK:PRVFNC.PA
/RTDOC.PA VERSION 1.6 SATURDAY 31-DECEMBER-1977 2:10 AM
VERSION=1	/RTDOC.PA VERSION NUMBER
EDIT=	6	/RTDOC.PA EDIT LEVEL
/
/
/WRITTEN BY DANIEL JOSEPH YAGUSIC
/
/
/
/COPYRIGHT EDUCOMP CORPORATION
/HARTFORD, CONNECTICUT
/
/
/
/
/
/THE MODULES IN THIS FILE DEMONSTRATE
/HOW TO USE THE REAL TIME LINKAGE AND PRIVELEDGED
/USER FUNCTIONS AVAILABLE UNDER ETOS. FOR MORE INFORMATION
/SEE "THE ETOS SYSTEM MANAGER'S GUIDE".

/DEFINITIONS FOR THE REST OF THE FILE. THIS /MAKES THE LISTING EASIER TO READ / / FIELD 3 USER= JMS I [USERX /LEVEL 2 TO LEVEL 3 RMON= 6007 /LEVEL 3 TO LEVEL 2 SYSCAL= 6200 /CALL RESIDENT MONITOR FROM LEVEL 3 CURDF= JMS I [CURDFX /CHANGE DF TO CURRENT IF HOOK= 6 /SUBFUNCTION OF SYSCAL DEVSKP= 0 /SKIP IF DEVICE FLAG IS UP DEVOPR= 0 /CLEAR FLAG AND SERVICE THE DEVICE CLKSKP= 0 /SKIP IF CLOCK FLAG IS UP CALL= JMS I [CALLX /CALL THE N.R. MONITOR FUNCTION LINKER
/THE PROGRAM RESIDES IN VIRTUAL FIELD 3. IT /IS INITIATED FROM OS/8 AT 30200. THIS LOAD CONFIGURATION /WAS CHOOSEN SO THAT OS/8 COULD BE BOOTED AN /RUN WITHOUT DISTURBING THE REAL TIME TASK THAT IS SET UP. / / *0 /ETOS ENTERS HERE ON LEVEL 1 /AFTER A HOOK THEN AN INTERUPT INTLOC, 0 JMP I (INTSER *20 T1, 0 T2, 0 P1, 0 P2, 0
PAGE0T, JOBTAB, .-. /POINTER TO FIELD 1 (.1) JOB /TABLE DATA BASE CORACT, .-. /.1 CORE ACTIVITY TABLE CORLOK, .-. /.1 CORE LOCK OUT TABLE 0 /UN USABLE 0 /UN USABLE 0 /UN USABLE 0 /UN USABLE 0 /UN USABLE 0 /UN USABLE 0 /UN USABLE 0 /UN USABLE 0 /UN USABLE IOTTAB, .-. /.1 IOT TABLE 0 /UN USABLE JOBMAX, .-. /MAXIMUM # OF JOBS ON THE SYSTEM NRCALL, .-. /.0 NON-RESIDENT CALL LINKAGE ROUTINE NRGETBUF,.-. /.0 N.R. GET SMALL BUFFER ROUTINE NRRETBUF,.-. /.0 N.R. RETURN SMALL BUFFER ROUTINE 0 /UN USABLE NRMAKDDB,.-. /.0 N.R. MAKE A DEVICE DATA BLOCK /ROUTINE NRDDBFIL,.-. /.0 N.R. PUT WORD INTO BUFFER NRDDBEMT,.-. /.0 N.R. GET WORD FROM BUFFER NRCHROUT,.-. /.0 N.R. CHARACTER OUTPUT ROUTINE 0 /UN USABLE NRQUEUE,.-. /.0 N.R. LEVEL 2 QUEUE ROUTINE 0 /UN USABLE 0 /UN USABLE 0 /UN USABLE 0 /UN USABLE 0 /UN USABLE LV2FG, .-. /.0 LEVEL 2 FLAG /-1 = ON LEVEL 2 UMONX, .-. /.0 RETURN TO LEVEL 3 FROM L 2 QUEBLK, .-. /.1 TO BLOCK OF POINTERS POINTING /TO SPOOLER DESCRIPTORS NRWAKEUP,.-. /.0 N.R. WAKE UP A JOB ROUTINE 0 /UN USABLE 0 /UN USABLE TTYMAX, .-. /MAXIMUM NUMBER OF TTY'S ON THE SYSTEM 0 /UN USABLE 0 /UN USABLE NRL2NT, .-. /.0 N.R. LEVEL 2 ENTER FROM LEVEL 1 NRLVL2XT,.-. /.0 N.R. LEVEL 2 EXIT ROUTINE
RMON /GO TO LEVEL 2 TO FIND RDF /THE REAL FIELDS WE ARE IN /THE RDF IS REAL USER /DON'T TIE IT(LEVEL 2) /UP IF NOT NEEDED DCA REALDF /FOR FUTURE FUN (IF WANTED) RMON /BACK ON LEVEL 2. RIF /THIS IS REAL USER DCA REALIF /FOR FUTURE FUN (IF WANTED) /NOW WE GO AND DO THE BACK GROUND PROCESSING. THE REAL TIME /TASK WILL BE ACTIVATED BY THE RESIDENT MONITER. JMP WORK /**************** BACKGROUND TASK ********************* WORK, KSF JMP .-1 /TOUGH, ISN'T IT? KRB DCA HOLD JMP WORK /********************************************************* REALDF, .-. /=PHYSICAL DF THAT WAS LOCKED REALIF, .-. /=PHYSICAL IF THAT WAS LOCKED HOLD, 0
/LEVEL 1 INTERUPT SERVICE /(I.E. THE REAL TIME TASK) /CONTROL IS PASSED HERE ON INTERUPTS INTSER, DEVSKP /IS IT OUR DEVICE SKP /NO. CHECK CLOCK. JMP DEVSER /YES. SERVICE THE DEVICE. CLKSKP /IS IT THE CLOCK? /**************************************************************/ / / / THE CLOCK TEST MAY BE PERFORMED UNDER THE FOLLOWING / / RESTRICTIONS: / / 1) THE USER IS MANAGING THE CLOCK (IN WHICH / / CASE THE SKIP MUST BE DONE) / / 2) THE USER IS NOT MANGEING THE CLOCK / / AND THE TEST IOT DOES NOT RESET THE FLAG / / RESTRICTION 2 MUST BE CONSIDERED FOR / / CLOCKS LIKE THE DK8-EA / / / /**************************************************************/ SKP /NO. GO BACK TO RMON. JMP CLKSER MONRET, CIF 00 /RETURN TO ETOS RMON CDF 10 JMP I INTLOC
DEVSER, DEVOPR /OPERATE THE DEVICE /[CLEAR FLAG AND SECURE DATA] DCA DATAIT /BE CAREFULL BECAUSE THIS IS LEVEL /1 AND WE MIGHT RUN AGAIN BEFORE /THE LEVEL 2 SERVICE. MAY THIS /SHOULD BE A QUEUE INSTEAD OF 1 WORD CIF 00 CDF 10 /THESE ARE REAL JMS I NRL2NT /CALL NRL2NT IN RMON /***********************************************************/ / / / RETURN ON LEVEL 2 / / / /***********************************************************/ NOP /ISN'T !LEVEL NOP /THIS !2 NOP /TOUGH !PROCESSING CDF 10 CIF 00 JMS I NRLVL2XT DATAIT, 0
CLKSER, JMS CLKDRV /CALL CLOCK ACTIVATED ROUTINES /***************ONLY DO NEXT CODE IF CLOCK MANAGER****************/ ISZ TICKS /SYSTEM TICK? JMP MONRET /NO. RETURN TAD MTICKS /YES. SET. DCA TICKS /COUNTER BACK UP ISZ INTLOC /TELL ETOS RMON /***************ALWAYS DO THE FOLLOWING***************************/ JMP MONRET CLKDRV, 0 /CLOCK DRIVEN ROUTINE JMP I CLKDRV /NOT MUCH HERE MTICKS, -12 /# OF CLOCK INTERUPTS/SYSTEM /TICK (1/10 SECOND) TICKS, -12 /MUST BE INITIALIZED ALSO / PAGE
/THE FOLLOWING ROUTINES ARE USED TO INSPECT /AND MANIPULATE THE MONITOR DATA BASES. THEIR /USE IS RESTRICTED TO PRIVILEGED OR TEMPORARILLY /PRIVILEDGED USERS. A USER IS GRANTED TEMP. PRIV. IF /HE USES SCALES 'R' COMMAND AND THE FILES PROTECTION CODE /IS SET FOR PRIVILEGED FILE. / /MOST OF THE CALLS TO THE MONITOR ARE DONE THRU THE CALLX /ROUTINE. THIS ROUTINE IS A GENERAL PURPOSE /INTERFACE TO THE MONITOR. THE AC AND MQ ARE USED /TO PASS DATA TO AND FROM THE ROUTINES. /UP TO THREE RETURNS ARE TAKEN, THUS GIVING /THE ROUTINES MORE FLEXABILITY IN RETURNING /INFORMATION. / /THE ROUTINE AVAILABLE FOR USE AND THEIR DESCRIPTIONS /FOLLOW: / / /USERX PUT THE CURRENT JOB ON LEVEL 3 FROM LEVEL 2 / (UNDO A RMON) /DDBEMX FETCH A WORD FROM A BUFFER /DDBFIX PUT A WORD INTO A BUFFER /CHROUX OUTPUT A CHARACTER ON A TERMINAL /WAKEX CLEAR A WAIT BIT FOR A JOB AND IF IT / BECOMES RUNNABLE (STATUS=0 OR / 4000) PUT IT ON A RUN QUEUE /GETBUF GET A SMALL BUFFER FROM FREE CORE /RETBUF RETURN A SMALL BUFFER TO FREE CORE /MAKDDB MAKE A DEVICE DATA BLOCK /QUEUE ENTER AN ITEM IN THE LEVEL 2 QUEUE
/CALLX /CALL A MONITOR ROUTINE / /CALLING SEQUENCE: / / TAD MQARG /MUST BE ON LEVEL 3 / MQL / TAD ACARG / JMS CALLX / POINTER TO POINTER TO ROUTINE IN MONITOR / RETURN 1 / RETURN 2 / RETURN 3 / / AC AND MQ RETURN ARE ROUTINE DEPENDANT / CALLX, 0 RMON /ENTER LEVEL 2 CURDF /CDF TO CURRENT IF CLA TAD I CALLX /GET POINTER TO /POINTER ISZ CALLX /BUMP PAST POINTER /TO RETURN 1 DCA CALLY /STOW FOR DOUBLE TAD I CALLY /INDIRECT. DO IT. DCA CALLY /CALLY NOW = ADDRESS IN /MONITOR TO JMS TO TAD CURDFA /RESTORE AC CIF 00 /MONITOR LINKAGE IS THRU FIELD 0 JMS I NRCALL /CALL MONITOR CALLY, HLT /ADDRESS IN MONITOR JMP CALLZ /RETURN 0 SKP /RETURN 1 ISZ CALLX /RETURN 2 ISZ CALLX CALLZ, USER JMP I CALLX /RETURN
/CURDFX /CURDXF CHANGES THE DATA FIELD TO THE CURRENT /INSTRUCTION FIELD. THIS ROUTINE MAY BE CALLED FROM /ANY LEVEL.[NOTE THAT THE DIFFERENT ENVIRONMENTS /OF THE DIFFERENT LEVELS PROVIDE SLIGHTLY DIFFERENT /RESULTS.] / CURDFX, 0 DCA CURDFA /PRESERVE MACHINE STATE RIF /GET CURRENT IF TAD (CDF /MAKE IT A CDF DCA .+1 HLT /BECOMES CDF TO THIS FIELD TAD CURDFA /RESTORE MACHINE STATE JMP I CURDFX CURDFA, 0
/USERX /USERX IS A ROUTINE THAT RETURNS A USER TO LEVEL 3 /FROM LEVEL 2. THE MACHINE STATE (AC, MQ, LINK, ETC.) /IS PRESERVED ACROSS THIS CALL. / /CALLING SEQUENCE: / USERX, 0 CURDF CIF 00 /MUST LINK THIS WAY JMS I UMONX /UMONX IS IN RMON.0 JMP I USERX
/WAKEX /WAKEX CALLS THE MONITOR WAKE UP ROUTINE. THIS /ROUTINE CLEARS A WAIT BIT FOR A JOB AND IF THE JOB IS /THEN RUNNABLE , PUTS IT ON A RUN QUEUE / /CALLING SEQUENCE: / / TAD JOB /JOB NUMBER TO ALTER / MQL / TAD CONDIT /CONDITION TO CLEAR / JMS WAKEX / RETURN 1 /NORMAL RETURN / WAKEX, 0 CALL NRWAKEUP JMP I WAKEX
/CHROUX /CHROUX IS A ROUTINE THAT OUTPUTS A CHARACTER /ONTO A TERMINAL. / /CALLING SEQUENCE: / / TAD CHAR / MQL /TAD CONSOL / JMS CHROUX / RETURN 1 ERROR, OUT OF FREE CORE, MUST RESEND / RETURN 2 STOP SENDING, BUFFER FULL / RETURN 3 OK, MORE ROOM IN BUFFER / CHROUX, 0 CALL NRCHROUT JMP I CHROUX SKP ISZ CHROUX ISZ CHROUX JMP I CHROUX / /THIS ROUTINE COULD BE INCLUDED IN LINE IN THE USER /PROGRAM TO ELIMINATE SOME SOFTWARE OVERHEAD. /TO DO THIS USE THE / CALL / NRCHROUT / /SEQUENCE DIRECTLY IN THE PROGRAM.
/DDBFIX /DDBFIX IS ROUTINE TO INSERT A DATUM INTO A MONITOR /BUFFER. ALL MONITOR BUFFERS ARE DESCRIBED BY A DDB /[DEVICE DATA BLOCK]. THIS DDB /MAY ALLREADY EXIST (AS IN THE CASE OF A /KEYBOARD BUFFER) OR MAY BE CREATED /DYNAMICALLY (WITH A NRCALL TO THE MONITOR) /THE FORM OF THE BUFFER IS A SINGLY LINKED LIST. /THE FIRST WORD OF EVERY FREE CORE COMPONENT POINTS /TO THE BASE OF THE NEXT FREE CORE SEGMENT IN THE /DATA BUFFER. THE OPERATION OF THE BUFFERS IS /COMPLETLY FIFO IN NATURE. / /CALLING SEQUENCE: / TAD DATUM / MQL / TAD DDBADDRESS / JMS DDBFIX / ERROR RETURN, NO FREE CORE FOR DATA / NORMAL RETURN, AC=# CHARS IN BUFFER / DDBFIX, 0 CALL NRDDBFIL JMP I DDBFIX ISZ DDBFIX JMP I DDBFIX / /AS WITH CHROUX, EFFICENCY MAY BE IMPROVED BY DIRECTLY /CODING THIS SEQUENCE INTO THE PROGRAM.
/DDBEMX /DDBEMX EXTRACTS INFORMATION FROM A MONITOR BUFFER /THE FIRST ITEM IN THE BUFFER IS REMOVED (FIFO /OPERATION). THIS IS THE LOGICAL INVERSE OF DDBFIX / /CALLING SEQUENCE: / / TAD DDBADDRESS / JMS DDBEMX / RETURN 1 BUFFER EMPTY / RETURN 2 NORMAL RETURN / AC=COUNT OF DATUMS LEFT / MQ = THIS DATUM / DDBEMX, 0 CALL NRDDBEMT JMP I DDBEMX ISZ DDBEMX JMP I DDBEMX
/GETBUF /GETBUF IS A ROUTINE THAT OBTAINS A FREE CORE /BLOCK FROM THE MONITOR. THIS BLOCK IS EIGHT /WORDS LONG AND BEGINS ON A MULTIPLE OF EIGHT /BOUNDRY. IT RESIDES IN REAL FIELD 1. IT WILL /BE FILLED WITH ZEROS BY THE MONITOR. / /CALLING SEQUENCE: / / JMS GETBUX / RETURN 1 NO FREE CORE AVAILABLE / RETURN 2 NORMAL RETURN, AC= / POINTER TO BASE OF / ALLOCATED FREE CORE BLOCK. / GETBUX, 0 CALL NRGETBUF SKP JMP I GETBUX ISZ GETBUX JMP I GETBUX
/RETBUX /RETBUX IS A ROUTINE THAT RETURNS A FREE CORE /BUFFER BACK TO THE MONITORS LIST OF AVAILABLE /FREE CORE SEGMENTS. THE FIRST WORD IN THE /BUFFER IS RETURNED IN THE AC. THIS IS DONE /BECAUSE ALL BUFFERS ARE IMPLEMENTED AS /SINGLY LINKED LISTS, WITH THE FIRST WORD /OF THE FREE CORE BLOCK POINTING TO THE /NEXT FREE CORE BLOCK IN THE BUFFER. RETURNING /THE FIRST WORD IN THE BUFFER MAKES IT EASIER /TO MANIPULATE BUFFERS OF THIS STRUCTURE. / /CALLING SEQUENCE: / / TAD BUFBAS /AC=BASE ADDRESS OF BLOCK / JMS RETBUX / RETURN 1 /AC=FIRST WORD IN THE BLOCK / RETBUX, 0 CALL NRRETBUF JMP I RETBUX /QUEUEX /QUEUEX IS A ROUTINE THAT ENTERS AN ITEM IN THE LEVEL /2 QUEUE. CARE SHOULD BE USED WHEN CALLING THIS /ROUTINE BECAUSE OF THE RACE CONDITIONS THAT MAY /DEVELOP FROM IMPROPER CODING SEQUENCES. SPECIFICALLY, /ETOS MAY INTERUPT THE QUEUEING OF MULTIPLE DATUM /ENTRIES THE QUEUE IF THE INTERUPT IS ENABLED /IF MULTIPLE WORD ENTRIES ARE BEING USED THIS /ROUTINE WOULD NEED TO BE RECODE TO BE CALLED FROM /LEVEL 2 AND THEN THE INTERUPT WOULD BE /TURNED OFF BY THE CALLING ROUTINE FOR THE DURATION /OF ALL THE CALLS / /CALLING SEQUENCE: / / TAD ADDRESS / JMS QUEUEX / QUEUEX, 0 CALL NRQUEUE JMP I QUEUEX
/MAKDDB /MAKDDB IS A ROUTINE THAT DIRECTS THE MONITOR TO SET /UP A DDB IN FREE CORE. CONSULT THE FILE /[0,10]OS8DISK.DSK:EDEFS.PA FOR THE FORMAT OF A DDB / /CALLING SEQUENCE: / / TAD POINTER ADDRESS / JMS MAKDDB / /THE LOCATION POINTED TO IN FIELD 1 /OF THE RESIDENT MONITOR WILL CONTAIN THE ADDRESS OF THE /DDB AFTER THE CALL. THIS POINTER TO THE BASE OF THE DDB /MUST BE STORED. IF A VALUE OF ZERO IS PASSED IN THE AC, /LOCATION 0 IN REAL FIELD 1 WILL POINT TO THE FREE /CORE BLOCK ALLOCATED AND FORMATED FOR THE DDB. THIS MAY /CAUSE THE SYSTEM TO CRASH. USE A VALUE OF 5 AS A DUMMY /LOCATION. THIS VALUE IS SUBJECT TO CHANGE. / / MAKDDB, 0 CALL NRMAKDDB JMP I MAKDDB



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