Digital Research
This commit is contained in:
2020-11-06 18:50:37 +01:00
parent 621ed8ccaf
commit 31738079c4
8481 changed files with 1888323 additions and 0 deletions

View File

@@ -0,0 +1,7 @@
TMP status: works 1/26/83
TMP BUG: ' b:' gives 'can't find b:' ******
TMP notes:
1/26/83: I've changed some of the error messages... whf
PRINTER status: part of TMP
USER status: part of TMP

View File

@@ -0,0 +1,630 @@
;*****************************************************
;*
;* 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. This is also
;* the place to AUTOLOAD programs for specific
;* users. Suggestions are given in the CCP/M-86
;* SYSTEM'S GUIDE.
;*
;*****************************************************
title 'Terminal Message Processor - CCP/M-86 2.0'
; Some common equates
true equ 0ffh
false equ 0
cr equ 13 ; carraige return
lf equ 10 ; linefeed
tab equ 9 ; tab char
; CCP/M-86 system functions used by the TMP
osint equ 224 ; interrupt number for CCP/M
; system calls
c_write equ 2 ; console functions
c_writebuf equ 9
c_readbuf equ 10
c_attachc equ 146
c_detachc equ 147
c_setnum equ 148
l_setnum equ 160 ; list device functions
l_getnum equ 164
f_open equ 15 ; file functions
f_close equ 16
f_read equ 20
f_setdma equ 26
f_parse equ 152
drv_set equ 14 ; drive functions
drv_get equ 25
drv_free equ 39
dir_usernum equ 32 ; directory functions
p_cli equ 150 ; process control functions
; Process descriptor flags
ps_run equ 00 ; on ready list root
pf_sys equ 001h ; system process
pf_keep equ 002h ; do not terminate
; Some locations in the system data segment
s_ccpmseg equ word ptr 40H ;begin CCPM segment
s_sysdisk equ byte ptr 04bh ;system disk
s_ncns equ byte ptr 47H ;sys. consoles
s_version equ word ptr 78h ;ofst ver. str in SUP
; Some RSP format equates
rsp_top equ 0
rsp_md equ 008h
rsp_pd equ 010h
rsp_uda equ 040h
rsp_bottom equ 140h
; Error codes returned by the CLI
e_no_memory equ 3 ; cant find memory
e_no_pd equ 12 ; no free pd's
e_q_full equ 15 ; full queue
e_illdisk equ 23 ; illegal disk #
e_badfname equ 24 ; illegal filename
e_badftype equ 25 ; illegal filetype
e_bad_load equ 28 ; bad ret. from BDOS load
e_bad_read equ 29 ; bad ret. from BDOS read
e_bad_open equ 30 ; bad ret. from BDOS open
e_nullcmd equ 31 ; null command sent
e_ill_lst equ 37 ; illegal list device
e_ill_passwd equ 38 ; illegal password
e_abort equ 40 ; aborted in CLI
;*****************************************************
;*
;* TMP Shared Code and Constant Area
;*
;*****************************************************
cseg
org 0
;===
tmp: ; PROGRAM MAIN - INITIALIZATION
;===
; Set default console # = TMP#
mov dl,defconsole ! call setconsolenum
; Set default disk = system drive
push ds ! mov ds,sysdatseg
mov dl,.s_sysdisk ! pop ds ;get system drive from
call setdisk ;system data segment
xor dl,dl ;all TMPs come up user 0
call setuser
call attach ;print version
push ds ! mov ds,sysdatseg
mov dx,.s_version
mov ds,.s_ccpmseg
call print_ds_string ! pop ds
call detach
push ds ! pop es
mov si,offset pd_ascii_num
mov di,offset startupnum
mov cx,3
rep movsb
mov dx,offset fcb
mov cl,f_open ;try to open the startup file
call ccpm ;on default drive which is
cmp al,0ffh ;the system drive
je nostartup
mov dx,offset clicb_cmd ;use the CLI buffer for this
mov cl,f_setdma ;one time one sector read
call ccpm
mov dx,offset fcb
mov cl,f_read
call ccpm
push ax
mov dx,offset fcb
mov cl,f_close
call ccpm
pop ax
test al,al
jnz nostartup
mov ax,ds
mov es,ax
mov al,cr
mov cx,128
mov di,offset clicb_cmd
repne scasb
jne nostartup ;didn't find a carriage return
inc di ;include cr lf in line
mov byte ptr [di],'$'
sub di,offset clicb_cmd
mov ax,di
sub ax, 2
mov read_blen, al
mov dx,offset supmsg
call printstring
mov dx,offset clicb_cmd
call print_ds_string
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
mov dx,0ffffh ! call drive_free
; attach console
call attach
; print CR,LF if we just sent command
cmp cmdsent,false ! je noclearline
mov cmdsent,false
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.
mov dl,cr ! call prchar
call getuser
test bl,bl ! jz nozero ;don't print user 0 prompt
mov dl,bl ! call prnum
nozero:
call getdisk
mov dl,'A' ! add dl,bl
call prchar
mov dx,offset prompt
call print_string
; Read Command from Console
mov dx,offset read_buf ! call conreadbuf
startup:
; echo newline
mov dl,lf ! call prchar
; make sure not a null command
lea bx,clicb_cmd
cmp read_blen,0 ! je gonextcmd
deblank:
cmp byte ptr [bx],' ' ! je zapblank
cmp byte ptr [bx],tab ! jne noblanks
zapblank:
inc bx ! dec read_blen ! jmps deblank
noblanks:
lea ax,clicb_cmd ! cmp ax,bx ! je chksemi
; remove leading blanks
push ds ! pop es ! xor ch,ch ! mov cl,read_blen
mov di,ax ! mov si,bx ! cld ! rep movsb
mov bx,ax
chksemi: ; see if line starts with semicolon
cmp byte ptr [bx],';' ! je gonextcmd
; see if disk change
; if 'X:' change def disk to X
cmp read_blen,2 ! jne clicall
cmp byte ptr 1[bx],':'
jne clicall
; change default disk
mov dl,[bx] ;get disk name
and dl,5fh ;Upper Case
sub dl,'A' ;disk number
; check bounds
cmp dl,0 ! jb baddrive
cmp dl,15 ! ja baddrive
; select default disk
call setdisk ! jmp gonextcmd
baddrive: mov dx,offset errstr ! call printstring
mov dx,offset drverr ! call printstring ! call crlf
gonextcmd: jmp nextcommand
;=======
clicall: ; SEND CLI COMMAND
;=======
; put null at end of input
mov bx,offset clicb_cmd
mov al,read_blen ! mov ah,0
add bx,ax ! mov byte ptr [bx],0
; copy command string for error
; reporting later and to check
; for built in commands...
mov cx,64
mov si,offset clicb_cmd
mov di,offset savebuf
push ds ! pop es
rep movsw
; parse front to see if
; built in command
mov si,offset fcb
mov di,offset savebuf
call parsefilename
jcxz goodparse
sub bx,bx ! mov bl,read_blen
add bx,offset savebuf
mov byte ptr [bx],'$'
jmp clierror
goodparse: mov parseret,bx
cmp bx,0 ! jne haveatail
mov bl,read_blen
add bx,offset savebuf
haveatail: mov byte ptr [bx],'$' ! inc bx
cmp fcb,0 ! je try_builtin
jmp not_builtin
; is it USER command?
try_builtin: mov si,offset fcb ! inc si
mov di,offset usercmd
push cs ! pop es
mov cx,4 ! repz cmpsw
jnz notuser
mov si,offset fcb
mov di,parseret
cmp di,0 ! je pruser
inc di
call parsefilename
cmp cx,0 ! jne pruser
mov si,offset fcb
inc si
mov dx,[si]
call a_to_b
cmp bl,15 ! ja usererr
mov dl,bl
call setuser
jmp pruser
usererr: mov dx,offset usererrmsg
call printstring
pruser: mov dx,offset usermsg
call printstring
call getuser
mov dl,bl ! call prnum
call crlf
jmp nextcommand
notuser:
mov si,offset fcb ! inc si
mov di,offset printercmd
push cs ! pop es
mov cx,4 ! repz cmpsw
jnz notprinter
mov si,offset fcb
mov di,parseret
cmp di,0 ! je prprinter
inc di
call parsefilename
cmp cx,0 ! jne prprinter
mov si,offset fcb
inc si
mov dx,[si]
call a_to_b
cmp bl,0ffh
je printererr
mov dl,bl
call setlist
jcxz prprinter
printererr: mov dx,offset printemsg
call printstring
prprinter: mov dx,offset printermsg
call printstring
call getlist
mov dl,bl ! call prnum
call crlf
jmp nextcommand
notprinter:
not_builtin:
; initialize Cli Control Block
mov clicb_net,0
; make cli call
mov cmdsent,true
lea dx,clicb ! mov cl,p_cli
call ccpm
cmp bx,0 ! jne clierror
jmp nextcommand
;========
clierror:
;========
; Cli call unsuccesful, analyze and display err msg
; input: CX = ERROR CODE
mov si,(offset clierrtab)-4
nexterr:
add si,4
cmp cs:word ptr [si],0ffffh ! je unknownerr
cmp cx,cs:[si] ! jne nexterr
unknownerr:
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
cmp dx,0 ! jne perr
mov cmdsent,false ! jmp nextcommand
perr: push dx ! call crlf
mov dx,offset errstr ! call printstring
pop dx ! call printstring ! call crlf
mov dx,offset cmdstr ! call printstring
mov dx,offset savebuf ! call print_ds_string ! call crlf
jmp nextcommand
parsefilename: ; SI = fcb DI = string
mov cx,f_parse
mov bx,offset pcb
mov [bx],di ! mov 2[bx],si
mov dx,bx ! jmp ccpm
a_to_b: ;dl = 1st char, dh = 2nd char
cmp dh,' ' ! jne atob2char
mov dh,dl ! mov dl,'0'
atob2char: cmp dh,'0' ! jb atoberr
cmp dh,'9' ! ja atoberr
cmp dl,'0' ! jb atoberr
cmp dl,'9' ! ja atoberr
sub dh,'0' ! sub dl,'0'
mov ax,0 ! mov al,dl
push dx ! mov cl,10
mul cl ! pop dx
mov dl,dh ! mov dh,0
add ax,dx
mov bx,ax ! ret
atoberr: mov bl,0ffh ! ret
prnum: ; dl = num (0-15)
cmp dl,10 ! jb prnum_one
push dx
mov dl,'1' ! call prchar
pop dx ! sub dl,10
prnum_one: add dl,'0'
; jmp prchar
prchar: mov cl,c_write ! jmp ccpm
getuser: mov dl,0ffh
setuser: mov cl,dir_usernum ! jmp ccpm
crlf: mov dx,offset crlfstr
;jmps printstring
printstring: push ds ! mov ax,cs ! mov ds,ax
call print_ds_string ! pop ds ! ret
print_ds_string:mov cl,c_writebuf ! jmps ccpm
setconsolenum: mov cl,c_setnum ! jmps ccpm
setdisk: mov cl,drv_set ! jmps ccpm
getdisk: mov cl,drv_get ! jmps ccpm
setlist: mov cl,l_setnum ! jmps ccpm
getlist: mov cl,l_getnum ! jmps ccpm
attach: mov cl,c_attachc ! jmps ccpm
detach: mov cl,c_detachc ! jmps ccpm
con_readbuf: mov cl,c_readbuf ! jmps ccpm
drivefree: mov cl,drv_free !; jmps ccpm
;====
ccpm: ; INTERFACE ROUTINE FOR SYSTEM ENTRY POINTS
;====
int osint ! ret
;*****************************************************
;*
;* CONSTANTS (IN SHARED CODE SEGMENT)
;*
;*****************************************************
clierrtab dw e_nullcmd, 0 ;null command
dw e_no_memory, memerr ;No memory
dw e_no_pd, pderr ;No unused PD
dw e_badfname, fnameerr;Ill. command
dw e_illdisk, fnameerr;Ill. disk
dw e_ill_passwd, fnameerr;Ill. password
dw e_badftype, fnameerr;Ill. type
dw e_bad_load, loaderr ;
dw e_bad_read, loaderr ;
dw e_bad_open, openerr ;
dw e_q_full, qfullerr;
dw e_abort, aborterr;
; a few extra entries for future errors
dw 0ffffh, catcherr;
dw 0ffffh, catcherr;
dw 0ffffh, catcherr;
dw 0ffffh, catcherr;
prompt db '>$'
crlfstr db 13,10,'$'
errstr db 'CP/M Error: $'
memerr db 'Not Enough Memory$'
pderr db 'PD Table Full$'
fnameerr db 'Bad File Spec$'
catcherr rb 0 ;Unknown Errs give
loaderr db 'Load Error$' ; Load Error Msg
openerr db 'Can''t Find Command$'
qfullerr db 'RSP Command Que Full$'
aborterr db 'CLI Abort$'
drverr db 'Invalid Drive$'
cmdstr db 'Command = $'
usererrmsg db 13,10,'Invalid User Number,'
db ' IGNORED',13,10,'$'
usermsg db 13,10,'User Number = $'
printemsg db 13,10,'Invalid Printer Number,'
db ' IGNORED',13,10,'$'
printermsg db 13,10,'Printer Number = $'
usercmd db 'USER '
printercmd db 'PRINTER '
supmsg db 'Start up command: $'
;*****************************************************
;*
;* 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
sysdatseg dw 0
sdatvar dw s_ncns
defconsole db 0,0
dw 0,0,0,0,0
org rsp_pd
pd dw 0,0 ; link fields
db ps_run ; status
db 198 ; priority
dw pf_sys+pf_keep ; flags
db 'Tmp' ; Name
pd_ascii_num db ' ' ; Ascii number field set by GENSYS
dw offset uda/10h ; uda seg
db 0,0 ; disk,user
db 0,0 ; ldisk,luser
dw 0ffffh ; mem
dw 0,0 ; dvract,wait
db 0,0 ; org,net
dw 0 ; parent
db 0,0 ; cns,abort
db 0,0 ; cin,cout
db 0,0 ; lst,sf3
db 0,0 ; sf4,sf5
dw 0,0 ; reserved
dw 0,0 ; pret,scratch
org rsp_uda
uda dw 0,0,0,0 ;0-7 note: no default DMA
dw 0,0,0,0 ;8-fh
dw 0,0,0,0 ;10-17
dw 0,0,0,0 ;18-1f
dw 0,0,0,0 ;20-27
dw 0,0,0,0 ;28-2f
dw 0,0,offset stack_top,0 ;30-37
dw 0,0,0,0 ;38-3f
dw 0,0,0,0 ;40-47
dw 0,0,0,0 ;48-4f
dw 0,0,0,0 ;50-57
dw 0,0,0,0 ;58-5f
db 1 ;60 INSYS <> 0
;don't switch from
;from UDA stack
;on entry to SUP
db 0 ;61
dw 0,0 ;62-64
db 0 ;66
dw 0 ;67-68
db 0 ;69
dw 0cccch,0cccch,0cccch ;6A-6F
dw 0cccch,0cccch,0cccch,0cccch ;70
dw 0cccch,0cccch,0cccch,0cccch
dw 0cccch,0cccch,0cccch,0cccch ;80
dw 0cccch,0cccch,0cccch,0cccch
dw 0cccch,0cccch,0cccch,0cccch ;90
dw 0cccch,0cccch,0cccch,0cccch
dw 0cccch,0cccch,0cccch,0cccch ;A0
dw 0cccch,0cccch,0cccch,0cccch
dw 0cccch,0cccch,0cccch,0cccch ;B0
dw 0cccch,0cccch,0cccch,0cccch
dw 0cccch,0cccch,0cccch,0cccch ;C0
dw 0cccch,0cccch,0cccch,0cccch
dw 0cccch,0cccch,0cccch,0cccch ;D0
dw 0cccch,0cccch,0cccch,0cccch
dw 0cccch,0cccch,0cccch,0cccch ;E0
dw 0cccch,0cccch,0cccch,0cccch
dw 0cccch,0cccch,0cccch,0cccch ;F0
dw 0cccch
stack_top dw offset tmp ; code starting point
dw 0 ; code seg - set by GENSYS
dw 0 ; init. flags - set by GENSYS
; UDA is 100H bytes long
maxcmdlen equ 128
; the Read Console Buffer and the
; Cli Control Block share the same memory
read_buf rb 0
read_maxcmd db 128
clicb rb 0
clicb_net rb 0
read_blen rb 1
clicb_cmd rb maxcmdlen + 1
cmdsent db false
parseret dw 0
pcb dw offset savebuf
dw offset fcb
fcb db 0, 'STARTUP '
startupnum db ' '
rb 20
db 0 ;current record
savebuf rb 128
db 0 ;ensure hex is formed
end

