File M2FAST.PA (PAL assembler source file)

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

/******** TOPS-8 MONITOR (M2) ********
IFNDEF NODISK <
/********************************************************
/*********   C O R E   A L L O C A T O R   **************
/********************************************************

/HOLE FINDS THE FIRST HOLE IN CORE THAT FITS THE REQUEST.
/FIRST LOOKS FOR FREE SPACE (0), THEN FOR RELEASED SPACE (POS.)
/ENTER WITH AC=NUMBER OF PAGES REQUESTED.
/CORMAP SHOULD END WITH -3;0

HOLCNT,	0		/COUNTER
HOLLEN,	0		/MINUS REQUESTED LENGTH
HOLMAX,	40		/+LENGTH LAST REJECTED REQUEST+1

HOLE,	.-.
	SMA
	CIA		/BE SURE TO GET -#PAGES
	DCA HOLLEN
	TAD HOLLEN
	TAD HOLMAX
	SPA SNA CLA
	 JMP I HOLE	/LARGER/EQUAL THEN LAST FAILING REQUEST

/FIRST SCAN LOOKS FOR FREE SPACE
	TAD (MAPBEG-1
	DCA AUTO10	/SET UP THE POINTER
HOLE1,	TAD I AUTO10	/SEARCH FREE PAGE
	SZA CLA
	 JMP HOLE1
	TAD AUTO10
	TAD (-MAPEND
	SMA CLA		/END OF MAP ?
	 JMP HOLE10	/YES
	TAD HOLLEN
	DCA HOLCNT
	JMP HOLE3

HOLE2,	TAD I AUTO10
	SZA CLA		/END OF HOLE ?
	 JMP HOLE1	/YES, MUST BE TO SMALL
HOLE3,	ISZ HOLCNT	/HOLE LARGE ENOUGH ?
	 JMP HOLE2	/NO, NOT YET
HOLE7,	TAD HOLLEN
	TAD AUTO10
	IAC
	ISZ HOLE	/NORMAL EXIT WITH START OF
	JMP I HOLE	/HOLE IN AC

/SECOND SCAN LOOKS FOR RELEASED CORE
HOLE10,	TAD (MAPBEG-1
	DCA AUTO10	/SET UP THE POINTER
HOLE11,	TAD I AUTO10	/SEARCH RELEASED PAGE
	SPA CLA
	 JMP HOLE11
	TAD AUTO10
	TAD (-MAPEND
	SMA CLA		/END OF MAP ?
	 JMP HOLE20	/YES
	TAD HOLLEN
	DCA HOLCNT
	JMP HOLE13

HOLE12,	TAD I AUTO10
	SPA CLA		/END OF HOLE ?
	 JMP HOLE11	/YES, MUST BE TO SMALL
HOLE13,	ISZ HOLCNT	/HOLE LARGE ENOUGH ?
	 JMP HOLE12	/NO, NOT YET
	ACM1
	TAD AUTO10
	DCA AUTO11	/POINTS TO LAST PAGE OF HOLE
	TAD AUTO11
	DCA AUTO12
	TAD I AUTO11	/GET CODE FROM LAST PAGE OF ALLOCATED CORE
	CIA
	DCA HOLCNT	/REMEMBER I.O. TO COMPARE WITH REST
HOLE14,	DCA I AUTO12	/ZERO OUT ALL CORE THAT
	TAD I AUTO11	/BELONGS TO A TASKS WHOSE IMAGE HAS BEEN
	TAD HOLCNT	/SPOILED BY THIS ALLOCATION
	SNA CLA		/STILL THE SAME ?
	 JMP HOLE14	/YES CYCLE
	JMP HOLE7	/DONE, EXIT WITH START OF HOLE IN AC

HOLE20,	TAD HOLLEN	/REMEMBER,
	CIA
	DCA HOLMAX	/THIS IS TOO MUCH, CURRENTLY
	JMP I HOLE	/ERROR RETURN

/RELEASE OPTION. IF 'RELEASE' BIT SET, THE COREMAP ENTRY'S
/OF THE CURRENT TASK ARE COMPLEMENTED AND 'ONDISK' IS SET.
/IF SWPOUT, THE MAP IS CLEARED TO FORCE RELOADING.

RELESE,	0
	TAD FUNCTION
	SMA CLA		/'RELEASE' ?
	 JMP I RELESE	/NO 'RELEASE' REQUESTED
	JMS I (MAPIND	/GET INDEX IN CORMAP FOR CURTSK
	TAD M1		/TO SEE WHAT'S BENEATH US
	DCA AUTO12
	TAD I CURTSK	/FETCH LENGTH
	SPA CLA		/CONNECTED TASK ?
	 JMS I (DISCON	/YES, DISCONNECT IT
	JMS I (GETLEN
	DCA ZTEM1	/-NUMBER OF PAGES
	TAD FUNCTION
	RTR
	CLA		/LINK HOLDS RELEASE/SWPOUT
	TAD I AUTO12	/IF PRECEEDING SLOT IS FREE,
	SNL SZA CLA	/FORCE SWPOUT.
	 TAD CURTSK
	CIA
	DCA AUTO11	/COMPLEMENT OF CURTSK OR ZERO
RELES1,	TAD AUTO11
	DCA I AUTO12
	ISZ ZTEM1
	 JMP RELES1
	ISZ I CURTSK	/SET 'ONDISK'
	JMS RELSUB	/ACTIVATE COREQ WAITERS
	JMP I RELESE	/RETURN FROM RELESE

RELSUB,	0		/ACTIVATE WAITERS IN COREQ ROUTINE
	TAD CHEAD	/COREWAITERS ?
	SNA		/
	 JMP RELSU2	/NO
	DCA I MTAIL	/YES, HANG THEM IN PRIQ
	DCA CHEAD	/CLEAR COREWAITERS Q
	TAD CTAIL	/
	DCA MTAIL	/
	TAD (CHEAD	/
	DCA CTAIL	/
RELSU2,	TAD (40		/LARGEST POSSIBLE HOLE
	DCA HOLMAX	/SET TO MAXIMUM HOLE AVAILABLE+1
	JMP I RELSUB	/RETURN

PAGE

MAPIND, .-. /COMPUTE MAPINDEX OF CURTSK ACM2 / TAD CURTSK DCA ZTEM1 /POINTER TO 'START ADDR' TAD I ZTEM1 AND C7600 IFZERO PDPTYP-PDP8E < CLL RAR BSW > IFNZRO PDPTYP-PDP8E < CLL RTL RTL RTL > TAD (-MONFLD^4+CORMAP-1 DCA ZTEM1 /POINTS IN COREMAP TAD I CURTSK /FETCH FIELD AND C70 CLL RTL TAD ZTEM1 JMP I MAPIND /AC POINTS TO FIRST WORD OF HOLE-1 /***************************************************** /****** S W A P L O G I C ********************** /***************************************************** SWPIN, JMS MAPIND /FETCH POINTER IN COREMAP IAC DCA ZTEM1 /GET TASK LENGTH: JMS GETLEN DCA ZTEM2 /-NUMBER OF PAGES /CORE IMAGE STILL O.K. ? TAD I ZTEM1 TAD CURTSK SZA CLA JMP SWP1 /NO ... /YES, CLAIM CORE AND START: JMS SETMAP AC7776 AND I CURTSK /CLEAR ONDISK DCA I CURTSK TAD I CURTSK SPA JMS I (CONNCT JMP I (START2 /SUBROUTINE SETMAP PUTS CURTSK IN COREMAP SETMAP, .-. TAD CURTSK DCA I ZTEM1 ISZ ZTEM1 ISZ ZTEM2 JMP SETMAP+1 JMP I SETMAP /GETLEN COMPUTES MINUS LENGTH OF TASK GETLEN, .-. TAD I CURTSK AND C3700 IFNZRO PDPTYP-PDP8E < CLL RTR RTR RTR / > IFZERO PDPTYP-PDP8E < BSW / > CIA JMP I GETLEN /GET A BLOCKLET FROM FREECORE: SWP1, TAD FHEAD / SNA / JMP I (SWPER1 /POOL EMPTY, RESCHEDULE TASK IN MAINQ DCA ZTEM7 / TAD I FHEAD / DCA FHEAD / /SEARCH A HOLE IN CORE: TAD ZTEM2 /-LENGTH JMS I (HOLE / JMP I (SWPER2 /CORE IS FULL DCA ZTEM1 /POINTER TO FIRST SLOT TAD ZTEM1 DCA ZTEM3 JMS SETMAP /COMPUTE LOAD ADDRESS: TAD ZTEM3 TAD (-CORMAP AND C37 IFZERO PDPTYP-PDP8E < BSW CLL RAL / > IFNZRO PDPTYP-PDP8E < CLL RTR RTR RTR / > DCA ZTEM4 /NEW LOAD ADDRESS /COMPUTE RELOCATION FOR PC: ACM2 TAD CURTSK DCA ZTEM2 /POINTER TO 'SA' TAD I ZTEM2 AND C7600 CIA TAD ZTEM4 DCA ZTEM1 /RELOCATION DISTANCE /RELOCATE PC: TAD C3 TAD CURTSK DCA ZTEM5 /POINTS TO PC TAD I ZTEM5 TAD ZTEM1 DCA I ZTEM5 /UPDATE 'SA' WITH LOAD ADDRESS: TAD ZTEM4 DCA I ZTEM2 /COMPUTE NEW FIELD: TAD ZTEM3 /POINTS IN CORMAP TAD (MONFLD^4-CORMAP CLL RTR AND C70 DCA ZTEM3 /INSERT NEW FIELD IN TCB[4] TAD I CURTSK AND (7707 TAD ZTEM3 DCA I CURTSK /BUILD DISK REQUEST IN TASKS TCB: ACM3 TAD CURTSK DCA ZTEM3 /POINTS TO 'THREAD' TAD I CURTSK AND C3700 SNA CLA /DON'T ALLOW 4K TASKS ! JMS ALARM TAD I CURTSK AND (3770 /SET TO 'READ' DCA I ZTEM3 /BUILD TCB FOR FAKETSK TAD CURTSK DCA I ZTEM7 TAD C4 TAD ZTEM7 DCA CURTSK /HERE FAKETASK TAKES OVER IFNZRO MONFLD < TAD (MONFLD / > DCA I CURTSK JMP I (.+200&7600 /JUMP TO NEXT PAGE PAGE
/DO THE TRANSFER REQUEST NOW: TAD ZTEM3 /POINTS TO REQUEST JMS MONITOR CALL "S^100+"Y&3777 JMP .-3 /DISK SEEMS BUSY DCA .+3 /AC IS DEV # FOR COMPLETION INT. JMS MONITOR WAIT 0 CDF MONFLD SZA CLA /ERRORS ? JMP SWPER3 /YES ! /KILL FAKETSK AND SET UP CURTSK TAD CURTSK TAD M4 DCA ZTEM1 TAD I ZTEM1 DCA CURTSK /CLEAR 'ONDISK': AC7776 AND I CURTSK DCA I CURTSK /CLEAR 'ONDISK' /RELOCATE THE NEW TASK TAD I CURTSK AND C70 /EXTRACT FIELD BITS TAD C6201 DCA RELCDF JMS I (GETLEN DCA ZTEM5 ACM2 TAD CURTSK DCA ZTEM2 TAD I ZTEM2 DCA ZTEM4 /ALL TASKS MUST BE ASSEMBLED TAD ZTEM4 /AT *200; HENCE SUBSTRACT 200 TAD M200 DCA ZTEM3 /RELOCATION DISTANCE RELCDF, HLT ISZ ZTEM4 /SKIP NAME TAD I ZTEM4 AND C7 /EXTRACT NUMBER OF CONNECTS SNA JMP SWP2 /NO CONNECTS /RELOCATE THE CONNECT-LABELS CIA DCA ZTEM7 /COUNTER SWP1A, ISZ ZTEM4 ISZ ZTEM4 /SKIP SLOT NUMBER TAD I ZTEM4 TAD ZTEM3 /RELOCATE CONNECT LABEL DCA I ZTEM4 ISZ ZTEM7 JMP SWP1A /LOOP /RELOCATE THE OTHER POINTERS SWP2, ISZ ZTEM4 TAD I ZTEM4 SNA JMP SWP3 /ALL RELOCATORS FINISHED TAD ZTEM3 DCA I ZTEM4 JMP SWP2 /REMEMBER CORRECT START ADDRESS SWP3, AC0001 TAD ZTEM4 DCA ZTEM6 /GOTO NEXT PAGE SWP4, TAD ZTEM4 TAD C200 AND C7600 DCA ZTEM4 ISZ ZTEM5 SKP JMP SWP6 SWP5, TAD I ZTEM4 SNA JMP SWP4 TAD ZTEM3 DCA I ZTEM4 ISZ ZTEM4 JMP SWP5 /UPDATE 'SA' SWP6, CDF MONFLD TAD ZTEM6 DCA I ZTEM2 /RELEASE BLOCKLET: TAD FHEAD / DCA I ZTEM1 / TAD ZTEM1 / DCA FHEAD / TAD I CURTSK SPA /ANY CONNECT'S ? JMS I (CONNCT JMP I (START+1 /AND GO !!! /POOL EMPTY: RESCHEDULE CURTSK IN PRIQ: SWPER1, TAD CURTSK JMS I (MAININ JMP I ZDISPATCH /NO ROOM IN CORE, SCHEDULE CURTSK IN COREQ: SWPER2, ACM3 TAD CURTSK DCA I CTAIL TAD I CTAIL DCA CTAIL DCA I CTAIL JMP SWPER4 /DISK TRANFER ERROR: /BLOCK THIS TASK: SWPER3, TAD CURTSK TAD M4 DCA ZTEM7 TAD I ZTEM7 JMS DEFER CLL RTR STL RTL /SET STOP-BIT DCA I X /RELEASE BLOCKLET: SWPER4, TAD FHEAD / DCA I ZTEM7 / TAD ZTEM7 / DCA FHEAD / JMP I ZDISPATCH PAGE
/******************************************************* /****** C O N N E C T - D I S C O N N E C T ****** /******************************************************* CONNCT, .-. JMS CONSET /SETUP CONGET CON1, JMS CONGET //FETCH DEVICE NUMBER CLL RTL // TAD C200 //(SKPBAS+1 DCA AUTO11 // TAD I ZMYCDIF //CDF CIF CDF MONFLD IOF /// DCA I AUTO11 /// TAD AUTO11 /// TAD (CONTAB^4-SKPBAS-4 /// CLL RTR /// DCA ZTEM2 TAD ZTEM2 TAD (5400 ///MAKE JMP I Z ... DCA I AUTO11 JMS CONGET ///INTERRUPT ENTRYADDRES CDF MONFLD /// ION /// DCA I ZTEM2 /// ISZ ZTEM1 /MORE CONNECT'S ? JMP CON1 / TAD I CURTSK JMP I CONNCT CONSET, .-. /ENTER AFTER 'TAD I CURTSK' AND C70 /EXTRACT FIELDBITS TAD C6201 DCA CONCDF ACM2 TAD CURTSK DCA ZTEM1 TAD I ZTEM1 /FETCH 'SA' AND C7600 DCA AUTO10 JMS CONGET //NUMBER OF CONNECT'S AND C177 // CIA // DCA ZTEM1 // JMP I CONSET // DISTMP, CONGET, .-. /CHANGE DATAFIELD TO USERS FIELD AND /FETCH NEXT WORD FROM TASK IMAGE CONCDF, CDF // TAD I AUTO10 // JMP I CONGET // DISCON, .-. TAD I CURTSK JMS CONSET DIS1, JMS CONGET //FETCH DEVICE # TAD (CLRTAB-1 // DCA DISTMP //POINTS TO PROPER CLEAR IOT TAD DISTMP // TAD (-CLRTAB+1 // CLL RTL // TAD (SKPBAS+1 // DCA AUTO11 // CDF MONFLD TAD I DISTMP /FETCH CLEAR-IOT IOF /// DCA I AUTO11 /// TAD (JMS I ZHRDINT ///RESTORE THIS INSTRUCTION ION /// DCA I AUTO11 /// ISZ AUTO10 /SKIP INTERRUPT ENTRY ADDRESS ISZ ZTEM1 /MORE TO DISCONNECT ? JMP DIS1 /YES JMP I DISCON XLIST -LRESMOD-1&XLISTX BB, CDF MONFLD TCWAIT, JMS MONITOR /YES, WAIT HALF A SECOND STALL DGNTICK%2 /SOME CODE TO REVIVE TTY'S WITH LOST ENABLE FLAGS: AC0001 6035 /SET INTERRUPT ENABLE OF CONSOLE TTY IFDEF KL8E2 <6005+KL8E2 /SET INTERRUPT ENABLE OF SECOND TTY> IFDEF KL8E3 <6005+KL8E3 /SET INETRRUPT ENABLE OF THIRD TTY> IFDEF KL8E4 <6005+KL8E4 /SET INTERRUPT ENAMLE OF FOURTH TTY> IFDEF KL8E5 <6005+KL8E5 /SET INTERRUPT ENABLE OF FIFTH TTY> IFDEF KL8E6 <6005+KL8E6 /SET INETRRUPT ENABLE OF SIXTH TTY> IFDEF KL8E7 <6005+KL8E7 /SET INETRRUPT ENABLE OF SEVENTH TTY> CLA CLL IFDEF TC08 < /KEEP AN EYE ON THE DECTAPE UNITS! 6761 /READ STATUS A REGISTER TWICE IN 6761 /ORDER TO BE SURE (ENDZONE !) AND C200 /EXTRACT MOTION BIT SZA CLA /TC08 CONTOLER BUSY ? JMP TCEND /YES, SKIP THIS TIME TAD (TAPETB /NO, SETUP POINTER TO UNITS POSITION DCA ZTEM1 /TABLE AND A COUNTER FOR 8 UNITS TAD M10 DCA ZTEM2 TCLOOP, TAD ZTEM2 /USE COUNTER TO PRODUCE A UNIT # 0-7 RTR RTR AND C7000 /UNIT # 6766 /DTLA AND I 0 /SPENT SOME TIME AND I 0 6772 /DTRB: ERROR ? SPA CLA /SUPPOSE ERRORS MEANS SELECT ERROR DCA I ZTEM1 /SO WE RESET THIS UNITS POSITION 6764 /CLEAR ERROR FLAGS ISZ ZTEM1 /BUMP POINTER AND ISZ ZTEM2 /UNIT COUNTER. DONE ? JMP TCLOOP /NO TCEND, / > JMP BB / PAGE
XLIST -LSYSDRV-1&XLISTX /*************************************************** /********* D I S K D R I V E R *************** /*************************************************** IFNZRO MONFLD-SYSFLD < DOTF00=. FIELD SYSFLD%10 *DOTF10 / > /THE SYSTEM DISK DRIVER TASK /THE CALLER SPECIFIES IN AC AND /DATAFIELD WHERE THE DISKTRANSFERVECTOR IS. THE DTV HAS /THE FOLLOWING FORMAT: /WORD1: RLL.LLL.FFF.UUU /READ/WRITE;LENGTH;FIELD;UNIT /WORD2: STARTING ADDRESS IN CORE /WORD3: BLOCK NUMBER ON DISK /IN 256 WORD BLOCKS /HOW TO USE: / TAD (DTV /PTR TO DTV IN AC / CDF FIELD OF DTV / JMS MONITOR / CALL / "S^100+"Y&3777 /NAME / BUSY RETURN /TASK BUSY;AC=DTV / NORMAL RETURN /AC=EVENT # FOR COMPLETION / DCA EVENT / ....... /HERE IS HOW TO WAIT FOR COMPLETION / JMS MONITOR / WAIT /EVENT, EVENT# /PUT THE EVENT# HERE / NORMAL RETURN /AC=STATUS WORD:0=NO ERRORS / /IF AC='HRDERR'(4):TRANSFER ERROR. SYSMAX=10 /LENGTH OF SYSTEM DISK QUEUE SYSQ, ZBLOCK SYSMAX^2 /MUST START AT PAGE BOUND ! SY, DCA SYSTEM //SAVE DTV POINTER RDF //SAVE DF CDF SYSFLD IFZERO PDPTYP-PDP8E<BSW> IFNZRO PDPTYP-PDP8E<CLL RTL;RTL> DCA I SYSPUT SYS2, IFNZRO SYSFLD-MONFLD < CIF MONFLD / > JMS I ZRESERV /REQUEST A FREE SLOT JMP SYS6 /THERE IS NO SLOT AVAILABLE DCA SYSTM /SAVE SLOT# TAD SYSTM /ALSO TOGETHER WITH FIELD TAD I SYSPUT DCA I SYSPUT ISZ SYSPUT TAD SYSTEM /PUT POINTER IN Q TOO DCA I SYSPUT /EACH ENTRY IN SYSQ CONTAINS 2 WORDS: /WORD1: FFF.00S.SSS.SSS /FIELD AND EVENT # (PDP8/E) /WORD1: 00F.FFS.SSS.SSS /FIELD AND EVENT # (NON-8/E) /WORD2: POINTER TO DISK TRANSFER VECTOR SYS5, IOF /// TAD SYSCNT /// SNA ///IS DISKQ EMPT?Y? JMS I (SYSDO ///Y, START DISK TAD (SYSMAX-1 ///IS DISKQ FULL ? SPA CLA /// JMP SYSWAIT ///Y;WAIT A WHILE TAD SYSPUT /// IAC ///WRAPPING AROUND AND (-SYSMAX-1^2+1 /// DCA SYSPUT /// CLA CMA /// TAD SYSCNT /// ION /// DCA SYSCNT /// TAD SYSTM /RETURN WITH SLOT# IN AC JMS MONITOR EXIT / SYS6, JMS MONITOR PRECEDE JMP SYS2 SYSWAIT,ION JMS MONITOR /WAIT ONE SYSTEM TICK STALL 1 CLA CLL JMP SYS5 /RETRY SYSPUT, SYSQ ///'PUT' POINTER SYSTEM, 0 /TEMPORARY STORAGE FOR DTV POINTER SYSTM, 0 /TEMP STORAGE FOR CURRENT SLOT# SYSCNT, 0 ///COUNTER OF ELEMENTS IN SYSQ
/INTERRUPT PART OF DISK SYSTEM DRIVER /THE PROGRAM ALLOWS FOR 3 CONSECUTIVE ERRONEOUS DISK- /TRANSFERS,THEN ISSUES AN ERROR. /IT FETCHES THE NEXT TRANSFER FROM THE DISKQ AND CAUSES /A 'SOFT' INTERRUPT AT THE SLOT FOR THE CALLING TASK. IFDEF SYRK8E < DSKP=6741 /SKIP ON DONE OR ERROR FLAG DCLR=6742 /DISK CLEAR DLAG=6743 /LOAD DISK ADDRESS AND GO ! DLCA=6744 /LOAD CURRENT ADDRESS DRST=6745 /READ STATUS DLDC=6746 /LOAD COMMAND / DMAN=6747 (MAINTENANCE INSTRUCTION) > IFDEF SY3010 < /EQAUTES FOR SYSTEM INDUSTRIES CONTROLER DSDD=6501 /SKIP ON DONE DLCR=DSDD+1 /LOAD CONTROL REGISTER DRCR=DLCR+1 /READ CONTROL REGISTER DCSR=DRCR+1 /CLEAR STUTUS REGISTER DRSR=DCSR+1 /READ STATUS REGISTER DLSS=DRSR+1 /LOAD SEEK ADDRESS AND SEEK DRSS=DLSS+1 /READ SEEK STATUS REGISTER DSDE=DRSS+2 /SKIP ON DISK ERROR DLSR=DSDE+1 /LOAD SECTOR REGISTER DSRR=DLSR+1 /READ SECTOR REGISTER DLTR=DSRR+1 /LOAD TRACK ADDRES AND READ DLTW=DLTR+1 /LOAD TRACK ADDRESS AND WRITE DRTR=DLTW+1 /READ TRACK ADDRESS REGISTER DWCA=DRTR+1 /INITAIATE WC/CA SEQUENCE > JMS I (SYSDO ///INITIATE NEXT TRANSFER SYSIN0, JMS SYSWAT ///GET COMPLETION INTERRUPT IFDEF RFORDF < 6616 ///READ STATUS AND (5 ///LOOK FOR SERIOUS ERRORS SNA CLA /// JMP SYS10 ///IGNORE NXD-ERRORS > IFDEF SYRK8E< DRST ///READ STATUS CLL RAL ///BIT 0 MUST BE 1, OTHERS ZERO SZA ///RIGHT ? JMP SYSERR ///NO, WHAT A PITY TAD I (SYSDO-1 ///YES, FAST CONTINUE SNA ///LAST TRANSFER ? JMP SYS10 ///YES, TRY NEXT IN QUEUE JMS I (SYNXCT ///QUICKLY INITIATE NEXT TRANSFER ///AND COMPUTE THE ONE AFTER THAT JMP SYSIN0 ///WAIT FOR NEXT INTERRUPT SYSERR, AND (1002 ///GET IMPORTANT ERROR BITS SNA CLA ///SERIOUS ERROR ? JMP SYNSER ///NO, TRY AGAIN DCLR ///YES, RECALIBRATE AC0002 DCLR ///RECALIBRATE JMS SYSWAT ///WAIT FOR COMMAND ACCEPTED STL IAC RTL ///6 IN AC AND I (SYFUNC ///GET DRIVE # TAD (600 ///INTERRUPT ON SEEK DONE DLDC JMS SYSWAT ///WAIT TILL SEEK COMPLETED DRST CLL RAL JMP SYSERR ///OK NOW ? SYNSER, > IFDEF SY3010 < DSDE ///DISK ERROR ? JMP SYS10 ///NO, PROCEED > ISZ ERRLOG ///ACCOUNT THIS ERROR ISZ SYERCNT ///Y;3RD CONSEC. ERROR? JMP SYSIN0-1 ///N;TRY AGAIN TAD (HRDERR ///ERROR CODE /AT THIS POINT A DISK TRANSFER HAS DEFINITELY TERMINATED SYS10, DCA SYSTAT ///COMPLETION STATUS ACM3 ///RESET THE ERRORCOUNTER DCA SYERCNT /// AC0002 /// TAD I (SYSGET ///INCREMENT THE POINTER AND (-SYSMAX-1^2+1/// DCA I (SYSGET /// TAD SYSLOT ///GO GIVE COMPLETION TO USER JMS SYSWAT ///WILL RETURN SOON, FLAG STILL UP ISZ SYSCNT ///SKIP IF QUE EMPTY JMP SYSIN0-1 ///INITIATE NEXT TRANSFER SYIGNR, IFDEF RFORDF <6601> IFDEF SYRK8E <DCLR> IFDEF SY3010 < DCSR ///CLEAR STATUS AND DLCR ///CONTROL REGISTER > JMS SYSWAT ///IGNORE EXCESSIVE INTERRUPTS JMP SYIGNR SYSWAT, SYIGNR ///COROUTINE, INITIAL INTERRUPT ENTRY IFNZRO SYSFLD-MONFLD <CIF MONFLD /// > SNA ///MUST GIVE SOFINT ? JMP I ZFSTEXT ///NO, QUICK RETURN JMS I ZSOFINT ///YES, AC IS DEVICE NUMBER SYSTAT, 0 ///COMPLETION STATUS SYSINT, /// HERE GOES THE INTERRUPT !!! IFDEF SYRF08 <6641 ///CLEAR HIGHORDER DISK ADDRESS > JMP I SYSWAT ///GOT NEXT INTERRUPT SYERCNT,-3 ///ERROR COUNTER SYSLOT, 0 ///CURRENT SLOT# ERRLOG, 0 ///TOTAL DISK ERRORS PAGE
/ SET UP ALL DISKREGISTERS AND INITIALIZE THE TRANSFER 0 SYSDO, 0 TAD (SYSIN0+1 DCA I (SYSWAT TAD I SYSGET BSW AND C70 TAD C6201 DCA SYSCDF TAD I SYSGET AND C177 DCA I (SYSLOT TAD SYSGET IAC DCA SYSDO-1 TAD I SYSDO-1 DCA SYSDTV SYSCDF, HLT TAD I SYSDTV / HIER BEGINNT DER TEIL ZUR BENUTZUNG DES RKS8E-CONTROLLERS / WORD-COUNT IFDEF SYRKS8 < DCWC=6752 DLWC=6753 DRWC=6755 / AND (4070 // MASK WRITE AND FIELD TAD (0400 // INTERRUPT ENABLE DCA SYFUNC TAD I SYSDTV AND C7 // MASK UNIT & SIDE CLL RAR // SIDE IN LINK TAD SYFUNC DCA SYFUNC TAD I SYSDTV AND C3700 SNA // ZERO MEANS 40(8) PAGES AC4000 DCA SYSWC / +# OF PAGES TO TRANSFER IN BIT 1-5 ISZ SYSDTV TAD I SYSDTV // CORE BUFFER DLCA ISZ SYSDTV SZL TAD (6260 // B-SIDE HAS OFFSET CLL TAD I SYSDTV // FETCH BLOCK # CDF MONFLD DCA SYSSB // THIS IS THE LOW ORDER START BLOCK # SZL CLL IAC BSW TAD SYFUNC // SET HIGH ORDER CYLINDER ADDRESS DCA SYFUNC TAD SYFUNC JMS SYNXCT // INITIATE TRANSFER AND CONTINUE JMP I SYSDO / SYNXCT, 0 DLDC DCWC TAD SYSSB AND C17 CIA TAD (20 / # OF FREE SECTORS ON TRACE BSW / IN BITS 2-5 DCA SYSWC1 TAD SYSWC1 CLL CIA RAL / -# OF FREE PAGES IN TRACE IN BITS 1-5 TAD SYSWC /+ # OF PAGES TO TRANSFER CLL SMA SZA CLA / POSITIV ? JMP SYTEIL / YES, WE MUST SPLIT TRANSFER TAD SYSWC /NO, ONLY ONE TRANSFER IS NECESSARY CIA RAL DLWC / - # OF WORDS TO TRANSFER TAD SYSSB DLAG / G O !! JMP SYLAST / AND END SYTEIL, TAD SYSWC1 CIA RAL CLL RAL DLWC TAD SYSSB DLAG / G O !! TAD SYSWC1 CLL CIA RAL TAD SYSWC DCA SYSWC / # OF PAGES ,WHICH ARE STILL TO TRANSFER TAD SYSWC1 CLL BSW TAD SYSSB DCA SYSSB / NEW STARTING ADDRESS SZL // OVERFLOW TO SIDE B ? CLL IAC BSW // YES, SET FUNCTION BIT TAD SYFUNC SYLAST, DCA SYSDO-1 JMP I SYNXCT SYSWC1, 0 / HIER ENDET DER TEIL ZUR BENUTZUNG DES RKS8E / >
IFDEF SYRK8E < IFNDEF SYRKS8 < AND (4076 //MASK WRITE+FIELD+UNIT TAD (0400 //INTR. ENABLE DCA SYFUNC TAD I SYSDTV AND C3700 //# OF PAGES SNA AC4000 BSW //MINUS NUMBER OF PAGES CIA DCA SYSWC TAD I SYSDTV RAR //ROTATE UNIT TO LINK CLA ISZ SYSDTV TAD I SYSDTV //CORE BUFFER ADDRESS DLCA ISZ SYSDTV SZL CLA TAD (6260 //B SIDE HAS OFFSET CLL TAD I SYSDTV //FETCH CALLERS BLOCK # CDF SYSFLD DCA SYSSB /THIS IS THE LOW ORDER START BLOCK SZL /IF NO OVERFLOW, ISZ SYFUNC /SET H.O.CYLINDER ADDRESS TAD SYFUNC JMS SYNXCT /INITIATE TRANSFER AND COMPUTE NEXT FUNCT. JMP I SYSDO /INITIALIZE THE TRANSFER AND COMPUTE THE FUNCTION REGISTER /FOR THE NEXT TRANSFER. SYNXCT, 0 ISZ SYSWC /THIS SKIPS IF ONLY ONE PAGE TO GO SKP TAD (100 /SET THE HALF SECTOR BIT DLDC /LOAD FUNCTION WORD REGISTER TAD SYSSB /LOAD BLOCK # DLAG /GO... ISZ SYSWC /IS THIS THE END ? TAD SYSWC /OR PAST THE END ? SMA CLA JMP SYLAST /YES, WE ARE TROUGH ! ISZ SYSSB /INCREMENT BLOCK # JMP .+3 / ISZ SYFUNC /CARRIE GOES TO FUNCTION WORD JMP .+5 /THIS CERTAINLY IS A NEW CYLINDER TAD SYSSB /TEST IF STARTBLOCK AND C37 /IS FIRST BLOCK OF NEW CYLINDER SZA CLA /IN THAT CASE WE SHOULD TEST HEADER INFO TAD (1000 /SET THE 'ALL' BIT TAD SYFUNC SYLAST, DCA SYSDO-1 /NEW FUNCTION WORD FOR NEXT TRANSFER JMP I SYNXCT > SYSSB, 0 /STARTING BLOCK SYFUNC, 0 > /FUNCTION WORD
IFDEF SY3010 < SPA CLA ///READ OR WRITE ? AC0001 /// TAD (DLTR ///MAKE READ OR WRITE INSTRUCTION DCA SYSRW ///AND PUT IT AHEAD DCSR ///CLEAR STATUS REGISTER TAD (SYSFLD^100 ///EMA FOR WC/CA SEQUENCE DLCR ///SETUP CONTROL REGISTER FOR WC/CA CLA ///IS THIS REALY NECCESAIRY TAD I SYSDTV ///GET FUNCTION WORD AGAIN CLL RAL ///# OF WORDS IN BITS 1-4 AND C7600 ///MASK OFF GARBADGE SNA ///THIS DISK CAN'T DO 4K XFERS !!!! ACM1 ///SO WE DO 4K-1WORD (SORRY !) DCA SYSWC /// TAD I SYSDTV ///THE FUNCTION WORD AGAIN AND C70 ///EXTRACT BUFFER FIELD IFZERO PDPTYP-PDP8E < IAC BSW ///MAKE F.1.0.0 > IFNZRO PDPTYP-PDP8E < CLL IAC RTL RTL RTL ///MAKE F.1.0.0 > DCA SYSCTR ///CONTROL REGISTER FOR TANSFER TAD I SYSDTV ///FUNCTION WORD AND (6 ///GET DRIVE NUMBER CLL RTR RTR ///DD0.000.000.000 DCA SYSDRV ///STORE DRIVE NUMBER FOR LATER TAD I SYSDTV /// CLL RAR ///A/B BIT TO LINK CLA /L/ ISZ SYSDTV /L/BUMP POINTER TO BUFFER ADDRESS TAD I SYSDTV /L/ DCA SYSCA /L/STORE CURRENT ADDRESS TAD (SYSWC DWCA /L/INITIATE WC/CA SEQUENCE CLA /L/IS THIS REALY NECESARRY ? ISZ SYSDTV /L/BUMP POINTER TO BLOCK NUMBER TAD I SYSDTV /L/ AND C17 /L/EXTRACT SECTOR NUMBER (256 WRD SECTORS!) DLSR /L/LOAD SECTOR REGISTER CLA /L/IS THIS REALY NECCESARY TAD SYSCTR /L/GET CONTROL REGISTER FOR TRANSFER /L/(I HOPE THE WC/CA SEQ. IS FINISHED NOW ) DLCR /L/LOAD CONTROL REGISTER (EMA+INT ENABLE) CLA TAD I SYSDTV /L/GET BLOCK NUMBER AGAIN RAR ///SIGN-BIT IS A/B NOW ! AND C7770 /// SPA /// TAD (7140 ///B-SIDE HAS OFFSET OF 6300 BLOCKS CLL RTR /// MAKE TRACK ADDRESS RAR ///IN BITS 3-11 TAD SYSDRV ///ADD DRIVE NUMBER IN BITS 0-1 SYSRW, HLT ///'READ-OR WRITE INSTRUCTION CLA ///IS THIS REALY NECESARY ? JMP I SYSDO /RETURN ! SYSDRV, 0 /HOLDS DRIVE NUMBER IN BITS 0-1 SYSCTR, 0 /HOLD CONTROL REGISTER > IFDEF RFORDF < SYSCA, 0 > /CURRENT ADDRES SYSWC, 0 /WORDCOUNT IFDEF SY3010 < SYSCA, 0 /MUST FOLLOW SYSWC IMMEDIATLY !!!! > SYSGET, SYSQ ///'GET'POINTER IN SYSQ SYSDTV, 0 /PTR TO DISK TRANSFER VECTOR > /END OF ALL DISK STUFF PAGE XLIST -LRESMOD-1&XLISTX /************************************************** /**** D I A G N O S T I C T I M E R ********* /************************************************** DGNTIM, CLA CLL TAD (HRDLST /SET UP FOR LISTSEARCH DCA DGNPNT IFZERO BGMAX <TAD (-MAXSLOT+1> IFNZRO BGMAX <TAD (-MAXSLOT-BGMAX> DCA DGNNUM DGN1, CIF SYSFLD TAD I DGNPNT ///CAN BE 0; LT 0 OR GT 0 SPA CLA ///TIME-OUT SET ? ISZ I DGNPNT ///INCREMENT THE TIME-VALUE JMP DGN2 /IF NO OVFLOW:TRY NEXT ONE TAD DGNNUM /IF OVFLOW:INTERRUPT THAT SLOT IFZERO BGMAX <TAD (MAXSLOT-1> IFNZRO BGMAX <TAD (MAXSLOT+BGMAX> DCA DGN4 AC0002 /// TAD (TIMEOUT JMS MONITOR /INTERRUPT THE TASK WITH CODE IN AC SIGNAL DGN4, 0 DGN2, CLA CLL ISZ DGNPNT /MOVE POINTER;INC COUNTER ISZ DGNPNT ISZ DGNNUM JMP DGN1 TAD (-DGNCNT /ALL DONE: THIS SETS OUR TICK VALUE JMS MONITOR /WAIT FOR TIMER TO FLOW OVER WAIT TIMER JMP DGNTIM DGNPNT, 0 DGNNUM, 0 PAGE IFNZRO MONFLD-SYSFLD < DOTF10=. FIELD MONFLD%10 *DOTF00 / >
XLIST -LTEXT-1&XLISTX /************************************************************ /********* T E R M I N A L H A N D L E R S ************ /************************************************************ /TERMINAL HANDLERS- TWO CORE-RESIDENT TASKS THAT PERFORM TERMINAL /I/O ON CHARACTER BASIS. THE TERMINAL OUTPUT HANDLER ("TT") /HAS THE FOLLOWING SPECIAL FEATURES: / /TT IS ENTERED WITH THE CHARACHTER TO PRINT IN THE AC. IN ADDITION /THE SIGN-BIT (BIT 00) SPECIFIES WHETHER TT SHOULD ALLOW OTHER /TASKS TO INTERRUPT THE CURRENT OUTPUT STREAM; IF BIT 00 IS /SET, TT WILL MAKE A 'RETURN' INSTEAD OF AN 'EXIT'. /IF THE AC IS ZERO ON ENTRY, THE TASK TAKES AN IMMEDIATE 'EXIT'. /TT WILL CONVERT A TAB CHARACTER TO AS MUCH SPACES AS ARE /NECCESSARY TO REACH THE NEXT TAB POSITION (EVERY EIGTH POSITION). /TO SUPPORT HIGH BAUD RATES FOR VIDEO TERMINALS, A FILLCHARACTER /AND FILLCOUNT MUST BE SPECIFIED. AFTER EACH OCCURENCE OF THE /FILLCHARACTER THE TASK WILL SEND 'FILLCOUNT' NULL-CHARACTERS TO /GIVE THE TERMINAL TIME TO PERFORM CRITICAL OPERATIONS. IFDEF KL8E2 < /IN CASE THE CONFIGURATION CONTAINS MORE THAN ONE KL8E INTERFACED /TERMINAL, THE TT TASK COMES IN A REENTRANT FORM, DRIVEN BY A /SMALL TABLE FOR EACH TERMINAL. THE FORMAT OF THIS TABLE IS: / /WORD0: 0 /TEMP /WORD1: TLS /A TLS INSTRUCTION WITH THE PROPER DEVICE CODE /WORD2: TTY0 /INTERNAL DEVICE NUMBER /WORD3: 0 /TEMP /WORD4: 0 /HOLDS RETURN ADDRESS OF TTOUT /WORD5: 0 /CURRENT POSITION COUNTER /WORD6: -FILLCHAR /MINUS FILL CHARACTER FOR THIS TERMINAL /WORD7: -3 /MINUS NUMBER OF FILL CHARACTERS TO SUPPLY, / /0=NONE /WORD10:0 /ANOTHER TEMP / /THESE REENTRANT VERSIONS MAKE USE OF THREE SMALL /ROUTINES THAT ALLOW RELATIVE ADDRESSING OF THE TABLE. /'SETBASE' INITIATES 'BASE' (AT PAGE ZERO) WITH THE START /ADDRESS OF THE TABLE WHICH IS RETRIEVED FROM THE THIRD WORD /OF THE TCB OF THE RUNNING TASK. THIS LOCATION IS NORMALLY /USED TO STORE THE DISK BLOCK # WHERE THE TASKIMAGE CAN BE FOUND. /HOWEVER, FOR CORE-RESIDENT TASKS IT IS FREE TO ANY PURPOSE /'SETBASE' MAY BE ENTERED WITH RANDOM AC AND DATAFIELD. THE CALLERS /LINK IS PRESERVED. /'PUT' STORES THE CALLERS AC IN A RELATIVE POSITION. THE OFFSET IS /THE PARAMETER WORD AFTER THE JMS: / / TAD VALUE / JMS PUT / OFFSET / RETURN, AC=0 /'GET' LOADS AC FROM A LOCATION RELATIVE TO 'BASE', OFFSET IS /PARAMETER + AC. / / JMS GET / OFFSET / RETURN, AC= (BASE+OFFSET) XLIST -LRESMOD-1&XLISTX
/REENTRANT VERSION /DEFINITIONS OF OFFSETS TTCHAR= 0 TTTLS= 1 TTEVNT= 2 TTTMP= 3 TTRET= 4 TTCOUNT=5 FILLCH= 6 FILLCNT=7 TTSAV= 10 TT, SNA JMP TT3 /AC=0: TAKE IMMEDIATE EXIT DCA ZTEM1 JMS I (SETBASE /INITIALISE 'BASE' WITH POINTER TO TTY LIST TAD ZTEM1 DCA I BASE /STORE USERS AC IN TTCHAR TAD ZTEM1 TAD (-211 AND C177 SNA CLA /TAB ? JMP TTTAB /YES, GO EXPAND THE TAB CHARACTER TAD ZTEM1 JMS TTOUT /NOT TAB, PRINT THE CHARACTER TT1, JMS I (GET FILLCH /GET MINUS THE FILLCHARACTER TAD I BASE /GET THE USERS CHARACTER AND C177 /STRIP PARITY SNA CLA /FILLCHARACTERS NEEDED ? JMP TTFILL /YES, GO THERE TT2, TAD I BASE SMA CLA /EXIT OR RETURN ? JMP TT3 JMS MONITOR RETURN /TT3, JMS MONITOR /SEE AT KK2 / EXIT TTTAB, TAD C240 /EXPAND A TAB... JMS TTOUT /START WITH ONE SPACE JMS I (GET TTCOUNT AND C7 /ARE WE AT TAB POSITION ? SZA CLA JMP TTTAB /NOT YET JMP TT1 /DONE TTFILL, JMS I (GET FILLCNT /GET THE DISIRED FILLCOUNT SNA JMP TT2 /ZERO=NONE JMS I (PUT TTTMP /STORE IN TTYLIST JMS TTOUT /OUTPUT A NULL JMS I (GET TTTMP IAC JMP TTFILL+2 /SEE IF DONE TTOUT, 0 /SUBROUTINE TO OUTPUT ONE CHARACTER JMS I (PUT TTSAV /SAVE THE CHARACTER TAD TTOUT /SAVE RETURNADDRESS IN TTYLIST JMS I (PUT TTRET JMS I (GET TTEVNT /GET THE EVENT NUMBER DCA .+4 TAD (-DGNTICK /ONE SECOND TIMEOUT KEEPS SYSTEM GOING JMS MONITOR WAIT 0 JMS I (SETBASE /RELOAD BASE REGISTER JMS I (GET TTRET /FETCH RETURN ADDRESS DCA TTOUT JMS I (GET TTTLS /GET PROPPER TLS INSTRUCTION DCA .+3 JMS I (GET TTSAV /GET THE CHARACTER TO BE PRINTED HLT /WILL BECOME A TLS AND C177 TAD (-40 SMA /CONTROL-CHAR ? JMP TTOU1 /NO, COUNT IT TAD (40-12 SZA CLA /WAS IT LINEFEED ? JMP I TTOUT /DON'T COUNT NONPRINTING'S JMP .+4 /YES, RESET POSITION COUNTER TTOU1, JMS I (GET TTCOUNT IAC /INCREMENT POSITION COUNTER JMS I (PUT TTCOUNT JMP I TTOUT / > XLIST -LRESMOD-1&XLISTX IFNDEF KL8E2 < /NON-REENTRANT VERSION- TT, SNA /AC=0 ? JMP TT3 /YES, EXIT ! DCA TTSAV TAD TTSAV DCA TTCHAR /SAVE THE USERS AC, WE'LL NEED IT TAD TTSAV TAD (-211 AND C177 SNA CLA /TAB ? JMP TTTAB /YES, GO EXPAND IT TAD TTSAV JMS TTOUT /OUTPUT THE CHARACTER TT1, TAD TTCHAR TAD FILLCH SNA CLA /FILLERS NEEDED ? JMP TTFILL /MUST SUPPLY FILLERS TT2, TAD TTCHAR SMA CLA /EXIT OR RETURN ? JMP TT3 JMS MONITOR RETURN TT3, JMS MONITOR EXIT TTTAB, TAD C240 /EXPAND A TAB ... JMS TTOUT /OUTPUT A SPACE TAD TTCOUNT AND C7 SZA CLA /ARE WE AT A TAB-STOP ? JMP TTTAB /NOT YET JMP TT1 /DONE TTFILL, TAD FILCNT /GET DISIRED NUMBER OF FILL CHAR'S DCA TTTMP JMS TTOUT /OUTPUT A NULL ISZ TTTMP JMP .-2 /MORE JMP TT2 /DONE TTOUT, 0 /SINGLE CHARACTER OUTPUT ROUTINE DCA TTSAV TAD (-DGNTICK /ONE SECOND TIMEOUT KEEPS TERMINAL GOING JMS MONITOR WAIT TTY1 CLA CLL TAD TTSAV TLS /THERE GOES THE CHARACTER ISZ TTCOUNT /INCREMENT POSITION COUNTER AND C177 /STRIP PARITY BIT TAD (-40 /CODE .LT.240 ? SMA CLA JMP I TTOUT /NO, PRINTING CHARACTER TAD TTSAV TAD (-212 AND C177 SNA CLA /LINEFEED ? JMP .+3 /YES, RESET POSITION COUNTER ACM1 /WE INCREMENTED POS COUNTER, TAD TTCOUNT /BUT WE SHOULDN'T DCA TTCOUNT JMP I TTOUT /DONE TTSAV, 0 /THE CHARACTER THAT WILL GO OUT TTCHAR, 0 /THE CHARACTER WE GOT FROM THE CALLER TTCOUNT,0 /THE CURRENT POSITION FILLCH, -T1CHAR /MINUS CHARACTER THAT NEEDS FILLERS FILCNT, -T1FILL /THE NUMBER OF FILLERS TO BE SUPPLIED TTTMP, 0 /A TEMPORARY, END OF NONREENTRANT VERSION >
XLIST -LTEXT-1&XLISTX /THE INPUT TASK ("KK") IS SOMEWHAT SIMPLER. THE CALLERS AC IS /TIMEOUTVALUE FOR A WAIT FOR KEAYBOARD INPUT. WHEN A CHARACTER IS /RECIEVED WITHIN THE TIMOUT PERIOD, IT IS RETURNED TO THE CALLER. /IN CASE THE TIMEOUT FIRES, THE CALLER IS NOTIFIED WITH /AC =4000 /UNLESS THE INPUT CHARACTER IS A NULL, THE PARITY BIT IS FORCED ON. /THE CODES 376 AND 233 (ESCAPE) ARE CONVERTED TO 375 (ALTMODE). IFZERO PDPTYP-PDP8E < /THE LEAST SIGNIFICANT BIT OF THE AC DETERMINES WHETHER THE /TELETYPE READER WILL BE STARTED OR NOT. > IFDEF KL8E2 < /THE TASK KK IS REENTRANT AND MAY SERVICE ANY NUMBER OF TERMINALS /IT IS DRIVEN BY A TABLE OF THREE ENTRIES FOR EACH TERMINAL: / /WORD0: KB1 /THE INTERNAL DEVICE NUMBER OF THE KEYBOARD /WORD1: KRS /THE APROPRIATE KRS INTRUCTION /WORD2: KCC /THE KCC-INSTRUCTION FOR THE PROPER DEVICE CODE >
XLIST -LRESMOD-1&XLISTX IFDEF KL8E2 < /REENTRANT VERSION OF KK- /DEFINITION OF OFFSETS KKEVNT= 0 KKREAD= 1 KKSTRT= 2 KK, DCA ZTEM1 JMS I (SETBASE /INITIALISE BASE REGISTER IFZERO PDPTYP-PDP8E < /READER SUPPORT FOR 8/E TAD ZTEM1 RAR SNL CLA /START READER ? JMP KK1 /DON'T START READER JMS I (GET KKSTRT /GET KCC-INSTRUCTION DCA .+1 HLT /WILL BECOME KCC KK1, / > TAD I BASE /GET SLOT NUMBER DCA .+4 TAD ZTEM1 /USE CALLERS AC AS TIMEOUT VALUE JMS MONITOR WAIT 0 /WILL BECOME PROPER SLOT NUMBER SZA CLA /TIMEOUT ? JMP KK2 /YES, EXIT WITH AC4000 JMS I (SETBASE /RELOAD BASE REGISTER JMS I (GET KKREAD /GET KRS-INSTRUCTION DCA .+1 HLT /WILL BECOME KRS INTRUCTION SNA /DON'T TOUCH NULL'S JMP KK2+1 AND C177 /SET PARITY BIT TAD (-176 /ASR35 ALTMODE ? SNA TAD M1 /MAKE NORMAL ALTMODE (=375 TAD (376-233 SNA /ESCAPE ? TAD (375-233 /MAKE ALTMODE TAD (233 /RESTORE CHAR SKP KK2, AC4000 TT3, JMS MONITOR EXIT / END OF REENTRANT VERSION > IFNDEF KL8E2 < /NON-REENTRANT VERSION OF KK KK, IFZERO PDPTYP-PDP8E < /READER SUPPORT FOR 8/E DCA ZTEM1 TAD ZTEM1 RAR SZL CLA KCC /KICK THE READER TAD ZTEM1 / > JMS MONITOR WAIT KB1 SZA CLA JMP KK2 /TIMED OUT KRS SNA /DON'T TOUCH NULL'S JMP KK2+1 AND C177 TAD (-176 SNA /ASR35-ALTMODE ? TAD M1 /MAKE NORMAL ALTMODE (=375) TAD (376-233 SNA /ESCAPE ? TAD (375-233 /MAKE ALTMODE TAD (233 /RESORE CHAR SKP KK2, AC4000 JMS MONITOR EXIT /END OF NON-REENTRANT VERSION > PAGE



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