CP/M ASM86 1.1  SOURCE: ECHO.A86                                                                             PAGE   1

     1  
     2                          
     3  ;
     4                          ;       ECHO - Resident System Process
     5                          ;       Print Command tail to console
     6                          ;
     7  
     8                          ;
     9                          ;       DEFINITIONS
    10                          ;
    11  
    12     00E0                 ccpmint         equ     224     ;ccpm entry interrupt
    13     0009                 c_writebuf      equ     9       ;print string
    14     0093                 c_detach        equ     147     ;detach console
    15     0094                 c_setnum        equ     148     ;set default console
    16     0086                 q_make          equ     134     ;create queue
    17     0087                 q_open          equ     135     ;open queue
    18     0089                 q_read          equ     137     ;read queue
    19     008B                 q_write         equ     139     ;write queue
    20     0091                 p_priority      equ     145     ;set priority
    21  
    22     0030                 pdlen           equ     48      ;length of Process
    23                                                          ;  Descriptor
    24  
    25     0020                 p_cns           equ     byte ptr 020h   ;default cns
    26     0012                 p_disk          equ     byte ptr 012h   ;default disk
    27     0013                 p_user          equ     byte ptr 013h   ;default user
    28     0024                 p_list          equ     byte ptr 024h   ;default list
    29     0000                 ps_run          equ     0       ;PD run status
    30     0002                 pf_keep         equ     2       ;PD nokill flag
    31  
    32     0000                 rsp_top         equ     0       ;rsp offset
    33     0010                 rsp_pd          equ     010h    ;PD offset
    34     0040                 rsp_uda         equ     040h    ;UDA offset
    35     0140                 rsp_bottom      equ     140h    ;end rsp header
    36  
    37     0008                 qf_rsp          equ     08h     ;queue RSP flag
    38  
    39                          ;
    40                          ;       CODE SEGMENT
    41                          ;
    42                                  CSEG
    43                                  org 0
    44  
    45   0000 CDE0              ccpm:   int ccpmint
    46   0002 C3                        ret
    47  
    48                          main:           ;create ECHO queue
    49   0003 B186BAC301                mov cl,q_make ! mov dx,offset qd
    50   0008 E8F5FF       0000         call ccpm
    51                                          ;open ECHO queue
    52   000B B187BA0903                mov cl,q_open ! mov dx,offset qpb
    53   0010 E8EDFF       0000         call ccpm
CP/M ASM86 1.1  SOURCE: ECHO.A86                                                                             PAGE   2

    54  
    55                                          ;set priority to normal
    56   0013 B191BAC800                mov cl,p_priority ! mov dx,200
    57   0018 E8E5FF       0000         call ccpm
    58  
    59                                          ;ES points to SYSDAT
    60   001B 8E060000                  mov es,sdatseg
    61  
    62                          loop:   ;forever
    63                                          ;read cmdtail from queue
    64   001F B189BA0903                mov cl,q_read ! mov dx,offset qpb
    65   0024 E8D9FF       0000         call ccpm
    66  
    67                                          ;set default values from PD
    68   0027 8B1E8302                  mov bx,pdadr
    69                          ;       mov dl,es:p_disk[bx]    ;p_disk=0-15
    70                          ;       inc dl ! mov disk,dl    ;make disk=1-16
    71                          ;       mov dl,es:p_user[bx]
    72                          ;       mov user,dl
    73                          ;       mov dl,es:p_list[bx]
    74                          ;       mov list,dl
    75   002B 268A5720                  mov dl,es:p_cns[bx]
    76   002F 88161903                  mov console,dl
    77  
    78                                          ;set default console
    79                          ;       mov dl,console
    80   0033 B194E8C8FF   0000         mov cl,c_setnum ! call ccpm
    81  
    82                                          ;scan cmdtail and look for '$' or 0.
    83                                          ;when found, replace w/ cr,lf,'$'
    84  
    85   0038 8D1E8502B024              lea bx,cmdtail ! mov al,'$' ! mov ah,0
    86        B400
    87   0040 8BD381C28300              mov dx,bx ! add dx,131
    88                          nextchar:
    89   0046 3BDA770B     0055         cmp bx,dx ! ja endcmd
    90   004A 38077407     0055         cmp [bx],al ! je endcmd
    91   004E 38277403     0055         cmp [bx],ah ! je endcmd
    92   0052 43EBF1       0046             inc bx ! jmps nextchar
    93                          endcmd:
    94   0055 C6070D                    mov byte ptr [bx],13
    95   0058 C647010A                  mov byte ptr 1[bx],10
    96   005C C6470224                  mov byte ptr 2[bx],'$'
    97  
    98                                          ;write command tail
    99   0060 8D168502B109              lea dx,cmdtail ! mov cl,c_writebuf
   100   0066 E897FF       0000         call ccpm
   101                                          ;detach console
   102   0069 8A161903                  mov dl,console
   103   006D B193E88EFF   0000         mov cl,c_detach ! call ccpm
   104                                          ;done, get next command 
   105   0072 EBAB         001F         jmps loop
   106  
