CP/M ASM86 1.1 SOURCE: SUBMIT.A86 PAGE 1 1 2 ;***************************************************** 3 ;* 4 ;* Submit CCP/M-86 5 ;* 6 ;***************************************************** 7 8 ;Revisions: 9 ; 30 Mar 83 dh - attach after commands except chain 10 ; 21 Mar 83 whf - cli on 'mov ss'; fix readchar eof 11 ; 18 Feb 83 whf - $global/$local cmds 12 ; 15 Feb 83 dh - closing windows 13 14 cseg 15 16 0000 EB3B 003D jmps submit 17 18 0002 5355424D4954 db 'SUBMIT 1.3 ' 19 20312E3320 20 000D 434F50595249 db 'COPYRIGHT (C) 1983,' 21 474854202843 22 292031393833 23 2C 24 0020 204449474954 db ' DIGITAL RESEARCH ' 25 414C20524553 26 454152434820 27 0032 332F32312F38 db '3/21/83' 28 33 29 0039 0D0A0024 db 13,10,0,'$' 30 31 32 33 00FF true equ 0ffh 34 0000 false equ 0 35 0000 unknown equ 0 36 00E0 mpmint equ 224 ; int vec for mpm ent. 37 38 0001 mpm_conin equ 1 39 0002 mpm_conout equ 2 40 0009 mpm_conwrite equ 9 41 000A mpm_conread equ 10 42 000B mpm_constat equ 11 43 000C mpm_version equ 12 44 000E mpm_diskselect equ 14 45 000F mpm_openfile equ 15 46 0010 mpm_closefile equ 16 47 0014 mpm_readfile equ 20 48 0019 mpm_getdefdisk equ 25 49 001A mpm_setdma equ 26 50 0020 mpm_usercode equ 32 51 002F mpm_chain equ 47 52 008F mpm_terminate equ 143 53 0091 mpm_setprior equ 145 CP/M ASM86 1.1 SOURCE: SUBMIT.A86 PAGE 2 54 55 0092 mpm_conattach equ 146 56 0093 mpm_condetach equ 147 57 0094 mpm_setdefcon equ 148 58 0096 mpm_clicmd equ 150 59 0098 mpm_parse equ 152 60 0099 mpm_getdefcon equ 153 61 009C mpm_getpdadr equ 156 62 00A0 mpm_setdeflst equ 160 63 00A4 mpm_getdeflst equ 164 64 65 ; fcb offsets 66 0006 mode2 equ 6 ; 2nd open mode byte 67 000A modesys equ 10 ; SYS attribute byte 68 0009 ftype equ 9 ; file type 69 70 004B sysdrive equ byte ptr .4bh ;system disk in SYSDAT 71 72 0003 e_no_memory equ 3 ; cant find memory 73 000C e_no_pd equ 12 ; no free pd's 74 000F e_q_full equ 15 ; full queue 75 0017 e_illdisk equ 23 ; illegal disk # 76 0018 e_badfname equ 24 ; illegal filename 77 0019 e_badftype equ 25 ; illegal filetype 78 001C e_bad_load equ 28 ; bad ret. from BDOS load 79 001D e_bad_read equ 29 ; bad ret. from BDOS read 80 001E e_bad_open equ 30 ; bad ret. from BDOS open 81 001F e_nullcmd equ 31 ; null command sent 82 0025 e_ill_lst equ 37 ; illegal list device 83 0026 e_ill_passwd equ 38 ; illegal password 84 0028 e_abort equ 40 ; aborted in CLI 85 86 0005 p_prior equ 05H ;process descriptor priority 87 0006 p_flag equ word ptr 06H ;flags 88 0008 p_name equ 08H ;name of process 89 001E p_parent equ 1EH ;PD's parent 90 0012 p_drv equ byte ptr 012H 91 0013 p_user equ byte ptr 013H 92 0024 p_list equ byte ptr 024H 93 94 0002 pf_keep equ 02H ;keep flag 95 0800 pf_childabort equ 800H ;child aborted abnormally 96 0080 pf_ctlc equ 080H ;control c occured 97 98 ;***************************************************** 99 ;* 100 ;* Submit Code 101 ;* 102 ;***************************************************** 103 104 ;====== 105 submit: ; PROGRAM MAIN - INITIALIZATION 106 ;====== CP/M ASM86 1.1 SOURCE: SUBMIT.A86 PAGE 3 107 108 003D 8CD8 mov ax,ds 109 003F 9C5BFA pushf ! pop bx ! cli ;disable interrupts for stack switch 110 0042 8ED0 mov ss,ax 111 0044 BC3C01 mov sp,offset stacktop 112 0047 539D push bx ! popf ;restore interrupts 113 114 0049 B10C mov cl,mpm_version 115 004B E85201 01A0 call mpm 116 004E 80E7FD and bh,not 2 ;strip network bit 117 0051 80FF11740E 0064 cmp bh,11H ! jz okvers ;check MP/M-86 or 118 0056 80FF147409 0064 cmp bh,14H ! jz okvers ;check Concurrent CP/M-86 119 005B BA0307 mov dx,offset wrongvers 120 005E E80E06 066F call print_string 121 0061 E9F405 0658 jmp terminate 122 okvers: 123 124 ; 125 ;set priority better than parent 126 ; 127 128 0064 B19C mov cl,mpm_getpdadr 129 0066 E83701 01A0 call mpm ;get our PD address 130 0069 891E4104 mov pdadr,bx ;save PD address 131 006D 8C064304 mov sysdatseg,es ;and the system data area segment 132 0071 268B5F1E mov bx,es:p_parent[bx] ;get our parent's PD address 133 0075 891E4504 mov parent_offset,bx ;save parent's PD addr 134 0079 83FB007505 0083 cmp bx,0 ! jne psetpar ;see if parent exists 135 007E BAC500EB0D 0090 mov dx,197 ! jmps setp ; oops, set to better than TMP 136 0083 268B5705 psetpar:mov dx,es:p_prior[bx] ;our parent's priority 137 0087 4A dec dx ;we run at one better, 138 0088 83FA407303 0090 cmp dx,64 ! jae setp 139 008D BA4000 mov dx,64 ;don't compete w/system 140 0090 B191 setp: mov cl,mpm_setprior 141 0092 E80B01 01A0 call mpm ;set our priority 142 143 0095 B11A mov cl,mpm_setdma ;using default buffer at 80H for 144 0097 BA3C01 mov dx,offset dma ;command tail and argument expansion 145 009A E80301 01A0 call mpm 146 147 009D E8C605 0666 call getuser 148 00A0 A20A04 mov command_user,al 149 00A3 A20E04 mov defuser,al 150 151 00A6 BE5C00 mov si,offset fcb 152 00A9 C6440953 mov byte ptr ftype[si],'S' ;look for file with type = SUB 153 00AD C6440A55 mov byte ptr ftype+1[si],'U' 154 00B1 C6440B42 mov byte ptr ftype+2[si],'B' 155 00B5 804C0680 or byte ptr mode2[si],80h ;open in R/O mode 156 00B9 8BD6 mov dx,si 157 00BB E8F805 06B6 call openfile 158 00BE 3CFF cmp al,0ffh 159 00C0 7532 00F4 jne exists CP/M ASM86 1.1 SOURCE: SUBMIT.A86 PAGE 4 160 161 162 00C2 B200 mov dl,0 ;try user 0 163 00C4 88160A04 mov command_user,dl 164 00C8 E89D05 0668 call setuser 165 00CB 8E064304 mov es,sysdatseg ;on system drive 166 00CF 26A04B00 mov al,es:sysdrive 167 00D3 FEC0 inc al 168 00D5 A25C00 mov fcb,al 169 00D8 BA5C00 mov dx,offset fcb 170 00DB E8D805 06B6 call openfile 171 00DE 3CFF cmp al,0ffh 172 00E0 7409 00EB je openfail 173 00E2 BE5C00 mov si,offset fcb 174 00E5 F6440A80 test byte ptr modesys[si],080H ;does it have SYS attribute? 175 00E9 7509 00F4 jnz exists 176 openfail: 177 00EB BA7308 mov dx,offset sopen_err 178 00EE E87E05 066F call print_string 179 00F1 E94804 053C jmp submitabort 180 181 exists: 182 00F4 BA5C00 mov dx,offset fcb 183 00F7 E8C005 06BA call closefile 184 00FA A05C00 mov al,fcb ;save disk number where command file is 185 00FD 3C00 cmp al,0 ;default disk ? 186 00FF 7505 0106 jnz save_disk_no 187 0101 E89A05 069E call getdisk 188 0104 FEC0 inc al 189 save_disk_no: 190 0106 A20B04 mov command_disk,al 191 192 0109 E88605 0692 call getconsole ;save console number this 193 010C A20C04 mov command_con,al ;program was run from 194 195 196 ; 197 ;deblank command tail 198 ; 199 010F BE8100 mov si,offset cmdtail + 1 200 0112 BFFE01 mov di,offset deblankbuf 201 firstwhites: 202 0115 803C20 cmp byte ptr [si],' ' 203 0118 7502 011C jnz tab 204 011A EB05 0121 jmps morewhites 205 tab: 206 011C 803C09 cmp byte ptr [si],9 207 011F 7503 0124 jnz deblank 208 morewhites: 209 0121 46 inc si 210 0122 EBF1 0115 jmps firstwhites 211 deblank: 212 0124 8A04 mov al,byte ptr [si] CP/M ASM86 1.1 SOURCE: SUBMIT.A86 PAGE 5 213 214 0126 46 inc si 215 0127 3C20 cmp al,' ' 216 0129 7418 0143 jz skipwhite 217 012B 3C09 cmp al,9 ;tab 218 012D 7414 0143 jz skipwhite 219 012F EB00 0131 jmps copychar 220 221 copychar: 222 0131 3C00 cmp al,0 ;end of of command tail ? 223 0133 7405 013A jz putlastblank 224 0135 8805 mov [di],al 225 0137 47 inc di 226 0138 EBEA 0124 jmps deblank 227 putlastblank: 228 013A C60520 mov byte ptr [di],' ' 229 013D 47 inc di 230 013E 8805 mov [di],al ;ends with space and zero 231 0140 EB11 0153 jmps dedone 232 233 skipmore: 234 0142 46 inc si 235 skipwhite: ;input = si points at tab or blank 236 0143 8A04 mov al,[si] 237 0145 3C20 cmp al,' ' 238 0147 74F9 0142 jz skipmore 239 0149 3C09 cmp al,9 ;tab 240 014B 74F5 0142 jz skipmore 241 014D C60520 mov byte ptr [di],' ' 242 0150 47 inc di 243 0151 EBD1 0124 jmps deblank ;si points to non white char 244 ;di is next char to copy 245 dedone: 246 247 248 ; 249 ;fill argument tail 250 ; 251 252 0153 BDFE01 mov bp,offset deblankbuf 253 0156 BBBE01 mov bx,offset argtable 254 0159 33F6 xor si,si ;pointer into deblankbuf 255 015B 8BFE mov di,si ;index into argtable 256 nxtfill: 257 015D 8A02 mov al,byte ptr [bp + si] ;0th argument is '.sub' 258 015F 3C00 cmp al,0 259 0161 7410 0173 jz filldone 260 0163 8931 mov [bx + di],si 261 0165 47 inc di 262 0166 E80200 016B call skiparg ;skip over argument and blank 263 0169 EBF2 015D jmps nxtfill 264 265 skiparg: CP/M ASM86 1.1 SOURCE: SUBMIT.A86 PAGE 6 266 267 016B 46 inc si 268 016C 803A20 cmp byte ptr [bp + si],' ' 269 016F 75FA 016B jnz skiparg 270 0171 46 inc si ;char after blank 271 0172 C3 ret 272 273 filldone: 274 0173 893EBC01 mov numargs,di 275 0177 E8F204 066C call crlf 276 277 017A C606030380 mov cmdbuf,maxcmdlen ;get first command 278 017F BA0303 mov dx,offset cmdbuf 279 0182 E8C003 0545 call readbuffer 280 0185 83FB00 cmp bx,0 281 0188 7511 019B jne submitexit ;EOF on first command 282 283 018A C606800280 mov lcmdbuf,maxcmdlen ;try next command 284 018F BA8002 mov dx,offset lcmdbuf 285 0192 E8B003 0545 call readbuffer 286 0195 881E7F02 mov no_more_cmds,bl ;true if EOF 287 0199 EB08 01A3 jmps topofcmdloop ;and look ahead to see 288 ;if there are more commands 289 290 ;========== 291 submitexit: 292 ;========== 293 294 019B B100BA0000 mov cl,0 ! mov dx,0 295 ;jmp mpm 296 297 ;=== 298 mpm: ; INTERFACE ROUTINE FOR SYSTEM ENTRY POINTS 299 ;=== 300 301 01A0 CDE0C3 int mpmint ! ret 302 303 ;=========== 304 topofcmdloop: ; LOOP FOREVER 305 ;=========== 306 307 ; 308 ; print CR,LF if we just sent a command 309 ; 310 311 01A3 803E40040074 01B2 cmp cmdsent,false ! je noclearline 312 08 01B2 313 01AA C606400400 mov cmdsent,false 314 01AF E8BA04 066C call crlf 315 316 noclearline: 317 318 ; CP/M ASM86 1.1 SOURCE: SUBMIT.A86 PAGE 7 319 320 ; set up and print user prompt 321 ; 322 323 ; get current default disk 324 325 326 01B2 E8E904 069E call getdisk 327 01B5 A20D04 mov defdisk,al 328 329 ; get current default user # 330 ; this call should be made on every 331 ; loop in case the 'USER' program 332 ; has changed the default user number 333 334 01B8 E8AB04 0666 call getuser 335 01BB A20E04 mov defuser,al 336 337 ;create user part of prompt string 338 339 01BE C60611040D mov promptutens,13 340 01C3 C60612040D mov promptuones,13 341 01C8 84C0 test al,al ;don't print user 0 342 01CA 7414 01E0 jz prprompt 343 01CC C606120430 mov promptuones,'0' 344 01D1 3C0A7207 01DC cmp al,10 ! jb ones 345 01D5 C606110431 mov promptutens,'1' 346 01DA 2C0A sub al,10 347 01DC 00061204 ones: add promptuones,al 348 prprompt: 349 ; create disk part of prompt string 350 351 01E0 B04102060D04 mov al,'A' ! add al,defdisk 352 01E6 A21304 mov promptdisk,al 353 354 ; write user prompt 355 356 01E9 BA1004 mov dx,offset prompt 357 01EC 803E11040D75 01F6 cmp promptutens,13 ! jne writeprompt 358 03 01F6 359 01F3 BA1104 mov dx,offset promptutens 360 writeprompt: 361 01F6 E88004 0679 call print_ds_string 362 363 ; 364 ; copy command to cli buffer, make upper case and 365 ; expand command arguments 366 ; 367 368 01F9 BE0503 mov si,offset cmd ;where command is 369 01FC BD8703 mov bp,offset clicmd ;copy w/ expanded args here 370 01FF 33FF xor di,di ;index into cli command 371 nextchar: CP/M ASM86 1.1 SOURCE: SUBMIT.A86 PAGE 8 372 373 0201 8A04 mov al,[si] ;char from command 374 0203 46 inc si 375 0204 3C24 cmp al,'$' ;argument ? 376 0206 7407 020F jz argmaybe 377 noarg: 378 0208 E84F00 025A call copyit 379 020B E3F4 0201 jcxz nextchar 380 020D EB61 0270 jmps echo_cmd ;can't expand any more params, 381 ;buffer is full 382 argmaybe: 383 020F 803C24 cmp byte ptr [si],'$' ;look for two '$' in a row 384 0212 7503 0217 jne numeric 385 0214 46 inc si ;skip 2nd $ sign 386 0215 EBF1 0208 jmps noarg ;copy one $ sign to command buffer 387 numeric: 388 0217 803C30 cmp byte ptr [si],'0' ;is next char after '$' a digit ? 389 021A 72EC 0208 jb noarg 390 021C 803C39 cmp byte ptr [si],'9' 391 021F 77E7 0208 ja noarg 392 realarg: 393 0221 33C0 xor ax,ax ;copy argument throw out - '$' in al 394 0223 8A04 mov al,[si] 395 0225 2C30 sub al,'0' ;1st digit 396 0227 46 inc si 397 0228 803C30 cmp byte ptr [si],'0' ;is there a second digit ? 398 022B 7211 023E jb onedigit 399 022D 803C39 cmp byte ptr [si],'9' 400 0230 770C 023E ja onedigit 401 0232 B20A mov dl,10 ;1st digit is tens in column 402 0234 F6E2 mul dl 403 0236 8A14 mov dl,[si] ;2nd argument is ones column 404 0238 46 inc si 405 0239 80EA30 sub dl,'0' 406 023C 02C2 add al,dl 407 onedigit: 408 023E 8BD8 mov bx,ax 409 copyarg: 410 0240 3B1EBC01 cmp bx,numargs 411 0244 7202 0248 jb oknum ;numargs in range 1 to n 412 0246 EBB9 0201 jmps nextchar ;no such argument 413 oknum: 414 0248 8A9FBE01 mov bl,argtable[bx] ;argument address rel to deblankbuf 415 copymore: 416 024C 8A87FE01 mov al,deblankbuf[bx] 417 0250 3C20 cmp al,' ' 418 0252 74AD 0201 jz nextchar ;end of argument 419 0254 E80300 025A call copyit 420 0257 43 inc bx 421 0258 EBF2 024C jmps copymore 422 423 424 copyit: CP/M ASM86 1.1 SOURCE: SUBMIT.A86 PAGE 9 425 426 ;copy character in AL to location BP + DI, increment DI. 427 ;if AL = 0, or command buffer is full then return CX = 0ffffH 428 ;else return CX = 0H 429 430 025A 8803 mov [bp + di],al ;mov to cli command buffer 431 025C 47 inc di 432 025D 33C9 xor cx,cx 433 025F 81FF8000 cmp di,maxcmdlen ;cli buffer size 434 0263 7305 026A jae donecopy 435 testend: 436 0265 3C00 cmp al,0 437 0267 7401 026A jz donecopy 438 0269 C3 ret 439 donecopy: 440 026A 893E0804 mov clicmdlen, di 441 026E 49 dec cx 442 026F C3 ret 443 444 echo_cmd: 445 0270 BE8703 mov si, offset clicmd ;print command line after 446 0273 8B0E0804 mov cx, clicmdlen ;parameter substitution 447 0277 E86E03 05E8 call printcmdline 448 449 ; 450 ; echo newline 451 ; 452 453 027A E8EF03 066C call crlf 454 455 ; 456 ; make sure not a null command 457 ; 458 459 027D 8D1E0503 lea bx,cmd 460 0281 803E04030074 0304 cmp blen,0 ! je gonextcmd 461 7C 0304 462 dblank: 463 0288 803F207405 0292 cmp byte ptr [bx],' ' ! je zapblank 464 028D 803F097507 0299 cmp byte ptr [bx],9 ! jne noblanks ;no tabs 465 zapblank: 466 0292 43FE0E0403EB 0288 inc bx ! dec blen ! jmps dblank 467 EF 0288 468 noblanks: 469 0299 8D0605033BC3 02B2 lea ax,cmd ! cmp ax,bx ! je chksemi 470 7411 02B2 471 ; remove leading blanks 472 02A1 1E0732ED8A0E push ds ! pop es ! xor ch,ch ! mov cl,blen 473 0403 474 02A9 8BF88BF3FCF3 mov di,ax ! mov si,bx ! cld ! rep movsb 475 A4 476 02B0 8BD8 mov bx,ax 477 chksemi: ; see if line starts with semicolon CP/M ASM86 1.1 SOURCE: SUBMIT.A86 PAGE 10 478 479 02B2 803F3B744D 0304 cmp byte ptr [bx],';' ! je gonextcmd 480 481 ; 482 ; see if disk change - if 'X:' change def disk to X 483 ; 484 485 02B7 803E04030275 0307 cmp blen,2 ! jne notdrive 486 49 0307 487 02BE 807F013A756D 0331 cmp byte ptr 1[bx],':' ! jne try_builtin 488 489 ; change default disk 490 491 02C4 8A17 mov dl,[bx] ;get disk name 492 02C6 80E25F and dl,5fh ;make Upper Case 493 02C9 80EA41 sub dl,'A' ;make disk number 494 495 ; check bounds 496 497 02CC 80FA007205 02D6 cmp dl,0 ! jb subex 498 02D1 80FA0F7612 02E8 cmp dl,15 ! jbe okdrive 499 subex: 500 02D6 BAD007E89303 066F mov dx,offset errstr ! call print_string 501 02DC BA5A08E88D03 066F mov dx,offset drverr ! call print_string !call crlf 502 E88703 066F 503 02E5 E95402 053C jmp submitabort 504 okdrive: 505 02E8 52E8AE035A 069A push dx ! call setdisk ! pop dx ; select default disk 506 02ED 803E470400 cmp fix_parent,false 507 02F2 7410 0304 jz gonextcmd ;don't change parent's drive 508 02F4 8B1E450485DB mov bx,parent_offset ! test bx,bx 509 02FA 7408 0304 jz gonextcmd ;parent doesn't exist 510 02FC 8E064304 mov es,sysdatseg 511 0300 26885712 mov es:p_drv[bx],dl 512 513 0304 E9C901 04D0 gonextcmd: jmp getnxtcmd 514 515 0307 BF8703 notdrive: mov di,offset clicmd 516 030A BE1C04 mov si, offset parseresult 517 030D E8E902 05F9 call parsefilename 518 0310 E311 0323 jcxz goodparse 519 0312 B17E mov cl,126 520 0314 BF8703 mov di,offset clicmd 521 0317 B020 mov al, ' ' 522 0319 0E07 push cs ! pop es 523 031B F2AE repne scasb 524 031D C60524 mov byte ptr[di], '$' 525 0320 E9D701 04FA jmp clierror 526 527 0323 891E1A04 goodparse: mov parseret,bx 528 0327 803E1C040074 0331 cmp parseresult,0 ! jz try_builtin 529 03 0331 530 032E E96D01 049E jmp not_builtin CP/M ASM86 1.1 SOURCE: SUBMIT.A86 PAGE 11 531 532 533 try_builtin: 534 0331 BF4804 mov di,offset usercmd 535 0334 BE1C0446 mov si,offset parseresult ! inc si 536 0338 1E07 push ds ! pop es 537 033A B90400F3A7 mov cx,4 ! repz cmpsw 538 033F 7566 03A7 jnz notuser 539 540 0341 BE1C04 mov si,offset parseresult 541 0344 8B3E1A0483FF mov di,parseret ! cmp di,0 542 00 543 034B 7443 0390 je pruser 544 034D E8A902 05F9 call parsefilename ; CX = 0 if ok 545 0350 83F900753B 0390 cmp cx,0 ! jne pruser 546 0355 BE1C0446 mov si,offset parseresult ! inc si 547 0359 8B14 mov dx,[si] 548 035B E8AB02 0609 call a_to_b 549 035E 80FB0F7724 0387 cmp bl,15 ! ja usererr 550 0363 8AD352 mov dl,bl ! push dx 551 0366 E8FF025A 0668 call setuser ! pop dx 552 036A 88160E04 mov defuser,dl 553 036E 803E470400 cmp fix_parent,false 554 0373 741B 0390 jz pruser ;don't fix parent 555 0375 8B1E450485DB mov bx,parent_offset ! test bx,bx 556 037B 7413 0390 jz pruser ;parent doesn't exist 557 037D 8E064304 mov es,sysdatseg 558 0381 26885713 mov es:p_user[bx],dl 559 0385 EB09 0390 jmps pruser 560 0387 BA2207 usererr: mov dx,offset usererrmsg 561 038A E8E202 066F call print_string 562 038D E9AC01 053C jmp submitabort ;any error fatal 563 0390 BA3A07 pruser: mov dx,offset usermsg 564 0393 E8D902 066F call print_string 565 0396 E8CD02 0666 call getuser 566 0399 8AD3E8A502 0643 mov dl,bl ! call prnum 567 039E E8CB02E8C802 066C call crlf ! call crlf 568 03A4 E92901 04D0 jmp getnxtcmd 569 notuser: 570 03A7 BE1C0446 mov si,offset parseresult ! inc si 571 03AB BF5004 mov di,offset printercmd 572 03AE 1E07 push ds ! pop es 573 03B0 B90400F3A7 mov cx,4 ! repz cmpsw 574 03B5 7561 0418 jnz notprinter 575 576 03B7 BE1C04 mov si,offset parseresult 577 03BA 8B3E1A0485FF mov di,parseret ! test di,di 578 03C0 743F 0401 jz prprinter 579 03C2 E83402 05F9 call parsefilename ; CX = 0 if ok 580 03C5 83F9007537 0401 cmp cx,0 ! jne prprinter; no tail 581 03CA BE1C0446 mov si,offset parseresult ! inc si 582 03CE 8B14 mov dx,[si] 583 03D0 E83602 0609 call a_to_b CP/M ASM86 1.1 SOURCE: SUBMIT.A86 PAGE 12 584 585 03D3 80FBFF7409 03E1 cmp bl,0ffh ! je printererr 586 03D8 8AD352 mov dl,bl ! push dx 587 03DB E8C4025A 06A2 call setlist ! pop dx 588 03DF E309 03EA jcxz setparent ;CX=0 if ok list # 589 03E1 BA4907 printererr: mov dx,offset printererrmsg 590 03E4 E88802E95201 066F call print_string ! jmp submitabort ;any err fatal 591 setparent: 592 03EA 803E470400 cmp fix_parent,false 593 03EF 7410 0401 jz prprinter ;don't fix parent 594 03F1 8B1E450485DB mov bx,parent_offset ! test bx,bx 595 03F7 7408 0401 jz prprinter ;check for parent 596 03F9 8E064304 mov es,sysdat_seg 597 03FD 26885724 mov es:p_list[bx],dl ;0 relative 598 ;in CCP/M 599 prprinter: 600 0401 BA6407 mov dx,offset printermsg 601 0404 E86802 066F call print_string 602 0407 E89C02 06A6 call getlist 603 040A 8AD3E83402 0643 mov dl,bl ! call prnum 604 040F E85A02E85702 066C call crlf ! call crlf 605 0415 E9B800 04D0 jmp getnxtcmd 606 607 notprinter: 608 ; check for '$include' option 609 610 0418 BE1C0446 mov si,offset parseresult ! inc si 611 041C BF5804 mov di,offset includecmd 612 041F 1E07 push ds ! pop es 613 0421 B90400F3A7 mov cx,4 ! repz cmpsw 614 0426 753A 0462 jnz notinclude 615 616 0428 BE1C04 mov si,offset parseresult 617 042B 8B3E1A0485FF mov di,parseret ! test di,di 618 0431 742F 0462 jz notinclude 619 0433 E8C301 05F9 call parsefilename ; CX = 0 if ok 620 0436 83F900751E 0459 cmp cx,0 ! jne includerr; no tail 621 043B 8B364104 mov si,pdadr 622 043F 83C608 add si,p_name 623 0442 BF8703 mov di,offset clicmd 624 0445 B104 mov cl,4 625 0447 1E07 push ds ! pop es 626 0449 1E8E1E4304 push ds ! mov ds,sysdatseg 627 ; overwrite $include with 628 044E F3A5 rep movsw ; name of this program 629 ; for recursive submits 630 0450 1F pop ds 631 0451 BA8607 mov dx,offset includemsg 632 0454 E81802 066F call print_string 633 634 0457 EB45 049E jmps clicall ; send submit command 635 636 0459 BA7607 includerr: mov dx,offset includerrmsg CP/M ASM86 1.1 SOURCE: SUBMIT.A86 PAGE 13 637 638 045C E81002 066F call print_string 639 045F E9DA00 053C jmp submitabort 640 notinclude: 641 ; check for '$global' option 642 643 0462 BE1C0446 mov si,offset parseresult ! inc si 644 0466 BF6004 mov di,offset globalcmd 645 0469 1E07 push ds ! pop es 646 046B B90400F3A7 mov cx,4 ! repz cmpsw 647 0470 750E 0480 jnz notglobcmd 648 649 0472 C6064704FF mov fix_parent,true ;for d:, USER & PRINTER cmds 650 0477 BA9107 mov dx,offset globalmsg 651 047A E8F201 066F call print_string 652 047D E95000 04D0 jmp getnxtcmd 653 notglobcmd: 654 ; check for '$local' option 655 656 0480 BE1C0446 mov si,offset parseresult ! inc si 657 0484 BF6804 mov di,offset localcmd 658 0487 1E07 push ds ! pop es 659 0489 B90400F3A7 mov cx,4 ! repz cmpsw 660 048E 750E 049E jnz notlocal 661 662 0490 C606470400 mov fix_parent,false ;for d:, USER & PRINTER cmds 663 0495 BAA307 mov dx,offset localmsg 664 0498 E8D401 066F call print_string 665 049B E93200 04D0 jmp getnxtcmd 666 notlocal: 667 668 notbuiltin: 669 670 ;======= 671 cli_call: ; SEND CLI COMMAND 672 ;======= 673 674 ; initialize Cli Control Block 675 676 049E C606860300 mov clicb_net,0 677 ; make cli call 678 679 04A3 C6064004FF mov cmdsent,true 680 04A8 803E7F02FF cmp no_more_cmds,true 681 04AD 7513 04C2 jne gocli 682 04AF BA8703 mov dx,offset clicmd ;this is the last command 683 04B2 B11A mov cl,mpm_setdma 684 04B4 E8E9FC 01A0 call mpm 685 04B7 B12F mov cl,mpm_chain 686 04B9 E8E4FC 01A0 call mpm 687 ;returned from chain 688 04BC B91E00 mov cx,e_bad_open 689 04BF E93800 04FA jmp clierror CP/M ASM86 1.1 SOURCE: SUBMIT.A86 PAGE 14 690 691 gocli: 692 04C2 8D168603B196 lea dx,clicb ! mov cl,mpm_clicmd 693 04C8 E8D5FC 01A0 call mpm 694 04CB 83FB00752A 04FA cmp bx,0 ! jne clierror 695 ;jmps get_nxtcmd 696 697 getnxtcmd: 698 04D0 803E7F02FF cmp no_more_cmds,true 699 04D5 7503 04DA jne getnxt2 700 04D7 E9C1FC 019B jmp submitexit ;terminate if no more commands 701 getnxt2: 702 04DA E8CD01 06AA call attach ;get the console back 703 ;before the TMP does 704 705 04DD BE8002 mov si,offset lcmdbuf ;copy look ahead command 706 04E0 BF0303 mov di,offset cmdbuf ;buffer to cmdbuf 707 04E3 B98300 mov cx,maxcmdlen+3 ;cmd buffer length 708 04E6 8CD8 mov ax,ds 709 04E8 8EC0 mov es,ax 710 04EA FC cld 711 04EB F3A4 rep movsb 712 713 04ED BA8002 mov dx,offset lcmdbuf ;get look ahead command 714 04F0 E85200 0545 call readbuffer 715 04F3 881E7F02 mov no_more_cmds,bl ;true if EOF 716 04F7 E9A9FC 01A3 jmp topofcmdloop ;and look ahead to see 717 ;if there are more commands 718 719 ;======== 720 clierror: 721 ;======== 722 ; Cli call unsuccesful, analyze and display err msg 723 ; input: CX = ERROR CODE 724 725 04FA BEBF06 mov si,(offset clierrtab)-4 726 04FD 1E0E1F push ds ! push cs ! pop ds 727 nexterr: 728 0500 83C604 add si,4 729 0503 2E83BC0000FF 0512 cmp cs:word ptr [si],0ffffh ! je unknownerr 730 7407 0512 731 050B 2E3B8C000075 0500 cmp cx,cs:[si] ! jne nexterr 732 EE 0500 733 unknownerr: 734 0512 2E8B940200 mov dx,cs:2[si] 735 0517 1F pop ds 736 ; jmps showerr 737 738 739 showerr: ; Print Error String 740 ;------- ; input: DX = string in CSEG 741 742 0518 52E85001 066C perr: push dx ! call crlf CP/M ASM86 1.1 SOURCE: SUBMIT.A86 PAGE 15 743 744 051C BAD007E84D01 066F mov dx, offset errstr ! call print_string 745 0522 5AE84901E843 066F pop dx ! call print_string ! call crlf 746 01 066F 747 0529 BA6808E84001 066F mov dx, offset cmdstr ! call print_string 748 052F BE8703 mov si, offset clicmd 749 0532 8B0E0804 mov cx, clicmdlen 750 0536 E8AF00E83001 05E8 call printcmdline ! call crlf 751 ;jmp submitabort ;any error at this level is fatal 752 753 ;=========== 754 submitabort: 755 ;=========== 756 ; Tell user we are aborting 757 053C BAB607E82D01 066F mov dx,offset abortstr ! call print_string 758 0542 E956FC 019B jmp submitexit 759 760 ;========== 761 readbuffer: 762 ;========== 763 ; Simulate Read Console buffer from a disk file. 764 ; input: DX = buffer address 765 ; output: BX = 0ffffh if EOF 766 767 0545 8BFA mov di,dx 768 0547 32C0 xor al,al 769 0549 884501 mov 1[di],al ;no chars read 770 054C 3805 cmp 0[di],al ;zero length buffer 771 054E 7504 0554 jnz buf_ok ;return no error - nop 772 0550 BBFFFF mov bx,0ffffh ;ready for error 773 0553 C3 ret 774 buf_ok: 775 0554 8BF74646 mov si,di ! inc si ! inc si 776 ;si is next char 777 read_another: 778 0558 8A4501 mov al,1[di] 779 055B 3A05 cmp al,[di] 780 055D 731E 057D jae done_ok ;full buffer 781 055F 57 push di 782 0560 E82700 058A call readchar ;fills [si] 783 0563 5F pop di 784 0564 83FB00 cmp bx,0 ;non-zero or eof error 785 0567 7401 056A jz not_error 786 0569 C3 ret 787 not_error: 788 056A 803C0A7502 0571 cmp byte ptr [si],0ah ! jne not_lf 789 056F EB0C 057D jmps done_ok 790 0571 803C0D7407 057D not_lf: cmp byte ptr [si],0dh ! je done_ok 791 792 0576 FE4501 inc byte ptr 1[di] ;not cr, inc buffer count 793 0579 46 inc si ;inc char position 794 057A E9DBFF 0558 jmp read_another 795 done_ok: CP/M ASM86 1.1 SOURCE: SUBMIT.A86 PAGE 16 796 797 057D 807D0100 cmp byte ptr 1[di],0 ;no characters read in buffer 798 0581 74D5 0558 jz read_another ;skip leading cr's and lf's 799 0583 C60400 mov byte ptr [si],0 800 0586 BB0000C3 mov bx,0 ! ret 801 802 ;======== 803 readchar: 804 ;======== 805 ; Read a character from file. 806 ; input = SI is address of where to put character 807 ; output = BX = 0ffffh if error or EOF 808 ; 809 058A 32FF xor bh,bh 810 058C 8A1E0F04 mov bl,buf_ptr ;char ptr in dma buffer 811 0590 80FB80 cmp bl,128 812 0593 7231 05C6 jb no_read 813 0595 56 push si 814 0596 8A160A04 mov dl,command_user ;user number of command file 815 059A E8CB00 0668 call setuser 816 059D BB5C00 mov bx,offset fcb 817 05A0 A00B04 mov al,command_disk ;disk drive number of command file 818 05A3 8807 mov [bx],al ;re-open each time to allow deletion 819 05A5 804F0680 or byte ptr mode2[bx],80h ;of command file, open in R/O mode 820 05A9 8BD3 mov dx,bx 821 05AB E80801 06B6 call openfile 822 05AE 3CFF cmp al,0ffh 823 05B0 7428 05DA jz readerr 824 05B2 BA5C00 mov dx,offset fcb 825 05B5 E80601 06BE call readfile ;read sequential 826 05B8 3C00 cmp al,0 827 05BA 751E 05DA jnz readerr 828 05BC BA5C00 mov dx,offset fcb 829 05BF E8F800 06BA call closefile 830 05C2 BB0000 mov bx,0 831 05C5 5E pop si 832 no_read: 833 05C6 8A873C01 mov al,dma[bx] 834 05CA 3C1A cmp al,1ah ;check for EOF 835 05CC 740D 05DB jz ret_eof 836 05CE 8804 mov [si],al 837 05D0 FEC3 inc bl 838 05D2 881E0F04 mov buf_ptr,bl ;point to next char in disk buffer 839 05D6 33DB xor bx,bx 840 05D8 EB04 05DE jmps read_ret 841 842 readerr: 843 05DA 5E pop si 844 ret_eof: 845 05DB BBFFFF mov bx,0ffffh ;error or eof 846 ;jmps read_ret 847 848 read_ret: CP/M ASM86 1.1 SOURCE: SUBMIT.A86 PAGE 17 849 850 05DE 538A160E04E8 0668 push bx ! mov dl,defuser ! call setuser ! pop bx 851 82005B 0668 852 05E7 C3 ret 853 854 ;***************************************************** 855 ;* 856 ;* SUBROUTINES 857 ;* 858 ;***************************************************** 859 860 printcmdline: ;SI = string to print, CX = length 861 05E8 85C9 test cx,cx ;print byte by byte 862 05EA 740C 05F8 jz blank ;to include $ signs 863 moreecho: 864 05EC AC lodsb 865 05ED 8AD0 mov dl,al 866 05EF 5156 push cx ! push si 867 05F1 E86E00 0662 call prchar 868 05F4 5E59 pop si ! pop cx 869 05F6 E2F4 05EC loop moreecho 870 blank: 871 05F8 C3 ret 872 873 parsefilename: ;SI = fcb DI = string 874 05F9 B99800 mov cx,mpm_parse 875 05FC BB1604 mov bx,offset pcb 876 05FF 893F897702 mov [bx],di ! mov 2[bx],si 877 0604 8BD3E997FB 01A0 mov dx,bx ! jmp mpm 878 879 a_to_b: ;dl = 1st char, dh = 2nd char 880 0609 80FE207504 0612 cmp dh,' ' ! jne atob2char 881 060E 8AF2B230 mov dh,dl ! mov dl,'0' 882 0612 80FE307229 0640 atob2char: cmp dh,'0' ! jb atoberr 883 0617 80FE397724 0640 cmp dh,'9' ! ja atoberr 884 061C 80FA30721F 0640 cmp dl,'0' ! jb atoberr 885 0621 80FA39771A 0640 cmp dl,'9' ! ja atoberr 886 0626 80EE3080EA30 sub dh,'0' ! sub dl,'0' 887 062C B800008AC2 mov ax,0 ! mov al,dl 888 0631 52B10AF6E15A push dx ! mov cl,10 ! mul cl ! pop dx 889 0637 8AD6B60003C2 mov dl,dh ! mov dh,0 ! add ax,dx 890 063D 8BD8C3 mov bx,ax ! ret 891 0640 B3FFC3 atoberr: mov bl,0ffh ! ret 892 prnum: ; dl = num (0-15) 893 0643 80FA0A720A 0652 cmp dl,10 ! jb prnum_one 894 0648 52 push dx 895 0649 B231E81400 0662 mov dl,'1' ! call prchar 896 064E 5A80EA0A pop dx ! sub dl,10 897 0652 80C230 prnum_one: add dl,'0' 898 0655 E90A00 0662 jmp prchar 899 900 0658 33D28BCAEB62 06C0 terminate: xor dx,dx ! mov cx,dx ! jmps mpm1 901 065E B101EB5E 06C0 charin: mov cl,mpm_conin ! jmps mpm1 CP/M ASM86 1.1 SOURCE: SUBMIT.A86 PAGE 18 902 903 0662 B102EB5A 06C0 prchar: mov cl,mpm_conout ! jmps mpm1 904 0666 B2FF getuser: mov dl,0ffh 905 0668 B120EB54 06C0 setuser: mov cl,mpm_usercode ! jmps mpm1 906 066C BA1F07 crlf: mov dx,offset crlfstr 907 ;jmp printstring 908 066F 1E8CC88ED8 print_string: push ds ! mov ax,cs ! mov ds,ax 909 0674 E802001FC3 0679 call print_ds_string ! pop ds ! ret 910 print_ds_string: 911 0679 061E07 push es ! push ds ! pop es 912 067C 8BF2 mov si,dx 913 067E 8BFA mov di,dx 914 0680 B9FFFF mov cx,0FFFFH 915 mask: 916 0683 AC lodsb 917 0684 247F and al,07FH ;mask parity 918 0686 AA stosb 919 0687 3C247402 068D cmp al, '$' ! je print_it 920 068B E2F6 0683 loop mask 921 print_it: 922 068D 07 pop es 923 068E B109EB2E 06C0 mov cl,mpm_conwrite ! jmps mpm1 924 0692 B199EB2A 06C0 getconsole: mov cl,mpm_getdefcon ! jmps mpm1 925 0696 B194EB26 06C0 setconsole: mov cl,mpm_setdefcon ! jmps mpm1 926 069A B10EEB22 06C0 setdisk: mov cl,mpm_diskselect ! jmps mpm1 927 069E B119EB1E 06C0 getdisk: mov cl,mpm_getdefdisk ! jmps mpm1 928 06A2 B1A0EB1A 06C0 setlist: mov cl,mpm_setdeflst ! jmps mpm1 929 06A6 B1A4EB16 06C0 getlist: mov cl,mpm_getdeflst ! jmps mpm1 930 06AA B192EB12 06C0 attach: mov cl,mpm_conattach ! jmps mpm1 931 06AE B193EB0E 06C0 detach: mov cl,mpm_condetach ! jmps mpm1 932 06B2 B10AEB0A 06C0 conread: mov cl,mpm_conread ! jmps mpm1 933 06B6 B10FEB06 06C0 openfile: mov cl,mpm_openfile ! jmps mpm1 934 06BA B110EB02 06C0 closefile: mov cl,mpm_closefile ! jmps mpm1 935 06BE B114 readfile: mov cl,mpm_readfile ;!; jmps mpm1 936 mpm1: 937 06C0 E9DDFA 01A0 jmp mpm 938 939 940 ;***************************************************** 941 ;* 942 ;* CODE DATA AREA - can be shared 943 ;* 944 ;***************************************************** 945 946 06C3 1F000000 clierrtab dw e_nullcmd, 0 ;null command 947 06C7 0300DD07 dw e_no_memory, memerr ;No memory 948 06CB 0C00EF07 dw e_no_pd, pderr ;No unused PD 949 06CF 1800FD07 dw e_badfname, fnameerr;Ill. command 950 06D3 1700FD07 dw e_illdisk, fnameerr;Ill. disk 951 06D7 2600FD07 dw e_ill_passwd, fnameerr;Ill. password 952 06DB 1900FD07 dw e_badftype, fnameerr;Ill. type 953 06DF 1C001D08 dw e_bad_load, loaderr ; 954 06E3 1D001D08 dw e_bad_read, loaderr ; CP/M ASM86 1.1 SOURCE: SUBMIT.A86 PAGE 19 955 956 06E7 1E002808 dw e_bad_open, openerr ; 957 06EB 0F003B08 dw e_q_full, qfullerr; 958 06EF 28005008 dw e_abort, aborterr; 959 960 ; a few extra entries for future errors 961 962 06F3 FFFF0B08 dw 0ffffh, catcherr; 963 06F7 FFFF0B08 dw 0ffffh, catcherr; 964 06FB FFFF0B08 dw 0ffffh, catcherr; 965 06FF FFFF0B08 dw 0ffffh, catcherr; 966 967 ; MESSAGES 968 969 0703 526571756972 wrongvers db 'Requires CCP/M-86 or MP/M-86' 970 657320434350 971 2F4D2D383620 972 6F72204D502F 973 4D2D3836 974 071F 0A0D24 crlfstr db 10,13,'$' 975 976 0722 0D0A496E7661 usererrmsg db 13,10,'Invalid User Number',13,10,'$' 977 6C6964205573 978 6572204E756D 979 6265720D0A24 980 073A 55736572204E usermsg db 'User Number = $' 981 756D62657220 982 3D2024 983 0749 0D0A496E7661 printererrmsg db 13,10,'Invalid Printer Number',13,10,'$' 984 6C6964205072 985 696E74657220 986 4E756D626572 987 0D0A24 988 0764 5072696E7465 printermsg db 'Printer Number = $' 989 72204E756D62 990 6572203D2024 991 0776 0D0A496E636C includerrmsg db 13,10,'Include Error$' 992 756465204572 993 726F7224 994 0786 287375626D69 includemsg db '(submit)',10,13,'$' 995 74290A0D24 996 0791 476C6F62616C globalmsg db 'Global mode ON',13,10,10,'$' 997 206D6F646520 998 4F4E0D0A0A24 999 07A3 476C6F62616C localmsg db 'Global mode OFF',13,10,10,'$' 1000 206D6F646520 1001 4F46460D0A0A 1002 24 1003 07B6 5355424D4954 abortstr db 'SUBMIT can not continue',13,10,'$' 1004 2063616E206E 1005 6F7420636F6E 1006 74696E75650D 1007 0A24 CP/M ASM86 1.1 SOURCE: SUBMIT.A86 PAGE 20 1008 1009 1010 07D0 43502F4D2045 errstr db 'CP/M Error: $' 1011 72726F723A20 1012 24 1013 07DD 4E6F7420456E memerr db 'Not Enough Memory$' 1014 6F756768204D 1015 656D6F727924 1016 07EF 504420546162 pderr db 'PD Table Full$' 1017 6C652046756C 1018 6C24 1019 07FD 426164204669 fnameerr db 'Bad File Spec$' 1020 6C6520537065 1021 6324 1022 080B 556E6B6E6F77 catcherr db 'Unknown CLI Error$' ;we should never print 1023 6E20434C4920 1024 4572726F7224 1025 ;this error, it means 1026 ;we have added CLI 1027 ;error returns and 1028 ;have not updated SUBMIT 1029 081D 4C6F61642045 loaderr db 'Load Error$' 1030 72726F7224 1031 0828 43616E277420 openerr db 'Can''t Find Command$' 1032 46696E642043 1033 6F6D6D616E64 1034 24 1035 083B 52535020436F qfullerr db 'RSP Command Que Full$' 1036 6D6D616E6420 1037 517565204675 1038 6C6C24 1039 0850 434C49204162 aborterr db 'CLI Abort$' 1040 6F727424 1041 085A 496E76616C69 drverr db 'Invalid Drive$' 1042 642044726976 1043 6524 1044 0868 436F6D6D616E cmdstr db 'Command = $' 1045 64203D2024 1046 1047 0873 4E6F20275355 sopen_err db 'No ''SUB'' File Present',10,13, '$' 1048 42272046696C 1049 652050726573 1050 656E740A0D24 1051 1052 1053 ;***************************************************** 1054 ;* 1055 ;* Data Area - separate per invokation of SUBMIT 1056 ;* 1057 ;***************************************************** 1058 1059 dseg 1060 org 05cH CP/M ASM86 1.1 SOURCE: SUBMIT.A86 PAGE 21 1061 1062 1063 005C fcb rb 32 1064 007C 00 cr db 0 ;current record 1065 007D r0 rw 0 1066 007D r2 rb 0 1067 1068 org 080h 1069 1070 0080 cmdtail rb 128 1071 1072 0100 CCCCCCCCCCCC stack dw 0cccch,0cccch,0cccch 1073 0106 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch 1074 010C CCCCCCCCCCCC dw 0cccch,0cccch,0cccch 1075 0112 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch 1076 0118 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch 1077 011E CCCCCCCCCCCC dw 0cccch,0cccch,0cccch 1078 0124 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch 1079 012A CCCCCCCCCCCC dw 0cccch,0cccch,0cccch 1080 0130 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch 1081 0136 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch 1082 013C stacktop rw 0 1083 1084 0080 maxcmdlen equ 128 1085 1086 ; the Read Console Buffer and the 1087 ; Cli Control Block share the same memory 1088 1089 013C dma rb 128 1090 1091 01BC numargs rw 1 1092 01BE argtable rb 64 ;address of arguments in cmdtail 1093 01FE deblankbuf rb maxcmdlen + 1 1094 1095 027F 00 no_more_cmds db false ;set to true when EOF is 1096 ;found 1097 0280 lcmdbuf rb 1 1098 0281 lblen rb 1 ;read from disk to here, 1099 0282 lcmd rb maxcmdlen + 1 ;copy this to CMD 1100 1101 0303 cmdbuf rb 1 ;current cmd goes here 1102 0304 blen rb 1 1103 0305 cmd rb maxcmdlen + 1 ;copy w/ expanded args to CLICMD 1104 1105 0386 clicb rb 0 ;cmd w/ expanded args goes here 1106 0386 00 clicb_net db 0 1107 0387 clicmd rb maxcmdlen+1 1108 0408 0000 clicmdlen dw 0 1109 1110 040A command_user rb 1 1111 040B command_disk rb 1 1112 040C command_con rb 1 1113 040D defdisk rb 1 CP/M ASM86 1.1 SOURCE: SUBMIT.A86 PAGE 22 1114 1115 040E defuser rb 1 1116 040F 80 buf_ptr db 128 ;force initial read 1117 ;in readchar routine 1118 0410 0D prompt db 13 1119 0411 30 promptutens db '0' 1120 0412 30 promptuones db '0' 1121 0413 41 promptdisk db 'A' 1122 0414 3E24 promptend db '>$' 1123 1124 0416 8703 pcb dw offset clicmd 1125 0418 1C04 dw offset parseresult 1126 1127 041A 0000 parseret dw 0 1128 041C parseresult rb 36 1129 0440 00 cmdsent db false 1130 1131 0441 pdadr rw 1 ;our pd address 1132 0443 sysdatseg rw 1 ;the system data area's segment 1133 0445 parent_offset rw 1 ;parents pd address 1134 0447 00 fix_parent db false ;local/global mode 1135 1136 0448 555345522020 usercmd db 'USER ' 1137 2020 1138 0450 5052494E5445 printercmd db 'PRINTER ' 1139 5220 1140 0458 24494E434C55 includecmd db '$INCLUDE' 1141 4445 1142 0460 24474C4F4241 globalcmd db '$GLOBAL ' 1143 4C20 1144 0468 244C4F43414C localcmd db '$LOCAL ' 1145 2020 1146 1147 end 1148 1149 1150 END OF ASSEMBLY. NUMBER OF ERRORS: 0. USE FACTOR: 17% CP/M ASM86 1.1 SOURCE: SUBMIT.A86 PAGE 023 ABORTERR 0850 V 958 1039# ABORTSTR 07B6 V 757 1003# ARGMAYBE 020F L 376 382# ARGTABLE 01BE V 253 414 1092# ATOB 0609 L 548 583 879# ATOB2CHAR 0612 L 880 882# ATOBERR 0640 L 882 883 884 885 891# ATTACH 06AA L 702 930# BLANK 05F8 L 862 870# BLEN 0304 V 460 466 472 485 1102# BUFOK 0554 L 771 774# BUFPTR 040F V 810 838 1116# CATCHERR 080B V 962 963 964 965 1022# CHARIN 065E L 901# CHKSEMI 02B2 L 469 477# CLICALL 049E L 634 671# CLICB 0386 V 692 1105# CLICBNET 0386 V 676 1106# CLICMD 0387 V 369 445 515 520 623 682 748 1107# 1124 CLICMDLEN 0408 V 440 446 749 1108# CLIERROR 04FA L 525 689 694 720# CLIERRTAB 06C3 V 725 946# CLOSEFILE 06BA L 183 829 934# CMD 0305 V 368 459 469 1103# CMDBUF 0303 V 277 278 706 1101# CMDSENT 0440 V 311 313 679 1129# CMDSTR 0868 V 747 1044# CMDTAIL 0080 V 199 1070# COMMANDCON 040C V 193 1112# COMMANDDISK 040B V 190 817 1111# COMMANDUSER 040A V 148 163 814 1110# CONREAD 06B2 L 932# COPYARG 0240 L 409# COPYCHAR 0131 L 219 221# COPYIT 025A L 378 419 424# COPYMORE 024C L 415# 421 CR 007C V 1064# CRLF 066C L 275 314 453 501 567 567 604 604 742 745 750 906# CRLFSTR 071F V 906 974# CS SREG V 522 726 729 731 734 908 DBLANK 0288 L 462# 466 DEBLANK 0124 L 207 211# 226 243 DEBLANKBUF 01FE V 200 252 416 1093# DEDONE 0153 L 231 245# DEFDISK 040D V 327 351 1113# DEFUSER 040E V 149 335 552 850 1115# DETACH 06AE L 931# DMA 013C V 144 833 1089# DONECOPY 026A L 434 437 439# DONEOK 057D L 780 789 790 795# DRVERR 085A V 501 1041# DS SREG V 108 472 536 572 612 625 626 626 630 645 CP/M ASM86 1.1 SOURCE: SUBMIT.A86 PAGE 024 658 708 726 726 735 908 908 909 911 EABORT 0028 N 84# 958 EBADFNAME 0018 N 76# 949 EBADFTYPE 0019 N 77# 952 EBADLOAD 001C N 78# 953 EBADOPEN 001E N 80# 688 956 EBADREAD 001D N 79# 954 ECHOCMD 0270 L 380 444# EILLDISK 0017 N 75# 950 EILLLST 0025 N 82# EILLPASSWD 0026 N 83# 951 ENOMEMORY 0003 N 72# 947 ENOPD 000C N 73# 948 ENULLCMD 001F N 81# 946 EQFULL 000F N 74# 957 ERRSTR 07D0 V 500 744 1010# ES SREG V 131 132 136 165 166 472 510 511 522 536 557 558 572 596 597 612 625 645 658 709 911 911 922 EXISTS 00F4 L 159 175 181# FALSE 0000 N 34# 311 313 506 553 592 662 1095 1129 1134 FCB 005C V 151 168 169 173 182 184 816 824 828 1063# FILLDONE 0173 L 259 273# FIRSTWHITES 0115 L 201# 210 FIXPARENT 0447 V 506 553 592 649 662 1134# FNAMEERR 07FD V 949 950 951 952 1019# FTYPE 0009 N 68# 152 153 154 GETCONSOLE 0692 L 192 924# GETDISK 069E L 187 326 927# GETLIST 06A6 L 602 929# GETNXT2 04DA L 699 701# GETNXTCMD 04D0 L 513 568 605 652 665 697# GETUSER 0666 L 147 334 565 904# GLOBALCMD 0460 V 644 1142# GLOBALMSG 0791 V 650 996# GOCLI 04C2 L 681 691# GONEXTCMD 0304 L 460 479 507 509 513# GOODPARSE 0323 L 518 527# INCLUDECMD 0458 V 611 1140# INCLUDEMSG 0786 V 631 994# INCLUDERR 0459 L 620 636# INCLUDERRMSG 0776 V 636 991# LBLEN 0281 V 1098# LCMD 0282 V 1099# LCMDBUF 0280 V 283 284 705 713 1097# LOADERR 081D V 953 954 1029# LOCALCMD 0468 V 657 1144# LOCALMSG 07A3 V 663 999# MASK 0683 L 915# 920 MAXCMDLEN 0080 N 277 283 433 707 1084# 1093 1099 1103 1107 MEMERR 07DD V 947 1013# MODE2 0006 N 66# 155 819 MODESYS 000A N 67# 174 CP/M ASM86 1.1 SOURCE: SUBMIT.A86 PAGE 025 MOREECHO 05EC L 863# 869 MOREWHITES 0121 L 204 208# MPM 01A0 L 115 129 141 145 298# 684 686 693 877 937 MPM1 06C0 L 900 901 903 905 923 924 925 926 927 928 929 930 931 932 933 934 936# MPMCHAIN 002F N 51# 685 MPMCLICMD 0096 N 58# 692 MPMCLOSEFILE 0010 N 46# 934 MPMCONATTACH 0092 N 55# 930 MPMCONDETACH 0093 N 56# 931 MPMCONIN 0001 N 38# 901 MPMCONOUT 0002 N 39# 903 MPMCONREAD 000A N 41# 932 MPMCONSTAT 000B N 42# MPMCONWRITE 0009 N 40# 923 MPMDISKSELECT 000E N 44# 926 MPMGETDEFCON 0099 N 60# 924 MPMGETDEFDISK 0019 N 48# 927 MPMGETDEFLST 00A4 N 63# 929 MPMGETPDADR 009C N 61# 128 MPMINT 00E0 N 36# 301 MPMOPENFILE 000F N 45# 933 MPMPARSE 0098 N 59# 874 MPMREADFILE 0014 N 47# 935 MPMSETDEFCON 0094 N 57# 925 MPMSETDEFLST 00A0 N 62# 928 MPMSETDMA 001A N 49# 143 683 MPMSETPRIOR 0091 N 53# 140 MPMTERMINATE 008F N 52# MPMUSERCODE 0020 N 50# 905 MPMVERSION 000C N 43# 114 NEXTCHAR 0201 L 371# 379 412 418 NEXTERR 0500 L 727# 731 NOARG 0208 L 377# 386 389 391 NOBLANKS 0299 L 464 468# NOCLEARLINE 01B2 L 311 316# NOMORECMDS 027F V 286 680 698 715 1095# NOREAD 05C6 L 812 832# NOTBUILTIN 049E L 530 668# NOTDRIVE 0307 L 485 515# NOTERROR 056A L 785 787# NOTGLOBCMD 0480 L 647 653# NOTINCLUDE 0462 L 614 618 640# NOTLF 0571 L 788 790# NOTLOCAL 049E L 660 666# NOTPRINTER 0418 L 574 607# NOTUSER 03A7 L 538 569# NUMARGS 01BC V 274 410 1091# NUMERIC 0217 L 384 387# NXTFILL 015D L 256# 263 OKDRIVE 02E8 L 498 504# OKNUM 0248 L 411 413# OKVERS 0064 L 117 118 122# CP/M ASM86 1.1 SOURCE: SUBMIT.A86 PAGE 026 ONEDIGIT 023E L 398 400 407# ONES 01DC L 344 347# OPENERR 0828 V 956 1031# OPENFAIL 00EB L 172 176# OPENFILE 06B6 L 157 170 821 933# PARENTOFFSET 0445 V 133 508 555 594 1133# PARSEFILENAME 05F9 L 517 544 579 619 873# PARSERESULT 041C V 516 528 535 540 546 570 576 581 610 616 643 656 1125 1128# PARSERET 041A V 527 541 577 617 1127# PCB 0416 V 875 1124# PDADR 0441 V 130 621 1131# PDERR 07EF V 948 1016# PDRV 0012 N 90# 511 PERR 0518 L 742# PFCHILDABORT 0800 N 95# PFCTLC 0080 N 96# PFKEEP 0002 N 94# PFLAG 0006 N 87# PLIST 0024 N 92# 597 PNAME 0008 N 88# 622 PPARENT 001E N 89# 132 PPRIOR 0005 N 86# 136 PRCHAR 0662 L 867 895 898 903# PRINTCMDLINE 05E8 L 447 750 860# PRINTDSSTRING 0679 L 361 909 910# PRINTERCMD 0450 V 571 1138# PRINTERERR 03E1 L 585 589# PRINTERERRMSG 0749 V 589 983# PRINTERMSG 0764 V 600 988# PRINTIT 068D L 919 921# PRINTSTRING 066F L 120 178 500 501 561 564 590 601 632 638 651 664 744 745 747 757 908# PRNUM 0643 L 566 603 892# PRNUMONE 0652 L 893 897# PROMPT 0410 V 356 1118# PROMPTDISK 0413 V 352 1121# PROMPTEND 0414 V 1122# PROMPTUONES 0412 V 340 343 347 1120# PROMPTUTENS 0411 V 339 345 357 359 1119# PRPRINTER 0401 L 578 580 593 595 599# PRPROMPT 01E0 L 342 348# PRUSER 0390 L 543 545 554 556 559 563# PSETPAR 0083 L 134 136# PUSER 0013 N 91# 558 PUTLASTBLANK 013A L 223 227# QFULLERR 083B V 957 1035# R0 007D V 1065# R2 007D V 1066# READANOTHER 0558 L 777# 794 798 READBUFFER 0545 L 279 285 714 761# READCHAR 058A L 782 803# READERR 05DA L 823 827 842# CP/M ASM86 1.1 SOURCE: SUBMIT.A86 PAGE 027 READFILE 06BE L 825 935# READRET 05DE L 840 848# REALARG 0221 L 392# RETEOF 05DB L 835 844# SAVEDISKNO 0106 L 186 189# SETCONSOLE 0696 L 925# SETDISK 069A L 505 926# SETLIST 06A2 L 587 928# SETP 0090 L 135 138 140# SETPARENT 03EA L 588 591# SETUSER 0668 L 164 551 815 850 905# SHOWERR 0518 L 739# SKIPARG 016B L 262 265# 269 SKIPMORE 0142 L 233# 238 240 SKIPWHITE 0143 L 216 218 235# SOPENERR 0873 V 177 1047# SS SREG V 110 STACK 0100 V 1072# STACKTOP 013C V 111 1082# SUBEX 02D6 L 497 499# SUBMIT 003D L 16 105# SUBMITABORT 053C L 179 503 562 590 639 754# SUBMITEXIT 019B L 281 291# 700 758 SYSDATSEG 0443 V 131 165 510 557 596 626 1132# SYSDRIVE 004B V 70# 166 TAB 011C L 203 205# TERMINATE 0658 L 121 900# TESTEND 0265 L 435# TOPOFCMDLOOP 01A3 L 287 304# 716 TRUE 00FF N 33# 649 679 680 698 TRYBUILTIN 0331 L 487 528 533# UNKNOWN 0000 N 35# UNKNOWNERR 0512 L 729 733# USERCMD 0448 V 534 1136# USERERR 0387 L 549 560# USERERRMSG 0722 V 560 976# USERMSG 073A V 563 980# WRITEPROMPT 01F6 L 357 360# WRONGVERS 0703 V 119 969# ZAPBLANK 0292 L 463 465#