;************** Create <name>,b1,b2,... *************** 
;*                                                    *
;*  Erstellt eine Datei mit dem Namen <name> und be-  *
;*  liebigen Bytes, die - mit Kommas getrennt - auf-  *
;*  gezählt werden.                                   *
;*                                                    *
;******************************************************
;*            ©  1991 by Michael Gottwald             *
;******************************************************

OpenLib  = -408                      ; EXEC-Library
CloseLib = -414                      ;     '
Open     = -30                       ; DOS-Library
Close    = -36                       ;     '
Write    = -48                       ;     '
Output   = -60
Exit     = -144                      ;     '

;----Librarys öffnen--------------------------------------------------

run:     move.l  a0,Pointer          ; Zeiger auf Parametertext retten
         move.l  d0,ErrAdr           ; Parametertextlänge retten
         move.l  $4,a6
         lea     Dosname,a1
         jsr     OpenLib(a6)         ; dos.library öffnen
         move.l  d0,DosBase
         bne     getName             ; O.k, --> weiter

         rts                         ; Fehler beim Öffnen, --> CLI

;----Dateinamen holen ------------------------------------------------

getName: move.l  Pointer,a0
         subq.l  #1,ErrAdr           ; Kommen Parameter (ErrAdr = 1) ?
         bne     noSpace             ; ja, --> weiter

         move.l  #NoParErr,ErrAdr    ; nein, --> Befehlsschablone
         bra     error               ;           ausgeben und Ende

noSpace: cmp.b   #32,(a0)+
         beq     noSpace             ; Leerzeichen überlesen...
         move.l  #FileName,a1
         subq.l  #1,a0
         cmp.b   #44,(a0)            ; kommt schon Komma ?
         bne     chkRet              ; nein, --> weiter

         move.l  #NoFileErr,ErrAdr
         bra     Error               ; ja, --> Fehlermeldung ausgeben

chkRet:  cmp.b   #10,(a0)            ; kommt schon Line_feed ?
         bne     readNme             ; nein, --> Zieldatei holen

         move.l  #NoFileErr,ErrAdr
         bra     Error               ; ja, --> Fehlermeldung ausgeben

readNme: move.b  (a0)+,(a1)+         ; Zeichen speichern...
         cmp.b   #44,(a0)            ; kommt Komma ?
         beq     openFile            ; ja, --> Zieldatei öffnen
         cmp.b   #10,(a0)            ; kommt Line_feed ?
         bne     readNme             ; nein, --> weiterlesen

btError: move.l  #NoBytErr,ErrAdr
         bra     Error               ; LF, --> Fehlermeldung ausgeben

openFile: addq.l #1,a0
         move.l  a0,Pointer          ; Zeiger auf Parametertext retten
         move.l  DosBase,a6
         move.l  #FileName,d1        ; Zeiger auf Dateidefinition
         move.l  #1006,d2            ; Modus 'new'
         jsr     Open(a6)            ; Datei öffnen
         move.l  d0,Handle           ; Dateihandle retten
         bne     getByte             ; hat geklappt, --> Byte holen

         move.l  #OpenErr,ErrAdr
         bra     error               ; hat nicht geklappt, --> Fehler

;----Dezimalzahl holen -----------------------------------------------

getByte: move.l  Pointer,a0          ; Zeiger auf Textpuffer holen
nextByte:bsr     getdez              ; Dezimalzahl (Byte) holen
         cmp.w   #255,d0             ; kleiner/gleich 255 ?
         bls     WrFile              ; ja, --> weiter

         move.l  #ByteErr,ErrAdr
         bra     error               ; --> Fehlermeldung ausgeben

WrFile:  move.l  a0,Pointer          ; Parametertext-Zeiger retten
         move.l  DosBase,a6
         move.b  d0,Byte
         move.l  #Byte,d2            ; Zeiger auf Byte...
         move.l  Handle,d1           ; Dateihandle...
         move.l  #1,d3               ; Länge: 1
         jsr     Write(a6)           ; Byte schreiben
         tst.l   d0                  ; D0 testen
         bmi     WrError             ; negativ, --> Schreibfehler
         move.l  Pointer,a0          ; Param.text-Zeiger zurückholen
         cmp.b   #44,(a0)+           ; kommt Komma ?
         beq     nextByte            ; ja, --> nächstes Byte holen
         subq.l  #1,a0               ; nein, --> Zeiger zurückbiegen
         cmp.b   #10,(a0)            ; kommt Line_feed ?
         bra     end                 ; ja, --> Ende

         move.l  #SyntaxErr,ErrAdr
         bra     error               ; nein, --> Fehler

wrError: move.l  #WriteErr,ErrAdr
         bra     error               ; --> Fehler

