CP/M ASM86 1.1 SOURCE: TMP.A86 Terminal Message Processor - C PAGE 1 ;***************************************************** ;* ;* Terminal Message Processor ;* ;* The TMP determines the user interface to CCP/M. ;* Much of the interface is available though ;* system calls. This TMP takes advantage of ;* as much as possible for simplicity. The TMP ;* could, for instance, be easily modified to ;* force logins and have non-standard defaults. ;* ;* With a little more work, the TMP could do all ;* command parsing and File Loading instead of ;* using the CLI COMMAND FUNCTION. ;* Suggestions are given in the CCP/M-86 SYSTEM'S GUIDE. ;* ;***************************************************** title 'Terminal Message Processor - CCP/M-86 2.0' ; Some common equates 00FF true equ 0ffh 0000 false equ 0 000D cr equ 13 ; carraige return 000A lf equ 10 ; linefeed 0009 tab equ 9 ; tab char ; CCP/M-86 system functions used by the TMP 00E0 osint equ 224 ; interrupt number for CCP/M ; system calls 0002 c_write equ 2 ; console functions 0009 c_writebuf equ 9 000A c_readbuf equ 10 0092 c_attachc equ 146 0093 c_detachc equ 147 0094 c_setnum equ 148 00A0 l_setnum equ 160 ; list device functions 00A4 l_getnum equ 164 000F f_open equ 15 ; file functions 0010 f_close equ 16 0014 f_read equ 20 001A f_setdma equ 26 0098 f_parse equ 152 000E drv_set equ 14 ; drive functions CP/M ASM86 1.1 SOURCE: TMP.A86 Terminal Message Processor - C PAGE 2 0019 drv_get equ 25 0027 drv_free equ 39 0020 dir_usernum equ 32 ; directory functions 0096 p_cli equ 150 ; process control functions ; Process descriptor flags 0000 ps_run equ 00 ; on ready list root 0001 pf_sys equ 001h ; system process 0002 pf_keep equ 002h ; do not terminate ; Some locations in the system data segment 0040 s_ccpmseg equ word ptr 40H ;begin CCPM segment 004B s_sysdisk equ byte ptr 04bh ;system disk 0047 s_ncns equ byte ptr 47H ;sys. consoles 0078 s_version equ word ptr 78h ;ofst ver. str in SUP ; Some RSP format equates 0000 rsp_top equ 0 0008 rsp_md equ 008h 0010 rsp_pd equ 010h 0040 rsp_uda equ 040h 0140 rsp_bottom equ 140h ; Error codes returned by the CLI 0003 e_no_memory equ 3 ; cant find memory 000C e_no_pd equ 12 ; no free pd's 000F e_q_full equ 15 ; full queue 0017 e_illdisk equ 23 ; illegal disk # 0018 e_badfname equ 24 ; illegal filename 0019 e_badftype equ 25 ; illegal filetype 001C e_bad_load equ 28 ; bad ret. from BDOS load 001D e_bad_read equ 29 ; bad ret. from BDOS read 001E e_bad_open equ 30 ; bad ret. from BDOS open 001F e_nullcmd equ 31 ; null command sent 0025 e_ill_lst equ 37 ; illegal list device 0026 e_ill_passwd equ 38 ; illegal password 0028 e_abort equ 40 ; aborted in CLI ;***************************************************** ;* ;* TMP Shared Code and Constant Area CP/M ASM86 1.1 SOURCE: TMP.A86 Terminal Message Processor - C PAGE 3 ;* ;***************************************************** cseg org 0 0000 EB2F 0031 jmps tmp 0002 434F50595249 db 'COPYRIGHT (c) 1983, DIGITAL RESEARCH 3/28/83. ' 474854202863 292031393833 2C2044494749 54414C205245 534541524348 2020332F3238 2F38332E20 ;=== tmp: ; PROGRAM MAIN - INITIALIZATION ;=== ; Set default console # = TMP# 0031 8A160400E81E 0356 mov dl,defconsole ! call setconsolenum 03 0356 ; Set default disk = system drive 0038 1E8E1E0000 push ds ! mov ds,sysdatseg 003D 8A164B001F mov dl,.s_sysdisk ! pop ds ;get system drive from 0042 E81503 035A call setdisk ;system data segment 0045 32D2 xor dl,dl ;all TMPs come up user 0 0047 E8F602 0340 call setuser 004A E81D03 036A call attach ;print version 004D 1E8E1E0000 push ds ! mov ds,sysdatseg 0052 8B167800 mov dx,.s_version 0056 8E1E4000 mov ds,.s_ccpmseg 005A E8F5021F 0352 call print_ds_string ! pop ds 005E E80D03 036E call detach 0061 1E07 push ds ! pop es 0063 BE1B00 mov si,offset pd_ascii_num 0066 BFD301 mov di,offset startupnum 0069 B90300 mov cx,3 006C F3A4 rep movsb 006E BACA01 mov dx,offset fcb 0071 B10F mov cl,f_open ;try to open the startup file 0073 E80203 0378 call ccpm ;on default drive which is 0076 3CFF cmp al,0ffh ;the system drive CP/M ASM86 1.1 SOURCE: TMP.A86 Terminal Message Processor - C PAGE 4 0078 744C 00C6 je nostartup 007A BA4201 mov dx,offset clicb_cmd ;use the CLI buffer for this 007D B11A mov cl,f_setdma ;one time one sector read 007F E8F602 0378 call ccpm 0082 BACA01 mov dx,offset fcb 0085 B114 mov cl,f_read 0087 E8EE02 0378 call ccpm 008A 50 push ax 008B BACA01 mov dx,offset fcb 008E B110 mov cl,f_close 0090 E8E502 0378 call ccpm 0093 58 pop ax 0094 84C0 test al,al 0096 752E 00C6 jnz nostartup 0098 8CD8 mov ax,ds 009A 8EC0 mov es,ax 009C B00D mov al,cr 009E B98000 mov cx,128 00A1 BF4201 mov di,offset clicb_cmd 00A4 F2AE repne scasb 00A6 751E 00C6 jne nostartup ;didn't find a carriage return 00A8 47 inc di ;include cr lf in line 00A9 C60524 mov byte ptr [di],'$' 00AC 81EF4201 sub di,offset clicb_cmd 00B0 8BC7 mov ax,di 00B2 2D0200 sub ax, 2 00B5 A24101 mov read_blen, al 00B8 BACB04 mov dx,offset supmsg 00BB E88A02 0348 call printstring 00BE BA4201 mov dx,offset clicb_cmd 00C1 E88E02 0352 call print_ds_string 00C4 EB3F 0105 jmps startup nostartup: ; THIS IS WHERE A LOGIN ROUTINE MIGHT ; BE IMPLEMENTED. THE DATA FILE THAT ; CONTAINS THE USER NAME AND PASSWORD ; MIGHT ALSO CONTAIN AN INITIAL DEFAULT ; DISK AND USER NUMBER FOR THAT USER. ;=========== nextcommand: ; LOOP FOREVER ;=========== ; free drive 00C6 BAFFFFE8AA02 0376 mov dx,0ffffh ! call drive_free ; attach console 00CC E89B02 036A call attach ; print CR,LF if we just sent command 00CF 803EC3010074 00DE cmp cmdsent,false ! je noclearline CP/M ASM86 1.1 SOURCE: TMP.A86 Terminal Message Processor - C PAGE 5 08 00DE 00D6 C606C30100 mov cmdsent,false 00DB E86702 0345 call crlf noclearline: ; set up and print user prompt ; get current default user # and disk ; this call should be made on every ; loop in case the last command ; has changed the default. 00DE B20DE85602 0339 mov dl,cr ! call prchar 00E3 E85802 033E call getuser 00E6 84DB7405 00EF test bl,bl ! jz nozero ;don't print user 0 prompt 00EA 8AD3E83802 0327 mov dl,bl ! call prnum nozero: 00EF E86C02 035E call getdisk 00F2 B24102D3 mov dl,'A' ! add dl,bl 00F6 E84002 0339 call prchar 00F9 BABB03 mov dx,offset prompt 00FC E84902 0348 call print_string ; Read Command from Console 00FF BA4001E86D02 0372 mov dx,offset read_buf ! call conreadbuf startup: ; echo newline 0105 B20AE82F02 0339 mov dl,lf ! call prchar ; make sure not a null command 010A 8D1E4201 lea bx,clicb_cmd 010E 803E41010074 0178 cmp read_blen,0 ! je gonextcmd 63 0178 deblank: 0115 803F207405 011F cmp byte ptr [bx],' ' ! je zapblank 011A 803F097507 0126 cmp byte ptr [bx],tab ! jne noblanks zapblank: 011F 43FE0E4101EB 0115 inc bx ! dec read_blen ! jmps deblank EF 0115 noblanks: 0126 8D0642013BC3 013F lea ax,clicb_cmd ! cmp ax,bx ! je chksemi 7411 013F ; remove leading blanks 012E 1E0732ED8A0E push ds ! pop es ! xor ch,ch ! mov cl,read_blen 4101 0136 8BF88BF3FCF3 mov di,ax ! mov si,bx ! cld ! rep movsb A4 013D 8BD8 mov bx,ax chksemi: ; see if line starts with semicolon 013F 803F3B7434 0178 cmp byte ptr [bx],';' ! je gonextcmd CP/M ASM86 1.1 SOURCE: TMP.A86 Terminal Message Processor - C PAGE 6 ; see if disk change ; if 'X:' change def disk to X 0144 803E41010275 017B cmp read_blen,2 ! jne clicall 30 017B 014B 807F013A cmp byte ptr 1[bx],':' 014F 752A 017B jne clicall ; change default disk 0151 8A17 mov dl,[bx] ;get disk name 0153 80E25F and dl,5fh ;Upper Case 0156 80EA41 sub dl,'A' ;disk number ; check bounds 0159 80FA00720B 0169 cmp dl,0 ! jb baddrive 015E 80FA0F7706 0169 cmp dl,15 ! ja baddrive ; select default disk 0163 E8F401E90F00 035A call setdisk ! jmp gonextcmd 0169 BAC003E8D901 0348 baddrive: mov dx,offset errstr ! call printstring 016F BA3804E8D301 0348 mov dx,offset drverr ! call printstring ! call crlf E8CD01 0348 0178 E94BFF 00C6 gonextcmd: jmp nextcommand ;======= clicall: ; SEND CLI COMMAND ;======= ; put null at end of input 017B BB4201 mov bx,offset clicb_cmd 017E A04101B400 mov al,read_blen ! mov ah,0 0183 03D8C60700 add bx,ax ! mov byte ptr [bx],0 ; copy command string for error ; reporting later and to check ; for built in commands... 0188 B94000 mov cx,64 018B BE4201 mov si,offset clicb_cmd 018E BFEB01 mov di,offset savebuf 0191 1E07 push ds ! pop es 0193 F3A5 rep movsw ; parse front to see if ; built in command 0195 BECA01 mov si,offset fcb 0198 BFEB01 mov di,offset savebuf 019B E83F01 02DD call parsefilename 019E E310 01B0 jcxz goodparse 01A0 2BDB8A1E4101 sub bx,bx ! mov bl,read_blen 01A6 81C3EB01 add bx,offset savebuf 01AA C60724 mov byte ptr [bx],'$' 01AD E9E300 0293 jmp clierror CP/M ASM86 1.1 SOURCE: TMP.A86 Terminal Message Processor - C PAGE 7 01B0 891EC401 goodparse: mov parseret,bx 01B4 83FB007508 01C1 cmp bx,0 ! jne haveatail 01B9 8A1E4101 mov bl,read_blen 01BD 81C3EB01 add bx,offset savebuf 01C1 C6072443 haveatail: mov byte ptr [bx],'$' ! inc bx 01C5 803ECA010074 01CF cmp fcb,0 ! je try_builtin 03 01CF 01CC E9A900 0278 jmp not_builtin ; is it USER command? 01CF BECA0146 try_builtin: mov si,offset fcb ! inc si 01D3 BFBB04 mov di,offset usercmd 01D6 0E07 push cs ! pop es 01D8 B90400F3A7 mov cx,4 ! repz cmpsw 01DD 7545 0224 jnz notuser 01DF BECA01 mov si,offset fcb 01E2 8B3EC401 mov di,parseret 01E6 83FF007425 0210 cmp di,0 ! je pruser 01EB 47 inc di 01EC E8EE00 02DD call parsefilename 01EF 83F900751C 0210 cmp cx,0 ! jne pruser 01F4 BECA01 mov si,offset fcb 01F7 46 inc si 01F8 8B14 mov dx,[si] 01FA E8F000 02ED call a_to_b 01FD 80FB0F7708 020A cmp bl,15 ! ja usererr 0202 8AD3 mov dl,bl 0204 E83901 0340 call setuser 0207 E90600 0210 jmp pruser 020A BA5104 usererr: mov dx,offset usererrmsg 020D E83801 0348 call printstring 0210 BA7204 pruser: mov dx,offset usermsg 0213 E83201 0348 call printstring 0216 E82501 033E call getuser 0219 8AD3E80901 0327 mov dl,bl ! call prnum 021E E82401 0345 call crlf 0221 E9A2FE 00C6 jmp nextcommand notuser: 0224 BECA0146 mov si,offset fcb ! inc si 0228 BFC304 mov di,offset printercmd 022B 0E07 push cs ! pop es 022D B90400F3A7 mov cx,4 ! repz cmpsw 0232 7544 0278 jnz notprinter 0234 BECA01 mov si,offset fcb 0237 8B3EC401 mov di,parseret 023B 83FF007424 0264 cmp di,0 ! je prprinter 0240 47 inc di 0241 E89900 02DD call parsefilename 0244 83F900751B 0264 cmp cx,0 ! jne prprinter 0249 BECA01 mov si,offset fcb CP/M ASM86 1.1 SOURCE: TMP.A86 Terminal Message Processor - C PAGE 8 024C 46 inc si 024D 8B14 mov dx,[si] 024F E89B00 02ED call a_to_b 0252 80FBFF cmp bl,0ffh 0255 7407 025E je printererr 0257 8AD3 mov dl,bl 0259 E80601 0362 call setlist 025C E306 0264 jcxz prprinter 025E BA8304 printererr: mov dx,offset printemsg 0261 E8E400 0348 call printstring 0264 BAA704 prprinter: mov dx,offset printermsg 0267 E8DE00 0348 call printstring 026A E8F900 0366 call getlist 026D 8AD3E8B500 0327 mov dl,bl ! call prnum 0272 E8D000 0345 call crlf 0275 E94EFE 00C6 jmp nextcommand notprinter: not_builtin: ; initialize Cli Control Block 0278 C606410100 mov clicb_net,0 ; make cli call 027D C606C301FF mov cmdsent,true 0282 8D164101B196 lea dx,clicb ! mov cl,p_cli 0288 E8ED00 0378 call ccpm 028B 83FB007503 0293 cmp bx,0 ! jne clierror 0290 E933FE 00C6 jmp nextcommand ;======== clierror: ;======== ; Cli call unsuccesful, analyze and display err msg ; input: CX = ERROR CODE 0293 BE7703 mov si,(offset clierrtab)-4 nexterr: 0296 83C604 add si,4 0299 2E83BC0000FF 02A8 cmp cs:word ptr [si],0ffffh ! je unknownerr 7407 02A8 02A1 2E3B8C000075 0296 cmp cx,cs:[si] ! jne nexterr EE 0296 unknownerr: 02A8 2E8B940200 mov dx,cs:2[si] ; jmps showerr showerr: ; Print Error String ;------- ; input: DX = address of Error ; string in CSEG ; if DX=0 then NULL COMMAND CP/M ASM86 1.1 SOURCE: TMP.A86 Terminal Message Processor - C PAGE 9 02AD 83FA007508 02BA cmp dx,0 ! jne perr 02B2 C606C30100E9 00C6 mov cmdsent,false ! jmp nextcommand 0CFE 00C6 02BA 52E88700 0345 perr: push dx ! call crlf 02BE BAC003E88400 0348 mov dx,offset errstr ! call printstring 02C4 5AE88000E87A 0348 pop dx ! call printstring ! call crlf 00 0348 02CB BA4604E87700 0348 mov dx,offset cmdstr ! call printstring 02D1 BAEB01E87B00 0352 mov dx,offset savebuf ! call print_ds_string ! call crlf E86B00 0352 02DA E9E9FD 00C6 jmp nextcommand parsefilename: ; SI = fcb DI = string 02DD B99800 mov cx,f_parse 02E0 BBC601 mov bx,offset pcb 02E3 893F897702 mov [bx],di ! mov 2[bx],si 02E8 8BD3E98B00 0378 mov dx,bx ! jmp ccpm a_to_b: ;dl = 1st char, dh = 2nd char 02ED 80FE207504 02F6 cmp dh,' ' ! jne atob2char 02F2 8AF2B230 mov dh,dl ! mov dl,'0' 02F6 80FE307229 0324 atob2char: cmp dh,'0' ! jb atoberr 02FB 80FE397724 0324 cmp dh,'9' ! ja atoberr 0300 80FA30721F 0324 cmp dl,'0' ! jb atoberr 0305 80FA39771A 0324 cmp dl,'9' ! ja atoberr 030A 80EE3080EA30 sub dh,'0' ! sub dl,'0' 0310 B800008AC2 mov ax,0 ! mov al,dl 0315 52B10A push dx ! mov cl,10 0318 F6E15A mul cl ! pop dx 031B 8AD6B600 mov dl,dh ! mov dh,0 031F 03C2 add ax,dx 0321 8BD8C3 mov bx,ax ! ret 0324 B3FFC3 atoberr: mov bl,0ffh ! ret prnum: ; dl = num (0-15) 0327 80FA0A720A 0336 cmp dl,10 ! jb prnum_one 032C 52 push dx 032D B231E80700 0339 mov dl,'1' ! call prchar 0332 5A80EA0A pop dx ! sub dl,10 0336 80C230 prnum_one: add dl,'0' ; jmp prchar 0339 B102E93A00 0378 prchar: mov cl,c_write ! jmp ccpm 033E B2FF getuser: mov dl,0ffh 0340 B120E93300 0378 setuser: mov cl,dir_usernum ! jmp ccpm 0345 BABD03 crlf: mov dx,offset crlfstr ;jmps printstring 0348 1E8CC88ED8 printstring: push ds ! mov ax,cs ! mov ds,ax 034D E802001FC3 0352 call print_ds_string ! pop ds ! ret 0352 B109EB22 0378 print_ds_string:mov cl,c_writebuf ! jmps ccpm 0356 B194EB1E 0378 setconsolenum: mov cl,c_setnum ! jmps ccpm 035A B10EEB1A 0378 setdisk: mov cl,drv_set ! jmps ccpm 035E B119EB16 0378 getdisk: mov cl,drv_get ! jmps ccpm 0362 B1A0EB12 0378 setlist: mov cl,l_setnum ! jmps ccpm 0366 B1A4EB0E 0378 getlist: mov cl,l_getnum ! jmps ccpm CP/M ASM86 1.1 SOURCE: TMP.A86 Terminal Message Processor - C PAGE 10 036A B192EB0A 0378 attach: mov cl,c_attachc ! jmps ccpm 036E B193EB06 0378 detach: mov cl,c_detachc ! jmps ccpm 0372 B10AEB02 0378 con_readbuf: mov cl,c_readbuf ! jmps ccpm 0376 B127 drivefree: mov cl,drv_free !; jmps ccpm ;==== ccpm: ; INTERFACE ROUTINE FOR SYSTEM ENTRY POINTS ;==== 0378 CDE0C3 int osint ! ret ;***************************************************** ;* ;* CONSTANTS (IN SHARED CODE SEGMENT) ;* ;***************************************************** 037B 1F000000 clierrtab dw e_nullcmd, 0 ;null command 037F 0300CD03 dw e_no_memory, memerr ;No memory 0383 0C00DF03 dw e_no_pd, pderr ;No unused PD 0387 1800ED03 dw e_badfname, fnameerr;Ill. command 038B 1700ED03 dw e_illdisk, fnameerr;Ill. disk 038F 2600ED03 dw e_ill_passwd, fnameerr;Ill. password 0393 1900ED03 dw e_badftype, fnameerr;Ill. type 0397 1C00FB03 dw e_bad_load, loaderr ; 039B 1D00FB03 dw e_bad_read, loaderr ; 039F 1E000604 dw e_bad_open, openerr ; 03A3 0F001904 dw e_q_full, qfullerr; 03A7 28002E04 dw e_abort, aborterr; ; a few extra entries for future errors 03AB FFFFFB03 dw 0ffffh, catcherr; 03AF FFFFFB03 dw 0ffffh, catcherr; 03B3 FFFFFB03 dw 0ffffh, catcherr; 03B7 FFFFFB03 dw 0ffffh, catcherr; 03BB 3E24 prompt db '>$' 03BD 0D0A24 crlfstr db 13,10,'$' 03C0 43502F4D2045 errstr db 'CP/M Error: $' 72726F723A20 24 03CD 4E6F7420456E memerr db 'Not Enough Memory$' 6F756768204D 656D6F727924 03DF 504420546162 pderr db 'PD Table Full$' 6C652046756C 6C24 03ED 426164204669 fnameerr db 'Bad File Spec$' 6C6520537065 6324 03FB catcherr rb 0 ;Unknown Errs give CP/M ASM86 1.1 SOURCE: TMP.A86 Terminal Message Processor - C PAGE 11 03FB 4C6F61642045 loaderr db 'Load Error$' ; Load Error Msg 72726F7224 0406 43616E277420 openerr db 'Can''t Find Command$' 46696E642043 6F6D6D616E64 24 0419 52535020436F qfullerr db 'RSP Command Que Full$' 6D6D616E6420 517565204675 6C6C24 042E 434C49204162 aborterr db 'CLI Abort$' 6F727424 0438 496E76616C69 drverr db 'Invalid Drive$' 642044726976 6524 0446 436F6D6D616E cmdstr db 'Command = $' 64203D2024 0451 0D0A496E7661 usererrmsg db 13,10,'Invalid User Number,' 6C6964205573 6572204E756D 6265722C 0467 2049474E4F52 db ' IGNORED',13,10,'$' 45440D0A24 0472 0D0A55736572 usermsg db 13,10,'User Number = $' 204E756D6265 72203D2024 0483 0D0A496E7661 printemsg db 13,10,'Invalid Printer Number,' 6C6964205072 696E74657220 4E756D626572 2C 049C 2049474E4F52 db ' IGNORED',13,10,'$' 45440D0A24 04A7 0D0A5072696E printermsg db 13,10,'Printer Number = $' 746572204E75 6D626572203D 2024 04BB 555345522020 usercmd db 'USER ' 2020 04C3 5052494E5445 printercmd db 'PRINTER ' 5220 04CB 537461727420 supmsg db 'Start up command: $' 757020636F6D 6D616E643A20 24 ;***************************************************** ;* CP/M ASM86 1.1 SOURCE: TMP.A86 Terminal Message Processor - C PAGE 12 ;* TMP Data Area - this area is copied once for ;* each system console. The 'defconsole' ;* field is unique for each copy ;* - Each Data Area is run by a common ;* shared code segment. ;* ;***************************************************** DSEG org rsp_top 0000 0000 sysdatseg dw 0 0002 4700 sdatvar dw s_ncns 0004 0000 defconsole db 0,0 0006 000000000000 dw 0,0,0,0,0 00000000 org rsp_pd 0010 00000000 pd dw 0,0 ; link fields 0014 00 db ps_run ; status 0015 C6 db 198 ; priority 0016 0300 dw pf_sys+pf_keep ; flags 0018 546D70 db 'Tmp' ; Name 001B 2020202020 pd_ascii_num db ' ' ; Ascii number field set by GENSYS 0020 0400 dw offset uda/10h ; uda seg 0022 0000 db 0,0 ; disk,user 0024 0000 db 0,0 ; ldisk,luser 0026 FFFF dw 0ffffh ; mem 0028 00000000 dw 0,0 ; dvract,wait 002C 0000 db 0,0 ; org,net 002E 0000 dw 0 ; parent 0030 0000 db 0,0 ; cns,abort 0032 0000 db 0,0 ; cin,cout 0034 0000 db 0,0 ; lst,sf3 0036 0000 db 0,0 ; sf4,sf5 0038 00000000 dw 0,0 ; reserved 003C 00000000 dw 0,0 ; pret,scratch org rsp_uda 0040 000000000000 uda dw 0,0,0,0 ;0-7 note: no default DMA 0000 0048 000000000000 dw 0,0,0,0 ;8-fh 0000 0050 000000000000 dw 0,0,0,0 ;10-17 0000 0058 000000000000 dw 0,0,0,0 ;18-1f 0000 0060 000000000000 dw 0,0,0,0 ;20-27 0000 0068 000000000000 dw 0,0,0,0 ;28-2f CP/M ASM86 1.1 SOURCE: TMP.A86 Terminal Message Processor - C PAGE 13 0000 0070 000000003A01 dw 0,0,offset stack_top,0 ;30-37 0000 0078 000000000000 dw 0,0,0,0 ;38-3f 0000 0080 000000000000 dw 0,0,0,0 ;40-47 0000 0088 000000000000 dw 0,0,0,0 ;48-4f 0000 0090 000000000000 dw 0,0,0,0 ;50-57 0000 0098 000000000000 dw 0,0,0,0 ;58-5f 0000 00A0 01 db 1 ;60 INSYS <> 0 ;don't switch from ;from UDA stack ;on entry to SUP 00A1 00 db 0 ;61 00A2 00000000 dw 0,0 ;62-64 00A6 00 db 0 ;66 00A7 0000 dw 0 ;67-68 00A9 00 db 0 ;69 00AA CCCCCCCCCCCC dw 0cccch,0cccch,0cccch ;6A-6F 00B0 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch ;70 CCCC 00B8 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch CCCC 00C0 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch ;80 CCCC 00C8 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch CCCC 00D0 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch ;90 CCCC 00D8 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch CCCC 00E0 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch ;A0 CCCC 00E8 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch CCCC 00F0 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch ;B0 CCCC 00F8 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch CCCC 0100 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch ;C0 CCCC 0108 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch CCCC 0110 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch ;D0 CCCC 0118 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch CCCC CP/M ASM86 1.1 SOURCE: TMP.A86 Terminal Message Processor - C PAGE 14 0120 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch ;E0 CCCC 0128 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch CCCC 0130 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch ;F0 CCCC 0138 CCCC dw 0cccch 013A 3100 stack_top dw offset tmp ; code starting point 013C 0000 dw 0 ; code seg - set by GENSYS 013E 0000 dw 0 ; init. flags - set by GENSYS ; UDA is 100H bytes long 0080 maxcmdlen equ 128 ; the Read Console Buffer and the ; Cli Control Block share the same memory 0140 read_buf rb 0 0140 80 read_maxcmd db 128 0141 clicb rb 0 0141 clicb_net rb 0 0141 read_blen rb 1 0142 clicb_cmd rb maxcmdlen + 1 01C3 00 cmdsent db false 01C4 0000 parseret dw 0 01C6 EB01 pcb dw offset savebuf 01C8 CA01 dw offset fcb 01CA 005354415254 fcb db 0, 'STARTUP ' 555020 01D3 202020 startupnum db ' ' 01D6 rb 20 01EA 00 db 0 ;current record 01EB savebuf rb 128 026B 00 db 0 ;ensure hex is formed end END OF ASSEMBLY. NUMBER OF ERRORS: 0. USE FACTOR: 5%