home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / utils / sysutl / status18.asm < prev    next >
Assembly Source File  |  1994-07-13  |  31KB  |  1,271 lines

  1. ; Lauren Guimont    1-25-80        Ver. 1.0
  2. ;             1-28-80        Ver. 1.1
  3. ;             3-20-80        Ver. 1.2
  4. ;             6-26-80        Ver. 1.3
  5.  
  6. ; Benny D. Miller jr WB8LGH    05-Jan-84    ver. 1.8
  7. ;     added MP/M II information.
  8.  
  9. ; This is an assembly language adaption of a program
  10. ; written in NorthStar BASIC called `STATUS'.
  11.  
  12. ; This program will determine the location of numerous
  13. ; addresses, depending on the system size being run.
  14. ; It will also present various pieces of information
  15. ; concerning the status of many of the options available
  16. ; under CP/M 2.20, besides presenting a map of the memory
  17. ; of the host system.
  18.  
  19. ; 26-july-82    added ports(disk destructive read protect)
  20. ;     at locations 103(low port) and 104(high port),
  21. ;     or at 203,204 if PRL file.  Actually bypasses these
  22. ;     ports if set other than 0.
  23.  
  24. ; 21-july-82    Status now gives the console(user's), and
  25. ;     maximun consoles. Xios jump table, checks for
  26. ;     CP/Net active/non-active, system time of day,
  27. ;     displays all memory segments.
  28.  
  29. ; Set up the equates to use
  30.  
  31. true    equ    0ffffh        ; true equate.
  32. false    equ    not true    ; false equate.
  33.  
  34. rmac    equ    true        ; if assembled with rmac, and link.
  35. hide    equ    true        ; if hide disk ports, to stop destructive
  36.                 ; reads, also check porta, and portb equates.
  37.  
  38.     if rmac
  39. extrn    bdos            ; I/O call.
  40.     endif
  41.  
  42.     if not rmac
  43. bdos    equ    5        ; bdos equate.
  44.     endif
  45.  
  46. ff    equ    0ch    ; form feed.
  47.  
  48. CONOUT    EQU    2        ; CONSOLE CHAR OUT
  49. giobyte    equ    7        ; get the iobyte.
  50. STROUT    EQU    9        ; PRINT STRING OUTPUT
  51. version    equ    12        ; returns version.
  52. mpmvrs    equ    163        ; MP/M 2.x revision.
  53. LOGIN    EQU    24        ; RETURNS ON-LINE DRIVES
  54. CURDRV    EQU    25        ; RETURNS DEFAULT DRIVE#
  55. ALLOC    EQU    27        ; RETURNS ALLOCATION ADDRESS
  56. RONLY    EQU    29        ; RETURNS READ ONLY VECTOR
  57. DPARA    EQU    31        ; RETURNS DISK PARAMETER BLK
  58. PRUSER    EQU    32        ; RETURNS PRESENT USER
  59. console    equ    153        ; get console number.
  60. sysdat    equ    154        ; get system data address.
  61. systod    equ    155        ; get system time of day.
  62.  
  63.     if not rmac
  64.     org    0100h
  65.     endif
  66.  
  67. start:
  68.     jmp    astart
  69.  
  70. ;     port hide, so that a destructive read doesn't happen.
  71.  
  72. porta    db    0c0h        ; disk 1 start port address.
  73. portb    db    0c3h        ; disk 1 last port address.
  74.  
  75. astart:                ; Actual program start
  76.     LXI    H,0        ; Clear HL
  77.     DAD    SP        ; Get SP from CCP
  78.     SHLD    OLDSP        ; Save it
  79.     LXI    SP,STACK    ; Point to our stack
  80.  
  81.     mvi    c,version    ; get CP/M, MP/M version.
  82.     call    bdos        ;
  83.     mov    a,h        ; see if MP/M.
  84.     sta    mpmbyte        ; save it.
  85.     mov    a,l        ; version number CP/M 1.x or 2.x.
  86.     sta    cpmbyte        ; save it.
  87.  
  88.     CALL    CLEAR
  89.  
  90.     lda    mpmbyte        ; see if MP/M or CP/M.
  91.     ora    a        ; is MP/M if none zero.
  92.     jz    cpm        ; go do CP/M message if not.
  93.     lxi    d,msg24        ; do MP/M message.
  94.     mvi    c,strout    ; print it command.
  95.     call    bdos        ; go print it.
  96.     lda    cpmbyte        ; get mpm version.
  97.     ani    0f6h        ; if bit 1 set mpm 1. only.
  98.     lda    mpmbyte        ; re-get byte just in case.
  99.     jz    contmpm        ; do mp/m 1.1
  100.     mvi    c,mpmvrs    ; go see which MP/M.
  101.     call    bdos        ;
  102.     mov    a,l        ; save mp/m 2 revision level.
  103.     sta    cpmbyte        ; save it.
  104.     mov    a,h        ; get 1 for mpm 2
  105.     sta    mpmbyte        ; save new MP/M byte.
  106.  
  107. contmpm:
  108.     adi    31h        ; add ascii offset.
  109.     call    cout        ; output first number.
  110.     mvi    a,'.'        ; now the seprator.
  111.     call    cout        ; out put it.
  112.     lda    cpmbyte        ; now the lower version number.
  113.     ani    0fh        ; strip upper nibble.
  114.     adi    30h        ; add ascii offset.
  115.     call    cout        ; go print it.
  116.     lxi    d,msg27        ; trailing end of message.
  117.     mvi    c,strout    ; print command.
  118.     call    bdos        ; go print it.
  119.     call    crlf        ; go do cr,lf.
  120.     jmp    bpcpm        ; bypass CP/M message.
  121.  
  122. cpm:
  123.     LXI    D,MSG0
  124.     MVI    C,STROUT
  125.     CALL    BDOS
  126.     lda    cpmbyte        ; get cpm version.
  127.     ani    0f0h        ; strip upper nibble.
  128.     rar            ; rotate right four times.
  129.     rar            ; 
  130.     rar            ; 
  131.     rar            ; 
  132.     adi    30h        ; add ascii offset.
  133.     call    cout        ; output first number.
  134.     mvi    a,'.'        ; now the seprator.
  135.     call    cout        ; out put it.
  136.     lda    cpmbyte        ; now the lower version number.
  137.     ani    0fh        ; strip upper nibble.
  138.     adi    30h        ; add ascii offset.
  139.     call    cout        ; go print it.
  140.     lxi    d,msg27        ; trailing end of message.
  141.     mvi    c,strout    ; print command.
  142.     call    bdos        ; go print it.
  143.     call    crlf        ; go do cr,lf.
  144.  
  145. bpcpm:
  146.     LXI    D,MSG1
  147.     MVI    C,STROUT
  148.     CALL    BDOS
  149.  
  150. ; This is the start of the memory map
  151.  
  152.     LXI    H,0000H        ; Start memory map
  153.  
  154. MEMORY:
  155.     MVI    A,0FFH
  156.     CMP    M        ; Memory?
  157.     JZ    EMPTY
  158.     MOV    B,M        ; Save memory value
  159.     MOV    M,A
  160.     MOV    A,M
  161.     CMP    B        ; Same as original?
  162.     JZ    ROM
  163.  
  164. RAM:
  165.     MOV    M,B        ; Replace original byte
  166.     MVI    B,4DH
  167.     JMP    SHWBY
  168.  
  169. ROM:
  170.     MVI    B,52H
  171.     JMP    SHWBY
  172.  
  173. EMPTY:
  174.     MVI    A,80H        ; Double check W/new value
  175.     MOV    B,M
  176.     MOV    M,A
  177.     MOV    A,M
  178.     CMP    B        ; Is it ram?
  179.     JNZ    RAM
  180.     MVI    B,2EH
  181.  
  182. SHWBY:
  183.     MOV    A,B
  184.     CALL    COUT        ; Output ROM, RAM, or empty
  185.     INR    H
  186.     INR    H
  187.     INR    H
  188.     INR    H
  189.     JNZ    MEMORY        ; Loop till done
  190.     CALL    CRLF
  191.  
  192. ; Now we fill in the storage bytes with the proper
  193. ; values which are dependent on each particular system.
  194.  
  195.     lda    mpmbyte
  196.     ora    a        ; will be none zero for MP/M.
  197.     jnz    alocxios    ; do acllocation vectors.
  198.  
  199.     LHLD    BDOS+1        ; Get start of BDOS
  200.     MOV    A,L
  201.     SUI    6
  202.     MOV    L,A
  203.     SHLD    BEDOS        ; Store it
  204.     LXI    D,0F700H
  205.     LHLD    BEDOS
  206.     DAD    D        ; Add wrap around offset
  207.     SHLD    TPA
  208.     LXI    D,100H
  209.     LHLD    TPA
  210.     DAD    D
  211.     SHLD    CCP        ; Store CCP=-100H of TPA
  212.     MVI    C,GIOBYTE
  213.     CALL    BDOS
  214.     STA    IOBYT        ; Store the I/O byte
  215.  
  216. alocxios:
  217.     lda    mpmbyte        ; see if MP/M.
  218.     ora    a        ; if not zero
  219.     jnz    mpmaloc        ; do MP/M allocation vectors.
  220.  
  221.     lda    cpmbyte
  222.     ani    0f0h        ; see if 1.x version.
  223.     jz    not2cpm        ; go past if now 2.x CP/M.
  224.  
  225. mpmaloc:
  226.     MVI    C,ALLOC
  227.     CALL    BDOS
  228.     SHLD    ALLOCAD
  229.  
  230.     lda    mpmbyte        ; see if MP/M.
  231.     ora    a        ; if not zero
  232.     jnz    conmax        ; do maximun number of consoles.
  233.  
  234. ; Now we must output the gathered information
  235. ; to the console
  236.  
  237. ; Get the CCP address and print it
  238.  
  239. not2cpm:
  240.     LXI    D,MSG2
  241.     MVI    C,STROUT
  242.     CALL    BDOS
  243.     LHLD    CCP
  244.     CALL    ADOUT
  245.     CALL    CRLF
  246.  
  247. ; Next get the BDOS address and print it
  248.  
  249.     LXI    D,MSG3
  250.     MVI    C,STROUT
  251.     CALL    BDOS
  252.     LHLD    BEDOS
  253.     CALL    ADOUT
  254.     CALL    CRLF
  255.  
  256. ; Next get address of BIOS and print it
  257.  
  258.     LXI    D,MSG15
  259.     MVI    C,STROUT
  260.     CALL    BDOS
  261.     LXI    D,0E00H
  262.     LHLD    BEDOS
  263.     DAD    D
  264.     CALL    ADOUT
  265.     CALL    CRLF
  266.  
  267. ; Compute TPA without killing CCP and print it
  268.  
  269.     LXI    D,MSG13
  270.     MVI    C,STROUT
  271.     CALL    BDOS
  272.     LHLD    TPA
  273.     CALL    ADOUT
  274.     LXI    D,MSG11
  275.     MVI    C,STROUT
  276.     CALL    BDOS
  277.     CALL    CRLF
  278.  
  279.     jmp    drvchk
  280.  
  281.  
  282. ; print the number of consoles supported.
  283.  
  284. conmax:
  285.     lxi    d,msg28        ; go print message for number of consoles.
  286.     mvi    c,strout    ; string output function.
  287.     call    bdos        ; do it.
  288.     lxi    d,1        ; increment to number of consoles.
  289.     call    offset        ; dad the d wth the h&l.
  290.     sta    maxcon        ; store at maximun number of consoles.
  291.     call    heout        ; go print it in hex format.
  292.     call    crlf        ; do cr,lf.
  293.  
  294. ;     do a system console number output.
  295.  
  296. syscon:
  297.     lxi    d,msg25        ; point to message.
  298.     mvi    c,strout    ; print command.
  299.     call    bdos        ; print it.
  300.     mvi    c,console    ; get console number.
  301.     call    bdos        ; comes back in a.
  302.     adi    30h        ; add ascii offset.
  303.     call    cout        ; go do it.
  304.     call    crlf        ; do cr,lf.
  305.  
  306. ;    see if extended information bytes at end of bnkxios jmp table.
  307.  
  308. extended:
  309.     lxi    d,7        ; find xios jmp table address.
  310.     call    offset        ; dad the d wth the h&l.
  311.     mov    h,m        ; get base address of xios.
  312.     mvi    l,0        ; always start at base pge of it.
  313.     lxi    d,75        ; go past xios jmp table.
  314.     dad    d        ; update pointer.
  315.     mov    a,m        ; get the byte.
  316.     ani    0ffh        ; see if boolean non zero if MPM II jmp table.
  317.     jz    tod        ; go do systems time of day.
  318.     inx    h        ; must be 2 bytes set to ffh
  319.     shld    exiospt        ; extended xios pointer.
  320.     mov    a,m        ; get byte.
  321.     ani    0ffh        ; ok?
  322.     jz    tod        ; do the systems time of day.
  323.  
  324.     lxi    d,msg99        ; go print the BSR controller is active.
  325.     mvi    c,strout    ; string output function.
  326.     call    bdos        ; do it.
  327.  
  328.     lhld    exiospt        ; restore just in case.
  329.     lxi    d,24        ; see if bsr on/off, it is,
  330.                  ; 25 from base inormation bytes.
  331.     dad    d        ; add to pointer.
  332.     mov    a,m        ; get byte.
  333.     inx    h        ; up next byte.
  334.     inx    h        ; up next byte.
  335.     shld    exiospt        ; extended xios pointer.
  336.     ani    0ffh        ; of ff then it is on.
  337.     jnz    bsract        ; go do active message.
  338.     lxi    d,msg37        ; go print the CP/Net is inactive.
  339.     mvi    c,strout    ; string output function.
  340.     call    bdos        ; do it.
  341.     call    crlf        ; do cr,lf.
  342.     jmp    cnulls        ; go to console and nulls.
  343.  
  344. bsract:
  345.     lxi    d,msg38        ; go print the CP/Net is active.
  346.     mvi    c,strout    ; string output function.
  347.     call    bdos        ; do it.
  348.     call    crlf        ; do cr,lf.
  349.  
  350. cnulls:
  351.     lxi    d,msg44        ; go print the console number(0-to-end).
  352.     mvi    c,strout    ; string output function.
  353.     call    bdos        ; do it.
  354.  
  355.     lda    csole        ; get console number back.
  356.     adi    30h        ; make ascii.
  357.     call    cout        ; go print console number.
  358.  
  359.     lxi    d,msg45        ; go print the 'has' message.
  360.     mvi    c,strout    ; string output function.
  361.     call    bdos        ; do it.
  362.     lhld    exiospt        ; get pointer back.
  363.     mov    a,m        ; get the current number of nulls.
  364.     adi    30h        ; add ascii offset.
  365.     call    cout        ; go print it.
  366.  
  367.     lxi    d,msg46        ; go print the 'nulls' message.
  368.     mvi    c,strout    ; string output function.
  369.     call    bdos        ; do it.
  370.     call    crlf        ; add carriage return, linefeed per message.
  371.  
  372.     lda    csole        ; get console number.
  373.     adi    1        ; next console.
  374.     sta    csole        ; save it again.
  375.     lhld    exiospt        ; just makeing sure it's right.
  376.     inx    h        ; next null pointer also.
  377.     shld    exiospt        ; resave.
  378.     lda    maxcon        ; done 1, now next one,
  379.     sui    1        ; one less,
  380.     sta    maxcon        ; to do.
  381.     jnz    cnulls        ; loop till all consoles are done.
  382.  
  383. ;     do a TOD, sytem time of day.
  384.  
  385. tod:
  386.     lxi    d,msg26        ; get tod message.
  387.     mvi    c,strout    ; print command.
  388.     call    bdos        ; print it.
  389.     mvi    c,systod    ; time of day command.
  390.     lxi    d,time        ; set up for date, hour, minutes, seconds.
  391.     call    bdos        ; go do it.
  392.  
  393.     lxi    h,time1        ; do time hours for now.
  394.     call    dobyte        ; go do a byte
  395.     mvi    a,':'        ; separater.
  396.     call    cout        ; go print it.
  397.     inx    h        ; minutes.
  398.     call    dobyte        ; go do it.
  399.     mvi    a,':'        ; separater.
  400.     call    cout        ; go print it.
  401.     inx    h        ; seconds.
  402.     call    dobyte        ; go do it.
  403.     call    crlf        ; do cr,lf.
  404.  
  405. ; now do the restart number.
  406.  
  407.     lxi    d,msg29        ; go print the restart message.
  408.     mvi    c,strout    ; string output function.
  409.     call    bdos        ; do it.
  410.     lxi    d,2        ; increment to the breakpoint number.
  411.     call    offset        ; dad the d wth the h&l.
  412.     adi    30h        ; ascii offset.
  413.     call    cout        ; go print it.
  414.     call    crlf        ; do cr,lf.
  415.  
  416. ; now do CPU type.
  417.  
  418.     lxi    d,msg30        ; go print the CPU message.
  419.     mvi    c,strout    ; string output function.
  420.     call    bdos        ; do it.
  421.     lxi    d,5        ; increment to the CPU type.
  422.     call    offset        ; dad the d wth the h&l.
  423.     ani    0ffh        ; if ff then z-80 else 8080(type).
  424.     jnz    z80        ; do z-80 if ff.
  425.     lxi    d,msg31        ; go print the 8080 CPU.
  426.     mvi    c,strout    ; string output function.
  427.     call    bdos        ; do it.
  428.     call    crlf        ; do cr,lf.
  429.     jmp    bkbdos        ; go to xios jmp table.
  430.  
  431. z80:
  432.     lxi    d,msg32        ; go print the Z-80 CPU.
  433.     mvi    c,strout    ; string output function.
  434.     call    bdos        ; do it.
  435.     call    crlf        ; do cr,lf.
  436.  
  437. ; now do the bank bdos function.
  438.  
  439. bkbdos:
  440.     lxi    d,4        ; increment to banked switched memory
  441.     call    offset        ; dad the d wth the h&l.
  442.     ani    0ffh        ; see if boolean non zero if banked switched.
  443.     jz    rspage        ; go do resident page if not.
  444.     lxi    d,msg33        ; go print the bank switched memory indicator.
  445.     mvi    c,strout    ; string output function.
  446.     call    bdos        ; do it.
  447.     call    crlf        ; do cr,lf.
  448.  
  449.  
  450. ; now do the resident page address.
  451.  
  452. rspage:
  453.     lxi    d,6        ; increment to BDOS RSP page address.
  454.     call    offset        ; dad the d wth the h&l.
  455.     ani    0ffh        ; see if boolean non zero if banked switched.
  456.     jz    xios        ; go do xios jm table.
  457.     lxi    d,msg35        ; go print the bdos resident page.
  458.     mvi    c,strout    ; string output function.
  459.     call    bdos        ; do it.
  460.     call    crlf        ; do cr,lf.
  461.  
  462. resbdos:
  463.     lxi    d,msg43
  464.     mvi    c,strout
  465.     call    bdos
  466.  
  467.     lxi    d,8        ; increment to resident bdos.
  468.     call    offset        ; dad the d wth the h&l.
  469.     mov    d,m        ; get into d for printing.
  470.     mvi    e,0        ; force low order byte to zero.
  471.     xchg            ; exchange the de&hl for printing address.
  472.     call    adout        ; go print address.
  473.     xchg            ; get back hl.
  474.     call    crlf        ; then cr,lf.
  475.  
  476. ;     do XIOS printout, and some other MP/M stuff.
  477. ;     ex: memory segmnts and size, console number, time of day.
  478.  
  479. xios:
  480.     lxi    d,7        ; increment to xios jmp table address.
  481.     call    offset        ; dad the d wth the h&l.
  482.     ani    0ffh        ; see if boolean non zero if MPM II jmp table.
  483.     jz    xdos        ; go do xdos if not.
  484.  
  485.     lxi    d,msg20
  486.     mvi    c,strout
  487.     call    bdos
  488.  
  489.     lxi    d,7        ; increment to xios jmp table.
  490.     call    offset        ; dad the d wth the h&l.
  491.     mov    d,m        ; get into d for printing.
  492.     mvi    e,0        ; force low order byte to zero.
  493.     xchg            ; exchange the de&hl for printing address.
  494.     call    adout        ; go print address.
  495.     xchg            ; get back hl.
  496.     call    crlf        ; then cr,lf.
  497.  
  498. ; now print the address of the xdos.
  499.  
  500. xdos:
  501.     lxi    d,11        ; increment to banked XDOS address.
  502.     call    offset        ; dad the d wth the h&l.
  503.     ani    0ffh        ; 
  504.     jz    rsp        ; 
  505.     lxi    d,msg39        ; go print the XDOS address start.
  506.     mvi    c,strout    ; string output function.
  507.     call    bdos        ; do it.
  508.     lxi    d,11        ; increment to banked XDOS address.
  509.     call    offset        ; dad the d wth the h&l.
  510.     mov    d,m        ; get into d for printing.
  511.     mvi    e,0        ; force low order byte to zero.
  512.     xchg            ; exchange the de&hl for printing address.
  513.     call    adout        ; go print address.
  514.     xchg            ; get back hl.
  515.     call    crlf        ; do cr,lf.
  516.  
  517. ; now do the RSP base page address.
  518.  
  519. rsp:
  520.     lxi    d,12        ; increment to banked RSP base page address.
  521.     call    offset        ; dad the d wth the h&l.
  522.     ani    0ffh        ; 
  523.     jz    bxios        ; 
  524.     lxi    d,msg40        ; go print the RSP address start.
  525.     mvi    c,strout    ; string output function.
  526.     call    bdos        ; do it.
  527.     lxi    d,12        ; increment to banked RSP base page address.
  528.     call    offset        ; dad the d wth the h&l.
  529.     mov    d,m        ; get into d for printing.
  530.     mvi    e,0        ; force low order byte to zero.
  531.     xchg            ; exchange the de&hl for printing address.
  532.     call    adout        ; go print address.
  533.     xchg            ; get back hl.
  534.     call    crlf        ; do cr,lf.
  535.  
  536. ; now do the banked XIOS base pase address.
  537.  
  538. bxios:
  539.     lxi    d,13        ; increment to banked XIOS address.
  540.     call    offset        ; dad the d wth the h&l.
  541.     ani    0ffh        ; 
  542.     jz    bnkbdos        ; 
  543.     lxi    d,msg41        ; go print the banked XIOS address start.
  544.     mvi    c,strout    ; string output function.
  545.     call    bdos        ; do it.
  546.     lxi    d,13        ; increment to xios jmp table.
  547.     call    offset        ; dad the d wth the h&l.
  548.     mov    d,m        ; get into d for printing.
  549.     mvi    e,0        ; force low order byte to zero.
  550.     xchg            ; exchange the de&hl for printing address.
  551.     call    adout        ; go print address.
  552.     xchg            ; get back hl.
  553.     call    crlf        ; then cr,lf.
  554.  
  555. ; now do the banked BDOS base page.
  556.  
  557. bnkbdos:
  558.     lxi    d,14        ; increment to banked BDOS address.
  559.     call    offset        ; dad the d wth the h&l.
  560.     ani    0ffh        ; 
  561.     jz    cpnet        ; go do CP/Net if not.
  562.     lxi    d,msg42        ; go print the banked BDOS address start.
  563.     mvi    c,strout    ; string output function.
  564.     call    bdos        ; do it.
  565.     lxi    d,14        ; increment to banked BDOS address.
  566.     call    offset        ; dad the d wth the h&l.
  567.     mov    d,m        ; get into d for printing.
  568.     mvi    e,0        ; force low order byte to zero.
  569.     xchg            ; exchange the de&hl for printing address.
  570.     call    adout        ; go print address.
  571.     xchg            ; get back hl.
  572.     call    crlf        ; do cr,lf.
  573.  
  574. ; now do CP/Net function.
  575.  
  576. cpnet:
  577.     lxi    d,msg36        ; go print CP/Net.
  578.     mvi    c,strout    ; string output function.
  579.     call    bdos        ; do it.
  580.     lxi    d,09h        ; increment to CP/Net active/nonactive.
  581.     call    offset        ; dad the d wth the h&l.
  582.     ani    0ffh        ; see if boolean non zero if banked switched.
  583.     jnz    active        ; go do active message.
  584.     lxi    d,msg37        ; go print the CP/Net is inactive.
  585.     mvi    c,strout    ; string output function.
  586.     call    bdos        ; do it.
  587.     call    crlf        ; do cr,lf.
  588.     jmp    memseg        ; go to memory segments.
  589.  
  590. active:
  591.     lxi    d,msg38        ; go print the CP/Net is active.
  592.     mvi    c,strout    ; string output function.
  593.     call    bdos        ; do it.
  594.     call    crlf        ; do cr,lf.
  595.  
  596. memseg:
  597.     lxi    d,msg21
  598.     mvi    c,strout
  599.     call    bdos
  600.     call    crlf
  601.     lxi    d,msg22
  602.     mvi    c,strout
  603.     call    bdos
  604.     call    crlf
  605.     lxi    d,0fh        ; offset to memory segments address start.
  606.     call    offset        ; hl now pointing to memory seg address.
  607.     adi    1        ; make one higher.
  608.     sta    segcnt        ; store memory segment count in memory.
  609.  
  610. memore:
  611.     inx    h        ; next byte.
  612.     mov    d,m        ; get high order address.
  613.     mvi    e,0        ; force low byte to zero.
  614.     lda    segcnt        ; put into a.
  615.     sui    1        ; if none zero then is memory segment.
  616.     sta    segcnt        ; less one on the counter.
  617.     jz    numrecd        ; go do number of records check.
  618.  
  619. mem1time:
  620.     push    h        ; save hl.
  621.     xchg            ; put de into hl.
  622.     call    adout        ; output address.
  623.     xchg            ; get bck hl.
  624.  
  625.     lxi    d,msg23        ; output a few spaces.
  626.     mvi    c,strout    ; print it.
  627.     call    bdos
  628.  
  629.     pop    h        ; get it back.
  630.     inx    h        ; now we are there.
  631.     mov    d,m        ; get high address.
  632.                 ; note high low reversed for memory seg size.
  633.     mvi    e,0        ; force to 0.
  634.     xchg            ; put de into hl.
  635.     call    adout        ; output size.
  636.     xchg            ; get back hl.
  637.  
  638. ; add these functions later.
  639.     inx    h        ; increment past attrabute.
  640.     inx    h        ; increment past segment times.
  641.  
  642.     push    h        ; save it.
  643.  
  644.     lxi    d,msg23        ; output a few spaces.
  645.     mvi    c,strout    ; print it.
  646.     call    bdos
  647.  
  648.     pop    h        ; get it back.
  649.     mov    a,m        ; get bnk number.
  650.     push    h        ; save it again.
  651.     call    heout        ; go print hex output.
  652.     call    crlf        ; do cr,lf
  653.     pop    h        ; restore pointer.
  654.  
  655.     jmp    memore        ; do till done.
  656.  
  657. dobyte:
  658.     mov    a,m        ; note, this uses nibbles for time.
  659.     ani    0f0h        ; drop lower nibble.
  660.     rar            ; do four.
  661.     rar            ; 
  662.     rar            ; 
  663.     rar            ; now have in lower nibble, time tens.
  664.     adi    30h        ; add ascii offset.
  665.     call    cout        ; go print it.
  666.     mov    a,m        ; get byte again.
  667.     ani    0fh        ; drop upper nibble.
  668.     adi    30h        ; add ascii offset, time units.
  669.     call    cout        ; go print it.
  670.     ret            ; done.
  671.  
  672. offset:
  673.     push    d
  674.     mvi    c,sysdat    ; get system data address.
  675.     call    bdos        ; comes back in hl.
  676.     pop    d
  677.     dad    d        ; hl now pointing area in system data
  678.                 ; for location pointed to by the d&e.
  679.     mov    a,m        ; has how many memory segments their are in
  680.     ret            ; done here.
  681.  
  682. ; This section allows for future expantion of the MP/M II info at the
  683. ; data page address.
  684.  
  685. numrecd:
  686.     lxi    d,msg47        ; go print MP/M.SYS records.
  687.     mvi    c,strout    ; string output function.
  688.     call    bdos        ; do it.
  689.     lxi    d,79h        ; increment
  690.     call    offset        ; dad the d wth the h&l.
  691.     call    heout        ; go print it in hex format.
  692.     dcx    h        ; one less low-order byte.
  693.     mov    a,m        ; get it.
  694.     call    heout        ; print it.
  695.     call    crlf        ; cr lf printed.
  696.  
  697.     lxi    d,msg48        ; ticks/sec.
  698.     mvi    c,strout    ; string output function.
  699.     call    bdos        ; do it.
  700.     lxi    d,7ah        ; increment
  701.     call    offset        ; dad the d wth the h&l.
  702.     call    heout        ; go print it in hex format.
  703.     call    crlf        ; print cr,lf.
  704.  
  705.     lxi    d,msg49        ; system drive.
  706.     mvi    c,strout    ; string output function.
  707.     call    bdos        ; do it.
  708.     lxi    d,7bh        ; increment
  709.     call    offset        ; dad the d wth the h&l.
  710.     adi    40h        ; add ascii offset for drive indicator.
  711.     call    cout        ; go print it.
  712.     call    crlf        ; print cr,lf.
  713.  
  714.     lxi    d,msg50        ; go print the Common memory.
  715.     mvi    c,strout    ; string output function.
  716.     call    bdos        ; do it.
  717.     lxi    d,7ch        ; increment
  718.     call    offset        ; dad the d wth the h&l.
  719.     call    heout        ; go print it in hex format.
  720.     mvi    a,0        ; force to zer0.
  721.     call    heout        ; go print it in hex format.
  722.     call    crlf        ; do cr,lf.
  723.  
  724.     lxi    d,msg51        ; #RSP's.
  725.     mvi    c,strout    ; string output function.
  726.     call    bdos        ; do it.
  727.     lxi    d,7dh        ; increment
  728.     call    offset        ; dad the d wth the h&l.
  729.     adi    30h        ; add ascii offset.
  730.     call    cout        ; go print it.
  731.     call    crlf        ; print cr,lf.
  732.  
  733.     lxi    d,msg52        ; go print the listcp array.
  734.     mvi    c,strout    ; string output function.
  735.     call    bdos        ; do it.
  736.     lxi    d,7fh        ; increment
  737.     call    offset        ; dad the d wth the h&l.
  738.     call    heout        ; go print it in hex format.
  739.     dcx    h        ; decement.
  740.     mov    a,m        ; get low-order byte.
  741.     call    heout        ; go print it in hex format.
  742.     call    crlf        ; do cr,lf.
  743.  
  744.     lxi    d,msg53        ; max locked records.
  745.     mvi    c,strout    ; string output function.
  746.     call    bdos        ; do it.
  747.     lxi    d,0bbh        ; increment
  748.     call    offset        ; dad the d wth the h&l.
  749.     call    heout        ; go print it in hex format.
  750.     call    crlf        ; print cr,lf.
  751.  
  752.     lxi    d,msg54        ; max opened files.
  753.     mvi    c,strout    ; string output function.
  754.     call    bdos        ; do it.
  755.     lxi    d,0bch        ; increment
  756.     call    offset        ; dad the d wth the h&l.
  757.     call    heout        ; go print it in hex format.
  758.     call    crlf        ; print cr,lf.
  759.  
  760.     lxi    d,msg55        ; # list items.
  761.     mvi    c,strout    ; string output function.
  762.     call    bdos        ; do it.
  763.     lxi    d,0beh        ; increment
  764.     call    offset        ; dad the d wth the h&l.
  765.     call    heout        ; go print it in hex format.
  766.     dcx    h        ; decement.
  767.     mov    a,m        ; get low-order byte.
  768.     call    heout        ; go print it in hex format.
  769.     call    crlf        ; do cr,lf.
  770.  
  771.     lxi    d,msg56        ; system locked records.
  772.     mvi    c,strout    ; string output function.
  773.     call    bdos        ; do it.
  774.     lxi    d,0c1h        ; increment
  775.     call    offset        ; dad the d wth the h&l.
  776.     call    heout        ; go print it in hex format.
  777.     call    crlf        ; print cr,lf.
  778.  
  779.     lxi    d,msg57        ; system opened files.
  780.     mvi    c,strout    ; string output function.
  781.     call    bdos        ; do it.
  782.     lxi    d,0c2h        ; increment
  783.     call    offset        ; dad the d wth the h&l.
  784.     call    heout        ; go print it in hex format.
  785.     call    crlf        ; print cr,lf.
  786.  
  787.     lxi    d,msg58        ; go print dayfile.
  788.     mvi    c,strout    ; string output function.
  789.     call    bdos        ; do it.
  790.     lxi    d,0c3h        ; increment to dayfile active/nonactive.
  791.     call    offset        ; dad the d wth the h&l.    ani    0ffh        ; see if boolean non zero if banked switched.
  792.     jnz    dactive        ; go do active message.
  793.     lxi    d,msg59        ; go print the dayfile is inactive.
  794.     mvi    c,strout    ; string output function.
  795.     call    bdos        ; do it.
  796.     call    crlf        ; do cr,lf.
  797.  
  798. dactive:
  799.     lxi    d,msg60        ; go print the dayfile is active.
  800.     mvi    c,strout    ; string output function.
  801.     call    bdos        ; do it.
  802.     call    crlf        ; do cr,lf.
  803.  
  804.     lxi    d,msg61        ; temporary drive.
  805.     mvi    c,strout    ; string output function.
  806.     call    bdos        ; do it.
  807.     lxi    d,0c4h        ; increment
  808.     call    offset        ; dad the d wth the h&l.
  809.     adi    40h        ; add ascii offset for drive indicator.
  810.     call    cout        ; go print it.
  811.     call    crlf        ; print cr,lf.
  812.  
  813.     lxi    d,msg62        ; # of list devices.
  814.     mvi    c,strout    ; string output function.
  815.     call    bdos        ; do it.
  816.     lxi    d,0c5h        ; increment
  817.     call    offset        ; dad the d wth the h&l.
  818.     adi    30h        ; add ascii offset.
  819.     call    cout        ; go print it.
  820.     call    crlf        ; print cr,lf.
  821.  
  822.     lxi    d,msg63        ; go print the XDOS base page.
  823.     mvi    c,strout    ; string output function.
  824.     call    bdos        ; do it.
  825.     lxi    d,0f2h        ; increment
  826.     call    offset        ; dad the d wth the h&l.
  827.      call    heout        ; go print it in hex format.
  828.     mvi    a,0        ; force to zer0.
  829.     call    heout        ; go print it in hex format.
  830.     call    crlf        ; do cr,lf.
  831.  
  832.     lxi    d,msg64        ; go print the TMP base page.
  833.     mvi    c,strout    ; string output function.
  834.     call    bdos        ; do it.
  835.     lxi    d,0f3h        ; increment
  836.     call    offset        ; dad the d wth the h&l.
  837.     call    heout        ; go print it in hex format.
  838.     mvi    a,0        ; force to zer0.
  839.     call    heout        ; go print it in hex format.
  840.     call    crlf        ; do cr,lf.
  841.  
  842.     lxi    d,msg65        ; go print the console.dat base.
  843.     mvi    c,strout    ; string output function.
  844.     call    bdos        ; do it.
  845.     lxi    d,0f4h        ; increment
  846.     call    offset        ; dad the d wth the h&l.
  847.     call    heout        ; go print it in hex format.
  848.     mvi    a,0        ; force to zer0.
  849.     call    heout        ; go print it in hex format.
  850.     call    crlf        ; do cr,lf.
  851.  
  852.     lxi    d,msg66        ; BDOS / XDOS entry point.
  853.     mvi    c,strout    ; string output function.
  854.     call    bdos        ; do it.
  855.     lxi    d,0f6h        ; increment
  856.     call    offset        ; dad the d wth the h&l.
  857.     call    heout        ; go print it in hex format.
  858.     dcx    h        ; decement.
  859.     mov    a,m        ; get low-order byte.
  860.     call    heout        ; go print it in hex format.
  861.     call    crlf        ; do cr,lf.
  862.  
  863.     lxi    d,msg67        ; TMP.spr base page.
  864.     mvi    c,strout    ; string output function.
  865.     call    bdos        ; do it.
  866.     lxi    d,0f7h        ; increment
  867.     call    offset        ; dad the d wth the h&l.
  868.     call    heout        ; go print it in hex format.
  869.     mvi    a,0        ; force to zer0.
  870.     call    heout        ; go print it in hex format.
  871.     call    crlf        ; do cr,lf.
  872.  
  873.     lxi    d,msg68        ; number of banked RSP's.
  874.     mvi    c,strout    ; string output function.
  875.     call    bdos        ; do it.
  876.     lxi    d,0f8h        ; increment
  877.     call    offset        ; dad the d wth the h&l.
  878.     call    heout        ; go print it in hex format.
  879.     mvi    a,0        ; force to zer0.
  880.     call    heout        ; go print it in hex format.
  881.     call    crlf        ; do cr,lf.
  882.  
  883.     lxi    d,msg69        ; XDOS internal data segment address.
  884.     mvi    c,strout    ; string output function.
  885.     call    bdos        ; do it.
  886.     lxi    d,0fch        ; increment
  887.     call    offset        ; dad the d wth the h&l.
  888.     call    heout        ; go print it in hex format.
  889.     dcx    h        ; decement.
  890.     mov    a,m        ; get low-order byte.
  891.     call    heout        ; go print it in hex format.
  892.     call    crlf        ; do cr,lf.
  893.  
  894. ; Determine which drive is the current drive in
  895. ; use, and print the result
  896.  
  897. drvchk:
  898.     LXI    D,MSG18
  899.     MVI    C,STROUT
  900.     CALL    BDOS
  901.     MVI    C,CURDRV
  902.     CALL    BDOS
  903.     ADI    41H
  904.     STA    CDRV
  905.     CALL    COUT
  906.     MVI    A,':'
  907.     CALL    COUT
  908.     CALL    CRLF
  909.  
  910. ; Determine Allocation address of current drive, and print it
  911.  
  912.     lda    mpmbyte        ; see if MP/M.
  913.     ora    a        ; none zero if so.
  914.     jnz    mpmcurt        ; do MP/M current allocation.
  915.  
  916.     lda    cpmbyte
  917.     ani    0f0h        ; see if 1.x version.
  918.     jz    rport        ; go to do the i/o ports, if not 2.x CP/M.
  919.  
  920. mpmcurt:
  921.     LXI    D,MSG5
  922.     MVI    C,STROUT
  923.     CALL    BDOS
  924.     LDA    CDRV
  925.     CALL    COUT
  926.     LXI    D,MSG6
  927.     MVI    C,STROUT
  928.     CALL    BDOS
  929.     LHLD    ALLOCAD
  930.     CALL    ADOUT
  931.     MVI    A,48H
  932.     CALL    COUT
  933.     CALL    CRLF
  934.  
  935. ; Find out which drives are logged in and print them
  936.  
  937.     MVI    C,LOGIN
  938.     CALL    BDOS
  939.     ANI    0FH
  940.     STA    VECTOR
  941.     LXI    D,MSG4
  942.     MVI    C,STROUT
  943.     CALL    BDOS
  944.     LDA    VECTOR
  945.     RRC
  946.     STA    VECTOR
  947.     LXI    D,MSG7
  948.     MVI    C,STROUT
  949.     CC    BDOS
  950.     LDA    VECTOR
  951.     RRC
  952.     STA    VECTOR
  953.     LXI    D,MSG8
  954.     MVI    C,STROUT
  955.     CC    BDOS
  956.     LDA    VECTOR
  957.     RRC
  958.     STA    VECTOR
  959.     LXI    D,MSG9
  960.     MVI    C,STROUT
  961.     CC    BDOS
  962.     LDA    VECTOR
  963.     RRC
  964.     LXI    D,MSG10
  965.     MVI    C,STROUT
  966.     CC    BDOS
  967.     CALL    CRLF
  968.  
  969. ; Find and show the read only vectors
  970.  
  971.     MVI    C,RONLY
  972.     CALL    BDOS
  973.     ANI    0FH
  974.     STA    VECTOR
  975.     LXI    D,MSG14
  976.     MVI    C,STROUT
  977.     CALL    BDOS
  978.     LDA    VECTOR
  979.     ORA    A
  980.     LXI    D,MSG17
  981.     MVI    C,STROUT
  982.     CZ    BDOS
  983.     LDA    VECTOR
  984.     RRC
  985.     STA    VECTOR
  986.     LXI    D,MSG7
  987.     MVI    C,STROUT
  988.     CC    BDOS
  989.     LDA    VECTOR
  990.     RRC
  991.     STA    VECTOR
  992.     LXI    D,MSG8
  993.     MVI    C,STROUT
  994.     CC    BDOS
  995.     LDA    VECTOR
  996.     RRC
  997.     STA    VECTOR
  998.     LXI    D,MSG9
  999.     MVI    C,STROUT
  1000.     CC    BDOS
  1001.     LDA    VECTOR
  1002.     RRC
  1003.     LXI    D,MSG10
  1004.     MVI    C,STROUT
  1005.     CC    BDOS
  1006.     CALL    CRLF
  1007.  
  1008. ; Get the disk parameter block and display it
  1009.  
  1010.     LXI    D,MSG12
  1011.     MVI    C,STROUT
  1012.     CALL    BDOS
  1013.     MVI    C,DPARA
  1014.     CALL    BDOS
  1015.     CALL    ADOUT
  1016.     MVI    A,48H
  1017.     CALL    COUT
  1018.     CALL    CRLF
  1019.  
  1020. ; Determine the present USER, and print the result
  1021.  
  1022.     LXI    D,MSG19
  1023.     MVI    C,STROUT
  1024.     CALL    BDOS
  1025.     MVI    E,0FFH
  1026.     MVI    C,PRUSER
  1027.     CALL    BDOS
  1028.     CALL    HEOUT
  1029.     MVI    A,48H
  1030.     CALL    COUT
  1031.     CALL    CRLF
  1032.  
  1033. ; Check all ports (0-255), and determine if they
  1034. ; are active. If they are, print the port number
  1035. ; and then do a warm boot (control C)
  1036.  
  1037. ; BE ADVISED!!
  1038.  
  1039. ; The lable PORT1 gets a byte from storage from a
  1040. ; lable called BYTE. This value is incremented from
  1041. ; 0-255 and then is written to the second byte from
  1042. ; the lable PORT2. What I'm saying is that this
  1043. ; portion of code is SELF MODIFYING!!
  1044.  
  1045. rport:
  1046.     LXI    D,MSG16
  1047.     MVI    C,STROUT
  1048.     CALL    BDOS
  1049.     lda    porta
  1050.     sta    aport+1
  1051.     lda    portb
  1052.     sta    bport+1
  1053.  
  1054. PORT1:
  1055.     LDA    BYTE
  1056.     STA    PORT3+1
  1057.  
  1058. aport:
  1059.     cpi    0    ; original code had a d0 or something
  1060.     jm    port3
  1061. bport:
  1062.     cpi    0
  1063.     jm    port2
  1064.     jmp    port3
  1065.  
  1066. port2:
  1067.     call    portout
  1068.     jmp    port4
  1069.  
  1070. port3:
  1071.     IN    0
  1072.     CPI    0FFH
  1073.     CNZ    PORTOUT
  1074.  
  1075.     lda    byte
  1076.     cpi    0ffh
  1077.     jz    finish
  1078.  
  1079. port4:
  1080.     LDA    BYTE
  1081.     INR    A
  1082.     STA    BYTE
  1083.     JMP    PORT1
  1084.  
  1085. finish:
  1086.     LHLD    OLDSP
  1087.     SPHL
  1088.     RET
  1089.  
  1090. PORTOUT:
  1091.     LDA    BYTE
  1092.     CALL    HEOUT
  1093.     CALL    SPACE
  1094.     RET
  1095.  
  1096. COUT:                ; Character output
  1097.     PUSH    B
  1098.     PUSH    D
  1099.     PUSH    H
  1100.     MOV    E,A
  1101.     MVI    C,CONOUT
  1102.     CALL    BDOS
  1103.     POP    H
  1104.     POP    D
  1105.     POP    B
  1106.     RET
  1107.  
  1108. ; The following routine will print the value of
  1109. ; HL to the console. If entered at HEOUT, it will
  1110. ; only print the value of the A register
  1111.  
  1112. ADOUT:                ; Output HL to console
  1113.     MOV    A,H        ; H is first
  1114.     CALL    HEOUT
  1115.     MOV    A,L        ; L is next
  1116. HEOUT:
  1117.     MOV    C,A        ; Save it
  1118.     RRC
  1119.     RRC
  1120.     RRC
  1121.     RRC
  1122.     CALL    HEOUT1        ; Put it out
  1123.     MOV    A,C        ; Get it back
  1124.  
  1125. HEOUT1:
  1126.     ANI    0FH
  1127.     ADI    48
  1128.     CPI    58        ; 0-9?
  1129.     JC    OUTCH
  1130.     ADI    7        ; Make it a letter
  1131.  
  1132. OUTCH:
  1133.     CALL    COUT
  1134.     RET
  1135.  
  1136. CLEAR:                ; Clear console
  1137.     mvi    c,25
  1138.     MVI    A,0DH        ; C/R
  1139.     CALL    COUT
  1140.  
  1141. CLEAR1:
  1142.     MVI    A,0AH        ; Linefeed
  1143.     CALL    COUT
  1144.     DCR    C
  1145.     JNZ    CLEAR1        ; Loop for 25 LF
  1146.     RET
  1147.  
  1148. CRLF:                ; Send C/R, LF
  1149.     MVI    A,0DH
  1150.     CALL    COUT
  1151.     MVI    A,0AH
  1152.     CALL    COUT
  1153.     RET
  1154.  
  1155. SPACE:
  1156.     MVI    A,20H
  1157.     CALL    COUT
  1158.     RET
  1159.  
  1160. ; PROGRAM MESSAGES
  1161.  
  1162. MSG0:    db    'Status report CP/M version $'
  1163. MSG1    DB    '    M=RAM memory           R=ROM memory'
  1164.     DB    '          .=no memory',0DH,0AH
  1165.     DB    '0   1   2   3   4   5   6   7   8   9'
  1166.     DB    '   A   B   C   D   E   F'
  1167.     DB    0DH,0AH,'$'
  1168. MSG2    DB    'CCP starts at $'
  1169. MSG3    DB    'BDOS starts at $'
  1170. MSG4    DB    'Current logged in drives;  $'
  1171. MSG5    DB    'The Allocation address of drive $'
  1172. MSG6    DB    ': is $'
  1173. MSG7    DB    'A$'
  1174. MSG8    DB    ', B$'
  1175. MSG9    DB    ', C$'
  1176. MSG10    DB    ', D$'
  1177. MSG11    DB    ' bytes$'
  1178. MSG12    DB    'The address of the disk '
  1179.     DB    'parameter block is $'
  1180. MSG13    DB    'Available TPA without '
  1181.     DB    'killing the CCP is $'
  1182. MSG14    DB    'These drives are vectored'
  1183.     DB    ' as read only;  $'
  1184. MSG15    DB    'BIOS starts at $'
  1185. MSG16    DB    'Active I/O ports: $'
  1186. MSG17    DB    'None$'
  1187. MSG18    DB    'Current drive in use is $'
  1188. MSG19    DB    'The present USER number is $'
  1189. msg20:    db    'XIOS jmp table starts at $'
  1190. msg21:    db    'Memory segments are $'
  1191. msg22:    db    'base         size        bank $'
  1192. msg23:    db    '         $'
  1193. msg25:    db    'Your console number is $'
  1194. msg26:    db    'The system time of day is $'
  1195. MSG24:    db    'Status report for the P.H.O.T.U.S.'
  1196.     db    ' system - MP/M version $'
  1197. msg27:    db    ' system',0dh,0ah
  1198.     db    '              - Program Version 1.8'
  1199.         ; version as of (05-Jan-84)
  1200.     DB    0DH,0AH,0AH,'$'
  1201. msg28:    db    'The number of consoles supported in this system is $'
  1202. msg29:    db    'Restart number is #$'
  1203. msg30:    db    'CPU is a $'
  1204. msg31:    db    '8080$'
  1205. msg32:    db    'Z-80$'
  1206. msg33:    db    'There is Banked switched memory$'
  1207. msg35:    db    'Bdos resident page is active$'
  1208. msg36:    db    'CP/Net is $'
  1209. msg37:    db    'Inactive$'
  1210. msg38:    db    'Active$'
  1211. msg39:    db    'Xdos starts at $'
  1212. msg40:    db    'RSP base page is at $'
  1213. msg41:    db    'The banked Xios base page is at $'
  1214. msg42:    db    'The banked Bdos base page is at $'
  1215. msg43:    db    'The RESident BDOS base page is at $'
  1216. msg44:    db    'Console number $'
  1217. msg45:    db    ' has $'
  1218. msg46:    db    ' nulls$'
  1219. msg47:    db    'Number of records in MP/M.SYS file: $'
  1220. msg48:    db    'System number of ticks/second: $'
  1221. msg49:    db    'System drive is $'
  1222. msg50:    db    'Common memory base page is at $'
  1223. msg51:    db    'Number of RSPs is $'
  1224. msg52:    db    'Listcp array address $'
  1225. msg53:    db    'Maximun number of locked records per process $'
  1226. msg54:    db    'Maximun number of opened files per process $'
  1227. msg55:    db    'Number of list items $'
  1228. msg56:    db    'Total of system locked records $'
  1229. msg57:    db    'Total of system opened files $'
  1230. msg58:    db    'Day file logging is $'
  1231. msg59:    db    'Inactive$'
  1232. msg60:    db    'Active$'
  1233. msg61:    db    'Temporary file drive is $'
  1234. msg62:    db    'The number of list devices supported in this system is $'
  1235. msg63:    db    'Banked XDOS base page starts at $'
  1236. msg64:    db    'TMP.spr process discriptor base $'
  1237. msg65:    db    'Console.dat base $'
  1238. msg66:    db    'BDOS / XDOS entry address is at $'
  1239. msg67:    db    'TMP.spr base is $'
  1240. msg68:    db    'Number of banked RSPs $'
  1241. msg69:    db    'XDOS internal data segment address $'
  1242.  
  1243. msg99:    db    'BSR controller is $'
  1244.  
  1245.     DS    80h        ; Set up a stack area
  1246. STACK    EQU    $
  1247.  
  1248. BEDOS    DS    2
  1249. TPA    DS    2
  1250. CCP    DS    2
  1251. CONTLR    DS    1
  1252. OLDSP    DS    2
  1253. BYTE    DB    0
  1254. IOBYT    DS    1
  1255. VECTOR    DS    2
  1256. CDRV    DS    1
  1257. ALLOCAD    DS    2
  1258. mpmbyte    ds    1
  1259. cpmbyte    ds    1
  1260. time    ds    2
  1261. time1    ds    3
  1262. timeend    db    '$'
  1263. segcnt    db    0
  1264. csole    db    0
  1265. maxcon    db    0
  1266. exiospt    db    0
  1267.  
  1268. last:    db    0    ; for MP/M prl file.
  1269.  
  1270.     END
  1271.