Here is the source for the above. bill .. ;file MEMMAP.ASM ; ; DISPLAY CP/M MEMORY LOCATIONS. ; ORG 100H MVI C,12 ;CHECK 1.4 OR 2.2 ? 3 ?? CALL 5 ;CHECK VER NO. MOV A,L ;GET VER NO IN A VIA THE HL ORA A LXI H,3328-6 ;LENGTH OF 1.4 BDOS JZ MMP1 ;IF CP/M VER 1.4 ; LXI H,3584-6 ;LENGTH OF 2.2 BDOS MVI A,'2' ;CHANGE MESSAGE STA MMPK STA MMPK+2 ; MMP1: SHLD MMPA ; LHLD 6 ;GET BDOS ENTRY ADDRESS SHLD BDOSE ; LXI B,-806H ;CALCULATE CCP FWA DAD B ; SHLD CCPFWA ; DCX H ;CALCULATE TPA LWA SHLD TPALWA INX H ; LXI B,800H ;CALCUATE BDOS FWA DAD B SHLD BDFWA LXI B,6 ;CALCULATE BDOS ENTRY ADDRESS DAD B SHLD BDOSE ; LXI B,0 ;CALCULATE CBIOS FWA MMPA EQU $-2 ; DAD B SHLD CBFWA ; LXI B,3 ;CALCULATE BCIOS "WARMBOOT" ENTRY ADDRESS DAD B SHLD WRMBT ; ; DISPLAY MEMORY LOCATIONS. ; LXI D,MMPB ;DISPLAY A LINE OF DASHES "-------------------" CALL MSG ; USE DOS CONSOLE OUT LXI D,MMPJ ; DISPLAY SYSTEM VERSION NO. CALL MSG ; LXI D,MMPC ;WARM BOOT ECT... CALL MSG ; LXI H,0 ;DISPLAY TPA LWA TPALWA EQU $-2 CALL DHW LXI D,MMPD CALL MSG ; LXI H,0 ;DISPLAY CCP FWA CCPFWA EQU $-2 CALL DHW LXI D,MMPE CALL MSG ; LXI H,0 ;DISPLAY BDOS FWA BDFWA EQU $-2 ; CALL DHW LXI D,MMPF CALL MSG ; LXI H,0 ; DISPLAY BDOS ENTRY ADDRESS BDOSE EQU $-2 CALL DHW LXI D,MMPG CALL MSG ; LXI H,0 ;DISPLAY CBIOS FWA CBFWA EQU $-2 CALL DHW LXI D,MMPH CALL MSG ; LXI H,0 ;DISPLAY CBIOS WARMBOOT ENTRY LOCATION WRMBT EQU $-2 ; CALL DHW LXI D,MMPI CALL MSG ; LXI D,MMPB ;DISPLAY A line OF DASHES "------------- " CALL MSG JMP 0000 ; ; CR EQU 0DH LF EQU 0AH ; MMPB: DB CR,LF,'----------------------------' DB CR,LF,'$' MMPC: DB '0000 "WARMBOOT" VECTOR',CR,LF DB '0005 BDOS VECTOR',CR,LF DB '005C DEFAULT FILE CONTROL BLOCK (FCB)',CR,LF DB '0080 CP/M RECORD BUFFER',CR,LF DB '0100 FIRST WORD ADDRESS (FWA) OF TPA AREA',CR,LF,'$' MMPD: DB ' LAST WORD ADDRESS (LWA) OF TPA AREA',CR,LF,'$' MMPE: DB ' CCP START OF ',CR,LF,'$' MMPF: DB ' BDOS START OF',CR,LF,'$' MMPG: DB ' BDOS ENTRY POINT',CR,LF,'$' MMPH: DB ' CBIOS START',CR,LF,'$' MMPI: DB ' CBIOS WARMBOOT ENTRY POINT',CR,LF,'$' MMPJ: DB 'SYSTEM CP/M VERSION ' MMPK: DB '1.4',CR,LF,'$' ; ; DHW - DISPLAY HEX WORD ; ENTRY HL = WORD TO BE DISPLAYED ; DHW: PUSH H MOV A,H ;DISPLAY HIGH BYTE CALL DHB POP H MOV A,L ; ; DHB ---- DISPLAY HEX BYTE ; DISPLAY TOW HEX DIGITS. ; DHB: PUSH PSW RRC ! RRC ! RRC ! RRC CALL DHD ;DISPLAY HEX DIGIT POP PSW ; ; DHD DISPLAY HEX DIGIT. ; ENTRY A,LOW 4 BITS = DIGIT ; DHD: ANI 0FH CPI 10 JNC DHD1 ;IF NOT 0 THRU 9 ; ADI '0' ; JMP DCH ;ABSOLUTE JUMP ; DHD1: ADI 'A'-10 ;CREATE "A,B,C,D,E,F" ; ; DCH - DISPLAY ONE CHARACTER. ; ENTRY A = ASCII ENCODED CHAR ; DCH: MOV E,A MVI C,2 CALL 5 RET ; ; ; ALN - ADVANCE TO NEW LINE ; ISSUE CR,LF ; ALN: MVI A,0DH ;CARRIAGE - RETURN CALL DCH MVI A,0AH ;LINE-FEED CALL DCH RET ; ; FCC FILTER OUT CONTROL CODES. ; ENTRY A = ASCII CODE ; EXIT B = ASCII GRAPHIC CHAR ; A = 'UP-ARROW' IF CONTROL-CODE ; = BLANK, IF GRAPHIC ; FCC: CPI 20H JNC FCC1 ;IF NOT CTRL CODE ; WE HAVE A CTRL CODE. ; RETURN 'UP-ARROW' IN A ; GRAPHIC IN B. ; ADI 40H MOV B,A MVI A,5EH ;UP-ARROW RET ; ; WE HAVE A GRAPHIC CHARACTER ; RETURN BLANK IN A; GRAPHIC IN B. ; FCC1: MOV B,A MVI A,20H ;BLANK RET ; ; MSG - ISSURE MESSAGE TO CONSOLE. ; ENTRY DE = MESSAGE ADDRESS ; MSG: MVI C,9 CALL 5 RET ; ; RCC - READ A CONSOLE CHARACTER. ; EXIT A = CHARACTER ; RCC: MVI C,1 CALL 5 RET ; END of MEMMAP.asm ; Here is Common.asm ; depending upon assembler used i.e. digital research or ; micorsoft m80 will need to include z80.lib for DR mac assem ; or MS M80 will need .z80 psudo op ; .z80 ; i.e. microsoft m80 ; ;if DR ;include z80.lib ;endif BDOS EQU 5 fcb EQU 5CH SBUF EQU 0080h ; STANDARD DMA ADDRESS FOR CPM ; ; BDOS FUNCTIONS MSGF EQU 9 OPNF EQU 15 CLSF EQU 16 SFEF EQU 17 DELF EQU 19 MAKF EQU 22 SFAF EQU 30 GDPB EQU 31 USRF EQU 32 ; ORG 100H ;STANDARD CPM TPA LXI H,0000 DAD SP SHLD OLDSP ; PUSH HL VIA THE SP LXI SP,STACK MVI C,MSGF LXI D,OLDU+1 CALL BDOS JMP COM ; FLAG: DB 0 ;FLAG 0 = FILE NOT FOUND EXT: DS 1 ;logical ext's per physical ex user: ds 1 ; ;user ?? oldu: ds 1 ; old user number ? db 'Copyright 1981 by MicroMethods.' db '$' ; end of string fnt: ds 33+3 ds 2*32 ; 64 bytes for 2 fcb's ; i.e. 32 bytes for each user file stack: ds 0 ; com: lda fcb ;check drop file cpi 0edh ; and with 0ffh jz drp ;if drop file ; lda fcb sta oldu mvi c,usrf ;Get current user # mvi e,0ffh call bdos sta user ;keep the user number ; ; get extent Mask. mvi c,gdpb call bdos lxi d,4 dad d mov a,m ;via the hl load the a inr a sta ext ;Log/physical = 1; com1: mvi c,usrf ; set to user "b" lda oldu ;get old user area mov e,a ; the a to the e call bdos ; does what mvi a,0 ; clear auto select we could use xor correct? sta fcb lxi d,fcb ;find file mvi c,sfef call bdos ;what ? cpi 0ffh jz com3 ; if done ; lxi h,flag ;mark file found inr m ;increment memory ; call ffa ;form directory entry address lxi d,fcb mvi c,32 call mmc ; mvi c,usrf ;set back current user lda user mov e,a call bdos ; lxi h,fcb ;move fnt lxi d,fnt mvi c,16 call mmc ; lxi d,fnt ;creat file virtural one right ? mvi c,makf call bdos inr a jz com5 ;if directory full ; lxi h,fcb ;move fnt + rbt lxi d,fnt mvi c,32 call mmc ; lda fcb+0eh ; clear s2 high bit ani 7fh sta fcb+0eh ; mvi c,clsf ;close the file lxi d,fcb call bdos ; lda fcb+09 ; mark it R/O ori 80h ; i.e. 128 set hi bit sta fcb+09 mvi c,sfaf ;set r/o lxi d,fcb call bdos ; lxi h,fcb+0ch ;advance extent lda ext add m ; add (h) to a mov m,a ; store via hl ani 0e0h ; jnz com7 ;if extent overflow jmp com1 ; com3: mvi c,usrf ;set back current user lda user mov e,a call bdos lda flag ;check file found ora a jz com8 ; if file not found ; com4: lxi sp,0000 oldsp equ $-2 ret ; ; process directory full error. ; com5: lxi d,coma ; "extent overflow" com6: mvi c,msgf call bdos jmp com4 ; ; process extent overflow. ; com7: lxi d,comb ;"Extent not found " jmp com6 ; com8: lxi d,comc ; file not found jmp com6 coma: db 0dh,0ah,'Directory is full.$' comb: db 0dh,0ah,'extent overflow: File too big to common.$' comc: db 0dh,0ah,'File not found.$' ; ; process dropfile drp mvi a,0 ;open the fle sta fcb lxi d,fcb mvi c,opnf call bdos ;Š lda fcb+09 ;clear r/o ani 7fh sta fcb+09 mvi c,sfaf lxi d,fcb call bdos ; mvi c,delf ;drop file lxi d,fcb call bdos ; jmp com4 ; ; mmc - move (c) bytes ; block move if 8080 us b1 else b2 ; entry hl = source ; destination fwa ; if z80 hl= src , de, destination , bc = count ; if 8080 ; do this block else z80 mmc: mov a,m ;via the hl stax d inx d inx h dcr c jnz mmc ;loop until c > 0 ret ;if we can ;use z80 then do this code ; else if z80 ; ldir ; ret ; endif ffa: ora a ral ! ral ! ral ! ral !ral! ; i.e. *32 or 2^5 mov e,a mvi d,0 lxi h,sbuf dad d ret