[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

CP/M Common & memmap



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