View File

@@ -0,0 +1,17 @@
P?rAAAAA
AAAA?x?x?x
?r?r?r?r?r
?r?r?r?r?r?
r?r?r?r?r?r
?r?r?r?r?r
?r?r?r?r?r?
r?r?r?r?x?x
?x?x?x?x?x
?x?x?x?x?x?
x?x?x?x?x?x
?x?x?x?x?x
?x?x?x?x?x?
x?x?x?x?x?x
?x?x?x?x?x
?x?x?x?x?x?
x?x?x?x?x?x

View File

@@ -0,0 +1,764 @@
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%

View File

@@ -0,0 +1,918 @@
CP/M ASM86 1.1 SOURCE: TMP.A86 Terminal Message Processor - C PAGE 1
1
2 ;*****************************************************
3 ;*
4 ;* Terminal Message Processor
5 ;*
6 ;* The TMP determines the user interface to CCP/M.
7 ;* Much of the interface is available though
8 ;* system calls. This TMP takes advantage of
9 ;* as much as possible for simplicity. The TMP
10 ;* could, for instance, be easily modified to
11 ;* force logins and have non-standard defaults.
12 ;*
13 ;* With a little more work, the TMP could do all
14 ;* command parsing and File Loading instead of
15 ;* using the CLI COMMAND FUNCTION.
16 ;* Suggestions are given in the CCP/M-86 SYSTEM'S GUIDE.
17 ;*
18 ;*****************************************************
19
20
21 title 'Terminal Message Processor - CCP/M-86 2.0'
22
23 ; Some common equates
24
25 00FF true equ 0ffh
26 0000 false equ 0
27 000D cr equ 13 ; carraige return
28 000A lf equ 10 ; linefeed
29 0009 tab equ 9 ; tab char
30
31
32 ; CCP/M-86 system functions used by the TMP
33
34 00E0 osint equ 224 ; interrupt number for CCP/M
35 ; system calls
36
37 0002 c_write equ 2 ; console functions
38 0009 c_writebuf equ 9
39 000A c_readbuf equ 10
40 0092 c_attachc equ 146
41 0093 c_detachc equ 147
42 0094 c_setnum equ 148
43
44 00A0 l_setnum equ 160 ; list device functions
45 00A4 l_getnum equ 164
46
47 000F f_open equ 15 ; file functions
48 0010 f_close equ 16
49 0014 f_read equ 20
50 001A f_setdma equ 26
51 0098 f_parse equ 152
52
53 000E drv_set equ 14 ; drive functions
CP/M ASM86 1.1 SOURCE: TMP.A86 Terminal Message Processor - C PAGE 2
54
55 0019 drv_get equ 25
56 0027 drv_free equ 39
57
58 0020 dir_usernum equ 32 ; directory functions
59
60 0096 p_cli equ 150 ; process control functions
61
62
63 ; Process descriptor flags
64
65 0000 ps_run equ 00 ; on ready list root
66 0001 pf_sys equ 001h ; system process
67 0002 pf_keep equ 002h ; do not terminate
68
69
70 ; Some locations in the system data segment
71
72 0040 s_ccpmseg equ word ptr 40H ;begin CCPM segment
73 004B s_sysdisk equ byte ptr 04bh ;system disk
74 0047 s_ncns equ byte ptr 47H ;sys. consoles
75 0078 s_version equ word ptr 78h ;ofst ver. str in SUP
76
77
78 ; Some RSP format equates
79
80 0000 rsp_top equ 0
81 0008 rsp_md equ 008h
82 0010 rsp_pd equ 010h
83 0040 rsp_uda equ 040h
84 0140 rsp_bottom equ 140h
85
86
87 ; Error codes returned by the CLI
88
89 0003 e_no_memory equ 3 ; cant find memory
90 000C e_no_pd equ 12 ; no free pd's
91 000F e_q_full equ 15 ; full queue
92 0017 e_illdisk equ 23 ; illegal disk #
93 0018 e_badfname equ 24 ; illegal filename
94 0019 e_badftype equ 25 ; illegal filetype
95 001C e_bad_load equ 28 ; bad ret. from BDOS load
96 001D e_bad_read equ 29 ; bad ret. from BDOS read
97 001E e_bad_open equ 30 ; bad ret. from BDOS open
98 001F e_nullcmd equ 31 ; null command sent
99 0025 e_ill_lst equ 37 ; illegal list device
100 0026 e_ill_passwd equ 38 ; illegal password
101 0028 e_abort equ 40 ; aborted in CLI
102
103
104 ;*****************************************************
105 ;*
106 ;* TMP Shared Code and Constant Area
CP/M ASM86 1.1 SOURCE: TMP.A86 Terminal Message Processor - C PAGE 3
107
108 ;*
109 ;*****************************************************
110
111 cseg
112 org 0
113 0000 EB2F 0031 jmps tmp
114 0002 434F50595249 db 'COPYRIGHT (c) 1983, DIGITAL RESEARCH 3/28/83. '
115 474854202863
116 292031393833
117 2C2044494749
118 54414C205245
119 534541524348
120 2020332F3238
121 2F38332E20
122
123 ;===
124 tmp: ; PROGRAM MAIN - INITIALIZATION
125 ;===
126
127
128 ; Set default console # = TMP#
129
130 0031 8A160400E81E 0356 mov dl,defconsole ! call setconsolenum
131 03 0356
132
133
134 ; Set default disk = system drive
135
136 0038 1E8E1E0000 push ds ! mov ds,sysdatseg
137 003D 8A164B001F mov dl,.s_sysdisk ! pop ds ;get system drive from
138 0042 E81503 035A call setdisk ;system data segment
139
140 0045 32D2 xor dl,dl ;all TMPs come up user 0
141 0047 E8F602 0340 call setuser
142
143 004A E81D03 036A call attach ;print version
144 004D 1E8E1E0000 push ds ! mov ds,sysdatseg
145 0052 8B167800 mov dx,.s_version
146 0056 8E1E4000 mov ds,.s_ccpmseg
147 005A E8F5021F 0352 call print_ds_string ! pop ds
148 005E E80D03 036E call detach
149
150 0061 1E07 push ds ! pop es
151 0063 BE1B00 mov si,offset pd_ascii_num
152 0066 BFD301 mov di,offset startupnum
153 0069 B90300 mov cx,3
154 006C F3A4 rep movsb
155
156 006E BACA01 mov dx,offset fcb
157 0071 B10F mov cl,f_open ;try to open the startup file
158 0073 E80203 0378 call ccpm ;on default drive which is
159 0076 3CFF cmp al,0ffh ;the system drive
CP/M ASM86 1.1 SOURCE: TMP.A86 Terminal Message Processor - C PAGE 4
160
161 0078 744C 00C6 je nostartup
162 007A BA4201 mov dx,offset clicb_cmd ;use the CLI buffer for this
163 007D B11A mov cl,f_setdma ;one time one sector read
164 007F E8F602 0378 call ccpm
165 0082 BACA01 mov dx,offset fcb
166 0085 B114 mov cl,f_read
167 0087 E8EE02 0378 call ccpm
168 008A 50 push ax
169 008B BACA01 mov dx,offset fcb
170 008E B110 mov cl,f_close
171 0090 E8E502 0378 call ccpm
172 0093 58 pop ax
173 0094 84C0 test al,al
174 0096 752E 00C6 jnz nostartup
175 0098 8CD8 mov ax,ds
176 009A 8EC0 mov es,ax
177 009C B00D mov al,cr
178 009E B98000 mov cx,128
179 00A1 BF4201 mov di,offset clicb_cmd
180 00A4 F2AE repne scasb
181 00A6 751E 00C6 jne nostartup ;didn't find a carriage return
182 00A8 47 inc di ;include cr lf in line
183 00A9 C60524 mov byte ptr [di],'$'
184 00AC 81EF4201 sub di,offset clicb_cmd
185 00B0 8BC7 mov ax,di
186 00B2 2D0200 sub ax, 2
187 00B5 A24101 mov read_blen, al
188 00B8 BACB04 mov dx,offset supmsg
189 00BB E88A02 0348 call printstring
190 00BE BA4201 mov dx,offset clicb_cmd
191 00C1 E88E02 0352 call print_ds_string
192 00C4 EB3F 0105 jmps startup
193 nostartup:
194
195 ; THIS IS WHERE A LOGIN ROUTINE MIGHT
196 ; BE IMPLEMENTED. THE DATA FILE THAT
197 ; CONTAINS THE USER NAME AND PASSWORD
198 ; MIGHT ALSO CONTAIN AN INITIAL DEFAULT
199 ; DISK AND USER NUMBER FOR THAT USER.
200
201 ;===========
202 nextcommand: ; LOOP FOREVER
203 ;===========
204
205 ; free drive
206 00C6 BAFFFFE8AA02 0376 mov dx,0ffffh ! call drive_free
207
208 ; attach console
209 00CC E89B02 036A call attach
210
211 ; print CR,LF if we just sent command
212 00CF 803EC3010074 00DE cmp cmdsent,false ! je noclearline
CP/M ASM86 1.1 SOURCE: TMP.A86 Terminal Message Processor - C PAGE 5
213
214 08 00DE
215 00D6 C606C30100 mov cmdsent,false
216 00DB E86702 0345 call crlf
217 noclearline:
218
219 ; set up and print user prompt
220 ; get current default user # and disk
221 ; this call should be made on every
222 ; loop in case the last command
223 ; has changed the default.
224
225 00DE B20DE85602 0339 mov dl,cr ! call prchar
226 00E3 E85802 033E call getuser
227
228 00E6 84DB7405 00EF test bl,bl ! jz nozero ;don't print user 0 prompt
229 00EA 8AD3E83802 0327 mov dl,bl ! call prnum
230 nozero:
231 00EF E86C02 035E call getdisk
232 00F2 B24102D3 mov dl,'A' ! add dl,bl
233 00F6 E84002 0339 call prchar
234 00F9 BABB03 mov dx,offset prompt
235 00FC E84902 0348 call print_string
236
237 ; Read Command from Console
238 00FF BA4001E86D02 0372 mov dx,offset read_buf ! call conreadbuf
239
240 startup:
241 ; echo newline
242 0105 B20AE82F02 0339 mov dl,lf ! call prchar
243
244 ; make sure not a null command
245 010A 8D1E4201 lea bx,clicb_cmd
246 010E 803E41010074 0178 cmp read_blen,0 ! je gonextcmd
247 63 0178
248 deblank:
249 0115 803F207405 011F cmp byte ptr [bx],' ' ! je zapblank
250 011A 803F097507 0126 cmp byte ptr [bx],tab ! jne noblanks
251 zapblank:
252 011F 43FE0E4101EB 0115 inc bx ! dec read_blen ! jmps deblank
253 EF 0115
254 noblanks:
255 0126 8D0642013BC3 013F lea ax,clicb_cmd ! cmp ax,bx ! je chksemi
256 7411 013F
257 ; remove leading blanks
258 012E 1E0732ED8A0E push ds ! pop es ! xor ch,ch ! mov cl,read_blen
259 4101
260 0136 8BF88BF3FCF3 mov di,ax ! mov si,bx ! cld ! rep movsb
261 A4
262 013D 8BD8 mov bx,ax
263 chksemi: ; see if line starts with semicolon
264 013F 803F3B7434 0178 cmp byte ptr [bx],';' ! je gonextcmd
265
CP/M ASM86 1.1 SOURCE: TMP.A86 Terminal Message Processor - C PAGE 6
266
267 ; see if disk change
268 ; if 'X:' change def disk to X
269 0144 803E41010275 017B cmp read_blen,2 ! jne clicall
270 30 017B
271 014B 807F013A cmp byte ptr 1[bx],':'
272 014F 752A 017B jne clicall
273
274 ; change default disk
275 0151 8A17 mov dl,[bx] ;get disk name
276 0153 80E25F and dl,5fh ;Upper Case
277 0156 80EA41 sub dl,'A' ;disk number
278
279 ; check bounds
280 0159 80FA00720B 0169 cmp dl,0 ! jb baddrive
281 015E 80FA0F7706 0169 cmp dl,15 ! ja baddrive
282
283 ; select default disk
284 0163 E8F401E90F00 035A call setdisk ! jmp gonextcmd
285
286 0169 BAC003E8D901 0348 baddrive: mov dx,offset errstr ! call printstring
287 016F BA3804E8D301 0348 mov dx,offset drverr ! call printstring ! call crlf
288 E8CD01 0348
289
290 0178 E94BFF 00C6 gonextcmd: jmp nextcommand
291
292 ;=======
293 clicall: ; SEND CLI COMMAND
294 ;=======
295 ; put null at end of input
296 017B BB4201 mov bx,offset clicb_cmd
297 017E A04101B400 mov al,read_blen ! mov ah,0
298 0183 03D8C60700 add bx,ax ! mov byte ptr [bx],0
299
300 ; copy command string for error
301 ; reporting later and to check
302 ; for built in commands...
303 0188 B94000 mov cx,64
304 018B BE4201 mov si,offset clicb_cmd
305 018E BFEB01 mov di,offset savebuf
306 0191 1E07 push ds ! pop es
307 0193 F3A5 rep movsw
308
309 ; parse front to see if
310 ; built in command
311 0195 BECA01 mov si,offset fcb
312 0198 BFEB01 mov di,offset savebuf
313 019B E83F01 02DD call parsefilename
314 019E E310 01B0 jcxz goodparse
315 01A0 2BDB8A1E4101 sub bx,bx ! mov bl,read_blen
316 01A6 81C3EB01 add bx,offset savebuf
317 01AA C60724 mov byte ptr [bx],'$'
318 01AD E9E300 0293 jmp clierror
CP/M ASM86 1.1 SOURCE: TMP.A86 Terminal Message Processor - C PAGE 7
319
320
321
322 01B0 891EC401 goodparse: mov parseret,bx
323 01B4 83FB007508 01C1 cmp bx,0 ! jne haveatail
324 01B9 8A1E4101 mov bl,read_blen
325 01BD 81C3EB01 add bx,offset savebuf
326 01C1 C6072443 haveatail: mov byte ptr [bx],'$' ! inc bx
327 01C5 803ECA010074 01CF cmp fcb,0 ! je try_builtin
328 03 01CF
329 01CC E9A900 0278 jmp not_builtin
330 ; is it USER command?
331
332 01CF BECA0146 try_builtin: mov si,offset fcb ! inc si
333 01D3 BFBB04 mov di,offset usercmd
334 01D6 0E07 push cs ! pop es
335 01D8 B90400F3A7 mov cx,4 ! repz cmpsw
336 01DD 7545 0224 jnz notuser
337 01DF BECA01 mov si,offset fcb
338 01E2 8B3EC401 mov di,parseret
339 01E6 83FF007425 0210 cmp di,0 ! je pruser
340 01EB 47 inc di
341 01EC E8EE00 02DD call parsefilename
342 01EF 83F900751C 0210 cmp cx,0 ! jne pruser
343 01F4 BECA01 mov si,offset fcb
344 01F7 46 inc si
345 01F8 8B14 mov dx,[si]
346 01FA E8F000 02ED call a_to_b
347 01FD 80FB0F7708 020A cmp bl,15 ! ja usererr
348 0202 8AD3 mov dl,bl
349 0204 E83901 0340 call setuser
350 0207 E90600 0210 jmp pruser
351 020A BA5104 usererr: mov dx,offset usererrmsg
352 020D E83801 0348 call printstring
353 0210 BA7204 pruser: mov dx,offset usermsg
354 0213 E83201 0348 call printstring
355 0216 E82501 033E call getuser
356 0219 8AD3E80901 0327 mov dl,bl ! call prnum
357 021E E82401 0345 call crlf
358 0221 E9A2FE 00C6 jmp nextcommand
359 notuser:
360 0224 BECA0146 mov si,offset fcb ! inc si
361 0228 BFC304 mov di,offset printercmd
362 022B 0E07 push cs ! pop es
363 022D B90400F3A7 mov cx,4 ! repz cmpsw
364 0232 7544 0278 jnz notprinter
365 0234 BECA01 mov si,offset fcb
366 0237 8B3EC401 mov di,parseret
367 023B 83FF007424 0264 cmp di,0 ! je prprinter
368 0240 47 inc di
369 0241 E89900 02DD call parsefilename
370 0244 83F900751B 0264 cmp cx,0 ! jne prprinter
371 0249 BECA01 mov si,offset fcb
CP/M ASM86 1.1 SOURCE: TMP.A86 Terminal Message Processor - C PAGE 8
372
373 024C 46 inc si
374 024D 8B14 mov dx,[si]
375 024F E89B00 02ED call a_to_b
376 0252 80FBFF cmp bl,0ffh
377 0255 7407 025E je printererr
378 0257 8AD3 mov dl,bl
379 0259 E80601 0362 call setlist
380 025C E306 0264 jcxz prprinter
381 025E BA8304 printererr: mov dx,offset printemsg
382 0261 E8E400 0348 call printstring
383 0264 BAA704 prprinter: mov dx,offset printermsg
384 0267 E8DE00 0348 call printstring
385 026A E8F900 0366 call getlist
386 026D 8AD3E8B500 0327 mov dl,bl ! call prnum
387 0272 E8D000 0345 call crlf
388 0275 E94EFE 00C6 jmp nextcommand
389 notprinter:
390 not_builtin:
391 ; initialize Cli Control Block
392
393 0278 C606410100 mov clicb_net,0
394 ; make cli call
395
396 027D C606C301FF mov cmdsent,true
397 0282 8D164101B196 lea dx,clicb ! mov cl,p_cli
398 0288 E8ED00 0378 call ccpm
399 028B 83FB007503 0293 cmp bx,0 ! jne clierror
400 0290 E933FE 00C6 jmp nextcommand
401
402 ;========
403 clierror:
404 ;========
405 ; Cli call unsuccesful, analyze and display err msg
406 ; input: CX = ERROR CODE
407
408 0293 BE7703 mov si,(offset clierrtab)-4
409 nexterr:
410 0296 83C604 add si,4
411 0299 2E83BC0000FF 02A8 cmp cs:word ptr [si],0ffffh ! je unknownerr
412 7407 02A8
413 02A1 2E3B8C000075 0296 cmp cx,cs:[si] ! jne nexterr
414 EE 0296
415 unknownerr:
416 02A8 2E8B940200 mov dx,cs:2[si]
417 ; jmps showerr
418
419
420 showerr: ; Print Error String
421 ;------- ; input: DX = address of Error
422 ; string in CSEG
423 ; if DX=0 then NULL COMMAND
424
CP/M ASM86 1.1 SOURCE: TMP.A86 Terminal Message Processor - C PAGE 9
425
426 02AD 83FA007508 02BA cmp dx,0 ! jne perr
427 02B2 C606C30100E9 00C6 mov cmdsent,false ! jmp nextcommand
428 0CFE 00C6
429 02BA 52E88700 0345 perr: push dx ! call crlf
430 02BE BAC003E88400 0348 mov dx,offset errstr ! call printstring
431 02C4 5AE88000E87A 0348 pop dx ! call printstring ! call crlf
432 00 0348
433 02CB BA4604E87700 0348 mov dx,offset cmdstr ! call printstring
434 02D1 BAEB01E87B00 0352 mov dx,offset savebuf ! call print_ds_string ! call crlf
435 E86B00 0352
436 02DA E9E9FD 00C6 jmp nextcommand
437
438 parsefilename: ; SI = fcb DI = string
439 02DD B99800 mov cx,f_parse
440 02E0 BBC601 mov bx,offset pcb
441 02E3 893F897702 mov [bx],di ! mov 2[bx],si
442 02E8 8BD3E98B00 0378 mov dx,bx ! jmp ccpm
443 a_to_b: ;dl = 1st char, dh = 2nd char
444 02ED 80FE207504 02F6 cmp dh,' ' ! jne atob2char
445 02F2 8AF2B230 mov dh,dl ! mov dl,'0'
446 02F6 80FE307229 0324 atob2char: cmp dh,'0' ! jb atoberr
447 02FB 80FE397724 0324 cmp dh,'9' ! ja atoberr
448 0300 80FA30721F 0324 cmp dl,'0' ! jb atoberr
449 0305 80FA39771A 0324 cmp dl,'9' ! ja atoberr
450 030A 80EE3080EA30 sub dh,'0' ! sub dl,'0'
451 0310 B800008AC2 mov ax,0 ! mov al,dl
452 0315 52B10A push dx ! mov cl,10
453 0318 F6E15A mul cl ! pop dx
454 031B 8AD6B600 mov dl,dh ! mov dh,0
455 031F 03C2 add ax,dx
456 0321 8BD8C3 mov bx,ax ! ret
457 0324 B3FFC3 atoberr: mov bl,0ffh ! ret
458 prnum: ; dl = num (0-15)
459 0327 80FA0A720A 0336 cmp dl,10 ! jb prnum_one
460 032C 52 push dx
461 032D B231E80700 0339 mov dl,'1' ! call prchar
462 0332 5A80EA0A pop dx ! sub dl,10
463 0336 80C230 prnum_one: add dl,'0'
464 ; jmp prchar
465 0339 B102E93A00 0378 prchar: mov cl,c_write ! jmp ccpm
466 033E B2FF getuser: mov dl,0ffh
467 0340 B120E93300 0378 setuser: mov cl,dir_usernum ! jmp ccpm
468 0345 BABD03 crlf: mov dx,offset crlfstr
469 ;jmps printstring
470 0348 1E8CC88ED8 printstring: push ds ! mov ax,cs ! mov ds,ax
471 034D E802001FC3 0352 call print_ds_string ! pop ds ! ret
472 0352 B109EB22 0378 print_ds_string:mov cl,c_writebuf ! jmps ccpm
473 0356 B194EB1E 0378 setconsolenum: mov cl,c_setnum ! jmps ccpm
474 035A B10EEB1A 0378 setdisk: mov cl,drv_set ! jmps ccpm
475 035E B119EB16 0378 getdisk: mov cl,drv_get ! jmps ccpm
476 0362 B1A0EB12 0378 setlist: mov cl,l_setnum ! jmps ccpm
477 0366 B1A4EB0E 0378 getlist: mov cl,l_getnum ! jmps ccpm
CP/M ASM86 1.1 SOURCE: TMP.A86 Terminal Message Processor - C PAGE 10
478
479 036A B192EB0A 0378 attach: mov cl,c_attachc ! jmps ccpm
480 036E B193EB06 0378 detach: mov cl,c_detachc ! jmps ccpm
481 0372 B10AEB02 0378 con_readbuf: mov cl,c_readbuf ! jmps ccpm
482 0376 B127 drivefree: mov cl,drv_free !; jmps ccpm
483
484 ;====
485 ccpm: ; INTERFACE ROUTINE FOR SYSTEM ENTRY POINTS
486 ;====
487
488 0378 CDE0C3 int osint ! ret
489
490 ;*****************************************************
491 ;*
492 ;* CONSTANTS (IN SHARED CODE SEGMENT)
493 ;*
494 ;*****************************************************
495
496 037B 1F000000 clierrtab dw e_nullcmd, 0 ;null command
497 037F 0300CD03 dw e_no_memory, memerr ;No memory
498 0383 0C00DF03 dw e_no_pd, pderr ;No unused PD
499 0387 1800ED03 dw e_badfname, fnameerr;Ill. command
500 038B 1700ED03 dw e_illdisk, fnameerr;Ill. disk
501 038F 2600ED03 dw e_ill_passwd, fnameerr;Ill. password
502 0393 1900ED03 dw e_badftype, fnameerr;Ill. type
503 0397 1C00FB03 dw e_bad_load, loaderr ;
504 039B 1D00FB03 dw e_bad_read, loaderr ;
505 039F 1E000604 dw e_bad_open, openerr ;
506 03A3 0F001904 dw e_q_full, qfullerr;
507 03A7 28002E04 dw e_abort, aborterr;
508
509 ; a few extra entries for future errors
510
511 03AB FFFFFB03 dw 0ffffh, catcherr;
512 03AF FFFFFB03 dw 0ffffh, catcherr;
513 03B3 FFFFFB03 dw 0ffffh, catcherr;
514 03B7 FFFFFB03 dw 0ffffh, catcherr;
515
516 03BB 3E24 prompt db '>$'
517 03BD 0D0A24 crlfstr db 13,10,'$'
518 03C0 43502F4D2045 errstr db 'CP/M Error: $'
519 72726F723A20
520 24
521 03CD 4E6F7420456E memerr db 'Not Enough Memory$'
522 6F756768204D
523 656D6F727924
524 03DF 504420546162 pderr db 'PD Table Full$'
525 6C652046756C
526 6C24
527 03ED 426164204669 fnameerr db 'Bad File Spec$'
528 6C6520537065
529 6324
530 03FB catcherr rb 0 ;Unknown Errs give
CP/M ASM86 1.1 SOURCE: TMP.A86 Terminal Message Processor - C PAGE 11
531
532 03FB 4C6F61642045 loaderr db 'Load Error$' ; Load Error Msg
533 72726F7224
534 0406 43616E277420 openerr db 'Can''t Find Command$'
535 46696E642043
536 6F6D6D616E64
537 24
538 0419 52535020436F qfullerr db 'RSP Command Que Full$'
539 6D6D616E6420
540 517565204675
541 6C6C24
542 042E 434C49204162 aborterr db 'CLI Abort$'
543 6F727424
544 0438 496E76616C69 drverr db 'Invalid Drive$'
545 642044726976
546 6524
547
548 0446 436F6D6D616E cmdstr db 'Command = $'
549 64203D2024
550 0451 0D0A496E7661 usererrmsg db 13,10,'Invalid User Number,'
551 6C6964205573
552 6572204E756D
553 6265722C
554 0467 2049474E4F52 db ' IGNORED',13,10,'$'
555 45440D0A24
556 0472 0D0A55736572 usermsg db 13,10,'User Number = $'
557 204E756D6265
558 72203D2024
559
560 0483 0D0A496E7661 printemsg db 13,10,'Invalid Printer Number,'
561 6C6964205072
562 696E74657220
563 4E756D626572
564 2C
565 049C 2049474E4F52 db ' IGNORED',13,10,'$'
566 45440D0A24
567 04A7 0D0A5072696E printermsg db 13,10,'Printer Number = $'
568 746572204E75
569 6D626572203D
570 2024
571
572 04BB 555345522020 usercmd db 'USER '
573 2020
574 04C3 5052494E5445 printercmd db 'PRINTER '
575 5220
576
577 04CB 537461727420 supmsg db 'Start up command: $'
578 757020636F6D
579 6D616E643A20
580 24
581
582 ;*****************************************************
583 ;*
CP/M ASM86 1.1 SOURCE: TMP.A86 Terminal Message Processor - C PAGE 12
584
585 ;* TMP Data Area - this area is copied once for
586 ;* each system console. The 'defconsole'
587 ;* field is unique for each copy
588 ;* - Each Data Area is run by a common
589 ;* shared code segment.
590 ;*
591 ;*****************************************************
592
593 DSEG
594 org rsp_top
595
596 0000 0000 sysdatseg dw 0
597 0002 4700 sdatvar dw s_ncns
598 0004 0000 defconsole db 0,0
599 0006 000000000000 dw 0,0,0,0,0
600 00000000
601
602 org rsp_pd
603
604 0010 00000000 pd dw 0,0 ; link fields
605 0014 00 db ps_run ; status
606 0015 C6 db 198 ; priority
607 0016 0300 dw pf_sys+pf_keep ; flags
608 0018 546D70 db 'Tmp' ; Name
609 001B 2020202020 pd_ascii_num db ' ' ; Ascii number field set by GENSYS
610 0020 0400 dw offset uda/10h ; uda seg
611 0022 0000 db 0,0 ; disk,user
612 0024 0000 db 0,0 ; ldisk,luser
613 0026 FFFF dw 0ffffh ; mem
614 0028 00000000 dw 0,0 ; dvract,wait
615 002C 0000 db 0,0 ; org,net
616 002E 0000 dw 0 ; parent
617 0030 0000 db 0,0 ; cns,abort
618 0032 0000 db 0,0 ; cin,cout
619 0034 0000 db 0,0 ; lst,sf3
620 0036 0000 db 0,0 ; sf4,sf5
621 0038 00000000 dw 0,0 ; reserved
622 003C 00000000 dw 0,0 ; pret,scratch
623
624 org rsp_uda
625
626 0040 000000000000 uda dw 0,0,0,0 ;0-7 note: no default DMA
627 0000
628 0048 000000000000 dw 0,0,0,0 ;8-fh
629 0000
630 0050 000000000000 dw 0,0,0,0 ;10-17
631 0000
632 0058 000000000000 dw 0,0,0,0 ;18-1f
633 0000
634 0060 000000000000 dw 0,0,0,0 ;20-27
635 0000
636 0068 000000000000 dw 0,0,0,0 ;28-2f
CP/M ASM86 1.1 SOURCE: TMP.A86 Terminal Message Processor - C PAGE 13
637
638 0000
639 0070 000000003A01 dw 0,0,offset stack_top,0 ;30-37
640 0000
641 0078 000000000000 dw 0,0,0,0 ;38-3f
642 0000
643 0080 000000000000 dw 0,0,0,0 ;40-47
644 0000
645 0088 000000000000 dw 0,0,0,0 ;48-4f
646 0000
647 0090 000000000000 dw 0,0,0,0 ;50-57
648 0000
649 0098 000000000000 dw 0,0,0,0 ;58-5f
650 0000
651 00A0 01 db 1 ;60 INSYS <> 0
652 ;don't switch from
653 ;from UDA stack
654 ;on entry to SUP
655 00A1 00 db 0 ;61
656 00A2 00000000 dw 0,0 ;62-64
657 00A6 00 db 0 ;66
658 00A7 0000 dw 0 ;67-68
659 00A9 00 db 0 ;69
660
661 00AA CCCCCCCCCCCC dw 0cccch,0cccch,0cccch ;6A-6F
662 00B0 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch ;70
663 CCCC
664 00B8 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch
665 CCCC
666 00C0 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch ;80
667 CCCC
668 00C8 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch
669 CCCC
670 00D0 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch ;90
671 CCCC
672 00D8 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch
673 CCCC
674 00E0 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch ;A0
675 CCCC
676 00E8 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch
677 CCCC
678 00F0 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch ;B0
679 CCCC
680 00F8 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch
681 CCCC
682 0100 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch ;C0
683 CCCC
684 0108 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch
685 CCCC
686 0110 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch ;D0
687 CCCC
688 0118 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch
689 CCCC
CP/M ASM86 1.1 SOURCE: TMP.A86 Terminal Message Processor - C PAGE 14
690
691 0120 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch ;E0
692 CCCC
693 0128 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch
694 CCCC
695 0130 CCCCCCCCCCCC dw 0cccch,0cccch,0cccch,0cccch ;F0
696 CCCC
697 0138 CCCC dw 0cccch
698
699 013A 3100 stack_top dw offset tmp ; code starting point
700 013C 0000 dw 0 ; code seg - set by GENSYS
701 013E 0000 dw 0 ; init. flags - set by GENSYS
702
703 ; UDA is 100H bytes long
704
705 0080 maxcmdlen equ 128
706
707 ; the Read Console Buffer and the
708 ; Cli Control Block share the same memory
709
710 0140 read_buf rb 0
711 0140 80 read_maxcmd db 128
712 0141 clicb rb 0
713 0141 clicb_net rb 0
714 0141 read_blen rb 1
715 0142 clicb_cmd rb maxcmdlen + 1
716
717 01C3 00 cmdsent db false
718
719 01C4 0000 parseret dw 0
720
721 01C6 EB01 pcb dw offset savebuf
722 01C8 CA01 dw offset fcb
723
724 01CA 005354415254 fcb db 0, 'STARTUP '
725 555020
726 01D3 202020 startupnum db ' '
727 01D6 rb 20
728 01EA 00 db 0 ;current record
729
730 01EB savebuf rb 128
731
732 026B 00 db 0 ;ensure hex is formed
733 end
734
735
736 END OF ASSEMBLY. NUMBER OF ERRORS: 0. USE FACTOR: 9%
CP/M ASM86 1.1 SOURCE: TMP.A86 Terminal Message Processor - C PAGE 015
ABORTERR 042E V 507 542#
ATOB 02ED L 346 375 443#
ATOB2CHAR 02F6 L 444 446#
ATOBERR 0324 L 446 447 448 449 457#
ATTACH 036A L 143 209 479#
BADDRIVE 0169 L 280 281 286#
CATCHERR 03FB V 511 512 513 514 530#
CATTACHC 0092 N 40# 479
CCPM 0378 L 158 164 167 171 398 442 465 467 472 473
474 475 476 477 479 480 481 485#
CDETACHC 0093 N 41# 480
CHKSEMI 013F L 255 263#
CLICALL 017B L 269 272 293#
CLICB 0141 V 397 712#
CLICBCMD 0142 V 162 179 184 190 245 255 296 304 715#
CLICBNET 0141 V 393 713#
CLIERROR 0293 L 318 399 403#
CLIERRTAB 037B V 408 496#
CMDSENT 01C3 V 212 215 396 427 717#
CMDSTR 0446 V 433 548#
CONREADBUF 0372 L 238 481#
CR 000D N 27# 177 225
CREADBUF 000A N 39# 481
CRLF 0345 L 216 287 357 387 429 431 434 468#
CRLFSTR 03BD V 468 517#
CS SREG V 334 362 411 413 416 470
CSETNUM 0094 N 42# 473
CWRITE 0002 N 37# 465
CWRITEBUF 0009 N 38# 472
DEBLANK 0115 L 248# 252
DEFCONSOLE 0004 V 130 598#
DETACH 036E L 148 480#
DIRUSERNUM 0020 N 58# 467
DRIVEFREE 0376 L 206 482#
DRVERR 0438 V 287 544#
DRVFREE 0027 N 56# 482
DRVGET 0019 N 55# 475
DRVSET 000E N 53# 474
DS SREG V 136 136 137 144 144 146 147 150 175 258
306 470 470 471
EABORT 0028 N 101# 507
EBADFNAME 0018 N 93# 499
EBADFTYPE 0019 N 94# 502
EBADLOAD 001C N 95# 503
EBADOPEN 001E N 97# 505
EBADREAD 001D N 96# 504
EILLDISK 0017 N 92# 500
EILLLST 0025 N 99#
EILLPASSWD 0026 N 100# 501
ENOMEMORY 0003 N 89# 497
ENOPD 000C N 90# 498
ENULLCMD 001F N 98# 496
EQFULL 000F N 91# 506
CP/M ASM86 1.1 SOURCE: TMP.A86 Terminal Message Processor - C PAGE 016
ERRSTR 03C0 V 286 430 518#
ES SREG V 150 176 258 306 334 362
FALSE 0000 N 26# 212 215 427 717
FCB 01CA V 156 165 169 311 327 332 337 343 360 365
371 722 724#
FCLOSE 0010 N 48# 170
FNAMEERR 03ED V 499 500 501 502 527#
FOPEN 000F N 47# 157
FPARSE 0098 N 51# 439
FREAD 0014 N 49# 166
FSETDMA 001A N 50# 163
GETDISK 035E L 231 475#
GETLIST 0366 L 385 477#
GETUSER 033E L 226 355 466#
GONEXTCMD 0178 L 246 264 284 290#
GOODPARSE 01B0 L 314 322#
HAVEATAIL 01C1 L 323 326#
LF 000A N 28# 242
LGETNUM 00A4 N 45# 477
LOADERR 03FB V 503 504 532#
LSETNUM 00A0 N 44# 476
MAXCMDLEN 0080 N 705# 715
MEMERR 03CD V 497 521#
NEXTCOMMAND 00C6 L 202# 290 358 388 400 427 436
NEXTERR 0296 L 409# 413
NOBLANKS 0126 L 250 254#
NOCLEARLINE 00DE L 212 217#
NOSTARTUP 00C6 L 161 174 181 193#
NOTBUILTIN 0278 L 329 390#
NOTPRINTER 0278 L 364 389#
NOTUSER 0224 L 336 359#
NOZERO 00EF L 228 230#
OPENERR 0406 V 505 534#
OSINT 00E0 N 34# 488
PARSEFILENAME 02DD L 313 341 369 438#
PARSERET 01C4 V 322 338 366 719#
PCB 01C6 V 440 721#
PCLI 0096 N 60# 397
PD 0010 V 604#
PDASCIINUM 001B V 151 609#
PDERR 03DF V 498 524#
PERR 02BA L 426 429#
PFKEEP 0002 N 67# 607
PFSYS 0001 N 66# 607
PRCHAR 0339 L 225 233 242 461 465#
PRINTDSSTRING 0352 L 147 191 434 471 472#
PRINTEMSG 0483 V 381 560#
PRINTERCMD 04C3 V 361 574#
PRINTERERR 025E L 377 381#
PRINTERMSG 04A7 V 383 567#
PRINTSTRING 0348 L 189 235 286 287 352 354 382 384 430 431
433 470#
PRNUM 0327 L 229 356 386 458#
CP/M ASM86 1.1 SOURCE: TMP.A86 Terminal Message Processor - C PAGE 017
PRNUMONE 0336 L 459 463#
PROMPT 03BB V 234 516#
PRPRINTER 0264 L 367 370 380 383#
PRUSER 0210 L 339 342 350 353#
PSRUN 0000 N 65# 605
QFULLERR 0419 V 506 538#
READBLEN 0141 V 187 246 252 258 269 297 315 324 714#
READBUF 0140 V 238 710#
READMAXCMD 0140 V 711#
RSPBOTTOM 0140 N 84#
RSPMD 0008 N 81#
RSPPD 0010 N 82# 602
RSPTOP 0000 N 80# 594
RSPUDA 0040 N 83# 624
SAVEBUF 01EB V 305 312 316 325 434 721 730#
SCCPMSEG 0040 N 72# 146
SDATVAR 0002 V 597#
SETCONSOLENUM 0356 L 130 473#
SETDISK 035A L 138 284 474#
SETLIST 0362 L 379 476#
SETUSER 0340 L 141 349 467#
SHOWERR 02AD L 420#
SNCNS 0047 N 74# 597
SS SREG V
SSYSDISK 004B N 73# 137
STACKTOP 013A V 639 699#
STARTUP 0105 L 192 240#
STARTUPNUM 01D3 V 152 726#
SUPMSG 04CB V 188 577#
SVERSION 0078 N 75# 145
SYSDATSEG 0000 V 136 144 596#
TAB 0009 N 29# 250
TMP 0031 L 113 124# 699
TRUE 00FF N 25# 396
TRYBUILTIN 01CF L 327 332#
UDA 0040 V 610 626#
UNKNOWNERR 02A8 L 411 415#
USERCMD 04BB V 333 572#
USERERR 020A L 347 351#
USERERRMSG 0451 V 351 550#
USERMSG 0472 V 353 556#
ZAPBLANK 011F L 249 251#