[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