home *** CD-ROM | disk | FTP | other *** search
- ; 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
-