;
;  PROGRAM:  CCPLOC
;  AUTHOR:  RICHARD CONN
;  VERSION:  1.1
;  DATE:  6 JAN 83
;  PREVIOUS VERSIONS:  1.0 (14 DEC 82)
;
VERS    EQU     11

;
;       This program is Copyright (c) 1982, 1983 by Richard Conn
;       All Rights Reserved
;
;       ZCPR2 and its utilities, including this one, are released
; to the public domain.  Anyone who wishes to USE them may do so with
; no strings attached.  The author assumes no responsibility or
; liability for the use of ZCPR2 and its utilities.
;
;       The author, Richard Conn, has sole rights to this program.
; ZCPR2 and its utilities may not be sold without the express,
; written permission of the author.
;


;
;       CCPLOC -- CCP Locator
;
;       The purpose of CCPLOC is to locate the addresses of the running
; CP/M 2.2 CCP, BDOS, and BIOS, and to display these values to the user.
;

;
;  CP/M Constants
;
bdos    equ     5       ; BDOS Entry
cr      equ     0dh
lf      equ     0ah

;
;  SYSLIB Externals
;
       ext     print,phl4hc,pa2hc,cout,crlf

;
;  Branch to Start of Program
;
       jmp     start

;
;******************************************************************
;
;  SINSFORM -- ZCPR2 Utility Standard General Purpose Initialization Format
;
;       This data block precisely defines the data format for
; initial features of a ZCPR2 system which are required for proper
; initialization of the ZCPR2-Specific Routines in SYSLIB.
;

;
;  EXTERNAL PATH DATA
;
EPAVAIL:
       DB      0FFH    ; IS EXTERNAL PATH AVAILABLE? (0=NO, 0FFH=YES)
EPADR:
       DW      40H     ; ADDRESS OF EXTERNAL PATH IF AVAILABLE

;
;  INTERNAL PATH DATA
;
INTPATH:
       DB      0,0     ; DISK, USER FOR FIRST PATH ELEMENT
                       ; DISK = 1 FOR A, '$' FOR CURRENT
                       ; USER = NUMBER, '$' FOR CURRENT
       DB      0,0
       DB      0,0
       DB      0,0
       DB      0,0
       DB      0,0
       DB      0,0
       DB      0,0     ; DISK, USER FOR 8TH PATH ELEMENT
       DB      0       ; END OF PATH

;
;  MULTIPLE COMMAND LINE BUFFER DATA
;
MCAVAIL:
       DB      0FFH    ; IS MULTIPLE COMMAND LINE BUFFER AVAILABLE?
MCADR:
       DW      0FF00H  ; ADDRESS OF MULTIPLE COMMAND LINE BUFFER IF AVAILABLE

;
;  DISK/USER LIMITS
;
MDISK:
       DB      4       ; MAXIMUM NUMBER OF DISKS
MUSER:
       DB      31      ; MAXIMUM USER NUMBER

;
;  FLAGS TO PERMIT LOG IN FOR DIFFERENT USER AREA OR DISK
;
DOK:
       DB      0FFH    ; ALLOW DISK CHANGE? (0=NO, 0FFH=YES)
UOK:
       DB      0FFH    ; ALLOW USER CHANGE? (0=NO, 0FFH=YES)

;
;  PRIVILEGED USER DATA
;
PUSER:
       DB      10      ; BEGINNING OF PRIVILEGED USER AREAS
PPASS:
       DB      'chdir',0       ; PASSWORD FOR MOVING INTO PRIV USER AREAS
       DS      41-($-PPASS)    ; 40 CHARS MAX IN BUFFER + 1 for ending NULL

;
;  CURRENT USER/DISK INDICATOR
;
CINDIC:
       DB      '$'     ; USUAL VALUE (FOR PATH EXPRESSIONS)

;
;  DMA ADDRESS FOR DISK TRANSFERS
;
DMADR:
       DW      80H     ; TBUFF AREA

;
;  NAMED DIRECTORY INFORMATION
;
NDRADR:
       DW      00000H  ; ADDRESS OF MEMORY-RESIDENT NAMED DIRECTORY
NDNAMES:
       DB      64      ; MAX NUMBER OF DIRECTORY NAMES
DNFILE:
       DB      'NAMES   '      ; NAME OF DISK NAME FILE
       DB      'DIR'           ; TYPE OF DISK NAME FILE

;
;  REQUIREMENTS FLAGS
;
EPREQD:
       DB      000H    ; EXTERNAL PATH?
MCREQD:
       DB      000H    ; MULTIPLE COMMAND LINE?
MXREQD:
       DB      000H    ; MAX USER/DISK?
UDREQD:
       DB      000H    ; ALLOW USER/DISK CHANGE?
PUREQD:
       DB      000H    ; PRIVILEGED USER?
CDREQD:
       DB      000H    ; CURRENT INDIC AND DMA?
NDREQD:
       DB      000H    ; NAMED DIRECTORIES?
Z2CLASS:
       DB      0       ; CLASS 0
       DB      'ZCPR2'
       DS      10      ; RESERVED

;
;  END OF SINSFORM -- STANDARD DEFAULT PARAMETER DATA
;
;******************************************************************
;

;
;  Start of Program
;
start:
       call    print
       db      'CCPLOC  Version '
       db      (vers/10)+'0','.',(vers mod 10)+'0'
       db      cr,lf
       db      cr,lf,'CP/M Element     Base Page       Base Address'
       db      cr,lf,'------------     ---------       ------------',0

       lhld    bdos+1  ;get base address of BDOS
       mvi     l,0     ;set to even boundary
       lxi     d,-800H ;back up to start of CCP (size of CCP)
       dad     d       ;HL pts to CCP
       call    print
       db      cr,lf,'    CCP          ','   ',0
       mov     a,h     ;base page in A
       call    pa2hc   ;print as hex
       call    ph      ;print H
       call    filler  ;next field
       call    phl4hc  ;print full address
       call    ph

       lhld    bdos+1  ;just get base address of BDOS again
       call    print
       db      cr,lf,'    BDOS ','   ',0
       mov     a,h     ;base page in A
       call    pa2hc   ;print as hex
       call    ph
       call    filler
       call    phl4hc
       call    ph

       mvi     l,0     ;set even page
       lxi     d,0e00h ;size of BDOS
       dad     d       ;HL pts to BIOS
       call    print
       db      cr,lf,'    BIOS ','   ',0
       mov     a,h     ;base page in A
       call    pa2hc   ;print as hex
       call    ph
       call    filler
       call    phl4hc
       call    ph
       call    crlf    ;new lines
       call    crlf
       ret

;
;  PH -- Print H followed
;
ph:
       mvi     a,'H'   ;H
       jmp     cout

;
;  FILLER -- Jump Over to Next Field
;
filler:
       call    print
       db      '   ',' ','     ',0
       ret

       end