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

  1.  
  2. ; Exec-Support-Routinen.  Compress-Tab 8.
  3.  
  4.     NOLIST
  5.     INCLUDE    "exec/types.i"
  6.     INCLUDE    "exec/nodes.i"
  7.     INCLUDE    "exec/lists.i"
  8.     INCLUDE    "exec/memory.i"
  9.     INCLUDE    "exec/interrupts.i"
  10.     INCLUDE    "exec/ports.i"
  11.     INCLUDE    "exec/io.i"
  12.     INCLUDE    "exec/libraries.i"
  13.     INCLUDE    "exec/tasks.i"
  14.     INCLUDE    "exec/execbase.i"
  15.     INCLUDE    "lvo/exec.i"
  16.     LIST
  17.  
  18.  
  19.  
  20. _SysBase    EQU    4
  21.  
  22. CALL    MACRO
  23.     IFEQ NARG-2
  24.     move.l    \2,a6
  25.     ENDC
  26.     IFLE NARG-2
  27.     jsr    _LVO\1(a6)
  28.     MEXIT
  29.     ENDC
  30.     FAIL    CALL MACRO: PARAMETERFEHLER
  31.     ENDM
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42. ; NewList.
  43.  
  44.     IFD    NewList
  45.  
  46.     XDEF    _NewList
  47.  
  48. _NewList
  49.     move.l    4(SP),a0
  50.     NEWLIST    a0
  51.     rts
  52.  
  53.     ENDC
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64. ; BeginIO.
  65.  
  66.     IFD    BeginIO
  67.  
  68.     XDEF    _BeginIO
  69.  
  70. _BeginIO
  71.     move.l    4(SP),a1
  72.     BEGINIO
  73.     rts
  74.  
  75.     ENDC
  76.  
  77.  
  78.  
  79.  
  80.  
  81.  
  82.  
  83.  
  84.  
  85.  
  86. ; CreatePort und DeletePort.
  87.  
  88.     IFD    CreatePort
  89.  
  90.     XDEF    _CreatePort,_DeletePort
  91.  
  92.  
  93.  
  94.  
  95.  
  96. ; Portzeiger = CreatePort (Namenzeiger,    Priorität)
  97. ; Rückgabewert in D0; gibt Null    zurück,    wenn Port nicht    erzeugbar ist.
  98.  
  99. _CreatePort_REG    REG    d1/d7/a0-a2/a6    ; 6 Register
  100. REGISTER    SET    6
  101.  
  102. _CreatePort
  103.     ; Hole ein Signalbit.
  104.     movem.l    _CreatePort_REG,-(SP)
  105.     moveq    #-1,d0            ; beliebiges Bit
  106.     CALL    AllocSignal,_SysBase
  107.     move.l    d0,d7            ; belegt ?
  108.     bmi.s    1$            ; nein,    gib Null zurück
  109.  
  110.     ; Belege die Port-Struktur.
  111.     moveq    #MP_SIZE,d0
  112.     move.l    #MEMF_CLEAR!MEMF_PUBLIC,d1
  113.     CALL    AllocMem
  114.     tst.l    d0            ; belegt ?
  115.     bne.s    2$
  116.     move.l    d7,d0            ; nein,    Signal freigeben
  117.     CALL    FreeSignal
  118. 1$    moveq    #0,d0            ; gib Null zurück
  119.     bra.s    0$
  120.  
  121.     ; Initialisiere    den Port.
  122. 2$    move.l    d0,a2
  123.     move.l    REGISTER*4+4(SP),LN_NAME(a2)    ; Name
  124.     move.b    REGISTER*4+8+3(SP),LN_PRI(a2)    ; Priorität, nimm nur 8    Bits !
  125.     move.b    #NT_MSGPORT,LN_TYPE(a2)    ; Typ
  126.     move.b    #PA_SIGNAL,MP_FLAGS(a2)
  127.     move.b    d7,MP_SIGBIT(a2)    ; Signalbit
  128.     suba.l    a1,a1
  129.     CALL    FindTask        ; finde    uns selber
  130.     move.l    d0,MP_SIGTASK(a2)
  131.  
  132.     ; Melde    den Port an das    System.
  133.     tst.l    REGISTER*4+4(SP)    ; ist Namenzeiger Null ?
  134.     beq.s    3$
  135.     move.l    a2,a1
  136.     CALL    AddPort            ; nein
  137.     bra.s    4$
  138.  
  139. 3$    lea    MP_MSGLIST(a2),a0    ; wenn Nullzeiger
  140.     NEWLIST    a0
  141. 4$    move.l    a2,d0            ; Portzeiger
  142.  
  143.     ; Fertig.
  144. 0$    movem.l    (SP)+,_CreatePort_REG
  145.     rts
  146.  
  147.  
  148.  
  149.  
  150.  
  151. ; DeletePort (Portzeiger)
  152.  
  153. _DeletePort_REG    REG    d0-d1/a0-a2/a6    ; 6 Register
  154. REGISTER    SET    6
  155.  
  156. _DeletePort
  157.     ; Entferne den Port aus    dem System.
  158.     movem.l    _DeletePort_REG,-(SP)
  159.     move.l    _SysBase,a6
  160.     move.l    REGISTER*4+4(SP),a2
  161.     move.l    LN_NAME(a2),d0
  162.     beq.s    1$
  163.     move.l    a2,a1
  164.     CALL    RemPort
  165.  
  166.     ; Lösche Portwerte.
  167. 1$    moveq    #-1,d0
  168.     move.b    d0,LN_TYPE(a2)
  169.     move.l    d0,MP_MSGLIST+LH_HEAD(a2)
  170.  
  171.     ; Gib das Signalbit und    den Speicher frei.
  172.     moveq    #0,d0            ; FreeSignal braucht 32-Bit-Wert !
  173.     move.b    MP_SIGBIT(a2),d0
  174.     CALL    FreeSignal
  175.     move.l    a2,a1
  176.     moveq    #MP_SIZE,d0
  177.     CALL    FreeMem
  178.  
  179.     ; Fertig.
  180.     movem.l    (SP)+,_DeletePort_REG
  181.     rts
  182.  
  183.  
  184.  
  185.  
  186.  
  187.     ENDC
  188.  
  189.  
  190.  
  191.  
  192.  
  193.  
  194.  
  195.  
  196.  
  197.  
  198. ; CreateStdIO, DeleteStdIO, CreateExtIO    und DeleteExtIO.
  199.  
  200.     IFD    CreateIO
  201.  
  202.     XDEF    _CreateStdIO,_DeleteStdIO,_CreateExtIO,_DeleteExtIO
  203.  
  204.  
  205.  
  206.  
  207.  
  208. ; IOStdReq-Zeiger = CreateStdIO    (ioReplyPort)
  209. ; Rückgabe in D0; gibt Null zurück, wenn etwas schiefging.
  210.  
  211. _CreateStdIO
  212.     pea    IOSTD_SIZE
  213.     move.l    4+4(SP),-(SP)
  214.     bsr.s    _CreateExtIO
  215.     addq    #2*4,SP            ; korrigiere Stack
  216.     rts
  217.  
  218.  
  219.  
  220.  
  221.  
  222. ; IORequest-Zeiger = CreateExtIO (ioReplyPort, Requestgröße)
  223. ; Rückgabe in D0; gibt Null zurück, wenn etwas schiefging.
  224.  
  225. _CreateExtIO_REG    REG    d1/a0-a1/a6    ; 4 Register
  226. REGISTER    SET    4
  227.  
  228. _CreateExtIO
  229.     ; Ist der Portzeiger Null ?
  230.     movem.l    _CreateExtIO_REG,-(SP)
  231.     move.l    REGISTER*4+4(SP),d0
  232.     beq.s    0$            ; ja, Ende mit Null
  233.  
  234.     ; Belege die Request-Struktur.
  235.     move.l    REGISTER*4+8(SP),d0    ; Requestgröße
  236.     move.l    #MEMF_CLEAR!MEMF_PUBLIC,d1
  237.     CALL    AllocMem,_SysBase
  238.     tst.l    d0            ; belegt ?
  239.     beq.s    0$            ; nein,    Ende mit Null
  240.  
  241.     ; Initialisiere    die Struktur.
  242.     move.l    d0,a0
  243.     move.b    #NT_MESSAGE,LN_TYPE(a0)
  244.     move.w    REGISTER*4+8+2(SP),MN_LENGTH(a0)    ; nimm nur 16 Bit !
  245.     move.l    REGISTER*4+4(SP),MN_REPLYPORT(a0)
  246.  
  247.     ; Fertig.
  248. 0$    movem.l    (SP)+,_CreateExtIO_REG
  249.     rts
  250.  
  251.  
  252.  
  253.  
  254.  
  255. ; DeleteExtIO (ioExt)
  256. ; DeleteStdIO ist funktionell identisch    !
  257.  
  258. _DeleteExtIO_REG    REG    d0-d1/a0-a1/a6    ; 5 Register
  259. REGISTER    SET    5
  260.  
  261. _DeleteStdIO
  262. _DeleteExtIO
  263.     ; Wurde    ein Nullzeiger übergeben ?
  264.     movem.l    _DeleteExtIO_REG,-(SP)
  265.     move.l    REGISTER*4+4(SP),d0
  266.     beq.s    0$            ; ja, Ende
  267.     
  268.     ; Mache    den Request kaputt und gib ihn frei.
  269.     move.l    d0,a1
  270.     moveq    #-1,d0
  271.     move.b    d0,LN_TYPE(a1)
  272.     move.l    d0,IO_DEVICE(a1)
  273.     move.l    d0,IO_UNIT(a1)
  274.     moveq    #0,d0            ; FreeMem braucht 32 Bit !
  275.     move.w    MN_LENGTH(a1),d0
  276.     CALL    FreeMem,_SysBase
  277.  
  278.     ; Fertig.
  279. 0$    movem.l    (SP)+,_DeleteExtIO_REG
  280.     rts
  281.  
  282.  
  283.  
  284.  
  285.  
  286.     ENDC
  287.  
  288.  
  289.  
  290.  
  291.  
  292.  
  293.  
  294.  
  295.  
  296.  
  297. ; CreateTask.
  298.  
  299.     IFD    CreateTask
  300.  
  301.     XDEF    _CreateTask,_DeleteTask
  302.  
  303.  
  304.  
  305.  
  306.  
  307. ; Taskzeiger = CreateTask (Namenzeiger,    Priorität, AnfangsPC, Stackgröße)
  308. ; Rückgabe in D0; gibt im Fehlerfall Null zurück.
  309.  
  310. ML_GROESSE    EQU    ML_SIZE+2*ME_SIZE
  311.  
  312. _CreateTask_REG    REG    d1/d7/a0-a4/a6
  313. REGISTER    SET    8
  314.  
  315. _CreateTask
  316.     ; Runde    die Stackgröße auf Langwortgrenze.
  317.     movem.l    _CreateTask_REG,-(SP)
  318.     link    a4,#-ML_GROESSE        ; Platz    für zweite MemList
  319.     move.l    REGISTER*4+8+4*3(a4),d7    ; Stackgröße
  320.     addq.l    #3,d7
  321.     and    #~3,d7
  322.  
  323.     ; Benutze die zweite MemList, damit CreateTask reentrant ist.
  324.     lea    _TaskMemTemplate(PC),a2    ; Quelle
  325.     move.l    SP,a1            ; Ziel
  326.     move.l    a1,a0            ; für AllocEntry
  327.     moveq    #(ML_GROESSE/2)-1,d0
  328. 1$    move.w    (a2)+,(a1)+
  329.     dbra    d0,1$
  330.     move.l    d7,-ML_GROESSE+ML_SIZE+ME_SIZE+ME_LENGTH(a4)    ; Stackgröße
  331.  
  332.     ; Belege den Speicher.
  333.     CALL    AllocEntry,_SysBase
  334.     bclr    #31,d0            ; alles    Ok ?
  335.     beq.s    2$
  336.     moveq    #0,d0            ; nein
  337.     bra.s    0$
  338.  
  339.     ; Hole die Speicherzeiger.
  340. 2$    move.l    d0,a1
  341.     move.l    ML_SIZE+ME_ADDR(a1),a2    ; Task-Struktur
  342.     move.l    ML_SIZE+ME_SIZE+ME_ADDR(a1),a0    ; Stack
  343.  
  344.     ; Setze    die Stackwerte.
  345.     move.l    a0,TC_SPLOWER(a2)
  346.     add.l    d7,a0            ; addiere Stackgröße
  347.     move.l    a0,TC_SPUPPER(a2)
  348.     move.l    a0,TC_SPREG(a2)
  349.  
  350.     ; Setze    Taskwerte.
  351.     move.b    #NT_TASK,LN_TYPE(a2)
  352.     move.b    REGISTER*4+8+4*1+3(a4),LN_PRI(a2)    ; Priorität, nimm 8 Bits
  353.     move.l    REGISTER*4+8+4*0(a4),LN_NAME(a2)    ; Name
  354.  
  355.     ; Klebe    die MemList an die Task.
  356.     lea    TC_MEMENTRY(a2),a0
  357.     NEWLIST    a0
  358.     CALL    AddHead            ; statt    des Makro, damit's kurz    ist
  359.  
  360.     ; Melde    dem System die Task.
  361.     move.l    a2,a1            ; Task
  362.     move.l    a2,d7            ; merken
  363.     move.l    REGISTER*4+8+4*2(a4),a2    ; Anfangs-PC
  364.     suba.l    a3,a3            ; finalPC
  365.     CALL    AddTask
  366.     move.l    d7,d0            ; Rückgabewert:    Taskzeiger
  367.  
  368.     ; Fertig.
  369. 0$    unlk    a4
  370.     movem.l    (SP)+,_CreateTask_REG
  371.     rts
  372.  
  373.  
  374.  
  375.  
  376.  
  377. ; DeleteTask (Taskzeiger)
  378.  
  379. _DeleteTask_REG    REG    d0-d1/a0-a1/a6
  380. REGISTER    SET    5
  381.  
  382. _DeleteTask
  383.     movem.l    _DeleteTask_REG,-(SP)
  384.     move.l    REGISTER*4+4(SP),a1    ; das Freigeben    der Taskstruktur und des
  385.     CALL    RemTask,_SysBase    ; Stacks wird von RemTask erledigt
  386.     movem.l    (SP)+,_DeleteTask_REG
  387.     rts
  388.  
  389.  
  390.  
  391.  
  392.  
  393. _TaskMemTemplate
  394.     ; Die Memory-Liste
  395.     dcb.b    LN_SIZE,0    ; kein Node
  396.     dc.w    2        ; 2 Einträge:
  397.     dc.l    MEMF_PUBLIC!MEMF_CLEAR,TC_SIZE    ; für die Task-Struktur
  398.     dc.l    MEMF_CLEAR,0    ; für den Stack, Größe wird später eingetragen
  399.  
  400.  
  401.  
  402.  
  403.  
  404.     ENDC
  405.  
  406.  
  407.  
  408.  
  409.  
  410.  
  411.  
  412.  
  413.  
  414.  
  415.     END
  416.  
  417.