File: TM8EZ.PA of Tape: OS8/OS8-Latest/new-12
(Source file text) 

/TM8EZ MAGTAPE HANDLER KBM V40
/
/
/
/
/
/
/
/
/
/COPYRIGHT  (C)  1980   BY DATAPLAN GMBH, LAUDA, BRD
/
/
/
/
/
/
/
/
/
/
/THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE
/AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DATAPLAN GMBH.
/DATAPLAN GMBH ASSUMES NO RESPONSIBILITY FOR ANY ERRORS THAT MAY APPEAR
/IN THIS DOCUMENT.
/
/THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER
/UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED
/(WITH INCLUSION OF DATAPLAN'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH
/SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DATAPLAN.
/
/DATAPLAN GMBH ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY
/OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DATAPLAN.
/
/
/
/
/
/
/
/
/
/
/
/WVDM, DP, ZUERICH, 1-JAN-80
/TM8E HANDLER (TM8EZ.PA)
/
/	MODIFIED BY
/	  R. W. PHELPS
/	  BEHAVIOR LAB
/	  UNIV. OF ROCHESTER
/	  10/76
/	AND BY
/	  W.V.D.MARK
/	  DATAPLAN GMBH
/	  ZUERICH
/	  JUL-79
/
        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="M&77
/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
/TM8E DESCRIPTION
/
/LCMR:	BITS:
/
/	7000	UNIT 0-7
/	0400	0=EVEN,1=ODD
/	0200	INTENA ERROR
/	0100	INTENA JOB DONE
/	0070	EMA
/	0003	BPI: 0=200,1=556,2=800,3=800(9-TRACK)
/
/LFGR:	7000	0: OFF LINE
/		1: REWIND
/		2: READ
/		3: READ/COMPARE
/		4: WRITE
/		5: WRITE EOF
/		6: SPACE FORWARD
/		7: SPACE REVERSE
/	0400	EXTEND GAP
/	0200	ENABLE CHECK CHARS
/	0100	GO
/	0040	EMA INC ENABLE
/
/RMSR	0: ERROR FLAG	1: REWINDING	2: BOT
/	3: NOT ON-LINE	4: PARITY ERR	5: EOF
/	6: LENGTH ERR	7: DATA LATE	8: EOT
/	9: WRITE PROT.	10: COMP. ERR	11: ILL. FUNC.
/
/RFSR	0-5:FUNCTION
/	6: 9-CHANNEL	7: BAD TAPE	8: EMA 7 INC. ERR
/	9: LAT. PARITY	10: NOTHING	11: LONG. PARITY
/BUILD DESCRIPTOR BLOCK
        *0
        -1             /1 ENTRY POINT
DEVICE TM8X;DEVICE MTA0;200;MTA0&177+4000;ZBLOCK 2
/
/NOTE:  MOST OF FIELD X 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 CAREFULLY! **********
/
/THE EXTENDED HANDLER TM8EEX MUST BE STORED ON SYSTEM
/BLOCK 26 FOR THIS HANDLER TO WORK.  THAT BLOCK WAS HALF
/USED BY THE ENTER PROCESSOR, THE SECOND HALF NOW CONTAINS
/TM8EEX IN KBM V40.
/
/CALLING SEQUENCE FOR TM8EEX --
/
/	AC = 0 OR AC = -1
/	CIF X
/	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

	TAPBUF=400
        *200
		/THE FIRST TWO LOCATIONS ARE TEMPORARIES
		/AND NO LONGER MATTER RE: PARITY AND
		/BLOCK 0 BEHAVIOR OF THE HANDLER.
SECOND,	0
SETBFR,	0		/CALL BUFFER PACK/UNPACK
TM8XFL,	HLT		/CIF XFIELD
	JMS I TM8EEX
MTFUN,	0		/FUNCTION
NBUFF,	0		/CORE
NBLOK,	0
	JMP I SETBFR

PARITY, 433		/CONTENTS OF COMMAND REGISTER
TM8EEX,	202		/ENTRY POINT OF TM8EEX *KLUDGE*

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
	CLA
	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
	TAD I K7777
	AND K70
	TAD M40		/IF LESS THAN 4 USE FIELD 3
	SPA
	CLA		/NOT ENOUGH MEMORY, MAY NOT WORK!
	TAD K26		/PROTECT BATCH IF ENOUGH
	DCA SYSCTL	/SHOULD REALLY BE K30
	CLA IAC		/K27
	TAD SYSCTL
	TAD MTCDIF	/K30 FOR CIF
	DCA TM8XFL
	TAD SYSCTL
	TAD TM8EEX	/=202 FOR 2-PAGES AND K30
	DCA SYSCTL
	JMS I SYSHND	/READ IT INTO CORE
SYSCTL,	  HLT		/200+XFIELD
	  0
K26,	  26		/ABSOLUTE BLOCK FOR EXTENDED HANDLER
	HLT		/READ ERROR
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
	TAD P7600
        KRS             /IS IT CTRL/C?
        TAD M7603	/ALLOW PARITY
        SNA CLA
	KSF
	JMP SIFE
	CLT		/ABORT I/O
        JMP I P7600     /RETURN TO OS/8 KEYBOARD MONITOR
SIFE,	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
/
/
K3700,	3700
K6077,	6077
M7603,	-7603
SYSHND,	7607
K7777,	7777
K70,	70
M40,	-40
L100,	100
/
        IFZERO .-MTHX-1&4000 <PERR,ZZXX>
        *376
MTHX,
MTA0,   MTAVERSION
        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
        PAGE
        $