home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / TURBODSG / TIMEDIF.AQ / TIMEDIF.A
Text File  |  2000-06-30  |  5KB  |  220 lines

  1. ;TIMEDIF.A v1.00
  2. ; ESKAY 02-12-85
  3. ;
  4.     MODULE    "TIMEDIF"
  5. ;
  6. ; Purpose:
  7. ; Evaluate two ASCII character strings in HH:MM:SS format and
  8. ; return their difference.
  9. ;
  10. ; Entry point:    TIMDIF
  11. ; Externals:    STTIME
  12. ;        ENTIME
  13. ;        ELAPTM
  14. ;
  15. ; Input parameters:
  16. ; STTIME holds a time string of HH:MM:SS format. STTIME must point
  17. ; to the tens hours digit. The time string must be in 24 hour format.
  18. ; The time stored there should be the beginning time of an event.
  19. ;
  20. ; ENTIME holds a string with the same format. The time stored there
  21. ; should be the end of an event.
  22. ;
  23. ; On return, ELAPTM will be filled with the elapsed time in
  24. ; hours and minutes and the accumulator will be cleared with the
  25. ; ZERO flag SET. If either entry parameter contained an illegal
  26. ; quantity, the CARRY flag will be SET and ELAPTM will be undefined.
  27. ; NOTE: TIMDIF will not place delimiters into ELAPTM!
  28. ;
  29. ; Only the first 8 characters of the strings are processed and checked
  30. ; for proper range. Be sure to zero the seconds field if not needed!
  31. ;
  32. ; NOTE:
  33. ; If ENTIME is smaller than STTIME, then 24 hours are added to ENTIME.
  34. ;
  35. ; This routine is intended for application where the event time will
  36. ; never be greater than 23:59:59 (RCPM and BBS use mainly).
  37. ;
  38.     LOC    Code#
  39. ;
  40. ; Entry point. All registers meet their doom...
  41. ;
  42. TIMDIF::
  43.     MOV    BX,&STTIME#    ;POINT TO START TIME
  44.     CALL    CHFORM        ;CHECK PROPER FORMAT
  45.     JNC    __X        ;RETURN IF ERROR
  46.     RET
  47. ;
  48. __X:    MOV    BX,&ENTIME#    ;POINT TO END TIME
  49.     CALL    CHFORM        ;CHECK THAT TOO
  50.     JNC    __Y
  51.     RET
  52. ;
  53. ; The stage is set - let's get down to business...
  54. ;
  55. __Y:    MOV    BX,&STTIME#+6    ;POINT TO SECONDS START
  56.     CALL    GETBIN        ;GET BINARY
  57.     MOV    DH,AL        ;SAVE IT
  58.     MOV    BX,&ENTIME#+6    ;SECONDS END
  59.     CALL    GETBIN        ;GET BINARY
  60.     MOV    DL,=0        ;RESET OUR PRIVATE BORROW FLAG
  61.     SUB    AL,DH        ;SUBTRACT
  62.     JC    __Z        ;SKIP IF NO BORROW
  63.     JMP    SKBS
  64. ;
  65. __Z:    DEC    DL        ;SET OUR BORROW FLAG
  66.     ADD    AL,=60        ;MAKE MOD 60
  67. SKBS:    MOV    BX,&ELAPTM#+7    ;STORE AS RESULT
  68.     CALL    STORA
  69. ;
  70. ; Do the same stuff for minutes
  71. ;
  72.     MOV    BX,&STTIME#+3    ;MINUTES START
  73.     CALL    GETBIN        ;GET BINARY
  74.     MOV    DH,AL        ;SAVE BINARY
  75.     MOV    BX,&ENTIME#+3    ;MINUTES END
  76.     CALL    GETBIN        ;GET BINARY
  77.     INC    DL        ;IF NOT BORROW...
  78.     JZ    __X            ;THEN SKIP...
  79.     JMP    SKBM1
  80. ;
  81. __X:    INC    DH        ;...ELSE ADD BORROWED VALUE
  82. SKBM1:    MOV    DL,=0        ;MAKE SURE BORROW FLAG RESET
  83.     SUB    AL,DH        ;SUBTRACT
  84.     JC    __X        ;SKIP IF NO BORROW
  85.     JMP    SKBM2
  86. ;
  87. __X:    DEC    DL        ;SET BORROW
  88.     ADD    AL,=60        ;MAKE MOD 60
  89. SKBM2:    MOV    BX,&ELAPTM#+4    ;STORE ELAPSED MINUTES
  90.     CALL    STORA
  91. ;
  92. ; Finally, here go the hours.
  93. ;
  94.     MOV    BX,&STTIME#    ;HOURS START
  95.     CALL    GETBIN        ;GET 'EM
  96.     MOV    DH,AL        ;SAVE START HOURS
  97.     MOV    BX,&ENTIME#    ;HOURS END
  98.     CALL    GETBIN        ;GET BINARY
  99.     INC    DL        ;IF NOT BORROW...
  100.     JZ    __X            ;...THEN SKIP...
  101.     JMP    SKBH1
  102. ;
  103. __X:    INC    DH        ;...ELSE ADD BORROWED HOUR
  104. SKBH1:    SUB    AL,DH        ;SUBTRACT
  105.     JC    __X        ;JUMP IF NO BORROW
  106.     JMP    SKBH2
  107. ;
  108. __X:    ADD    AL,=24        ;ELSE ADD 24 HOURS
  109. SKBH2:    MOV    BX,&ELAPTM#+1    ;SAVE AS HOURS
  110.     CALL    STORA
  111.     XOR    AL,AL        ;MAKE SURE ERROR IS RESET
  112.     RET            ;END OF EXECUTION, BACK TO CALLER.
  113. ;
  114. ; Get the ASCII value at HL as a binary into A
  115. ;
  116. GETBIN:    MOV    AL,[BX]        ;GET TENS
  117.     AND    AL,=0X0F    ;STRIP ASCII OFFSET
  118.     MOV    CH,AL        ;SAVE TENS
  119.     XOR    AL,AL        ;SET ACCUMULATOR
  120.     MOV    CL,=10        ;SET UP CHEAP MULTIPLIER
  121. MUL:    ADD    AL,CL
  122.     DEC    CH
  123.     JZ    __X
  124.     JMP    MUL
  125. ;
  126. __X:    MOV    CH,AL        ;SAVE TENS
  127.     INC    BX        ;POINT TO UNITS
  128.     MOV    AL,[BX]        ;GET UNITS
  129.     AND    AL,=0X0F        ;SAME TREATMENT
  130.     ADD    AL,CH        ;ADD THE TENS
  131.     RET
  132. ;
  133. ; Check format of HH:MM:SS string. Checks all digits for presence
  134. ; and validity.
  135. ;
  136. CHFORM:    MOV    AL,[BX]        ;GET 10S H
  137.     CMP    AL,='0'
  138.     JNC    __X
  139.     RET
  140. ;
  141. __X:    CMP    AL,='3'
  142.     CMC    
  143.     JNC    __Y
  144.     RET
  145. ;
  146. __Y:    INC    BX
  147.     MOV    AL,[BX]        ;GET 1S H
  148.     CALL    CK10        ;CHECK DECIMAL
  149.     JNC    __Z
  150.     RET
  151. ;
  152. __Z:    INC    BX        ;GET COLON
  153.     MOV    AL,[BX]
  154.     CMP    AL,=':'
  155.     STC    
  156.     JZ    __A
  157.     RET
  158. ;
  159. __A:    INC    BX        ;POINT TO 10S M
  160.     MOV    AL,[BX]
  161.     CALL    CK6        ;CHECK HEX
  162.     JNC    __B
  163.     RET
  164. ;
  165. __B:    INC    BX
  166.     MOV    AL,[BX]        ;1S M
  167.     CALL    CK10
  168.     JNC    __C
  169.     RET
  170. ;
  171. __C:    INC    BX
  172.     MOV    AL,[BX]        ;GET DELIMITER
  173.     CMP    AL,=':'
  174.     STC    
  175.     JZ    __D
  176.     RET
  177. ;
  178. __D:    INC    BX
  179.     MOV    AL,[BX]        ;GET 10S S
  180.     CALL    CK6
  181.     JNC    __E
  182.     RET
  183. ;
  184. __E:    INC    BX
  185.     MOV    AL,[BX]
  186. CK10:    CMP    AL,='0'
  187.     JNC    __X
  188.     RET
  189. ;
  190. __X:    CMP    AL,='9'+1
  191.     CMC    
  192.     RET
  193. ;
  194. CK6:    CMP    AL,='0'
  195.     JNC    __X
  196.     RET
  197. ;
  198. __X:    CMP    AL,='7'
  199.     CMC    
  200.     RET
  201. ;
  202. ; Store accumulator as ASCII digits at HL and HL+1
  203. ;
  204. STORA:    MOV    CH,=-1
  205. TLP:    INC    CH
  206.     SUB    AL,=10        ;SUBTRACT 10
  207.     JC    __X        ;UNTIL BORROW
  208.     JMP    TLP
  209. ;
  210. __X:    ADD    AL,=10        ;MAKE MOD 10
  211.     OR    AL,='0'        ;MAKE ASCII
  212.     MOV    [BX],AL
  213.     DEC    BX
  214.     MOV    AL,='0'
  215.     ADD    AL,CH
  216.     MOV    [BX],AL
  217.     RET
  218. ;
  219.     END
  220.