File TM8EZ.PA (PAL assembler source file)

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

/TM8E HANDLER (TM8EZ.PA)
/
/	MODIFIED BY
/	  R. W. PHELPS
/	  BEHAVIOR LAB
/	  UNIV. OF ROCHESTER
/	  10/76
/
        LWCR=6701       /LOAD WORD COUNT REGISTER AND CLEAR AC
        LCAR=6703       /LOAD CURRENT ADDRESS REGISTER AND CLEAR AC
        LCMR=6705       /LOAD COMMAND REGISTER AND CLEAR AC
        LFGR=6706       /LOAD FUNCTION REGISTER AND CLEAR AC
        CLT=6712        /CLEAR TRANSPORT
        RMSR=6714       /CLEAR AC AND READ MAIN STATUS REGISTER
        SKEF=6721       /SKIP IF ERROR FLAG IS SET
        SKJD=6723       /SKIP IF THE JOB IS DONE (MTTF IS SET)
	SKTR=6724	/SKIP IF TAPE UNIT READY
        MTAVERSION="P&77
	XFIELD=30	/FIELD IN WHICH EXTENDED HANDLER GOES
/
/
/SPECIAL CODES USED WHEN PAGE COUNT=0 (CODES IN BITS 9-11 OF FN WORD)
/
/0      (CLOSE) WRITE 2 EOF'S; THEN BACKSPACE OVER ONE OF THEM
/1      REWIND
/2      SPACE FORWARD/REVERSE RECORDS
/       IF BIT 0 OF THE FUNCTION WORD IS A 0,
/               THIS CODE ADVANCES RECORDS.
/               THE NEGATIVE OF THE NUMBER OF RECORDS IS SPECIFIED IN ARG 3
/       IF BIT 0 OF THE FUNCTION WORD IS A 1,
/               THIS CODE BACKSPACES RECORDS.
/               THE NEGATIVE OF THE NUMBER OF RECORDS IS SPECIFIED AS ARG 3.
/	THIS COMMAND ALWAYS STOPS AFTER READING A FILE MARK.
/3      SPACE FORWARD/REVERSE FILES
/       IF BIT 0 OF THE FUNCTION WORD IS A 0
/               THEN THIS FUNCTION ADVANCE FILE MARKS
/               THE NEGATIVE OF THE NUMBER OF FILE MARKS IS SPECIFIED BY ARG3
/               THE TAPE IS LEFT POSITIONED AFTER THIS FILE MARK
/               BUT UNDER NO CIRCUMSTANCES DOES THE TAPE ADVANCE PAST
/               THE SECOND MARK OF TWO CONSECUTIVE FILE MARKS
/       IF BIT 0 OF THE FUNCTION WORD IS A 1,
/               THIS CODE BACKSPACES PAST FILE MARKS.
/               THE NEGATIVE OF THE NUMBER OF FILE MARKS IS SPECIFIED BY ARG 3.
/               THE TAPE IS LEFT POSITIONED BEFORE THE LAST FILE MARK,
/               SO THE USER PROBABLY WANTS TO DO A FORWARD RECORD NEXT.
/4      REWIND AND PUT OFF-LINE (UNLOAD)
/5      WRITE EOF; PHYSICALLY THE SAME AS FN 0
/6      PERFORM OPERATION WITH SPECIFIED BLOCKSIZE
/       THE NEGATIVE OF THE DESIRED BLOCKSIZE IS SPECIFIED AS ARG 3.
/	(BLOCKSIZE REFERS TO THE ACTUAL OS/8 BUFFER SIZE AND
/	MUST BE .LE. 5000(8) (7400(8) CHARACTERS).)
/7      CURRENTLY UNUSED
/
/
/BUILD DESCRIPTOR BLOCK
        *0
        -1             /1 ENTRY POINT
