File OS8.PA (PAL assembler source file)

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

TITLE		OS8 FILE HANDLING PACKAGE
	IFNZRO ALPHA2.SYS&1 <LIST OFF>/THE /X SWITCH
	BEGIN OS8
	ORGZERO		/ZAP ON DOWN TO PAGE ZERO
	IFNEG .-20 <
	*20		/SKIP THOSE SILLY AUTO INDEX REGISTERS.
	>
	IFZERO CHAR-. <
	BEGIN UNIV
CHAR,	0		/PROVIDE CHAR, IF NECESSARY.
	END
	>
	IFNDEF CHAR <
	BEGIN UNIV
CHAR,	0		/PROVIDE CHAR THE FIRST TIME AROUND.
	END
	>
CALLUSR	=JMS I .	/CALL THE USR
	USR,	7700
	IFREQ DECODE.OS8 <
DECODE	=JMS I .	/CALL THE COMMAND DECODER.
	DECOD$
	REQUEST OS8 USRIN
	>
	IFREQ USROUT.OS8 <
USROUT	=JMS I .	/KICK THE USR OUT
	USROU$
	>
	IFREQ REWIND.OS8 <
REWIND	=JMS I .	/REWIND THE INPUT FILES.
	REWIN$
	REQUEST OS8 SKPIPT
	>
	IFREQ PUTC.OS8 <
	IFNDEF PFLD <PFLD=0>
PUTC	=JMS I .	/WRITE A CHARACTER OUT TO THE FILE.
	PUTC$
	>
	IFREQ GETC.OS8 <
	IFNDEF GFLD <GFLD=0>
GETC	=JMS I .	/READ IN A CHARACTER FROM THE FILE
	GETC$
	IFNDEF NOSTRM <
	REQUEST OS8 SKPIPT
	>
	>
	IFREQ OPEN.OS8 <
OPEN	=JMS I .	/OPEN AN OUTPUT FILE IN OS8.
	OPEN$
	REQUEST UNIV MOVEF: OS8 CLOSE,USRIN
	>
	IFREQ CLOSE.OS8 <
CLOSE	=JMS I .	/CLOSE THE CURRENTLY OPEN OUTPUT FILE.
	CLOSE$
	>
	IFREQ SKPIPT.OS8 <
SKPIPT	=JMS I .
	SKPIP$
	>
	IFREQ USRIN.OS8 <
USRIN	=JMS I .
	USRIN$		/READ IN THE USR
	>

