File SPATCH.PA (PAL assembler source file)

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

	/PS/8 PATCHES TO 8K SABR ASSEMBLER
	/SABR ASSEMBLER, LIKE 8K FORTRAN UNDER PS/8, RUNS
	/IN FIELD 1 WITH ITS TABLES IN FIELD 0.
/COPYRIGHT 1970, DIGITAL EQUIPMENT CORP., MAYNARD MASS.

	FIELD 0
	MPARAM=7643
	DVHNDL=7647
	JSBITS=7746
	MOFILE=7600
	CORE1=6000	/UPPER CORE LIMIT OF OCCURRENCE TABLE
			/(5600 IF CALLED FROM FORTRAN)
	SABR=202	/SABR V17 FIRST LOC AFTER "JMS I IOINIT"
	PASS=110	/SABR V17
	SERROR=JMS I 177/SABR V17
	ERRE=2701	/SABR V17
	PRSYMP=41	/SABR V17
	TEM1=123	/SABR V17
	TEM2=124	/"
	M4=3704		/"
	CLOC1=6		/"
	CLOC2=3162	/"
	CLOC3=4356	/"
	CTYPE=23	/"
	CHR=61		/"
	SYMBOL=3	/"
	LLFS=5364	/"
	LINE=67		/"
	L64=4772	/"
	TYPE=54		/"
	PUNCH=42	/"
	INBUF=6000	/6000-6777
	PRJ5=4051
	PRNOP=4136
	PRJ2=4170
	PRS2=4025
	PRS5=4101