end:     move.l  DosBase,a6
         move.l  Handle,d1
         jsr     Close(a6)           ; Datei schließen
         move.l  DosBase,a6
         clr.l   d1                  ; Returncode = 0 (kein Fehler)
         jsr     Exit(a6)            ; zurück ins CLI

;----Dezimalzahl auswerten--------------------------------------------

getdez:  cmp.b   #32,(a0)+           ; Leerzeichen überlesen
         beq     getdez
         clr.l   d0
         subq.l  #1,a0
         move.l  #2,d1               ; Ziffernzähler setzen
         clr.w   Numbers
loop2:   move.b  (a0)+,d0            ; nächstes Zeichen holen
         cmp.b   #10,d0              ; Line_feed ?
         beq     back                ;  dann keine Ziffer mehr
         cmp.b   #44,d0              ; Komma ?
         beq     back                ;  dann keine Ziffer mehr
         lea     Numbers,a1          ; Basisadresse der Zifferspeicher
         add.l   d1,a1
         sub.l   #48,d0              ; ASCII-Code - 48 = Zifferwert
         move.b  d0,(a1)             ; Ziffer abspeichern
         dbra    d1,loop2            ; D1 dekrementieren / D1 = 0 ?
         bra     ready
back:    subq.l  #1,a0               ; A0 auf Komma biegen
ready:   addq.w  #1,d1
         clr.l   d0
         cmp.b   #3,d1               ; D1 noch 2 ?
         bne     cont

         add.l   #4,a7               ; ja, dann keine Ziffer gefunden
         move.l  #NoBytErr,ErrAdr
         bra     error               ; --> Fehlermeldung ausgeben

cont:    lea     Muls,a2             ; Basisadr. der Multiplikatoren
         add.l   d1,a2
         lea     Numbers,a1
         clr.l   d0
         clr.l   d1
         clr.l   d2
         move.b  2(a1),d0            ; /Beide Bytes holen, damit wort-
         move.b  (a2),d1             ; \weise multipliz. werden kann
         mulu    d1,d0               ; 1. Ziffer * Multiplikator
         addq.l  #1,a2
         move.b  1(a1),d1
         move.b  (a2),d2
         mulu    d2,d1               ; 2. Ziffer (falls vorhanden)
         add.w   d1,d0
         move.b  (a1),d1
         add.w   d1,d0               ; + 1. Ziffer (falls vorhanden)
         rts                         ; zurück (D0 enthält Dezimalzahl)

;----Fehlermeldung ausgeben-------------------------------------------

error:   tst.l   Handle              ; Filehandle = 0 ?
         beq     TxtOut              ; ja, --> kein CLOSE
         move.l  Handle,d1
         move.l  DosBase,a6
         jsr     Close(a6)           ; Datei schließen
TxtOut:  move.l  DosBase,a6
         jsr     Output(a6)          ; Standard-Ausgabekanal ermitteln
         move.l  d0,ErrHandle
         move.l  d0,d1
         clr.l   d3
         move.l  ErrAdr,a0
         move.b  (a0)+,d3            ; Länge des Fehlertextes holen
         move.l  a0,d2               ; Fehlertext-Adresse
         move.l  DosBase,a6
         jsr     Write(a6)           ; Fehlertext ausgeben
         move.l  #1,d1               ; Return-Code = Fehler
         move.l  DosBase,a6
         jsr     Exit(a6)            ; zurück ins CLI

;---------------------------------------------------------------------
   even
DosName:  dc.b "dos.library",0
DosBase:  dc.l 0
Pointer:  dc.l 0
Handle:   dc.l 0
ErrHandle:dc.l 0
ErrAdr:   dc.l 0
Numbers:  dc.b 0,0,0                ; Ziffernspeicher
Muls:     dc.b 100,10,1,1           ; Multiplikatoren
 even
FileName: blk.b 100,0               ; Speicher für Zieltext
Byte:     dc.b 0

ComErr:    dc.b 19,"Ein Komma fehlt !",13,10
OpenErr:   dc.b 32,"Datei läßt sich nicht öffnen !",13,10
WriteErr:  dc.b 25,"Fehler beim Schreiben !",13,10
ByteErr:   dc.b 31,"Ein Byte ist größer als 255 !",13,10
NoBytErr:  dc.b 21,"Vermisse Byte(s)...",13,10
NoFileErr: dc.b 35,"Bitte Zieldatei nicht vergessen !",13,10
NoParErr:  dc.b 35,"--> CREATE <ziel>,byte[,byte,...]",13,10
SyntaxErr: dc.b 43,"Eine Dezimalzahl hat mehr als 3 Ziffern !",13,10
