home *** CD-ROM | disk | FTP | other *** search
/ Transactor / Transactor_22_1988_Transactor_Publishing.d64 / clock-cal.bud < prev    next >
Text File  |  2023-02-26  |  15KB  |  705 lines

  1. ;put"@0:clock-cal.bud
  2. ; ** rewritten in Buddy 128 Format
  3. *=$1300 ; 4864
  4. .obj "@0:clk4864"
  5. ;
  6. ;* * * * * * * * * * * * * * * * *
  7. ;*                               *
  8. ;* clock & calendar display...   *
  9. ;* with audible alarm function   *
  10. ;*                               *
  11. ;* c-128 mode, 40 or 80 columns  *
  12. ;*                               *
  13. ;* written 11-16-85  w.j. brier  *
  14. ;*                               *
  15. ;* revised  6-05-87              *
  16. ;*                               *
  17. ;* copyright 1986                *
  18. ;*                               *
  19. ;* this program is not to be...  *
  20. ;* sold.  it is permissible...   *
  21. ;* to copy it but credit must... *
  22. ;* be given in the documentation *
  23. ;*                               *
  24. ;* see the documentation for...  *
  25. ;* instructions on using this... *
  26. ;* program with your software... *
  27. ;* as well as distribution...    *
  28. ;* limitations.                  *
  29. ;*                               *
  30. ;* * * * * * * * * * * * * * * * *
  31.               ;
  32.               ;
  33. ;* * * * * * * * * * * * * * * * *
  34. ;*                               *
  35. ;*  <<< program assignments >>>  *
  36. ;*                               *
  37. ;* * * * * * * * * * * * * * * * *
  38.               ;
  39.               ;
  40. ;system vectors & pointers...
  41.               ;
  42. dflto  =$9a   ;output device
  43.               ;
  44. mode   =$d7   ;display mode flag
  45.               ;
  46. cinv   =$0314 ;normal irq vector
  47. ibsout =$0326 ;normal chrout vector
  48.               ;
  49. system =$0a00 ;basic reset vector
  50.               ;
  51. rptflg =$0a22 ;keyb'd repeat flag
  52.               ;
  53. basrst =$4003 ;basic warm reset
  54.               ;
  55. tod2   =$dd08 ;time of day clock #2
  56.               ;
  57.               ;
  58. ;screen editor functions...
  59.               ;
  60. wvdcm  =$cdca ;write to 8563 ram
  61. wvdcr  =$cdcc ;write to 8563 register
  62.               ;
  63.               ;
  64. ;kernal functions...
  65.               ;
  66. chrout =$ef79 ;output a byte
  67. irq    =$fa65 ;normal irq
  68. crti   =$ff33 ;irq handler exit
  69.               ;
  70.               ;
  71. ;40 col vic screen ram...
  72.               ;
  73. vcram  =$0400 ;start of display ram
  74. vlram  =$d800 ;start of color ram
  75.               ;
  76.               ;
  77. ;sid chip registers (voice 3)...
  78.               ;
  79. frelo3 =$d40e ;frequency ctrl (lo)
  80. frehi3 =$d40f ;frequency ctrl (hi)
  81.               ;
  82. vcreg3 =$d412 ;control register
  83.               ;
  84. surel3 =$d414 ;sustain/release
  85.               ;
  86. sigvol =$d418 ;sid volume
  87.               ;
  88.               ;
  89. ;80 col 8563 vdc assignments...
  90.               ;
  91. scram1 =72    ;screen ram (time)
  92. scram2 =152   ;screen ram (date)
  93.               ;
  94. atram1 =2120  ;attribute ram (time)
  95. atram2 =2200  ;attribute ram (date)
  96.               ;
  97. upreg  =18    ;update register
  98.               ;
  99.               ;
  100. ;=================================
  101.        ;
  102.        ;
  103. ;user-accessible memory...
  104.        ;
  105. tdta   .asc "  -  -  "
  106.        .byte 0 ; ascii date
  107. toda   .asc "  :  :  "              
  108.        .byte 0 ; ascii time
  109. tdtc   .byte 255, 255, 255  ;bcd date
  110. ;
  111. dflg   .byte 0 ;1 = no display
  112. cflg   .byte 7 ;display color
  113. rflg   .byte 0 ;1 = reverse video
  114.        ;
  115. key    .byte 0, 0, 0, 0
  116.        ;
  117.        ;
  118. ;exit vector...
  119.        ;
  120. irqa   .word irq
  121.        ;
  122.        ;
  123. ;alarm registers...
  124.        ;
  125. altc   .byte 255, 255 ;time (h:m)
  126.        ;
  127. aflg   .byte 255     ;enable flag
  128.        ;
  129. ;---------------------------------
  130.        ;
  131. ;entry point to start display
  132.        ;
  133. clkon  jmp start ;start display
  134.        ;
  135. ;---------------------------------
  136.        ;
  137. ;entry point to stop display
  138.        ;
  139. clkof  jmp stop ;stop display
  140.        ;
  141. ;---------------------------------
  142.        ;
  143. ;bcd time storage
  144.        ;
  145. todc   .byte 0, 0, 0 ;hrs min sec
  146.        ;
  147. ;=================================
  148.        ;
  149. ;stop clock-calendar display
  150.        ;
  151. stop   ldx cinv ;irq vector
  152.        ldy cinv+1
  153.        cpx #<dcc ;display vector
  154.        bne clkof2 ;not running
  155.        ;
  156.        cpy #>dcc
  157.        bne clkof2 ;not running
  158.        ;
  159.        sei ;interrupts off
  160.        ;
  161.        ldx irqa ;original irq vector
  162.        ldy irqa+1
  163.        stx cinv
  164.        sty cinv+1
  165.        ;
  166.        ldx bsouta
  167.        ldy bsouta+1
  168.        stx ibsout ;restore chrout vector
  169.        sty ibsout+1
  170.        ;
  171.        ldx alrst1
  172.        ldy alrst1+1
  173.        stx system ;restore system vector
  174.        sty system+1
  175.        ;
  176.        cli ;interrupts on
  177.        ;
  178.        ldy #3 ;offset
  179.        lda #0
  180.        ;
  181. clkof1 sta key,y ;wipe out id key
  182.        dey
  183.        bpl clkof1 ;loop
  184.        ;
  185. clkof2 rts
  186.        ;
  187. ;---------------------------------
  188.        ;
  189. ;start clock-calendar display
  190.        ;
  191. start  ldx cinv ;irq vector
  192.        ldy cinv+1
  193.        cpx #<dcc
  194.        bne start1 ;change vector
  195.        ;
  196.        cpy #>dcc
  197.        beq start3 ;display is runnning
  198.        ;
  199. start1 stx irqa ;save existing...
  200.        sty irqa+1 ;irq vector
  201.        ;
  202.        sei
  203.        ;
  204.        ldx #<dcc ;change...
  205.        ldy #>dcc ;irq vector so that...
  206.        stx cinv ;clock-calendar runs
  207.        sty cinv+1
  208.        ;
  209.        ldx ibsout ;save current...
  210.        ldy ibsout+1 ;chrout vector
  211.        stx bsouta
  212.        sty bsouta+1
  213.        ;
  214.        ldx #<crdy ;change...
  215.        ldy #>crdy ;chrout vector so...
  216.        stx ibsout ;delay routine...
  217.        sty ibsout+1 ;intercepts it
  218.        ;
  219.        ldx system ;basic reset
  220.        ldy system+1
  221.        stx alrst1 ;store
  222.        sty alrst1+1
  223.        ;
  224.        ldx #<alrst ;alternate reset
  225.        ldy #>alrst
  226.        stx system ;new reset vector
  227.        sty system+1
  228.        ;
  229.        lda tod2 ;give clock a kick...
  230.        sta tod2 ;to get it started
  231.        ;
  232.        cli
  233.        ;
  234.        ldy #3 ;offset
  235.        ;
  236. start2 lda keystr,y ;key
  237.        sta key,y ;enable key
  238.        dey
  239.        bpl start2 ;loop
  240.        ;
  241.        iny
  242.        sty dflg ;clear display flag
  243.        sty lflg ;clear lockout flag
  244.        ;
  245. start3 rts
  246.        ;
  247. ;=================================
  248.        ;
  249. ;update & display time & date
  250.        ;
  251. dcc    cld ;binary mode
  252.        ;
  253.        lda tod2 ;tenths of seconds
  254.        beq dcc02 ;tenths are zero
  255.        ;
  256.        lda #0
  257.        sta lflg ;clear lockout flag
  258.        ;
  259. dcc01  jmp (irqa) ;normal irq
  260.        ;
  261. dcc02  bit lflg
  262.        bmi dcc01 ;update locked out
  263.        ;
  264.        dec lflg ;set lockout flag
  265.        ;
  266.        ;
  267. ;read clock registers...
  268.        ;
  269.        ldx #3 ;tod2 offset
  270.        ldy #0 ;storage offset
  271.        ;
  272. dcc03  lda tod2,x ;fetch time value
  273.        dex
  274.        bmi dcc04 ;finished
  275.        ;
  276.        sta todc,y ;save in buffer
  277.        ;
  278.        iny
  279.        bne dcc03 ;loop
  280.        ;
  281.        ;
  282. ;test am/pm flag & adjust hours
  283.        ;
  284. dcc04  lda todc ;bcd hours
  285.        bmi dcc05 ;it's pm
  286.        ;
  287.        cmp #$12
  288.        bne dcc06 ;not midnite
  289.        ;
  290.        lda #0
  291.        beq dcc06 ;set hours to midnite
  292.        ;
  293. dcc05  and #%01111111 ;mask am/pm bit
  294.        cmp #$12
  295.        bcs dcc06 ;it's noon straight up
  296.        ;
  297.        sed ;decimal mode
  298.        adc #$12 ;change to 24 hours
  299.        cld ;binary mode
  300.        ;
  301. dcc06  sta todc ;converted hours
  302.        ;
  303.        ;
  304. ;test for alarm time...
  305.        ;
  306.        bit aflg ;check flag
  307.        bmi dcc09 ;alarm not enabled
  308.        ;
  309.        ldy #1 ;offset
  310.        ;
  311. dcc07  lda altc,y ;alarm time
  312.        cmp todc,y ;check against tod
  313.        bne dcc09 ;not time
  314.        ;
  315.        dey
  316.        bpl dcc07 ;loop
  317.        ;
  318.        ;
  319. ;sound alarm...
  320.        ;
  321.        lda #15
  322.        sta sigvol ;max volume
  323.        sta frelo3 ;set frequency
  324.        sta frehi3
  325.        ;
  326.        ldx #250 ;duration
  327.        ldy #33 ;sawtooth waveform
  328.        stx surel3 ;sustain/release
  329.        sty vcreg3 ;attack/decay
  330.        ;
  331.        dey
  332.        sty vcreg3 ;gate voice
  333.        ;
  334.        ;
  335. ;test for stroke of midnite...
  336.        ;
  337. dcc09  ldy #2 ;todc offset
  338.        ;
  339. dcc10  lda todc,y ;fetch time value
  340.        bne dcc16 ;not midnite
  341.        ;
  342.        dey
  343.        bpl dcc10 ;loop
  344.        ;
  345.        ;
  346. ;test for leap year...
  347.        ;
  348.        lda tdtc+2 ;current year
  349.        jsr bcdof ;change to binary
  350.        ;
  351.        ldx #$28
  352.        ;
  353.        lsr ;divide by 2
  354.        bcs dcc11 ;odd year
  355.        ;
  356.        lsr ;divide again
  357.        bcs dcc11 ;non-leap year
  358.        ;
  359.        inx ;leap year
  360.        ;
  361. dcc11  stx clut+1 ;last day in feb.
  362.        ;
  363.        ;
  364. ;adjust date for end of month...
  365.        ;
  366.        lda tdtc ;fetch month
  367.        jsr bcdof ;change to binary
  368.        ;
  369.        tax
  370.        dex ;calendar lookup offset
  371.        ;
  372.        lda tdtc+1 ;current day
  373.        cmp clut,x ;last day of month
  374.        bne dcc14 ;not end of month
  375.        ;
  376.        cpx #11
  377.        bne dcc12 ;not december
  378.        ;
  379.        lda tdtc+2 ;current year
  380.        jsr idv ;bump year
  381.        sta tdtc+2 ;save new year
  382.        ;
  383.        lda #1
  384.        bne dcc13 ;set month to january
  385.        ;
  386. dcc12  lda tdtc ;current month
  387.        jsr idv ;bump
  388.        ;
  389. dcc13  sta tdtc ;new month
  390.        ;
  391.        lda #1
  392.        bne dcc15 ;set day to 1st of month
  393.        ;
  394. dcc14  jsr idv ;bump day
  395.        ;
  396. dcc15  sta tdtc+1 ;new day
  397.        ;
  398.        ;
  399. ;decode date for display...
  400.        ;
  401. dcc16  lda tdtc ;current month
  402.        jsr bcdasc ;decode to ascii
  403.        cmp #"0"
  404.        bne dcc17
  405.        ;
  406.        lda #32 ;blank leading zero
  407.        ;
  408. dcc17  sta tdta ;save tens
  409.        stx tdta+1 ;save units
  410.        ;
  411.        lda tdtc+1 ;current day
  412.        jsr bcdasc
  413.        sta tdta+3
  414.        stx tdta+4
  415.        ;
  416.        lda tdtc+2 ;current year
  417.        jsr bcdasc
  418.        sta tdta+6
  419.        stx tdta+7
  420.        ;
  421.        ;
  422. ;decode time for display...
  423.        ;
  424.        lda todc ;hours
  425.        jsr bcdasc
  426.        sta toda
  427.        stx toda+1
  428.        ;
  429.        lda todc+1 ;minutes
  430.        jsr bcdasc
  431.        sta toda+3
  432.        stx toda+4
  433.        ;
  434.        lda todc+2 ;seconds
  435.        jsr bcdasc
  436.        sta toda+6
  437.        stx toda+7
  438.        ;
  439.        ;
  440. ;display time & date...
  441.        ;
  442.        lda dflg
  443.        bne dcc23 ;display inhibited
  444.        ;
  445.        ;
  446. ;display on 40 column screen...
  447.        ;
  448. dcc18  lda cflg ;display color
  449.        ldy #7 ;offset
  450.        ;
  451. dcc19  sta vlram+32,y ;color
  452.        sta vlram+72,y
  453.        dey
  454.        bpl dcc19 ;loop
  455.        ;
  456.        ldx rflg ;normal/reverse flag
  457.        ldy #7 ;offset
  458.        ;
  459. dcc20  lda toda,y ;fetch time
  460.        ;
  461.        cpx #0 ;test reverse flag
  462.        beq dcc21 ;not reversed
  463.        ;
  464.        ora #128 ;reverse
  465.        ;
  466. dcc21  sta vcram+32,y
  467.        ;
  468.        lda tdta,y ;fetch date
  469.        cpx #0
  470.        beq dcc22
  471.        ;
  472.        ora #128
  473.        ;
  474. dcc22  sta vcram+72,y
  475.        ;
  476.        dey
  477.        bpl dcc20
  478.        ;
  479.        ;
  480. ;display on 80 column screen...
  481.        ;
  482.        lda #>scram1 ;address for...
  483.        ldy #<scram1 ;time display
  484.        jsr setram ;set up vdc ram
  485.        ;
  486.        ldx #<toda ;petascii time
  487.        ldy #>toda
  488.        jsr dtod ;display
  489.        ;
  490.        lda #>scram2 ;address for...
  491.        ldy #<scram2 ;date display
  492.        jsr setram
  493.        ;
  494.        ldx #<tdta ;petascii date
  495.        ldy #>tdta
  496.        jsr dtod ;display
  497.        ;
  498.        ;
  499. ;set 80 column attributes...
  500.        ;
  501.        lda #>atram1 ;address for...
  502.        ldy #<atram1 ;time attribute
  503.        jsr setram
  504.        ;
  505.        jsr atrst ;set up attributes
  506.        ;
  507.        lda #>atram2 ;address for...
  508.        ldy #<atram2 ;date attribute
  509.        jsr setram
  510.        ;
  511.        jsr atrst ;set up attributes
  512.        ;
  513.        bit mode
  514.        bpl dcc23 ;40 column mode
  515.        ;
  516.        jmp crti ;bypass rest of irq
  517.        ;
  518. dcc23  jmp (irqa) ;continue irq
  519.        ;
  520. ;=================================
  521.        ;
  522. ;display time or date
  523.        ;
  524. dtod   stx dtod02 ;source address
  525.        sty dtod02+1
  526.        ;
  527.        ldy #0 ;offset
  528.        ;
  529. dtod01 .byte $b9 ;lda llhh,y op-code
  530.        ;
  531. dtod02 *=*+2 ;source address
  532.        ;
  533.        beq atrst3 ;end of string
  534.        ;
  535.        jsr wvdcm ;output to 8563
  536.        iny
  537.        bne dtod01 ;loop
  538.        ;
  539. ;---------------------------------
  540.        ;
  541. ;set up display attributes
  542.        ;
  543. atrst  ldy #8 ;counter
  544.        ;
  545. atrst1 lda cflg ;get color
  546.        ldx rflg
  547.        beq atrst2 ;no reverse display
  548.        ;
  549.        ora #%01000000 ;reverse
  550.        ;
  551. atrst2 jsr wvdcm ;output to 8563
  552.        dey
  553.        bne atrst1 ;loop
  554.        ;
  555. atrst3 rts
  556.        ;
  557. ;---------------------------------
  558.        ;
  559. ;set up vdc ram address
  560.        ;
  561. setram ldx #upreg ;update register
  562.        jsr wvdcr ;write
  563.        inx
  564.        tya ;swap hi byte
  565.        jmp wvdcr
  566.        ;
  567. ;---------------------------------
  568.        ;
  569. ;chrout intercept & trap
  570.        ;
  571. crdy   pha ;save printing char.
  572.        ;
  573.        bit mode
  574.        bpl crdy01 ;in 40 columns
  575.        ;
  576.        lda dflto ;output device
  577.        cmp #3
  578.        bne crdy01 ;not screen
  579.        ;
  580.        lda dflg ;test display flag
  581.        bne crdy01 ;display inhibited
  582.        ;
  583.        dec dflg ;block display
  584.        ;
  585. crdy01 pla ;recover character
  586.        ;
  587.        .byte 32 ;jsr op-code
  588.        ;
  589. bsouta .word chrout ;normal chrout
  590.        ;
  591.        bit dflg
  592.        bpl crdy02 ;no reset needed
  593.        ;
  594.        inc dflg ;clear for display
  595.        ;
  596. crdy02 rts
  597.        ;
  598. ;---------------------------------
  599.        ;
  600. ;convert bcd to petascii
  601.        ;
  602. bcdasc jsr bcdbin ;bcd to binary
  603.        ;
  604.        pha ;save tens value
  605.        ;
  606.        txa ;units value
  607.        ora #48 ;change to petascii
  608.        tax ;hold
  609.        ;
  610.        pla ;fetch tens
  611.        ora #48
  612.        ;
  613.        rts
  614.        ;
  615. ;---------------------------------
  616.        ;
  617. ;bcd digit to 2 binary digits
  618.        ;
  619. bcdbin pha ;save bcd value
  620.        ;
  621.        and #15 ;mask tens nybble
  622.        tax ;units in .x register
  623.        ;
  624.        pla ;fetch bcd value
  625.        ;
  626.        lsr ;shift tens nybble
  627.        lsr  
  628.        lsr  
  629.        lsr  
  630.        ;
  631.        rts
  632.        ;
  633. ;---------------------------------
  634.        ;
  635. ;bcd digit to 1 binary digit
  636.        ;
  637. bcdof  jsr bcdbin ;bcd to binary
  638.        ;
  639.        tay ;tens value
  640.        txa ;units
  641.        ;
  642.        clc
  643.        ;
  644. bcdof1 dey ;counter
  645.        bmi idv01 ;finished
  646.        ;
  647.        adc #10
  648.        bne bcdof1
  649.        ;
  650. ;---------------------------------
  651.        ;
  652. ;increment date value
  653.        ;
  654. idv    sed ;decimal mode
  655.        ;
  656.        clc
  657.        adc #1
  658.        ;
  659.        cld ;binary mode
  660.        ;
  661. idv01  rts
  662.        ;
  663. ;---------------------------------
  664.        ;
  665. ;alternate basic reset
  666.        ;
  667. alrst  jsr start ;restart clock
  668.        ;
  669.        lda #0
  670.        sta rptflg ;repeat off
  671.        ;
  672.        .byte $4c ;jmp llhh op-code
  673.        ;
  674. alrst1 *=*+2 ;reset jump
  675.        ;
  676. ;---------------------------------
  677.        ;
  678. ;calendar lookup table
  679.        ;
  680. clut   .byte $31 ;jan
  681.        .byte $28 ;feb
  682.        .byte $31 ;mar
  683.        .byte $30 ;apr
  684.        .byte $31 ;may
  685.        .byte $30 ;jun
  686.        .byte $31 ;jul
  687.        .byte $31 ;aug
  688.        .byte $30 ;sep
  689.        .byte $31 ;oct
  690.        .byte $30 ;nov
  691.        .byte $31 ;dec
  692.        ;
  693. ;---------------------------------
  694.        ;
  695. ;program storage
  696.        ;
  697. keystr .asc "clk"  
  698.        .byte 0
  699.        ;
  700. lflg   *=*+1  ;display lockout
  701.        ;
  702. ;=================================
  703. .end
  704.