PL/M-86 COMPILER GENCMD PAGE 1 ISIS-II PL/M-86 V2.0 COMPILATION OF MODULE GENCMD OBJECT MODULE PLACED IN GENCMD.OBJ COMPILER INVOKED BY: :F0: GENCMD.PLM XREF OPTIMIZE(3) DEBUG 1 GENCMD: DO; /* CP/M 8086 CMD file generator COPYRIGHT (C) 1983 DIGITAL RESEARCH BOX 579 PACIFIC GROVE CALIFORNIA 93950 */ /**** The following commands were used on the VAX to compile GENCMD: $ util := GENCMD $ ccpmsetup ! set up environment $ plm86 'util'.plm xref 'p1' optimize(3) debug $ link86 f1:scd.obj, 'util'.obj to 'util'.lnk $ loc86 'util'.lnk od(sm(code,dats,data,stack,const)) - ad(sm(code(0),dats(10000h))) ss(stack(+32)) to 'util'. $ h86 'util' **** Followed on the micro by: A>vax gencmd.h86 $fans A>gencmd gencmd data[b1000 m86 xfff] ****/ 2 1 DECLARE digital$code literally '0081h', /*DR code record */ digital$data literally '0082h', /* DR data record */ digital02 literally '0085h', /* DR 02 records */ paragraph literally '16', ex literally '12', /* extent */ nr literally '32', /* current record */ maxb address external, fcba(33) byte external, /* DEFAULT FILE CONTROL BLOCK */ buffa(128) byte external; /* DEFAULT BUFFER ADDRESS */ 3 1 DECLARE COPYRIGHT(*) BYTE DATA (' COPYRIGHT (C) 1983, DIGITAL RESEARCH '); 4 1 MON1: PROCEDURE(F,A) EXTERNAL; 5 2 DECLARE F BYTE, A ADDRESS; 6 2 END MON1; 7 1 MON2: PROCEDURE(F,A) BYTE EXTERNAL; 8 2 DECLARE F BYTE, A ADDRESS; 9 2 END MON2; 10 1 DECLARE SP ADDRESS; PL/M-86 COMPILER GENCMD PAGE 2 11 1 BOOT: PROCEDURE; 12 2 call mon1 (0,0); 13 2 END BOOT; 14 1 declare segmts(11) structure (name(5) byte,begin$add address) initial ('CODE ',00h,'DATA ',0ffffh,'EXTRA',0ffffh,'STACK',0, 'X1 ',0,'X2 ',0,'X3 ',0,'X4 ',0,'8080 ',0,'NZERO',0, 'NHEAD',0); 15 1 declare header (15) structure (typseg byte,file$length address,absolute$add address, minimum$mem address, maximum$mem address) initial (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,00,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); 16 1 plmstart: PROCEDURE public; 17 2 DECLARE FCB (33) BYTE AT (.FCBA), DFCBA LITERALLY 'FCBA'; 18 2 DECLARE BUFFER (128) BYTE AT (.BUFFA), DBUFF LITERALLY 'BUFFA'; 19 2 DECLARE SFCB(33) BYTE, /* SOURCE FILE CONTROL BLOCK */ BSIZE LITERALLY '1024', EOFILE LITERALLY '1AH', SBUFF(BSIZE) BYTE, /* SOURCE FILE BUFFER */ RFLAG BYTE, /* READER FLAG */ SBP ADDRESS; /* SOURCE FILE BUFFER POINTER */ 20 2 declare tbp address; /* pointer to command tail */ 21 2 declare count$command$tail byte at (.buffa); 22 2 declare (t8080,nozero) byte; 23 2 DECLARE TRUE LITERALLY '1', FALSE LITERALLY '0', FOREVER LITERALLY 'WHILE TRUE', CR LITERALLY '13', LF LITERALLY '10', WHAT LITERALLY '63'; 24 2 PRINTCHAR: PROCEDURE(CHAR); 25 3 DECLARE CHAR BYTE; 26 3 CALL MON1(2,CHAR); 27 3 END PRINTCHAR; 28 2 CRLF: PROCEDURE; 29 3 CALL PRINTCHAR(CR); 30 3 CALL PRINTCHAR(LF); 31 3 END CRLF; 32 2 PRINTNIB: PROCEDURE(N); 33 3 DECLARE N BYTE; PL/M-86 COMPILER GENCMD PAGE 3 34 3 IF N > 9 THEN CALL PRINTCHAR(N+'A'-10); ELSE 36 3 CALL PRINTCHAR(N+'0'); 37 3 END PRINTNIB; 38 2 PRINTHEX: PROCEDURE(B); 39 3 DECLARE B BYTE; 40 3 CALL PRINTNIB(SHR(B,4)); CALL PRINTNIB(B AND 0FH); 42 3 END PRINTHEX; 43 2 PRINTADDR: PROCEDURE(A); 44 3 DECLARE A ADDRESS; 45 3 CALL PRINTHEX(HIGH(A)); CALL PRINTHEX(LOW(A)); 47 3 END PRINTADDR; 48 2 PRINTM: PROCEDURE(A); 49 3 DECLARE A ADDRESS; 50 3 CALL MON1(9,A); 51 3 END PRINTM; 52 2 PRINT: PROCEDURE(A); 53 3 DECLARE A ADDRESS; /* PRINT THE STRING STARTING AT ADDRESS A UNTIL THE NEXT DOLLAR SIGN IS ENCOUNTERED WITH PRECEDING CRLF */ 54 3 CALL CRLF; 55 3 CALL PRINTM(A); 56 3 END PRINT; 57 2 declare mbuffadr address, LA ADDRESS; /* CURRENT LOAD ADDRESS */ 58 2 declare head byte; 59 2 PERROR: PROCEDURE(A); /* PRINT ERROR MESSAGE */ 60 3 DECLARE A ADDRESS; 61 3 CALL PRINT(.('ERROR: $')); 62 3 CALL PRINTM(A); 63 3 CALL PRINTM(.(', LOAD ADDRESS $')); 64 3 CALL PRINTADDR(LA); 65 3 CALL BOOT; 66 3 END PERROR; 67 2 diskerror: procedure; 68 3 call perror(.('DISK WRITE$')); 69 3 end diskerror; 70 2 DECLARE DCNT BYTE; 71 2 setdma: procedure(a); 72 3 declare a address; 73 3 call mon1 (26,a); 74 3 end setdma; 75 2 OPEN: PROCEDURE(FCB); 76 3 DECLARE FCB ADDRESS; 77 3 DCNT = MON2(15,FCB); PL/M-86 COMPILER GENCMD PAGE 4 78 3 END OPEN; 79 2 CLOSE: PROCEDURE(FCB); 80 3 DECLARE FCB ADDRESS; 81 3 DCNT = MON2(16,FCB); 82 3 END CLOSE; 83 2 SEARCH: PROCEDURE(FCB); 84 3 DECLARE FCB ADDRESS; 85 3 DCNT = MON2(17,FCB); 86 3 END SEARCH; 87 2 SEARCHN: PROCEDURE; 88 3 DCNT = MON2(18,0); 89 3 END SEARCHN; 90 2 DELETE: PROCEDURE(FCB); 91 3 DECLARE FCB ADDRESS; 92 3 CALL MON1(19,FCB); 93 3 END DELETE; 94 2 DISKREAD: PROCEDURE(FCB) BYTE; 95 3 DECLARE FCB ADDRESS; 96 3 RETURN MON2(20,FCB); 97 3 END DISKREAD; 98 2 DISKWRITE: PROCEDURE(FCB) BYTE; 99 3 DECLARE FCB ADDRESS; 100 3 RETURN MON2(21,FCB); 101 3 END DISKWRITE; 102 2 MAKE: PROCEDURE(FCB); 103 3 DECLARE FCB ADDRESS; 104 3 DCNT = MON2(22,FCB); 105 3 END MAKE; 106 2 RENAME: PROCEDURE(FCB); 107 3 DECLARE FCB ADDRESS; 108 3 CALL MON1(23,FCB); 109 3 END RENAME; 110 2 MOVE: PROCEDURE(S,D,N); 111 3 DECLARE (S,D) ADDRESS, N BYTE, A BASED S BYTE, B BASED D BYTE; 112 3 DO WHILE (N:=N-1) <> 255; 113 4 B = A; S=S+1; D=D+1; 116 4 END; 117 3 END MOVE; 118 2 declare char byte; 119 2 comline$error: procedure; 120 3 declare i byte; PL/M-86 COMPILER GENCMD PAGE 5 121 3 call crlf; 122 3 do i = 1 to tbp; 123 4 call printchar (buffer(i)); 124 4 end; 125 3 call printchar ('?'); 126 3 call crlf; 127 3 call boot; 128 3 end comline$error; 129 2 retchar: procedure byte; /* get another character from command tail */ 130 3 if (tbp :=tbp+1) <= count$command$tail then 131 3 return buffer(tbp); 132 3 else return (0dh); 133 3 end retchar; 134 2 tran: procedure(b) byte; 135 3 declare b byte; 136 3 if b < ' ' then return 0dh; /* non-graphic */ 138 3 if b - 'a' < ('z' - 'a') then 139 3 b = b and 101$1111b; /* upper case */ 140 3 return b; 141 3 end tran; 142 2 next$non$blank: procedure; 143 3 char=tran(retchar); 144 3 do while char= ' '; 145 4 char= tran(retchar); 146 4 end; 147 3 end next$non$blank; 148 2 CHECK$ONE$HEX: PROCEDURE (h) BYTE; /* READ ONE HEX CHARACTER FROM THE INPUT */ 149 3 DECLARE H BYTE; 150 3 IF H - '0' <= 9 THEN RETURN H - '0'; 152 3 IF H - 'A' > 5 THEN 153 3 return (0ffh); 154 3 RETURN H - 'A' + 10; 155 3 END CHECK$ONE$HEX; 156 2 MAKE$DOUBLE: PROCEDURE(H,L) ADDRESS; /* CREATE A BOUBLE BYTE VALUE FROM TWO SINGLE BYTES */ 157 3 DECLARE (H,L) BYTE; 158 3 RETURN SHL(DOUBLE(H),8) OR L; 159 3 END MAKE$DOUBLE; 160 2 delimiter: procedure byte; /* logical */ 161 3 declare i byte; PL/M-86 COMPILER GENCMD PAGE 6 162 3 declare del (*) byte data (0dh,'[], '); 163 3 do i = 0 to last(del); 164 4 if char = del(i) then return true; 166 4 end; 167 3 return false; 168 3 end delimiter; 169 2 get$num: procedure address; 170 3 declare paradd address; 171 3 paradd = 0; 172 3 char = retchar; 173 3 do while not delimiter ; 174 4 if (char:=check$one$hex(char)) = 0ffh then 175 4 call comline$error; else 176 4 paradd = paradd * 16 + char; 177 4 char = retchar; 178 4 end; 179 3 return paradd; 180 3 end get$num; 181 2 GETCHAR: PROCEDURE BYTE; /* GET NEXT CHARACTER FROM DISK BUFFER */ 182 3 DECLARE I BYTE; 183 3 IF (SBP := SBP+1) <= LAST(SBUFF) THEN 184 3 RETURN SBUFF(SBP); /* OTHERWISE READ ANOTHER BUFFER FULL */ 185 3 DO SBP = 0 TO LAST(SBUFF) BY 128; 186 4 IF (I:=DISKREAD(.SFCB)) = 0 THEN 187 4 CALL MOVE(.buffer,.SBUFF(SBP),80H); ELSE 188 4 DO; 189 5 IF I<>1 THEN CALL PERROR(.('DISK READ$')); 191 5 SBUFF(SBP) = EOFILE; 192 5 SBP = LAST(SBUFF); 193 5 END; 194 4 END; 195 3 SBP = 0; RETURN SBUFF(0); 197 3 END GETCHAR; 198 2 DECLARE STACKPOINTER LITERALLY 'STACKPTR'; /* INTEL HEX FORMAT LOADER */ 199 2 RELOC: PROCEDURE; 200 3 DECLARE (RL, CS, RT,K) BYTE; 201 3 declare multi$segments byte; 202 3 DECLARE tabs address, /* temporary value */ TA ADDRESS, /* TEMP ADDRESS */ SA ADDRESS, /* PARAGRAPH LOAD ADDRESS */ FA ADDRESS, /* FINAL ADDRESS */ NB ADDRESS, /* NUMBER OF BYTES LOADED */ nxb byte, /* next byte in stream */ PL/M-86 COMPILER GENCMD PAGE 7 segadjst address, /* segment adjust */ seg$length (8) address, /* length of each segment */ write$add address, MBUFF based mbuffadr (256) BYTE, P BYTE; 203 3 declare high$add address; 204 3 SETMEM: PROCEDURE(B); /* set mbuff to b at location la */ 205 4 DECLARE (B) BYTE; 206 4 if ((.memory+la) < 0) or ((.memory+la) > maxb) then 207 4 do; 208 5 call print (.('INSUFFICIENT MEMORY TO CREATE CMD FILE $')); 209 5 call boot; 210 5 end; 211 4 MBUFF(LA) = B; 212 4 END SETMEM; 213 3 zero$mem: procedure; 214 4 do while (.memory +la) 0 then call diskerror; 247 4 p = p+1; 248 4 end write$record; PL/M-86 COMPILER GENCMD PAGE 8 249 3 empty$buffers: procedure; 250 4 write$add = .memory; 251 4 do while write$add+127 <= (.memory+fa); 252 5 call write$record; 253 5 write$add = write$add+128; 254 5 end; 255 4 if not multi$segments then 256 4 do; 257 5 call write$record; 258 5 return; 259 5 end; 260 4 call move (write$add,.memory,(la:=.memory+fa+1-write$add)); 261 4 end empty$buffers; 262 3 READHEX: PROCEDURE BYTE; /* READ ONE HEX CHARACTER FROM THE INPUT */ 263 4 declare khex byte; 264 4 if (khex := check$one$hex(getchar)) <> 0ffh then return khex; else 266 4 DO; CALL PRINT(.('INVALID HEX DIGIT$')); 268 5 CALL DIAGNOSE; 269 5 end; 270 4 end readhex; 271 3 READBYTE: PROCEDURE BYTE; /* READ TWO HEX DIGITS */ 272 4 RETURN SHL(READHEX,4) OR READHEX; 273 4 END READBYTE; 274 3 READCS: PROCEDURE BYTE; /* READ BYTE WHILE COMPUTING CHECKSUM */ 275 4 DECLARE B BYTE; 276 4 CS = CS + (B := READBYTE); 277 4 RETURN B; 278 4 END READCS; 279 3 hex$input: procedure; 280 4 if rt = 2 or rt > 84h then 281 4 segadjst = make$double(readcs,readcs); else 282 4 do; /* PROCESS EACH BYTE */ 283 5 DO WHILE (RL := RL - 1) <> 255; 284 6 CALL SETMEM(READCS); LA = LA+1; 286 6 END; 287 5 IF LA > FA THEN FA = LA - 1; 289 5 end; /* NOW READ CHECKSUM AND COMPARE */ PL/M-86 COMPILER GENCMD PAGE 9 290 4 IF CS + READBYTE <> 0 THEN 291 4 DO; CALL PRINT(.('CHECK SUM ERROR $')); 293 5 CALL DIAGNOSE; 294 5 END; 295 4 end hex$input; 296 3 get$buffer$len: procedure; 297 4 multi$segments = true; 298 4 if rt = 84h then rt = 83h; 300 4 else if rt = 83h then rt = 84h; if seg$length (rt-81h) <= (high$add:=la+rl-1) then 303 4 do; 304 5 if high$add=0 then high$add = 1; 306 5 seg$length (rt-81h) = high$add; 307 5 header(rt-81h).typseg = rt-80h; 308 5 end; 309 4 end get$buffer$len; 310 3 compute$la: procedure (j) address; 311 4 declare j byte; 312 4 return (la and 000Fh)+shl((sa-segmts(j).begin$add),4); 313 4 end compute$la; /* INITIALIZE */ 314 3 SA, FA, NB = 0; 315 3 P = 0; /* PARAGRAPH COUNT */ 316 3 SBUFF(0) = EOFILE; 317 3 fcb(nr) = 0; 318 3 if head then fcb(nr) = 1; 320 3 multi$segments = false; 321 3 segadjst = 0; 322 3 do k= 0 to 7; 323 4 seglength(k) = 0; 324 4 end; 325 3 call zero$mem; 326 3 ta=0; 327 3 la=1; /* READ RECORDS UNTIL :00XXXX IS ENCOUNTERED */ 328 3 DO FOREVER; /* SCAN THE : */ 329 4 DO WHILE (nxb:=getchar) <> ':'; 330 5 if nxb = eofile then go to second; /* MAY BE THE END OF TAPE */ 332 5 END; /* SET CHECK SUM TO ZERO, AND SAVE THE RECORD LENGTH */ 333 4 CS = 0; 334 4 nb = nb +(rl:=readcs); 335 4 TA, LA = MAKE$DOUBLE(READCS,READCS) ; PL/M-86 COMPILER GENCMD PAGE 10 336 4 sa = segadjst + shr(la,4); /* READ THE RECORD TYPE */ /* skip all records except type 0 2 81 */ 337 4 if (rt:=readcs) > digital$code and rt < digital02 then 338 4 do; 339 5 if not t8080 then 340 5 call get$buffer$len; else 341 5 call hex$input; 342 5 end; else 343 4 do; 344 5 if (rt = digital$code) then 345 5 do; 346 6 call hex$input; 347 6 header(0).typseg = 1; 348 6 end; else 349 5 do; 350 6 if (rt = 0 and sa < segmts(1).begin$add and sa >= segmts(0).begin$add) or rt = 2 then 351 6 do; 352 7 la = compute$la(0); 353 7 call hex$input; 354 7 header(0).typseg = 1; 355 7 end; 356 6 if (rt = 0 and sa >= segmts(1).begin$add) then 357 6 do; 358 7 multi$segments = true; 359 7 if seg$length(1) < (high$add:=compute$la(1) +rl-1) then 360 7 do; 361 8 seg$length(1) = high$add; 362 8 header(1).typseg=2; 363 8 end; 364 7 end; 365 6 end; 366 5 end; 367 4 end; 368 3 second: call empty$buffers; 369 3 ta = (la+paragraph-1) and 0fff0h; 370 3 header(0).file$length=fa/16+1; 371 3 if header(0).minimum$mem = 0 then header(0).minimum$mem = fa/16+1; 373 3 fa=ta; 374 3 if not multi$segments then go to fin; 376 3 call zero$mem; 377 3 multi$segments = false; 378 3 sfcb(ex),sfcb(nr) = 0; 379 3 call open(.sfcb); 380 3 call setdma(.buffer); 381 3 do k = 1 to 7; 382 4 if seg$length(k) <> 0 then PL/M-86 COMPILER GENCMD PAGE 11 383 4 do; 384 5 seg$length(k) = seg$length(k)+paragraph and 0fff0h; 385 5 header(k).file$length = seg$length(k)/16; 386 5 if header(k).minimum$mem=0 then 387 5 header(k).minimum$mem=seg$length(k)/16; 388 5 end; 389 4 end; 390 3 segadjst = 0; 391 3 seg$length(0) = ta; 392 3 sbp=length(sbuff); 393 3 DO FOREVER; /* SCAN THE : */ 394 4 DO WHILE (nxb:=getchar) <> ':'; 395 5 if nxb = eofile then go to afin; 397 5 END; 398 4 cs = 0; 399 4 rl = readcs; 400 4 la = make$double(readcs,readcs); 401 4 sa = segadjst + shr(la,4); 402 4 if (rt := readcs) = eofile then go to afin; 404 4 if rt = 84h then rt = 83h; 406 4 else if rt = 83h then rt = 84h; if rt > digital$code and rt < digital02 then 409 4 do; 410 5 do k = 0 to (rt-82h); 411 6 la = la + seg$length(k); 412 6 end; 413 5 call hex$input; 414 5 end; 415 4 if (rt = 0 and sa >= segmts(1).begin$add) or rt = 2 then 416 4 do; 417 5 la = compute$la(1) + seg$length(0); 418 5 call hex$input; 419 5 end; 420 4 END; 421 3 afin: call empty$buffers; 422 3 FIN: /* PRINT FINAL STATISTICS */ CALL PRINT(.('BYTES READ $')); CALL PRINTADDR(NB); 424 3 CALL PRINT(.('RECORDS WRITTEN $')); CALL PRINTHEX(P+1); 426 3 CALL CRLF; /* write the header record */ 427 3 call close(.fcba); 428 3 if head then PL/M-86 COMPILER GENCMD PAGE 12 429 3 do; 430 4 fcb(ex),fcb(nr) = 0; 431 4 call open(.fcba); 432 4 call move (.header,.buffer,128); 433 4 call setdma(.buffer); 434 4 if diskwrite(.fcba) <> 0 then call diskerror; 436 4 end; 437 3 END RELOC; 438 2 declare seg$number byte; 439 2 ignore$filename: procedure; 440 3 tbp = 0; 441 3 char = buffer(tbp); 442 3 call next$non$blank; 443 3 do while (char:=buffer(tbp)) <> ' '; 444 4 tbp = tbp +1; 445 4 end; 446 3 end ignore$filename; 447 2 parse$tail: procedure; 448 3 declare seg$index byte; 449 3 get$segmt: procedure byte; /* get the segment name */ 450 4 declare ( kentry, match$flag,j, no$match) byte; 451 4 declare user$segmt(5) byte; 452 4 do j = 0 to last (user$segmt); 453 5 if delimiter then 454 5 user$segmt(j) = ' '; else 455 5 do; 456 6 user$segmt(j) = char; 457 6 char = tran(retchar); 458 6 end; 459 5 end; 460 4 seg$index = 0; 461 4 no$match, matchflag = true; 462 4 do while no$match and seg$index < 11; 463 5 match$flag=true; 464 5 kentry = 0; 465 5 do while match$flag and kentry <= last (segmts.name); 466 6 if usersegmt(kentry) <> segmts(seg$index).name(kentry) then 467 6 matchflag = false; else 468 6 kentry = kentry +1; 469 6 end; 470 5 if matchflag then no$match = false; else 472 5 seg$index = seg$index +1; PL/M-86 COMPILER GENCMD PAGE 13 473 5 end; 474 4 if no$match then seg$index = 0ffh; 476 4 return seg$index; 477 4 end get$segmt; 478 3 get$switches: procedure; 479 4 do while char <> ']' and char <> cr; 480 5 call next$non$blank; 481 5 if char= 'A' then header(seg$index).absolute$add = (get$num); 483 5 else if char= 'M' then 484 5 do; 485 6 header(seg$index).minimum$mem = (get$num); 486 6 header(seg$index).typseg = seg$index+1; 487 6 end; 488 5 else if char= 'X' then header(seg$index).maximum$mem = (get$num); 490 5 else if char= 'B' then segmts(seg$index).begin$add = (get$num); 492 5 else do; 493 6 call comline$error; 494 6 call boot; 495 6 end ; 496 5 end; 497 4 end get$switches; 498 3 do forever; 499 4 call next$non$blank; 500 4 if char = cr then return; 502 4 if get$segmt = 0ffh then 503 4 do; 504 5 call comline$error; 505 5 end; 506 4 if seg$index < 8 then 507 4 do; 508 5 if char = ']' or char = cr then call comline$error; 510 5 call get$switches; 511 5 end; else 512 4 do; 513 5 if seg$index = 8 then t8080 = true; else 515 5 do; 516 6 if seg$index = 9 then nozero = true; else 518 6 head = false; 519 6 end; 520 5 end; 521 4 end; 522 3 end parse$tail; /* ARRIVE HERE FROM THE SYSTEM MONITOR, READY TO READ THE HEX TAPE */ PL/M-86 COMPILER GENCMD PAGE 14 /* SET UP STACKPOINTER IN THE LOCAL AREA */ 523 2 DECLARE STACK(64) ADDRESS; 524 2 SP = STACKPOINTER; STACKPOINTER = .STACK(LENGTH(STACK)); 526 2 LA = 0h; 527 2 mbuffadr = .memory; 528 2 t8080 = false; 529 2 nozero = false; 530 2 head = true; 531 2 SBP = LENGTH(SBUFF); /* SET UP THE SOURCE FILE */ 532 2 CALL MOVE(.FCBA,.SFCB,33); 533 2 CALL MOVE(.('H86',0),.SFCB(9),4); 534 2 CALL OPEN(.SFCB); 535 2 IF DCNT = 255 THEN CALL PERROR(.('CANNOT OPEN SOURCE$')); 537 2 CALL MOVE(.('CMD'),.FCBA+9,3); /* REMOVE ANY EXISTING FILE BY THIS NAME */ 538 2 CALL DELETE(.FCBA); /* THEN OPEN A NEW FILE */ 539 2 CALL MAKE(.FCBA); CALL OPEN(.FCBA); 541 2 IF DCNT = 255 THEN CALL PERROR(.('NO MORE DIRECTORY SPACE$')); ELSE 543 2 DO; 544 3 call ignore$filename; 545 3 call parse$tail; 546 3 CALL RELOC; 547 3 CALL CLOSE(.FCBA); 548 3 IF DCNT = 255 THEN CALL PERROR(.('CANNOT CLOSE FILE$')); 550 3 END; 551 2 CALL CRLF; 552 2 CALL BOOT; 553 2 END plmstart; 554 1 END; PL/M-86 COMPILER GENCMD PAGE 15 CROSS-REFERENCE LISTING ----------------------- DEFN ADDR SIZE NAME, ATTRIBUTES, AND REFERENCES ----- ------ ----- -------------------------------- 4 0000H 2 A. . . . . . . . . WORD PARAMETER 5 48 0004H 2 A. . . . . . . . . WORD PARAMETER AUTOMATIC 49 50 7 0000H 2 A. . . . . . . . . WORD PARAMETER 8 52 0004H 2 A. . . . . . . . . WORD PARAMETER AUTOMATIC 53 55 43 0004H 2 A. . . . . . . . . WORD PARAMETER AUTOMATIC 44 45 46 59 0004H 2 A. . . . . . . . . WORD PARAMETER AUTOMATIC 60 62 71 0004H 2 A. . . . . . . . . WORD PARAMETER AUTOMATIC 72 73 111 0000H 1 A. . . . . . . . . BYTE BASED(S) 113 15 0003H 2 ABSOLUTEADD. . . . WORD MEMBER(HEADER) 482 421 0704H AFIN . . . . . . . LABEL 396 403 134 0004H 1 B. . . . . . . . . BYTE PARAMETER AUTOMATIC 135 136 138 139 140 275 05B2H 1 B. . . . . . . . . BYTE 276 277 38 0004H 1 B. . . . . . . . . BYTE PARAMETER AUTOMATIC 39 40 41 204 0004H 1 B. . . . . . . . . BYTE PARAMETER AUTOMATIC 205 211 111 0000H 1 B. . . . . . . . . BYTE BASED(D) 113 14 0005H 2 BEGINADD . . . . . WORD MEMBER(SEGMTS) 312 350 356 415 491 11 0000H 14 BOOT . . . . . . . PROCEDURE STACK=0008H 65 127 209 241 494 552 19 BSIZE. . . . . . . LITERALLY 19 2 0000H 128 BUFFA. . . . . . . BYTE ARRAY(128) EXTERNAL(2) 18 21 18 0000H 128 BUFFER . . . . . . BYTE ARRAY(128) EXTERNAL(2) AT 123 131 187 380 432 433 441 443 24 0004H 1 CHAR . . . . . . . BYTE PARAMETER AUTOMATIC 25 26 118 05A6H 1 CHAR . . . . . . . BYTE 143 144 145 164 172 174 176 177 441 443 456 457 479 481 483 488 490 500 508 148 02E5H 36 CHECKONEHEX. . . . PROCEDURE BYTE STACK=0004H 174 264 79 01ABH 19 CLOSE. . . . . . . PROCEDURE STACK=000AH 427 547 119 025BH 51 COMLINEERROR . . . PROCEDURE STACK=0012H 175 493 504 509 310 09C0H 38 COMPUTELA. . . . . PROCEDURE WORD STACK=0006H 352 359 417 3 0000H 38 COPYRIGHT. . . . . BYTE ARRAY(38) DATA 21 0000H 1 COUNTCOMMANDTAIL . BYTE EXTERNAL(2) AT 130 23 CR . . . . . . . . LITERALLY 29 479 500 508 28 00D5H 17 CRLF . . . . . . . PROCEDURE STACK=000EH 54 121 126 222 240 426 551 200 05ABH 1 CS . . . . . . . . BYTE 276 290 333 398 110 0006H 2 D. . . . . . . . . WORD PARAMETER AUTOMATIC 111 113 115 18 DBUFF. . . . . . . LITERALLY 70 05A5H 1 DCNT . . . . . . . BYTE 77 81 85 88 104 535 541 548 162 0026H 5 DEL. . . . . . . . BYTE ARRAY(5) DATA 163 164 90 01E3H 16 DELETE . . . . . . PROCEDURE STACK=000AH 538 160 0320H 44 DELIMITER. . . . . PROCEDURE BYTE STACK=0002H 173 453 17 DFCBA. . . . . . . LITERALLY 219 07C7H 90 DIAGNOSE . . . . . PROCEDURE STACK=0024H 268 293 2 DIGITAL02. . . . . LITERALLY 337 408 2 DIGITALCODE. . . . LITERALLY 337 344 408 2 DIGITALDATA. . . . LITERALLY 67 017CH 12 DISKERROR. . . . . PROCEDURE STACK=0026H 246 435 94 01F3H 16 DISKREAD . . . . . PROCEDURE BYTE STACK=000AH 186 98 0203H 16 DISKWRITE. . . . . PROCEDURE BYTE STACK=000AH 245 434 DOUBLE . . . . . . BUILTIN 158 249 085AH 81 EMPTYBUFFERS . . . PROCEDURE STACK=002EH 368 421 PL/M-86 COMPILER GENCMD PAGE 16 19 EOFILE . . . . . . LITERALLY 191 316 330 395 402 2 EX . . . . . . . . LITERALLY 378 430 7 0000H 1 F. . . . . . . . . BYTE PARAMETER 8 4 0000H 1 F. . . . . . . . . BYTE PARAMETER 5 202 0012H 2 FA . . . . . . . . WORD 251 260 287 288 314 370 372 373 23 FALSE. . . . . . . LITERALLY 167 320 377 467 471 518 528 529 106 0004H 2 FCB. . . . . . . . WORD PARAMETER AUTOMATIC 107 108 98 0004H 2 FCB. . . . . . . . WORD PARAMETER AUTOMATIC 99 100 17 0000H 33 FCB. . . . . . . . BYTE ARRAY(33) EXTERNAL(1) AT 317 319 430 102 0004H 2 FCB. . . . . . . . WORD PARAMETER AUTOMATIC 103 104 90 0004H 2 FCB. . . . . . . . WORD PARAMETER AUTOMATIC 91 92 83 0004H 2 FCB. . . . . . . . WORD PARAMETER AUTOMATIC 84 85 79 0004H 2 FCB. . . . . . . . WORD PARAMETER AUTOMATIC 80 81 75 0004H 2 FCB. . . . . . . . WORD PARAMETER AUTOMATIC 76 77 94 0004H 2 FCB. . . . . . . . WORD PARAMETER AUTOMATIC 95 96 2 0000H 33 FCBA . . . . . . . BYTE ARRAY(33) EXTERNAL(1) 17 245 427 431 434 532 537 538 539 540 547 15 0001H 2 FILELENGTH . . . . WORD MEMBER(HEADER) 370 385 422 0707H FIN. . . . . . . . LABEL 375 23 FOREVER. . . . . . LITERALLY 328 393 498 1 0000H GENCMD . . . . . . PROCEDURE STACK=0000H 296 094EH 114 GETBUFFERLEN . . . PROCEDURE STACK=0004H 340 181 0391H 124 GETCHAR. . . . . . PROCEDURE BYTE STACK=0026H 264 329 394 169 034CH 69 GETNUM . . . . . . PROCEDURE WORD STACK=0016H 482 485 489 491 449 0A6EH 201 GETSEGMT . . . . . PROCEDURE BYTE STACK=0008H 502 478 0B37H 175 GETSWITCHES. . . . PROCEDURE STACK=001AH 510 148 0004H 1 H. . . . . . . . . BYTE PARAMETER AUTOMATIC 149 150 151 152 154 156 0006H 1 H. . . . . . . . . BYTE PARAMETER AUTOMATIC 157 158 58 05A4H 1 HEAD . . . . . . . BYTE 318 428 518 530 15 00F9H 135 HEADER . . . . . . STRUCTURE ARRAY(15) INITIAL 307 347 354 362 370 371 372 385 386 387 432 482 485 486 489 279 08F2H 92 HEXINPUT . . . . . PROCEDURE STACK=003AH 341 346 353 413 418 HIGH . . . . . . . BUILTIN 45 203 002AH 2 HIGHADD. . . . . . WORD 302 304 305 306 359 361 182 05A9H 1 I. . . . . . . . . BYTE 186 189 161 05A8H 1 I. . . . . . . . . BYTE 163 164 120 05A7H 1 I. . . . . . . . . BYTE 122 123 439 09E6H 45 IGNOREFILENAME . . PROCEDURE STACK=000CH 544 310 0004H 1 J. . . . . . . . . BYTE PARAMETER AUTOMATIC 311 312 450 05B7H 1 J. . . . . . . . . BYTE 452 454 456 200 05ADH 1 K. . . . . . . . . BYTE 322 323 381 382 384 385 386 387 410 411 450 05B5H 1 KENTRY . . . . . . BYTE 464 465 466 468 263 05B1H 1 KHEX . . . . . . . BYTE 264 265 156 0004H 1 L. . . . . . . . . BYTE PARAMETER AUTOMATIC 157 158 57 0008H 2 LA . . . . . . . . WORD 64 206 211 214 215 216 230 233 260 285 287 288 302 312 327 335 336 352 369 400 401 411 417 526 LAST . . . . . . . BUILTIN 163 183 185 192 452 465 LENGTH . . . . . . BUILTIN 392 525 531 23 LF . . . . . . . . LITERALLY 30 LOW. . . . . . . . BUILTIN 46 234 220 0000H 1 M. . . . . . . . . BYTE BASED(TA) 102 0213H 19 MAKE . . . . . . . PROCEDURE STACK=000AH 539 156 0309H 23 MAKEDOUBLE . . . . PROCEDURE WORD STACK=0006H 281 335 400 450 05B6H 1 MATCHFLAG. . . . . BYTE 461 463 465 467 470 2 0000H 2 MAXB . . . . . . . WORD EXTERNAL(0) 206 214 15 0007H 2 MAXIMUMMEM . . . . WORD MEMBER(HEADER) 489 202 0000H 256 MBUFF. . . . . . . BYTE BASED(MBUFFADR) ARRAY(256) 211 215 236 PL/M-86 COMPILER GENCMD PAGE 17 57 0006H 2 MBUFFADR . . . . . WORD 202 211 215 236 527 0000H MEMORY . . . . . . BYTE ARRAY(0) 206 214 250 251 260 527 15 0005H 2 MINIMUMMEM . . . . WORD MEMBER(HEADER) 371 372 386 387 485 4 0000H MON1 . . . . . . . PROCEDURE EXTERNAL(3) STACK=0000H 12 26 50 73 92 108 7 0000H MON2 . . . . . . . PROCEDURE BYTE EXTERNAL(4) STACK=0000H 77 81 85 88 96 100 104 110 0236H 37 MOVE . . . . . . . PROCEDURE STACK=0008H 187 260 432 532 533 537 201 05AEH 1 MULTISEGMENTS. . . BYTE 255 297 320 358 374 377 32 0004H 1 N. . . . . . . . . BYTE PARAMETER AUTOMATIC 33 34 35 36 110 0004H 1 N. . . . . . . . . BYTE PARAMETER AUTOMATIC 111 112 14 0000H 5 NAME . . . . . . . BYTE ARRAY(5) MEMBER(SEGMTS) 465 466 202 0014H 2 NB . . . . . . . . WORD 314 334 423 221 0821H 27 NEWLINE. . . . . . PROCEDURE STACK=0020H 232 235 142 02CFH 22 NEXTNONBLANK . . . PROCEDURE STACK=0008H 442 480 499 450 05B8H 1 NOMATCH. . . . . . BYTE 461 462 471 474 22 05A3H 1 NOZERO . . . . . . BYTE 214 517 529 2 NR . . . . . . . . LITERALLY 317 319 378 430 202 05AFH 1 NXB. . . . . . . . BYTE 329 330 394 395 75 0198H 19 OPEN . . . . . . . PROCEDURE STACK=000AH 379 431 534 540 202 05B0H 1 P. . . . . . . . . BYTE 247 315 425 170 000AH 2 PARADD . . . . . . WORD 171 176 179 2 PARAGRAPH. . . . . LITERALLY 369 384 447 0A13H 91 PARSETAIL. . . . . PROCEDURE STACK=001EH 545 59 0157H 37 PERROR . . . . . . PROCEDURE STACK=0022H 68 190 536 542 549 16 000EH 180 PLMSTART . . . . . PROCEDURE PUBLIC STACK=0042H 52 0147H 16 PRINT. . . . . . . PROCEDURE STACK=0014H 61 208 227 229 231 267 292 422 424 43 0120H 23 PRINTADDR. . . . . PROCEDURE STACK=001CH 64 223 228 230 423 24 00C2H 19 PRINTCHAR. . . . . PROCEDURE STACK=000AH 29 30 35 36 123 125 224 225 238 38 0105H 27 PRINTHEX . . . . . PROCEDURE STACK=0016H 45 46 236 425 48 0137H 16 PRINTM . . . . . . PROCEDURE STACK=000AH 55 62 63 32 00E6H 31 PRINTNIB . . . . . PROCEDURE STACK=0010H 40 41 271 08CDH 19 READBYTE . . . . . PROCEDURE BYTE STACK=0030H 276 290 274 08E0H 18 READCS . . . . . . PROCEDURE BYTE STACK=0034H 281 284 334 335 337 399 400 402 262 08ABH 34 READHEX. . . . . . PROCEDURE BYTE STACK=002AH 272 199 040DH 863 RELOC. . . . . . . PROCEDURE STACK=003EH 546 106 0226H 16 RENAME . . . . . . PROCEDURE STACK=000AH 129 028EH 32 RETCHAR. . . . . . PROCEDURE BYTE STACK=0002H 143 145 172 177 457 19 05A1H 1 RFLAG. . . . . . . BYTE 200 05AAH 1 RL . . . . . . . . BYTE 283 302 334 359 399 200 05ACH 1 RT . . . . . . . . BYTE 280 298 299 300 301 302 306 307 337 344 350 356 402 404 405 406 407 408 410 415 110 0008H 2 S. . . . . . . . . WORD PARAMETER AUTOMATIC 111 113 114 202 0010H 2 SA . . . . . . . . WORD 312 314 336 350 356 401 415 19 0002H 2 SBP. . . . . . . . WORD 183 184 185 187 191 192 195 392 531 19 01A1H 1024 SBUFF. . . . . . . BYTE ARRAY(1024) 183 184 185 187 191 192 196 316 392 531 83 01BEH 19 SEARCH . . . . . . PROCEDURE STACK=000AH 87 01D1H 18 SEARCHN. . . . . . PROCEDURE STACK=0008H 368 0572H SECOND . . . . . . LABEL 331 202 0016H 2 SEGADJST . . . . . WORD 281 321 336 390 401 448 05B4H 1 SEGINDEX . . . . . BYTE 460 462 466 472 475 476 482 485 486 489 491 506 513 516 202 0018H 16 SEGLENGTH. . . . . WORD ARRAY(8) 302 306 323 359 361 382 384 385 387 391 411 417 PL/M-86 COMPILER GENCMD PAGE 18 14 00ACH 77 SEGMTS . . . . . . STRUCTURE ARRAY(11) INITIAL 312 350 356 415 465 466 491 438 05B3H 1 SEGNUMBER. . . . . BYTE 71 0188H 16 SETDMA . . . . . . PROCEDURE STACK=000AH 244 380 433 204 076CH 42 SETMEM . . . . . . PROCEDURE STACK=001AH 284 19 0180H 33 SFCB . . . . . . . BYTE ARRAY(33) 186 378 379 532 533 534 SHL. . . . . . . . BUILTIN 158 272 312 SHR. . . . . . . . BUILTIN 40 336 401 10 0000H 2 SP . . . . . . . . WORD 524 523 002CH 128 STACK. . . . . . . WORD ARRAY(64) 525 198 STACKPOINTER . . . LITERALLY 524 STACKPTR . . . . . BUILTIN 524 525 22 05A2H 1 T8080. . . . . . . BYTE 339 514 528 202 000EH 2 TA . . . . . . . . WORD 220 223 228 233 234 236 237 326 335 369 373 391 202 000CH 2 TABS . . . . . . . WORD 20 0004H 2 TBP. . . . . . . . WORD 122 130 131 440 441 443 444 134 02AEH 33 TRAN . . . . . . . PROCEDURE BYTE STACK=0004H 143 145 457 23 TRUE . . . . . . . LITERALLY 165 297 328 358 393 461 463 498 514 517 530 15 0000H 1 TYPSEG . . . . . . BYTE MEMBER(HEADER) 307 347 354 362 486 451 05B9H 5 USERSEGMT. . . . . BYTE ARRAY(5) 452 454 456 466 23 WHAT . . . . . . . LITERALLY 202 0028H 2 WRITEADD . . . . . WORD 244 250 251 253 260 243 083CH 30 WRITERECORD. . . . PROCEDURE STACK=002AH 252 257 213 0796H 49 ZEROMEM. . . . . . PROCEDURE STACK=0002H 325 376 MODULE INFORMATION: CODE AREA SIZE = 0BE6H 3046D CONSTANT AREA SIZE = 0131H 305D VARIABLE AREA SIZE = 05BEH 1470D MAXIMUM STACK SIZE = 0042H 66D 771 LINES READ 0 PROGRAM ERROR(S) END OF PL/M-86 COMPILATION