home *** CD-ROM | disk | FTP | other *** search
/ Transactor / Transactor_23_1988_Transactor_Publishing.d64 / source.ez < prev    next >
Text File  |  2023-02-26  |  5KB  |  160 lines

  1. *****************************
  2. *                           *
  3. *   THIS ROUTINE IS ADDED   *
  4. *   TO THE NORMAL IRQ       *
  5. *   TO RESET THE SYSTEM     *
  6. *   CLOCK (TI AND TI$) TO   *
  7. *   THE TIME-OF-DAY CLOCK   *
  8. *   IN CIA #1.              *
  9. *                           *
  10. *   THE TI/TI$ CLOCK IS     *
  11. *   SUBJECT TO ACCUMULATED  *
  12. *   ERRORS, ESPECIALLY      *
  13. *   DURING DISK AND TAPE    *
  14. *   ACCESS.  THE TOD CLOCK  *
  15. *   ACCURACY IS MAINTAINED  *
  16. *   BY THE POWER LINE       *
  17. *   FREQUENCY.              *
  18. *                           *
  19. *   THIS ROUTINE SETS THE   *
  20. *   TI/TI$ CLOCK = TO THE   *
  21. *   TOD CLOCK ON THE TOD    *
  22. *   HOUR (MINUTES AND       *
  23. *   SECONDS ALL = ZERO).    *
  24. *                           *
  25. *   NOEL NYMAN   8/87       *
  26. *                           *
  27. *****************************
  28.  
  29.  
  30.  
  31. TI      =      $A0        ;FIRST BYTE OF TI
  32.  
  33. TEMP1   =      $FB        ;TEMPORARY STORAGE, ORIGINAL VALUE UNCHANGED
  34. TEMP2   =      $FC        ;TEMPORARY STORAGE, ORIGINAL VALUE UNCHANGED
  35.  
  36. IRQVEC  =      $0314      ;ADDRESS OF IRQ VECTOR
  37.  
  38. HOURS   =      $DC0B      ;CIA #1 HOURS REGISTER
  39. MINUTES =      $DC0A      ;CIA #1 MINUTES REGISTER
  40. SECONDS =      $DC09      ;CIA #1 SECONDS REGISTER
  41. TENTHS  =      $DC08      ;CIA #1 TENTHS SEC REGISTER
  42.  
  43. ; ROUTINE CAN BE PLACED AT ANY CONVENIENT
  44. ; LOCATION.
  45.  
  46.        ORG     $C000
  47.  
  48. ; GET THE CURRENT IRQ VECTOR AND STORE IT IN
  49. ; 'HOLDIRQ.'  PLACE THE VECTOR TO THE ADDED
  50. ; CODE AT THE IRQ VECTOR ADDRESS.
  51.  
  52. START  SEI
  53.        LDA     IRQVEC
  54.        STA     HOLDIRQ
  55.        LDA     IRQVEC+1
  56.        STA     HOLDIRQ+1
  57.        LDA     #<NEWIRQ
  58.        STA     IRQVEC
  59.        LDA     #>NEWIRQ
  60.        STA     IRQVEC+1
  61.        CLI
  62.        RTS
  63.  
  64.  
  65. HOLDIRQ  HEX   00,00
  66.  
  67. ;CODE ADDED TO IRQ ROUTINE
  68. ;STARTS HERE
  69.  
  70. NEWIRQ LDA     TEMP1      ;STORE CURRENT VALUES OF
  71.        PHA                ;TEMP1 AND TEMP2 ON STACK
  72.        LDA     TEMP2      ;SO WE CAN RESTORE THEM IN CASE
  73.        PHA                ;THE INTERRUPTED APPLICATION USES THEM
  74.  
  75.  
  76.        LDA     HOURS      ;READING THE HOURS REGISTER
  77.        STA     TEMP1      ;HALTS THE CLOCK, WE STORE
  78.                           ;THE VALUE IN TEMP1, JUST
  79.                           ;IN CASE IT'S TIME TO
  80.                           ;USE IT
  81.  
  82.  
  83.        LDA     MINUTES    ;CHECK FOR MINUTES = ZERO
  84.        BNE     EXIT       ;IF NOT ZERO, NOT TIME TO UPDATE
  85.  
  86.        LDA     SECONDS    ;CHECK FOR ZERO SECONDS
  87.        BNE     EXIT       ;AND SKIP UPDATE IF NOT ZERO
  88.  
  89.        LDA     TENTHS     ;CHECK FOR ZERO TENTHS OF A SECOND
  90.        BNE     EXIT       ;AND SKIP UPDATE OF NOT ZERO
  91.  
  92. ; THE UPDATE ROUTINE CONVERTS THE
  93. ; VALUE IN THE HOURS REGISTER
  94. ; FROM BCD/AM-PM FORMAT INTO
  95. ; A BINARY NUMBER IN THE RANGE
  96. ; 0-25, WHERE 0 OR 12 EQUALS 12AM,
  97. ; 1=1AM, 13=1PM, AND 25=NOON.
  98. ; THE CONVERTED NUMBER IS USED AS AN
  99. ; INDEX TO A TABLE TO STORE THE
  100. ; PROPER VALUES IN THE THREE BYTES
  101. ; OF TI.
  102.  
  103.  
  104.        LDA     TEMP1      ;HOURS REGISTER VALUE
  105.        AND     #$0F       ;MASK OUT UPPER BCD DIGIT, AM-PM
  106.        STA     TEMP2      ;STORE LOWER HOURS DIGIT
  107.        LDA     TEMP1      ;GET HOURS VALUE AGAIN
  108.        AND     #$10       ;MASK OUT ALL BUT THE UPPER
  109.                           ;BCD DIGIT.  THIS CAN ONLY BE
  110.                           ;ZERO OR ONE.
  111.        BEQ     SKIPTEN    ;IF ZERO, DON'T ADD 10 TO TEMP2
  112.        CLC
  113.        LDA     #$0A       ;IF HIGH HOURS DIGIT WAS ONE,
  114.        ADC     TEMP2      ;ADD 10 TO TEMP2
  115.        STA     TEMP2
  116.  
  117. SKIPTEN LDA    TEMP1      ;GET HOURS VALUE AGAIN
  118.        BPL     SKIPAP     ;IF HIGH BIT CLEAR
  119.                           ;TIME IS AM, SKIP THE ROUTINE
  120.                           ;THAT ADDS 12 FOR PM TIMES
  121.        CLC
  122.        LDA     #$0C       ;ADD 12 TO TEMP2
  123.        ADC     TEMP2      ;IF TIME IS PM
  124.        STA     TEMP2
  125.  
  126. SKIPAP LDY     TEMP2      ;PUT INDEX TO TABLE IN Y
  127.        LDA     TABLE1,Y   ;GET VALUES FROM
  128.        STA     TI         ;THREE TABLES
  129.        LDA     TABLE2,Y   ;AND STORE IN THE
  130.        STA     TI+1       ;THREE BYTES
  131.        LDA     TABLE3,Y   ;OF TI
  132.        STA     TI+2
  133.  
  134.                                         ; RESTART DISPLAY,
  135. ; RESTORE THE PREVIOUS VALUES IN
  136. ; TEMP1 AND TEMP2, AND JUMP
  137. ; THROUGH THE STORED IRQ VECTOR TO
  138. ; COMPLETE THE IRQ ROUTINE.
  139.  
  140. EXIT   LDA     TENTHS     ;READ TENTHS TO RESTART DISPLAY
  141.        PLA
  142.        STA     TEMP2
  143.        PLA
  144.        STA     TEMP1
  145.        JMP     (HOLDIRQ)
  146.  
  147.  
  148. ; THE FOLLOWING THREE TABLES HOLD THE VALUES NORMALLY
  149. ; FOUND IN THE THREE BYTES OF TI AT THE 'TOP' OF EACH HOUR.
  150.  
  151. TABLE1 HEX     00,03,06,09,0D,10,13,17,1A,1D,20,24
  152.        HEX     00,2A,2E,31,34,38,3B,3E,41,45,48,4B,27
  153.  
  154. TABLE2 HEX     00,4B,97,E3,2F,7A,C6,12,5E,A9,F5,41
  155.        HEX     00,D8,24,70,BC,07,53,9F,EB,36,82,CE,8D
  156.  
  157. TABLE3 HEX     00,C0,80,40,00,C0,80,40,00,C0,80,40
  158.        HEX     00,C0,80,40,00,C0,80,40,00,C0,80,40,00
  159.  
  160.