CP/M ASM86 1.1  SOURCE: ECHO.A86                                                                             PAGE   3

   107  
   108                          ;
   109                          ;       DATA SEGMENT
   110                          ;
   111  
   112                                  DSEG
   113                                  org     rsp_top
   114  
   115   0000 000000000000      sdatseg         dw      0,0,0
   116   0006 000000000000                      dw      0,0,0
   117   000C 00000000                          dw      0,0
   118  
   119                                  org     rsp_pd
   120  
   121   0010 00000000          pd              dw      0,0             ; link,thread
   122   0014 00                                db      ps_run          ; status
   123   0015 BE                                db      190             ; priority
   124   0016 0200                              dw      pf_keep         ; flags
   125   0018 4543484F2020                      db      'ECHO    '      ; name
   126        2020
   127   0020 0400                              dw      offset uda/10h  ; uda seg
   128   0022 0000                              db      0,0             ; disk,user
   129   0024 0000                              db      0,0             ; load dsk,usr
   130   0026 0000                              dw      0               ; mem
   131   0028 00000000                          dw      0,0             ; dvract,wait
   132   002C 0000                              db      0,0
   133   002E 0000                              dw      0
   134   0030 00                                db      0               ; console
   135   0031 000000                            db      0,0,0
   136   0034 00                                db      0               ; list
   137   0035 000000                            db      0,0,0
   138   0038 000000000000                      dw      0,0,0,0
   139        0000
   140  
   141                                  org     rsp_uda
   142  
   143   0040 0000DF010000      uda             dw      0,offset dma,0,0        ;0
   144        0000
   145   0048 000000000000                      dw      0,0,0,0
   146        0000
   147   0050 000000000000                      dw      0,0,0,0                 ;10h
   148        0000
   149   0058 000000000000                      dw      0,0,0,0
   150        0000
   151   0060 000000000000                      dw      0,0,0,0                 ;20h
   152        0000
   153   0068 000000000000                      dw      0,0,0,0
   154        0000
   155   0070 000000007D02                      dw      0,0,offset stack_tos,0  ;30h
   156        0000
   157   0078 000000000000                      dw      0,0,0,0
   158        0000
   159   0080 000000000000                      dw      0,0,0,0                 ;40h
