home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / Assembler / DVD!OMA2.DMS / in.adf / Examples / Library / MiscFunctions / Misc.asm < prev   
Encoding:
Assembly Source File  |  1994-10-13  |  8.9 KB  |  592 lines

  1.  
  2. ; Diverse Funktionen.  Compress-Tab 8.
  3.  
  4.  
  5.  
  6.  
  7.  
  8. _SysBase    EQU    4
  9.  
  10. CALL    MACRO
  11.     IFEQ    NARG-2
  12.     move.l    \2,a6
  13.     ENDC
  14.     IFLE    NARG-2
  15.     jsr    _LVO\1(a6)
  16.     MEXIT
  17.     ENDC
  18.     FAIL    CALL MACRO: PARAMETERFEHLER
  19.     ENDM
  20.  
  21.  
  22.  
  23.  
  24.  
  25.  
  26.  
  27.  
  28.  
  29.  
  30. ; Zufallszahlen.
  31.  
  32.     IFD    Random
  33.  
  34.     XDEF    _FastRand,_RangeRand,_RangeRan
  35.  
  36.  
  37.  
  38. ; FastRand (Zahl)
  39. ; Erzeugt schnell einen    Pseudo-Zufallszahl unter Benutzung der "Zahl".
  40. ; Rückgabe: Die    Zufallszahl.  Sollte für das nächste Mal gespeichert werden.
  41.  
  42. _FastRand
  43.     move.l    4(SP),d0
  44. SpecialRand
  45.     add.l    d0,d0
  46.     bhi.s    1$
  47.     eor.l    #$1D872B41,d0
  48. 1$    rts
  49.  
  50.  
  51.  
  52. ; RangeRand (Bereich)
  53. ; Erzeugt eine Zufallszahl im Bereich 1    bis "Bereich".    "Bereich" muß im
  54. ; Bereich 1 bis    65535 liegen.
  55. ; Rückgabe: Die    Zufallszahl.
  56.  
  57. _RangeRan
  58. _RangeRand
  59.     move.l    a0,-(SP)
  60.     lea    1$(PC),a0
  61.     move.l    (a0),d0
  62.     bsr.s    SpecialRand        ; erzeuge Zufallszahl
  63.     move.l    d0,(a0)
  64.     and.l    #$FFFF,d0
  65.     tst    4+4+2(SP)
  66.     beq.s    2$
  67.     divu    4+4+2(SP),d0
  68. 2$    clr    d0
  69.     swap    d0
  70.     tst    d0
  71.     bne.s    3$
  72.     moveq    #1,d0            ; gib statt Null immer 1 zurück
  73. 3$    move.l    (SP)+,a0
  74.     rts
  75.  
  76. 1$    dc.l    0    ; Letzter Zufallswert
  77.  
  78.  
  79.  
  80.     ENDC
  81.  
  82.  
  83.  
  84.  
  85.  
  86.  
  87.  
  88.  
  89.  
  90.  
  91. ; Zu den folgenden Routinen ist    einiges    zu sagen:
  92. ; AddTOF benutzt eine erweiterte Version der Interrupt-Struktur    namens
  93. ; "Isrvstr", zu    finden in "graphics/graphint.i".  Das erste Zusatzlangwort
  94. ; zeigt    auf die    aufzurufende C-Routine,    das zweite auf das an diese Routine
  95. ; zu übergebende Datenfeld.
  96. ; _ttskasm ist die eigentliche Routine,    die die    Schnittstelle zur C-Routine
  97. ; bildet.  Sie ruft nur    die C-Routine mit dem Zeiger auf das Datenfeld auf.
  98.  
  99.     IFD    AddTOF
  100.  
  101.     INCLUDE    "exec/types.i"
  102.     INCLUDE    "exec/interrupts.i"
  103.     INCLUDE    "graphics/graphint.i"
  104.     INCLUDE    "hardware/intbits.i"
  105.     INCLUDE    "lvo/exec.i"
  106.     INCLUDE    "lvo/graphics.i"
  107.  
  108.     XDEF    _AddTOF,_RemTOF,_ttskasm,_waitbeam
  109.  
  110.     XREF    _GfxBase    ; für _waitbeam
  111.  
  112.  
  113.  
  114.  
  115.  
  116. ; AddTOF (Interruptstruktur-Zeiger, C-Routinen-Zeiger, Datenfeldzeiger)
  117. ; Hängt    eine C-Routine in die Vertical-Blank-Interrupt-Serverkette.  Der
  118. ; C-Routine wird der Zeiger auf    das Datenfeld übergeben.
  119. ; Rückgabe: Keine.
  120.  
  121. _AddTOF_REG    REG    d0-d1/a0-a1/a6
  122. REGISTER    SET    5
  123.  
  124. _AddTOF
  125.     movem.l    _AddTOF_REG,-(SP)
  126.     move.l    REGISTER*4+4(SP),a1    ; Strukturzeiger (für AddIntServer)
  127.     move.l    a1,Isrv_Iptr(a1)    ; damit    A1 im Server gleich geladen ist
  128.     lea    _ttskasm(PC),a0        ; unsere Zwischenroutine...
  129.     move.l    a0,Isrv_code(a1)    ; ...ist aufzurufen
  130.     move.l    REGISTER*4+8(SP),Isrv_ccode(a1)    ; 1. Zusatzlangwort: C-Routine
  131.     move.l    REGISTER*4+12(SP),Isrv_Carg(a1)    ; 2. Zusatzlangwort: Datenfeld
  132.     moveq    #INTB_VERTB,d0
  133.     CALL    AddIntServer,_SysBase
  134.     movem.l    (SP)+,_AddTOF_REG
  135.     rts
  136.  
  137.  
  138.  
  139.  
  140.  
  141. ; RemTOF (Interruptstruktur-Zeiger)
  142. ; Entfernt die C-Routine wieder    aus der    Serverkette.
  143. ; Rückgabe: Keine.
  144.  
  145. _RemTOF_REG    REG    d0-d1/a0-a1/a6
  146. REGISTER    SET    5
  147.  
  148. _RemTOF
  149.     movem.l    _RemTOF_REG,-(SP)
  150.     move.l    REGISTER*4+4(SP),a1    ; Interrupt-Struktur
  151.     moveq    #INTB_VERTB,d0        ; Interrupt-Nummer
  152.     CALL    RemIntServer,_SysBase    ; weg damit !
  153.     movem.l    (SP)+,_RemTOF_REG
  154.     rts
  155.  
  156.  
  157.  
  158.  
  159.  
  160. ; Assembler-Hilfsroutine.  Bildet die Schnittstelle zur    C-Routine.
  161.  
  162. _ttskasm
  163.     move.l    Isrv_ccode(a1),a0    ; Zeiger auf C-Routine
  164.     move.l    Isrv_Carg(a1),-(SP)    ; Zeiger auf Datenfeld ist Parameter
  165.     jsr    (a0)            ; rufe C-Routine auf
  166.     addq    #4,SP            ; korrigiere Stack
  167.     moveq    #0,d0            ; d.h. andere Server auch aufrufen
  168.     rts
  169.  
  170.  
  171.  
  172.  
  173.  
  174. ; waitbeam (Positionszeile)
  175. ; Wartet, bis der Videostrahl über die Positionszeile gelaufen ist.
  176. ; Rückgabe: Die    aktuelle Videostrahl-Position.
  177.  
  178. _waitbeam_REG    REG    d1/a0-a1/a6
  179. REGISTER    SET    4
  180.  
  181. _waitbeam
  182.     movem.l    _waitbeam_REG,-(SP)
  183.     move.l    _GfxBase,a6
  184. 1$    CALL    VBeamPos        ; hole Position
  185.     cmp.l    REGISTER*4+4(SP),d0    ; schon    erreicht ?
  186.     ble.s    1$            ; nein,    weiter warten
  187.     movem.l    (SP)+,_waitbeam_REG    ; gib die aktuelle Position zurück
  188.     rts
  189.  
  190.  
  191.  
  192.     ENDC
  193.  
  194.  
  195.  
  196.  
  197.  
  198.  
  199.  
  200.  
  201.  
  202.  
  203.  
  204.  
  205.  
  206.  
  207.  
  208.  
  209.  
  210.  
  211.  
  212.  
  213. ; Ein- und Ausgabe.  Files sind    hier AmigaDOS-Filehandle.
  214.  
  215.  
  216.  
  217.  
  218.  
  219. ; puts (Stringzeiger)
  220. ; Schreibt einen String    auf "stdout".  Das Stringende 0    wird durch ein Line-
  221. ; feed ersetzt.
  222. ; Rückgabe: Linefeed.  Im Fehlerfall -1.
  223.  
  224.     IFD    puts
  225.  
  226.     XDEF    _puts
  227.  
  228.     XREF    _fprintf
  229.     XREF    _stdout
  230.  
  231. _puts
  232.     move.l    4(SP),-(SP)        ; Stringzeiger
  233.     pea    1$(PC)            ; Formatstring
  234.     move.l    _stdout,-(SP)        ; File
  235.     jsr    _fprintf
  236.     add    #4*3,SP
  237.     rts
  238.  
  239. 1$    dc.b    '%s',10,0        ; Ausgabe mit Linefeed !
  240.  
  241.     ENDC
  242.  
  243.  
  244.  
  245.  
  246.  
  247. ; fputs    (Stringzeiger, File)
  248. ; Schreibt einen String    in ein File.  Das Stringende 0 wird nicht geschrieben.
  249. ; Rückgabe: Das    letzte ausgegebene Zeichen.  Im    Fehlerfall -1.
  250.  
  251.     IFD    fputs
  252.  
  253.     XDEF    _fputs
  254.  
  255.     XREF    _fputc
  256.  
  257. _fputs_REG    REG    d1/a0-a2/a6
  258. REGISTER    SET    5
  259.  
  260. _fputs
  261.     movem.l    _fputs_REG,-(SP)
  262.     move.l    REGISTER*4+4(SP),a2    ; Stringzeiger
  263.     bra.s    1$
  264.  
  265. 2$    move.l    REGISTER*4+8(SP),-(SP)    ; File
  266.     move.l    d1,-(SP)        ; Zeichen
  267.     jsr    _fputc
  268.     addq    #2*4,SP
  269.     tst.l    d0            ; Schreibfehler    ?
  270.     bmi.s    0$            ; ja, Ende mit -1
  271. 1$    moveq    #0,d1
  272.     move.b    (a2)+,d1
  273.     bne.s    2$
  274.  
  275.     ; Fertig.  D0 ist entweder -1 oder das letzte Zeichen.
  276. 0$    movem.l    (SP)+,_fputs_REG
  277.     rts
  278.  
  279.     ENDC
  280.  
  281.  
  282.  
  283.  
  284.  
  285. ; getchar ()
  286. ; Lies genau ein Zeichen von "stdin".
  287. ; Rückgabe: Das    gelesene Zeichen.  Im Fehlerfall oder bei Fileende -1.
  288.  
  289.     IFD    getchar
  290.  
  291.     XDEF    _getchar
  292.  
  293.     XREF    _fgetc
  294.     XREF    _stdin
  295.  
  296. _getchar
  297.     move.l    _stdin,-(SP)
  298.     jsr    _fgetc
  299.     addq    #4,SP
  300.     rts
  301.  
  302.     ENDC
  303.  
  304.  
  305.  
  306.  
  307.  
  308. ; putchar (Zeichen)
  309. ; Gib ein Zeichen auf "stdout" aus.
  310. ; Rückgabe: Das    ausgegebene Zeichen.  Im Fehlerfall -1.
  311.  
  312.     IFD    putchar
  313.  
  314.     XDEF    _putchar
  315.  
  316.     XREF    _fputc
  317.     XREF    _stdout
  318.  
  319. _putchar
  320.     move.l    _stdout,-(SP)
  321.     move.l    4+4(SP),-(SP)
  322.     jsr    _fputc
  323.     addq    #2*4,SP
  324.     rts
  325.  
  326.     ENDC
  327.  
  328.  
  329.  
  330.  
  331.  
  332. ; fgetc    (File)
  333. ; Lies genau ein Zeichen aus einem File.
  334. ; Rückgabe: Das    gelesene Zeichen.  Im Fehlerfall oder bei Fileende -1.
  335.  
  336.     IFD    fgetc
  337.  
  338.     INCLUDE    "lvo/dos.i"
  339.  
  340.     XDEF    _fgetc
  341.  
  342.     XREF    _DOSBase
  343.  
  344. _fgetc_REG    REG    d1-d3/a6
  345. REGISTER    SET    4
  346.  
  347. _fgetc
  348.     movem.l    _fgetc_REG,-(SP)
  349.     subq    #2,SP
  350.     move.l    REGISTER*4+2+4(SP),d1    ; File
  351.     move.l    SP,d2            ; Puffer
  352.     moveq    #1,d3            ; Länge
  353.     CALL    Read,_DOSBase
  354.     subq.l    #1,d0            ; genau    ein Byte ?
  355.     beq.s    1$
  356.     moveq    #-1,d0            ; nein,    Fehler
  357.     bra.s    0$
  358.  
  359. 1$    move.b    (SP),d0            ; ja, hole das Byte (D0    war Null)
  360.  
  361. 0$    addq    #2,SP
  362.     movem.l    (SP)+,_fgetc_REG
  363.     rts
  364.  
  365.     ENDC
  366.  
  367.  
  368.  
  369.  
  370.  
  371. ; fputc    (Zeichen, File)
  372. ; Gib ein Zeichen auf ein File aus.
  373. ; Rückgabe: Das    ausgegebene Zeichen.  Im Fehlerfall -1.
  374.  
  375.     IFD    fputc
  376.  
  377.     INCLUDE    "lvo/dos.i"
  378.  
  379.     XDEF    _fputc
  380.  
  381.     XREF    _DOSBase
  382.  
  383. _fputc_REG    REG    d1-d3/a6
  384. REGISTER    SET    4
  385.  
  386. _fputc
  387.     movem.l    _fputc_REG,-(SP)
  388.     move.l    REGISTER*4+8(SP),d1    ; File
  389.     lea    REGISTER*4+4+3(SP),a0
  390.     move.l    a0,d2            ; Puffer
  391.     moveq    #1,d3            ; Länge
  392.     CALL    Write,_DOSBase
  393.     tst.l    d0            ; Fehler ?
  394.     bmi.s    1$            ; ja, gib -1 zurück
  395.     move.l    REGISTER*4+4(SP),d0    ; sonst    das Zeichen zurück
  396. 1$    movem.l    (SP)+,_fputc_REG
  397.     rts
  398.  
  399.     ENDC
  400.  
  401.  
  402.  
  403.  
  404.  
  405. ; fclose (File)
  406. ; Schließe das File.
  407.  
  408.     IFD    fclose
  409.  
  410.     INCLUDE    "lvo/dos.i"
  411.  
  412.     XDEF    _fclose
  413.  
  414.     XREF    _DOSBase
  415.  
  416. _fclose_REG    REG    d0-d3/a6
  417. REGISTER    SET    5
  418.  
  419. _fclose
  420.     movem.l    _fclose_REG,-(SP)
  421.     move.l    REGISTER*4+4(SP),d1
  422.     CALL    Close,_DOSBase
  423.     movem.l    (SP)+,_fclose_REG
  424.     rts
  425.  
  426.     ENDC
  427.  
  428.  
  429.  
  430.  
  431.  
  432.  
  433.  
  434.  
  435.  
  436.  
  437. ; Formatierte Ausgabe.
  438.  
  439.  
  440.  
  441.  
  442.  
  443. ; sprintf (Stringzeiger, Formatstringzeiger {Argliste})
  444. ; Formatiert den Formatstring mit der Argumentliste und    schreibt den Ziel-
  445. ; string in (Stringzeiger).
  446. ; Rückgabe: Der    Zeiger auf den Zielstring.
  447.  
  448.     IFD    sprintf
  449.  
  450.     INCLUDE    "lvo/exec.i"
  451.  
  452.     XDEF    _sprintf
  453.  
  454. _sprintf_REG    REG    a0-a3/a6
  455. REGISTER    SET    5
  456.  
  457. _sprintf
  458.     movem.l    _sprintf_REG,-(SP)
  459.     move.l    REGISTER*4+8(SP),a0    ; Formatstring
  460.     lea    REGISTER*4+12(SP),a1    ; Daten
  461.     lea    1$(PC),a2        ; Prozedur
  462.     move.l    REGISTER*4+4(SP),a3    ; Zielstring
  463.     CALL    RawDoFmt,_SysBase
  464.     move.l    REGISTER*4+4(SP),d0    ; gib Zeiger auf Zielstring zurück
  465.     movem.l    (SP)+,_sprintf_REG
  466.     rts
  467.  
  468. 1$    move.b    d0,(a3)+
  469.     rts
  470.  
  471.     ENDC
  472.  
  473.  
  474.  
  475.  
  476.  
  477. ; fprintf (File, Formatstringzeiger {Argliste})
  478. ; Formatiert den Formatstring mit der Argumentliste und    schreibt den Ziel-
  479. ; string in ein    File.
  480. ; Rückgabe: 0.    Im Fehlerfall -1.
  481.  
  482.     IFD    fprintf
  483.  
  484.     XDEF    _fprintf
  485.  
  486.     XREF    __doprnt
  487.  
  488. _fprintf
  489.     pea    12(SP)
  490.     move.l    8+4(SP),-(SP)
  491.     move.l    4+4+4(SP),-(SP)
  492.     jsr    __doprnt
  493.     add    #4*3,SP
  494.     rts
  495.  
  496.     ENDC
  497.  
  498.  
  499.  
  500.  
  501.  
  502. ; printf (Formatstringzeiger {Argliste})
  503. ; Formatiert den Formatstring mit der Argumentliste und    schreibt den Ziel-
  504. ; string nach "stdout".
  505. ; Rückgabe: 0.    Im Fehlerfall -1.
  506.  
  507.     IFD    printf
  508.  
  509.     XDEF    _printf
  510.  
  511.     XREF    __doprnt
  512.     XREF    _stdout
  513.  
  514. _printf
  515.     pea    8(SP)
  516.     move.l    4+4(SP),-(SP)
  517.     move.l    _stdout,-(SP)
  518.     jsr    __doprnt
  519.     add    #4*3,SP
  520.     rts
  521.  
  522.     ENDC
  523.  
  524.  
  525.  
  526.  
  527.  
  528. ; Hilfsroutine     doprnt    (File, Formatstringzeiger, Argumentlistenzeiger)
  529. ; Formatiert den Formatstring mit der Argumentliste und    schreibe den Ziel-
  530. ; string in ein    File.
  531. ; Rückgabe: 0.    Im Fehlerfall -1.
  532.  
  533.     IFD    doprnt
  534.  
  535.     INCLUDE    "lvo/exec.i"
  536.     INCLUDE    "lvo/dos.i"
  537.  
  538.     XDEF    __doprnt
  539.  
  540.     XREF    _DOSBase
  541.  
  542. __doprnt_REG    REG    d1-d3/a0-a4/a6
  543. REGISTER    SET    9
  544.  
  545. __doprnt
  546.     ; Formatiere.
  547.     movem.l    __doprnt_REG,-(SP)
  548.     movem.l    REGISTER*4+8(SP),a0/a1    ; Formatstring-    und Daten-Zeiger
  549.     lea    1$(PC),a2        ; Prozedur
  550.     link    a4,#-256        ; belege den Stringspeicher
  551.     move.l    SP,a3            ; Zielstring
  552.     CALL    RawDoFmt,_SysBase
  553.  
  554.     ; Vermesse den String.
  555.     move.l    SP,a0            ; fertiger String
  556. 2$    tst.b    (a0)+
  557.     bne.s    2$
  558.     subq    #1,a0
  559.     sub.l    SP,a0            ; ergibt Stringlänge ohne Null
  560.  
  561.     ; Ausgabe.
  562.     move.l    a0,d3
  563.     beq.s    0$            ; wenn String leer ist
  564.     move.l    SP,d2            ; Puffer
  565.     move.l    REGISTER*4+8(a4),d1    ; File
  566.     CALL    Write,_DOSBase        ; egal,    ob es klappt
  567.     tst.l    d0            ; Fehler ?
  568.     bmi.s    0$            ; ja, gib -1 zurück
  569.     moveq    #0,d0            ; nein,    gib Null zurück
  570.  
  571.     ; Fertig.
  572. 0$    unlk    a4
  573.     movem.l    (SP)+,__doprnt_REG
  574.     rts
  575.  
  576. 1$    move.b    d0,(a3)+
  577.     rts
  578.  
  579.     ENDC
  580.  
  581.  
  582.  
  583.  
  584.  
  585.  
  586.  
  587.  
  588.  
  589.  
  590.     END
  591.  
  592.