home *** CD-ROM | disk | FTP | other *** search
/ World of A1200 / World_Of_A1200.iso / programs / develop / as65 / demo / s1 / uhr.asm < prev    next >
Assembly Source File  |  1995-02-27  |  12KB  |  482 lines

  1. ;**************************************************************************
  2. ;
  3. ; Filename : UHR.ASM
  4. ; ------------------
  5. ;
  6. ; (c) 1990 by Thomas Lehmann
  7. ;
  8. ;
  9. ; Jackophone V5.00
  10. ;
  11. ;
  12. ; Uhr mit automatischer Sommer/Winterzeit und Schaltjahrerkennung
  13. ;
  14. ;**************************************************************************
  15.  
  16.  
  17. MODUL_START    set    *    ; Größe des Moduls berechnen
  18.  
  19.  
  20.  
  21. ; =========================================================================
  22. ;
  23. ; Funktion    : Notbetrieb der Uhr wenn Impuls der PIA nicht vorhanden
  24. ;    : rechte LED blinkt in "Uhr stellen" Taste
  25. ;
  26. ; Eingang    : zyklisch von Hauptprogrammschleife
  27. ;
  28. ; Ausgang    : Sekunden Impuls erzeugt wenn Notbetrieb eingeschaltet
  29. ;
  30. ; Register    : Accu
  31. ;
  32. ; (c) by Thomas Lehmann Mai 1990
  33. ;
  34. ; =========================================================================
  35.  
  36. uhr_notbetr    lda struct_tim+UHRNOT_TIM_O    ; Timerwert laden
  37.     bne uhr_not_end    ; Sekunde nicht erreicht, Ende
  38.  
  39.     if GEBTEST
  40.     ?inc16 geb_cnt    ; Gebührenimpuls simulieren
  41.     smb GEB_IMP,hgeb_stat    ; Impuls wurde erkannt
  42.     endif
  43.  
  44.     lda #100    ; 99=5 Min in 16Std falsch, Timer aufziehen
  45.     sta struct_tim+UHRNOT_TIM_O
  46.  
  47.     ldy #LD_R|LD_OFF    ; LED Wert laden
  48.     lda #KEY_UHR    ; Tastenwert der UHR stellen Taste laden
  49.     bbs UHR_NOT,allg_stat,uhr_not_1    ; Uhr Impuls wird erkannt
  50.  
  51.     inc sekunde    ; Sekundenimpuls erzeugen
  52.     ldy #LD_R|LD_T    ; LED Wert laden
  53.  
  54. uhr_not_1    rmb UHR_NOT,allg_stat    ; wird wenn Uhr läuft wieder gesetzt
  55.     jmp set_prgled    ; alle zum Tastenwert gehörenden LED`s aus
  56.  
  57. uhr_not_end    rts
  58.  
  59.  
  60. ; =========================================================================
  61. ;
  62. ; Funktion    : Uhr nachtriggern
  63. ;
  64. ;    : der Uhrbuffer hat folgenden Aufbau:
  65. ;    : -----------------------------------
  66. ;    : Wochentag, Jahr, Monat, Tag, Stunde, Minute, Sekunde
  67. ;
  68. ;
  69. ; Eingang    : zyklisch von Hauptprogrammschleife
  70. ;
  71. ; Ausgang    : Uhrzeit und Datum wenn Sekunde erreicht weiterschalten
  72. ;
  73. ; Register    : Accu, X, Y
  74. ;
  75. ; (c) by Thomas Lehmann Feb. 1990
  76. ;
  77. ; =========================================================================
  78.  
  79. WTAG    equ    0    ; Position des Wochentags im Buffer
  80. JAHR    equ    1    ; dito, Jahr
  81. MON    equ    2    ; dito, Monat
  82. TAG    equ    3    ; dito, Tag
  83. STD    equ    4    ; dito, Stunde
  84. MIN    equ    5    ; dito, Minute
  85. SEK    equ    6    ; dito, Sekunde
  86.  
  87.  
  88. uhr_trigger    lda sekunde    ; Sekunde erreicht ?
  89.     and #%00111111    ; BIT`s für Uhrstatus ausblenden
  90.     beq uhr_end    ; nein, Uhr nicht nachtriggern
  91.  
  92.     bbs 6,sekunde,uhr_inc_01 ; Umschaltung bereits erfolgt
  93.     jsr sw_umsch    ; Sommer/Winterzeit Umschaltung testen
  94.  
  95. uhr_inc_01    rmb 7,sekunde    ; Uhr neu ausgeben
  96.     dec sekunde    ; anstehende Sekunden-1
  97.     ldx #UHR_BULA-1    ; Offset auf Uhrbuffer laden, (Sekunde)
  98.     inc uhr_buff,x    ; Sekunde+1
  99.  
  100. uhr_inc    lda uhr_buff,x    ; aktuellen Wert laden
  101.     cmp uhr_tab_e,x    ; Endwert erreicht ?
  102.     bcs uhr_ueberl    ; ja, Überlauf
  103.  
  104.     dex        ; alle Werte getestet ?
  105.     bpl uhr_inc    ; nein
  106.  
  107.     jmp term_tst    ; erreichte Termine prüfen und eintragen
  108. uhr_end    rts
  109.  
  110.  
  111.     ; Endwert eines Uhrwertes erreicht
  112.     ; --------------------------------
  113.     ; Wochentag, Jahr, Monat, Tag, Stunde, Minute, Sekunde
  114.  
  115.     ; Stunde erreicht ?
  116.     ; -----------------
  117. uhr_ueberl    cpx #STD    ; überlauf Stunde ?
  118.     bne uhr_u_1    ; nein, Tag testen
  119.     inc uhr_buff+WTAG    ; Wochentag nachführen
  120.  
  121.     ; Tag erreicht ?
  122.     ; --------------
  123. uhr_u_1    cpx #TAG    ; Überlauf Tag ?
  124.     bne uhr_u_2    ; nein, Monat testen
  125.  
  126.     ldy uhr_buff+MON    ; Monat laden
  127.     dey        ; Offset auf Tage/Monat Tabelle
  128.     cmp tag_mon_tab,y    ; Ist Tag im Monat erreicht ?
  129.     bcc uhr_u_5    ; nein, Tag so belassen
  130.  
  131.  
  132.     ; Februar, Schaltjahr und Jahrhundert testen
  133.     ; ------------------------------------------
  134.     tay        ; Tag merken
  135.     lda uhr_buff+MON    ; Monat laden
  136.     cmp #02        ; ist es Februar ?
  137.     bne uhr_u_4    ; nein, Startwert schalten
  138.  
  139.     lda uhr_buff+JAHR    ; Jahr laden
  140.     beq uhr_u_3    ; es ist ein Jahrhundert
  141.  
  142.     and #$03    ; ist es ein Schaltjahr ?
  143.     bne uhr_u_4    ; nein, Startwert schalten
  144.  
  145. uhr_u_3    cpy #30        ; Februar hat 29 Tage im Schaltjahr
  146.     bcs uhr_u_4    ; Tag nicht mehr zugelassen, Startwert schalten
  147.  
  148.  
  149.     ; Tag so belassen
  150.     ; ---------------
  151. uhr_u_5    dex        ; nächsten Eintrag einstellen
  152.     bra uhr_inc    ; nächsten Eintrag testen
  153.  
  154.  
  155.     ; Monat erreicht ?
  156.     ; ----------------
  157. uhr_u_2    cpx #MON    ; Überlauf Monat ?
  158.     bne uhr_u_4    ; nein
  159.  
  160.     rmb 6,sekunde    ; Sommer/Winterzeit wieder testen
  161.  
  162.  
  163.     ; Startwert einstellen
  164.     ; --------------------
  165. uhr_u_4    lda uhr_tab_a,x    ; Startwert laden
  166.     sta uhr_buff,x    ; und neu starten
  167.     dex        ; nächsten Wert einstellen
  168.     beq uhr_end    ; alle Werte getestet, Ende
  169.  
  170.     inc uhr_buff,x    ; nächsten Eintrag nachführen
  171.     bra uhr_inc    ; nächsten Eintrag testen
  172.  
  173.  
  174.     ; ==================
  175.     ; Startwerte der Uhr
  176.     ; ==================
  177.  
  178. uhr_tab_a    byte 0        ; Start-Wochentag
  179.     byte 0        ; Start-Jahr
  180.     byte 1        ; Start-Monat
  181.     byte 1        ; Start-Tag
  182.     byte 0        ; Start-Stunde
  183.     byte 0        ; Start-Minute
  184.     byte 0        ; Start-Sekunde
  185.  
  186.  
  187.     ; ================
  188.     ; Endwerte der Uhr
  189.     ; ================
  190.  
  191. uhr_tab_e    byte 7        ; End-Wochentag
  192.     byte 100    ; End-Jahr
  193.     byte 13        ; End-Monat
  194.     byte 29        ; End-Tag
  195.     byte 24        ; End-Stunde
  196.     byte 60        ; End-Minute
  197.     byte 60        ; End-Sekunde
  198.  
  199.  
  200.     ; =====================
  201.     ; Anzahl der Tage/Monat
  202.     ; =====================
  203.  
  204. tag_mon_tab    byte 32        ; Januar
  205.     byte 29        ; Februar 28 Tage, Schaltjahr = 29 Tage
  206.     byte 32        ; März
  207.     byte 31        ; April
  208.     byte 32        ; Mai
  209.     byte 31        ; Juni
  210.     byte 32        ; Juli
  211.     byte 32        ; August
  212.     byte 31        ; September
  213.     byte 32        ; Oktober
  214.     byte 31        ; November
  215.     byte 32        ; Dezember
  216.  
  217.  
  218.  
  219. ; =========================================================================
  220. ;
  221. ; Funktion    : Sommer/Winterzeit Umschaltung testen (02:00:00)
  222. ;      letzter Sonntag im März 1 Stunde vor
  223. ;      letzter Sonntag im September 1 Stunde zurück
  224. ;
  225. ; Eingang    : jede Sekunde
  226. ;
  227. ; Ausgang    : Sommer bzw. Winterzeit eingestellt wenn erforderlich
  228. ;
  229. ; Register    : Accu, X, Y
  230. ;
  231. ; (c) by Thomas Lehmann Feb. 1990
  232. ;
  233. ; =========================================================================
  234.  
  235. sw_umsch
  236.     block
  237.     bbr DIP_SUMTIME,dip_stat,end    ; keine auto Sommerzeit
  238.  
  239.     lda uhr_buff+WTAG    ; Wochentag laden, ist es Sonntag ?
  240.     bne end        ; nein
  241.  
  242.     ldx uhr_buff+MON    ; Monat laden
  243.     dex        ; Offset auf Tage/Monat Tabelle
  244.     lda tag_mon_tab,x    ; letzten Tag im Monat laden
  245.     sec
  246.     sbc #8        ; Woche abziehen
  247.     cmp uhr_buff+TAG    ; ist es der letzte Sonntag im Monat ?
  248.     bcs end        ; nein
  249.  
  250.     ldx #02        ; Offset auf Sommer/Winter Tabelle
  251.     ldy #UHR_BULA-1    ; Offset auf Uhrbuffer laden, (Sekunde)
  252.  
  253. loop    lda sw_tab,x    ; Zeit der Umschaltung
  254.     cmp uhr_buff,y    ; ist Zeit erreicht ?
  255.     bne end        ; nein
  256.     dey        ; nächsten Wert einstellen
  257.     dex
  258.     bpl loop    ; nächsten Wert testen
  259.  
  260.     lda uhr_buff+MON    ; aktuellen Monat laden
  261.     cmp #03        ; ist es März ?
  262.     bne winter    ; nein, Winterumschaltung testen
  263.  
  264.     inc uhr_buff+STD    ; Stunde +1, Sommerzeit
  265.     bra sw_1
  266.  
  267. winter    cmp #09        ; ist es September ?
  268.     bne end        ; nein, keine Umschaltung
  269.  
  270.     dec uhr_buff+STD    ; Stunde -1, Winterzeit
  271. sw_1    smb 6,sekunde    ; Sommer/Winter erst bei nächsten Monat testen
  272. end    rts
  273.  
  274. sw_tab    byte 01,59,59    ; Zeit der Umschaltung, Std., Min, Sek.
  275.     bend
  276.  
  277. ; =========================================================================
  278. ;
  279. ; Funktion    : Uhr im Display anzeigen
  280. ;
  281. ; Eingang    : -------
  282. ;
  283. ; Ausgang    : Uhrzeit, Datum und Schlüsselschalter im Display angezeigt
  284. ;
  285. ; Register    : Accu, X, Y
  286. ;
  287. ; (c) by Thomas Lehmann Feb. 1990
  288. ;
  289. ; =========================================================================
  290.  
  291. put_uhr    bbs 7,sekunde,p_u_end    ; Uhrzeit wurde bereits ausgegeben
  292.  
  293.     ; erreichten Termin ausgeben ?
  294.     ; ----------------------------
  295.     lda err_term    ; ist ein Termin erreicht ?
  296.     beq put_uhr_1    ; nein, Uhr ausgeben
  297.  
  298.     jsr put_errterm    ; erreichten Termin ausgeben
  299.     bcs p_u_end    ; Text wird ausgegeben
  300.  
  301. put_uhr_1    smb 7,sekunde    ; akt. Uhrzeit ist ausgegeben
  302.     jsr dpclr_cuoff    ; Display löschen, Cursor aus
  303.     jsr st_dp_tim    ; Display Timer aufziehen
  304.  
  305.     ; Uhr ausgeben
  306.     ; ------------
  307.     lda uhr_buff+WTAG    ; Wochentag laden
  308.     asl        ; Offset auf Tabelle erzeugen
  309.     tax
  310.     lda wtg_tab,x    ; 1.Zeichen laden
  311.     jsr putchar    ; und ausgeben
  312.     lda wtg_tab+1,x    ; 2.Zeichen laden
  313.     jsr putchar_sp    ; ausgeben, SPACE hinterher
  314.  
  315.     ldy #UHR_BULA-2    ; Offset auf Uhrbuffer laden
  316.  
  317.     block
  318. loop    lda format_tab,y    ; Uhr im richtigem Format ausgeben
  319.     tax        ; aktuelles Zeichen laden
  320.     lda uhr_buff,x    ; Uhr-Wert laden
  321.     jsr putdez99    ; und dezimal ausgeben, max. 99
  322.     lda trnz_tab,y    ; Trennzeichen laden
  323.     jsr putchar    ; und ausgeben
  324.     dey        ; alle Zeichen ausgegeben ?
  325.     bpl loop    ; nein
  326.     bend
  327.  
  328.     jmp put_ss    ; Zustand des SS ausgeben
  329.  
  330. p_u_end    rts
  331.  
  332.  
  333. wtg_tab    text "SoMoDiMiDoFrSa"    ; Wochentage
  334.  
  335.  
  336.     ; Aufbau der Uhranzeige
  337.     ; ---------------------
  338.     ; Wochentag, Tag, Monat, Jahr, Stunde, Minute, Sekunde
  339.     ; "Fr 13.02.90 23:24:49"
  340.  
  341.     ; der Uhrbuffer hat folgenden Aufbau:
  342.     ; -----------------------------------
  343.     ; Wochentag, Jahr, Monat, Tag, Stunde, Minute, Sekunde
  344.  
  345. format_tab    byte SEK,MIN,STD,JAHR,MON,TAG ; Ausg. Format der Uhr, rückwerts !
  346.  
  347. trnz_tab    text " :: .."    ; Trennzeichen
  348.  
  349.  
  350. ; =========================================================================
  351. ;
  352. ; Funktion    : Uhrzeit einstellen
  353. ;
  354. ; Eingang    : Offset auf Tastaturtabelle in X-Reg.
  355. ;    : Tastenwert im Accu
  356. ;
  357. ; Ausgang    : -----------
  358. ;
  359. ; Register    : X
  360. ;
  361. ; (c) by Thomas Lehmann Feb. 1990
  362. ;
  363. ; =========================================================================
  364.  
  365. uhrset_txt    byte  DSP_CLR|CURS_ON
  366.     shift "Uhrzeit (HHMMSS): "
  367.  
  368.     byte  DSP_CLR|CURS_ON
  369.     shift "Datum(TTMMJJWW):"
  370.  
  371.  
  372. key_uhr    stz input_po    ; keine Zeichen im Input-Buffer
  373.  
  374.     ldx wta_prg    ; Wähltastenprg. laden
  375.     cpx #WTA_UHRSET    ; ist Uhr stellen bereits aktiv ?
  376.     bne key_uhr_1    ; nein, aktivieren (1.Tastendruck)
  377.  
  378.     ldx uhr_timdat    ; Offset auf Uhrbuffer laden
  379.     beq key_uhr_1    ; letzte Anzeige war Datum
  380.  
  381.     ; Eingabe Datum vorbereiten
  382.     ; -------------------------
  383.     stz uhr_timdat    ; Datum stellen eintragen
  384.     ldx #8        ; Anzahl der Eingaben
  385.     stx anz_input    ; und setzen
  386.     jmp nxt_dsptxt    ; nächsten Uhr Text ausgeben
  387.  
  388.  
  389. key_uhr_1    jsr key_ende    ; Ende-Taste ausführen
  390.     ldy #LD_L|LD_ON    ; LED-Wert laden
  391.     jsr set_prgled    ; und LED einschalten
  392.  
  393.     ldx #WTA_UHRSET    ; Prg. Nr. bei Wähltaste
  394.     stx wta_prg    ; einschalten
  395.  
  396.     ; Zeiteingabe vorbereiten
  397.     ; -----------------------
  398.     ldx #6        ; Anzahl der Eingaben
  399.     stx anz_input    ; setzen
  400.     ldx #UHR_BULA-1    ; Offset auf Sekunde laden
  401.     stx uhr_timdat    ; und eintragen
  402.  
  403.     ldx #<uhrset_txt    ; Textadr. laden
  404.     ldy #>uhrset_txt
  405.     lda #ANZ_UHRTXT    ; Anzahl der Texte laden
  406.     jmp init_dsptxt    ; Textwahl initialisieren
  407.  
  408.  
  409.  
  410.     ; =======================
  411.     ; Einsprung bei Wähltaste
  412.     ; =======================
  413. wta_uhrst    ldx input_po    ; Offset auf akt. Eingabe
  414.     cpx anz_input    ; läuft "aendern ja/nein" Abfrage ?
  415.     bcs wta_uhrst_2    ; ja
  416.  
  417.     jsr check_wta    ; Taste im Gültigkeitsbereich ?
  418.     bcs wta_uhr_end    ; nein, Ende
  419.  
  420.     jsr input    ; Tastenwert eintragen
  421.     inx        ; Offset auf akt. Eingabe
  422.     cpx anz_input    ; Uhrwert komplett eingegeben ?
  423.     bcc wta_uhr_end    ; nein, noch nicht ändern abfragen
  424.  
  425.     jmp put_aend    ; ändern J/N Text ausgeben
  426.  
  427. wta_uhr_end    rts
  428.  
  429.  
  430.     ; eingegebenen Uhrwert eintragen
  431.     ; Wochentag, Jahr, Monat, Tag, Stunde, Minute, Sekunde
  432.     ; ----------------------------------------------------
  433.  
  434. wta_uhrst_2    cmp #2        ; ändern (Wtaste "2") ?
  435.     beq wta_uhrst_3    ; nicht ändern
  436.     bcs wta_uhr_end    ; ungültige Taste
  437.  
  438.     rmb 6,sekunde    ; Zeit geändert, Sommer/Winter wieder testen
  439.     ldy uhr_timdat    ; Offset auf Uhreintrag laden
  440.     lda input_po    ; Pointer auf nächstes Zeichen im Buffer
  441.     lsr        ; 2 Byte Einträge
  442.     tax
  443.     dex        ; auf letzte Eingabe stellen
  444.  
  445. get_uhrval    jsr get_input    ; Wert aus Inputbuffer holen
  446.     sta uhr_buff,y    ; Uhrwert speichern
  447.     lda uhr_timdat    ; wird Zeit eingetragen ?
  448.     bne get_uval_1    ; ja
  449.  
  450.     iny        ; Datum wird von 0-TAG eingetragen
  451.     iny
  452.  
  453. get_uval_1    dey        
  454.     dex        ; alle Eingaben eingetragen ?
  455.     bpl get_uhrval    ; nein, nächsten Uhrwert eintragen
  456.  
  457. wta_uhrst_3    lda uhr_timdat    ; Offset auf Uhrbuffer laden
  458.     bne key_uhr    ; Zeit wurde eingestellt, Datum vorbereiten
  459.  
  460. uhrst_off    jmp key_ende    ; Ende-Taste ausführen
  461.  
  462.  
  463.  
  464.  
  465.     ; =========================
  466.     ; Einsprung bei Lösch Taste
  467.     ; =========================
  468. uhrset_clr    lda input_po    ; Offset auf akt. Eingabe
  469.     beq wta_uhr_end    ; kein Zeichen eingegeben, Ende
  470.  
  471.     dec input_po    ; Anzahl Eingaben -1
  472.     jmp backspace    ; letztes Zeichen im Display löschen
  473.  
  474.  
  475.  
  476.  
  477. ; --------------------------------------------------------------------------
  478.  
  479. HLP    set    *
  480. _UHR    equ    HLP-MODUL_START        ; Größe des Moduls
  481.  
  482.