;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