.TITLE USERMAC - USER MACROS .IDENT /Y02/ .SBTTL PMSGDF - DEFINE I/O BLOCKS ;+ ; The following macros are utility macros for terminal I/O. ; To use them in a task, the user provides the following within ; the root segment: ; ; 1. An invocation to PMSGDF is required to define the QIO$S ; for output. The PMSGDF call takes the following form: ; ; PMSGDF PSECT,LUN,FEFLAG,NEFLAG,L,B ; ; Where: ; ; 'PSECT' is the (optional) program section which ; is redefined after the P.MSG routine is defined in ; .PSECT $CODE. ; ; 'LUN' is an optional unit number used for the output. ; If not specified, unit 5 is used (default for TI:). ; ; 'FEFLAG' is the first event flag used in the QIO$ requests. ; If not specified, event flag 1 is used. ; ; 'NEFLAG' is the number of sequential event flags used for ; all QIO$ requests. The first QIO$ uses 'FEFLAG', the next ; uses 'FEFLAG+1', and so on, up to 'FEFLAG+NEFLAG-1', thereupon ; cycling back to 'FEFLAG'. If this argument is unspecified, ; a value of 1 is used. ; ; 'L' IS AN OPTIONAL COLON ':' ARGUMENT WHICH, WHEN PRESENT, ; DEFINES ALL ENTRY POINTS AND DATA LOCATIONS AS GLOBAL SYMBOLS. ; THESE SYMBOLS ARE THE FOLLOWING: ; ; P.CEFN EVENT FLAG CYCLIC COUNTER. (SEE CODE FOR ; DETAILS) ; P.MSG PRINT MESSAGE ROUTINE ENTRY POINT ; ; 'B' IS AN OPTIONAL EQUAL SIGN (=) ARGUMENT WHICH, WHEN PRESENT, ; DEFINES ALL SYMBOLIC CONSTANTS AS GLOBAL SYMBOLS. THESE SYMBOLS ; ARE THE FOLLOWING: ; ; $$LUN LOGICAL UNIT USED FOR MESSAGE OUTPUT. ; $$EFN LOWEST EVENT FLAG TO USE FOR QIOS. ; $$NEF NUMBER OF EVENT FLAGS USED IN I/O. ; ; 2. THE USER MAY DISCERN THE EVENT FLAG USED FOR THE LAST QIO$ ; REQUEST BY EXAMINING THE WORD P.CEFN. THIS IS USEFUL IN ; APPLICATIONS WHERE MULTIPLE QIO$ REQUESTS ARE ISSUED WITH A ; SINGLE WAIT PERFORMED ON THE FINAL REQUEST. THE PROPER WAY TO ; do this is as follows: ; ; TST P.CEFN ; See if any I/O done ; BEQ DONE ; If zero, then none done ; WTFOR P.CEFN ; WTSE$ or STSE$ for last I/O ; DONE: CLR P.CEFN ; Clear P.CEFN for re-entrancy ; ; 3. THE USER MAY DECIDE IF THE STSE$ DIRECTIVE IS TO BE USED ; FOR PENDING I/O OVER THE WTSE$ DIRECTIVE. TO USE THE ; STSE$ DIRECTIVE, THE SYMBOL 'P.STP' MUST BE DEFINED IN THE ; SAME SOURCE MODULE WHERE THE 'PMSGDF' MACRO IS INVOKED. ;- .MACRO PMSGDF SECT,LUN,FEFLAG,NEFLAG,L,B,?BB,?BA,?BC .MCALL DIR$ .PSECT $PDATA,RW,D .IF NB $$LUN ='B' LUN .IFF $$LUN ='B' 5 .ENDC .IF NB $$EFN ='B' FEFLAG .IFF $$EFN ='B' 1 .ENDC .IF NB $$NEF ='B' NEFLAG .IFF $$NEF ='B' 1 .ENDC P.CEFN:'L'.WORD 0 .PSECT $CODE,RO,I .ENABL LSB P.MSG:'L' ; ; AT ENTRY TO P.MSG, THE STACK APPEARS AS FOLLOWS: ; ; --------------------------------- ; | 0 (CELL FOR RETURN ADDRESS) | ; |-------------------------------| ; | WAIT FLAG (0 IF NO WAIT) | ; |-------------------------------| ; | PARAM 6 (0) | ; |-------------------------------| ; | PARAM 5 (0) | ; |-------------------------------| ; | PARAM 4 (0) | ; |-------------------------------| ; | 0 | CARRIAGE CTL | ; |-------------------------------| ; | BUFFER LENGTH (PARAM 2) | ; |-------------------------------| ; | BUFFER ADDRESS (PARAM 1) | ; |-------------------------------| ; SP -> | RETURN ADDRESS | ; |-------------------------------| ; ; P.MSG FILLS IN THE REST OF THE DPB MANUALLY, MOVES THE ; RETURN ADDRESS TO THE SAVE CELL ON THE STACK, AND EXECUTES ; THE QIO. ; TST P.CEFN ; ANY I/O DONE YET? .IF GT <$$NEF-1> ; (ONLY ASSEMBLE IF > 1 EFN) BEQ BA ; NO, GO INITIALIZE EVENT FLAG INC P.CEFN ; BUMP EVENT FLAG CMP P.CEFN,#<$$EFN+$$NEF-1> ; WRAP AROUND? BLE .+10 ; NO, GO RETURN .IFF BNE BC ; YES, DON'T REINITIALIZE EVENT FLAG .ENDC BA: MOV #$$EFN,P.CEFN ; RESET EVENT FLAG TO FIRST BC: MOV (SP),16.(SP) ; SAVE RETURN ADDRESS CLR (SP) ; NO AST CLR -(SP) ; NO IOSB MOV P.CEFN,-(SP) ; PUSH EVENT FLAG MOV #$$LUN,-(SP) ; PUSH LUN MOV #IO.WVB,-(SP) ; PUSH QIO FUNCTION MOV (PC)+,-(SP) ; PUSH DPB SIZE, FUNCTION .BYTE 1,12. DIR$ ; EXECUTE QIO TST (SP)+ ; CHECK WAIT FLAG BEQ BB ; IF ZERO, NO WAITING .IF NDF P.STP .MCALL WTSE$S WTSE$S P.CEFN ; WAIT FOR COMPLETION .IFF .MCALL STSE$S STSE$S P.CEFN ; STOP FOR COMPLETION .ENDC BB: RETURN ; EXIT TO CALLER .DSABL LSB .IF NB .PSECT SECT .IFF .PSECT .ENDC .ENDM PMSGDF .PAGE .SBTTL PRINT MACRO ;+ ; MACRO PRINT - PRINT A STATIC STRING ON THE TERMINAL ; ; THE PRINT MACRO CALL TAKES THE FOLLOWING FORM: ; ; PRINT [,SECT] [,WTFLG] ; ; WHERE 'MESSAGE' IS THE TEXT TO BE PRINTED (NO CONTROL CHARACTERS). ; THE FIRST CHARACTER IN THE 'MESSAGE' STRING IS USED FOR ; CARRIAGE CONTROL (FORTRAN STYLE - SEE I/O DRIVERS REFERENCE ; MANUAL IN THE TERMINAL DRIVERS SECTION). ; ; 'SECT' IS AN OPTIONAL ARGUMENT SPECIFYING THE PROGRAM ; SECTION IN WHICH THE PRINT MACRO OCCURS. IF NOT SPECIFIED, ; THE BLANK .PSECT IS ASSUMED. ; ; 'WTFLG' IS AN OPTIONAL ARGUMENT SPECIFYING WHETHER A ; WAITFOR OR STOPFOR IS TO BE INVOKED ON THE QIO REQUEST. IF THE ; ARGUMENT EQUALS ZERO, THEN NO WAIT IS PERFORMED. IF ; THE ARGUMENT IS NONZERO OR MISSING, THEN A WTSE$S OR STSE$S IS ; EXECUTED TO WAIT FOR THE I/O COMPLETION BEFORE RETURN ; ; THE MESSAGE TEXT IS STORED IN .PSECT MSGTXT. AFTER PRINTING ; THE MESSAGE, PROGRAM CONTROL FALLS TO THE NEXT ADDRESS IN ; .PSECT 'SECT', AND THUS THE 'SECT' PARAMETER MUST BE SET CORRECTLY. ; ; NOTE: IF LOCAL SYMBOLS WILL BE USED IN THE USER PROGRAM, AND ; ANY OF THE LOCAL SYMBOLS ARE REFERENCED ACROSS THE CALL ; TO PRINT, THEN AN ".ENABL LSB" DIRECTIVE MUST BE INVOKED ; BEFORE THE CALL TO PRINT. NOTE THAT THE .ENABL LSB ; MUST OCCUR BEFORE A .PSECT DIRECTIVE IF THE LOCAL SYMBOL ; BLOCK IS TO APPLY TO THAT .PSECT. ;- .MACRO PRINT MESSAGE,SECT,WTFLG .PSECT MSGTXT,RO,D .NCHR MSGLEN, MSGADR = . .ASCII \MESSAGE\ .IF NB .PSECT SECT .IFF .PSECT .ENDC .MCALL PMSG .IF NB PMSG <#>,<#>,MSGADR, .IFF PMSG <#>,<#>,MSGADR .ENDC .ENDM PRINT .PAGE .SBTTL TYPE MACRO (SYNONYM OF PRINT) ;+ ; TYPE - SYNONYM FOR PRINT MACRO ; ; TYPE [, [SECT] [, [WTFLG]]] ; ; WHERE THE MACRO ARGUMENTS ARE IDENTICAL AS FOR THE PRINT MACRO ;- .MACRO TYPE MESSAGE,SECT,WTFLG .MCALL PRINT .IF B .IF B PRINT .IFF PRINT , .ENDC .IFF .IF B PRINT ,, .IFF PRINT ,, .ENDC .ENDC .ENDM TYPE .PAGE .SBTTL ERROR - PRINT ERROR MACRO ;+ ; ERROR - PRINT STATIC ERROR MESSAGE AND JUMP TO LABEL OR EXIT ; ; ERROR IS A NICE WAY OF PRINTING A DIAGNOSTIC AND BAILING OUT ; OF A TASK. THE FORM OF THE MACRO CALL IS: ; ; ERROR , [LABEL] [,SECT] [,WTFLG] ; ; WHERE 'MESSAGE', 'SECT', AND 'WTFLG' ARE EXACTLY THE SAME ; FOR THE PRINT MACRO. ; ; 'LABEL', IF SPECIFIED, CAUSES A 'JMP' TO BE EXECUTED ; TO THE LABEL UPON COMPLETION OF THE QIO; OTHERWISE, AN ; EXIT$S IS GENERATED AND EXECUTED. ; ; NOTE: SINCE THE ERROR MACRO CALLS THE PRINT MACRO, THE SAME ; PROCEDURE FOR THE USE OF LOCAL SYMBOLS IN THE PROGRAMMER'S ; CODE MUST BE FOLLOWED AS PER THE NOTE IN THE DESCRIPTION ; OF THE PRINT MACRO. ;- .MACRO ERROR MESSAGE,LABEL,SECT,WTFLG .MCALL PRINT .IF NB .IF B PRINT ,, .IFF PRINT ,, .ENDC .IFF .IF B PRINT .IFF PRINT , .ENDC .ENDC .IF NB