home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
cpm
/
utils
/
sysutl
/
status18.asm
< prev
next >
Wrap
Assembly Source File
|
1994-07-13
|
31KB
|
1,271 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
; Benny D. Miller jr WB8LGH 05-Jan-84 ver. 1.8
; added MP/M II information.
; 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.
; 26-july-82 added ports(disk destructive read protect)
; at locations 103(low port) and 104(high port),
; or at 203,204 if PRL file. Actually bypasses these
; ports if set other than 0.
; 21-july-82 Status now gives the console(user's), and
; maximun consoles. Xios jump table, checks for
; CP/Net active/non-active, system time of day,
; displays all memory segments.
; Set up the equates to use
true equ 0ffffh ; true equate.
false equ not true ; false equate.
rmac equ true ; if assembled with rmac, and link.
hide equ true ; if hide disk ports, to stop destructive
; reads, also check porta, and portb equates.
if rmac
extrn bdos ; I/O call.
endif
if not rmac
bdos equ 5 ; bdos equate.
endif
ff equ 0ch ; form feed.
CONOUT EQU 2 ; CONSOLE CHAR OUT
giobyte equ 7 ; get the iobyte.
STROUT EQU 9 ; PRINT STRING OUTPUT
version equ 12 ; returns version.
mpmvrs equ 163 ; MP/M 2.x revision.
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
console equ 153 ; get console number.
sysdat equ 154 ; get system data address.
systod equ 155 ; get system time of day.
if not rmac
org 0100h
endif
start:
jmp astart
; port hide, so that a destructive read doesn't happen.
porta db 0c0h ; disk 1 start port address.
portb db 0c3h ; disk 1 last port address.
astart: ; 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
mvi c,version ; get CP/M, MP/M version.
call bdos ;
mov a,h ; see if MP/M.
sta mpmbyte ; save it.
mov a,l ; version number CP/M 1.x or 2.x.
sta cpmbyte ; save it.
CALL CLEAR
lda mpmbyte ; see if MP/M or CP/M.
ora a ; is MP/M if none zero.
jz cpm ; go do CP/M message if not.
lxi d,msg24 ; do MP/M message.
mvi c,strout ; print it command.
call bdos ; go print it.
lda cpmbyte ; get mpm version.
ani 0f6h ; if bit 1 set mpm 1. only.
lda mpmbyte ; re-get byte just in case.
jz contmpm ; do mp/m 1.1
mvi c,mpmvrs ; go see which MP/M.
call bdos ;
mov a,l ; save mp/m 2 revision level.
sta cpmbyte ; save it.
mov a,h ; get 1 for mpm 2
sta mpmbyte ; save new MP/M byte.
contmpm:
adi 31h ; add ascii offset.
call cout ; output first number.
mvi a,'.' ; now the seprator.
call cout ; out put it.
lda cpmbyte ; now the lower version number.
ani 0fh ; strip upper nibble.
adi 30h ; add ascii offset.
call cout ; go print it.
lxi d,msg27 ; trailing end of message.
mvi c,strout ; print command.
call bdos ; go print it.
call crlf ; go do cr,lf.
jmp bpcpm ; bypass CP/M message.
cpm:
LXI D,MSG0
MVI C,STROUT
CALL BDOS
lda cpmbyte ; get cpm version.
ani 0f0h ; strip upper nibble.
rar ; rotate right four times.
rar ;
rar ;
rar ;
adi 30h ; add ascii offset.
call cout ; output first number.
mvi a,'.' ; now the seprator.
call cout ; out put it.
lda cpmbyte ; now the lower version number.
ani 0fh ; strip upper nibble.
adi 30h ; add ascii offset.
call cout ; go print it.
lxi d,msg27 ; trailing end of message.
mvi c,strout ; print command.
call bdos ; go print it.
call crlf ; go do cr,lf.
bpcpm:
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
; Now we fill in the storage bytes with the proper
; values which are dependent on each particular system.
lda mpmbyte
ora a ; will be none zero for MP/M.
jnz alocxios ; do acllocation vectors.
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
alocxios:
lda mpmbyte ; see if MP/M.
ora a ; if not zero
jnz mpmaloc ; do MP/M allocation vectors.
lda cpmbyte
ani 0f0h ; see if 1.x version.
jz not2cpm ; go past if now 2.x CP/M.
mpmaloc:
MVI C,ALLOC
CALL BDOS
SHLD ALLOCAD
lda mpmbyte ; see if MP/M.
ora a ; if not zero
jnz conmax ; do maximun number of consoles.
; Now we must output the gathered information
; to the console
; Get the CCP address and print it
not2cpm:
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
jmp drvchk
; print the number of consoles supported.
conmax:
lxi d,msg28 ; go print message for number of consoles.
mvi c,strout ; string output function.
call bdos ; do it.
lxi d,1 ; increment to number of consoles.
call offset ; dad the d wth the h&l.
sta maxcon ; store at maximun number of consoles.
call heout ; go print it in hex format.
call crlf ; do cr,lf.
; do a system console number output.
syscon:
lxi d,msg25 ; point to message.
mvi c,strout ; print command.
call bdos ; print it.
mvi c,console ; get console number.
call bdos ; comes back in a.
adi 30h ; add ascii offset.
call cout ; go do it.
call crlf ; do cr,lf.
; see if extended information bytes at end of bnkxios jmp table.
extended:
lxi d,7 ; find xios jmp table address.
call offset ; dad the d wth the h&l.
mov h,m ; get base address of xios.
mvi l,0 ; always start at base pge of it.
lxi d,75 ; go past xios jmp table.
dad d ; update pointer.
mov a,m ; get the byte.
ani 0ffh ; see if boolean non zero if MPM II jmp table.
jz tod ; go do systems time of day.
inx h ; must be 2 bytes set to ffh
shld exiospt ; extended xios pointer.
mov a,m ; get byte.
ani 0ffh ; ok?
jz tod ; do the systems time of day.
lxi d,msg99 ; go print the BSR controller is active.
mvi c,strout ; string output function.
call bdos ; do it.
lhld exiospt ; restore just in case.
lxi d,24 ; see if bsr on/off, it is,
; 25 from base inormation bytes.
dad d ; add to pointer.
mov a,m ; get byte.
inx h ; up next byte.
inx h ; up next byte.
shld exiospt ; extended xios pointer.
ani 0ffh ; of ff then it is on.
jnz bsract ; go do active message.
lxi d,msg37 ; go print the CP/Net is inactive.
mvi c,strout ; string output function.
call bdos ; do it.
call crlf ; do cr,lf.
jmp cnulls ; go to console and nulls.
bsract:
lxi d,msg38 ; go print the CP/Net is active.
mvi c,strout ; string output function.
call bdos ; do it.
call crlf ; do cr,lf.
cnulls:
lxi d,msg44 ; go print the console number(0-to-end).
mvi c,strout ; string output function.
call bdos ; do it.
lda csole ; get console number back.
adi 30h ; make ascii.
call cout ; go print console number.
lxi d,msg45 ; go print the 'has' message.
mvi c,strout ; string output function.
call bdos ; do it.
lhld exiospt ; get pointer back.
mov a,m ; get the current number of nulls.
adi 30h ; add ascii offset.
call cout ; go print it.
lxi d,msg46 ; go print the 'nulls' message.
mvi c,strout ; string output function.
call bdos ; do it.
call crlf ; add carriage return, linefeed per message.
lda csole ; get console number.
adi 1 ; next console.
sta csole ; save it again.
lhld exiospt ; just makeing sure it's right.
inx h ; next null pointer also.
shld exiospt ; resave.
lda maxcon ; done 1, now next one,
sui 1 ; one less,
sta maxcon ; to do.
jnz cnulls ; loop till all consoles are done.
; do a TOD, sytem time of day.
tod:
lxi d,msg26 ; get tod message.
mvi c,strout ; print command.
call bdos ; print it.
mvi c,systod ; time of day command.
lxi d,time ; set up for date, hour, minutes, seconds.
call bdos ; go do it.
lxi h,time1 ; do time hours for now.
call dobyte ; go do a byte
mvi a,':' ; separater.
call cout ; go print it.
inx h ; minutes.
call dobyte ; go do it.
mvi a,':' ; separater.
call cout ; go print it.
inx h ; seconds.
call dobyte ; go do it.
call crlf ; do cr,lf.
; now do the restart number.
lxi d,msg29 ; go print the restart message.
mvi c,strout ; string output function.
call bdos ; do it.
lxi d,2 ; increment to the breakpoint number.
call offset ; dad the d wth the h&l.
adi 30h ; ascii offset.
call cout ; go print it.
call crlf ; do cr,lf.
; now do CPU type.
lxi d,msg30 ; go print the CPU message.
mvi c,strout ; string output function.
call bdos ; do it.
lxi d,5 ; increment to the CPU type.
call offset ; dad the d wth the h&l.
ani 0ffh ; if ff then z-80 else 8080(type).
jnz z80 ; do z-80 if ff.
lxi d,msg31 ; go print the 8080 CPU.
mvi c,strout ; string output function.
call bdos ; do it.
call crlf ; do cr,lf.
jmp bkbdos ; go to xios jmp table.
z80:
lxi d,msg32 ; go print the Z-80 CPU.
mvi c,strout ; string output function.
call bdos ; do it.
call crlf ; do cr,lf.
; now do the bank bdos function.
bkbdos:
lxi d,4 ; increment to banked switched memory
call offset ; dad the d wth the h&l.
ani 0ffh ; see if boolean non zero if banked switched.
jz rspage ; go do resident page if not.
lxi d,msg33 ; go print the bank switched memory indicator.
mvi c,strout ; string output function.
call bdos ; do it.
call crlf ; do cr,lf.
; now do the resident page address.
rspage:
lxi d,6 ; increment to BDOS RSP page address.
call offset ; dad the d wth the h&l.
ani 0ffh ; see if boolean non zero if banked switched.
jz xios ; go do xios jm table.
lxi d,msg35 ; go print the bdos resident page.
mvi c,strout ; string output function.
call bdos ; do it.
call crlf ; do cr,lf.
resbdos:
lxi d,msg43
mvi c,strout
call bdos
lxi d,8 ; increment to resident bdos.
call offset ; dad the d wth the h&l.
mov d,m ; get into d for printing.
mvi e,0 ; force low order byte to zero.
xchg ; exchange the de&hl for printing address.
call adout ; go print address.
xchg ; get back hl.
call crlf ; then cr,lf.
; do XIOS printout, and some other MP/M stuff.
; ex: memory segmnts and size, console number, time of day.
xios:
lxi d,7 ; increment to xios jmp table address.
call offset ; dad the d wth the h&l.
ani 0ffh ; see if boolean non zero if MPM II jmp table.
jz xdos ; go do xdos if not.
lxi d,msg20
mvi c,strout
call bdos
lxi d,7 ; increment to xios jmp table.
call offset ; dad the d wth the h&l.
mov d,m ; get into d for printing.
mvi e,0 ; force low order byte to zero.
xchg ; exchange the de&hl for printing address.
call adout ; go print address.
xchg ; get back hl.
call crlf ; then cr,lf.
; now print the address of the xdos.
xdos:
lxi d,11 ; increment to banked XDOS address.
call offset ; dad the d wth the h&l.
ani 0ffh ;
jz rsp ;
lxi d,msg39 ; go print the XDOS address start.
mvi c,strout ; string output function.
call bdos ; do it.
lxi d,11 ; increment to banked XDOS address.
call offset ; dad the d wth the h&l.
mov d,m ; get into d for printing.
mvi e,0 ; force low order byte to zero.
xchg ; exchange the de&hl for printing address.
call adout ; go print address.
xchg ; get back hl.
call crlf ; do cr,lf.
; now do the RSP base page address.
rsp:
lxi d,12 ; increment to banked RSP base page address.
call offset ; dad the d wth the h&l.
ani 0ffh ;
jz bxios ;
lxi d,msg40 ; go print the RSP address start.
mvi c,strout ; string output function.
call bdos ; do it.
lxi d,12 ; increment to banked RSP base page address.
call offset ; dad the d wth the h&l.
mov d,m ; get into d for printing.
mvi e,0 ; force low order byte to zero.
xchg ; exchange the de&hl for printing address.
call adout ; go print address.
xchg ; get back hl.
call crlf ; do cr,lf.
; now do the banked XIOS base pase address.
bxios:
lxi d,13 ; increment to banked XIOS address.
call offset ; dad the d wth the h&l.
ani 0ffh ;
jz bnkbdos ;
lxi d,msg41 ; go print the banked XIOS address start.
mvi c,strout ; string output function.
call bdos ; do it.
lxi d,13 ; increment to xios jmp table.
call offset ; dad the d wth the h&l.
mov d,m ; get into d for printing.
mvi e,0 ; force low order byte to zero.
xchg ; exchange the de&hl for printing address.
call adout ; go print address.
xchg ; get back hl.
call crlf ; then cr,lf.
; now do the banked BDOS base page.
bnkbdos:
lxi d,14 ; increment to banked BDOS address.
call offset ; dad the d wth the h&l.
ani 0ffh ;
jz cpnet ; go do CP/Net if not.
lxi d,msg42 ; go print the banked BDOS address start.
mvi c,strout ; string output function.
call bdos ; do it.
lxi d,14 ; increment to banked BDOS address.
call offset ; dad the d wth the h&l.
mov d,m ; get into d for printing.
mvi e,0 ; force low order byte to zero.
xchg ; exchange the de&hl for printing address.
call adout ; go print address.
xchg ; get back hl.
call crlf ; do cr,lf.
; now do CP/Net function.
cpnet:
lxi d,msg36 ; go print CP/Net.
mvi c,strout ; string output function.
call bdos ; do it.
lxi d,09h ; increment to CP/Net active/nonactive.
call offset ; dad the d wth the h&l.
ani 0ffh ; see if boolean non zero if banked switched.
jnz active ; go do active message.
lxi d,msg37 ; go print the CP/Net is inactive.
mvi c,strout ; string output function.
call bdos ; do it.
call crlf ; do cr,lf.
jmp memseg ; go to memory segments.
active:
lxi d,msg38 ; go print the CP/Net is active.
mvi c,strout ; string output function.
call bdos ; do it.
call crlf ; do cr,lf.
memseg:
lxi d,msg21
mvi c,strout
call bdos
call crlf
lxi d,msg22
mvi c,strout
call bdos
call crlf
lxi d,0fh ; offset to memory segments address start.
call offset ; hl now pointing to memory seg address.
adi 1 ; make one higher.
sta segcnt ; store memory segment count in memory.
memore:
inx h ; next byte.
mov d,m ; get high order address.
mvi e,0 ; force low byte to zero.
lda segcnt ; put into a.
sui 1 ; if none zero then is memory segment.
sta segcnt ; less one on the counter.
jz numrecd ; go do number of records check.
mem1time:
push h ; save hl.
xchg ; put de into hl.
call adout ; output address.
xchg ; get bck hl.
lxi d,msg23 ; output a few spaces.
mvi c,strout ; print it.
call bdos
pop h ; get it back.
inx h ; now we are there.
mov d,m ; get high address.
; note high low reversed for memory seg size.
mvi e,0 ; force to 0.
xchg ; put de into hl.
call adout ; output size.
xchg ; get back hl.
; add these functions later.
inx h ; increment past attrabute.
inx h ; increment past segment times.
push h ; save it.
lxi d,msg23 ; output a few spaces.
mvi c,strout ; print it.
call bdos
pop h ; get it back.
mov a,m ; get bnk number.
push h ; save it again.
call heout ; go print hex output.
call crlf ; do cr,lf
pop h ; restore pointer.
jmp memore ; do till done.
dobyte:
mov a,m ; note, this uses nibbles for time.
ani 0f0h ; drop lower nibble.
rar ; do four.
rar ;
rar ;
rar ; now have in lower nibble, time tens.
adi 30h ; add ascii offset.
call cout ; go print it.
mov a,m ; get byte again.
ani 0fh ; drop upper nibble.
adi 30h ; add ascii offset, time units.
call cout ; go print it.
ret ; done.
offset:
push d
mvi c,sysdat ; get system data address.
call bdos ; comes back in hl.
pop d
dad d ; hl now pointing area in system data
; for location pointed to by the d&e.
mov a,m ; has how many memory segments their are in
ret ; done here.
; This section allows for future expantion of the MP/M II info at the
; data page address.
numrecd:
lxi d,msg47 ; go print MP/M.SYS records.
mvi c,strout ; string output function.
call bdos ; do it.
lxi d,79h ; increment
call offset ; dad the d wth the h&l.
call heout ; go print it in hex format.
dcx h ; one less low-order byte.
mov a,m ; get it.
call heout ; print it.
call crlf ; cr lf printed.
lxi d,msg48 ; ticks/sec.
mvi c,strout ; string output function.
call bdos ; do it.
lxi d,7ah ; increment
call offset ; dad the d wth the h&l.
call heout ; go print it in hex format.
call crlf ; print cr,lf.
lxi d,msg49 ; system drive.
mvi c,strout ; string output function.
call bdos ; do it.
lxi d,7bh ; increment
call offset ; dad the d wth the h&l.
adi 40h ; add ascii offset for drive indicator.
call cout ; go print it.
call crlf ; print cr,lf.
lxi d,msg50 ; go print the Common memory.
mvi c,strout ; string output function.
call bdos ; do it.
lxi d,7ch ; increment
call offset ; dad the d wth the h&l.
call heout ; go print it in hex format.
mvi a,0 ; force to zer0.
call heout ; go print it in hex format.
call crlf ; do cr,lf.
lxi d,msg51 ; #RSP's.
mvi c,strout ; string output function.
call bdos ; do it.
lxi d,7dh ; increment
call offset ; dad the d wth the h&l.
adi 30h ; add ascii offset.
call cout ; go print it.
call crlf ; print cr,lf.
lxi d,msg52 ; go print the listcp array.
mvi c,strout ; string output function.
call bdos ; do it.
lxi d,7fh ; increment
call offset ; dad the d wth the h&l.
call heout ; go print it in hex format.
dcx h ; decement.
mov a,m ; get low-order byte.
call heout ; go print it in hex format.
call crlf ; do cr,lf.
lxi d,msg53 ; max locked records.
mvi c,strout ; string output function.
call bdos ; do it.
lxi d,0bbh ; increment
call offset ; dad the d wth the h&l.
call heout ; go print it in hex format.
call crlf ; print cr,lf.
lxi d,msg54 ; max opened files.
mvi c,strout ; string output function.
call bdos ; do it.
lxi d,0bch ; increment
call offset ; dad the d wth the h&l.
call heout ; go print it in hex format.
call crlf ; print cr,lf.
lxi d,msg55 ; # list items.
mvi c,strout ; string output function.
call bdos ; do it.
lxi d,0beh ; increment
call offset ; dad the d wth the h&l.
call heout ; go print it in hex format.
dcx h ; decement.
mov a,m ; get low-order byte.
call heout ; go print it in hex format.
call crlf ; do cr,lf.
lxi d,msg56 ; system locked records.
mvi c,strout ; string output function.
call bdos ; do it.
lxi d,0c1h ; increment
call offset ; dad the d wth the h&l.
call heout ; go print it in hex format.
call crlf ; print cr,lf.
lxi d,msg57 ; system opened files.
mvi c,strout ; string output function.
call bdos ; do it.
lxi d,0c2h ; increment
call offset ; dad the d wth the h&l.
call heout ; go print it in hex format.
call crlf ; print cr,lf.
lxi d,msg58 ; go print dayfile.
mvi c,strout ; string output function.
call bdos ; do it.
lxi d,0c3h ; increment to dayfile active/nonactive.
call offset ; dad the d wth the h&l. ani 0ffh ; see if boolean non zero if banked switched.
jnz dactive ; go do active message.
lxi d,msg59 ; go print the dayfile is inactive.
mvi c,strout ; string output function.
call bdos ; do it.
call crlf ; do cr,lf.
dactive:
lxi d,msg60 ; go print the dayfile is active.
mvi c,strout ; string output function.
call bdos ; do it.
call crlf ; do cr,lf.
lxi d,msg61 ; temporary drive.
mvi c,strout ; string output function.
call bdos ; do it.
lxi d,0c4h ; increment
call offset ; dad the d wth the h&l.
adi 40h ; add ascii offset for drive indicator.
call cout ; go print it.
call crlf ; print cr,lf.
lxi d,msg62 ; # of list devices.
mvi c,strout ; string output function.
call bdos ; do it.
lxi d,0c5h ; increment
call offset ; dad the d wth the h&l.
adi 30h ; add ascii offset.
call cout ; go print it.
call crlf ; print cr,lf.
lxi d,msg63 ; go print the XDOS base page.
mvi c,strout ; string output function.
call bdos ; do it.
lxi d,0f2h ; increment
call offset ; dad the d wth the h&l.
call heout ; go print it in hex format.
mvi a,0 ; force to zer0.
call heout ; go print it in hex format.
call crlf ; do cr,lf.
lxi d,msg64 ; go print the TMP base page.
mvi c,strout ; string output function.
call bdos ; do it.
lxi d,0f3h ; increment
call offset ; dad the d wth the h&l.
call heout ; go print it in hex format.
mvi a,0 ; force to zer0.
call heout ; go print it in hex format.
call crlf ; do cr,lf.
lxi d,msg65 ; go print the console.dat base.
mvi c,strout ; string output function.
call bdos ; do it.
lxi d,0f4h ; increment
call offset ; dad the d wth the h&l.
call heout ; go print it in hex format.
mvi a,0 ; force to zer0.
call heout ; go print it in hex format.
call crlf ; do cr,lf.
lxi d,msg66 ; BDOS / XDOS entry point.
mvi c,strout ; string output function.
call bdos ; do it.
lxi d,0f6h ; increment
call offset ; dad the d wth the h&l.
call heout ; go print it in hex format.
dcx h ; decement.
mov a,m ; get low-order byte.
call heout ; go print it in hex format.
call crlf ; do cr,lf.
lxi d,msg67 ; TMP.spr base page.
mvi c,strout ; string output function.
call bdos ; do it.
lxi d,0f7h ; increment
call offset ; dad the d wth the h&l.
call heout ; go print it in hex format.
mvi a,0 ; force to zer0.
call heout ; go print it in hex format.
call crlf ; do cr,lf.
lxi d,msg68 ; number of banked RSP's.
mvi c,strout ; string output function.
call bdos ; do it.
lxi d,0f8h ; increment
call offset ; dad the d wth the h&l.
call heout ; go print it in hex format.
mvi a,0 ; force to zer0.
call heout ; go print it in hex format.
call crlf ; do cr,lf.
lxi d,msg69 ; XDOS internal data segment address.
mvi c,strout ; string output function.
call bdos ; do it.
lxi d,0fch ; increment
call offset ; dad the d wth the h&l.
call heout ; go print it in hex format.
dcx h ; decement.
mov a,m ; get low-order byte.
call heout ; go print it in hex format.
call crlf ; do cr,lf.
; Determine which drive is the current drive in
; use, and print the result
drvchk:
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
lda mpmbyte ; see if MP/M.
ora a ; none zero if so.
jnz mpmcurt ; do MP/M current allocation.
lda cpmbyte
ani 0f0h ; see if 1.x version.
jz rport ; go to do the i/o ports, if not 2.x CP/M.
mpmcurt:
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!!
rport:
LXI D,MSG16
MVI C,STROUT
CALL BDOS
lda porta
sta aport+1
lda portb
sta bport+1
PORT1:
LDA BYTE
STA PORT3+1
aport:
cpi 0 ; original code had a d0 or something
jm port3
bport:
cpi 0
jm port2
jmp port3
port2:
call portout
jmp port4
port3:
IN 0
CPI 0FFH
CNZ PORTOUT
lda byte
cpi 0ffh
jz finish
port4:
LDA BYTE
INR A
STA BYTE
JMP PORT1
finish:
LHLD OLDSP
SPHL
RET
PORTOUT:
LDA BYTE
CALL HEOUT
CALL SPACE
RET
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 CP/M version $'
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 $'
msg20: db 'XIOS jmp table starts at $'
msg21: db 'Memory segments are $'
msg22: db 'base size bank $'
msg23: db ' $'
msg25: db 'Your console number is $'
msg26: db 'The system time of day is $'
MSG24: db 'Status report for the P.H.O.T.U.S.'
db ' system - MP/M version $'
msg27: db ' system',0dh,0ah
db ' - Program Version 1.8'
; version as of (05-Jan-84)
DB 0DH,0AH,0AH,'$'
msg28: db 'The number of consoles supported in this system is $'
msg29: db 'Restart number is #$'
msg30: db 'CPU is a $'
msg31: db '8080$'
msg32: db 'Z-80$'
msg33: db 'There is Banked switched memory$'
msg35: db 'Bdos resident page is active$'
msg36: db 'CP/Net is $'
msg37: db 'Inactive$'
msg38: db 'Active$'
msg39: db 'Xdos starts at $'
msg40: db 'RSP base page is at $'
msg41: db 'The banked Xios base page is at $'
msg42: db 'The banked Bdos base page is at $'
msg43: db 'The RESident BDOS base page is at $'
msg44: db 'Console number $'
msg45: db ' has $'
msg46: db ' nulls$'
msg47: db 'Number of records in MP/M.SYS file: $'
msg48: db 'System number of ticks/second: $'
msg49: db 'System drive is $'
msg50: db 'Common memory base page is at $'
msg51: db 'Number of RSPs is $'
msg52: db 'Listcp array address $'
msg53: db 'Maximun number of locked records per process $'
msg54: db 'Maximun number of opened files per process $'
msg55: db 'Number of list items $'
msg56: db 'Total of system locked records $'
msg57: db 'Total of system opened files $'
msg58: db 'Day file logging is $'
msg59: db 'Inactive$'
msg60: db 'Active$'
msg61: db 'Temporary file drive is $'
msg62: db 'The number of list devices supported in this system is $'
msg63: db 'Banked XDOS base page starts at $'
msg64: db 'TMP.spr process discriptor base $'
msg65: db 'Console.dat base $'
msg66: db 'BDOS / XDOS entry address is at $'
msg67: db 'TMP.spr base is $'
msg68: db 'Number of banked RSPs $'
msg69: db 'XDOS internal data segment address $'
msg99: db 'BSR controller is $'
DS 80h ; 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
mpmbyte ds 1
cpmbyte ds 1
time ds 2
time1 ds 3
timeend db '$'
segcnt db 0
csole db 0
maxcon db 0
exiospt db 0
last: db 0 ; for MP/M prl file.
END