PASLIB -- RUN-TIME SUPPORT MACRO D1013 02-OCT-77 16:31 TABLE OF CONTENTS 3- 94 $$$000 - INIT 4- 152 $$$001 - EXIT 5- 163 $$$004 - NEW 6- 192 $$$006 - MARK 7- 226 $$$007 - RELEASE 8- 248 $$$016 - FILE BLOCK INIT 9- 288 $$$017 - RESET 9- 289 $$$018 - REWRITE 10- 408 $$$020 - CLOSE 11- 432 $$$021 - GET 13- 536 $$$022 - PUT 14- 569 $$$023 - BREAK 15- 611 $$$024 - READ CHARACTER 16- 640 $$$025 - WRITE CHARACTER 17- 676 $$$027 - WRITE STRING 19- 743 $$$030 - READ INTEGER 21- 806 $$$031 - WRITE INTEGER 23- 880 $$$039 - WRITE OCTAL 24- 921 P$HERR - ERROR OUTPUT 25- 955 FILES11 INTERFACE DATA PASLIB -- RUN-TIME SUPPORT MACRO D1013 02-OCT-77 16:31 PAGE 1 1 .TITLE PASLIB -- RUN-TIME SUPPORT 2 .IDENT /771002/ 3 .MCALL FDBDF$,FDAT$A,FDRC$A,FDOP$A,FDBF$A,OPEN$R,OPEN$W 4 .MCALL GET$,PUT$,NMBLK$,FSRSZ$,QIOW$,DIR$,CLOSE$,DELET$ 5 .MCALL FINIT$,EXIT$S 6 ; 7 ; PASCAL RUN-TIME SUPPORT 8 ; FILE SUPPORT AND INITIALIZATION 9 ; FOR RSX-11D V6B LEAVE THE LINE DEFINING THE SYSTEM TYPE AS IS 10 ; FOR RSX-11M V3 COMMENT THE SYSTEM TYPE LINE OUT. 11 ; 12 000000 RSX11D=0 ;SYSTEM TYPE 13 ; 14 ; HEAP DEFINITION: 15 ; 16 000000 .PSECT ......,RW,GBL,OVR 17 ; 18 000000 000000G .HEAP.::.WORD HPSIZE ;(NUMBER OF BYTES IN HEAP) 19 ; .WORD 0 ;(TOP OF HEAP) 20 000002 000000 .WORD 0 ;(PREVIOUS HEAP) 21 000004 177770G .WORD HPSIZE-8. ;(CURRENT HEAP SIZE) 22 ; 23 ; USAGE: IN TKB COMMAND FILE: 24 ; 25 ; EXTSCT=......:SIZE 26 ; GBLPAT=.HEAP.:SIZE 27 ; 28 ; 29 ; GLOBAL AREA DEFINITION (PAS$$$) 30 ; 31 ; .PSECT PAS$$,RW,GLB,OVR 32 ; .BLKB STKSIZ 33 ; 34 ; USAGE: IN TKB COMMAND FILE: 35 ; 36 ; EXTSCT=PAS$$:STKSIZ 37 ; STACK=2 38 ; 39 ; .PSECT PAS$$$,RW,GBL,OVR 40 ; 41 ; .STCK. .WORD 0,0,0 DUMMY STACK FRAME 42 ; .WORD .HEAP. 43 ; .WORD OUTPUT+32. CONSOLE OUTPUT FILE BLOCK 44 ; .BYTE FILDIR,EOF 45 ; .WORD MAXSIZ 46 ; .WORD FDBPNT 47 ; .WORD IOFNC 48 ; .WORD VALID 49 ; .WORD BUFSIZ 50 ; .WORD STATUS,MODE 51 ; .WORD DEVTYP 52 ; .WORD DEVNAM 53 ; .WORD LOGNAM 54 ; .WORD BUFPTR 55 ; .WORD 0,0,0,0 56 ; .BLKB MAXSIZ 57 ; SAME THING FOR CONSOLE INPUT AT LOCATION 74. PASLIB -- RUN-TIME SUPPORT MACRO D1013 02-OCT-77 16:31 PAGE 1-1 58 ; 59 ; PASLIB -- RUN-TIME SUPPORT MACRO D1013 02-OCT-77 16:31 PAGE 2 61 ; 62 000000 .PSECT $$FILE 63 ; 64 ; PASCAL FILE BLOCK DEFINITION 65 000000 BUFVAR=0 66 000002 EOF=2 67 000003 FILDIR=3 68 000004 MAXSIZ=4 69 000006 FDBPNT=6 70 000010 IOFNC=8. 71 000012 VALID=10. 72 000014 BUFSIZ=12. 73 000016 LUN=14. 74 000017 STATUS=15. 75 000020 DEVTYP=16. 76 000022 DEVNAM=18. 77 000024 LOGNAM=20. 78 000026 BUFPTR=22. 79 000040 BUFFER=32. 80 ; 81 ;MISC CONSTANTS 82 075250 DV.SY=75250 ; .RAD50 /SY/ 83 042420 DV.KB=42420 ; .RAD50 /KB/ 84 012327 LN.CMO=12327 ; .RAD50 /CMO/ 85 012321 LN.CMI=12321 ; .RAD50 /CMI/ 86 000001 OUT=1 87 000002 IN=2 88 ; 89 ;LAYOUT OF GLOBALS: 90 000012 OUTPUT=10. 91 000112 INPUT=74. 92 ; PASLIB -- RUN-TIME SUPPORT MACRO D1013 02-OCT-77 16:31 PAGE 3 $$$000 - INIT 94 .SBTTL $$$000 - INIT 95 ; INIT - INITIALIZE HEAP AND USERS CONSOLE 96 ; PARMS 97 ; R0 -> HEAP 98 ; R5 -> GLOBALS 99 ; REGISTER USAGE 100 ; R0 -> HEAP, SCRATCH 101 ; R1 - SCRATCH 102 ; R2 - NOT USED 103 ; R3 -> (OUT,IN) FILE BLOCKS 104 ; R4 - NOT USED 105 ; CALLS: P$FINT 106 ; 107 000000 $$$000:: 108 ; MAKE DUMMY STACK FRAME 109 000000 FINIT$ ;INITIALIZE RSX-11D FILE SYSTEM 110 000004 010501 MOV R5,R1 111 000006 005021 CLR (R1)+ 112 000010 005021 CLR (R1)+ 113 000012 005021 CLR (R1)+ 114 ; INITIALIZE HEAP 115 000014 010065 000006 MOV R0,6(R5) ;LOCATION OF HEAP 116 000020 012001 MOV (R0)+,R1 ;HEAP SIZE 117 000022 010010 MOV R0,(R0) 118 000024 062720 000006 ADD #6,(R0)+ ;@TOP OF HEAP 119 000030 005020 CLR (R0)+ ;@PREVIOUS HEAP 120 000032 010110 MOV R1,(R0) 121 000034 162710 000010 SUB #8.,(R0) ;CURRENT SIZE 122 ; INITIALIZE CONSOLE OUTPUT 123 000040 010503 MOV R5,R3 124 000042 062703 000012 ADD #OUTPUT,R3 ;R3 -> OUTPUT FILE BLOCK 125 000046 012700 000001 MOV #1,R0 ;BUFVAR SIZE = 1 BYTE 126 000052 012701 000040 MOV #32.,R1 ;BUFSIZ = 32 BYTES 127 000056 004767 000360 JSR PC,P$FINT ;INITIALIZE FILE BLOCK 128 000062 112763 000001 000003 MOVB #OUT,FILDIR(R3) 129 000070 012763 012327 000024 MOV #LN.CMO,LOGNAM(R3) 130 000076 012763 000000G 000010 MOV #IO.WVB,IOFNC(R3) 131 000104 012763 000400 000020 MOV #400,DEVTYP(R3) 132 000112 012763 000005 000016 MOV #5,LUN(R3) 133 ; INITIALIZE CONSOLE INPUT 134 000120 010503 MOV R5,R3 135 000122 062703 000112 ADD #INPUT,R3 136 000126 012700 000001 MOV #1,R0 137 000132 012701 000040 MOV #32.,R1 138 000136 004767 000300 JSR PC,P$FINT 139 000142 112763 000002 000003 MOVB #IN,FILDIR(R3) 140 000150 105063 000002 CLRB EOF(R3) 141 000154 012763 012321 000024 MOV #LN.CMI,LOGNAM(R3) 142 .IF DF RSX11D 143 000162 012763 000010G 000010 MOV #IO.RLB+8.,IOFNC(R3) 144 .IFF 145 MOV #IO.RLB,IOFNC(R3) 146 .ENDC 147 000170 012763 000400 000020 MOV #400,DEVTYP(R3) 148 000176 012763 000005 000016 MOV #5,LUN(R3) 149 ; RETURN 150 000204 000207 RTS PC PASLIB -- RUN-TIME SUPPORT MACRO D1013 02-OCT-77 16:31 PAGE 4 $$$001 - EXIT 152 .SBTTL $$$001 - EXIT 153 ; EXIT - RETURN TO MONITOR 154 ; PARMS 155 ; R5 -> GLOBALS 156 ; REGISTER USAGE 157 ; R0,R1,R2,R3,R4 - NOT USED 158 ; 159 000206 $$$001:: 160 ; EXIT TO MONITOR 161 000206 EXIT$S PASLIB -- RUN-TIME SUPPORT MACRO D1013 02-OCT-77 16:31 PAGE 5 $$$004 - NEW 163 .SBTTL $$$004 - NEW 164 ; GET A BLOCK FROM THE HEAP 165 ; PARMS 166 ; 1. POINTER TO CURRENT HEAP 167 ; 2. SIZE REQUESTED (IN BYTES, WILL BE ROUNDED UP TO MULTIPLE OF FOUR) 168 ; REGISTER USAGE 169 ; R0 = SIZE 170 ; R1 -> CURRENT HEAP 171 ; R2,R3,R4 - NOT USED 172 ; 173 000214 $$$004:: 174 000214 016600 000002 MOV 2(SP),R0 ;SECOND PARM 175 000220 012616 MOV (SP)+,(SP) ;MOVE DOWN RETURN ADDRESS 176 000222 005200 INC R0 ;ROUND UP SIZE TO 177 000224 042700 000001 BIC #1,R0 ;...TO A MULTIPLE OF TWO 178 000230 003414 BLE 5$ ;VALID REQUEST? 179 000232 016601 000002 MOV 2(SP),R1 ;FIRST PARM 180 000236 001411 BEQ 5$ ;ERROR, NO HEAP HEADER 181 000240 160061 000006 SUB R0,6(R1) ;ADJUST CURRENT SIZE 182 000244 002406 BLT 5$ ;NOT ENOUGH ROOM 183 000246 016166 000002 000002 MOV 2(R1),2(SP) ;RETURN POINTER 184 000254 060061 000002 ADD R0,2(R1) ;ADJUST POINTER TO TOP OF HEAP 185 000260 000207 RTS PC 186 ; 187 000262 012766 177777 000002 5$: MOV #-1,2(SP) ;RETURN NIL POINTER JUST IN CASE 188 000270 012746 000010 MOV #10,-(SP) ;PASCAL NEW - HEAP OVERFLOW 189 000274 004767 002544 JSR PC,P$HERR 190 000300 000207 RTS PC PASLIB -- RUN-TIME SUPPORT MACRO D1013 02-OCT-77 16:31 PAGE 6 $$$006 - MARK 192 .SBTTL $$$006 - MARK 193 ; MARK THE HEAP 194 ; PARMS 195 ; 1. POINTER TO POINTER TO CURRENT HEAP 196 ; REGISTER USAGE 197 ; R0 - SCRATCH 198 ; R1 -> CURRENT HEAP POINTER 199 ; R2 -> NEW HEAP 200 ; R3 - SCRATCH 201 ; R4 - NOT USED 202 ; 203 000302 $$$006:: 204 000302 016601 000002 MOV 2(SP),R1 ;PARM 205 000306 012616 MOV (SP)+,(SP) ;MOVE DOWN RETURN ADDRESS 206 000310 011103 MOV (R1),R3 ;R3->HEAP HEADER 207 000312 001422 BEQ 5$ ;ERROR, NO HEAP 208 000314 016300 000006 MOV 6(R3),R0 ;CURRENT SIZE 209 000320 020027 000010 CMP R0,#8. 210 000324 002415 BLT 5$ ;NOT ENOUGH ROOM 211 000326 016302 000002 MOV 2(R3),R2 ;R2->TOP OF HEAP 212 000332 010203 MOV R2,R3 213 000334 010023 MOV R0,(R3)+ ;INITIALIZE HEAP HEADER WITH SIZE, 214 000336 010213 MOV R2,(R3) 215 000340 062723 000010 ADD #8.,(R3)+ ;...POINTER TO TOP OF HEAP, 216 000344 011123 MOV (R1),(R3)+ ;...LINK TO OLD HEAP 217 000346 010013 MOV R0,(R3) 218 000350 162713 000010 SUB #8.,(R3) ;...AND CURRENT SIZE 219 000354 010211 MOV R2,(R1) ;UPDATE CURRENT HEAP POINTER 220 000356 000207 RTS PC 221 ; 222 000360 012746 000011 5$: MOV #11,-(SP) ;PASCAL MARK - HEAP OVERFLOW 223 000364 004767 002454 JSR PC,P$HERR 224 000370 000207 RTS PC PASLIB -- RUN-TIME SUPPORT MACRO D1013 02-OCT-77 16:31 PAGE 7 $$$007 - RELEASE 226 .SBTTL $$$007 - RELEASE 227 ; CUT BACK HEAP TO LAST MARK 228 ; PARMS 229 ; 1. POINTER TO POINTER TO CURRENT HEAP 230 ; REGISTER USAGE 231 ; R0 -> CURRENT HEAP POINTER 232 ; R1 -> CURRENT/DISCARDED HEAP HEADER 233 ; R2,R3,R4 - NOT USED 234 ; 235 000372 $$$007:: 236 000372 016600 000002 MOV 2(SP),R0 ;PARM 237 000376 012616 MOV (SP)+,(SP) ;MOVE DOWN RETURN ADDRESS 238 000400 011001 MOV (R0),R1 ;R1->CURRENT HEAP HEADER 239 000402 001404 BEQ 5$ ;ERROR, NO CURRENT HEAP 240 000404 016110 000004 MOV 4(R1),(R0) ;PREVIOUS HEAP BECOMES CURRENT HEAP 241 000410 001401 BEQ 5$ ;ERROR, NO PREVIOUS HEAP 242 000412 000207 RTS PC 243 ; 244 000414 012746 000012 5$: MOV #12,-(SP) ;PASCAL RELEASE - NO PREVIOUS HEAP 245 000420 004767 002420 JSR PC,P$HERR 246 000424 000207 RTS PC PASLIB -- RUN-TIME SUPPORT MACRO D1013 02-OCT-77 16:31 PAGE 8 $$$016 - FILE BLOCK INIT 248 .SBTTL $$$016 - FILE BLOCK INIT 249 ; FILE BLOCK INITIALIZATION 250 ; PARMS 251 ; 1. POINTER TO FILE BLOCK 252 ; 2. MAXIMUM SIZE OF BUFFER VARIABLE (BYTES) 253 ; 3. BUFFER SIZE (BYTES) 254 ; REGISTER USAGE 255 ; R0 = BUFFER VARIABLE SIZE 256 ; R1 = BUFFER SIZE 257 ; R2 - SCRATCH 258 ; R3 -> FILE BLOCK 259 ; R4 - NOT USED 260 000426 $$$016:: 261 000426 016603 000006 MOV 6.(SP),R3 ;GET FIRST PARM 262 000432 012666 000004 MOV (SP)+,4(SP) ;MOVE DOWN RETURN ADDRESS 263 000436 012601 MOV (SP)+,R1 ;BUFFER SIZE 264 000440 012600 MOV (SP)+,R0 ;MAX SIZE OF BUFFER VARIABLE 265 ; 266 000442 010302 P$FINT: MOV R3,R2 267 000444 010312 MOV R3,(R2) 268 000446 062722 000040 ADD #BUFFER,(R2)+ ;@BUFVAR 269 000452 012722 000001 MOV #1,(R2)+ ;EOF=TRUE 270 000456 010022 MOV R0,(R2)+ ;BUFVAR SIZE 271 000460 005022 CLR (R2)+ ;FDBPNT 272 000462 005022 CLR (R2)+ ;IOFNC 273 000464 005022 CLR (R2)+ ;VALID 274 000466 010122 MOV R1,(R2)+ ;BUFSIZ 275 000470 005022 CLR (R2)+ ;LUN,STATUS 276 000472 005022 CLR (R2)+ ;CLEAR DEVTYP 277 000474 005022 CLR (R2)+ ;CLEAR DEVNAM 278 000476 005022 CLR (R2)+ ;LOGICAL NAME 279 000500 010312 MOV R3,(R2) 280 000502 062722 000040 ADD #BUFFER,(R2)+ ;BUFFER POINTER 281 000506 005022 CLR (R2)+ ;FOUR WORDS UNUSED 282 000510 005022 CLR (R2)+ 283 000512 005022 CLR (R2)+ 284 000514 005022 CLR (R2)+ 285 000516 005012 CLR (R2) ;CLEAR FIRST WORD IN BUFFER 286 000520 000207 RTS PC PASLIB -- RUN-TIME SUPPORT MACRO D1013 02-OCT-77 16:31 PAGE 9 $$$017 - RESET 288 .SBTTL $$$017 - RESET 289 .SBTTL $$$018 - REWRITE 290 ; PARMS: 291 ; 1. POINTER TO PASCAL FILE BLOCK 292 ; 2. POINTER TO ASCII STRING CONTAINING FILE NAME 293 ; 3. A WORD TO BE USED AS LOGICAL NAME FOR $ASSIGN 294 ; TWO ENTRIES TO THIS ROUTINE DIFFER ONLY IN THE 295 ; VALUE THEY LOAD INTO R1 296 ; 297 ; REGISTER USAGE 298 ; R0,R1,R2 - SCRATCH 299 ; R3 -> FILE BLOCK 300 ; R4 - SCRATCH (SAVED AND RESTORED) 301 ; 302 ; 303 000522 $$$017:: 304 000522 012701 000002 MOV #IN,R1 305 000526 000402 BR COMMON 306 ; 307 000530 $$$018:: 308 000530 012701 000001 MOV #OUT,R1 309 ; 310 000534 016603 000006 COMMON: MOV 6(SP),R3 ;GET FIRST PARM 311 000540 012666 000004 MOV (SP)+,4(SP) ;MOVE DOWN RETURN ADDRESS 312 000544 012602 MOV (SP)+,R2 ;GET THIRD PARM 313 000546 012600 MOV (SP)+,R0 ;GET SECOND PARM 314 000550 P$FOPN: 315 ; 316 000550 105763 000003 TSTB FILDIR(R3) ;ALREADY OPENED? 317 000554 001402 BEQ 2$ 318 000556 004767 000372 JSR PC,P$FCLO ;YES, CLOSE IT. 319 ; 320 000562 110163 000003 2$: MOVB R1,FILDIR(R3) ;NEW FILE DIRECTION 321 000566 010263 000024 MOV R2,LOGNAM(R3) ;LOGICAL NAME 322 000572 012763 075250 000022 MOV #DV.SY,DEVNAM(R3) ;...DEVICE NAME, 323 000600 005067 003104 CLR FDSBK ;ZERO DEVICE STRING LENGTH, 324 000604 005067 003104 CLR FDSBK+4 ;DIRECTORY STRING LENGTH, 325 000610 005067 003104 CLR FDSBK+10 ;AND FILENAME LENGTH 326 000614 010001 MOV R0,R1 ;START OF FILE STRING 327 000616 B0: 328 000616 121027 000072 CMPB (R0),#': 329 000622 001012 BNE L0 330 000624 010167 003062 MOV R1,FDSBK+2 ;POINTER TO START OF STRING 331 000630 010002 MOV R0,R2 332 000632 160102 SUB R1,R2 333 000634 005202 INC R2 334 000636 010267 003046 MOV R2,FDSBK ;LENGTH OF DEVICE STRING 335 000642 010001 MOV R0,R1 336 000644 005201 INC R1 ;START OF NEXT STRING 337 000646 000430 BR L1 338 000650 L0: 339 000650 121027 000135 CMPB (R0),#'] 340 000654 001012 BNE L2 341 000656 010167 003034 MOV R1,FDSBK+6 ;POINTER TO START OF STRING 342 000662 010002 MOV R0,R2 343 000664 160102 SUB R1,R2 344 000666 005202 INC R2 PASLIB -- RUN-TIME SUPPORT MACRO D1013 02-OCT-77 16:31 PAGE 9-1 $$$018 - REWRITE 345 000670 010267 003020 MOV R2,FDSBK+4 ;LENGTH OF DIRECTORY STRING 346 000674 010001 MOV R0,R1 347 000676 005201 INC R1 ;START OF NEXT STRING 348 000700 000413 BR L3 349 000702 L2: 350 000702 126027 000001 000040 CMPB 1(R0),#40 351 000710 001007 BNE L4 352 000712 010167 003004 MOV R1,FDSBK+12 ;POINTER TO START OF STRING 353 000716 010002 MOV R0,R2 354 000720 160102 SUB R1,R2 355 000722 005202 INC R2 356 000724 010267 002770 MOV R2,FDSBK+10 ;LENGTH OF FILENAME STRING 357 000730 L4: 358 000730 L3: 359 000730 L1: 360 000730 005200 INC R0 361 000732 121027 000040 CMPB (R0),#40 362 000736 001327 BNE B0 363 000740 005763 000006 TST FDBPNT(R3) 364 000744 001025 BNE L6 365 000746 012700 003202' MOV #FDBPTR,R0 366 000752 B1: 367 000752 005740 TST -(R0) 368 000754 001403 BEQ L7 369 000756 020027 003174' CMP R0,#FDBUSE 370 000762 001373 BNE B1 371 000764 L7: 372 000764 005710 TST (R0) 373 000766 001007 BNE L11 374 000770 005210 INC (R0) 375 000772 062700 000006 ADD #FDBPTR-FDBUSE,R0 376 000776 011000 MOV (R0),R0 377 001000 010063 000006 MOV R0,FDBPNT(R3) 378 001004 000405 BR L12 379 001006 L11: 380 001006 012746 000001 MOV #1,-(SP) 381 001012 CALL P$HERR ;PASCAL RESET/REWRITE - NO FDB SPACE 382 001016 000207 RTS PC 383 001020 L12: 384 001020 L6: 385 001020 016300 000006 MOV FDBPNT(R3),R0 386 001024 011360 000022 MOV (R3),F.URBD+2(R0) ;PASCAL BUFFER ADDRESS 387 001030 132763 000002 000003 BITB #IN,FILDIR(R3) 388 001036 001020 BNE 106$ 389 001040 OPEN$W R0 390 001052 103034 BCC 10$ 391 001054 105063 000002 CLRB EOF(R3) 392 001060 142763 000003 000003 111$: BICB #IN!OUT,FILDIR(R3) 393 001066 012746 000002 MOV #2,-(SP) 394 001072 004767 001746 JSR PC,P$HERR ;PASCAL RESET - FILE NOT FOUND 395 ;PASCAL REWRITE - UNABLE TO OPEN FILE 396 001076 000207 RTS PC 397 001100 106$: OPEN$R R0 398 001112 103004 BCC 107$ 399 001114 112763 000001 000002 MOVB #1,EOF(R3) 400 001122 000756 BR 111$ 401 001124 105063 000002 107$: CLRB EOF(R3) ;YES, FALSE => EOF PASLIB -- RUN-TIME SUPPORT MACRO D1013 02-OCT-77 16:31 PAGE 9-2 $$$018 - REWRITE 402 001130 032763 000400 000020 BIT #400,DEVTYP(R3) ;IS IT A TERMINAL? 403 001136 001002 BNE 10$ 404 001140 004767 000152 JSR PC,P$FFST ;NO, GET FIRST BUFFERFULL 405 001144 000207 10$: RTS PC 406 ; PASLIB -- RUN-TIME SUPPORT MACRO D1013 02-OCT-77 16:31 PAGE 10 $$$020 - CLOSE 408 .SBTTL $$$020 - CLOSE 409 ; PARMS: 410 ; 1. FILE BLOCK 411 ; REGISTER USAGE 412 ; R0,R1,R2 - NOT USED 413 ; R3 -> FILE BLOCK 414 ; R4 - NOT USED 415 ; CALLS: P$FBRK 416 ; 417 001146 $$$020:: 418 001146 016603 000002 MOV 2(SP),R3 419 001152 012616 MOV (SP)+,(SP) 420 ; 421 001154 105763 000003 P$FCLO: TSTB FILDIR(R3) ;WAS FILE OPEN? 422 001160 001410 BEQ 1$ ;IF NOT, SKIP ALL OF THIS 423 001162 004767 000514 JSR PC,P$FBRK ;YES, DUMP FINAL BUFFER(IF OUTPUT) 424 ; 425 001166 010046 MOV R0,-(SP) 426 001170 016300 000006 MOV FDBPNT(R3),R0 427 001174 CLOSE$ R0 428 001200 012600 MOV (SP)+,R0 429 ; 430 001202 000207 1$: RTS PC PASLIB -- RUN-TIME SUPPORT MACRO D1013 02-OCT-77 16:31 PAGE 11 $$$021 - GET 432 .SBTTL $$$021 - GET 433 ; PARMS 434 ; 1. FILE BLOCK 435 ; 2. SIZE OF LAST BUFFER VARIABLE 436 ; REGISTER USAGE 437 ; R0 = SIZE OF LAST BUFFER VARIABLE 438 ; R1 -> START OF LEFTOVERS IN BUFFER 439 ; R2 - SCRATCH 440 ; R3 -> FILE BLOCK 441 ; R4 - NOT USED 442 ; CALLS: P$FNXT 443 ; 444 001204 $$$021:: 445 001204 016603 000004 MOV 4(SP),R3 446 001210 012666 000002 MOV (SP)+,2(SP) 447 001214 012600 MOV (SP)+,R0 448 ; 449 001216 105763 000002 P$FGET: TSTB EOF(R3) ;PASCAL EOF SET 450 001222 001030 BNE ERR001 ;IT MUST NOT BE 451 001224 060013 ADD R0,(R3) ;BUMP BUFFER VARIABLE POINTER 452 001226 160063 000012 SUB R0,VALID(R3) ;REDUCE SIZE OF REMAINING DATA 453 001232 026363 000012 000004 CMP VALID(R3),MAXSIZ(R3) ;IS THERE ENOUGH DATA FOR THIS 454 001240 002020 BGE 1$ ;...BUFFER VARIABLE 455 001242 011302 MOV (R3),R2 ;R2 -> LEFTOVERS (IF ANY) 456 001244 010301 MOV R3,R1 457 001246 062701 000040 ADD #BUFFER,R1 ;R1 -> START OF BUFFER 458 001252 010113 MOV R1,(R3) ;NEW BUFFER VARIABLE POINTER 459 001254 016300 000012 MOV VALID(R3),R0 ;NO, GET SIZE OF LEFTOVERS IN R0 460 001260 003002 BGT 3$ 461 001262 005000 CLR R0 ;JUST IN CASE 462 001264 000404 BR 2$ ;SKIP THE MOVE 463 ; MOVE LEFTOVER DATA TO THE FRONT OF THE BUFFER 464 001266 112221 3$: MOVB (R2)+,(R1)+ 465 001270 077002 SOB R0,3$ 466 001272 016300 000012 MOV VALID(R3),R0 ;RESTORE SIZE OF LEFTOVERS 467 ; 468 001276 004767 000016 2$: JSR PC,P$FNXT ;GET NEXT BUFFERFULL 469 001302 000207 1$: RTS PC ;...AND RETURN 470 ; 471 ; 472 001304 012746 000003 ERR001: MOV #3,-(SP) ;PASCAL GET - EOF ON GET 473 001310 004767 001530 JSR PC,P$HERR 474 001314 000207 RTS PC PASLIB -- RUN-TIME SUPPORT MACRO D1013 02-OCT-77 16:31 PAGE 12 $$$021 - GET 476 ; SUBROUTINE TO GET (FIRST) NEXT BUFFERFULL 477 ; EXPECTS 478 ; R0 = SIZE OF LEFTOVERS 479 ; R3 -> FILE BLOCK 480 ; REGISTER USAGE 481 ; R0 = SIZE OF LEFTOVERS, SCRATCH 482 ; R1,R2 - SCRATCH 483 ; R3 -> FILE BLOCK 484 ; R4 - NOT USED 485 ; 486 001316 005000 P$FFST: CLR R0 ;FIRST BUFFER, NO LEFTOVERS 487 001320 132763 000002 000003 P$FNXT: BITB #IN,FILDIR(R3) ;OPENED FOR INPUT? 488 001326 001457 BEQ GES01 ;IF NOT, SKIP ALL OF THIS 489 001330 032763 000400 000020 BIT #400,DEVTYP(R3) ;TERMINAL???? 490 001336 001063 BNE GESTRM 491 001340 016346 000014 MOV BUFSIZ(R3),-(SP) ;SAVE BUFFER SIZE 492 001344 160063 000014 SUB R0,BUFSIZ(R3) ;REDUCE BUFFER SIZE FOR THIS READ 493 001350 011301 MOV (R3),R1 ;GET POINTER TO START OF BUFFER 494 001352 060001 ADD R0,R1 ;INCREASE BY LEFTOVERS 495 001354 010046 MOV R0,-(SP) ;SAVE SIZE OF LEFTOVERS 496 001356 016302 000014 MOV BUFSIZ(R3),R2 497 001362 016300 000006 MOV FDBPNT(R3),R0 498 001366 GES: 499 001366 GET$ R0,R1,R2 ;GET NEXT RECORD 500 001402 103432 BCS GES3 ;GET ERROR CHECK FOR END OF FILE 501 001404 016063 000024 000012 MOV F.NRBD(R0),VALID(R3) ;NUMBER OF BYTES IN THE RECORD 502 001412 001765 BEQ GES ;ZERO LENGTH RECORD, REPEAT GET 503 001414 132760 000000G 000001 BITB #FD.CR,F.RATT(R0) ;IS IT A TEXT FILE? 504 001422 001406 BEQ GES0 ;NO, TREAT AS BINARY 505 001424 066301 000012 ADD VALID(R3),R1 ;POINT TO END OF BUFFER 506 001430 112721 000012 MOVB #12,(R1)+ ;INSERT LINE FEED TO INDICATE ENDOFLINE 507 001434 005263 000012 INC VALID(R3) 508 001440 GES0: 509 001440 012600 MOV (SP)+,R0 ;RESTORE SIZE OF LETOVERS 510 001442 012663 000014 MOV (SP)+,BUFSIZ(R3);RESTORE BUFFER SIZE 511 001446 066300 000012 ADD VALID(R3),R0 ;ADD NR OF BYTES JUST READ TO LEFTOVERS 512 001452 010063 000012 GES00:: MOV R0,VALID(R3) ;UPDATE VALID 513 001456 003003 BGT GES01 ;IF ANY VALID DATA THEN SKIP THE NEXT 514 001460 GES2: 515 001460 112763 000001 000002 MOVB #1,EOF(R3) ;SET PASCAL EOF TO TRUE 516 001466 000207 GES01: RTS PC 517 ; 518 001470 122760 000000G 000052 GES3: CMPB #IE.EOF,F.ERR(R0) ;END OF FILE 519 001476 001302 BNE ERR001 520 001500 005063 000012 CLR VALID(R3) ;NO VALID DATA 521 001504 000755 BR GES0 522 ; 523 001506 016367 000010 000050 GESTRM: MOV IOFNC(R3),$$QIOW+Q.IOFN 524 001514 116367 000016 000044 MOVB LUN(R3),$$QIOW+Q.IOLU 525 001522 011367 000050 MOV (R3),$$QIOW+Q.IOPL 526 001526 012767 000001 000044 MOV #1,$$QIOW+Q.IOPL+2 527 001534 DIR$ #$$QIOW 528 001542 022767 177770 000034 CMP #-10,IOST 529 001550 001743 BEQ GES2 530 001552 016763 000030 000012 MOV IOST+2,VALID(R3) 531 001560 000207 RTS PC 532 ; PASLIB -- RUN-TIME SUPPORT MACRO D1013 02-OCT-77 16:31 PAGE 12-1 $$$021 - GET 533 001562 $$QIOW: QIOW$ IO.RVB,1,32.,50.,IOST,, 534 001604 000000 000000 IOST: .WORD 0,0 PASLIB -- RUN-TIME SUPPORT MACRO D1013 02-OCT-77 16:31 PAGE 13 $$$022 - PUT 536 .SBTTL $$$022 - PUT 537 ; PARMS 538 ; 1. POINTER TO FILE BLOCK 539 ; 2. SIZE OF BUFFER VARIABLE TO PUT 540 ; REGISTER USE 541 ; R0 = SIZE OF BUFFER VARIABLE 542 ; R1,R2 - NOT USED 543 ; R3 -> FILE BLOCK 544 ; R4 - NOT USED 545 ; CALLS: P$FBRK 546 ; 547 001610 $$$022:: 548 001610 016603 000004 MOV 4(SP),R3 549 001614 012666 000002 MOV (SP)+,2(SP) 550 001620 012600 MOV (SP)+,R0 551 ; 552 001622 105763 000002 P$FPUT: TSTB EOF(R3) ;YES, IS EOF SET? 553 001626 001415 BEQ ERR002 554 001630 060013 ADD R0,(R3) ;YES, BUMP BUFFER VARIABLE POINTER 555 001632 066300 000012 ADD VALID(R3),R0 ;R0=NEW SIZE OF VALID DATA 556 001636 010063 000012 MOV R0,VALID(R3) ;UPDATE VALID 557 001642 066300 000004 ADD MAXSIZ(R3),R0 ;CHECK TO SEE IF THERE IS ROOM 558 001646 020063 000014 CMP R0,BUFSIZ(R3) ;...ENOUGH FOR NEXT BUFFER VARIABLE 559 001652 003402 BLE 1$ 560 001654 004767 000022 JSR PC,P$FBRK ;NOT ENOUGH ROOM, FLUSH THE BUFFER 561 ; 562 001660 000207 1$: RTS PC 563 ; 564 ; 565 001662 012746 000004 ERR002: MOV #4,-(SP) ;PASCAL PUT - NO EOF ON PUT 566 001666 004767 001152 JSR PC,P$HERR 567 001672 000207 RTS PC PASLIB -- RUN-TIME SUPPORT MACRO D1013 02-OCT-77 16:31 PAGE 14 $$$023 - BREAK 569 .SBTTL $$$023 - BREAK 570 ; PARMS 571 ; 1. POINTER TO FILE BLOCK 572 ; REGISTER USE 573 ; R0,R1,R2 - NOT USED 574 ; R3 -> FILE BLOCK 575 ; R4 - NOT USED 576 ; 577 001674 $$$023:: 578 001674 016603 000002 MOV 2(SP),R3 579 001700 012616 MOV (SP)+,(SP) 580 ; 581 001702 132763 000001 000003 P$FBRK: BITB #OUT,FILDIR(R3) ;OPENED FOR OUTPUT? 582 001710 001434 BEQ 1$ 583 001712 005763 000012 TST VALID(R3) ;ANY VALID DATA 584 001716 003431 BLE 1$ 585 001720 032763 000400 000020 BIT #400,DEVTYP(R3) ;TERMINAL? 586 001726 001026 BNE 2$ 587 001730 010046 MOV R0,-(SP) 588 001732 010146 MOV R1,-(SP) 589 001734 016300 000006 MOV FDBPNT(R3),R0 590 001740 016360 000012 000024 MOV VALID(R3),F.NRBD(R0) 591 001746 010301 MOV R3,R1 592 001750 062701 000040 ADD #BUFFER,R1 593 001754 PUT$ R0,R1 594 001764 012601 MOV (SP)+,R1 595 001766 012600 MOV (SP)+,R0 596 001770 010313 3$: MOV R3,(R3) ;RE-INITIALIZE BUFFER VARIABLE POINTER 597 001772 062713 000040 ADD #BUFFER,(R3) 598 001776 005063 000012 CLR VALID(R3) ;...AND COUNT 599 ; 600 002002 000207 1$: RTS PC 601 ; 602 002004 016367 000010 177552 2$: MOV IOFNC(R3),$$QIOW+Q.IOFN 603 002012 116367 000016 177546 MOVB LUN(R3),$$QIOW+Q.IOLU 604 002020 010346 MOV R3,-(SP) 605 002022 062716 000040 ADD #BUFFER,(SP) 606 002026 012667 177544 MOV (SP)+,$$QIOW+Q.IOPL 607 002032 016367 000012 177540 MOV VALID(R3),$$QIOW+Q.IOPL+2 608 002040 DIR$ #$$QIOW 609 002046 000750 BR 3$ PASLIB -- RUN-TIME SUPPORT MACRO D1013 02-OCT-77 16:31 PAGE 15 $$$024 - READ CHARACTER 611 .SBTTL $$$024 - READ CHARACTER 612 ; PARMS 613 ; 1. POINTER TO FILE BLOCK 614 ; 2. POINTER TO CHARACTER 615 ; REGISTER USAGE 616 ; R0 - SIZE OF BUFFER VARIABLE 617 ; R1,R2 - USED BY P$FGET 618 ; R3 -> FILE BLOCK 619 ; R4 - NOT USED 620 ; CALLS: P$FGET 621 ; 622 002050 $$$024:: 623 002050 016603 000004 MOV 4(SP),R3 624 002054 012666 000002 MOV (SP)+,2(SP) 625 ; 626 002060 032763 000400 000020 P$FRDC: BIT #400,DEVTYP(R3) ;TERMINAL? 627 002066 001007 BNE 1$ 628 ; 629 002070 117336 000000 MOVB @(R3),@(SP)+ ;NO, MOVE THEN GET 630 002074 012700 000001 MOV #1,R0 631 002100 004767 177112 JSR PC,P$FGET 632 002104 000406 BR 2$ 633 ; 634 002106 012700 000001 1$: MOV #1,R0 ;YES, GET THEN MOVE 635 002112 004767 177100 JSR PC,P$FGET 636 002116 117336 000000 MOVB @(R3),@(SP)+ 637 ; 638 002122 000207 2$: RTS PC PASLIB -- RUN-TIME SUPPORT MACRO D1013 02-OCT-77 16:31 PAGE 16 $$$025 - WRITE CHARACTER 640 .SBTTL $$$025 - WRITE CHARACTER 641 ; PARMS 642 ; 1. POINTER TO FILE BLOCK 643 ; 2. CHARACTER 644 ; 3. WIDTH OF FIELD 645 ; REGISTER USAGE 646 ; R0 - BUFFER VARIABLE SIZE 647 ; R1 - HOLDS PAD CHAR TO P$FPAD 648 ; R2 - NOT USED 649 ; R3 -> FILE BLOCK 650 ; R4 - NOT USED 651 ; CALLS: P$FPUT,P$FPAD 652 ; RASH ASSUMPTION: P$FPUT DOES NOT DISTURB R2,R3 653 ; 654 002124 $$$025:: 655 002124 016603 000006 MOV 6(SP),R3 656 002130 012666 000004 MOV (SP)+,4(SP) 657 002134 012602 MOV (SP)+,R2 658 ; 659 002136 121627 000012 P$FWRC: CMPB (SP),#12 ;IS CHAR A LINE FEED? 660 002142 001007 BNE 1$ 661 ; 662 002144 112773 000015 000000 MOVB #15,@(R3) ;YES, SYSTEM LIKES TO SEE A 663 002152 012700 000001 MOV #1,R0 ;...CR BEFORE EVERY LF 664 002156 004767 177440 JSR PC,P$FPUT 665 ; 666 002162 112673 000000 1$: MOVB (SP)+,@(R3) ;MOVE THE CHAR INTO THE BUFFER 667 002166 012700 000001 MOV #1,R0 ;AND PUT 668 002172 004767 177424 JSR PC,P$FPUT 669 ; 670 002176 012701 000040 MOV #' ,R1 ; PAD CHAR IS BLANK 671 002202 005302 DEC R2 ;WIDTH - 1 IS NR OF PADS 672 002204 004767 000104 JSR PC,P$FPAD 673 ; 674 002210 000207 RTS PC PASLIB -- RUN-TIME SUPPORT MACRO D1013 02-OCT-77 16:31 PAGE 17 $$$027 - WRITE STRING 676 .SBTTL $$$027 - WRITE STRING 677 ; PARMS 678 ; 1. POINTER TO FILE BLOCK 679 ; 2. POINTER TO STRING 680 ; 3. LENGTH OF STRING 681 ; 4. WIDTH OF FIELD 682 ; REGISTER USAGE 683 ; R0 - SIZE OF BUFFER VARIABLE 684 ; R1 - HOLDS PAD CHAR TO P$FPAD 685 ; R2 - SCRATCH 686 ; R3 -> FILE BLOCK 687 ; R4 - NOT USED 688 ; CALLS: P$FPUT,P$FPAD 689 ; RASH ASSUMPTION: P$FPUT DOES NOT DISTURB R2,R3 690 ; 691 002212 $$$027:: 692 002212 016603 000010 MOV 8.(SP),R3 693 002216 012666 000006 MOV (SP)+,6(SP) 694 ; 695 002222 005716 TST (SP) ;WIDTH > 0? 696 002224 003002 BGT 1$ 697 ; 698 002226 016616 000002 MOV 2(SP),(SP) ;NO, MAKE IT SAME AS LENGTH 699 002232 166616 000002 1$: SUB 2(SP),(SP) ;WIDTH NOW IS NR OF BLANKS FOR PADDING 700 002236 002002 BGE 4$ 701 002240 061666 000002 ADD (SP),2(SP) ;LENGTH IS NOW FIELD WIDTH 702 002244 4$: 703 002244 016602 000002 MOV 2(SP),R2 ;GET LENGTH 704 002250 002412 BLT 2$ ;IF LENGTH <= 0, SKIP STRING OUTPUT 705 ; 706 002252 117673 000004 000000 3$: MOVB @4(SP),@(R3) ;MOVE A CHAR 707 002260 005266 000004 INC 4(SP) ;BUMP POINTER 708 002264 012700 000001 MOV #1,R0 ;AND PUT 709 002270 004767 177326 JSR PC,P$FPUT 710 002274 077212 SOB R2,3$ 711 ; 712 002276 012701 000040 2$: MOV #' ,R1 ; PAD CHAR IS BLANK 713 002302 012602 MOV (SP)+,R2 ;GET WIDTH OF PAD 714 002304 022626 CMP (SP)+,(SP)+ ;DISCARD LENGTH AND POINTER TO STRING 715 002306 004767 000002 JSR PC,P$FPAD ;OUTPUT TRAILING BLANKS (IF ANY) 716 ; 717 002312 000207 RTS PC PASLIB -- RUN-TIME SUPPORT MACRO D1013 02-OCT-77 16:31 PAGE 18 $$$027 - WRITE STRING 719 ; P$FPAD - PUTS OUT PAD CHARACTERS 720 ; EXPECTS 721 ; R1 = PAD CHARACTER 722 ; R2 = CHARACTER COUNT 723 ; R3 -> FILE BLOCK 724 ; REGISTER USAGE 725 ; R0 - BUFFER VARIABLE SIZE 726 ; R1 - CHARACTER FOR PAD 727 ; R2 - COUNTER 728 ; R3 -> FILE BLOCK 729 ; R4 - NOT USED 730 ; CALLS: P$FPUT 731 ; RASH ASSUMPTION: P$FPUT DOES NOT DISTURB R1, R2 732 ; 733 002314 005702 P$FPAD: TST R2 734 002316 003407 BLE 1$ 735 ; 736 002320 110173 000000 2$: MOVB R1,@(R3) 737 002324 012700 000001 MOV #1,R0 738 002330 004767 177266 JSR PC,P$FPUT 739 002334 077207 SOB R2,2$ 740 ; 741 002336 000207 1$: RTS PC PASLIB -- RUN-TIME SUPPORT MACRO D1013 02-OCT-77 16:31 PAGE 19 $$$030 - READ INTEGER 743 .SBTTL $$$030 - READ INTEGER 744 ; PARMS 745 ; 1. POINTER TO FILE BLOCK 746 ; 2. POINTER TO INTEGER VARIABLE 747 ; REGISTERS 748 ; R0 - SCRATCH 749 ; R1 - SCRATCH 750 ; R2 - SCRATCH, VALUE OF CONVERTED INTEGER 751 ; R3 -> FILE BLOCK 752 ; R4 -> SCRATCH 753 ; CALLS: P$FGET, P$TCAI 754 002340 $$$030:: 755 002340 016603 000004 MOV 4(SP),R3 ; UNPACK PARMS--GET -> FILE BLOCK 756 002344 012666 000002 MOV (SP)+,2(SP) ; SAVE RETURN ADDR. 757 002350 122773 000040 000000 1$: CMPB #' ,@(R3) ; IGNORE CONTROL CHARS & SPACES 758 002356 002405 BLT 2$ 759 002360 012700 000001 MOV #1,R0 760 002364 004767 176626 JSR PC,P$FGET 761 002370 000767 BR 1$ 762 002372 012700 000001 2$: MOV #1,R0 763 002376 122773 000053 000000 CMPB #'+,@(R3) ; CHECK FOR SIGN 764 002404 001005 BNE 4$ 765 002406 004767 176604 JSR PC,P$FGET ; BUMP PAST '+' 766 002412 004767 000030 3$: JSR PC,P$TCAI ; CONVERT FOLLOWING INTEGER 767 002416 000411 BR 5$ 768 002420 122773 000055 000000 4$: CMPB #'-,@(R3) 769 002426 001371 BNE 3$ ; NO SIGN--JUST CONVERT 770 002430 004767 176562 JSR PC,P$FGET ; BUMP PAST '-' 771 002434 004767 000006 JSR PC,P$TCAI ; CONVERT 772 002440 005402 NEG R2 ; NEGATE 773 002442 010236 5$: MOV R2,@(SP)+ ; STORE RESULT, POP STACK 774 002444 000207 RTS PC ; GO HOME PASLIB -- RUN-TIME SUPPORT MACRO D1013 02-OCT-77 16:31 PAGE 20 $$$030 - READ INTEGER 776 ;P$TCAI - CONVERT ASCII TO INTEGER 777 ; EXPECTS 778 ; R3 -> FILE BLOCK 779 ; REGISTER USAGE 780 ; R0 - SCRATCH 781 ; R1 - SCRATCH 782 ; R2 - FINAL VALUE RETURNED 783 ; R3 -> FILE BLOCK 784 ; R4 - SCRATCH 785 ; CALLS: P$FGET 786 002446 P$TCAI: 787 002446 010446 MOV R4,-(SP) ; SAVE R4 788 002450 005046 CLR -(SP) ; TEMP FOR CONVERTED VALUE 789 002452 117304 000000 1$: MOVB @(R3),R4 ; NEXT (FIRST) DIGIT 790 002456 162704 000060 SUB #'0,R4 791 002462 002415 BLT 2$ ; QUIT ON NON-DIGIT 792 002464 022704 000011 CMP #9.,R4 793 002470 002412 BLT 2$ ; MUST BE IN RANGE 0..9 794 002472 012601 MOV (SP)+,R1 795 002474 070127 000012 MUL #10.,R1 ; SINGLE PRECISION MULT. 796 002500 060401 ADD R4,R1 ; ADD IN LAST DIGIT 797 002502 010146 MOV R1,-(SP) ; HOLD INTERMEDIATE RESULT 798 002504 012700 000001 MOV #1,R0 ; # BYTES... 799 002510 004767 176502 JSR PC,P$FGET ; ...TO GET 800 002514 000756 BR 1$ ; GET NEXT DIGIT 801 ; 802 002516 012602 2$: MOV (SP)+,R2 ; POP RETURN VALUE 803 002520 012604 MOV (SP)+,R4 ; RESTORE R4 804 002522 000207 RTS PC ; AND GO HOME PASLIB -- RUN-TIME SUPPORT MACRO D1013 02-OCT-77 16:31 PAGE 21 $$$031 - WRITE INTEGER 806 .SBTTL $$$031 - WRITE INTEGER 807 ; PARMS 808 ; 1. POINTER TO FILE BLOCK 809 ; 2. INTEGER TO BE OUTPUT 810 ; 3. WIDTH OF FIELD 811 ; REGISTER USAGE 812 ; R0 - INPUT VALUE 813 ; R1 - WIDTH, PAD CHAR TO P$FPAD 814 ; R2 -> CONVERTED STRING 815 ; R3 -> FILE BLOCK 816 ; R4 - NOT USED 817 ; CALLS: P$FPAD, P$TCIA, P$FPUT 818 ; 819 002524 $$$031:: 820 002524 016603 000006 MOV 6(SP),R3 ; UNPACK STACK FRAME; -> FILE BLOCK 821 002530 012666 000004 MOV (SP)+,4(SP) ; RETURN ADDRESS 822 002534 016600 000002 MOV 2(SP),R0 ; INTEGER 823 002540 010602 MOV SP,R2 824 002542 162706 000006 SUB #6,SP ; FOR CONVERTED STRING 825 002546 010246 MOV R2,-(SP) 826 002550 005700 TST R0 827 002552 002403 BLT 1$ 828 002554 004767 000120 JSR PC,P$TCIA 829 002560 000405 BR 2$ 830 002562 005400 1$: NEG R0 831 002564 004767 000110 JSR PC,P$TCIA 832 002570 112742 000055 MOVB #'-,-(R2) ; MINUS SIGN 833 002574 160216 2$: SUB R2,(SP) 834 002576 016601 000010 MOV 8.(SP),R1 ; GIVEN WIDTH 835 002602 003002 BGT 6$ 836 002604 005001 CLR R1 ; NO WIDTH SPECIFIED - NO PAD NEEDED 837 002606 000412 BR 4$ 838 002610 161601 6$: SUB (SP),R1 ; COMPUTE PAD LENGTH 839 002612 002010 BGE 4$ ; INSERT STARS IF NEG 840 002614 005726 TST (SP)+ 841 002616 016602 000006 MOV 6(SP),R2 842 002622 112701 000052 MOVB #'*,R1 843 002626 004767 177462 JSR PC,P$FPAD 844 002632 000417 BR 5$ 845 002634 010246 4$: MOV R2,-(SP) 846 002636 010102 MOV R1,R2 847 002640 112701 000040 MOVB #' ,R1 848 002644 004767 177444 JSR PC,P$FPAD 849 002650 012602 MOV (SP)+,R2 850 002652 012601 MOV (SP)+,R1 851 002654 112273 000000 7$: MOVB (R2)+,@(R3) 852 002660 012700 000001 MOV #1,R0 853 002664 004767 176732 JSR PC,P$FPUT 854 002670 077107 SOB R1,7$ 855 002672 062706 000012 5$: ADD #10.,SP ; CUT BACK STACK 856 002676 000207 RTS PC PASLIB -- RUN-TIME SUPPORT MACRO D1013 02-OCT-77 16:31 PAGE 22 $$$031 - WRITE INTEGER 858 ; P$TCIA - CONVERT INTEGER TO ASCII 859 ; EXPECTS 860 ; R0 - INTEGER 861 ; R2 -> BUFFER FOR CONVERTED STRING 862 ; REGISTER USAGE 863 ; R0 - SCRATCH 864 ; R1 - SCRATCH 865 ; R2 -> BUFFER 866 ; R3 - NOT USED 867 ; R4 - NOT USED 868 ; CALLS: NONE 869 ; 870 002700 P$TCIA: 871 002700 010001 1$: MOV R0,R1 872 002702 005000 CLR R0 873 002704 071027 000012 DIV #10.,R0 874 002710 062701 000060 ADD #'0,R1 875 002714 110142 MOVB R1,-(R2) 876 002716 005700 TST R0 877 002720 001367 BNE 1$ 878 002722 000207 RTS PC PASLIB -- RUN-TIME SUPPORT MACRO D1013 02-OCT-77 16:31 PAGE 23 $$$039 - WRITE OCTAL 880 .SBTTL $$$039 - WRITE OCTAL 881 ; PARMS 882 ; 1. POINTER TO FILE BLOCK 883 ; 2. INTEGER TO BE OUTPUT 884 ; 3. WIDTH OF FIELD (>= 6) 885 ; REGISTER USAGE 886 ; R0 - SCRATCH 887 ; R1 - PAD CHARACTER, VALUE TO CONVERT 888 ; R2 - PAD COUNT, LOOP COUNT 889 ; R3 -> FILE BLOCK 890 ; R4 - NOT USED 891 ; CALLS: P$FPAD, P$FPUT 892 ; 893 002724 $$$039:: 894 002724 016603 000006 MOV 6(SP),R3 ; UNPACK STACK FRAME; -> FILE BLOCK 895 002730 012666 000004 MOV (SP)+,4(SP) ; RETURN ADDRESS 896 002734 012602 MOV (SP)+,R2 ; WIDTH OF FIELD 897 002736 003417 BLE 2$ 898 002740 162702 000006 SUB #6,R2 899 002744 003010 BGT 1$ ; PAD WITH BLANKS 900 002746 001413 BEQ 2$ ; NO PADDING 901 002750 012701 000052 MOV #'*,R1 ; PAD WITH *'S 902 002754 005402 NEG R2 903 002756 004767 177332 JSR PC,P$FPAD 904 002762 005726 TST (SP)+ 905 002764 000426 BR 3$ 906 002766 012701 000040 1$: MOV #' ,R1 907 002772 004767 177316 JSR PC,P$FPAD ; OUTPUT BLANKS 908 002776 012702 000006 2$: MOV #6,R2 909 003002 012601 MOV (SP)+,R1 ; INTEGER VALUE 910 003004 005000 CLR R0 911 003006 073027 000001 ASHC #1,R0 ; 1ST DIGIT IS ONE BIT 912 003012 062700 000060 4$: ADD #'0,R0 ; CONVERT TO DIGIT 913 003016 110073 000000 MOVB R0,@(R3) 914 003022 012700 000001 MOV #1,R0 ; UPDATE ONE BYTE 915 003026 004767 176570 JSR PC,P$FPUT 916 003032 005000 CLR R0 917 003034 073027 000003 ASHC #3,R0 ; NEXT DIGIT 918 003040 077214 SOB R2,4$ 919 003042 000207 3$: RTS PC PASLIB -- RUN-TIME SUPPORT MACRO D1013 02-OCT-77 16:31 PAGE 24 P$HERR - ERROR OUTPUT 921 .SBTTL P$HERR - ERROR OUTPUT 922 ; 923 ; ERROR OUTPUT 924 ; 925 ; ERROR SUMMARY: 926 ; 927 ; 1 - RESET/REWRITE - NO FDB SPACE 928 ; 2 - RESET - FILE NOT FOUND 929 ; 3 - GET - EOF ON INPUT 930 ; 4 - PUT - NO EOF ON OUTPUT 931 ; 10 - NEW - HEAP OVERFLOW 932 ; 11 - MARK - HEAP OVERFLOW 933 ; 12 - RELEASE - NO PREVIOUS HEAP 934 ; 935 003044 016601 000002 P$HERR: MOV 2(SP),R1 ;ERROR CODE 936 003050 012616 MOV (SP)+,(SP) ;PUSH DOWN RETURN ADDRESS 937 003052 012700 003166' MOV #ASCBUF,R0 ;ADDRESS FOR ASCII STRING 938 003056 005002 CLR R2 939 003060 CALL $CBDMG ;CONVERT TO ASCII 940 003064 162700 003126' SUB #MASK,R0 ;STRING LENGTH 941 003070 010067 176504 MOV R0,$$QIOW+Q.IOPL+2 942 003074 012767 003126' 176474 MOV #MASK,$$QIOW+Q.IOPL 943 003102 012767 000005 176456 MOV #5,$$QIOW+Q.IOLU 944 003110 012767 000000G 176446 MOV #IO.WVB,$$QIOW+Q.IOFN 945 003116 DIR$ #$$QIOW 946 003124 000207 RTS PC 947 ; 948 ; 949 003126 015 012 120 MASK: .ASCII <15><12>/PASCAL RUN-TIME ERROR NUMBER: / 003131 101 123 103 003134 101 114 040 003137 122 125 116 003142 055 124 111 003145 115 105 040 003150 105 122 122 003153 117 122 040 003156 116 125 115 003161 102 105 122 003164 072 040 950 003166 040 040 040 ASCBUF: .ASCII / / 003171 040 040 040 951 000046 MASKL=.-MASK 952 .EVEN 953 ; PASLIB -- RUN-TIME SUPPORT MACRO D1013 02-OCT-77 16:31 PAGE 25 FILES11 INTERFACE DATA 955 .SBTTL FILES11 INTERFACE DATA 956 ; 957 ; 958 ; RSX-11D INTERFACE DATA AREAS 959 ; 960 ; FDBUSE AND FDBPTR MUST ALWAYS APPEAR IN ORDER 961 003174 000000 000000 000000 FDBUSE: .WORD 0,0,0 ;FDB USAGE INDICATORS 962 003202 003210' 003350' 003510' FDBPTR: .WORD FDB001,FDB002,FDB003 963 003210 FDB001: FDBDF$ 964 003350 FDAT$A R.VAR 965 003350 FDRC$A ,FCBREC,1 966 003350 FDOP$A 1,FDSBK,FCBDFB,FO.WRT 967 003350 FDBF$A 32.,,1 968 003350 FDB002: FDBDF$ 969 003510 FDAT$A R.VAR 970 003510 FDRC$A ,FCBREC,1 971 003510 FDOP$A 2,FDSBK,FCBDFB,FO.WRT 972 003510 FDBF$A 32.,,1 973 003510 FDB003: FDBDF$ 974 003650 FDAT$A R.VAR 975 003650 FDRC$A ,FCBREC,1 976 003650 FDOP$A 3,FDSBK,FCBDFB,FO.WRT 977 003650 FDBF$A 32.,,1 978 003650 000000 FCBREC: .WORD 0 979 003652 FCBDFB: NMBLK$ PASCAL,TMP,,SY,0 980 003710 000000 000000 FDSBK: .WORD 0,0 981 003714 000000 000000 .WORD 0,0 982 003720 000000 000000 .WORD 0,0 983 ; 984 003724 FSRSZ$ 3 985 000001 .END PASLIB -- RUN-TIME SUPPORT MACRO D1013 02-OCT-77 16:31 PAGE 25-1 SYMBOL TABLE ASCBUF 003166R 003 F.BKVB= 000064 GES 001366R 003 N.FVER= 000016 S.FNTY= 000004 BUFFER= 000040 F.CHR = 000075 GESTRM 001506R 003 N.NEXT= 000022 S.FTYP= 000002 BUFPTR= 000026 F.CNTG= 000034 GES0 001440R 003 N.STAT= 000020 S.NFEN= 000020 BUFSIZ= 000014 F.DFNB= 000046 GES00 001452RG 003 N.UNIT= 000034 VALID = 000012 BUFVAR= 000000 F.DSPT= 000044 GES01 001466R 003 OUT = 000001 $CBDMG= ****** GX B0 000616R 003 F.DVNM= 000134 GES2 001460R 003 OUTPUT= 000012 $$QIOW 001562R 003 B1 000752R 003 F.EFBK= 000010 GES3 001470R 003 PAR$$$= 000000 $$$ARG= 000011 COMMON 000534R 003 F.EFN = 000050 HPSIZE= ****** GX P$FBRK 001702R 003 $$$OST= 000014 DEVNAM= 000022 F.EOBB= 000032 IE.EOF= ****** GX P$FCLO 001154R 003 $$$000 000000RG 003 DEVTYP= 000020 F.ERR = 000052 IN = 000002 P$FFST 001316R 003 $$$001 000206RG 003 DV.KB = 042420 F.FACC= 000043 INPUT = 000112 P$FGET 001216R 003 $$$004 000214RG 003 DV.SY = 075250 F.FFBY= 000014 IOFNC = 000010 P$FINT 000442R 003 $$$006 000302RG 003 EOF = 000002 F.FNAM= 000110 IOST 001604R 003 P$FNXT 001320R 003 $$$007 000372RG 003 ERR001 001304R 003 F.FNB = 000102 IO.RLB= ****** GX P$FOPN 000550R 003 $$$016 000426RG 003 ERR002 001662R 003 F.FTYP= 000116 IO.RVB= ****** GX P$FPAD 002314R 003 $$$017 000522RG 003 FCBDFB 003652R 003 F.FVER= 000120 IO.WVB= ****** GX P$FPUT 001622R 003 $$$018 000530RG 003 FCBREC 003650R 003 F.HIBK= 000004 LN.CMI= 012321 P$FRDC 002060R 003 $$$020 001146RG 003 FDBPNT= 000006 F.LUN = 000042 LN.CMO= 012327 P$FWRC 002136R 003 $$$021 001204RG 003 FDBPTR 003202R 003 F.MBCT= 000054 LOGNAM= 000024 P$HERR 003044R 003 $$$022 001610RG 003 FDBUSE 003174R 003 F.MBC1= 000055 LUN = 000016 P$TCAI 002446R 003 $$$023 001674RG 003 FDB001 003210R 003 F.MBFG= 000056 L0 000650R 003 P$TCIA 002700R 003 $$$024 002050RG 003 FDB002 003350R 003 F.NRBD= 000024 L1 000730R 003 Q.IOAE= 000012 $$$025 002124RG 003 FDB003 003510R 003 F.NREC= 000030 L11 001006R 003 Q.IOEF= 000006 $$$027 002212RG 003 FDSBK 003710R 003 F.OVBS= 000030 L12 001020R 003 Q.IOFN= 000002 $$$030 002340RG 003 FD.CR = ****** GX F.RACC= 000016 L2 000702R 003 Q.IOLU= 000004 $$$031 002524RG 003 FILDIR= 000003 F.RATT= 000001 L3 000730R 003 Q.IOPL= 000014 $$$039 002724RG 003 FO.RD = ****** GX F.RCNM= 000034 L4 000730R 003 Q.IOPR= 000007 .CLOSE= ****** G FO.WRT= ****** GX F.RCTL= 000017 L6 001020R 003 Q.IOSB= 000010 .FINIT= ****** G F.ACTL= 000076 F.RSIZ= 000002 L7 000764R 003 RSX11D= 000000 .FSRCB= ****** G F.ALOC= 000040 F.RTYP= 000000 MASK 003126R 003 R.VAR = ****** GX .GET = ****** G F.BBFS= 000062 F.SEQN= 000100 MASKL = 000046 STATUS= 000017 .HEAP. 000000RG 002 F.BDB = 000070 F.SPDV= 000072 MAXSIZ= 000004 S.BFHD= 000020 .OPEN = ****** G F.BGBC= 000057 F.SPUN= 000074 N.DID = 000024 S.FATT= 000016 .PUT = ****** G F.BKDN= 000026 F.STBK= 000036 N.DVNM= 000032 S.FDB = 000140 ...PC1= 003510R 003 F.BKDS= 000020 F.UNIT= 000136 N.FID = 000000 S.FNAM= 000006 ...PC2= 003706R 003 F.BKEF= 000050 F.URBD= 000020 N.FNAM= 000006 S.FNB = 000036 ...PC3= 003510R 003 F.BKP1= 000051 F.VBN = 000064 N.FTYP= 000014 S.FNBW= 000017 ...TPC= 000020 F.BKST= 000024 F.VBSZ= 000060 . ABS. 000000 000 000000 001 ...... 000006 002 $$FILE 003724 003 $$FSR1 003060 004 ERRORS DETECTED: 0 VIRTUAL MEMORY USED: 4677 WORDS ( 19 PAGES) DYNAMIC MEMORY: 14969 WORDS ( 57 PAGES) ELAPSED TIME: 00:00:57 PASLIB,PASLIB/-SP=PASLIB