home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
beehive
/
zcat
/
timestmp.lbr
/
TIMESTMP.MQC
/
TIMESTMP.MAC
Wrap
Text File
|
1991-01-31
|
8KB
|
375 lines
Title Time stamp VERS:- 00.02 DATE:- 08/01/82 TIME:- 01:35:45
;************************************************************
;*
;* File Tracking Program
;* by Eric Forbes
;* c/o Mississauga, Ont. Canada RCP/M System
;* (416) 826-5394
;*
;************************************************************
;Copyright (c) 1982, E. Forbes; permission granted to use,
;copy and distribute for non-commercial purposes.
;QUICK VIEW: Increment version and insert date and time each
; time a file is assembled / edited. See top line
;To use the 'DATE:- ' and 'TIME:- ' functions, this program
;expects to find three consecutive bytes at MONTH and HOUR,
;in BCD format. E.G. to print the date 07/31/82, the bytes
;07H 31H 82H should be available at HOUR, HOUR+1 and HOUR+2
;If you do not have a clock ignore the 'month' and 'hour'
;equates. They are both read only and will only be read if
;'DATE:- ' or 'TIME:- ' is found in the 1st record of the file
;See TIMESTMP.DOC for further deatails
false equ 0
true equ not false
stdaln equ true ;True means this will stand alone.
;False means the program will be
;patched to the end of an assembler or editor. Then, after
;updating the version, date and time, the assembler or
;editor will act upon the updated file.
month equ 0feadh ;month byte in bios
hour equ month+3 ;hour byte in bios
base equ 0 ;standard CP/M
recsiz equ 128 ;record length
cr equ 0dh
lf equ 0ah
bell equ 7
bdos equ base+5
tail equ base+80h ;command line
if not stdaln ;if not stand alone
endasm equ 4580h ;address to jump to at the end of
;assembler, also org of this program
oldjmp equ 3EFDh ;used to restore the jump at the
;start of the assembler
jmpadd equ 0103h ;address of the JP (C3h) used to get
;to this program
assemb equ 0100h ;address to return to when finished
;updating the file
endif ;if not stand alone
if stdaln ;if stand alone
endasm equ base+100h ;org if stand alone
fcb equ base+5ch ;use default fcb
endif ;if stand alone
.z80
aseg
org endasm ;end of assembler
;BC = Count of characters in command line tail.
;DE = File control block.
;Hl = Command line tail.
start: ld de,crlf
ld c,9 ;new line
call bdos
if not stdaln ;if not stand alone
;All these contortions are needed to keep the input command
;line exactly as the assembler expects to find it
ld hl,tail ;move & format source file
ld b,0 ;name to fcb
ld c,(hl) ;count of characters
inc hl ;HL --> 1st character in tail
ld a,'=' ;look for the '=' in front
cpir ;of the source file
cmder: ld de,cmderr ;no '=' is a command error
jp po,error
ld de,fcb ;DE --> 1st position of FCB
inc hl ;HL --> 2nd char after '='
ld a,':' ;see if 'd:' given
cp (hl) ;Z set if found
dec hl ;HL --> 1st char after '='
jr nz,start1 ;jump - no drive given
ld a,(hl) ;get drive A, B, C, D, etc
and 0fh ;convert A to 01 etc
ld (de),a ;put in fcb
cpi ;inc hl dec bc
jp po,cmder ;command line too short
cpi ;HL --> past drive & ':'
jp po,cmder ;command line too short
start1: inc de ;DE --> file name
st1a: ld a,(hl)
cp ' ' ;transfer file name til ' '
jr z,start2
cp '.' ;ignore '.' if ext given
jr z,stext ;don't put '.' in fcb
ldi ;ld in fcb inc hl & de dec bc
jp po,start3 ;jump if end of tail
jr st1a
stext: ld de,ext ;DE --> file extention
cpi ;inc hl dec bc
jp po,start3 ;jump if end of tail
jr st1a
start2: ld a,' ' ;look for the space
cpir ;before option
jp po,start3 ;no ' '= no option
ld a,(hl)
ld (major),a ;save the option
ld hl,tail ;dec the char count if
dec (hl) ;option used, in case the
dec (hl) ;assembler needs it.
endif ;if not stand alone
if stdaln ;if stand alone
ld a,(base+6dh) ;get option ' ' or 'M'
ld (major),a ;save it
ld bc,3
ld de,fcb+9 ;set up to
ld hl,ext ;make default ext 'MAC'
ld a,(de)
cp ' ' ;jump if ext not ' '
jr nz,start3
ldir ;ext = 'MAC'
endif ;if stand alone
start3: ld de,fcb ;open input file
ld c,15
call bdos
ld de,nofile ;report if can't open and
inc a ;exit to CP/M
jp z,error
ld de,buff
ld c,26 ;setdma
call bdos
ld de,fcb
ld c,20 ;read record 1
call bdos
ld de,verstx
call find ;update version
ld de,novers
call nz,print
call z,versn
ld de,datetx
call find ;update date
ld de,nodate
call nz,print
call z,date
ld de,timetx
call find ;update time
ld de,notime
call nz,print
call z,time
;write record back into file and exit to assembler or CP/M
;The file is not closed, 'cos that would reduce it to a
;single record.
xor a
ld (fcb+32),a ;zero the record count
ld de,fcb
ld c,21
call bdos
ld de,donmsg
error: call print ;print error message and exit.
;also normal exit
if not stdaln ;if not stand alone
;Restore the assembler to original condition and jump to it
ld hl,oldjmp ;restore value in hl
ld (jmpadd+1),hl ;restore old jump address
jp assemb ;jump to the assembler
endif ;if not stand alone
if stdaln ;if stand alone
ret ;back to CP/M
endif ;if stand alone
print: push af
ld c,9
call bdos
ld hl,fcb+1
ld de,prtnam
ld bc,11
ldir
ld de,prtfil
ld c,9
call bdos ;print file name
pop af
ret
;Increment the version number
versn: inc hl ;hl --> units of major change
ld a,(major) ;is a major change requested
cp 'M'
call z,twoinc ;inc major change number
jr z,zeromn ;zero minor change number
cp 'N' ;do not change version if
ret z ;'n' option given
inc hl
inc hl
inc hl ;hl --> units of vers no.
twoinc: push af ;increment a 2 digit field
push hl
ld b,2
ld a,'9'+1 ;hl --> units position
two1: inc (hl)
cp (hl)
jr nz,twox ;exit if not > 9 ascii
ld (hl),'0' ;else zero the units
dec hl ;and inc the tens
djnz two1
twox: pop hl
pop af
ret
zeromn: inc hl ;zero minor version
inc hl
ld (hl),'0' ;used when major changes
inc hl
ld (hl),'0'
ret
date: ld de,month ;insert m/d/y
ld b,2
date1: call unpack
ld (hl),'/'
inc hl
djnz date1
call unpack
ret
time: ld de,hour
ld b,2
time1: call unpack ;insert h:m:s
ld (hl),':'
inc hl
djnz time1
call unpack
ret
;find the first character of string in de (V, D or T)
find: ld hl,buff ;de = compare string
ld bc,recsiz ;limit search to 1 rec
trynxt: ld a,(de) ;get 1st char to find
cpir
ret po ;ret nz set = not found
;see if the rest of the string compares equal. Retry til we
;get to the end of the buffer
push bc
push de
ld b,6 ;compare next 6 chars
find2: inc de
ld a,(de)
cp (hl)
jr nz,tryagn ;try for another string
inc hl
djnz find2 ;keep comparing til b = 0
pop de
pop bc
ret ;ret with z set
tryagn: pop de ;Found the 1st character, but
pop bc ;there was a bad compare in
jr trynxt ;the next 6 characters.
unpack: ld a,(de) ;unpack the BCD time & date
inc de ;and put the ASCII characters
push af ;in the buffer.
rrca
rrca
rrca ;move high nibble to low
rrca
call unpak1
pop af ;do the low nibble
unpak1: and 0fh
add a,'0' ;make it an ASCII number
ld (hl),a
inc hl
ret
if not stdaln ;if not stand alone
cmderr: db bell,'++ Command error ++',cr,lf,lf
db 'e.g. datstamp d:obj.ext,d:lst.ext=d:xxx.mac m',cr,lf,lf
db '"datstamp =xxx" is mandatory, the rest are optional',cr,lf,lf
db 'M increments the major and zeros the minor version numbers',cr,lf,lf
db 'N leaves the version numbers unchanged',cr,lf,lf
db 'File was$'
endif ;if not stand alone
donmsg: db '++ Date stamped$'
nofile: db '++ No source$'
novers: db '++ No '
verstx: db 'VERS:- '
db 'in$'
nodate: db '++ No '
datetx: db 'DATE:- '
db 'in$'
notime: db '++ No '
timetx: db 'TIME:- '
db 'in$'
crlf: db cr,lf,'$'
major: db 0
if not stdaln ;if not stand alone
fcb: db 0,' ' ;file cotrol block
endif ;if not stand alone
ext: db 'MAC'
if not stdaln ;if not stand alone
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
endif ;if not stand alone
buff: ds recsiz
prtfil: db ' File:- '
prtnam: db ' ',cr,lf,lf,'$'
end