home *** CD-ROM | disk | FTP | other *** search
/ No Fragments Archive 10: Diskmags / nf_archive_10.iso / MAGS / STMAGAZIN / STMAGAZIN.MSA / ANWENDUN.GEN / BOOT_GEN / AUTOUHRK.Q < prev    next >
Text File  |  1986-02-06  |  11KB  |  240 lines

  1.  ;**********************************************************************
  2.  ;  68000er Date- and Timesetter  for ATARI ST    Version 0.21  S.Hensel
  3.  ;
  4.  ; Dieses Programm kann wahlweise im AUTO-Ordner oder beim ROM-TOS im
  5.  ; Bootsektor Ihrer Boot-Diskette abgelegt werden, wo es nach jedem
  6.  ; Reset aktiviert wird und die Zeit aus dem Tastaturprozessor holt.
  7.  ; Wurde seit dem Einschalten des Rechners die Zeit noch nicht gesetzt,
  8.  ; so steht die Keyboard-Uhr auf 00:00 Uhr, und der Benutzer wird zur
  9.  ; Eingabe des aktuellen Datums und der Uhrzeit aufgefordert, welche
  10.  ; dann im Tastaturprozessor für alle nachfolgenden Resets abgelegt wird.
  11.  ; Die vom Tastaturprozessor völlig unabhängige Gemdos-Uhr kann nun vom
  12.  ; Date- and Timesetter nach jedem weiteren Reset richtig eingestellt
  13.  ; werden, ohne weitere Aktivitäten des Benutzers zu erfordern; es
  14.  ; sollte lediglich eine Bootdisk mit dem Date- and Timesetter in
  15.  ; Laufwerk A: eingelegt sein. Wird kurz nach dem Reset die ALTERNATE-
  16.  ; TASTE gedrückt gehalten, so führt dieses Programm einen Ramdisk-
  17.  ; zerstörenden Kaltstart aus; die RECHTE SHIFT-TASTE erlaubt die
  18.  ; Neueingabe von Datum und Uhrzeit.
  19.  ;**********************************************************************
  20.  
  21. gemdos    =    1
  22. bios      =    13
  23. xbios     =    14
  24. Cconws    =    $9   ; gemdos
  25. Cconrs    =    $a   ; gemdos
  26. Tsetdate  =    $2b  ; gemdos
  27. Tsettime  =    $2d  ; gemdos
  28. Pterm     =    $4C  ; gemdos
  29. Bconout   =    3    ; bios
  30. Kbshift   =    11   ; bios
  31. Settime   =    22   ; xbios
  32. Gettime   =    23   ; xbios
  33. Dosound   =    32   ; xbios
  34. Supexec   =    38   ; xbios
  35.  
  36. buffersize =   10   ; Anzahl der Eingabezeichen für Cconrs (Buffer=10+2)
  37.  ;----------------------------------------------------------------------
  38.  ; Die auskommentierten Zeilen sind nur für die Version im Bootsektor:
  39.  ;branch:   bra.s   anfang                 short Branch auf Bootprogramm
  40.  ;
  41.  ; Im Folgenden stehen die $ff's als Platzhalter für die Formatangaben
  42.  ; im jeweiligen Bootsektor, welche nicht überschrieben werden sollten.
  43.  ; Formatspezifikationen im INTEL-Format: erst Low-Byte, dann High-Byte:
  44.  ;
  45.  ;filler    dc.b    $ff,$ff,$ff,$ff,$ff,$ff   z.B.'Loader' oder '3.3IBM'
  46.  ;serial    dc.b    $ff,$ff,$ff  24-Bit Seriennummer der jeweiligen Disk
  47.  ;recsiz    dc.b    $ff,$ff         Bytes per Sector, z.B. 512 = $00,$02
  48.  ;clsiz     dc.b    $ff                      Sectors per Cluster, z.B. 2
  49.  ;reserv    dc.b    $ff,$ff    Anz.d.reservierten Sektoren am Diskanfang
  50.  ;anzfat    dc.b    $ff          Anzahl der File Allocation Tables (FAT)
  51.  ;n_dirs    dc.b    $ff,$ff     max.Anz.d.Directory-Einträge im Root-Dir
  52.  ;nsects    dc.b    $ff,$ff      Gesamtzahl der Sektoren dieser Diskette
  53.  ;mediad    dc.b    $ff          Media-Descriptor-Byte (bei Gemdos egal)
  54.  ;fsiz      dc.b    $ff,$ff                  Anzahl der Sektoren pro FAT
  55.  ;scptrk    dc.b    $ff,$ff                Anzahl der Sektoren pro Track
  56.  ;nsides    dc.b    $ff,$ff              Anzahl der Oberflächen der Disk
  57.  ;nhidde    dc.b    $ff,$ff      Anz.d.versteckten Sektoren auf der Disk
  58.  
  59. anfang:                     ; hier Programmstart...
  60.   pea     enterdate(pc)     ; Rufe enterdate im Supervisormodus auf...
  61.   move.w  #Supexec,-(sp)
  62.   trap    #xbios
  63.   addq.l  #6,sp
  64.  
  65.  ;rts                         Der Bootsektor wird mit Return verlassen.
  66.   clr.w   -(sp)             ; Nur für die Version im AUTO-Ordner erfolgt
  67.   move.w  #Pterm,-(sp)      ;           ein normaler Programmabschluß...
  68.   trap    #gemdos           ; "This Is The Point Of No Return..."
  69.  ;----------------------------------------------------------------------
  70. enterdate:                  ; wird im Supervisormodus ausgeführt
  71.   clr.b   $ffff820a         ; schalte auf 60 Hertz (Bild wird ruhiger!)
  72.   bclr    #0,$484           ; Tastaturklick aus (aaaaaaaahhhh.....)
  73.  
  74.   pea     hellomsg(pc)      ; erst mal "Hallo - mein Name ist Hase..."
  75.   move.w  #Cconws,-(sp)     ;                                  sagen
  76.   trap    #gemdos
  77.   addq.l  #6,sp
  78.  
  79.   move    #Gettime,-(sp)    ; hole Zeit und Datum von Tastaturprozessor
  80.   trap    #xbios
  81.   addq.l  #2,sp
  82.   move.l  d0,d4             ; Date & Time merken in d4 ...
  83.   move.l  d0,d7             ;                   ... und d7
  84.  
  85.   move.w  #-1,-(sp)         ; hole Shift-Status der Tastatur
  86.   move.w  #Kbshift,-(sp)
  87.   trap    #bios
  88.   addq.l  #4,sp
  89.   btst    #3,d0             ; (Bit 3)  ALTERNATE-Taste...
  90.   bne     kaltstart         ;             gedrückt --> KALTSTART
  91.   btst    #0,d0             ; (Bit 0)  RECHTE SHIFT-Taste...
  92.   bne.s   tippdatum         ;             gedrückt --> DATUM EINGEBEN
  93.  
  94.   tst.w   d4                ; Keyboard-Clock inaktiv ?   00h 00' 00"
  95.   bne.s   raus              ; nein, Uhr läuft bereits: Eingabe unnötig
  96.  
  97. tippdatum:                  ; UHR STEHT: Date & Time EINGEBEN LASSEN
  98.   pea     bello(pc)         ; User-Aktion verlangt:  Gib Laut, damit
  99.   move.w  #Dosound,-(sp)    ;     man die Eingabe nicht verschläft...
  100.   trap    #xbios            ; man hört nur hochfrequente Interferenzen
  101.   addq.l  #6,sp             ; von einzeln nicht mehr hörbaren Frequenzen
  102.  
  103.   pea     datemsg(pc)       ; JJMMTTSSMM anzeigen, zur Eingabe von
  104.   move.w  #Cconws,-(sp)     ; Datum und Uhrzeit auffordern und
  105.   trap    #gemdos           ; den Cursor einschalten.
  106.   addq.l  #6,sp
  107.  
  108.   lea     buffer(pc),a4     ; Vorbereitungen für Cconrs (read string)
  109.   move.b  #buffersize,(a4)  ; buffersize ist maximale Länge der Eingabe
  110.   move.l  a4,-(sp)          ; der Buffer selbst ist 2 Bytes länger
  111.   move.w  #Cconrs,-(sp)     ; Gib dem User Möglichkeit zur Datumseingabe
  112.   trap    #gemdos
  113.   addq.l  #6,sp
  114.  
  115.   pea     cursor_aus(pc)    ; Cursor wieder ausschalten und CR/LF
  116.   move.w  #Cconws,-(sp)       
  117.   trap    #gemdos
  118.   addq.l  #6,sp
  119.  
  120.   addq.l  #1,a4             ; a4 zeigt nun auf zurückgelieferte Länge
  121.   cmpi.b  #10,(a4)+         ; Länge der Eingabe muß genau 10 sein
  122.   bne.s   bellraus          ; isses nich, so schlag ich Krach und tu nix
  123.  
  124.   bsr.s   fissel_datime     ; codiert date & time bitweise nach d4
  125.   tst.l   d4                ; falls d4 == 0 ist fehler aufgetreten
  126.   beq.s   bellraus          ; Fehler! Abbruch und Alarmton
  127.  
  128.   move.l  d4,-(sp)          ; eingegebenes neues Datum auf Stack
  129.   move.w  #Settime,-(sp)    ; stelle Uhr im Tastaturprozessor
  130.   trap    #xbios            ; für spätere Resets
  131.   addq.l  #6,sp
  132.  
  133. raus:                       ; Setze GEMDOS-UHR mit DateTime aus d4
  134.   move.l  d4,-(sp)          ; Push Date & Time 32bit
  135.   move.w  #Tsetdate,-(sp)   ; benutze Date 16bit
  136.   trap    #gemdos
  137.   addq.l  #4,sp             ; 16bit Time bleibt auf Stack
  138.   move.w  #Tsettime,-(sp)   ; benutze Time
  139.   trap    #gemdos
  140.   addq.l  #4,sp             ; GEMDOS-UHR IST JETZT GESETZT
  141. ganzraus:
  142.   rts                       ; bye-bye
  143.  ;--------------------------
  144. bellraus:                   ; Mit Eingabestring war nichts anzufangen...
  145.   pea     brumm(pc)         ; brummige Verabschiedung wg. Fehleingabe
  146.   move.w  #Dosound,-(sp)
  147.   trap    #xbios
  148.   addq.l  #6,sp
  149.   tst.w   d7                ; hat wenigstens der Tastaturprozessor Zeit?
  150.   beq.s   ganzraus          ; nein...
  151.   move.l  d7,d4             ; doch: übertrage Zeit in GEMDOS-Uhr
  152.   bra.s   raus              ;
  153.  ;--------------------------------------------------------------------
  154. kaltstart:                  ; Zerstöre residente RAM-Disks etc.
  155.   clr.l   $420              ; memvalid  löschen (Speicher ungültig)
  156.   clr.l   $426              ; res_valid    "    (Resetvektor ungültig)
  157.   move.l  4,a0              ; ROM-Reset-Adresse holen
  158.   jmp     (a0)              ; jump to ROM-Reset-Vector   (Kaltstart)
  159.  ;--------------------------------------------------------------------
  160. fissel_datime:              ; rechne 10-char-string um in 32bit Datum
  161.   bsr.s   calc_pair         ; berechne Jahr
  162.   subi.b  #80,d0
  163.   bcs.s   fissel_error      ; Jahr nicht in 1980..1999
  164.   move.b  d0,d4
  165.   lsl.l   #4,d4             ; schaffe Platz für 4 bit Monat
  166.   bsr.s   calc_pair         ; berechne Monat
  167.   cmpi.b  #12,d0
  168.   bhi.s   fissel_error      ; Monat > 12
  169.   or.b    d0,d4
  170.   lsl.l   #5,d4             ; schaffe Platz für 5 bit Tag
  171.   bsr.s   calc_pair         ; berechne Tag
  172.   cmpi.b  #31,d0
  173.   bhi.s   fissel_error      ; Tag > 31
  174.   or.b    d0,d4
  175.   lsl.l   #5,d4             ; schaffe Platz für 5 bit Stunde
  176.   bsr.s   calc_pair         ; berechne Stunde
  177.   cmpi.b  #23,d0
  178.   bhi.s   fissel_error      ; Stunde > 23
  179.   or.b    d0,d4
  180.   lsl.l   #6,d4             ; schaffe Platz für 6 bit Minute
  181.   bsr.s   calc_pair         ; berechne Minute
  182.   cmpi.b  #59,d0
  183.   bhi.s   fissel_error      ; Minute > 59
  184.   or.b    d0,d4
  185.   lsl.l   #5,d4             ; setze Sekunden auf 0
  186.   rts
  187.  ;--------------------------
  188. fissel_error:               ; Fehlerfall:  liefere 0 in d4 zurück
  189.   clr.l   d4
  190.   rts
  191.  ;---------------------------------------------------------------------
  192. calc_pair:                  ; berechne aus 2 Zeichen Dezimalzahl -> d0.b
  193.   bsr.s   ziffer
  194.   tst.w   d0
  195.   bmi.s   calc_error        ; illegales 1. Zeichen: keine Ziffer
  196.   moveq   #10,d1
  197.   mulu    d0,d1             ; d1  =  10 * ziffer1
  198.   bsr.s   ziffer
  199.   tst.w   d0
  200.   bmi.s   calc_error        ; illegales 2. Zeichen: keine Ziffer
  201.   add.w   d1,d0             ; d0  =  d1 + d0     (10*ziffer1 + ziffer2)
  202.   rts
  203.  
  204. calc_error:                 ; wird auch von ziffer benutzt (!)
  205.   moveq   #-1,d0            ; setze Fehler-Flag:  d0.b > 59  illegal
  206.   rts
  207.  ;---------------------------------------------------------------------
  208. ziffer:                     ; wandelt Ascii-Ziffer um in dezimal 0..9
  209.   clr.w   d0
  210.   move.b  (a4)+,d0          ; A4 zeigt nun auf das nächste Zeichen
  211.   subi.w  #$30,d0           ; teste, ob d0.b in '0'..'9' enthalten ist
  212.   bcs.s   calc_error        ; d0 < '0'
  213.   cmpi.w  #9,d0
  214.   bhi.s   calc_error        ; d0 > ( '9' - '0' )
  215.   rts
  216.  ;---------------------------------------------------------------------
  217.  
  218. hellomsg:                   ; genau 40 Zeichen wg. Low-Res Farbmodus:
  219.   dc.b    $d,"+ 68000er Datum Kaltstart Noklick 60Hz +"
  220. cursor_aus:
  221.   dc.b    27,'f'
  222. crlf:
  223.   dc.b    $d,$a,0
  224. datemsg:                    ; hier auch genau 40 Zeichen von + bis +
  225.   dc.b    "+ JJMMTTSSMM  (Jahr Monat Tag Std Min) +",$d,$a,"= "
  226. cursor_ein:
  227.   dc.b    27,'e',0
  228. brumm:    ;  Dosound - Daten zur Verabschiedung bei Eingabefehler
  229.   dc.b    0,$ff,1,$0d,2,$ff,3,$0e,4,$ff,5,$0f,7,$f8
  230.   dc.b    8,$10,9,$10,10,$10,11,$ff,12,$ff,13,$09
  231.   dc.b    $ff,$00
  232. buffer:   ;  12 Bytes Eingabepuffer (Eingabe überschreibt Bello-Sound)
  233. bello:    ;  Dosound - Daten zur Begrüßung
  234.   dc.b    0,$7,1,$0,2,$8,3,$0,4,$9,5,$0,7,$f8
  235.   dc.b    8,$10,9,$10,10,$10,11,$ff,12,$ff,13,$09
  236.   dc.b    $ff,$00
  237.  
  238.   end
  239.  
  240.