;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