home *** CD-ROM | disk | FTP | other *** search
/ Die Ultimative Software-P…i Collection 1996 & 1997 / Die Ultimative Software-Pakete CD-ROM fur Atari Collection 1996 & 1997.iso / u / utility / uhren / setz_uhr.ord / uhr.s < prev   
Encoding:
Text File  |  1996-11-17  |  11.0 KB  |  394 lines

  1. ;    Uhr-Einsteller vX.X
  2. ;
  3. ;    written    1986 by    MABA
  4. ;    SOFTWARE FOUNDATION
  5. ;    Abt. FreeSoft
  6. ;
  7. ;    Address:    Martin Backschat
  8. ;            Bergstraße 16
  9. ;            8071 Hepberg
  10. ;
  11. ;
  12. ;    Dieses geile Programm ist mit dem OMIKRON-ASSEMBLER ST geschrieben.
  13. ;    Weitere    Informationen über diesen Assembler erhalten Sie direkt
  14. ;    bei OMIKRON.
  15.  
  16. ;Dieses    Programm dient zum Eintstellen die aktuellen Uhrzeit und des Datums.
  17. ;es ist    dazu gedacht, im Auto-Folder beim Systemstart aufgerufen zu werden.
  18.  
  19. ;    Initialisierung    und Begrüßungsausgabe auf dem Bildschirm
  20.  
  21. init:
  22.  
  23.     move.l    #text1,d7    ;Adresse des 1.    Textes für Routine merken
  24.     bsr    print        ;gibt String aus
  25.  
  26.  
  27. ;    Holt Uhrzeit; mit Subroutine get_tasten    wird nur auf '.' und Ziffern
  28. ;    reagiert.
  29.  
  30.     move.l    #muster1,a6    ;übergibt der Tasten-Hol-Routine die Adresse
  31.                 ;des Puffers, wo später    die Uhrzeit steht
  32.     move.l    #muster1a,a5    ;übergibt die je höchsten Werte    für die    Eingaben
  33.  
  34.     bsr    holen        ;überschreibt das Eingabemuster    mit echten
  35.                 ;Werten
  36.  
  37.     ; ------ Kodieren der Zeit in Bitmuster    und Speicherung    im Wort    ZEIT ------
  38.  
  39.     move.l    #muster1,a0    ;Routine benötigt Adresse des zu wandelnden 2-Byte-Formates
  40.     bsr    kodieren    ;kodiert...
  41.     lsl.w    #05,d0        ;schiebt Ergebnis um 11    Stellen    nach links (Std. sind ganz oben)
  42.     lsl.w    #06,d0
  43.     move.w    d0,ZEIT        ;schreibt unbedingt das    Ergebnis nach Zwischenspeicher
  44.  
  45.     move.l    #muster1+3,a0    ;Routinen wandelt Minuten in Bitmuster um
  46.     bsr    kodieren    ;wandelt...
  47.     lsl.w    #5,d0        ;schiebt Ergebnis um 5 Stellen nach links (Minuten stehen in der Mitte)
  48.     or.w    d0,ZEIT        ;verknüpft nicht fertigen Zwischenspeicher mit Minuten-Bitmuster
  49.  
  50.     move.l    #muster1+6,a0    ;Routine benötigt Adresse des zu wandelnden Zwei-Byte-Formats in A0
  51.     bsr    kodieren    ;kodiert das Format in ein Bitmusterformat und überläßt    es D0
  52.     lsr.b    #1,d0        ;teilt praktisch durch 2
  53.                 ;dies muß sein,    da das Sekundenformat nur in Zweierschritten angenommen    wird
  54.     or.w    d0,ZEIT        ;und mit dem gesamten Bitmuster    bestehend aus Std,Min,Sek verknüpfen
  55.  
  56.     move.w    ZEIT,-(sp)    ;Zeit setzen
  57.     move.w    #$2d,-(sp)    ;Funktionskode für SETTIME
  58.     trap    #1        ;GEMDOS    - Aufruf
  59.     addq.l    #4,sp        ;Stack restaurieren
  60.  
  61.     bsr    tastatur    ;Tastatur-Uhr einstellen
  62.  
  63.  
  64. ; ------------ 2.Teil -----------------------------------------------------------------------
  65.  
  66.     move.l    #text2,d7    ;Adresse des 2.textes für Routine merken
  67.     bsr    print        ;gibt String aus
  68.  
  69. ;    Holt das datum mit der gleichen    Routine    wie oben
  70.  
  71.     move.l    #muster2,a6    ;übergibt der Eingabewarteschleife die Musterzeile
  72.     move.l    #muster2a,a5    ;übergibt wie oben die Adresse der maximalen Werte
  73.  
  74.     bsr    holen        ;überschreibt die Datums-Musterzeile und übergibt die Benutzereingeben
  75.  
  76.  
  77.     ;kodieren als Bitmuster    des Datums (Tag,Monat,Jahr)
  78.  
  79.     move.l    #muster2,a0    ;Basisadresse des tages
  80.     bsr    kodieren    ;kodiert Tag in    Bitmuster (siehe oben)
  81.     move.w    d0,DATE        ;Speichert unbedingt das Muster    als Initialisator in Zwischenspeicher
  82.  
  83.     move.l    #muster2+3,a0    ;Basisadresse des Monats
  84.     bsr    kodieren    ;kodiert Monat in Bitmuster
  85.     lsl.w    #5,d0        ;um 5 Pos. nach    links
  86.     or.w    d0,DATE        ;verknüpft Monat mit alten Zwischenspeicher
  87.  
  88.  
  89.     move.l    #muster2+6,a0    ;Basisadresse des Jahres
  90.     clr.l    d0        ;Arbeitsregister löschen
  91.     clr.l    d1
  92.     clr.l    d2
  93.  
  94.     move.b    (a0)+,d1    ;erstes, höchstes Zeichen holen
  95.     subi.b    #$30,d1        ;und beginnend ab 0 ( -    9)
  96.     mulu    #1000,d1    ;Mal 1000, für Jahrtausend
  97.     move.w    d1,d0        ;und zwischenspeichern
  98.     clr.l    d1        ;sowie Arbeitsregister wieder löschen
  99.  
  100.     move.b    (a0)+,d1    ;zweites Zeichen holen
  101.     subi.b    #$30,d1        ;0 - 9 nicht als Zeichen, sondern als Wert
  102.     mulu    #100,d1        ;Mal 100 für Jahrhundert
  103.     add.w    d1,d0        ;und zwischenspeichern
  104.  
  105.     move.w    d0,d2        ;Wert des Zwischenspeichers in anderes register
  106.  
  107.     bsr    kodieren    ;den rest des Jahres kann die alte Routine bearbeiten
  108.  
  109.     add.w    d2,d0        ;addiert das gesamte Jahr zusammen
  110.  
  111.     subi.l    #1980,d0    ;zieht vom errechneten Jahr den    Offset 1980 ab,    um die effektive Zahl zu bekommen
  112.  
  113.     lsl.w    #4,d0        ;11 Pos. nach links schieben, in richtige Position
  114.     lsl.w    #5,d0
  115.  
  116.     or.w    d0,DATE
  117.  
  118.     move.w    DATE,-(sp)    ;Datum setzen
  119.     move.w    #$2b,-(sp)    ;Funktionskode für SETDATE
  120.     trap    #1        ;GEM DOS
  121.     addq.l    #4,sp        ;Stack wieder aktualisieren
  122.  
  123.  
  124. ;---------------3.Teil-------------------------------------------------------------------------------------
  125.  
  126.     move.l    #text3a,d7    ;Adresse des textes für    'Uhrzeit:'
  127.     bsr    print        ;ausgeben
  128.     move.l    #muster1,d7    ;Die neue Uhrzeit ausgeben
  129.     bsr    print        ;ausgeben
  130.  
  131.     move.l    #text3b,d7    ;Adresse des textes für    'Datum:'
  132.     bsr    print        ;ausgeben
  133.     move.l    #muster2,d7    ;Das neue Datum    ausgeben
  134.     bsr    print        ;ausgeben
  135.  
  136.  
  137.     move.l    #text4,d7    ;Text für 'Taste drücken'
  138.     bsr    print        ;ausgeben
  139.  
  140. ;    ----------------------Wartet auf eine Taste-----------------
  141.  
  142.     move.w    #7,-(sp)    ;Aufruf    AUF EINE TASTE WARTEN
  143.     trap    #1        ;GEM DOS
  144.     addq.l    #2,sp        ;Stack restaurieren
  145.  
  146.     move.l    #CUROFF,d7    ;text für ESC-Sequenz <CURSOR OFF>
  147.     bsr    print        ;gibt Sequenz aus
  148.  
  149.     move.w    #0,-(sp)    ;Funktionsnummer für PTERM
  150.     trap    #1        ;Programm beenden...
  151.  
  152.  
  153. ;    ----------------------Unterroutine get_taste----------------
  154. ;    liest vom Anwender eine    Zeile ein, nimmt jedoch    nur den    '.' und
  155. ;    Ziffern    0-9 an.
  156. ;    Musterzeile:      A6
  157. ;    Vergleichszeile:  A5
  158.  
  159. holen:
  160.     move.l    #STORE,d7    ;Textadresse für Store Cursor Adress
  161.     bsr print        ;gibt Text aus
  162.  
  163.     move.l    a6,d7        ;übergeben Mustertextadresse merken
  164.     bsr print        ;gibt Text aus
  165.  
  166.     move.l    #RESTORE,d7    ;Textadresse für Resore    Cursor Adress
  167.     bsr print        ;gibt Sequenz aus
  168.  
  169.  
  170. ;    Eingabewarteschleife
  171.     move.l    #0,d2        ;Position in Muster/Eingabezeile init. (=0)
  172.  
  173. loop1:
  174.     jsr    Crawcin        ;holt eine Taste, wobei    im Lowbyte des Hiword der Scan-Kode steht
  175.  
  176.     cmpi.b    #'.',d0        ;ist es    der Punkt gewesen, dann    zur nächsten Eingabe springen
  177.     beq    punkt        ;es ist    der Punkt gewesen, also    zur Routine springen
  178.  
  179.     cmpi.b    #13,d0        ;war es    ein RETURN, dann Subroutine beenden
  180.     beq    return        ;return    ist ein    Label für das RTS
  181.  
  182.     cmpi.b    #8,d0        ;war's ein BACKSPACE
  183.     beq    bspace        ;wenn ja, dann darauf reagieren
  184.  
  185.     cmpi.b    #'0',d0        ;Ziffer    0
  186.     blt    loop1        ;kleiner, also ungültig...
  187.     cmpi.b    #'9',d0        ;größte    Ziffer 9
  188.     bhi    loop1        ;größer, also ungültig...
  189.  
  190.     ;auf Ziffern 0-9 reagieren...
  191.  
  192.     move.b    0(a6,d2.l),d3    ;gespeichertes Zeichen lesen
  193.     cmpi.b    #0,d3        ;war Zeichen eine Null (also Ende?)
  194.     beq    loop1        ;wenn ja, dann nichts machen und zurück...
  195.  
  196.     cmp.b    0(a5,d2.l),d0    ;Musterzeile bzw. Eingabe mit dem je höchst erlaubten Wert vergleichen
  197.     bhi    loop1        ;ist Eingabe höher als erlaubt,    dann zurück zur    Eingabewarteschleife
  198.  
  199.     move.b    d0,0(a6,d2.l)    ;Tastenkode in Muster speichern
  200. loop4:    addq.l    #1,d2        ;Pointer erhöhen
  201.  
  202.     bra    loop2        ;zurückspringen
  203.  
  204.  
  205.     ;auf Punk reagiern -> zum nächsten Nicht-Punkt-Zeichen (achtet auch auf    Null!)
  206. punkt:
  207.     move.b    1(a6,d2.l),d3    ;nächstes Zeichen auf Punkt testen (oder gar Ende?)
  208.  
  209.     cmpi.b    #0,d3        ;schon Ende, dann gar nichts machen...
  210.     beq    loop1        ;und auf Tastendruck reagieren...
  211.  
  212.     bsr    right        ;gibt eine CURSOR-RIGHT    Sequenz    aus
  213.     addq.l    #1,d2        ;Pointer um eins erhöhen
  214.  
  215.     cmpi.b    #'.',d3        ;ist das nächste Zeichen ein Punkt gewesen?
  216.     bne    punkt        ;war's vorhin kein Punkt, dann weitermachen
  217.  
  218.  
  219.     addq.l    #1,d2        ;Zum Abschluß nochmal erhöhen
  220.  
  221.     bsr    right        ;CURSOR    RIGHT ausgeben
  222. back1:    bra    loop1        ;zurück    zur Eingabewarteschleife
  223.  
  224.  
  225.     ;Ein Zeichen weiter nach rechts    und zurück...
  226. loop2:
  227.     move.w    d0,-(sp)    ;wars eine Ziffer, dann    diese ausgeben
  228.     move.w    #2,-(sp)    ;Funktionskode für ZEICHEN AUSGEBEN
  229.     trap    #1        ;GEM DOS Aufruf
  230.     addq.l    #4,sp        ;Stack restaurieren
  231.  
  232.     move.b    0(a6,d2.l),d0    ;neues Zeichen lesen
  233.  
  234.     cmpi    #'.',d0        ;ist das neue Zeichen ein Punkt?
  235.     beq    loop4        ;wenn ja, dann Pointer erhöhen und auf BS um eins weitergehen
  236.     bne    loop1
  237.  
  238.  
  239.     ;BACK SPACE reagieren
  240.  
  241. bspace:
  242.     cmpi.b    #0,d2        ;ist der Pointer schon 0?
  243.     beq back1        ;ist der Pointer 0 gewesen, dann wieder    zur Eingabewarteschleife zurück
  244.  
  245.     bsr    left        ;pos. den Cursor um ein    Zeichen    nach links
  246.     subq.l    #1,d2        ;den Pointer um    eins erniedrigen
  247.  
  248.     move.b    0(a6,d2.l),d3    ;neues zeichen in D3 kopieren
  249.     cmpi.b    #'.',d3        ;ist das Zeichen ein Punkt?
  250.     bne back2
  251.  
  252.     bsr    left        ;pos. den Cursor zum 2.    Mal (da    Punkt!)    nach links
  253.     subq.l    #1,d2        ;und nochmal den Pointer erniedrigen
  254.  
  255. back2:
  256.     bra back1        ;und dasselbe nochmal
  257.  
  258.  
  259. return:
  260.     rts
  261.  
  262.  
  263. ;Diese Routine Crawcin holt ein    Zeichen    ohne Echo von der Tastatur.
  264. ;Im Lowbyte des    Lowword    ist der    ASCII, im Lowbyte des Highword ist der Scannkode
  265.  
  266. Crawcin:
  267.     move.w    #7,-(sp)    ;Funktionsnummer für Crawcin
  268.     trap    #1        ;GEM DOS Aufruf
  269.     addq.l    #2,sp        ;Stack reparieren
  270.  
  271.     rts
  272.  
  273.  
  274. ;Diese Routine positioniert den    Cursor um eine Pos. nach rechts
  275.  
  276. right:
  277.     move.l    #RIGHT,d7    ;Adresse des Ausrichtungstextes    merken
  278. print:
  279.     move.l    d7,-(sp)    ;Adresse aus D7    auf den    Stack
  280.     move.w    #9,-(sp)    ;Funktionsnummer für PRINT LINE
  281.     trap    #1        ;GEM DOS
  282.     addq.l    #6,sp        ;Stack restaurieren
  283.  
  284.     rts
  285.  
  286.  
  287. ;Diese Routine pos. den    Cursor um eine Pos. nach linsk
  288.  
  289. left:
  290.     move.l    #LEFT,d7    ;Adresse des Ausrichtungstextes    merken
  291.     jmp print        ;gibt über PRINT LINE den Text aus
  292.  
  293.  
  294.  
  295. ;Diese Routine verwandelt ein in A0 (Lowword) übergebene Adresse eines Zweibyte-Formats    in
  296. ;dessen    benötigtes Bitmusterformat,daß dann in D0 steht
  297.  
  298. kodieren:
  299.     clr.l    d0        ;Arbeitsregister löschen
  300.     clr.l    d1
  301.  
  302.     move.b    (a0)+,d1    ;oberstes Byte der zwei    lesen
  303.     subi.b    #$30,d1        ;Bei einer Zahl    muß der    Wert $30 abgezogen werden,
  304.                 ;um den    dezimal    kodierten Wert zu bekommen
  305.  
  306.     mulu    #10,d1        ;mal 10    nehmen,    um das obere Byte richtig zustellen
  307.  
  308.     move.b    (a0),d0        ;unteres Byte der zwei lesen
  309.     subi.b    #$30,d0        ;genau wie oben    auf dezimal umrechnen
  310.  
  311.     add.l    d1,d0        ;und alles zusammenkopieren -> hexadez.    Wert
  312.  
  313.     rts            ;und fertig!
  314.  
  315.  
  316. ;Diese Routine stellt die Uhrzeit des Tastatur-Prozessors...
  317.  
  318. tastatur:
  319.     move.l    DATE,-(sp)    ;da ZEIT hinter    DATE kommt, kann man das auch als 32-Bit Wert ansehen
  320.     move.w    #22,-(sp)    ;Funktionskode für SETTIME & DATE
  321.     trap    #14        ;xBIOS aufrufen
  322.     addq.l    #6,sp        ;Stapel    wieder herstellen
  323.  
  324.     rts
  325.  
  326.  
  327. ;    ------------------------------------------------------------------
  328. ;    --    Texte    --------------------------------------------------
  329. ;    ------------------------------------------------------------------
  330.  
  331. text1:
  332.     .dc.b    27,'E',27,'p',27,'w',27,'e'
  333.     .dc.b    "            Uhr-Einsteller ST v1.2   by MABA  -  SOFTWARE FOUNDATION            ",27,'q',13,10,13,10
  334.     .dc.b    "ACHTUNG: Bei Verwendung des ACCs <KONTROLLFELD> wird die Uhrzeit von diesem",13,10
  335.     .dc.b    "         wieder überschrieben!",13,10,13,10,27,'v'
  336.     .dc.b    "Bitte geben Sie die Uhrzeit im Format HH.MM.SS ein: >",0
  337.  
  338. text2:
  339.     .dc.b    13,10
  340.     .dc.b    "Bitte geben Sie das Datum im Format TT.MM.JJJJ ein: >",0
  341.  
  342. text3a:
  343.     .dc.b    13,10,13,10
  344.     .dc.b    "Eingestellte Uhrzeit: ",0
  345.  
  346. text3b:
  347.     .dc.b    13,10
  348.     .dc.b    "Eingestelltes Datum : ",0
  349.  
  350. text4:
  351.     .dc.b    13,10,13,10
  352.     .dc.b    "Drücken Sie eine Taste, um ins DESK-TOP zu gelangen...",0
  353.  
  354.  
  355. muster1:
  356.     .dc.b    "00.00.00",0
  357. muster1a:
  358.     .dc.b    "29.59.59"    ;entält    für die    Musterzeile die    je höchsten Werte
  359.  
  360. muster2:
  361.     .dc.b    "15.04.1986",0
  362. muster2a:
  363.     .dc.b    "39.19.2999"
  364.  
  365.  
  366. RIGHT:
  367.     .dc.b    27,'C',0
  368.  
  369.  
  370. LEFT:
  371.     .dc.b    27,'D',0
  372.  
  373.  
  374. CUROFF:
  375.     .dc.b    27,'f',0
  376.  
  377.  
  378. STORE:
  379.     .dc.b    27,'j',27,'e',0        ;store Cursor Pos. and Cursor ON
  380.  
  381.  
  382. RESTORE:
  383.     .dc.b    27,'k',0
  384.  
  385. .even
  386.  
  387. DATE:
  388.     .dc.w    0
  389.  
  390. ZEIT:
  391.     .dc.w    0
  392.  
  393. .even
  394. ə