DEVICE TM8X;DEVICE MTA0;200;MTA0&177+4000;ZBLOCK 2
/
/NOTE:  MOST OF FIELD 3 IS USED AND DESTROYED BY THE
/EXTENDED SEGMENT OF THIS HANDLER.  USER PROGRAMS MAY
/USE THIS FIELD BUT NOT EXPECT ITS CONTENTS TO REMAIN
/UNDISTURBED.  NOTE ALSO THAT FIELD 3 MUST, OF COURSE, EXIST.
/
/ ********** NOTE CAREFULLY! **********
/THE EXTENDED HANDLER TM8EEX MUST BE STORED ON SYSTEM
/BLOCK 66 FOR THIS HANDLER TO WORK.  THAT BLOCK IS NORMALLY
/USED BY THE TD8E HANDLER.
/
/TM8EEX IS LOADED INTO THE APPROPRIATE PLACE WITH TM8ESU.SV
/WHICH CAN BE CALLED WITH THE "R" COMMAND OR AUTOMATICALLY
/BY THIS HANDLER.
/
/CALLING SEQUENCE FOR TM8EEX --
/
/	AC = 0 OR AC = -1
/	JMS TM8EEZ
/	  FUNCTION WORD
/	  BUFFER LOCATION
/	  BLOCK NUMBER (USED FOR SPECIAL BUFFER SIZE)
/
/
/		IF WRITE AND AC=0 ---> DO NOTHING
/		IF WRITE AND AC=-1 ---> UNPACK
/			IF COUNT=0 AND CODE=6 ---> SPECIAL BUFFER SIZE
/		IF READ AND AC=0 ---> PACK
/			IF COUNT=0 AND CODE=6 ---> SPECIAL BUFFER SIZE
/		IF READ AND AC=-1 ---> CLEAR CORE

