;***********************************************************************
;      MICROCOSM MEMORY MAP DISPLAY PROGRAM VERSION 1.0  (C) 1979
;***********************************************************************
;
;
	ORG	00100H
;
;
;
BDOS	EQU	5	;BDOS ENTRY
CHRF	EQU	2	;CP/M PRINT CHARACTER FUNCTION
PRNF	EQU	9	;CP/M PRINT CHARCTER STRING FUNCTION
CR	EQU	00DH	;CARRIAGE-RETURN CHARACTER
LF	EQU	00AH	;LINE-FEED CHARACTER
;
;
;
MAP:	LXI	H,0	;SET-UP STACK
	DAD	SP	;ENTRY STACK POINTER FROM CP/M CCP
	SHLD	OLDSP	;SAVE IT
	LXI	SP,STACK	;SET STACK TO LOCAL STACK AREA
	CALL	CRLF	;KEEP IT NEAT
	MVI	C,PRNF	;OUTPUT "BLOCK LOCATION"
	LXI	D,BLKMSG
	CALL	BDOS
	LXI	H,0	;POINT TO BLOCK 0
	MVI	B,1	;"ITEMS TO A LINE" COUNTER
MAP1:	MVI	E,'M'	;INDICATE "M" FOR RAM
	MOV	A,M	;GET FIRST BYTE OF BLOCK
	CMA		;INVERT IT
	MOV	M,A	;TRY TO MODIFY MEMORY
	CMP	M	;WAS MEMORY MODIFIED?
	CMA		;RESTORE A REG. TO INITIALLY READ VALUE
	MOV	M,A	;RESTORE MEMORY
	JNZ	MAP2	;SKIP,IF NOT RAM
	CMP	M	;TEST IF RAM FOR SURE
	JZ	PRINT	;YUP,IT'S RAM
MAP2:	MVI	E,'P'	;INDICATE "P" FOR PROM
MAP3:	MVI	A,0FFH	;ABSENCE OF MEMORY IS ALL ONE'S
	CMP	M	;TEST FOR NO MEMORY
	JNZ	PRINT	;YUP,IT'S PROM
	INR	L	;DO CHECK ON NEXT BYTE
	XRA	A	;CLEAR A REG. FOR 256 BYTE BLOCK COUNTER
	CMP	L	;TEST IF BLOCK CHECK DONE
	JNZ	MAP3	;LOOP 256 TIMES
	MVI	E,'.'	;INDICATE "." FOR NO MEMORY
PRINT:	MVI	L,0	;CLEAR LS BYTE OF MEMORY POINTER
	DCR	B	;COUNT ITEMS TO A LINE
	JNZ	NLINE	;SKIP IF NOT A NEW LINE
	MVI	B,16	;16 ITEMS TO A LINE
	CALL	CRLF	;OUTPUT "CR/LF"
	CALL	HEXO	;OUTPUT BLOCK ADDRESS
NLINE:	MVI	A,' '	;OUTPUT A SPACE CHARACTER
	CALL	PCHAR
	MOV	A,E	;GET MEMORY TYPE CHARACTER
	CALL	PCHAR	;PRINT IT
	INR	H	;BUMP FOR NEXT BLOCK
	JNZ	MAP1	;CONTINUE UNTIL LAST BLOCK
	CALL	CRLF	;KEEP IT NEAT FOR RETURN TO CP/M
	LHLD	OLDSP	;GET OLD STACK POINTER
	SPHL		;RESTORE IT
	RET		;STACK POINTER CONTAINS CCP'S STACK LOCATION
;
;
;
HEXO:	MOV	C,H	;GET MS BYTE
	CALL	HEXO1	;OUTPUT MS BYTE
	MOV	C,L	;GET LS BYTE
HEXO1:	MOV	A,C	;GET BYTE TO BE CONVERTED
	RAR ! RAR ! RAR ! RAR	;ROTATE UPPER NIBBLE
	CALL	HEXO2	;OUTPUT UPPER NIBBLE
	MOV	A,C
HEXO2:	ANI	00FH	;MASK UPPER NIBBLE
	CPI	10	;TEST IF >10
	JC	HEXO3	;SKIP IF <10
	ADI	7	;ADJUST ASCII
HEXO3:	ADI	030H	;ADD ASCII BIAS
PCHAR:	PUSH H ! PUSH D ! PUSH B ! PUSH PSW
	MVI	C,CHRF	;DO CP/M PRINT CHARACTER FUNCTION
	MOV	E,A	;CHARACTER TO E REG.
	CALL	BDOS	;LET CP/M DO THE WORK
	POP PSW ! POP B ! POP D ! POP H
	RET
;
;
;
CRLF:	MVI	A,CR	;PRINT "CARRIAGE-RETURN"
	CALL	PCHAR
	MVI	A,LF	;PRINT "LINE-FEED"
	CALL	PCHAR
	RET
;
;
;
BLKMSG	DB	'     0 1 2 3 4 5 6 7 8 9 A B C D E F$'
;
;
;
OLDSP	DS	2	;ENTRY STACK POINTER VALUE FROM CP/M CCP
	DS	16	;RESERVE 8 LEVEL STACK
STACK	EQU	$
;
;
;
	END
O A LINE" COUNTER
MAP1:	MVI	E,'M'	;INDICATE "M" 