CP/M ASM86 1.1  SOURCE: ECHO.A86                                                                             PAGE   4

   160  
   161        0000
   162   0088 000000000000                      dw      0,0,0,0
   163        0000
   164   0090 000000000000                      dw      0,0,0,0                 ;50h
   165        0000
   166   0098 000000000000                      dw      0,0,0,0
   167        0000
   168   00A0 000000000000                      dw      0,0,0,0                 ;60h
   169        0000
   170  
   171                                  org     rsp_bottom
   172  
   173   0140                   qbuf            rb      131             ;Queue buffer
   174  
   175   01C3 0000              qd              dw      0               ;link
   176   01C5 0000                              db      0,0             ;net,org
   177   01C7 0800                              dw      qf_rsp          ;flags
   178   01C9 4543484F2020                      db      'ECHO    '      ;name
   179        2020
   180   01D1 8300                              dw      131             ;msglen
   181   01D3 0100                              dw      1               ;nmsgs
   182   01D5 00000000                          dw      0,0             ;dq,nq
   183   01D9 00000000                          dw      0,0             ;msgcnt,msgout
   184   01DD 4001                              dw      offset qbuf     ;buffer addr.
   185  
   186   01DF                   dma             rb      128     
   187  
   188   025F CCCCCCCCCCCC      stack           dw      0cccch,0cccch,0cccch
   189   0265 CCCCCCCCCCCC                      dw      0cccch,0cccch,0cccch
   190   026B CCCCCCCCCCCC                      dw      0cccch,0cccch,0cccch
   191   0271 CCCCCCCCCCCC                      dw      0cccch,0cccch,0cccch
   192   0277 CCCCCCCCCCCC                      dw      0cccch,0cccch,0cccch
   193   027D 0300              stack_tos       dw      offset main     ; start offset
   194   027F 0000                              dw      0               ; start seg
   195   0281 0000                              dw      0               ; init flags
   196  
   197   0283                   pdadr           rw      1               ; QPB Buffer
   198   0285                   cmdtail         rb      129             ; starts here
   199   0306 0D0A24                            db      13,10,'$'
   200  
   201   0309 0000              qpb             db      0,0             ;must be zero
   202   030B 0000                              dw      0               ;queue ID
   203   030D 0100                              dw      1               ;nmsgs
   204   030F 8302                              dw      offset pdadr    ;buffer addr.
   205   0311 4543484F2020                      db      'ECHO    '      ;name to open
   206        2020
   207  
   208   0319 00                console         db      0
   209                          ;disk           db      0
   210                          ;user           db      0
   211                          ;list           db      0
   212  
CP/M ASM86 1.1  SOURCE: ECHO.A86                                                                             PAGE   5

   213  
   214                                  end
   215  
   216  
   217  END OF ASSEMBLY.  NUMBER OF ERRORS:   0.  USE FACTOR:  2%
CP/M ASM86 1.1  SOURCE: ECHO.A86                                                                             PAGE 006

CCPM             0000 L    45#   50    53    57    65    80   100   103 
CCPMINT          00E0 N    12#   45 
CDETACH          0093 N    14#  103 
CMDTAIL          0285 V    85    99   198#
CONSOLE          0319 V    76   102   208#
CS               SREG V 
CSETNUM          0094 N    15#   80 
CWRITEBUF        0009 N    13#   99 
DMA              01DF V   143   186#
DS               SREG V 
ENDCMD           0055 L    89    90    91    93#
ES               SREG V    60    75 
LOOP             001F L    62#  105 
MAIN             0003 L    48#  193 
NEXTCHAR         0046 L    88#   92 
PCNS             0020 N    25#   75 
PD               0010 V   121#
PDADR            0283 V    68   197#  204 
PDISK            0012 N    26#
PDLEN            0030 N    22#
PFKEEP           0002 N    30#  124 
PLIST            0024 N    28#
PPRIORITY        0091 N    20#   56 
PSRUN            0000 N    29#  122 
PUSER            0013 N    27#
QBUF             0140 V   173#  184 
QD               01C3 V    49   175#
QFRSP            0008 N    37#  177 
QMAKE            0086 N    16#   49 
QOPEN            0087 N    17#   52 
QPB              0309 V    52    64   201#
QREAD            0089 N    18#   64 
QWRITE           008B N    19#
RSPBOTTOM        0140 N    35#  171 
RSPPD            0010 N    33#  119 
RSPTOP           0000 N    32#  113 
RSPUDA           0040 N    34#  141 
SDATSEG          0000 V    60   115#
SS               SREG V 
STACK            025F V   188#
STACKTOS         027D V   155   193#
UDA              0040 V   127   143#
