; PTR.SBR - SUBROUTINE TO SCAN SPOOLER QUEUE & FIND PRINTER NAMES ; ; PRTS SBR 2 737-425-332-116 2.0A(101) 134027 DSK0:[7,6] ; ; 03/16/88 - Version 2.0A - check pointers to be sure that we ; don't UNPACK into any sensitive areas (for ; instance, a Basic Disk DDB or something) ; Brad Horine, American Communications Inc. ; ; 11/15/85 - VERSION 2.0 - ADD INTER-TASK COMMUNICATIONS FOR ; RETRIEVING SPOOLERS UNDER TASK MANAGER. D. EICHBAUER ; 06/13/85 - D. EICHBAUER ; ; PROPRIETARY PROGRAM MATERIAL ; ; THIS MATERIAL IS THE PROPERTY OF DALE A. EICHBAUER, ; 692 E. FREELAND ROAD, MERRILL, MICHIGAN, 48637. PERMISSION ; TO COPY & USE IS GRANTED FOR NON-PROFIT USES ONLY. ; ; SEARCH SYS SEARCH SYSSYM ;;; AUTOEXTERN OBJNAM .SBR VMAJOR=2. VMINOR=0. ;;; VSUB=0. VSUB=1 VEDIT=101. ;;; VWHO=1. ; OFFSETS IN ARGUMENT BLOCK FOR MESSAGE SOCKET OPEN CALL ; ALL MAY BE SKIPPED FOR THOSE WITH AMOS/L 1.3 AND ABOVE OM.FLG = 0 OM.LEN = 2 OM.MAX = 4 OM.MSR = 6 ; ERROR FLAG DEFINITIONS FOR MESSAGE SYSTEM FOR THOSE WITH EARLY AMOS/L. ; ALL MAY BE SKIPPED FOR THOSE WITH AMOS/L 1.3 AND ABOVE. M$EAOP = 12 M$EDNN = 4 M$EDSF = 13 M$EDSN = 14 M$EMTL = 15 M$ENMB = 10 M$ENMP = 2 M$ENMS = 3 M$ENNN = 5 M$ENQB = 11 M$ENSK = 1 M$ESAE = 7 M$ESNN = 6 ; FIELD DEFINITIONS FOR MESSAGE BLOCK FOR THOSE WITH EARLY AMOS/L. ; LAST TWO ARE NEEDED BY ALL DUE TO ERRORS AND OMISSIONS IN SYSSYM.UNV MS.FLG = 0 MS.SRC = 2 MS.DST = 10 MS.SIZ = 16 MS.PPN = 20 MS.PRV = 22 MS.COD = 24 MS.SPR = 26 ; CORRECTS OMISSION FROM SYSSYM.UNV (see text) MS.DAT = 36 ; CORRECTS ERROR IN SYSSYM.UNV (see text) ; OFFSETS FROM A3 FOR PARAMETERS PASSED FROM BASIC .OFINI ; parameter list definitions .OFDEF PARMS,2 .OFDEF TYPE.1,2 .OFDEF ADD.1,4 .OFDEF SIZE.1,4 ; OFSETS FROM A4 FOR IMPURE ARA .OFINI ; impure list definitions .OFDEF AVAIL,4 .OFDEF COUNT,4 .OFSIZ IMPSIZ ; size of desired impure area DEFINE XY XXX,YYY MOVW #<'XXX'._8.+'YYY'.>,D1 TCRT ENDM PHDR -1,PV$RPD,PH$REE!PH$REU BR START ASCII / COPYRIGHT (C) 1985 DALE A. EICHBAUER / EVEN START: NOP ; for breakpoint MOV A5,D1 ; A5 -> 1st "reserved" word SUB A4,D1 ; A4 -> 1st "available" word CMP D1,#IMPSIZ ; check avail room JLT IMPERR ; bomb if no room CMPW PARMS(A3),#1 ; exactly one argument ? JNE ARGERR ; nope, so bomb out MOV SIZE.1(A3),AVAIL(A4) ; initialize CLR COUNT(A4) ; impure area MOV ADD.1(A3),A2 ; POINT TO ARRAY TO RETURN MOV LPTQUE,D2 ; GET BEGINNING OF SPOOLERS BEQ TASK ; IF NOT FOUND, THEN RUNNING ; UNDER TASK MANAGER FOR SPOOLERS MOV D2,A1 ; USE THIS AS AN INDEX LOOP: SUB #6.,AVAIL(A4) ; check avail room JMI BUFFUL ; and notify if full INC COUNT(A4) ; else bump printer count ADD #10,A1 ; POINT TO PRINTER NAME IN TABLE UNPACK ; GET THE PRINTER NAME UNPACK ; NOW GET THE SECOND HALF MOV D2,A1 ; RESTORE BEGINNING OF TABLE ENTRY MOV @A1,A1 ; POINT TO NEXT ENTRY MOV A1,D2 ; SEE IF END OF CHAIN BNE LOOP ; IF NOT, KEEP GOING ;;; at this point, if you wish to stop after locating the interrrupt-driven ;;; printers without checking for Task Manager-controlled printers, remove ;;; the three semicolons infront of the RTN statement below RTN ; back to Basic TASK: PUSH ; USE THE STACK PUSH ; FOR THE ARGUMENT BLOCK PUSH ; FOR THE OPEN SOCKET CALL MOV SP,A6 ; POINT TO ARGUMENT BLOCK MOVW #-100000,OM.FLG(A6) ; SET FLAGS TO ENABLE SOCKET MOVW #2000,OM.LEN(A6) ; SET MAXIMUM MESSAGE LENGTH TO 1024 MOVW #12,OM.MAX(A6) ; SET MAX # OF PENDING MESSAGES TO 10 CLR OM.MSR(A6) ; CLEAR MESSAGE SERVICE ROUTINE ADDRESS OPNMSG @A6,D6 ; OPEN MESSAGE SOCKET POP ; NOW CLEAR THE STACK POP ; BACK TO WHERE IT WAS POP TST D6 ; SEE WHAT STATUS WAS RETURNED BEQ ITC.OK ; IF OK, THEN CONTINUE CMP D6,#M$ENMS ; SEE IF OLD VERSION OF AMOS/L JNE ERROR ; IF NOT, ERROR, SO GO TO ERROR ROUTINE RTN ; ELSE JUST GO BACK TO BASIC ITC.OK: MOV A4,A1 ; NOW POINT TO MESSAGE BLOCK (IMPURE) MOV #45,D6 ; LOOP COUNTER NULLS: CLR (A1)+ ; CLEAR A WORD IN MESSAGE BLOCK SOB D6,NULLS ; AND LOOP BACK TILL DONE MOV A4,A1 ; POINT TO START OF MESSAGE BLOCK AGAIN MOVW #-3,14(A1) ; SET FOR LPTSPL SOCKET MOVW #224,MS.SIZ(A1) ; SET MESSAGE SIZE TO 148 BYTES TOTAL CLRW MS.COD(A1) ; CLEAR THE MESSAGE CODE MOVW #"UU,MS.SPR(A1) ; PUT UNIQUE ID ON MESSAGE (SAME AS AM) MOVW #1,MS.SPR+2(A1) CLR MS.SPR+6(A1) JOBIDX A5 MOV JOBNAM(A5),MS.DAT+2(A1) ; SEND OUR JOB NAME TST JOBTRM(A5) ; SEE IF JOB HAS TRMDEF BEQ NOTRM ; IF NOT, DON'T LOOK FOR IT MOV JOBTRM(A5),A5 ; POINT TO TRMDEF SUB #4,A5 ; POINT TO TERMINAL NAME MOV @A5,MS.SPR+6(A1) ; SAVE IT IN SPARE AREA NOTRM: CLRW MS.FLG(A1) ; CLEAR THE FLAGS WORD SNDMSG @A1,D6,0 ; SEND THE MESSAGE TO THE SPOOLER TST D6 ; CHECK RETURN STATUS BEQ CONT ; IF OK, GO AROUND CMP D6,#M$EDSF ; SEE IF SOCKET FULL BNE EXIST ; IF NOT, SEE IF IT DOESN'T EXIST SLEEP #1000. ; SLEEP FOR 1/10 SECOND BR NOTRM ; AND TRY AGAIN EXIST: CMP D6,#M$ESNN ; SEE IF LPTSPL EXISTS BNE ERROR ; IF NOT, THEN ERROR BR EXIT ; ELSE JUST GO BACK TO BASIC CONT: WTMSG #10000. ; WAIT FOR NO MORE THAN 1 SECOND BNE EXIT ; IF NO RESPONSE, EXIT RCVMSG @A1,D6,0 ; RECEIVE THE MESSAGE TST D6 ; TEST FOR VALID MESSAGE BNE ERROR ; IF NOT, PROCESS ERROR CMPW MS.SPR(A1),#"UU ; CHECK FOR PROPER RESPONSE BNE CONT ; IF NOT, WAIT FOR NEXT TSTW 30(A1) ; SEE IF END OF LIST BNE EXIT ; IF SO, FINISH UP SUB #6.,AVAIL(A4) ; check avail room JMI BUFFUL ; and notify if full INC COUNT(A4) ; else bump printer count PUSH A1 LEA A1,32(A1) ; POINT TO FIRST PRINTER NAME UNPACK ; GET FIRST HALF OF PRINTER NAME UNPACK ; AND SECOND HALF POP A1 TSTW 114(A1) ; SEE IF SECOND ONE BNE EXIT PUSH A1 LEA A1,116(A1) ; POINT TO SECOND PRINTER NAME UNPACK UNPACK POP A1 BR CONT ; AND WAIT FOR NEXT MESSAGE EXIT: CLSMSG D6 ; CLOSE MESSAGE SOCKET RTN ; BACK TO BASIC ERROR: XY 24,1 ; PUT MESSAGE AT BOTTOM OF SCREEN XY -1,9 XY -2,4 ; MAKE IT IN RED FOR COLOR TERMINALS TYPE XY -2,1 ; BACK TO WHITE TTYI ; RING BELL BYTE 7,0 EVEN SLEEP #30000. ; WAIT 3 SECONDS SO THEY CAN SEE MESSAGE JMP EXIT ; THEN BACK TO BASIC BUFFUL: ; buffer variable filled up !! XY 24,01 XY -1,09 TYPESP <%Buffer full,> MOV COUNT(A4),D1 ; see if any names got saved BEQ 10$ TYPESP DCVT 0,OT$TRM ; output count to CRT BR 20$ 10$: TYPE 20$: TYPE < printer> CMP D1,#1 BEQ 30$ TYPE 30$: TYPESP < defined in PRTS.SBR> TTYI ; ding the terminal bell BYTE 7.,0 EVEN SLEEP #50000. ; snooze for 5 secs XY 24,01 ; clear the message XY -1,09 RTN ; back to Basic IMPERR: XY 23,80 ; write "end reverse" attribute XY -1,33 XY 22,80 ; write "begin reverse" attribute XY -1,32 XY 23,01 TYPESP TYPESP XY 23,80 ; write "end reverse" attribute XY -1,33 TTYI ; ding the terminal bell BYTE 7.,0 EVEN EXIT ; and PLOP to the os prompt ARGERR: XY 23,80 ; write "end reverse" attribute XY -1,33 XY 22,80 ; write "begin reverse" attribute XY -1,32 XY 23,01 TYPESP XY 23,80 ; write "end reverse" attribute XY -1,33 TTYI ; ding the terminal bell BYTE 7.,0 EVEN EXIT ; and PLOP to the os prompt ASCII / COPYRIGHT (C) 1985 DALE A. EICHBAUER / EVEN END .