VTMWRT - WRITE TO FILE/TERMINAL MACRO M1200 30-SEP-82 10:23 TABLE OF CONTENTS 3- 94 WRTMSG - CALCULATE COUNT AND WRITE MESSAGE 4- 117 WRITIT - WRITE THE MESSAGE TO THE TERMINAL 5- 154 WRTTTY - WRITE MESSAGE TO TERMINAL 6- 186 SETBUF - SET BUFFER AND BYTE COUNT 7- 204 SETUP - SETUP FOR PUT$ OR QIO$ 8- 271 DOQIO - DO A QIO TO A TERMINAL 9- 292 DOPUT - DO A PUT TO THE OUTPUT FILE VTMWRT - WRITE TO FILE/TERMINAL MACRO M1200 30-SEP-82 10:23 PAGE 1 1 .TITLE VTMWRT - WRITE TO FILE/TERMINALS 2 .IDENT /01.5/ 3 .ENABL LC 4 ;+ 5 ; 6 ; Free software BY 7 ; Project Software & Development, Inc. 8 ; 9 ; This software is furnished for free and may be used and copied as 10 ; desired. This software or any other copies thereof may be provided or 11 ; otherwise made available to any other person. No title to and 12 ; ownership of the software is hereby transferred or allowed. 13 ; 14 ; The information in this software is subject to change without notice 15 ; and should not be construed as a commitment by PROJECT SOFTWARE 16 ; AND DEVELOPMENT, INC. 17 ; 18 ; PROJECT SOFTWARE assumes no responsibility for the use or reliability 19 ; of this software on any equipment whatsoever. 20 ; 21 ; Project Software & Development, Inc. 22 ; 14 Story St. 23 ; Cambridge, Ma. 02138 24 ; 617-661-1444 25 ; 26 ; 27 ; Title: VTMWRT.MAC 28 ; Author: Robin Miller 29 ; Date: Jupy 14, 1982 30 ; 31 ; Description: 32 ; 33 ; Writes the VTM message to a file and/or terminals. 34 ; 35 ; 36 ; Modification History: 37 ; 38 ;- 39 .ENABL AMA 40 .NLIST BEX 41 42 .MCALL PUT$, QIOW$S VTMWRT - WRITE TO FILE/TERMINAL MACRO M1200 30-SEP-82 10:23 PAGE 2 44 45 ; Macro to generate error message. 46 47 .MACRO ERRMSG LABEL,MSG 48 .NCHR $$$, 49 .PSECT $ERMSG,RO,D,REL,CON 50 LABEL: .ASCII "MSG" 51 .EVEN 52 .PSECT 53 MOV #LABEL,R1 54 MOV #$$$,R2 55 CALL OUTMSG 56 .ENDM 57 58 ; Local equates: 59 60 000001 ON = 1 ; ENABLED FLAG 61 000000 OFF = 0 ; DISABLED FLAG 62 63 ; Offsets for output table entrys: 64 65 000000 O.FLAG = 0 ; ENABLED / DISABLED 66 000002 O.FDB = 2 ; OFFSET TO FDB 67 000004 O.LUN = 4 ; OFFSET TO LUN 68 000005 O.EFN = 5 ; OFFSET TO EFN 69 70 ; Output table: 71 72 000000 OTABLE:: 73 000000 000001 TENTRY::.WORD ON ; LOCAL TERMINAL ENTRY 74 000002 000000G .WORD TOFDB ; TERMINAL OUTPUT FDB 75 000004 000G 000G .BYTE TOLUN,TOEFN ; TERMINAL LUN / EFN 76 000006 ENTSIZ = .-TENTRY ; SIZE OF EACH ENTRY 77 000006 FENTRY:: ; OUTPUT FILE ENTRY 78 000006 000000 .WORD OFF ; INITIALLY DISABLED 79 000010 000000G .WORD OUTFDB ; OUTPUT FILE FDB 80 000012 000G 000G .BYTE OUTLUN,OUTEFN ; OUTPUT FILE LUN / EFN 81 000014 AENTRY:: ; ADDITION TERMINAL ENTRYS 82 000014 000000 .WORD OFF ; INITIALLY DISABLED 83 000016 000000 .WORD 0 ; NO FDB, MUST BE A TERMINAL 84 000020 000G 000G .BYTE TTYLUN,TTYEFN ; TERMINAL LUN / EFN 85 86 000022 177777 .WORD -1 ; END OF TABLE (FOR NOW) 87 88 000024 000022' NENTRY::.WORD AENTRY+ENTSIZ ; NEXT TABLE ENTRY 89 90 000026 000G TTYST: .BYTE TC.TTP ; GET TERMINAL TYPE 91 000027 000 TTYPE: .BYTE 0 ; AND STORE IT HERE 92 000002 TTYSIZ = .-TTYST ; SIZE OF STATUS TABLE VTMWRT - WRITE TO FILE/TERMINAL MACRO M1200 30-SEP-82 10:23 PAGE 3 WRTMSG - CALCULATE COUNT AND WRITE MESSAGE 94 .SBTTL WRTMSG - CALCULATE COUNT AND WRITE MESSAGE 95 ;+ 96 ; 97 ; WRTMSG - Calculate the byte count and write the message. 98 ; 99 ; Inputs: 100 ; BUFPTR = the updated output buffer address. 101 ; 102 ; Outputs: 103 ; BUFPTR = starting address of message buffer. 104 ; 105 ; All registers are preserved. 106 ; 107 ;- 108 000030 004237 000000G WRTMSG::JSR R2,$SAVVR ; SAVE R0 - R2 109 000034 004737 000174' CALL SETBUF ; SET THE BUFFER AND COUNT 110 000040 010137 000000G MOV R1,BUFPTR ; RESET THE BUFFER POINTER 111 000044 005702 TST R2 ; IS THERE A BYTE COUNT ? 112 000046 001405 BEQ 10$ ; IF EQ, DON'T SKIP WRITE 113 000050 004737 000064' CALL WRITIT ; WRITE IT TO THE TERMINAL 114 000054 042737 000000G 000000G BIC #B.CLR,STATUS ; ONLY CLEAR SCREEN ONCE 115 000062 000207 10$: RETURN VTMWRT - WRITE TO FILE/TERMINAL MACRO M1200 30-SEP-82 10:23 PAGE 4 WRITIT - WRITE THE MESSAGE TO THE TERMINAL 117 .SBTTL WRITIT - WRITE THE MESSAGE TO THE TERMINAL 118 ;+ 119 ; 120 ; WRITIT - Write the message to the terminal and/or file. 121 ; 122 ; Inputs: 123 ; R1 = the buffer address. 124 ; R2 = the buffer byte count. 125 ; 126 ; Outputs: 127 ; Carry clear/set = success/failure. 128 ; 129 ; All registers are preserved. 130 ; 131 ;- 132 000064 004737 000000G WRITIT::CALL $SAVAL ; SAVE R0 - R5 133 000070 010137 000000G MOV R1,BUFADR ; SAVE THE BUFFER ADDRESS 134 000074 010237 000000G MOV R2,BYTCNT ; AND THE BUFFER BYTE COUNT 135 000100 012703 000000' MOV #OTABLE,R3 ; START OF THE OUTPUT TABLE 136 137 ; Loop through list of output devices. 138 139 000104 032737 000000G 000000G 10$: BIT #B.CTRC,STATUS ; WAS CTRL/C TYPED ? 140 000112 001011 BNE 100$ ; IF NE, YES (RETURN) 141 000114 005713 TST (R3) ; END OF THE TABLE ? 142 000116 100407 BMI 100$ ; IF MI, YES 143 000120 003003 BGT 30$ ; IF GT, ENABLED 144 000122 062703 000006 20$: ADD #ENTSIZ,R3 ; POINT TO NEXT ENTRY 145 000126 000766 BR 10$ ; AND CHECK NEXT ENTRY 146 147 ; Output to this device (terminal or file). 148 149 000130 004737 000210' 30$: CALL SETUP ; SETUP AND DO OUTPUT 150 000134 000772 BR 20$ ; AND CONTINUE ... 151 152 000136 000207 100$: RETURN VTMWRT - WRITE TO FILE/TERMINAL MACRO M1200 30-SEP-82 10:23 PAGE 5 WRTTTY - WRITE MESSAGE TO TERMINAL 154 .SBTTL WRTTTY - WRITE MESSAGE TO TERMINAL 155 ;+ 156 ; 157 ; WRTTTY - Write message to the terminal only. 158 ; 159 ; This routine presumes the message to output is in MSGBUF. 160 ; 161 ; Inputs: 162 ; R1 = the buffer address. 163 ; R2 = the buffer byte count. 164 ; 165 ; Outputs: 166 ; All registers are preserved. 167 ; 168 ;- 169 000140 WRTTTY:: 170 000140 004737 000000G CALL $SAVAL ; SAVE R0 - R5 171 000144 012703 000000' MOV #TENTRY,R3 ; TERMINAL OUTPUT ENTRY 172 ; MOV (R3),-(SP) ; SAVE STATUS (INCASE DISABLED) 173 ; MOV #ON,(R3) ; ENABLE TERMINAL OUTPUT 174 000150 004737 000210' CALL SETUP ; SETUP AND WRITE MESSAGE 175 ; MOV (SP)+,(R3) ; RESTORE ORIGINAL STATUS 176 000154 000207 RETURN 177 178 ; Same as WRTTTY except write it to the output file. 179 180 000156 WRTFIL:: 181 000156 004737 000000G CALL $SAVAL ; SAVE R0 - R5 182 000162 012703 000006' MOV #FENTRY,R3 ; OUTPUT FILE ENTRY 183 000166 004737 000210' CALL SETUP ; SETUP AND WRITE MESSAGE 184 000172 000207 RETURN VTMWRT - WRITE TO FILE/TERMINAL MACRO M1200 30-SEP-82 10:23 PAGE 6 SETBUF - SET BUFFER AND BYTE COUNT 186 .SBTTL SETBUF - SET BUFFER AND BYTE COUNT 187 ;+ 188 ; 189 ; SETBUF - Set the buffer address and byte count. 190 ; 191 ; Inputs: 192 ; BUFPTR = the updated message buffer pointer. 193 ; 194 ; Outputs: 195 ; R1 = the message buffer address. 196 ; R2 = the buffer byte count. 197 ;- 198 000174 SETBUF:: 199 000174 012701 000000G MOV #MSGBUF,R1 ; SET THE BUFFER ADDRESS 200 000200 013702 000000G MOV BUFPTR,R2 ; COPY UPDATED BUFFER POINTER 201 000204 160102 SUB R1,R2 ; CALCULATE THE BYTE COUNT 202 000206 000207 RETURN VTMWRT - WRITE TO FILE/TERMINAL MACRO M1200 30-SEP-82 10:23 PAGE 7 SETUP - SETUP FOR PUT$ OR QIO$ 204 .SBTTL SETUP - SETUP FOR PUT$ OR QIO$ 205 ;+ 206 ; 207 ; SETUP - Setup for PUT$ or QIO$. 208 ; 209 ; This routine is called to setup the LUN and EFN for a PUT$ or QIO$. 210 ; If the output LUN is assigned to a terminal, a QIO$ is used otherwise 211 ; a PUT$ is used to write the message. 212 ; 213 ; Inputs: 214 ; R1 = the buffer address. 215 ; R2 = the buffer byte count. 216 ; R3 = device entry to output to. 217 ; 218 ; Outputs: 219 ; R0 is destroyed. 220 ; 221 ;- 222 .ENABL LSB 223 000210 SETUP:: 224 000210 005713 TST (R3) ; DEVICE ENABLED ? 225 000212 001501 BEQ 100$ ; IF EQ, NO (DO NOTHING) 226 000214 116337 000004 000000G MOVB O.LUN(R3),LUN ; COPY THE LUN 227 000222 116337 000005 000000G MOVB O.EFN(R3),EFN ; COPY THE EFN 228 000230 016300 000002 MOV O.FDB(R3),R0 ; COPY THE FDB ADDRESS 229 000234 001410 BEQ 10$ ; IF EQ, THERE IS NONE 230 000236 132760 000000G 000000G BITB #FD.TTY,F.RCTL(R0) ; ARE WE GOING TO A TERMINAL ? 231 000244 001004 BNE 10$ ; IF NE, YES (USE QIO) 232 233 ; Output to the file. 234 235 000246 004737 000474' CALL DOPUT ; NO, DO PUT TO FILE 236 000252 103061 BCC 100$ ; IF CC, SUCCESS 237 000254 000456 BR 90$ ; ERROR ENCOUNTERED 238 239 ; Output to the terminal. 240 241 000256 10$: QIOW$S #SF.GMC,LUN,EFN,,#TIOSB,,<#TTYST,#TTYSIZ> 242 000330 004737 000000G CALL CHKERR ; CHECK FOR ERRORS 243 000334 103426 BCS 90$ ; IF CS, ERROR 244 245 ; Insure the terminal is a VT100 family terminal. 246 247 000336 123727 000027' 000000G CMPB TTYPE,#T.V100 ; ARE WE ON A VT100 ? 248 000344 001417 BEQ 20$ ; IF EQ, YES 249 250 ; Range of VT100 terminals is T.V101 (24) through T.V132 (31). 251 252 000346 123727 000027' 000000G CMPB TTYPE,#T.V101 ; Is this possible VT100 family ? 253 000354 103404 BLO 15$ ; If LO, no 254 000356 123727 000027' 000000G CMPB TTYPE,#T.V132 ; Really a VT100 family terminal ? 255 000364 101407 BLOS 20$ ; IF LOS, yes 256 000366 15$: ERRMSG NVT100,<%VTM-W-BADTTY, terminal is not of the VT100 family.> 257 000402 000403 BR 90$ ; NOW DISABLE TERMINAL 258 259 000404 004737 000420' 20$: CALL DOQIO ; DO A QIO TO THE TERMINAL 260 000410 103002 BCC 100$ ; IF CC, SUCCESS VTMWRT - WRITE TO FILE/TERMINAL MACRO M1200 30-SEP-82 10:23 PAGE 7-1 SETUP - SETUP FOR PUT$ OR QIO$ 261 262 ; Disable the device when an error occurs. 263 264 000412 005013 90$: CLR (R3) ; ERROR, DISABLE THIS DEVICE 265 000414 000261 SEC ; RETURN FAILURE STATUS 266 267 000416 000207 100$: RETURN 268 269 .DSABL LSB VTMWRT - WRITE TO FILE/TERMINAL MACRO M1200 30-SEP-82 10:23 PAGE 8 DOQIO - DO A QIO TO A TERMINAL 271 .SBTTL DOQIO - DO A QIO TO A TERMINAL 272 ;+ 273 ; 274 ; DOQIO - Do a QIO to a terminal. 275 ; 276 ; Inputs: 277 ; R1 = the buffer addres 278 ; R2 = the buffer byte count. 279 ; LUN and EFN must be preset. 280 ; 281 ; Outputs: 282 ; Carry bit clear/set = success/failure. 283 ; 284 ; All registers are preserved. 285 ; 286 ;- 287 000420 DOQIO:: 288 000420 QIOW$S FUNC,LUN,EFN,,#TIOSB,, 289 000466 004737 000000G CALL CHKERR ; CHECK/REPORT ANY ERRORS 290 000472 000207 RETURN VTMWRT - WRITE TO FILE/TERMINAL MACRO M1200 30-SEP-82 10:23 PAGE 9 DOPUT - DO A PUT TO THE OUTPUT FILE 292 .SBTTL DOPUT - DO A PUT TO THE OUTPUT FILE 293 ;+ 294 ; 295 ; DOPUT - Write a record to the output file. 296 ; 297 ; Inputs: 298 ; R0 = the FDB address. 299 ; R1 = the buffer address. 300 ; R2 = the buffer byte count. 301 ; 302 ; Outputs: 303 ; Carry bit clear/set = success/failure. 304 ; 305 ; All registers are preserved. 306 ;- 307 000474 DOPUT:: 308 000474 004737 000000G CALL $SAVAL ; SAVE ALL REGISTERS 309 000500 PUT$ R0,R1,R2 ; WRITE THE OUTPUT RECORD 310 000514 103007 BCC 10$ ; IF CC, SUCCESS 311 000516 016046 000000G MOV F.ERR(R0),-(SP) ; SAVE THE FCS ERROR CODE 312 000522 004737 000000G CALL CLOFIL ; CLOSE THE OUTPUT FILE 313 000526 012600 MOV (SP)+,R0 ; COPY THE FCS ERROR CODE 314 315 ; Output the error message (C bit set by WRTERR). 316 317 000530 004737 000000G CALL WRTERR ; REPORT THE ERROR MESSAGE 318 319 000534 000207 10$: RETURN 320 321 000001 .END VTMWRT - WRITE TO FILE/TERMINAL MACRO M1200 30-SEP-82 10:23 PAGE 9-1 SYMBOL TABLE AENTRY 000014RG FENTRY 000006RG OUTFDB= ****** GX TC.TTP= ****** GX T.V101= ****** GX BUFADR= ****** GX FUNC = ****** GX OUTLUN= ****** GX TENTRY 000000RG T.V132= ****** GX BUFPTR= ****** GX F.ERR = ****** GX OUTMSG= ****** GX TIOSB = ****** GX WRITIT 000064RG BYTCNT= ****** GX F.NRBD= ****** GX O.EFN = 000005 TOEFN = ****** GX WRTERR= ****** GX B.CLR = ****** GX F.RCTL= ****** GX O.FDB = 000002 TOFDB = ****** GX WRTFIL 000156RG B.CTRC= ****** GX LUN = ****** GX O.FLAG= 000000 TOLUN = ****** GX WRTMSG 000030RG CHKERR= ****** GX MSGBUF= ****** GX O.LUN = 000004 TTYEFN= ****** GX WRTTTY 000140RG CLOFIL= ****** GX NENTRY 000024RG PAR$$$= 000000 TTYLUN= ****** GX $SAVAL= ****** GX DOPUT 000474RG NVT100 000000R 002 SETBUF 000174RG TTYPE 000027R $SAVVR= ****** GX DOQIO 000420RG OFF = 000000 SETUP 000210RG TTYSIZ= 000002 $$$ = 000063 EFN = ****** GX ON = 000001 SF.GMC= ****** GX TTYST 000026R $$$ARG= 000002 ENTSIZ= 000006 OTABLE 000000RG STATUS= ****** GX T.V100= ****** GX .PUT = ****** G FD.TTY= ****** GX OUTEFN= ****** GX . ABS. 000000 000 000536 001 $ERMSG 000064 002 ERRORS DETECTED: 0 VIRTUAL MEMORY USED: 9471 WORDS ( 37 PAGES) DYNAMIC MEMORY: 10202 WORDS ( 39 PAGES) ELAPSED TIME: 00:00:25 VTMWRT,VTMWRT/-SP=VTMWRT