*200 /INITIALIZATION - GETS DESTROYED DURING SABR EXECUTION START, ISZ I [FSWITC /SKIPS SINCE FSWITC=-1. ENTRY FROM "R SABR" FSTART, JMP SETCOR /ENTRY FROM 8K FORTRAN VIA "RUN SABR" MONITOR CALL CLA CMA DCA I [FSWITC CIF 10 JMS I [7700 /CALL I/O MONITOR 10 /AND ASK IT TO STICK AROUND CIF 10 JMS I [200 5 /COMMAND DECODE 2302 /.SB ASSUMED EXTENSION CDF 10 TAD I [MPARAM AND [100 CDF 0 SNA CLA /IS /F SWITCH ON? DCA I [FSWITC /NO - ZERO OUT FSWITC TAD I [JSBITS TAD [1000 DCA I [JSBITS TAD [7600 /MAKE PAGE 5600 ACCESSABLE TO SABR JMP .+4 SETCOR, ISZ I [FDSW /SET DELETE SWITCH TAD [7700 DCA I [SYSTEM /SET INDICATOR THAT MONITOR IS NOT IN CORE CDF 10 TAD [CORE1-1 DCA I [CLOC1 TAD I [CLOC1 DCA I [CLOC3 TAD I [CLOC1 IAC DCA I [CLOC2 TAD I [MPARAM+1 AND [40 SNA CLA /IF /S IS ON TAD I [MOFILE+5 SZA CLA /OR IF THERE IS NO LISTING OUTPUT FILE JMP NSPEED TAD [PRS5&177+5200 /SPEED UP SYMBOL TABLE SORT DCA I [PRJ5 DCA I [PRNOP DCA I [SYMXX /AND PRINT "U" MESSAGE FOR UNDEFINEDS TAD [PRS2-1&177+5200 DCA I [PRJ2 NSPEED, CDF 10 TAD I [MOFILE+4 /GET EXTENSION OF BINARY OUTPUT SNA /IS IT THERE? TAD [2214 /NO - SET TO .RL DCA I [MOFILE+4 TAD I [MOFILE+11 SNA TAD [1423 /SIMILIARLY SET LISTING EXTENSION TO .LS DCA I [MOFILE+11 DCA I [OUTINH TAD I [MOFILE SNA CLA /BINARY OUTPUT? JMP NOBNOT /NO CDF CIF 10 JMS I [TSTNTR /YES - OPEN IT CDF 10 JMP YESBOT NOBNOT, TAD [MOFILE+1 DCA I [PFILE ISZ I [OUTINH /INHIBIT OUTPUT YESBOT, TAD I [MOFILE+5 CDF 0 SZA CLA DCA I [LSTFLG CDF 10 TAD I [MPARAM AND [41 /"L" OR "G" FLAGS ON? CDF 0 SNA CLA JMP NOLOAD JMS I [MINCOR CLA IAC /DEVICE "SYS" CIF 10 JMS I [200 2 /LOOKUP ALOAD, LOADER 0 /LENGTH GOES HERE AND IS IGNORED JMP NOLODR /COULDN'T FIND IT TAD ALOAD DCA I [LDRBLK CDF 10 TAD I [OUTREC CDF 0 DCA I [REMEMB NOLOAD, JMS I [OPENFL /OPEN FIRST INPUT FILE WHILE MONITOR STILL IN CORE CDF CIF 10 JMP I .+1 SABR /FIRST LOC IN SABR AFTER "INITIAL DIALOGUE" NOLODR, TAD [1200 JMP I [ERROR LOADER, TEXT /LOADERSV/
*1100 /FILE OPENER - RESIDES IN PART OF THE OLD SABR INPUT BUFFER O7760, 7760 OPENFL, 0 CDF 10 TAD I FILPTR SNA /IS THERE ANOTHER INPUT FILE? JMP I (ERROR+1 /ERROR - NO END STATEMENT IN PROGRAM DCA OTEMP TAD OTEMP AND (17 /EXTRACT DEVICE NUMBER TAD (DVHNDL-1 DCA OTEMP2 TAD I OTEMP2 DCA OTEMP2 ISZ FILPTR TAD I FILPTR /GET STARTING BLOCK # CDF 0 DCA I (INREC /STORE IT AWAY ISZ FILPTR TAD OTEMP AND (7760 /EXTRACT LENGTH SZA /LENGTH OF 256 IMPLIES MAY BE LARGER TAD (17 CLL CML RTR RTR /GET LENGTH AS A NORMAL NEGATIVE NUMBER DCA I (INCNT /STORE THAT AWAY TOO TAD OTEMP2 SZA JMP GOTIT JMS I (MINCOR /GET MONITOR TAD (5600 DCA ADEVNO TAD OTEMP CIF 10 JMS I O200 1 /ASSIGN ADEVNO, 5600 /FORCE HANDLER INTO PAGE 5600 JMP I (DELERR /TWO - PAGE HANDLER - GIVE "S" ERROR TAD ADEVNO GOTIT, DCA I (INDEV JMS I (MOUCOR /GET MONITOR OUT CLA CMA DCA I (INCHCT /FORCE BUFFER LOAD ON FIRST READ JMP I OPENFL OTEMP, 0 OTEMP2, 0 FILPTR, 7617 O200, 200
*1200 /CAN ONLY USE UP TO 1245 FOR PROGRAM MINCOR, 0 RDF TAD MINCIF DCA MINXIT MINCIF, CDF CIF 0 CIF 10 JMS I SYSTEM 10 /ESCAPE TAD MIN200 DCA SYSTEM MINXIT, 0 /RESTORE CALLING FIELDS JMP I MINCOR MOUCOR, 0 CDF 0 TAD SYSTEM E7500, SMA CIF 10 MN7700, SMA CLA JMS I SYSTEM 11 /GET OUT TAD MN7700 DCA SYSTEM JMP I MOUCOR SYSTEM, 200 MIN200, 200 ERROR, TAD E7500 /MAKE SABR ERROR "B" DCA MINCOR JMS MOUCOR /KICK MONITOR OUT CDF CIF 10 DCA I EPASS /SET PASS=0 SO ERROR WILL PRINT TAD EL64 DCA I ETYPE TAD MINCOR JMP I .+1 ERRE EPASS, PASS EL64, L64 ETYPE, TYPE
*7000 SPAUSE, 0 /"PAUSE" STATEMENT PATCH TAD FSWITC CLL RAL TAD I (FILPTR DCA I (FILPTR /RESET FILE POINTER IF CALLED FROM FORTRAN JMS I (OPENFL /OPEN NEXT FILE CDF CIF 10 JMP I SPAUSE FSWITC, -1 /AS ADVERTISED DELETE, TAD I (MPARAM RTR /PUT "K" SWITCH IN LINK D7600, 7600 CDF 0 TAD I (JSBITS RAR CLL CML RAL DCA I (JSBITS /MARK "DON'T CARE IF MONITOR AREA DESTROYED" BITS TAD FDSW SZL SNA CLA /DELETE ONLY IF CALLED FROM FORTRAN WITH JMP NODLET /"K" SWITCH(IN LINK) ZERO JMS I (MINCOR CLA IAC /DEVICE "SYS" CIF 10 JMS I (200 4 /CLOSE - USED AS DELETE NAME /NAME FOR CLOSE PROCESSOR 0 /NO BLOCKS - WILL BE DELETED JMP DELERR /DOUBLE HUH? NODLET, TAD LDRBLK SNA CLA /WAS A LOADER BLOCK STORED JMP GETOUT CDF 10 TAD I (L64 CDF 0 SZA CLA /IF WE USED THE TELETYPE ROUTINE, JMP GETOUT /THEN THERE WAS AN ERROR TAD REMEMB CDF 10 DCA I (MOFILE+1 CDF 0 JMS I (MINCOR CIF 10 JMS I (200 6 /RUN LDRBLK, 0 REMEMB, 0 FDSW, 0 GETOUT, TAD I (SYSTEM CDF 10 D7700, SMA CLA CMA DCA I D7700 CDF 0 JMP I .+1 7605 DELERR, TAD (1700 /GIVE A "S" ERROR DELER2, TAD (200 CDF CIF 0 JMP I (ERROR NAME, 0617;2224;2216;2415 INREAD, 0 AND D7700 SNA CLA JMS I POPNFL JMS I INDEV 400 INBFPT, INBUF INREC, 0 JMP INERR ISZ INREAD ISZ INREC ISZ INREC JMP I INREAD INDEV, 0 INERR, SPA CLA JMP DELER2 JMP INREC+3 POPNFL, OPENFL CLSMBE, 0 /SUBR TO CLOSE OUTPUT FILE IF ONE EXISTS CDF CIF 10 TAD I (OUTINH SNA CLA JMS I (OUCLOS CIF 0 /IN CASE WE DIDN'T CLOSE IT JMP I CLSMBE
*7200 /END OF PASS CRAP AND INPUT ROUTINE P40, 40 PASEND, ISZ I (PASS /BUMP PASS COUNTER LSTFLG, JMP SBSYMT /ZERO IF LISTING FILE EXISTS JMS I (CLSMBE /CLOSE BINARY FILE CDF CIF 10 JMS I (TSTNTR /ENTER LISTING FILE TAD I (FSWITC SZA CLA JMP .+4 TAD (7617 DCA I (FILPTR /RESET FILE POINTER TO BEGINNING JMS I (OPENFL /AND OPEN FIRST FILE /IF CALLED FROM FORTRAN WE DONT HAVE TO DO THIS /BECAUSE OF THE PECULIAR NATURE OF FORTRAN OUTPUT JMS I (MOUCOR /KICK MONITOR OUT CDF CIF 10 TAD I (MPARAM+1 P200, AND P40 /MASK OUT "S" SWITCH DCA I (OUTINH /INTO "OUTPUT INHIBIT" FLAG JMS I (SYMPRT /PRINT SYMBOL TABLE UNDER CONTROL OF /S DCA I (OUTINH /ZERO FLAG FOR LISTING TAD I (MPARAM+1 /SYMPRT RETURNS WITH DATA FIELD=10 RTL CIF 10 SNL CLA /"N" FLAG IS IN THE LINK JMP I (ENDRSM /HE WANTS A LISTING - GO GET IT SBREND, CIF 0 JMS I (CLSMBE /CLOSE OUTPUT FILE JMP I (DELETE /DELETE FORTRN.TM AND CHAIN OR RETURN SBSYMT, TAD (TDUMMY CDF CIF 10 DCA I (PUNCH /INHIBIT ALL FUTURE OUTPUT JMS I (SYMPRT /CHECK SYMTAB FOR UNDEFINEDS CDF 0 ISZ I (JSBITS /SET "DON'T CARE ABOUT USR CORE" FLAG JMP SBREND /NOW GO CLOSE BINARY OUTPUT FILE AND RETURN INCHAR, 0 ISZ INJMP KSF JMP .+5 KRS TAD (-203 SNA CLA JMP I (7600 /EXIT TO MONITOR IF ^C TYPED ISZ INCHCT INJMPP, INJMPE TAD INCNT INRD, JMS I (INREAD DCA INCNT /RETURN HERE ON EOF ISZ INCNT SKP TAD (600 ISZ INCNT IN7400, 7400 TAD (-1401 DCA INCHCT TAD INJMPP DCA INJMP TAD (INBUF DCA INPTR JMP INCHAR+1 INJMPE=JMP . INJMP, INJMPE JMP INCHA1 JMP INCHA2 INCHA3, TAD INJMPP DCA INJMP TAD I INPTR AND IN7400 CLL RTR RTR TAD INTEMP RTR RTR ISZ INPTR JMP INCOM INCHA2, TAD I INPTR AND IN7400 DCA INTEMP ISZ INPTR INCHA1, TAD I INPTR INCOM, AND (177 SZA TAD (-177 SNA JMP INCHAR+1 TAD (145 /CHECK FOR ^Z SNA JMP INRD /^Z ON INPUT MEANS GO TO NEXT FILE TAD (232 CDF CIF 10 DCA I (CHR JMP I INCHAR INPTR, 0 INCHCT, 0 INTEMP, 0 INCNT, 0 FIELD 1
*6400 /OUTPUT ROUTINE INTERFACE - CANT GO PAST 6423 OUCHAR, 0 DCA I POUTEM TAD OUTINH SZA CLA OUCRET, JMP I OUCHAR /DOUBLES AS OFF-PAGE RETURN ISZ I POUJMP ISZ OUCHCT JMP I POUJMX JMS OUTDMP JMP OUCHAR+2 POUJMP, OUJMP POUJMX, OUJMX POUTEM, OUTEMP OUTINH, 0 F3ERR, TAD O2100 F2ERR, TAD O2100 F1ERR, CDF CIF 0 JMP I .+1 ERROR O2100, 2100 *6457 /LOADS OVER OLD SABR INITIALIZATION ROUTINE TSTNTR, 0 /CALLED FROM FIELD 0 TAD PFILE TAD C4 DCA PFILE TAD I PFILE ISZ PFILE DCA ODEVNO TAD (7400 DCA OUHNDL CIF 0 JMS I (MINCOR JMS I (200 13 /RESET OUTPUT DEVICE TAD ODEVNO /LOAD OUTPUT DEVICE JMS I (200 1 OUHNDL, 7400 JMP F2ERR /TWO-PAGE OUTPUT HANDLER ILLEGAL TAD PFILE DCA ENAME /POINTS TO FILE NAME DCA OULNGT /ZERO CLOSING LENGTH TAD ODEVNO /LOAD DEVICE NUMBER AND REQUESTED LENGTH JMS I (200 3 /ENTER ENAME, 0 /POINTER INTO COMMAND DECODER AREA GOES HERE OUCHCT=ENAME ELENGT, 0 /"0 LENGTH" MEANS AS LARGE A SPACE AS POSSIBLE JMP F2ERR /COULDN'T ENTER FILE - MAYBE BAD DIRECTORY TAD ENAME /GET STARTING BLOCK # DCA OUTREC /STORE IT AWAY JMS OUSPTR /INITIALIZE OUTPUT ROUTINE ENTRTN, CDF CIF 0 JMP I TSTNTR OUSPTR, 0 TAD POUBUF DCA I (OUPTR TAD (-601 DCA OUCHCT TAD (OUJMPE DCA I POUJMP JMP I OUSPTR OUTDMP, 0 CIF 0 JMS I OUHNDL 4200 POUBUF, 1246 /REMAINDER OF OLD SABR INPUT BUFFER OUTREC, 0 JMP F3ERR ISZ OUTREC JMS OUSPTR ISZ OULNGT ISZ ELENGT JMP I OUTDMP JMP F2ERR OUCLOS, 0 TAD OUT232 /PUT A ^Z IN THE OUTPUT FILE JMS OUCHAR TAD OUCHCT CMA SZA CLA JMP .-4 /FILL REMAINDER OF BUFFER WITH ZEROS JMS OUTDMP CIF 0 JMS I (MINCOR TAD ODEVNO JMS I (200 C4, 4 /CLOSE PFILE, 7574 OULNGT, 0 JMP F2ERR /ERROR ON CLOSE DCA OULNGT CIF 0 JMP I OUCLOS OUT232, 232 ODEVNO, 0
*6610 /OUTPUT ROUTINE - CANT GO PAST 6661 OUJMX, CDF 0 OUJMPE=JMP . OUJMP, OUJMPE JMP OUCHA1 JMP OUCHA2 OUCHA3, TAD OUTEMP RTL RTL DCA OUTEMP TAD OUJMPP DCA OUJMP TAD OUTEMP AND OU7400 TAD I OUPOLD DCA I OUPOLD TAD OUTEMP RTL RTL AND OU7400 TAD I OUPTR DCA I OUPTR ISZ OUPTR JMP OUCOM OUCHA2, TAD OUPTR DCA OUPOLD ISZ OUPTR OUCHA1, TAD OUTEMP AND OU377 DCA I OUPTR OUCOM, CDF 10 JMP I .+1 OUCRET OUPTR, 0 OUJMPP, OUJMPE OUPOLD, 0 OUTEMP, 0 OU7400, 7400 OU377, 377
/PATCHES TO SABR TO HOOK INTO THESE WONDERFUL ROUTINES *4574 /OLD "INITR" ROUTINE AREA - 4 LOCATIONS LONG SYMPRT, 0 /INTERMEDIATE ROUTINE TO PRINT SYMBOL TABLE JMS I PRSYMP /CALL SABR'S ROUTINE CIF 0 JMP I SYMPRT /BUT RETURN TO FIELD 0 *4641 /CODE IN THIS SECTION CAN'T GO PAST 4704 FETCH, 0 /REPLACES ROUTINE IN SABR OF SAME NAME CDF CIF 0 JMS I .+2 JMP I FETCH INCHAR LDRCT, 7700 /FOR LEADER-TRAILER ROUTINE ON SAME PAGE USYMFG, 0 /ROUTINE TO GIVE UNDEFINED SYMBOL MESSAGES WHEN JMS I CTYPE /NO SYMBOL TABLE IS REQUESTED SYMXX, JMP I USYMFG /ZEROED IF CHECKING FOR UNDEFINEDS TAD SYMBOL DCA I PLLFS /SET UP SABR CELLS SO THAT ERROR ROUTINE WILL DCA LINE /PRINT THE NAME OF THE UNDEFINED SYMBOL TAD U2300 /FUDGE FOR "U" ERROR MESSAGE - UNFORTUNATELY, JMP I .+1 /THIS MESSAGE IS INSTANTLY FATAL - SERVES HIM RIGHT F1ERR PLLFS, LLFS /RANDOM LOCATION IN SABR U2300, 2300 TDUMMY, 0 /DUMMY OUTPUT ROUTINE CLA JMP I TDUMMY /AS DUMMY AS YOU CAN GET *6133 /PATCH TO SYMBOL TABLE PRINTER TO USE ABOVE JMS I 6177 /THIS REPLACES A "JMS I CTYPE" *6177 USYMFG /LUCKILY THERE WAS A LOCATION FREE *3665 /REWRITE OF OCTAL TYPEOUT ROUTINE TO DCA TEM1 /NOT KEEP INFORMATION IN THE LINK ACROSS TAD M4 /A CALL TO THE OUTPUT ROUTINE DCA TEM2 L62A, TAD TEM1 RTL RAL DCA TEM1 TAD TEM1 RAL *3702 JMP L62A *4317 /"PAUSE" PROCESSOR CLA /REPLACES CLA HLT CDF CIF 0 *4332 /PATCHES TO INITIALIZATION ROUTINE NOP /DON'T GIVE NOP /TWO USELESS CARRIAGE RETURN - LINE FEED PAIRS *4341 NOP /DON'T JMS I 4372 'CAUSE WE HAVE CHANGED 4372! *4372 /MORE "PAUSE" FUDGE SPAUSE *4715 /ALTER COUNT ON LEADER-TRAILER TAD LDRCT *562 /"END" STMT PROCESSOR CIF 0 JMP I PEND /END OF PASS 1 ENDRSM=. *566 /MORE ON "END" NOP /ELIMINATE HALT AT END OF PASS 1 *571 /STILL MORE ON "END" CDF CIF 0 JMP I SEND /END OF PASS 2 *576 /THERE ARE (WERE) TWO WHOLE FREE LOCATIONS IN THIS PAGE! SEND, SBREND PEND, PASEND *2761 /FATAL ERROR HALT IN ERROR ROUTINE CDF CIF 0 JMP I 166 /166 = LITERAL 7600 *4003 /LISTING ROUTINE SKP CLA /ALWAYS PUT LISTING ON "PUNCH" *PUNCH /POINTER TO PUNCH ROUTINE OUCHAR /POINTER TO MY PUNCH ROUTINE $



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