home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
simtel
/
sigm
/
vols200
/
vol287
/
turbo2.lbr
/
TIMEDIF.ASM
< prev
next >
Wrap
Assembly Source File
|
1986-12-17
|
4KB
|
193 lines
;TIMEDIF.ASM v1.10
;12/28/83
;By S. Kluger
;
; the fact that a major bug has not been discovered yet by
; anyone proves the popularity of the program...
;
; This is a module for use with RMAC and can be adapted to
; M80 with minimum effort.
;
; Purpose:
; Evaluate two ASCII character strings in HH:MM:SS format and
; return their difference.
;
; Entry point: TIMDIF
; Externals: STTIME
; ENTIME
; ELAPTM
;
; Input parameters:
; STTIME holds a time string of HH:MM:SS format. STTIME must point
; to the tens hours digit. The time string must be in 24 hour format.
; The time stored there should be the beginning time of an event.
;
; ENTIME holds a string with the same format. The time stored there
; should be the end of an event.
;
; On return, ELAPTM will be filled with the elapsed time in
; hours and minutes and the accumulator will be cleared with the
; ZERO flag SET. If either entry parameter contained an illegal
; quantity, the CARRY flag will be SET and ELAPTM will be undefined.
; NOTE: TIMDIF will not place delimiters into ELAPTM!
;
; Only the first 8 characters of the strings are processed and checked
; for proper range. Be sure to zero the seconds field if not needed!
;
; NOTE:
; If ENTIME is smaller than STTIME, then 24 hours are added to ENTIME.
;
; This routine is intended for application where the event time will
; never be greater than 23:59:59 (RCPM and BBS use mainly).
;
PUBLIC TIMDIF ;entry point
EXTRN STTIME ;start time field
EXTRN ENTIME ;end time field
EXTRN ELAPTM ;elapsed time field
;
cseg
;
; Entry point. All registers meet their doom...
;
timdif: lxi h,sttime ;point to start time
call chform ;check proper format
rc ;return if error
lxi h,entime ;point to end time
call chform ;check that too
rc
;
; The stage is set - let's get down to business...
;
lxi h,sttime+6 ;point to seconds start
call getbin ;get binary
mov d,a ;save it
lxi h,entime+6 ;seconds end
call getbin ;get binary
mvi e,0 ;reset our private borrow flag
sub d ;subtract
jnc skbs ;skip if no borrow
dcr e ;set our borrow flag
adi 60 ;make mod 60
skbs: lxi h,elaptm+7 ;store as result
call stora
;
; Do the same stuff for minutes
;
lxi h,sttime+3 ;minutes start
call getbin ;get binary
mov d,a ;save binary
lxi h,entime+3 ;minutes end
call getbin ;get binary
inr e ;if not borrow...
jnz skbm1 ;then skip...
inr d ;...else add borrowed value
skbm1: mvi e,0 ;make sure borrow flag reset
sub d ;subtract
jnc skbm2 ;skip if no borrow
dcr e ;set borrow
adi 60 ;make mod 60
skbm2: lxi h,elaptm+4 ;store elapsed minutes
call stora
;
; Finally, here go the hours.
;
lxi h,sttime ;hours start
call getbin ;get 'em
mov d,a ;save start hours
lxi h,entime ;hours end
call getbin ;get binary
inr e ;if not borrow...
jnz skbh1 ;...then skip...
inr d ;...else add borrowed hour
skbh1: sub d ;subtract
jnc skbh2 ;jump if no borrow
adi 24 ;else add 24 hours
skbh2: lxi h,elaptm+1 ;save as hours
call stora
xra a ;make sure error is reset
ret ;end of execution, back to caller.
;
; Get the ASCII value at HL as a binary into A
;
getbin: mov a,m ;get tens
ani 0fh ;strip ASCII offset
mov b,a ;save tens
xra a ;set accumulator
mvi c,10 ;set up cheap multiplier
mul: add c
dcr b
jnz mul
mov b,a ;save tens
inx h ;point to units
mov a,m ;get units
ani 0fh ;same treatment
add b ;add the tens
ret
;
; Check format of HH:MM:SS string. Checks all digits for presence
; and validity.
;
chform: mov a,m ;get 10s H
cpi '0'
rc
cpi '3'
cmc
rc
inx h
mov a,m ;get 1s H
call ck10 ;check decimal
rc
inx h ;get colon
mov a,m
cpi ':'
stc
rnz
inx h ;point to 10s M
mov a,m
call ck6 ;check hex
rc
inx h
mov a,m ;1s M
call ck10
rc
inx h
mov a,m ;get delimiter
cpi ':'
stc
rnz
inx h
mov a,m ;get 10s S
call ck6
rc
inx h
mov a,m
ck10: cpi '0'
rc
cpi '9'+1
cmc
ret
;
ck6: cpi '0'
rc
cpi '7'
cmc
ret
;
; Store accumulator as ASCII digits at HL and HL+1
;
stora: mvi b,-1
tlp: inr b
sui 10 ;subtract 10
jnc tlp ;until borrow
adi 10 ;make mod 10
ori '0' ;make ASCII
mov m,a
dcx h
mvi a,'0'
add b
mov m,a
ret
;
end
tor