home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 468.lha / WaitAnyKey_v1.00 / WaitAnyKey.ass < prev    next >
Text File  |  1991-02-08  |  15KB  |  467 lines

  1.  
  2.  
  3. ;  ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  4. ;  ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  5. ;  ­­                                                                   ­­
  6. ;  ­­                        WaitAnyKey V1.00                           ­­
  7. ;  ­­                                                                   ­­
  8. ;  ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  9. ;  ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  10. ;  ­­                                                                   ­­
  11. ;  ­­      Copyright 1990      Roger Fischlin                           ­­
  12. ;  ­­                          Steigerwaldweg 6                         ­­
  13. ;  ­­                          D-6450 Hanau 7                           ­­
  14. ;  ­­                          Germany                                  ­­
  15. ;  ­­                                                                   ­­
  16. ;  ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  17. ;  ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  18. ;  ­­                                                                   ­­
  19. ;  ­­  This program is FREEWARE. It's still copyrighted by the author.  ­­
  20. ;  ­­                                                                   ­­
  21. ;  ­­                                                                   ­­
  22. ;  ­­  This program can be freely distributed if :                      ­­
  23. ;  ­­  1. the name of  the author  and  the  copyright  remark  remain  ­­
  24. ;  ­­     unchanged.                                                    ­­
  25. ;  ­­  2. you don't gain any profit by distributing it !                ­­
  26. ;  ­­                                                                   ­­
  27. ;  ­­                                                                   ­­
  28. ;  ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  29. ;  ­­ This  program  ist  PC  relative and  100 %  PURE (set P flag) !  ­­
  30. ;  ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  31.  
  32.  
  33.  
  34.  
  35.  
  36.     incdir    "ram:include/"
  37.  
  38.     include    "exec/exec_lib.i"
  39.     include    "exec/memory.i"
  40.     include    "libraries/dos.i"
  41.     include    "libraries/dos_lib.i"
  42.     include    "libraries/dosextens.i"
  43.  
  44.  
  45.     IFND    DOSTRUE
  46. DOSTRUE    equ    -1
  47.     ENDC
  48.     IFND    DOSFALSE
  49. DOSFALSE    equ    0
  50.     ENDC
  51.  
  52.  
  53.  
  54.  
  55. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  56. ; ­­                               Macro                             ­­
  57. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  58.  
  59.  
  60. DOS    macro            ; der  alte  Macro  muß  ersetzt
  61.     move.l    a5,a6        ; werden, da ja die DOS-Library-Base
  62.     jsr    _LVO\1(a6)        ; an anderer Stelle (a5) vermerkt ist.
  63.     endm
  64.  
  65.  
  66. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  67. ; ­­                     DOS-Library öffnen                          ­­
  68. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  69.  
  70. _main    lea.l    DosName(pc),a1        ; DOS-Library
  71.     moveq.l    #33,d0        ; ab Kickstart 1.2
  72.     CALLEXEC    OpenLibrary        ; öffnen
  73.     move.l    d0,a5
  74.     tst.l    d0
  75.     beq.s    .Error        ; Fehler !
  76.     bsr    MAIN        ; Hauptprogramm ausführen
  77.     move.l    d0,-(sp)
  78.     move.l    a5,a1        ; DOS-Library wieder schließen
  79.     CALLEXEC    CloseLibrary
  80.     move.l    (sp)+,d0
  81.     rts
  82.  
  83. .Error    moveq.l    #20,d0
  84.     rts
  85.  
  86. DosName    DOSNAME
  87.  
  88.  
  89. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  90. ; ­­                          Hauptprogramm                          ­­
  91. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  92.  
  93. MAIN    move.l    #DOSTRUE,d0
  94.     bsr    GoRAW        ; CON in RAW-Modus umwandeln
  95. .Loop    DOS    Input
  96.     subq.l    #2,sp        ; Puffer (2 Byte) anlegen
  97.     move.l    d0,d1
  98.     move.l    sp,d2
  99.     moveq.l    #1,d3
  100.     DOS    Read        ; 1 Zeichen lesen (=auf ein Tastendruck warten)
  101.     addq.l    #2,sp        ; Stack wieder korrigieren
  102.     DOS    Input
  103.     move.l    d0,d1
  104.     moveq.l    #1,d2        ; noch weitere Zeichen im Puffer ?
  105.     DOS    WaitForChar
  106.     tst.l    d0    
  107.     bne.s    .Loop        ; gegebenenfalls weitere Zeichen auslesen
  108.                 ; sonst stören sie bei der späteren Eingabe
  109.     move.l    #DOSFALSE,d0
  110.     bsr    GoRAW        ; zurück in CON-Modus
  111.     moveq.l    #0,d0
  112.     rts
  113.  
  114.  
  115. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  116. ; ­­                            GoRAW                                ­­
  117. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  118. ; ­­ Enthält D0 DOSTRUE (-1) ,versetzt GoRAW die Console in den RAW- ­­
  119. ; ­­ Modus bei DOSFALSE (0) hingen versetzt GoRAW die Console zurück ­­
  120. ; ­­ in den CON-Modus. Bei einem Fehler ist d0 0.                    ­­
  121. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  122.  
  123.     IFND    ACTION_SCREEN_MODE
  124. ACTION_SCREEN_MODE    equ    994
  125.     ENDC
  126.  
  127. GoRAW    movem.l    d7/a2-a5,-(sp)        ; Register retten
  128.     move.l    d0,d7        ; Modus retten
  129.     sub.l    a1,a1
  130.     CALLEXEC    FindTask        ; Zeiger auf eigenen Task
  131.     move.l    d0,a0
  132.     move.l    pr_ConsoleTask(a0),a2    ; ID der zugehörigen Console
  133.  
  134.     sub.l    a0,a0        ; Reply-Port erzeugen
  135.     moveq.l    #0,d0
  136.     bsr    CreatePort
  137.     tst.l    d0        ; Fehler ?
  138.     beq    .Label1
  139.     move.l    d0,a3        ; Zeiger auf Reply-Port retten
  140.  
  141.     bsr    CreatePacket        ; StandardPacket erzeugen
  142.     tst.l    d0        ; Fehler ?
  143.     beq.s    .Label2
  144.     move.l    d0,a4
  145.     move.l    a3,sp_Pkt+dp_Port(a4)    ; Reply-Port eintragen
  146.  
  147.     move.l    d7,sp_Pkt+dp_Arg1(a4)    ; Modus eintragen
  148.     move.l    #ACTION_SCREEN_MODE,sp_Pkt+dp_Type(a4)    
  149.  
  150.     move.l    a4,a1        ; Zeiger auf Packet
  151.     move.l    a2,a0        ; Zeiger auf Port
  152.     CALLEXEC    PutMsg
  153.  
  154. .Label5    move.l    a3,a0        ; auf Reply warten
  155.     CALLEXEC    WaitPort    
  156.  
  157.     move.l    a3,a0        ; Reply-Message holen
  158.     CALLEXEC    GetMsg
  159.     tst.l    d0        ; doch keine Message ?
  160.     beq.s    .Label5
  161.     moveq.l    #1,d0        ; kein Fehler
  162.  
  163. .Label3    move.l    d0,-(sp)
  164.     move.l    a4,a0
  165.     bsr    DeletePacket        ; Standard-Packet löschen
  166.     move.l    (sp)+,d0
  167.  
  168. .Label2    move.l    d0,-(sp)
  169.     move.l    a3,a0
  170.     bsr    DeletePort        ; Reply-Port löschen
  171.     move.l    (sp)+,d0
  172.  
  173. .Label1    movem.l    (sp)+,d7/a2-a5
  174.     rts
  175.  
  176.  
  177.  
  178.  
  179. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  180. ; ­­                           CreatePacket                          ­­
  181. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  182. ; ­­ CreatePacket erzeugt ein StandardPacket,Message- und DosPacket- ­­
  183. ; ­­ Teil werden verbunden. In d0/a0 wird er Zeiger zurückgeben,bzw. ­­
  184. ; ­­ 0 bei einen Fehler.                                             ­­
  185. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  186.  
  187.  
  188. CreatePacket    moveq.l    #sp_SIZEOF,d0        ; Speicher für StandardPacket reservieren
  189.     move.l    #MEMF_PUBLIC!MEMF_CLEAR,d1
  190.     CALLEXEC    AllocMem
  191.     tst.l    d0
  192.     beq.s    .Label1
  193.     move.l    d0,a0    
  194.     lea.l    sp_Pkt(a0),a1        ; Zeiger auf Packet-Teil
  195.     move.l    a1,sp_Msg+LN_NAME(a0)    ; Node-Namen muß auf Packet-Teil zeigen
  196.     move.l    a0,sp_Pkt+dp_Link(a0)    ; DosPacket-Link muß auf Message-Teil zeigen
  197. .Label1    rts    
  198.  
  199. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  200. ; ­­                           DeletePacket                          ­­
  201. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  202. ; ­­ DeletePacket  löscht ein   zuvor   mit  CreatePacket  erzeugtes ­­
  203. ; ­­ StandardPacket. Als Parameter  wird  in A0 der  Zeiger auf  das ­­
  204. ; ­­ StandardPacket erwartet.                                        ­­
  205. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  206.  
  207. DeletePacket    moveq.l    #0,d0
  208.     cmp.l    d0,a0        ; 0-Zeiger abfangen !
  209.     beq.s    .NIL
  210.     move.l    a0,a1
  211.     moveq.l    #sp_SIZEOF,d0        ; Speicher freigeben
  212.     CALLEXEC    FreeMem
  213. .NIL    rts
  214.  
  215.  
  216. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  217. ; ­­                          CreatePort                             ­­
  218. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  219. ; ­­ CreatePort erzeugt einen  funktionsfähigen   Msg-Port  des Typs ­­
  220. ; ­­ PA_SIGNAL mit der Priorität von D0.A0 zeigt auf den Port-Namen, ­­
  221. ; ­­ der nicht kopiert  wird. Falls A0 0  ist, wird er nicht in  die ­­
  222. ; ­­ Liste öffentlicher  Ports   aufgenommen.  Als SigTask wird  der ­­
  223. ; ­­ eigene eingetragen. Der Funktionswert in D0 ist  der Zeiger auf ­­
  224. ; ­­ auf den Port oder bei einem Fehler 0 .                          ­­
  225. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  226.  
  227.  
  228. CreatePort    move.l    a2,-(sp)
  229.     movem.l    d0/a0,-(sp)        ; retten
  230.     moveq.l    #MP_SIZE,d0        ; Speicher für Port reservieren
  231.     move.l    #MEMF_PUBLIC!MEMF_CLEAR,d1
  232.     CALLEXEC    AllocMem
  233.     tst.l    d0
  234.     beq.s    .NoMem
  235.     move.l    d0,a2
  236.     moveq.l    #-1,d0        ; Signal belegen
  237.     CALLEXEC    AllocSignal
  238.     move.b    d0,MP_SIGBIT(a2)
  239.     bmi.s    .FreeMem        ; kein Signal 
  240.     movem.l    (sp)+,d0/a0
  241.     move.b    d0,MP+LN_PRI(a2)    ; Priorität eintragen
  242.     move.b    #NT_MSGPORT,LN_TYPE(a2)
  243.     move.l    a0,MP+LN_NAME(a2)    ; Name
  244.     sub.l    a1,a1
  245.     CALLEXEC    FindTask
  246.     move.l    d0,MP_SIGTASK(a2)    ; eigener Task als Signal-Empfänger
  247.     lea.l    MP_MSGLIST(a2),a0
  248.     move.b    #NT_MESSAGE,LH_TYPE(a0)    ; Messages werden verwaltet
  249.     bsr    NewList
  250.     tst.l    MP+LN_NAME(a2)        ; öffentlicher Port ?
  251.     beq.s    .Private
  252.     move.l    a2,a1
  253.     CALLEXEC    AddPort        ; Port in allgemeine Liste eintragen
  254. .Private    move.l    a2,d0
  255.     move.l    (sp)+,a2
  256.     rts
  257.  
  258. .FreeMem    move.l    a2,a1
  259.     moveq.l    #MP_SIZE,d0        ; Speicher freigeben
  260.     CALLEXEC    FreeMem
  261. .NoMem    addq.l    #8,sp
  262.     move.l    (sp)+,a2
  263.     moveq.l    #0,d0        ; Fehler !
  264.     rts
  265.  
  266. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  267. ; ­­                            NewList                              ­­
  268. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  269. ; ­­ NewList initialisiert eine LIST-Struktur, A0 muß auf die LIST-  ­­
  270. ; ­­ Struktur zeigen.                                                ­­
  271. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  272.  
  273. NewList    move.l    a0,LH_HEAD(a0)        ; LH_HEAD muß auf LH_TAIL zeigen
  274.     addq.l    #LH_TAIL,(a0)
  275.     clr.l    LH_TAIL(a0)        ; LH_TAIL muß auf  0 zeigen
  276.     move.l    a0,LH_TAILPRED(a0)
  277.     rts
  278.  
  279. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  280. ; ­­                         DeletePort                              ­­
  281. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  282. ; ­­ DeletePort löscht einen zuvor mit CreatePort erzeugten MsgPort. ­­
  283. ; ­­ Als Parameter wird in A0 der Zeiger auf den Port erwartet.Noch  ­­
  284. ; ­­ ausstehende Messages werden zuvor reply-t.                      ­­
  285. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  286.  
  287. DeletePort    move.l    a2,-(sp)
  288.     move.l    a0,a2        ; Zeiger retten
  289.     CALLEXEC    Forbid        ; Multitasking unterbinden
  290. .Loop    move.l    a2,a0
  291.     CALLEXEC    GetMsg        ; Msg holen
  292.     tst.l    d0        ; keine (weitere) Message mehr
  293.     beq.s    .AllReplied
  294.     move.l    d0,a1
  295.     CALLEXEC    ReplyMsg        ; Message reply-en
  296.     bra.s    .Loop
  297. .AllReplied    move.l    MP+LN_NAME(a2),d0    ; öffentlicher Port ?
  298.     beq.s    .Private
  299.     move.l    a2,a1
  300.     CALLEXEC    RemPort        ; entfernen
  301. .Private    move.b    MP_SIGBIT(a2),d0
  302.     CALLEXEC    FreeSignal        ; Signal freigeben
  303.     move.l    a2,a1        ; Speicher freigeben
  304.     moveq.l    #MP_SIZE,d0
  305.     CALLEXEC    FreeMem
  306.     CALLEXEC    Permit        ; Multitasking wieder erlauben
  307.     move.l    (sp)+,a2
  308.     rts
  309.  
  310. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  311. ; ­­                           CLIText                               ­­
  312. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  313. ; ­­ CLIText gibt den mit einem $00-Byte  abgeschlossen Text (Zeiger ­­
  314. ; ­­ in A0) im CLI-Window aus.                                       ­­
  315. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  316.  
  317. CLIText    movem.l    d2/d3,-(sp)        ; Register retten
  318.     move.l    a0,d2        ; Zeiger nach D2
  319.     moveq.l    #-1,d3        ; Länge ermitteln
  320. .Label    addq.l    #1,d3
  321.     tst.b    (a0)+
  322.     bne.s    .Label
  323.     DOS    Output        ; Handle fürs CLI-Fenster
  324.     move.l    d0,d1
  325.     DOS    Write        ; Text ausgeben
  326.     movem.l    (sp)+,d2/d3
  327.     rts
  328.  
  329. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  330. ; ­­                          GetLong                                ­­
  331. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  332. ; ­­ GetLong übersetzt den ASCII-String (Zeiger in A0)  in ein Long- ­­
  333. ; ­­ Word, welches in D0 zurückgeben wird. Anschließend zeigt A0 auf ­­                                                      ­­
  334. ; ­­ das erste Zeichen nach der Zalh im String.  Enthält D1  0, trat ­­
  335. ; ­­ kein Fehler auf. 1 signalisiert einen Überlauf, -1 zeigt  einen ­­
  336. ; ­­ Fehler im Aufbau  an. Unterstützt werden  das  dezimale und das ­­
  337. ; ­­ hexadezimale ("$")  Zahlensystem.                               ­­
  338. ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  339.  
  340. GetLong    movem.l    d3-d3/a1-a3,-(sp)    ; Register retten
  341.     bsr.s    .Main
  342.     movem.l    (sp)+,d3-d3/a1-a3
  343.     rts
  344.  
  345. .Main    moveq.l    #0,d0        ; Register löschen
  346.     moveq.l    #0,d1
  347.     moveq.l    #0,d2
  348. .Label1    move.b    (a0)+,d3        ; Spaces und Tabs überlesen
  349.     cmp.b    #" ",d3
  350.     beq.s    .Label1
  351.     cmp.b    #9,d3
  352.     beq.s    .Label1
  353.  
  354.     cmp.b    #"$",d3        ; hexadezimal ?
  355.     beq    .Hex
  356.     cmp.b    #"-",d3        ; negativ ?
  357.     beq.s    .Negativ
  358.     cmp.b    #"9",d3        ; Ziffer ?
  359.     bhi    .Fehler
  360.     cmp.b    #"0"-1,d3
  361.     bhi    .Dezimal
  362.  
  363. .Fehler    subq.l    #1,a0        ; ^Fehler
  364.     moveq.l    #-1,d1        ; Fehlercode
  365.     rts
  366.  
  367. .Negativ    tst.b    d2        ; teste,ob bereits ein "-"
  368.     bne.s    .Fehler
  369.     moveq.l    #1,d2        ; Flag für negativ seten
  370.     bra    .Label1
  371.  
  372.  
  373.  
  374.  
  375. .Dezimal    subq.l    #1,a0        ; A0 auf erste Ziffer setzen
  376.     move.l    a0,a1        ; A1 ^erstes Ziffer
  377. .Label_D2    move.b    (a0)+,d3        ; nächste Zeiffer holen 
  378.     cmp.b    #"9",d3        ; wiederhole, bis Zahlenende
  379.     bhi.s    .Label_D3        ; erreicht wird.
  380.     cmp.b    #"0"-1,d3
  381.     bhi.s    .Label_D2
  382.  
  383. .Label_D3    lea.l    .Data10(pc),a2        ; Zeiger auf 10'er-Potenzen
  384.     subq.l    #1,a0        ; A0 ^letzte Ziffer+1
  385.     move.l    a0,a3        ; A3 ^letzte Ziffer+1 
  386.  
  387. .Label_D5    move.l    (a2)+,d4        ; Stellenzahl holen
  388.     beq.s    .Overflow        ; Longwordgrenze überschritten ?
  389.     moveq.l    #0,d3        ; D3 löschen
  390.     move.b    -(a3),d3        ; vorherige Ziffer holen
  391.     sub.b    #"0"+1,d3        ; und in Zahl umwandeln (1 abziehen wegen DBRA-Schleife)
  392.     bmi.s    .D_Zero        ; Ziffer "0" abfangen
  393. .Label_D4    add.l    d4,d0        ; Stellenzahl so oft wie Ziffer addieren
  394.     dbra    d3,.Label_D4
  395. .D_Zero    cmp.l    a3,a1        ; Zahlenanfang erreicht ?
  396.     bne.s    .Label_D5
  397.  
  398. .Vorzeichen    tst.b    d2        ; negatives Vorzeichen ?
  399.     beq.s    .NotNegative
  400.     tst.l    d0        ; Ist die Zahl größer als ein Longint ?
  401.     bmi    .Overflow
  402.     neg.l    d0        ; negativieren
  403. .NotNegative    moveq.l    #0,d1        ; keine Fehler
  404.     rts
  405.  
  406. .Data10    dc.l    1
  407.     dc.l    10
  408.     dc.l    100
  409.     dc.l    1000
  410.     dc.l    10000
  411.     dc.l    100000
  412.     dc.l    1000000
  413.     dc.l    10000000
  414.     dc.l    100000000
  415.     dc.l    1000000000
  416.     dc.l    0
  417.  
  418. .Overflow    moveq.l    #1,d1        ; Überfluß (Zahl zu groß !)
  419.     rts
  420.         
  421.  
  422.  
  423.  
  424.  
  425. .Hex    move.b    (a0)+,d3        ; erste Stelle OK ?
  426.     bsr.s    .Nibble
  427.     bmi    .Fehler        ; Fehler !
  428.  
  429.  
  430.     lea.l    -1(a0),a1        ; A1 ^ erste Ziffer
  431. .Label_H2    move.b    (a0)+,d3
  432.     bsr.s    .Nibble        ; in Hexa-Ziffer übersetzen 
  433.     bpl.s    .Label_H2
  434.     subq.l    #1,a0        ; A0 ^letzte Ziffer+1
  435.     move.l    a0,a2        ; A2 ^letzte Ziffer+1
  436.     moveq.l    #0,d1
  437. .Label_H3    move.b    -(a2),d3        ; vorherige Ziffer
  438.     bsr    .Nibble
  439.     lsl.l    d1,d4        ; Nibble an richtige Position schieben
  440.     add.l    d4,d0        ; zum Ergebnis addieren
  441.     addq.l    #4,d1
  442.     cmp.b    #32,d1        ; 32. Bit erreicht ?
  443.     bhi    .Overflow        ; wenn ja, Overflow !
  444.     cmp.l    a2,a1        ; Zahlenanfang erreicht ?
  445.     bne.s    .Label_H3
  446.     bra    .Vorzeichen
  447.  
  448. .Nibble    moveq.l    #0,d4
  449.     cmp.b    #"a"-1,d3        ; Ziffer d3 -> Zahl d4
  450.     bls.s    .N1        ; Upcase
  451.     cmp.b    #"f",d3
  452.     bhi.s    .N_Error
  453.     sub.b    #"a"-"A",d3
  454. .N1    sub.b    #"0",d3
  455.     cmp.b    #9,d3        ; Ziffer ?
  456.     bls.s    .Ziffer
  457.     sub.b    #"@"-"9",d3        ; Buchstabe
  458.     cmp.b    #$f,d3
  459.     bhi.s    .N_Error
  460. .Ziffer    move.b    d3,d4
  461.     rts
  462. .N_Error    moveq.l    #-1,d4        ; Fehler !
  463.     rts
  464.     
  465.  
  466.  
  467.