home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
simtel
/
sigm
/
vols000
/
vol017
/
status.asm
< prev
next >
Wrap
Assembly Source File
|
1984-04-29
|
7KB
|
420 lines
;Lauren Guimont 1-25-80 Ver. 1.0
; 1-28-80 Ver. 1.1
; 3-20-80 Ver. 1.2
; 6-26-80 Ver. 1.3
;
;This is an assembly language adaption of a program
;written in NorthStar BASIC called `STATUS'.
;
;This program will determine the location of numerous
;addresses, depending on the system size being run.
;It will also present various pieces of information
;concerning the status of many of the options available
;under CP/M 2.20, besides presenting a map of the memory
;of the host system.
;
;
;Set up the equates to use
;
BDOS EQU 5 ;I/O PATCHING
CONOUT EQU 2 ;CONSOLE CHAR OUT
GIOBYTE EQU 7 ;RETURNS I/O BYTE IN A
STROUT EQU 9 ;PRINT STRING OUTPUT
LOGIN EQU 24 ;RETURNS ON-LINE DRIVES
CURDRV EQU 25 ;RETURNS DEFAULT DRIVE#
ALLOC EQU 27 ;RETURNS ALLOCATION ADDRESS
RONLY EQU 29 ;RETURNS READ ONLY VECTOR
DPARA EQU 31 ;RETURNS DISK PARAMETER BLK
PRUSER EQU 32 ;RETURNS PRESENT USER
;
;
BEGIN ORG 100H ;Start of TPA
JMP START ;Actual program start
DS 64 ;Set up a stack area
STACK EQU $
;
BEDOS DS 2
TPA DS 2
CCP DS 2
CONTLR DS 1
OLDSP DS 2
BYTE DB 0
IOBYT DS 1
VECTOR DS 2
CDRV DS 1
ALLOCAD DS 2
;
;
COUT: ;Character output
PUSH B
PUSH D
PUSH H
MOV E,A
MVI C,CONOUT
CALL BDOS
POP H
POP D
POP B
RET
;
;The following routine will print the value of
;HL to the console. If entered at HEOUT, it will
;only print the value of the A register
;
ADOUT: ;Output HL to console
MOV A,H ;H is first
CALL HEOUT
MOV A,L ;L is next
HEOUT MOV C,A ;Save it
RRC
RRC
RRC
RRC
CALL HEOUT1 ;Put it out
MOV A,C ;Get it back
HEOUT1 ANI 0FH
ADI 48
CPI 58 ;0-9?
JC OUTCH
ADI 7 ;Make it a letter
OUTCH CALL COUT
RET
;
CLEAR: ;Clear console
MVI C,25
MVI A,0DH ;C/R
CALL COUT
CLEAR1 MVI A,0AH ;Linefeed
CALL COUT
DCR C
JNZ CLEAR1 ;Loop for 25 LF
RET
;
;
CRLF: ;Send C/R, LF
MVI A,0DH
CALL COUT
MVI A,0AH
CALL COUT
RET
;
SPACE MVI A,20H
CALL COUT
RET
;
;PROGRAM MESSAGES
;
MSG0 DB 'STATUS report for CP/M 2.2 '
DB ' Version 1.4 (6-27-80)'
DB 0DH,0AH,0AH,0AH,'$'
MSG1 DB ' M=RAM memory R=ROM memory'
DB ' .=no memory',0DH,0AH
DB '0 1 2 3 4 5 6 7 8 9'
DB ' A B C D E F'
DB 0DH,0AH,'$'
MSG2 DB 'CCP starts at $'
MSG3 DB 'BDOS starts at $'
MSG4 DB 'Current logged in drives; $'
MSG5 DB 'The Allocation address of drive $'
MSG6 DB ': is $'
MSG7 DB 'A$'
MSG8 DB ', B$'
MSG9 DB ', C$'
MSG10 DB ', D$'
MSG11 DB ' bytes$'
MSG12 DB 'The address of the disk '
DB 'parameter block is $'
MSG13 DB 'Available TPA without '
DB 'killing the CCP is $'
MSG14 DB 'These drives are vectored'
DB ' as read only; $'
MSG15 DB 'BIOS starts at $'
MSG16 DB 'Active I/O ports: $'
MSG17 DB 'None$'
MSG18 DB 'Current drive in use is $'
MSG19 DB 'The present USER number is $'
;
;
START: ;Actual program start
LXI H,0 ;Clear HL
DAD SP ;Get SP from CCP
SHLD OLDSP ;Save it
LXI SP,STACK ;Point to our stack
CALL CLEAR
LXI D,MSG0
MVI C,STROUT
CALL BDOS
LXI D,MSG1
MVI C,STROUT
CALL BDOS
;
;This is the start of the memory map
;
LXI H,0000H ;Start memory map
MEMORY:
MVI A,0FFH
CMP M ;Memory?
JZ EMPTY
MOV B,M ;Save memory value
MOV M,A
MOV A,M
CMP B ;Same as original?
JZ ROM
RAM MOV M,B ;Replace original byte
MVI B,4DH
JMP SHWBY
ROM MVI B,52H
JMP SHWBY
EMPTY MVI A,80H ;Double check W/new value
MOV B,M
MOV M,A
MOV A,M
CMP B ;Is it ram?
JNZ RAM
MVI B,2EH
SHWBY MOV A,B
CALL COUT ;Output ROM, RAM, or empty
INR H
INR H
INR H
INR H
JNZ MEMORY ;Loop till done
CALL CRLF
CALL CRLF
;
;Now we fill in the storage bytes with the proper
;values which are dependent on each particular system.
;
LHLD BDOS+1 ;Get start of BDOS
MOV A,L
SUI 6
MOV L,A
SHLD BEDOS ;Store it
LXI D,0F700H
LHLD BEDOS
DAD D ;Add wrap around offset
SHLD TPA
LXI D,100H
LHLD TPA
DAD D
SHLD CCP ;Store CCP=-100H of TPA
MVI C,GIOBYTE
CALL BDOS
STA IOBYT ;Store the I/O byte
MVI C,ALLOC
CALL BDOS
SHLD ALLOCAD
;
;Now we must output the gathered information
;to the console
;
;Get the CCP address and print it
;
LXI D,MSG2
MVI C,STROUT
CALL BDOS
LHLD CCP
CALL ADOUT
CALL CRLF
;
;Next get the BDOS address and print it
;
LXI D,MSG3
MVI C,STROUT
CALL BDOS
LHLD BEDOS
CALL ADOUT
CALL CRLF
;
;Next get address of BIOS and print it
;
LXI D,MSG15
MVI C,STROUT
CALL BDOS
LXI D,0E00H
LHLD BEDOS
DAD D
CALL ADOUT
CALL CRLF
;
;Compute TPA without killing CCP and print it
;
LXI D,MSG13
MVI C,STROUT
CALL BDOS
LHLD TPA
CALL ADOUT
LXI D,MSG11
MVI C,STROUT
CALL BDOS
CALL CRLF
;
;Determine which drive is the current drive in
;use, and print the result
;
LXI D,MSG18
MVI C,STROUT
CALL BDOS
MVI C,CURDRV
CALL BDOS
ADI 41H
STA CDRV
CALL COUT
MVI A,':'
CALL COUT
CALL CRLF
;
;Determine Allocation address of current drive, and print it
;
LXI D,MSG5
MVI C,STROUT
CALL BDOS
LDA CDRV
CALL COUT
LXI D,MSG6
MVI C,STROUT
CALL BDOS
LHLD ALLOCAD
CALL ADOUT
MVI A,48H
CALL COUT
CALL CRLF
;
;Find out which drives are logged in and print them
;
MVI C,LOGIN
CALL BDOS
ANI 0FH
STA VECTOR
LXI D,MSG4
MVI C,STROUT
CALL BDOS
LDA VECTOR
RRC
STA VECTOR
LXI D,MSG7
MVI C,STROUT
CC BDOS
LDA VECTOR
RRC
STA VECTOR
LXI D,MSG8
MVI C,STROUT
CC BDOS
LDA VECTOR
RRC
STA VECTOR
LXI D,MSG9
MVI C,STROUT
CC BDOS
LDA VECTOR
RRC
LXI D,MSG10
MVI C,STROUT
CC BDOS
CALL CRLF
;
;Find and show the read only vectors
;
MVI C,RONLY
CALL BDOS
ANI 0FH
STA VECTOR
LXI D,MSG14
MVI C,STROUT
CALL BDOS
LDA VECTOR
ORA A
LXI D,MSG17
MVI C,STROUT
CZ BDOS
LDA VECTOR
RRC
STA VECTOR
LXI D,MSG7
MVI C,STROUT
CC BDOS
LDA VECTOR
RRC
STA VECTOR
LXI D,MSG8
MVI C,STROUT
CC BDOS
LDA VECTOR
RRC
STA VECTOR
LXI D,MSG9
MVI C,STROUT
CC BDOS
LDA VECTOR
RRC
LXI D,MSG10
MVI C,STROUT
CC BDOS
CALL CRLF
;
;Get the disk parameter block and display it
;
LXI D,MSG12
MVI C,STROUT
CALL BDOS
MVI C,DPARA
CALL BDOS
CALL ADOUT
MVI A,48H
CALL COUT
CALL CRLF
;
;Determine the present USER, and print the result
;
LXI D,MSG19
MVI C,STROUT
CALL BDOS
MVI E,0FFH
MVI C,PRUSER
CALL BDOS
CALL HEOUT
MVI A,48H
CALL COUT
CALL CRLF
;
;Check all ports (0-255), and determine if they
;are active. If they are, print the port number
;and then do a warm boot (control C)
;
;BE ADVISED!!
;The lable PORT1 gets a byte from storage from a
;lable called BYTE. This value is incremented from
;0-255 and then is written to the second byte from
;the lable PORT2. What I'm saying is that this
;portion of code is SELF MODIFYING!!
;
LXI D,MSG16
MVI C,STROUT
CALL BDOS
PORT1 LDA BYTE
STA PORT2+1
PORT2 IN 0
CPI 0FFH
CNZ PORTOUT
LDA BYTE
CPI 0E0H
JZ FINISH
LDA BYTE
INR A
STA BYTE
JMP PORT1
FINISH CALL CRLF
CALL CRLF
CALL CRLF
LHLD OLDSP
SPHL
RET
PORTOUT LDA BYTE
CALL HEOUT
CALL SPACE
RET