; FILE [6,12]HP7220.MAC ; P. KURJAN 10-MAY-82 ; ; VERSION 1.0 ; ; RSX-11M SUBROUTINES USING FULL-DUPLEX TERMINAL DRIVER TO ; COMMUNICATE WITH HP 7220 PLOTTER. ; ; SUBROUTINE PACKAGE INCLUDES ; ; INTEGER FUNCTION IHPATT - TO ATTACH A TASK TO THE PLOTTER ; SUBROUTINE XMT - TO SEND A COMMAND STRING TO THE PLOTTER ; SUBROUTINE REC - TO SEND A COMMAND STRING TO THE PLOTTER AND ; RECEIVE A REPLY ; INTEGER FUNCTION IHPDET - TO DETACH A TASK FROM THE PLOTTER ; ;------------------------------------------------------------------------- ; .TITLE HP7220 ; .MCALL DIR$,ALUN$,GLUN$,QIOW$,QIO$,MRKT$C,WTSE$C,GTSK$C .MCALL QIOW$C ; .SBTTL DATA ; MSGQIO:: QIOW$ IO.WVB,5,1,,,,<,,40> ;QIO DPB FOR TERMINAL MESSAGES ATTQIO:: QIO$ ,,2,,IOSTAT ;QIO FOR ATTACH/DETACH/KILL FUNCTIONS HPQIOW:: QIOW$ ,,3,,IOSTAT ;QIO DPB FOR PLOTTER WRITE/READ IOSTAT:: .BLKW 2 ;I/O STATUS WORDS ALUN:: ALUN$ ,HP,0 ;ASSIGN LUN DPB GLUN:: GLUN$ ,BUF ;GET LUN DPB ; HPLUN: .WORD 0 ;LUN TO WHICH HP0: IS ATTACHED (0 IF NONE) ; BUFSIZ = 16. BUF: .BLKW BUFSIZ ;GENERAL-PURPOSE TEMPORARY DATA BUFFER ; .SBTTL MACROS ; ; FILE [6,12]MACMSG.MAC ; P. KURJAN 25-APR-82 ; ; MACRO FOR EASY SETUP OF OUTPUT MESSAGE BUFFERS ; .MACRO MSG,STRING,TYPE,N ; TYPE'MSG'N: .ASCII /STRING/ L'TYPE'MS'N=.-'TYPE'MSG'N .ENDM MSG ; ; FILE [6,12]ERR.MAC ; P. KURJAN 25-APR-82 ; ; ERROR HANDLING MACRO TO OPTIONALLY ; -LOAD MESSAGE ADDR AND LENGTH INTO GLOBAL "MSGQIO" DPB ; -CALL ERROR PROCESSING ROUTINE (NORMALLY MESSAGE PRINTING ROUTINE) ; -LOAD AN ERROR RETURN CODE INTO R0 ; .MACRO ERR,LABEL,TYPE,N,PRADD,R0VAL ; LABEL: .IF NB TYPE MOV #'TYPE'MSG'N,MSGQIO+Q.IOPL MOV #L'TYPE'MS'N,MSGQIO+Q.IOPL+2 .ENDC ; .IF NB PRADD CALL PRADD .ENDC ; .IF NB R0VAL MOV #'R0VAL',R0 .ENDC ; RETURN ; .ENDM ERR ; .SBTTL MESSAGE BUFFERS ; MSG ,D,1 MSG ,D,2 MSG ,D,3 MSG ,D,4 MSG ,D,5 ; MSG ,I,1 MSG ,I,2 MSG ,I,3 MSG ,I,4 ; .EVEN ; ;------------------------------------------------------------------------- ; .SBTTL ATTACH/DETACH ; ; INTEGER FUNCTION IHPATT(LUN) ; FORTRAN CALLABLE AS IRET=IHPATT(LUN) ; ; WHERE ; LUN (INTEGER,INPUT) - LOGICAL UNIT NUMBER TO BE ASSIGNED TO THE ; PLOTTER ; IRET(INTEGER,FUNCTION RETURN) - RETURN CODE ; 1 - SUCCESS ; 0 - PARAMETER ERROR, PLOTTER NOT AVAILABLE, OR RSX-11M ; DIRECTIVE ERROR ; IHPATT:: GTSK$C BUF ;GET TASK NAME IN RAD50 MOV BUF,DIRARG ;MOVE IT TO ERROR MSG ARG BUFFER MOV BUF+2,DIRARG+2 ;DON'T FORGET LAST 3 CHARACTERS MOV @2(R5),ALUN+A.LULU ;MOVE LOGICAL UNIT # INTO ASNLUN DPB DIR$ #ALUN ;ASSIGN LUN TO PLOTTER BCC 10$ CMPB $DSW,#IE.IDU ;"INVALID DEVICE" ERROR? BEQ DERR2 ;IF SO TELL USER TO ASN TTN:=HP0:/GBL BR DERR1 ;IF NOT DON'T GIVE HIM MUCH OF A CLUE ; 10$: MOV @2(R5),GLUN+G.LULU ;ENSURE HP0: IS A "TERMINAL" DIR$ #GLUN CMP BUF+G.LUNA,#"TT BNE DERR2 ; MOV #IO.ATT,ATTQIO+Q.IOFN ;MOVE ATTACH FUNC CODE TO QIO DPB MOV @2(R5),ATTQIO+Q.IOLU ;MOVE LOGICAL UNIT # TO QIO DPB DIR$ #ATTQIO ;QUEUE ATTACH REQUEST MRKT$C 4,2,1 ;WAIT 2 CLOCK TICKS (1/30 SECOND) WTSE$C 4 CMPB IOSTAT,#IS.SUC ;ATTACH SUCCESSFUL? BEQ 30$ ;YES IF EQUAL CMPB IOSTAT,#IS.PND ;ATTACH STILL PENDING? BNE IERR1 ;IF NOT GIVE GENERAL ERROR MSG CALL IERR4 ;IF SO PLOTTER IS PROBABLY ATTACHED TO MOV #IO.KIL,ATTQIO+Q.IOFN ;ANOTHER TASK. KILL ATTACH RQST DIR$ #ATTQIO RETURN ; 30$: MOV @2(R5),HPLUN ;SUCCESSFUL ATTACH; INDICATE LUN # MOV HPLUN,HPQIOW+Q.IOLU ;LOAD LUN INTO WRITE/READ QIO DPB MOV #IS.SUC,R0 ;INDICATE SUCCESS RETURN CODE RETURN ; ;------------------------------------------------------------------------- ; ; ERROR MACROS FOR IHPATT,IHPDET ; ERR DERR1,D,1,DERR,0 ERR DERR2,D,2,MPRINT,0 ERR IERR1,I,1,IERR,0 ERR IERR2,I,2,IERR,0 ERR IERR4,I,4,MPRINT,0 ; ;------------------------------------------------------------------------- ; ; INTEGER FUNCTION IHPDET ; FORTRAN CALL: IRET=IHPDET(IDUM) ; ; WHERE ; IRET - STATUS RETURN CODE ; 1 - SUCCESS ; 0 - RSX-11M ERROR (PROBABLY PLOTTER WAS NOT ATTACHED) ; IHPDET:: MOV HPQIOW+Q.IOLU,ATTQIO+Q.IOLU ;LOAD LUN # INTO QIO DPB BEQ IERR2 ;NOT ATTACHED IF LUN # IS ZERO 10$: MOV #IO.DET,ATTQIO+Q.IOFN ;LOAD DETACH FUNCTION INTO DPB DIR$ #ATTQIO ;QUEUE DETACH REQUEST WTSE$C 2 ;WAIT FOR COMPLETION CMPB IOSTAT,#IS.SUC ;SUCCESS BNE IERR2 CLR HPLUN ;SUCCESS - INDICATE HP0: NOT ATTACHED TO LUN CLR HPQIOW+Q.IOLU ;INDICATE NO CURRENTLY ACTIVE PLOTTER MOV #IS.SUC,R0 ;RETURN SUCCESS FUNCTION CODE RETURN ; ;----------------------------------------------------------------------------- ; .SBTTL TRANSMIT/RECEIVE ; ; SUBROUTINE XMT('CCCCCCCCCCCCC*') ; SUBROUTINE REC('CCCCCCCCCCCCC*',RTNSTR,LRTN) ; ; WHERE ; 'CCCCC*' IS ANY ASCII CHARACTER STRING ENDING WITH AN ASTERISK. ; THE ASTERISK IS STRIPPED OFF; THE STRING IS SENT TO THE ; PLOTTER. THE STRING IS NOT CHECKED TO ENSURE IT'S A VALID ; PLOT COMMAND!! THE STRING MUST BE 132 CHARACTERS OR LESS (NOT ; COUNTING THE TERMINATING "*"). ; RTNSTR (BYTE ARRAY,LARGE ENOUGH TO HOLD PLOTTER REPLY) CONTAINS ; THE ASCII STRING RETURNED FROM THE PLOTTER. ; LRTN (INTEGER) CONTAINS THE LENGTH OF RTNSTR (MAX 132 CHARS) ; ;**NOTE** THAT THIS IMPLEMENTATION OF XMT AND REC ARE ACTUALLY THE SAME ; SUBROUTINE. IF THE CALL HAS 1 ARGUMENT, XMT IS ASSUMED. IF IT ; HAS MORE THAN 1 (MUST BE 3!), REC IS ASSUMED. ; XMT:: REC:: TST HPQIOW+Q.IOLU ;ENSURE PLOTTER HAS BEEN ATTACHED BY TASK BEQ DERR4 MOV 2(R5),HPQIOW+Q.IOPL ;MOVE COMMAND STRING ADDR TO QIO DPB MOV 2(R5),R4 ;ALSO TO R4 MOV #133.,R3 ;R3 - CHARACTER COUNTER 10$: CMPB (R4)+,#'* ;TERMINATOR CHARACTER? BEQ 15$ SOB R3,10$ BR DERR3 ;ERROR - STRING TOO LONG OR NO TERMINATOR ; 15$: MOV #133.,R4 SUB R3,R4 ;DETERMINE STRING LENGTH BEQ DERR5 ;OOPS - NULL STRING MOV R4,HPQIOW+Q.IOPL+2 ;STRING LENGTH INTO QIO DPB CLR HPQIOW+Q.IOPL+4 ;DON'T WANT ANY TERMINAL (LF) OR (CR) CHARS MOV #IO.WAL,HPQIOW+Q.IOFN ;USE WRITE-PASS-ALL SINCE MUST WRITE ;ESC CHARACTERS AND CTRL C CHARS TO PLOTTER DIR$ #HPQIOW ;SEND THE COMMAND CMPB IOSTAT,#IS.SUC BNE IERR3 CMPB #1,(R5) ;SEE IF 1 ARG ONLY BNE REC1 ;NO - ALSO WANTS PLOTTER RESPONSE RETURN ; ;--------------------------------------------------------------------------- ; ; ERROR MACROS FOR XMT,REC ; ERR DERR3,D,3,MPRINT ERR DERR4,D,4,MPRINT ERR DERR5,D,5,MPRINT ERR IERR3,I,3,IERR ; ;--------------------------------------------------------------------------- ; ; PLOTTER RESPONSE PROCESSING ; REC1: MOV 4(R5),HPQIOW+Q.IOPL ;MOVE ADDR OF RESPONSE STRING TO DPB MOV #132.,HPQIOW+Q.IOPL+2 ;MAX STRING LENGTH TO QIO DPB CLR HPQIOW+Q.IOPL+4 ;NO TIMEOUT MOV #IO.RLB!TF.RNE,HPQIOW+Q.IOFN ;READ NO ECHO FUNCTION CODE DIR$ #HPQIOW ;QUEUE THE READ (NOTE THIS IS DEPENDENT ;ON PLOTTER DEFAULT CONDITION OF (CR) ;READ TERMINATOR) CMPB IOSTAT,#IS.SUC BNE IERR3 MOV IOSTAT+2,@6(R5) ;ON SUCCESSFUL READ MOVE LENGTH OF RETURN ;RESPONSE INTO 3RD CALL ARG ; ;--------------------------------------------------------------------------- ; ; ERROR MESSAGE PROCESSING ; DERR: CALL DIRPRT ;PRINT MESSAGE AND $DSW RETURN ; IERR: CALL IOSPRT ;PRINT MESSAGE AND I/O STATUS RETURN ; MPRINT: DIR$ #MSGQIO ;PRINT MESSAGE ONLY RETURN ; .END