mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-24 00:44:23 +00:00
Upload
Digital Research
This commit is contained in:
488
CPM OPERATING SYSTEMS/CPM 3.X/CPM 3.0/SOURCE/dump.asm
Normal file
488
CPM OPERATING SYSTEMS/CPM 3.X/CPM 3.0/SOURCE/dump.asm
Normal file
@@ -0,0 +1,488 @@
|
||||
title 'CP/M 3 DUMP Utility'
|
||||
;***************************
|
||||
;***************************
|
||||
;** **
|
||||
;** D U M P **
|
||||
;** **
|
||||
;** FILE DUMP ROUTINE **
|
||||
;** **
|
||||
;** JULY 16 1982 **
|
||||
;** **
|
||||
;***************************
|
||||
;***************************
|
||||
;
|
||||
;
|
||||
;
|
||||
org 100h ;base of TPA
|
||||
;
|
||||
;******************
|
||||
;* BDOS Functions *
|
||||
;******************
|
||||
return equ 0 ;System reset
|
||||
conin equ 01 ;Read console
|
||||
conout equ 02 ;Type character
|
||||
bdos equ 05 ;DOS entry point
|
||||
input equ 06 ;Raw console I/O
|
||||
pstring equ 09 ;Type string
|
||||
rstring equ 10 ;Read connsole buffer
|
||||
chkio equ 11 ;Console status
|
||||
reset equ 13 ;Reset Disk System
|
||||
openf equ 15 ;Open file
|
||||
readf equ 20 ;Read buffer
|
||||
dmaf equ 26 ;Set DMA address
|
||||
fsize equ 35 ;Compute file size
|
||||
errmode equ 45 ;Set ERROR mode
|
||||
getscb equ 49 ;Get/Set SCB
|
||||
conmode equ 109 ;Set console mode
|
||||
;**************************
|
||||
;* Non Graphic Characters *
|
||||
;**************************
|
||||
ctrlc equ 03h ;control - C (^C)
|
||||
ctrlx equ 018h ;control - X (^X)
|
||||
cr equ 0dh ;carriage return
|
||||
lf equ 0ah ;line feed
|
||||
;
|
||||
;*******************
|
||||
;* FCB definitions *
|
||||
;*******************
|
||||
fcb equ 5ch ;File Control Block
|
||||
buf equ 80h ;Password Buffer Location
|
||||
;
|
||||
;*****************
|
||||
;* Begin Program *
|
||||
;*****************
|
||||
jmp begin
|
||||
;
|
||||
;*********************************************
|
||||
;* Patch Area, Date, Version & Serial Number *
|
||||
;*********************************************
|
||||
dw 0,0,0,0,0,0
|
||||
db 0
|
||||
db 'DUMP VERSION 3.0'
|
||||
db ' DUMP.COM '
|
||||
dw 0,0,0,0,0,0,0,0
|
||||
dw 0,0,0,0,0,0,0,0
|
||||
|
||||
maclib makedate ;[JCE] one file for all dates/copyrights
|
||||
@LCOPY
|
||||
@BDATE ;version date [day-month-year]
|
||||
db 0,0,0,0 ;patch bit map
|
||||
db '654321' ;Serial Number
|
||||
;
|
||||
pgraph: ;print graphic char. in ACC. or period
|
||||
cpi 7fh
|
||||
jnc pperiod
|
||||
cpi ' '
|
||||
jnc pchar
|
||||
;
|
||||
pperiod: ;print period
|
||||
mvi a,'.'
|
||||
jmp pchar
|
||||
;
|
||||
pchar: ;print char. in ACC. to console
|
||||
push h
|
||||
push d
|
||||
push b
|
||||
mov e,a ;value in ACC. is put in register E
|
||||
mvi c,conout ;value in register E is sent to console
|
||||
call bdos ;print character
|
||||
pop b
|
||||
pop d
|
||||
pop h
|
||||
ret
|
||||
;
|
||||
pnib: ;print nibble in low Acc.
|
||||
cpi 10
|
||||
jnc pnibh ;jump if 'A-F'
|
||||
adi '0'
|
||||
jmp pchar
|
||||
;
|
||||
pnibh:
|
||||
adi 'A'-10
|
||||
jmp pchar
|
||||
;
|
||||
pbyte: ;print byte in hex
|
||||
push psw ;save copy for low nibble
|
||||
rar ;rotate high nibble to low
|
||||
rar
|
||||
rar
|
||||
rar
|
||||
ani 0fh ;mask high nibble
|
||||
call pnib
|
||||
pop psw
|
||||
ani 0fh
|
||||
jmp pnib
|
||||
;
|
||||
openfile:
|
||||
mvi c,openf
|
||||
lxi d,fcb
|
||||
call bdos ;open file
|
||||
sta keepa
|
||||
mov a,h
|
||||
cpi 07 ;check password status
|
||||
jz getpasswd ;Reg. H contains '7' if password exists
|
||||
lda keepa
|
||||
cpi 0ffh ;ACC.=FF if there is no file found
|
||||
jz nofile
|
||||
ret
|
||||
;
|
||||
getpasswd:
|
||||
lda tpasswd
|
||||
cpi 255 ;check if already tried password
|
||||
jz wrngpass
|
||||
call space ;set password memory area too blanks
|
||||
lxi d,quest
|
||||
call print ;print question
|
||||
mvi a,8 ;max # of characters able to input
|
||||
sta buf ;for password is eight (8)
|
||||
mvi c,rstring
|
||||
lxi d,buf
|
||||
call bdos ;get password
|
||||
lda buf+1
|
||||
sta len ;store length of password
|
||||
cpi 0
|
||||
jz stop ;if <cr> entered then stop program
|
||||
call cap ;cap the password
|
||||
lxi d,buf+2
|
||||
call setdma
|
||||
mvi a,255
|
||||
sta tpasswd ;set Tried Password Flag
|
||||
mvi a,0
|
||||
jmp openfile
|
||||
;
|
||||
space: ;this routine fills the memory
|
||||
mvi a,8 ;locations from 82-89H with
|
||||
lxi h,buf+2 ;a space
|
||||
space2:
|
||||
mvi m,' ' ;put a (blank) into the memory
|
||||
inx h ;location where HL are pointing
|
||||
dcr a
|
||||
jnz space2
|
||||
ret
|
||||
;
|
||||
cap: ;this routine takes the inputed
|
||||
mvi b,8 ;Password and converts it to
|
||||
lxi h,buf+2 ;upper-case letters
|
||||
cap2:
|
||||
mov a,m ;move into the ACC. where the
|
||||
cpi 'a' ;current HL position points to
|
||||
jc skip ;and if it is a lower-case letter
|
||||
cpi '{' ;make it upper case
|
||||
jnc skip
|
||||
sui 20h
|
||||
mov m,a
|
||||
skip:
|
||||
inx h ;inc the pointer to the next letter
|
||||
dcr b
|
||||
jnz cap2
|
||||
delchar: ;this routine deletes the last
|
||||
lda len ;character in the input because
|
||||
adi 82h ;an extra character is added to
|
||||
sta len2 ;the input when using BDOS function 10
|
||||
lhld len2
|
||||
mvi m,' '
|
||||
ret
|
||||
;
|
||||
fillbuff:
|
||||
lxi d,buff ;current position
|
||||
fillbuff2:
|
||||
sta keepa
|
||||
push d
|
||||
call setdma ;set DMA for file reading
|
||||
call readbuff ;read file and fill BUFF
|
||||
lda norec ;# records read in current loop
|
||||
inr a
|
||||
sta norec
|
||||
cpi 8 ;check if '8' records read in loop
|
||||
jz loop2
|
||||
pop d
|
||||
lxi h,80h ;80h=128(decimal)= # bytes in 1 record read
|
||||
dad d
|
||||
xchg ;changes DMA = DMA+80h
|
||||
jmp fillbuff2
|
||||
;
|
||||
setdma:
|
||||
mvi c,dmaf
|
||||
call bdos ;set DMA
|
||||
ret
|
||||
;
|
||||
readbuff:
|
||||
mvi c,readf
|
||||
lxi d,fcb
|
||||
call bdos ;fill buffer
|
||||
cpi 0 ;ACC. <> 0 if unsuccessful
|
||||
rz ;return if not End Of File
|
||||
lda norec
|
||||
cpi 0 ;this check is needed to see if
|
||||
jz stop ;the record is the first in the
|
||||
mvi a,255 ;loop
|
||||
sta eof ;set End Of File flag
|
||||
jmp loop2 ;no more buff reading
|
||||
;
|
||||
break:
|
||||
push b
|
||||
push d ;see if character ready
|
||||
push h ;if so then quit program
|
||||
mvi c,chkio ;if character is a ^C
|
||||
call bdos ;check console status
|
||||
ora a ;zero flag is set if no character
|
||||
push psw ;save all registers
|
||||
mvi c,conin ;console in function
|
||||
cnz bdos ;eat character if not zero
|
||||
pop psw ;restore all registers
|
||||
pop h
|
||||
pop d
|
||||
pop b
|
||||
ret
|
||||
;
|
||||
paddr:
|
||||
lhld aloc ;current display address
|
||||
mov a,h
|
||||
call pbyte ;high byte
|
||||
mov a,l
|
||||
lhld disloc
|
||||
call pbyte ;low byte
|
||||
mvi a,':'
|
||||
jmp pchar
|
||||
;
|
||||
page$check:
|
||||
lda page$on
|
||||
cpi 0
|
||||
cz page$count ;if page mode on call routine
|
||||
ret
|
||||
;
|
||||
crlf:
|
||||
mvi a,cr
|
||||
call pchar
|
||||
mvi a,lf
|
||||
jmp pchar
|
||||
;
|
||||
blank:
|
||||
mvi a,' '
|
||||
jmp pchar
|
||||
;
|
||||
page$count:
|
||||
lda page$size ;relative to zero
|
||||
mov e,a
|
||||
lda count ;current number of lines
|
||||
cmp e
|
||||
jz stop$display ;if xx lines then stop display
|
||||
inr a
|
||||
sta count ;count=count+1
|
||||
ret
|
||||
;
|
||||
stop$display:
|
||||
mvi a,0
|
||||
sta count ;count=0
|
||||
lxi d,con$mess
|
||||
call print
|
||||
stop$display2:
|
||||
mvi c,input
|
||||
mvi e,0fdh
|
||||
call bdos
|
||||
cpi ctrlc
|
||||
jz stop
|
||||
cpi cr ;compare character with <CR>
|
||||
jnz stop$display2 ;wait until <CR> is encountered
|
||||
mvi a,ctrlx
|
||||
jmp pchar
|
||||
;
|
||||
discom: ;check line format
|
||||
xchg
|
||||
lhld dismax
|
||||
mov a,l
|
||||
sub e
|
||||
mov l,a
|
||||
mov a,h
|
||||
sbb d
|
||||
xchg
|
||||
ret
|
||||
;
|
||||
display:
|
||||
lhld size ;[(norec)x(128)]-1
|
||||
xchg
|
||||
lxi h,buff ;buffer location
|
||||
shld disloc
|
||||
dad d
|
||||
;
|
||||
display2:
|
||||
shld dismax
|
||||
;
|
||||
display3:
|
||||
call page$check
|
||||
call crlf
|
||||
call break
|
||||
jnz stop ;if key pressed then quit
|
||||
lhld disloc
|
||||
shld tdisp
|
||||
call paddr ;print the line address
|
||||
;
|
||||
display4:
|
||||
call blank
|
||||
mov a,m
|
||||
call pbyte ;print byte
|
||||
inx h ;increment the current buffer location
|
||||
push h
|
||||
lhld aloc ;aloc is current address for the display
|
||||
mov a,l
|
||||
ani 0fh
|
||||
cpi 0fh ;check if 16 bytes printed
|
||||
inx h ;increment current display address
|
||||
shld aloc ;save it
|
||||
pop h
|
||||
jnz display4 ;if not then continue
|
||||
;
|
||||
display5:
|
||||
shld disloc ;save the current place
|
||||
lhld tdisp ;load current place - 16
|
||||
xchg
|
||||
call blank
|
||||
call blank
|
||||
;
|
||||
display6:
|
||||
ldax d ;get byte
|
||||
call pgraph ;print if graphic character
|
||||
inx d
|
||||
lhld disloc
|
||||
mov a,l
|
||||
sub e
|
||||
jnz display6
|
||||
mov a,h
|
||||
sub d
|
||||
jnz display6
|
||||
lhld disloc
|
||||
call discom ;end of display ?
|
||||
rc
|
||||
jmp display3
|
||||
;
|
||||
pintro:
|
||||
lxi d,intromess
|
||||
call print
|
||||
ret
|
||||
;
|
||||
setmode: ;this routine allows error codes
|
||||
mvi c,errmode ;to be detected in the ACC. and
|
||||
mvi e,255 ;Reg. H instead of BDOS ERROR
|
||||
call bdos ;Messages
|
||||
mvi c,conmode ;and also sets the console status
|
||||
lxi d,1 ;so that only a ^C can affect
|
||||
call bdos ;function 11
|
||||
ret
|
||||
;
|
||||
check$page:
|
||||
mvi c,getscb ;Get/Set SCB function
|
||||
lxi d,page$mode
|
||||
call bdos
|
||||
cpi 0
|
||||
rnz ;return if mode is off (false)
|
||||
sta page$on ;set 'on' byte
|
||||
mvi c,getscb
|
||||
lxi d,page$len
|
||||
call bdos
|
||||
dcr a
|
||||
sta page$size ;store page length (relative to zero)
|
||||
ret
|
||||
;
|
||||
checkfile:
|
||||
mvi c,fsize
|
||||
lxi d,fcb
|
||||
call bdos
|
||||
lda fcb+33
|
||||
cpi 0
|
||||
rnz
|
||||
lxi d,norecmess
|
||||
call print
|
||||
jmp stop
|
||||
;
|
||||
chngsize: ;if odd number of records read
|
||||
sta keepa ;this routine adds 128 or
|
||||
mvi a,80h ;80h to the display size
|
||||
mov l,a ;because the ACC. cannot deal
|
||||
lda keepa ;with decimals
|
||||
ret
|
||||
;
|
||||
print: ;prints the string where
|
||||
mvi c,pstring ;DE are pointing to
|
||||
call bdos
|
||||
ret
|
||||
;
|
||||
nofile:
|
||||
mvi c,pstring
|
||||
lxi d,nofmess
|
||||
call bdos ;print 'FILE NOT FOUND'
|
||||
jmp stop
|
||||
;
|
||||
wrngpass:
|
||||
lxi d,badpass
|
||||
call print ;print 'False Password'
|
||||
;
|
||||
stop: ;stop program execution
|
||||
mvi c,reset
|
||||
call bdos
|
||||
mvi c,return
|
||||
call bdos
|
||||
;
|
||||
begin:
|
||||
lxi sp,stack
|
||||
call pintro ;print the intro
|
||||
call setmode ;set ERROR mode
|
||||
call check$page ;check console page mode
|
||||
call openfile ;open the file
|
||||
call checkfile ;check if reany records exist
|
||||
;
|
||||
loop:
|
||||
jmp fillbuff ;fill the buffer(s)
|
||||
loop2:
|
||||
mvi l,0 ;set L = 0
|
||||
lda norec ;norec is set by fillbuff routine
|
||||
rar ;(x128) or (/2)
|
||||
cc chngsize ;if odd # records read then call this routine
|
||||
mov h,a
|
||||
dcx h
|
||||
shld size ;number of bytes to display
|
||||
pop d
|
||||
call display ;call display routine
|
||||
lda eof
|
||||
cpi 255
|
||||
jz stop ;jump if End Of File
|
||||
mvi a,0
|
||||
sta norec ;reset # records read to 0
|
||||
jmp loop
|
||||
;
|
||||
;****************************
|
||||
;* Console Messages To User *
|
||||
;****************************
|
||||
intromess: db cr,lf,lf,'CP/M 3 DUMP - Version 3.0$'
|
||||
nofmess: db cr,lf,'ERROR: File Not Found',cr,lf,'$'
|
||||
quest: db cr,lf,'Enter Password: $'
|
||||
badpass: db cr,lf,'Password Error$'
|
||||
norecmess: db cr,lf,'ERROR: No Records Exist$'
|
||||
con$mess: db cr,lf,'Press RETURN to continue $'
|
||||
;
|
||||
;*****************************
|
||||
;* Variable and Storage Area *
|
||||
;*****************************
|
||||
dismax: ds 2 ;Max.# reference
|
||||
tdisp: ds 2 ;Current buffer location (for ASCII)
|
||||
disloc: ds 2 ;Current buffer loocation
|
||||
aloc: dw 0 ;Line address
|
||||
ploc: ds 2 ;Current buffer location storage
|
||||
keepa: ds 2 ;Storage for ACC.
|
||||
norec: db 0 ;# of records read in certain loop (1-8)
|
||||
eof: db 0 ;End Of File flag
|
||||
tpasswd: dw 0 ;Tried Password flag
|
||||
size: dw 0 ;Display size
|
||||
page$mode: db 02ch ;page mode offset relative to SCB
|
||||
db 00h
|
||||
page$len: db 01ch ;page length offset relative to SCB
|
||||
db 00h
|
||||
page$on: db 0ffh ;page ON/OFF flag (0=ON)
|
||||
page$size: db 00h ;page length relative to zero
|
||||
count: db 0 ;line counter
|
||||
len: dw 0 ;Password Input length
|
||||
len2: dw 0 ;Extra character pointer
|
||||
ds 12h
|
||||
stack: ds 2
|
||||
buff: ds 1024 ;The buffer (holds up to 400h = 1k)
|
||||
end:
|
||||
|
||||
Reference in New Issue
Block a user