IFREQ DECODE.OS8 < SUBR DECOD$ DECOD$, 0 USRIN /YARD IN THE USR CIF 10 CALLUSR /TAP IT ON THE SHOULDER. 5 /AND ASK IT FOR A COMMAND LINE. IFNDEF EXTEN <EXTEN="P_6+["A&77] /IF THE ASSUMED EXTENSION > /WASN'T SPECIFIED, ASSUME ".PA" EXTEN JMP I DECOD$ > IFREQ USRIN.OS8 < SUBR USRIN$ USRIN$, 0 CLA CLL CDF TAD USR /IS THE USR ALREADY IN? SMA CLA JMP I USRIN$ /YES, DON'T BOTHER TO CALL HIM IN AGAIN. CIF 10 CALLUSR /GIVE HIM A SHOUT, 10 /AND ASK HIM TO SIT A SPELL. TAD (200 /RESET THE USR ENTRY POINT DCA USR JMP I USRIN$ > IFREQ USROUT.OS8 < SUBR USROU$ USROU$, 0 CLA CLL CDF TAD USR /IF THE USR IS CURRENTLY OUT, SPA CLA JMP I USROU$ /LEAVE HIM ALONE. CIF 10 /BUT SINCE HE IS IN, CALLUSR 11 /BOOT HIM OUT. TAD (7700 /AND RESET THE ENTRY POINT. DCA USR JMP I USROU$ > IFREQ REWIND.OS8 < SUBR REWIN$ REWIN$, 0 /REWIND THE INPUT FILES. CLA CLL TAD (7617 /MOVE THE POINTER BACK DCA I (USRFIL SKPIPT.OS8 /SET IT UP. JMP I REWIN$ >
IFREQ PUTC.OS8 < /ROUTINE TO WRITE A SINGLE CHARACTER OUT TO THE FILE. /REQUIRED PARAMETERS ARE: /PFLD =FIELD OF OUTPUT BUFFER(EG. PFLD=10 INDICATES FIELD 1) /OBUFST =STARTING ADDRESS OF BUFFER. /NOPTY DEFINED IF NO PARITY FORCING IS TO TAKE PLACE. / OUTPUT BUFFER IS ONE BLOCK LONG. SUBR PPT1 PPT1, OBUFST PPT2, OBUFST PCT1, -3 PCT2, -200 OENT, 0 IFZERO PFLD < FORGET PCDF /DON'T PUT IN UNNECESSARY CDF'S ELSE PCDF=CDF /THE BUFFER IS IN ANOTHER FIELD. > LOW8O, PCDF PFLD /CHANGE TO THE RIGHT FIELD. DCA I PPT2 /STORE THE CHARACTER. PCDF ISZ PPT2 /BUMP THE POINTER. JMP I PUTC$ PUTHAF, 0 RTL CLL /MOVE THE CHARACTER UP RTL DCA CHAR /SAVE IT. TAD CHAR AND (7400 /KEEP ONLY THE UPPER 4 BITS PCDF PFLD TAD I PPT1 /ADD IT INTO THE BUFFER DCA I PPT1 PCDF ISZ PPT1 /BUMP THE POINTER JMP I PUTHAF PUTC$, 0 /THE MAIN ENTRY POINT. IFDEF NOPTY < AND (377 /DROP OFF ANY JUNK. ELSE AND (177 TAD (200 /SET THE PARITY BIT. > ISZ PCT1 /ARE WE ON CHARACTER 3? JMP LOW8O /NO, IT'S IN THE LOWER 8 BITS. JMS PUTHAF /DUMP THE FIRST HALF OF THE CHARACTER TAD CHAR JMS PUTHAF /FOLLOWED BY THE SECOND HALF CLA CLL CMA RTL /RESET THE COUNTER TO -3. DCA PCT1 ISZ PCT2 /HAVE WE DONE A FULL BLOCK? JMP I PUTC$ /NO. JMS I OENT /YES, WRITE OUT THE BLOCK 4200+PFLD /WRITE, 2 PAGES, FIELD "PFLD" OBUFST PBNO, 0 JMP .-4 /WRITE ERROR, RETRY. TAD PBNO-1 /RESET THE POINTERS DCA PPT1 TAD PBNO-1 DCA PPT2 TAD (-200 /AND A COUNTER DCA PCT2 ISZ PBNO /POINT TO THE NEXT BLOCK ISZ I (TOTBLK /BUMP THE TOTAL NUMBER OF BLOCKS. ISZ I (MAXBLK /HAVE WE WRITTEN TO MANY? JMP I PUTC$ /NO, LEAVE. ERROR >
IFREQ OPEN.OS8 < /ROUTINE TO OPEN AN OUTPUT FILE. /REQUIRED PARAMETERS ARE: /SPECFD DEFINED IF FILENAME BLOCK IS TO COME FROM A VARIABLE / FIELD(NORMALLY COMES FROM FIELD 1) /OHND =ADDRESS IN FIELD ZERO OF A PAGE ON WHICH THE HANDLER / MAY RESIDE /CALL: / OPEN;N /WHERE N IS THE ADDRESS IN FIELD 1 OF / /THE 5 WORD FILENAME BLOCK. / ERROR RETURN IF NO FILE / NORMAL RETURN /OR: OPEN;N;CDF X0 /IF SPECFD IS DEFINED THE NAME BLOCK / /IS TAKEN FROM FIELD X / ERROR RETURN IF NO FILE / NORMAL RETURN SUBR OFNM OFNM, ZBLOCK 5 /THE FILENAME BLOCK OPEN$, 0 CLOSE /CLOSE ANY CURRENTLY OPEN OUTPUT FILES. TAD I OPEN$ /GET THE ADDRESS ISZ OPEN$ DCA OPADDR&177+[.&7600] IFDEF SPECFD < TAD I OPEN$ /GET THE FIELD SPECIFICATION. ISZ OPEN$ DCA .+4 /SAVE IT. > MOVEF; -5 /MOVE 5 WORDS OPADDR, 0; CDF 10 /FROM THE DESIRED NAME BLOCK OFNM; CDF /TO OUR OWN LOCAL ONE. TAD OFNM /SEE IF WE GOT A FILE. SNA CLA JMP I OPEN$ /WE DIDN'T, TAKE THE ERROR RETURN. USRIN.OS8 /HAUL IN THE USR CIF 10 CALLUSR /RESET THE SYSTEM TABLES SO THAT 13 /THE OUTPUT HANDLER DOESN'T VANISH. TAD (OHND /SETUP THE HANDLER ADDRESS. DCA .+5 CIF 10 TAD OFNM /GET THE DEVICE CODE. CALLUSR 1 /ASK FOR THE HANDLER 0 ERROR /FOR SOME SILLY REASON, WE DIDN'T GET IT. TAD .-2 /GET THE ENTRY ADDRESS DCA OENT TAD (OFNM+1 /MAKE UP A POINTER TO THE NAME DCA .+5 CIF 10 TAD OFNM CALLUSR 3 /OPEN THE OUTPUT FILE. OFNM+1 MAXBLK, 0 ERROR /COULDN'T PUT IT IN TAD MAXBLK-1 /GET THE BLOCK NUMBER DCA PBNO /LET PUTC HAVE IT. DCA I (TOTBLK /KILL THE NUMBER OF BLOCKS WRITTEN ISZ OPEN$ /SKIP THE NO OUTPUT RETURN. JMP I OPEN$ >
IFREQ CLOSE.OS8 < /ROUTINE TO CLOSE THE CURRENTLY OPEN OUTPUT FILE. /THE PARAMETERS ARE: /OBLKMD DEFINED IF OUTPUT IS IN BLOCK MODE. / (SUPPRESS WRITING OUT OF LAST BLOCK AND INCLUSION OF / A ^Z AT THE END OF THE FILE. SUBR CLOSE$ CLOSE$, 0 TAD OFNM /TAKE A LOOK AT THE DEVICE NUMBER SNA CLA JMP I CLOSE$ /ZERO, NO FILE TO CLOSE IFNDEF OBLKMD < STA /CAUSE PUTC TO FIRE OFF THE BLOCK. DCA PCT2 DCA MAXBLK /IN CASE THINGS ARE TIGHT TAD ("Z-100 /DUMP A ^Z PUTC /FOLLOWED BY 2 NULL'S PUTC PUTC > TAD OFNM /GET THE DEVICE NUMBER CIF 10 CALLUSR 4 /CLOSE THE FILE OFNM+1 TOTBLK, 0 /THE TOTAL NUMBER OF BLOCKS WRITTEN. ERROR DCA OFNM /SAY THAT WE NO LONGER HAVE AN OUTPUT FILE. JMP I CLOSE$ >
IFREQ GETC.OS8 < /ROUTINE TO READ A SINGLE CHARACTER FROM AN OS/8 INPUT FILE. /THE PARAMETERS ARE: /GFLD =FIELD OF INPUT BUFFER(ASSUMED TO BE 0) /INBLK =NUMBER OF BLOCKS IN THE BUFFER. /IBUFST =STARTING ADDRESS OF BUFFER. /NOIPTY DEFINED IF THE PARITY BIT IS NOT TO BE FORCED ON. SUBR GCT1 IFPOS INBLK-13 < INBLK=12 ?/INPUT CAN BE AT *** MOST *** 12 BLOCKS LONG. > GCT1, -[INBLK*600] GCT2, -3 GPT1, IBUFST GPT2, IBUFST IENT, 0 IFZERO GFLD < FORGET GCDF ELSE GCDF=CDF > LOW8, GCDF GFLD TAD I GPT2 /GET THE CHARACTER GCDF ISZ GPT2 /BUMP THE POINTER IFNDEF NOIPTY < SETPTY, AND (177 /STRIP OFF THE JUNK TAD (200 /AND FORCE THE PARITY BIT ON. ELSE SETPTY, AND (377 /STRIP OFF THE JUNK > DCA CHAR /SAVE IT FOR LATER USE TAD CHAR IFNDEF NOSTRM < TAD (-["Z-100] /CHECK FOR ^Z SNA CLA JMP .+3 /IT IS, TRY THE NEXT FILE TAD CHAR /GET THE CHARACTER BACK. > JMP I GETC$ /LEAVE WITH THE CHARACTER IN THE AC. IFNDEF NOSTRM < SKPIPT /GO TO THE NEXT INPUT FILE SKP /AND TRY FOR ANOTHER CHARACTER. > GETHAF, 0 GCDF GFLD TAD I GPT1 /GET A WORD GCDF ISZ GPT1 /GIVE THE POINTER A NUDGE. AND .+14 /KEEP ONLY THE GOOD STUFF. RTL CLL;RTL;RAL /MOVE IT INTO A MORE MANAGEABLE POSITION. JMP I GETHAF GETC$, 0 /THE MAIN ENTRY POINT. ISZ GCT1 /HAVE WE EMPTIED A BUFFER? JMP MORIN&177+[.&7600] /NO, KEEP WHAT WE HAVE JMS I IENT /READ IN ANOTHER BUFFER LOAD. INBLK*200+GFLD IBUFST GBNO, 0 7400/NOP /DISREGARD ERRORS. TAD (-[INBLK*600]/RESET OUR COUNTERS AND POINTERS. DCA GCT1 CLA CLL CMA RTL /-3 DCA GCT2 TAD GBNO-1 DCA GPT1 TAD GBNO-1 DCA GPT2 IFPOS INBLK -5 < IFNZRO INBLK-6 < TAD GBNO /KICK THE BLOCK NUMBER BY TAD (INBLK /THE REQUIRED NUMBER DCA GBNO ELSE CLA CLL CML IAC RTL /KICK THE BLOCK NUMBER BY 6 TAD GBNO DCA GBNO > ELSE IFPOS INBLK-3 < IFZERO INBLK-3 < CLA CLL CML IAC RAL /KICK THE BLOCK NUMBER BY 3 TAD GBNO DCA GBNO ELSE CLA CLL IAC RTL /KICK THE BLOCK NUMBER BY 4 TAD GBNO DCA GBNO > ELSE IFZERO INBLK-1 < ISZ GBNO /KICK THE BLOCK NUMBER BY 1 ELSE ISZ GBNO /KICK THE BLOCK NUMBER BY 2 ISZ GBNO > > > MORIN, ISZ GCT2 /IS THIS THE THIRD CHARACTER? JMP LOW8 /NO, TAKE IT FROM THE LOW ORDER 8 BITS. CLA CLL CMA RTL /RESET THE COUNTER. DCA GCT2 JMS GETHAF /GET HALF OF THE CHARACTER RTL CLL;RTL /MOVE IT TO A MORE USEFUL PLACE DCA CHAR /SAVE WHILE WE JMS GETHAF /GET THE REST, TAD CHAR /MAKE IT WHOLD, JMP SETPTY /AND KNOCK OFF SOME GARBAGE >
IFREQ SKPIPT.OS8 < /ROUTINE TO SKIP TO THE NEXT INPUT FILE IN THE LIST / SUPPLIED BY THE COMMAND DECODER. /THE PARAMETERS ARE: /IBLKMD DEFINED IF INPUT IS TO BE IN BLOCK MODE / (INHIBITS INITIALIZATION OF GETC) /ENDFIL ADDRESS TO WHICH CONTROL IS TRANSFERRED WHEN THE LIST / IS EXHAUSTED. /IHND ADDRESS IN FIELD ZERO OF THE PAGE ON WHICH THE / HANDLER IS TO BE PLACED. SUBR IDEV IDEV, 0 USRFIL, 0 SKPIP$, 0 CLA CLL CDF 10 TAD I USRFIL /PICK UP THE DEVICE NUMBER. CDF SNA /HIT THE END? JMP I (ENDFIL /YES, LET HIM TAKE CARE OF IT. AND (17 /KILL ANY GARBAGE WHICH MAY HAVE WANDERED IN. DCA CHAR TAD CHAR /IS IT THE SAME AS THE LAST DEVICE? CIA TAD IDEV SNA CLA JMP .+15 /YES, DON'T BOTHER ABOUT IT. TAD (IHND /INITIALIZE THE ADDRESS. DCA .+5 CIF 10 TAD CHAR /GET THE DEVICE CODE. CALLUSR 1 /HAUL IN THE HANDLER. 0 ERROR /WHOOPS!! TAD .-2 /GET THE REAL ENTRY POINT DCA IENT /PUT IT AWAY TAD CHAR /REMEMBER WHICH DEVICE WE HAVE DCA IDEV ISZ USRFIL /MOVE THE POINTER CDF 10 TAD I USRFIL /TO PICK UP THE BLOCK NUMBER. CDF ISZ USRFIL DCA GBNO IFNDEF IBLKMD < STA /CAUSE GETC TO AUTO INITIALISE DCA GCT1 > JMP I SKPIP$ > END /C'EST LA FIN!!! IFNZRO ALPHA2.SYS&1 <LIST ON;$>



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