TITLE COMMON SUBROUTINES VERSION #2 SEPT. 1 '69 SUBTTL DON WITCRAFT 3-11-66 ENTRY EFLG3,EFLG4,EFLG5,EFLG6,EFLG7,SREAD,SWRITE ;SIMULATOR READ ;CALL MOVEI FDB,ADDRESS OF FILE DATA BLOCK ; PUSHJ PDP,SREAD ; EOF RETURN, FILE HAS BEEN CLOSED ; NORMAL RETURN ;IF SIMULATOR ERRORS ARE ENCOUNTERED, GOES TO ERROR. ;DOES NOT CHECK FOR IODERR. ;IF IMAGE MODE FROM DTA,MTA OR DSK, AFTER FILLING BUFFER ;CONVERTS BYTE POINTER TO 8 BIT BYTES AND MULTIPLIES ITEM ;COUNT BY 4. EXTERNAL ERROR SREAD: PUSH PDP,AC3 ;SAVE AC3 JSP SRR,FIN ;EXECUTE READ IN FILEIO MOVE AC3,CFSTAT(FDB) TRNE AC3,-1 ;FILE ERROR? PUSHJ PDP,ERROR ;YES EFLG3: MOVE AC3,CDSTAT(FDB) TRNE AC3,ERRORS-IODERR ;SIMULATOR ERROR? PUSHJ PDP,ERROR ;YES EFLG4: TRNN AC3,IODEND ;NO. EOF? JRST SREAD1 ;NO. JSP SRR,FCLOSE ;YES MOVE AC3,CDSTAT(FDB) TRNE AC3,ERRORS-IODERR PUSHJ PDP,ERROR EFLG5: SOS -1(PDP) ;CONVERT SKIP RETURN TO NORMAL SREAD1: POP PDP,AC3 ;RESTORE AC3 AOS (PDP) ;SKIP POPJ PDP, ;RETURN ;SIMULATOR WRITE ;CALL MOVEI FDB,ADDRESS OF FILE DATA BLOCK ; PUSHJ PDP,SWRITE ; RETURN SWRITE: JSP SRR,FOUT PUSH PDP,AC3 MOVE AC3,CFSTAT(FDB) TRZN AC3,IOIDM ;ILLEGAL MODE? JRST SWRIT1 MOVEI AC3,AL ;MAKE IT ASCII HRRM AC3,CINI(FDB) POP PDP,AC3 JSP SRR,FCLOSE JRST SWRITE SWRIT1: TRNE AC3,-1 PUSHJ PDP,ERROR EFLG6: MOVE AC3,CDSTAT(FDB) TRNE AC3,ERRORS-IODERR PUSHJ PDP,ERROR EFLG7: POP PDP,AC3 POPJ PDP, ;CALL: MOVEI 16,ADDRESS OF FILE DATA BLOCK ; JSP 17,FIN OR FOUT OR FCLOSE ; RETURN ;THE IO CHANNELS JOBJDA THRU JOBJDA+20 ARE UNIDIRECTIONAL ;FILE TRANSMISSION CHANNELS. ENTRY FIN,FOUT ;ACCUMULATORS FAC1=12 FAC2=13 FAC3=14 FAC4=15 FP=FDB FOUT: JSR FSAVE ;LOAD FILE DATA BLOCK IN 0-11 TLO CFSTAT,FOUTB ;SET OUTPUT CALLED JRST FIOC1 FIN: JSR FSAVE ;LOAD FILE DATA BLOCK IN 0-11 TLZ CFSTAT,FOUTB ;SET INPUT CALLED ;CHECK TO BE SURE INITIALIZATION IS COMPLETE. FIOC1: TRNN CINI,17 ;IS CHANNEL ASSIGNED? PUSHJ FP,FCHNAS ;NO. ASSIGN CHANNEL TLNN CFSTAT,INITB ;IS DEVICE ATTACHED TO CHANNEL? PUSHJ FP,FCHINI ;NO. INITIALIZE CHANNEL MOVEI FAC2,OUTBFB+OUTPB+ENTRB+OBUFB+OCLOSB ;OUTPUT BITS TLNE CFSTAT,FOUTB ;OUTPUT? MOVEI FAC2,INBFB+INPB+LOOKB+IBUFB+ICLOSB ;NO SO INPUT BITS TLNE CFSTAT,(FAC2) ;TRAP FOR JRST FIOE1 ;FILE OPEN IN WRONG DIRECTION TLNN CFSTAT,LOOKB+ENTRB ;HAS LOOKUP OR ENTER BEEN DONE? PUSHJ FP,FEL ;NO LDB FAC2,[POINT 4,CINI,17] ;LOAD DATA MODE IN FAC2 CAIL FAC2,SD ;DUMP MODE? JRST FIOC2 ;YES TLNN CFSTAT,INBFB+OUTBFB ;NO. BUFFER SET UP? PUSHJ FP,FIOBUF ;NO FIOC2: PUSHJ FP,FIO ;NOW EVERYTHING IS READY .. SO DO IO PUSHJ FP,XCTUUO STATUS 0,CDSTAT POPJ FP, ;RESTORE AC'S & RETURN TO CALLING ROUTINE FIOE1: TRO CFSTAT,IOFAO ;FILE ALREADY OPEN POPJ FP, ;ROUTINE TO SEARCH FOR FREE CHANNEL ;CALL PUSHJ FP,FCHNAS ;IF NO FREE CHANNEL, SETS IOCNA AND EXITS TO CALLER. EXTERNAL MCLIST,CLIST FCHNAS: MOVEI FAC4,17 ;LOAD CHANNEL NUMBER FCHNA0: MOVSI FAC3,MCLIST ;LOAD [XWD -CLIST LENGTH,,0] FCHNA1: MOVE FAC2,CLIST(FAC3) ;SEARCH FILE DATA BLOCKS HLRZ FAC2,CINI(FAC2) ;FOR CHANNEL C(FAC4). CAME FAC2,FAC4 ;IS IT ASSIGNED TO THIS FILE? AOBJN FAC3,FCHNA1 ;NO. CHECKED ALL FILES? JUMPGE FAC3,FCHNA2 ;YES. WAS IT ASSIGNED? SOJG FAC4,FCHNA0 ;YES. TRY ANOTHER TRO CFSTAT,IOCNA ;NONE AVAILABLE - SET ERROR BIT FPOPJ1: POP FP,FAC1 ;POP OUT RETURN ADDRESS POPJ FP, ;JRST FRET ... EXIT FILEIO FCHNA2: HRRM FAC4,CINI ;ASSIGN THIS CHANNEL POPJ FP, ;INITIALIZE CHANNEL ;CALL PUSHJ FP,FCHINI ; RETURNS WITH CHANNEL INITIALIZED ;IF NO DEVICE BY C(CDNAM, SETS IONSD AND EXITS ;IF DEVICE NOT AVAILABLE, SETS IODNA AND EXITS ;IF DATA MODE ILLEGAL FOR THIS DEVICE, SETS IOIDM AND EXITS ;IF BUFFER HEADER ADDRESS IS < 74, SETS IOBHPD AND EXITS ;IF BUFFER HEADER EXCEEDS ALLOCATED CORE, SETS IOBHOB AND EXITS EXTERNAL JOBREL FCHINI: MOVE FAC1,FACS+16 ;LOAD NORMAL CONTENTS OF FDB DPB CINI,[POINT 4,FCHIN1,12] ;PUT CHANNEL NUMBER IN OPEN MOVE CDCHAR,CDNAM CALLI CDCHAR,4 ;GET DEVICE CHARACTERISTICS JUMPE CDCHAR,FCHIE1 ;NO SUCH DEVICE IF ZERO TLNN CDCHAR,DVAVAL ;IS DEVICE AVAILABLE? JRST FCHIE2 ;NO LDB FAC3,[POINT 4,CINI,17] ;MODE MOVEI FAC2,1 LSH FAC2,-(FAC3) AND FAC2,CDCHAR ;LEGAL DATA MODE? JUMPE FAC2,FCHIE3 CAIL FAC3,SD ;YES. DUMP MODE? JRST FCHIN1 ;YES TLNE CFSTAT,FOUTB ;OUTPUT? HRLZM CBUFH,2(FAC1) ;YES SO PUT HEADER IN LEFT HALF FCHIN1: OPEN @FACS+16 ;INITIALIZE DEVICE JRST FCHIE2 ;DEVICE NOT AVAILABLE TLO CFSTAT,INITB CAIL FAC3,SD ;DUMP MODE? POPJ FP, ;YES MOVSI FAC2,OBUFB ;NO TLNN CFSTAT,FOUTB ;OUTPUT? MOVSI FAC2,IBUFB ;NO. OR CFSTAT,FAC2 POPJ FP, FCHIE2: TROA CFSTAT,IODNA ;DEVICE NOT AVAILABLE FCHIE3: TRO CFSTAT,IOIDM ;ILLEGAL DATA MODE JRST FPOPJ1 ;EXIT TO CALLER FCHIE4: TROA CFSTAT,IOBHOB ;BUFFER HEADER OUT OF BOUNDS FCHIE5: TRO CFSTAT,IOBHPD ;BUFFER HEADER IN PROTECTED JOBDATA AREA JRST FPOPJ1 ;EXIT TO CALLER FCHIE1: TRO CFSTAT,IONSD ;NO SUCH DEVICE JRST FPOPJ1 COMOBH: BLOCK 3 ;COMMON OUTPUT BUFFER HEADER ;LOOKUP/ENTER ;CALL PUSHJ FP,FEL ; RETURN IF NO ERRORS EXTERNAL JOBREL FEL: TLNE CFSTAT,FOUTB ;LOOKUP? JRST FENTR1 ;NO PUSHJ FP,XCTUUO ;YES LOOKUP 0,(CDIR) JRST FLOOK3 ;FILE NOT FOUND TLO CFSTAT,LOOKB POPJ FP, FENTR1: PUSHJ FP,XCTUUO ENTER 0,(CDIR) JRST .+3 TLO CFSTAT,ENTRB POPJ FP, TROA CFSTAT,IODDF ;DIRECTORY FULL FLOOK1: TRO CFSTAT,IOFEPD ;ENTRY BLOCK IN PROTECTED JOB JRST FPOPJ1 ;JOB DATA AREA FLOOK3: TRO CFSTAT,IOFNF ;FILE NOT FOUND JRST FPOPJ1 ;INBUF/OUTBUF ;CALL PUSHJ FP,FIOBUF ; RETURN IF NO ERRORS EXTERNAL JOBFF,JOBREL FIOBUF: TLNE CFSTAT,FOUTB ;INPUT? JRST FOUTB1 ;NO PUSHJ FP,XCTUUO INBUF 2 ;GET 2 BUFFERS TLO CFSTAT,INBFB POPJ FP, FOUTB1: PUSHJ FP,XCTUUO OUTBUF 2 ;AGAIN 2 BUFFERS TLO CFSTAT,OUTBFB POPJ FP, ;INPUT/OUTPUT EXECUTION ;CALL PUSHJ FP,FIO ; RETURN IF NO ERRORS EXTERNAL JOBREL FIO: LDB FAC3,[POINT 4,CINI,17] ;LOAD DATA MODE IN FAC3 CAIGE FAC3,SD ;DUMP MODE? JRST FIOB1 ;NO FIODM1: CAMLE CBADR,JOBREL ;IS COMMAND LIST POINTER OK? JRST FINPE2 ;NO SETZM FAC1 ;YES. CHECK COMMAND LIST SKIPN FAC4,@(CBADR) ;DONE? JRST FIODM2 ;YES HLRE FAC2,FAC4 ;NO ADDM FAC2,FAC1 ;ACCUMULATE LENGTHS HRRZS FAC4 SUB FAC4,FAC2 CAMLE FAC4,JOBREL ;IS DUMP REGION IN BOUNDS? JRST FINPE3 ;NO AOJA FAC3,FIODM1 ;YES FIODM2: TLNE CDCHAR,DVDIR ;DECTAPE? TLNE CDCHAR,DVDSK JRST FOUTP2 ;NO HLRZ FAC3,CDBLOCK ;YES MOVNS FAC2,FAC1 LSH FAC2,^D8 ADD FAC3,FAC2 CAMLE FAC3,1103 ;FIT ON DECTAPE? JRST FINPE1 ;NO HLL FAC3,CDBLOCK ;YES. ADVANCE BLOCK NUMBER MOVSM FAC3,CDBLOCK FIODM3: TLNE CFSTAT,FOUTB ;INPUT? JRST FOUTP1 ;NO FINP1: ;PUSHJ FP,XCTUUO ;USETI 0,(FAC3) PUSHJ FP,XCTUUO INPUT 0 TLO CFSTAT,INPB ;SET INPUT DONE TLZ CFSTAT,ICLOSB ;SET FILE NOT CLOSED POPJ FP, FOUTP1: PUSHJ FP,XCTUUO USETO 0,(FAC3) PUSHJ FP,XCTUUO OUTPUT 0,(CBADR) FOUTP6: TLO CFSTAT,OUTPB POPJ FP, ;NONDUMP MODE IO FIOB1: FOUTP2: TLNE CFSTAT,FOUTB ;INPUT? JRST FOUTP4 ;NO JRST FINP1 ;YES FOUTP3: PUSHJ FP,XCTUUO UGETF 0,FAC3 ;GET LINK PUSHJ FP,XCTUUO USETO 0,(FAC2) MOVSS FAC2 HRR FAC2,FAC3 MOVE FAC3,@(CBUFH) ;STORE LINK IN BUFFER HRLM FAC2,1(FAC3) MOVSM FAC2,CDBLOCK ;ADVANCE BLOCK NUMBER FOUTP4: FOUTP5: PUSHJ FP,XCTUUO OUTPUT 0, JRST FOUTP6 FINPE1: TROA CFSTAT,IOIBN ;ILLEGAL DECTAPE BLOCK NUMBER FINPE2: TRO CFSTAT,IOCLOB ;DUMP COMMAND LIST OUT OF BOUNDS JRST FPOPJ1 FINPE3: TROA CFSTAT,IOCOB ;DUMP COMMAND OUT OF BOUNDS FCLOE1: TRO CFSTAT,IOBTH ;CHANNEL OPEN BOTH IN AND OUT JRST FPOPJ1 ;CLOSE FILE ;CALL MOVEI FDB,ADDRESS OF FILE DATA BLOCK ; JSP 17,FCLOSE ; RETURN ENTRY FCLOSE FCLOSE: JSR FSAVE ;SAVE AC'S, LOAD FILE DATA BLOCK IN 0-11 TLNE CBUFH,-1 ;OPEN FOR BOTH INPUT AND OUTPUT? POPJ FP, ;YES - SO CLOSING IS A NONO TRNN CINI,-1 ;TEST FOR CHANNEL # POPJ FP, ;RETURN IF FILE NOT OPEN. JUMPE CFSTAT,.-1 ;ALSO RETURN IF NOT OPENED TLNE CFSTAT,OCLOSB+ICLOSB ;FILE ALREADY CLOSED? POPJ FP, ;YES SO LEAVE SETZM CFSTAT ;CLOSE THE FILE AND FORGET IT PUSHJ FP,XCTUUO CLOSE PUSHJ FP,XCTUUO STATUS 0,CDSTAT POPJ FP, ;RELEASE CHANNEL ;CALL MOVEI FDB,ADDRESS OF FILE DATA BLOCK ; JSP 17,FRELEASE ; RETURN ENTRY FRELEA FRELEA: JSR FSAVE FRELE1: TRNN CINI,-1 JRST FRELE2 PUSHJ FP,XCTUUO RELEAS 0, FRELE2: HLLZS CINI SETZB CFSTAT,CDSTAT SETZB CDCHAR,CDBLOCK POPJ FP, ;SAVE ACCUMULATORS, MOVE FILE DATA BLOCK TO AC0-AC11, ;SETUP PUSHDOWN POINTER ;CALL JSR FSAVE FSAVE: 0 MOVEM 0,FACS ;SAVE AC0 MOVE 0,[XWD 1,FACS+1] ;LOAD BLT POINTER BLT 0,FACS+17 ;SAVE AC1-AC17 HRLZS FDB ;BLT POINTER [XWD FDB,,0] BLT FDB,CBADR ;BLT FDB INTO 0-11 MOVE FP,[XWD -FPDN+1,FPDL] ;LOAD FP WITH PUSHD POINTER MOVSS CINI ;SWAP CHANNEL NU TO RIGHT JRST @FSAVE ;RETURN ;RESTORE FILE DATA BLOCK AND ACCUMULATORS AND RETURN TO USER. ;CALL JRST FRET OR POPJ FP, FRET: MOVSS CINI HRRZ FP,FACS+FDB ;LOAD FILE DATA BLOCK ADDRESS ADDI FP,CBADR HRRM FP,.+2 HRRZ FP,FACS+FDB ;LOAD FILE DATA BLOCK ADDRESS BLT FP,0 ;RESTORE FILE DATA BLOCK TO CORE MOVSI 17,FACS ;BLT POINTER TO RESTORE AC'S BLT 17,17 ;RESTORE AC'S JRST (SRR) FACS: BLOCK 20 FPDL: EXP FRET BLOCK 10 FPDN=.-FPDL ;EXECUTE UUO ;CALL PUSHJ FP,XCTUUO ; UUO XCTUUO: DPB CINI,[POINT 4,@(FP),12] POPJ FP, ;MOVE OUTPUT BUFFER HEADER TO COMOBH ;CALL PUSHJ FP,LDCOMH LDCOMH: PUSH FP,FAC3 ;SAVE FAC3 HRL FAC3,CBUFH HRRI FAC3,COMOBH BLT FAC3,COMOBH+2 POP FP,FAC3 POPJ FP, ;MOVE COMOBH TO OUTPUT BUFFER HEADER ;CALL PUSHJ FP,DPCOMH DPCOMH: PUSH FP,FAC3 HRRZ FAC3,CBUFH ADDI FAC3,2 HRRM FAC3,.+3 HRLI FAC3,COMOBH HRR FAC3,CBUFH BLT FAC3,. POP FP,FAC3 POPJ FP, ;REASSIGN DEVICE ;CALL MOVEI FDB,ADDRESS FOF FILE DATA BLOCK ; JSP 17,FREASS ; JOB NUMBER ; RETURN ENTRY FREASS FREASS: JSR FSAVE PUSHJ FP,FRELE1 ;RELEASE DEVICE AOS SRR MOVE FAC1,-1(SRR) MOVE FAC2,CDNAM CALL FAC1,[SIXBIT /REASSI/] JUMPN FAC1,.+2 ;JOB INITIALIZED? TRO CFSTAT,IOJNI ;NO JUMPN FAC2,.+2 ;YES. DEVICE ASSIGNED? TRO CFSTAT,IODNA ;NO POPJ FP, END