home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol017 / status.asm < prev    next >
Assembly Source File  |  1984-04-29  |  7KB  |  420 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. ;This is an assembly language adaption of a program
  7. ;written in NorthStar BASIC called `STATUS'.
  8. ;
  9. ;This program will determine the location of numerous
  10. ;addresses, depending on the system size being run.
  11. ;It will also present various pieces of information
  12. ;concerning the status of many of the options available
  13. ;under CP/M 2.20, besides presenting a map of the memory
  14. ;of the host system.
  15. ;
  16. ;
  17. ;Set up the equates to use
  18. ;
  19. BDOS    EQU    5        ;I/O PATCHING
  20. CONOUT    EQU    2        ;CONSOLE CHAR OUT
  21. GIOBYTE    EQU    7        ;RETURNS I/O BYTE IN A
  22. STROUT    EQU    9        ;PRINT STRING OUTPUT
  23. LOGIN    EQU    24        ;RETURNS ON-LINE DRIVES
  24. CURDRV    EQU    25        ;RETURNS DEFAULT DRIVE#
  25. ALLOC    EQU    27        ;RETURNS ALLOCATION ADDRESS
  26. RONLY    EQU    29        ;RETURNS READ ONLY VECTOR
  27. DPARA    EQU    31        ;RETURNS DISK PARAMETER BLK
  28. PRUSER    EQU    32        ;RETURNS PRESENT USER
  29. ;
  30. ;
  31. BEGIN    ORG    100H        ;Start of TPA
  32.     JMP    START        ;Actual program start
  33.     DS    64        ;Set up a stack area
  34. STACK    EQU    $
  35. ;
  36. BEDOS    DS    2
  37. TPA    DS    2
  38. CCP    DS    2
  39. CONTLR    DS    1
  40. OLDSP    DS    2
  41. BYTE    DB    0
  42. IOBYT    DS    1
  43. VECTOR    DS    2
  44. CDRV    DS    1
  45. ALLOCAD    DS    2
  46. ;
  47. ;
  48. COUT:                ;Character output
  49.     PUSH    B
  50.     PUSH    D
  51.     PUSH    H
  52.     MOV    E,A
  53.     MVI    C,CONOUT
  54.     CALL    BDOS
  55.     POP    H
  56.     POP    D
  57.     POP    B
  58.     RET
  59. ;
  60. ;The following routine will print the value of
  61. ;HL to the console. If entered at HEOUT, it will
  62. ;only print the value of the A register
  63. ;
  64. ADOUT:                ;Output HL to console
  65.     MOV    A,H        ;H is first
  66.     CALL    HEOUT
  67.     MOV    A,L        ;L is next
  68. HEOUT    MOV    C,A        ;Save it
  69.     RRC
  70.     RRC
  71.     RRC
  72.     RRC
  73.     CALL    HEOUT1        ;Put it out
  74.     MOV    A,C        ;Get it back
  75. HEOUT1    ANI    0FH
  76.     ADI    48
  77.     CPI    58        ;0-9?
  78.     JC    OUTCH
  79.     ADI    7        ;Make it a letter
  80. OUTCH    CALL    COUT
  81.     RET
  82. ;
  83. CLEAR:                ;Clear console
  84.     MVI    C,25
  85.     MVI    A,0DH        ;C/R
  86.     CALL    COUT
  87. CLEAR1    MVI    A,0AH        ;Linefeed
  88.     CALL    COUT
  89.     DCR    C
  90.     JNZ    CLEAR1        ;Loop for 25 LF
  91.     RET
  92. ;
  93. ;
  94. CRLF:                ;Send C/R, LF
  95.     MVI    A,0DH
  96.     CALL    COUT
  97.     MVI    A,0AH
  98.     CALL    COUT
  99.     RET
  100. ;
  101. SPACE    MVI    A,20H
  102.     CALL    COUT
  103.     RET
  104. ;
  105. ;PROGRAM MESSAGES
  106. ;
  107. MSG0    DB    'STATUS report for CP/M 2.2      '
  108.     DB    '           Version 1.4 (6-27-80)'
  109.     DB    0DH,0AH,0AH,0AH,'$'
  110. MSG1    DB    '    M=RAM memory           R=ROM memory'
  111.     DB    '          .=no memory',0DH,0AH
  112.     DB    '0   1   2   3   4   5   6   7   8   9'
  113.     DB    '   A   B   C   D   E   F'
  114.     DB    0DH,0AH,'$'
  115. MSG2    DB    'CCP starts at $'
  116. MSG3    DB    'BDOS starts at $'
  117. MSG4    DB    'Current logged in drives;  $'
  118. MSG5    DB    'The Allocation address of drive $'
  119. MSG6    DB    ': is $'
  120. MSG7    DB    'A$'
  121. MSG8    DB    ', B$'
  122. MSG9    DB    ', C$'
  123. MSG10    DB    ', D$'
  124. MSG11    DB    ' bytes$'
  125. MSG12    DB    'The address of the disk '
  126.     DB    'parameter block is $'
  127. MSG13    DB    'Available TPA without '
  128.     DB    'killing the CCP is $'
  129. MSG14    DB    'These drives are vectored'
  130.     DB    ' as read only;  $'
  131. MSG15    DB    'BIOS starts at $'
  132. MSG16    DB    'Active I/O ports: $'
  133. MSG17    DB    'None$'
  134. MSG18    DB    'Current drive in use is $'
  135. MSG19    DB    'The present USER number is $'
  136. ;
  137. ;
  138. START:                ;Actual program start
  139.     LXI    H,0        ;Clear HL
  140.     DAD    SP        ;Get SP from CCP
  141.     SHLD    OLDSP        ;Save it
  142.     LXI    SP,STACK    ;Point to our stack
  143.     CALL    CLEAR
  144.     LXI    D,MSG0
  145.     MVI    C,STROUT
  146.     CALL    BDOS
  147.     LXI    D,MSG1
  148.     MVI    C,STROUT
  149.     CALL    BDOS
  150. ;
  151. ;This is the start of the memory map
  152. ;
  153.     LXI    H,0000H        ;Start memory map
  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. RAM    MOV    M,B        ;Replace original byte
  164.     MVI    B,4DH
  165.     JMP    SHWBY
  166. ROM    MVI    B,52H
  167.     JMP    SHWBY
  168. EMPTY    MVI    A,80H        ;Double check W/new value
  169.     MOV    B,M
  170.     MOV    M,A
  171.     MOV    A,M
  172.     CMP    B        ;Is it ram?
  173.     JNZ    RAM
  174.     MVI    B,2EH
  175. SHWBY    MOV    A,B
  176.     CALL    COUT        ;Output ROM, RAM, or empty
  177.     INR    H
  178.     INR    H
  179.     INR    H
  180.     INR    H
  181.     JNZ    MEMORY        ;Loop till done
  182.     CALL    CRLF
  183.     CALL    CRLF
  184. ;
  185. ;Now we fill in the storage bytes with the proper
  186. ;values which are dependent on each particular system.
  187. ;
  188.     LHLD    BDOS+1        ;Get start of BDOS
  189.     MOV    A,L
  190.     SUI    6
  191.     MOV    L,A
  192.     SHLD    BEDOS        ;Store it
  193.     LXI    D,0F700H
  194.     LHLD    BEDOS
  195.     DAD    D        ;Add wrap around offset
  196.     SHLD    TPA
  197.     LXI    D,100H
  198.     LHLD    TPA
  199.     DAD    D
  200.     SHLD    CCP        ;Store CCP=-100H of TPA
  201.     MVI    C,GIOBYTE
  202.     CALL    BDOS
  203.     STA    IOBYT        ;Store the I/O byte
  204.     MVI    C,ALLOC
  205.     CALL    BDOS
  206.     SHLD    ALLOCAD
  207. ;
  208. ;Now we must output the gathered information
  209. ;to the console
  210. ;
  211. ;Get the CCP address and print it
  212. ;
  213.     LXI    D,MSG2
  214.     MVI    C,STROUT
  215.     CALL    BDOS
  216.     LHLD    CCP
  217.     CALL    ADOUT
  218.     CALL    CRLF
  219. ;
  220. ;Next get the BDOS address and print it
  221. ;
  222.     LXI    D,MSG3
  223.     MVI    C,STROUT
  224.     CALL    BDOS
  225.     LHLD    BEDOS
  226.     CALL    ADOUT
  227.     CALL    CRLF
  228. ;
  229. ;Next get address of BIOS and print it
  230. ;
  231.     LXI    D,MSG15
  232.     MVI    C,STROUT
  233.     CALL    BDOS
  234.     LXI    D,0E00H
  235.     LHLD    BEDOS
  236.     DAD    D
  237.     CALL    ADOUT
  238.     CALL    CRLF
  239. ;
  240. ;Compute TPA without killing CCP and print it
  241. ;
  242.     LXI    D,MSG13
  243.     MVI    C,STROUT
  244.     CALL    BDOS
  245.     LHLD    TPA
  246.     CALL    ADOUT
  247.     LXI    D,MSG11
  248.     MVI    C,STROUT
  249.     CALL    BDOS
  250.     CALL    CRLF
  251. ;
  252. ;Determine which drive is the current drive in
  253. ;use, and print the result
  254. ;
  255.     LXI    D,MSG18
  256.     MVI    C,STROUT
  257.     CALL    BDOS
  258.     MVI    C,CURDRV
  259.     CALL    BDOS
  260.     ADI    41H
  261.     STA    CDRV
  262.     CALL    COUT
  263.     MVI    A,':'
  264.     CALL    COUT
  265.     CALL    CRLF
  266. ;
  267. ;Determine Allocation address of current drive, and print it
  268. ;
  269.     LXI    D,MSG5
  270.     MVI    C,STROUT
  271.     CALL    BDOS
  272.     LDA    CDRV
  273.     CALL    COUT
  274.     LXI    D,MSG6
  275.     MVI    C,STROUT
  276.     CALL    BDOS
  277.     LHLD    ALLOCAD
  278.     CALL    ADOUT
  279.     MVI    A,48H
  280.     CALL    COUT
  281.     CALL    CRLF
  282. ;
  283. ;Find out which drives are logged in and print them
  284. ;
  285.     MVI    C,LOGIN
  286.     CALL    BDOS
  287.     ANI    0FH
  288.     STA    VECTOR
  289.     LXI    D,MSG4
  290.     MVI    C,STROUT
  291.     CALL    BDOS
  292.     LDA    VECTOR
  293.     RRC
  294.     STA    VECTOR
  295.     LXI    D,MSG7
  296.     MVI    C,STROUT
  297.     CC    BDOS
  298.     LDA    VECTOR
  299.     RRC
  300.     STA    VECTOR
  301.     LXI    D,MSG8
  302.     MVI    C,STROUT
  303.     CC    BDOS
  304.     LDA    VECTOR
  305.     RRC
  306.     STA    VECTOR
  307.     LXI    D,MSG9
  308.     MVI    C,STROUT
  309.     CC    BDOS
  310.     LDA    VECTOR
  311.     RRC
  312.     LXI    D,MSG10
  313.     MVI    C,STROUT
  314.     CC    BDOS
  315.     CALL    CRLF
  316. ;
  317. ;Find and show the read only vectors
  318. ;
  319.     MVI    C,RONLY
  320.     CALL    BDOS
  321.     ANI    0FH
  322.     STA    VECTOR
  323.     LXI    D,MSG14
  324.     MVI    C,STROUT
  325.     CALL    BDOS
  326.     LDA    VECTOR
  327.     ORA    A
  328.     LXI    D,MSG17
  329.     MVI    C,STROUT
  330.     CZ    BDOS
  331.     LDA    VECTOR
  332.     RRC
  333.     STA    VECTOR
  334.     LXI    D,MSG7
  335.     MVI    C,STROUT
  336.     CC    BDOS
  337.     LDA    VECTOR
  338.     RRC
  339.     STA    VECTOR
  340.     LXI    D,MSG8
  341.     MVI    C,STROUT
  342.     CC    BDOS
  343.     LDA    VECTOR
  344.     RRC
  345.     STA    VECTOR
  346.     LXI    D,MSG9
  347.     MVI    C,STROUT
  348.     CC    BDOS
  349.     LDA    VECTOR
  350.     RRC
  351.     LXI    D,MSG10
  352.     MVI    C,STROUT
  353.     CC    BDOS
  354.     CALL    CRLF
  355. ;
  356. ;Get the disk parameter block and display it
  357. ;
  358.     LXI    D,MSG12
  359.     MVI    C,STROUT
  360.     CALL    BDOS
  361.     MVI    C,DPARA
  362.     CALL    BDOS
  363.     CALL    ADOUT
  364.     MVI    A,48H
  365.     CALL    COUT
  366.     CALL    CRLF
  367. ;
  368. ;Determine the present USER, and print the result
  369. ;
  370.     LXI    D,MSG19
  371.     MVI    C,STROUT
  372.     CALL    BDOS
  373.     MVI    E,0FFH
  374.     MVI    C,PRUSER
  375.     CALL    BDOS
  376.     CALL    HEOUT
  377.     MVI    A,48H
  378.     CALL    COUT
  379.     CALL    CRLF
  380. ;
  381. ;Check all ports (0-255), and determine if they
  382. ;are active. If they are, print the port number
  383. ;and then do a warm boot (control C)
  384. ;
  385. ;BE ADVISED!!
  386. ;The lable PORT1 gets a byte from storage from a
  387. ;lable called BYTE. This value is incremented from
  388. ;0-255 and then is written to the second byte from
  389. ;the lable PORT2. What I'm saying is that this
  390. ;portion of code is SELF MODIFYING!!
  391. ;
  392.     LXI    D,MSG16
  393.     MVI    C,STROUT
  394.     CALL    BDOS
  395. PORT1    LDA    BYTE
  396.     STA    PORT2+1
  397. PORT2    IN    0
  398.     CPI    0FFH
  399.     CNZ    PORTOUT
  400.     LDA    BYTE
  401.     CPI    0E0H
  402.     JZ    FINISH
  403.     LDA    BYTE
  404.     INR    A
  405.     STA    BYTE
  406.     JMP    PORT1
  407. FINISH    CALL    CRLF
  408.     CALL    CRLF
  409.     CALL    CRLF
  410.     LHLD    OLDSP
  411.     SPHL
  412.     RET
  413. PORTOUT    LDA    BYTE
  414.     CALL    HEOUT
  415.     CALL    SPACE
  416.     RET
  417.  
  418.  
  419.  
  420.