*200 /THE FIRST TWO LOCATIONS ARE TEMPORARIES /AND NO LONGER MATTER RE: PARITY AND /BLOCK 0 BEHAVIOR OF THE HANDLER. 0 /(UNUSED) SETBFR, 0 /CALL BUFFER PACK/UNPACK CIF XFIELD JMS I TM8EEX MTFUN, 0 /FUNCTION NBUFF, 0 /CORE NBLOK, 0 JMP I SETBFR PARITY, 433 /CONTENTS OF COMMAND REGISTER STOP, P7600, 7600 JMS SETBFR /PACK BUFFER TAD SECOND SNA /SECOND HALF OF BUFFER TO DO? JMP MTEXIT-1 /NO DCA MTFUN /YES - SET FUNCTION DCA SECOND JMP CKWRIT /GO DO IT / ISZ MTHX /BUMP FOR NORMAL EXIT MTEXIT, HLT /CIF CDF TO USER'S FIELD JMP I MTHX / / PNEXT, 0 /CONTAINS FIRST LOC ON NEXT PAGE TAD K3700 AND I MTHX /CHECK NUMBER OF BLOCKS CLL RTL /L=1 IF .GE. 20; AC=0 IF .EQ. 20 SNA CLA CLL /L=0 IF .LE. 20; AC=0 SZL TAD K6077 /SET UP SECOND IF .GT. 20 BLOCKS AND I MTHX DCA SECOND /OTHERWISE IT BECOMES 0 CMA CML RTR /MASK OUT 20 BLOCKS OF .GT. 20 (L=1) AND I MTHX DCA MTFUN ISZ MTHX /POINT TO BUFFER ADDRESS TAD I MTHX /BUFFER ADDRESS DCA NBUFF /AND STORE AWAY ISZ MTHX /POINT TO BLOCK NUMBER TAD I MTHX /GET BLOCK NUMBER DCA NBLOK /STORE AWAY ISZ MTHX /POINT TO ERROR RETURN RDF /GET CALLING FIELD TAD MTCDIF /CREATE CIF CDF TO USER'S FIELD DCA MTEXIT /STORE AWAY WHERE WILL BE USEFUL LATER MTCDIF, CIF CDF 0 /GO TO FIELD 0 JMS I SYSHND /READ IT INTO CORE 200+XFIELD TAPBUF=400 TM8EEX, 0 66 /ABSOLUTE BLOCK FOR EXTENDED HANDLER HLT /READ ERROR CDF XFIELD ISZ I TM8EEX /DOES BLOCK 66 HAVE THE RIGHT STUFF IN IT? JMP GOSETUP /NO - ABORT AND SET IT UP CDF 0 CKWRIT, CLA CMA /ZERO BUFFER FOR PIP IF READ JMS SETBFR /WRITE - UNPACK BUFFER TAD MTFUN PGCHK, JMS I PNEXT /GO READ OR WRITE NEXT PAGE
/ MTH /SET UP WC AND CA REGISTERS, LOAD FUNCTION AND GO /CALLING SEQUENCE: / TAD (FNWORD / JMS MTH / BUFFER ADDRESS-1 / -WORD COUNT / MASK FOR UNACCEPTABLE ERROR CONDITIONS / <NORMAL RETURN> / TAKES HANDLER ERROR RETURN ON ERRORS. / IF ERROR, AC HAS ERROR CODE FROM MAIN STATUS REGISTER / AC IS POSITIVE IF E.O.F. READ MTH, 0 /MUST BE AT 1ST LOC AFTER CALL TO NEXT DCA ERROR /SAVE FUNCTION TEMPORARILY SKTR JMP .-1 CLT /CLEAR THE WORLD TAD PARITY LCMR /LOAD COMMAND REGISTER TAD I MTH /GET CURRENT ADDRESS LCAR /LOAD IT ISZ MTH /POINT TO WORD COUNT TAD I MTH /GET WORD COUNT (TWO'S COMPLEMENT THEREOF) LWCR /LOAD IT ISZ MTH /POINT TO ERROR MASK TAD ERROR /GET FUNCTION BACK LFGR /GO BABY GO JMS ERROR /CHECK FOR ERROR SKJD /THROUGH? JMP .-2 /NO JMS ERROR /YES, ANY ERRORS? E1, ISZ MTH JMP I MTH /NORMAL RETURN IFNZRO MTH-PGCHK-1 <MTHERR,XXX>
ERROR, 0 KRS /IS IT CTRL/C? TAD M203 SNA CLA JMP I P7600 /RETURN TO OS/8 KEYBOARD MONITOR SKEF /SKIP ON ERROR JMP I ERROR /RETURN, NO ERRORS RMSR AND I MTH /IS THIS AN ERROR TO IGNORE? SNA JMP E1 /YES (EOF DURING SKIP) AND L100 /IS IT AN E.O.F.? SZA CLA JMP ENDFIL /HANDLE END OF FILES SPECIAL RMSR JMP MTEXIT /AND LEAVE WITH STATUS IN AC / ENDFIL, JMS SETBFR /NOW PACK IT TAD SECOND DCA MTFUN CLA CMA JMS SETBFR /FIRST ZERO THE REST OF THE BUFFER JMS SETBFR /NOW PACK IT JMP MTEXIT /TAKE SOFT ERROR RETURN / / USR, 7700 K3700, 3700 K6077, 6077 M203, -203 SYSHND, 7607 NOFST, SUNAME-NEXT /OFFSET ON NEXT PAGE TO SUNAME / GOSETUP, CIF 10 CDF 0 TAD PNEXT /FIRST LOC ON NEXT PAGE TAD NOFST /OFFSET TO SUNAME DCA SECOND-1 /(MAKES CODE PAGE RELOCATABLE) IAC JMS I USR /LOOKUP THE FILE "TM8ESU.SV" WHICH SETS 2 / UP SYSTEM BLOCK 66 SUNAME SECOND, 0 /USE THIS FOR TEMPORARY STORAGE HLT /LOOKUP ERROR -- TM8ESU.SV NOT FOUND ON SYS: TAD .-3 /GET THE FILE'S START BLOCK DCA .+4 /IT'S WHERE TO CHAIN TO CIF 10 JMS I USR 6 /NOW DO THE CHAIN / IFZERO .-MTHX-1&4000 <PERR,ZZXX> *375 MTHX, MTA0, MTAVERSION L100, 100 JMS PNEXT /GET ADDRESS OF FIRST LOCATION ON NEXT PAGE PAGE
*400 NEXT, 0 DCA RECNO /READ OR WRITE AND HOW MANY TAD NEXT TAD KSTOP DCA NSTOP /ADDRESS OF RETURN ROUTINES TAD NEXT TAD KBLOK DCA SIZE TAD I SIZE DCA SIZE TAD (3673 /MASK TO IGNORE EOF ERROR DCA EOF TAD RECNO CLL RAL /LINK SPECIFIES READ OR WRITE AND L7600 /-(# OF BLOCKS)^200 SNA JMP ZERO /0 PAGE COUNT! DCA RECNO SZL /READ OR WRITE? STL CLA RTR /WRITE. +2000 TO CONVERT READ CODE TO WRITE CODE TAD L2100 /READ (OR WRITE) & GO DCA TEMP /SAVE THIS COMMAND TAD MSIZE DCA SIZE /OS/8 USES 256 WORD BLOCKS TAD (3737 /IGNORE BLOCK SIZE ERRORS -- / THUS SHORT BLOCKS ARE PADDED WITH / ZEROS AND LONG BLOCKS ARE TRUNCKATED. DCA EOF /EOF IS LEGAL ERROR TAD (TAPBUF-1 DCA BUFFER RL1, TAD TEMP JMS DO TAD BUFFER /NEXT 400 WORDS TAD PSIZE DCA BUFFER TAD RECNO /ANY MORE? CLL CML TAD (-400 /SUBTRACT WORDS READ FROM WORD COUNT SNA SZL /IF NO OVERFLOW, WE'RE DONE JMP I NSTOP /FINISH DCA RECNO /MORE, LOOP JMP RL1 /REJOIN PROCESSING KSTOP, STOP-MTH /USED TO RELOCATE 'STOP' KBLOK, NBLOK-MTH COUNT, 0 TEMP, 0 EFL2, TAD L5100 /WRITE 2 EOF'S JMS DO TAD L5100 /WRITE AN EOF JMS DO JMP SPACE-1 /BACKSPACE OVER LAST EOF DO, 0 JMS I NEXT /GO DO IT (CALL MTH) BUFFER, 7777 /BUFFER LOCATION SIZE, 0 /NEGATIVE OF BLOCK SIZE EOF, 0 JMP I DO L5100, 5100 RECNO, 0 NSTOP, 0 L7, 7 L2100, 2100
ZERO, TAD RECNO /RETRIEVE FN WORD (MUST PRESERVE LINK) AND L7 /ISOLATE SPECIAL CODE TAD PJUMP DCA .+1 FN, HLT /BRANCH THROUGH JUMP TABLE TABLE, JMP EFL2 /0 CLOSE. WRITE TWO EOF'S JMP REW /1 REWIND JMP SPACE /2 SPACE FORWARD/REVERSE RECORDS JMP SEOF /3 SPACE FORWARD/REVERSE FILES JMP UNLOAD /4 REWIND AND OFF-LINE JMP EFL2 /5 WRITE EOF JMP SPEC /6 READ OR WRITE WITH SPECIAL BLOCKSIZE PJUMP, JMP TABLE SEOF, RAR /LINK ON MEANS REVERSE RTR DCA FN TAD SIZE /NEG. OF # BLOCKS OR FILES TO SKIP DCA TEMP STA DCA SIZE FILE, CLA IAC FILE2, DCA COUNT /BECOMES NON-ZERO IF ANY DATA FOUND BEFORE / FILE MARK IS READ. TAD FN TAD L6100 JMS DO RMSR AND P100 /SPACE FORWARD TO FILE MARK SNA CLA JMP FILE TAD FN TAD COUNT SZA CLA /WAS THERE ANY DATA? JMP FILE3 /YES, CONTINUE CLL CML /NO - EOT SPACE, RAR /LINK ON MEANS REVERSE (READ BIT) STL RAR STL RAR UNLOAD, TAD P100 /ADD IN 'GO' BIT JMS DO JMP I NSTOP FILE3, ISZ TEMP JMP FILE2 /CONTINUE? JMP I NSTOP L6100, 6100 P100, 100 L7600, 7600 MSIZE, -600 /BLOCK SIZE PSIZE, 600 SPEC, SZL /LINK STILL CONTAINS READ/WRITE BIT STL CLA RTR TAD L2100 JMP UNLOAD+1 REW, TAD (1000 JMP UNLOAD SUNAME, FILENAME TM8ESU.SV 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