home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 6 / AACD06.ISO / AACD / Utilities / Resources / ProNET / src / fs / pronet-server.s
Text File  |  1997-01-03  |  26KB  |  1,281 lines

  1. *
  2. * pronet-server.s
  3. *
  4.  
  5.         include    "exec/exec.i"
  6.         include    "dos/dos.i"
  7.         include    "dos/dosextens.i"
  8.         include    "dos/filehandler.i"
  9.         include    "devices/input.i"
  10.         include    "devices/inputevent.i"
  11.         include    "P:include/devices/pronet.i"
  12.         include    "A:OSmacros.i"
  13.  
  14.         include    "p:include/network.i"
  15.  
  16.         include    "exec_lib.i"
  17.         include    "dos_lib.i"
  18.         include    "intuition_lib.i"
  19.  
  20.           STRUCTURE    PNClient,0
  21.         APTR    pnc_next
  22.         UWORD    pnc_port
  23.         UWORD    pnc_servmsgs
  24.         APTR    pnc_handler
  25.         APTR    pnc_packet
  26.         APTR    pnc_volnode    ;aktuelle Volume
  27.         APTR    pnc_dlbuf    ;DownLoad-Buffer
  28.         APTR    pnc_dlbufpt    ;aktuelle Position
  29.         ULONG    pnc_dlbytes    ;wieviel Bytes noch ?? 0 = nix
  30.         LABEL    pnc_SIZEOF
  31.  
  32. j        bsr    dec2long
  33.         move.l    d1,unit
  34.  
  35.         move.l    4.w,a6
  36.         sub.l    a1,a1
  37.         LIBCALL    FindTask
  38.         move.l    d0,ourtask
  39.  
  40.         lea    dosname(pc),a1
  41.         moveq    #33,d0
  42.         LIBCALL    OpenLibrary
  43.         move.l    d0,dosbase
  44.         beq.s    nodos
  45.  
  46.         move.l    ourtask(pc),a0
  47.         move.l    #-1,pr_WindowPtr(a0)
  48.  
  49.         bsr    StartInputHandler
  50.         tst.w    d0
  51.         bne.s    noinput
  52.  
  53.         bsr    startpronet
  54.         tst.w    d0
  55.         bne.s    nopronet
  56.  
  57.         bsr    startmessage
  58.         bsr    Wait4Message
  59.  
  60.         clr.l    RC
  61.  
  62.         bsr    stoppronet
  63.  
  64. nopronet    bsr    StopInputHandler
  65.  
  66. noinput        move.l    dosbase(pc),a1
  67.         move.l    4.w,a6
  68.         LIBCALL    CloseLibrary
  69.  
  70. nodos        move.l    RC(pc),d0
  71.         rts
  72. RC        dc.l    20
  73.  
  74.         dc.b    "$VER: pronet-server 38.0 (3.1.97)",13,10,0
  75.         even
  76.  
  77. startpronet    moveq    #pnr_Size,d0
  78.         bsr    GetIORequest
  79.         move.l    d0,pronetio
  80.         beq    spnoioreq
  81.  
  82.         bsr    CreatePort
  83.         move.l    d0,pronetport
  84.         beq    spnomsgport
  85.  
  86.         lea    pronetname(pc),a0
  87.         move.l    unit(pc),d0
  88.         moveq    #PNF_ERRORSTRING,d1
  89.         move.l    pronetio(pc),a1
  90.         move.w    #0,pnr_NetSourcePort(a1)
  91.         move.l    pronetport(pc),pnr_MsgPort(a1)
  92.         move.l    #sendbuf,pnr_Data(a1)
  93.         move.l    4.w,a6
  94.         LIBCALL    OpenDevice
  95.         tst.l    d0
  96.         bne.s    .err
  97.  
  98.         move.l    pronetio(pc),a1
  99.         move.w    #CMD_WRITE,IO_COMMAND(a1)
  100.         move.l    pronetport(pc),a0
  101.         move.b    MP_SIGBIT(a0),Signal.pronet
  102.         moveq    #0,d0
  103.         rts
  104.  
  105. .err        cmp.b    #PNDERR_UNIT_NOT_DEFINED,d0
  106.         bne.s    .00
  107.         lea    err1(pc),a2
  108.         bsr    print
  109.         bra.s    spnodev
  110. .00        cmp.b    #PNDERR_DRIVERTROUBLE,d0
  111.         bne.s    .01
  112.         lea    err2(pc),a2
  113.         bsr    print
  114.         lea    sendbuf,a2
  115.         bsr    print
  116.         lea    crtext(pc),a2
  117.         bsr    print
  118.         bra.s    spnodev
  119. .01        lea    err3(pc),a2
  120.         bra.s    spnodev
  121.  
  122. stoppronet    move.l    4.w,a6
  123.         move.l    pronetio(pc),a1
  124.         LIBCALL    CloseDevice
  125. spnodev        move.l    pronetport(pc),a0
  126.         bsr    DeletePort
  127. spnomsgport    move.l    pronetio(pc),a0
  128.         bsr    FreeIORequest
  129. spnoioreq    bsr    FlushDevice
  130.         moveq    #-1,d0
  131.         rts
  132.  
  133. FlushDevice
  134.         move.l    4.w,a6
  135.         LIBCALL    Forbid
  136.         lea    DeviceList(a6),a0
  137.         lea    pronetname(pc),a1
  138.         LIBCALL    FindName
  139.         tst.l    d0
  140.         beq.s    .nodev
  141.         move.l    d0,a1
  142.         LIBCALL    RemDevice
  143. .nodev        LIBCALL    Permit
  144.         rts
  145.  
  146. ; -- InputHandler zum Handlen der DISKREMOVED/INSERTED-Messages hochfahren
  147. ; -- und entsprechende Signalbits für's Hauptprogramm eintragen.
  148. StartInputHandler
  149.         move.l    4.w,a6
  150.         moveq    #-1,d0
  151.         LIBCALL    AllocSignal
  152.         move.b    d0,Signal.diskins
  153.         beq    nosig1
  154.         moveq    #-1,d0
  155.         LIBCALL    AllocSignal
  156.         move.b    d0,Signal.diskrem
  157.         beq    nosig2
  158.  
  159.         moveq    #IOSTD_SIZE,d0
  160.         bsr    GetIORequest
  161.         move.l    d0,a3
  162.         move.l    a3,inputio
  163.         beq    noio
  164.         lea    inputname(pc),a0
  165.         moveq    #0,d0
  166.         moveq    #0,d1
  167.         move.l    a3,a1
  168.         move.l    4.w,a6
  169.         LIBCALL    OpenDevice
  170.  
  171.         move.l    a3,a1
  172.         move.w    #IND_ADDHANDLER,IO_COMMAND(a1)
  173.         move.l    #int,IO_DATA(a1)
  174.         LIBCALL    DoIO
  175.         moveq    #0,d0
  176.         rts
  177.  
  178. int        dc.l    0,0
  179.         dc.b    NT_INTERRUPT,100
  180.         dc.l    .intname,0,InputHandlerRout
  181. .intname    dc.b    "ProNET Server",0
  182.         even
  183.  
  184. StopInputHandler
  185.         move.l    inputio(pc),a3
  186.         move.l    a3,a1
  187.         move.w    #IND_REMHANDLER,IO_COMMAND(a1)
  188.         move.l    #int,IO_DATA(a1)
  189.         move.l    4.w,a6
  190.         LIBCALL    DoIO
  191.         move.l    a3,a1
  192.         LIBCALL    CloseDevice
  193.         move.l    a3,a0
  194.         bsr    FreeIORequest
  195. noio        move.b    Signal.diskrem(pc),d0
  196.         LIBCALL    FreeSignal
  197. nosig2        move.b    Signal.diskins(pc),d0
  198.         LIBCALL    FreeSignal
  199. nosig1        moveq    #-1,d0
  200.         rts
  201.  
  202. startmessage
  203.         lea    starttext(pc),a2
  204.  
  205. print        move.l    dosbase(pc),a6
  206.         LIBCALL    Output
  207.         move.l    d0,d1
  208.         move.l    a2,d2
  209.         move.l    a2,a3
  210. .c        tst.b    (a2)+
  211.         bne.s    .c
  212.         sub.l    a3,a2
  213.         move.l    a2,d3
  214.         subq.l    #1,d3
  215.         LIBCALL    Write
  216.         rts
  217.  
  218. w4mquitflag    dc.w    0
  219. Wait4Message    tst.w    w4mquitflag
  220.         bne    .quit
  221.         clr.w    w4mquitflag
  222.  
  223.         lea    Signals(pc),a3    * auf die Messages
  224.         moveq    #0,d0        * an allen möglichen
  225.         moveq    #numports-1,d1    * Ports warten
  226. .loop1        move.b    (a3),d2
  227.         bmi.s    .0
  228.         bset    d2,d0
  229. .0        addq.w    #6,a3
  230.         dbra    d1,.loop1
  231.         move.l    4.w,a6
  232.         LIBCALL    Wait
  233.                     * entsprechende Routinen
  234.         moveq    #31,d7        * aufrufen
  235. .00        rol.l    #1,d0
  236.         bcc.s    .notthisbit
  237.         lea    Signals(pc),a3
  238.         moveq    #numports-1,d4
  239. .01        cmp.b    (a3),d7
  240.         bne.s    .notthisport
  241.         movem.l    d0/d4/d7/a3,-(sp)
  242.         move.l    2(a3),a3
  243.         jsr    (a3)
  244.         movem.l    (sp)+,d0/d4/d7/a3
  245. .notthisport    addq.w    #6,a3
  246.         dbra    d4,.01
  247. .notthisbit    dbra    d7,.00    
  248.  
  249.         bra    Wait4Message
  250. .quit        rts
  251. Signals:
  252. Signal.pronet    dc.b    -1,0            ;Signalbit
  253.         dc.l    GetProNETMsg        ;entsprechende Routine
  254. Signal.diskins    dc.b    -1,0
  255.         dc.l    MsgDiskIns
  256. Signal.diskrem    dc.b    -1,0
  257.         dc.l    MsgDiskRem
  258. Signal.break    dc.b    SIGBREAKB_CTRL_C,0
  259.         dc.l    CtrlC
  260. numports    equ    4
  261.  
  262. CtrlC        st    w4mquitflag
  263.         move.l    pronetio(pc),a4
  264.         lea    sendbuf,a3
  265.         move.l    #ACTION_SERVERDIE,(a3)
  266.         move.l    4.w,a6
  267.         move.l    clientslist(pc),d0
  268. .loop        beq.s    .ende
  269.         move.l    d0,a2
  270.         move.w    pnc_port(a2),pnr_NetDestPort(a4)
  271.         move.l    #sendbuf,pnr_Data(a4)
  272.         move.l    #4,pnr_Length(a4)
  273.         move.l    a4,a1
  274.         LIBCALL    DoIO
  275.         move.l    (a2),a3
  276.         move.l    pnc_packet(a2),a0
  277.         sub.w    #sp_Pkt,a0
  278.         bsr    DeleteStdPacket
  279.         move.l    a2,a1
  280.         move.l    (a2),a2
  281.         bsr    FreeVec
  282.         move.l    a3,d0
  283.         bra.s    .loop
  284. .ende        rts
  285.  
  286. InputHandlerRout
  287.         movem.l    a0/a1/a6,-(sp)
  288.         move.l    a0,d0
  289.         beq.s    .ende
  290.         move.l    4.w,a6
  291. .1        move.b    ie_Class(a0),d0
  292.         cmp.b    #IECLASS_DISKREMOVED,d0
  293.         beq.s    .diskrem
  294.         cmp.b    #IECLASS_DISKINSERTED,d0
  295.         beq.s    .diskins
  296. .next        move.l    (a0),a0
  297.         move.l    a0,d0
  298.         bne.s    .1
  299. .ende        movem.l    (sp)+,a0/a1/a6
  300.         move.l    a0,d0
  301.         rts
  302. .diskrem    move.l    ourtask(pc),a1
  303.         moveq    #0,d0
  304.         move.b    Signal.diskrem(pc),d1
  305.         bset    d1,d0
  306.         LIBCALL    Signal
  307.         bra.s    .next
  308. .diskins    move.l    ourtask(pc),a1
  309.         moveq    #0,d0
  310.         move.b    Signal.diskins(pc),d1
  311.         bset    d1,d0
  312.         LIBCALL    Signal
  313.         bra.s    .next
  314.  
  315. ; -- Eine Disk wurde neu eingelegt - hier wird getestet, ob es eine
  316. ; -- von unseren Gast-Handlern ist, wenn ja, werden entsprechende
  317. ; -- Maßnahmen eingeleitet...
  318. MsgDiskIns
  319.         move.l    #ACTION_DISKINS,d6
  320.         moveq    #2,d7
  321.         bra.s    msginsrem_sub
  322.  
  323. ; -- Eine Disk wurde entnommen - siehe 'MsgDiskIns'
  324. MsgDiskRem
  325.         move.l    #ACTION_DISKREM,d6
  326.         moveq    #2,d7
  327.         bra.s    msginsrem_nodel
  328.  
  329. msginsrem_sub    subq.w    #1,d7
  330.         bpl.s    .0
  331.         rts
  332. .0        move.l    dosbase(pc),a6
  333.         moveq    #50,d1
  334.         LIBCALL    Delay
  335.  
  336. msginsrem_nodel    lea    clientslist(pc),a2    ;in d6 ACTION_DISKINS/REM
  337. .loop        move.l    (a2),d0
  338.         beq.s    msginsrem_sub
  339.         move.l    d0,a2
  340.         move.l    pnc_handler(a2),a0
  341.         bsr    FindVolume
  342.         cmp.l    pnc_volnode(a2),d0
  343.         beq.s    .loop
  344.         move.l    d0,a5
  345.         move.l    d0,pnc_volnode(a2)    * Disk wurde gewechselt !!
  346.  
  347.         move.l    pnc_dlbytes(a2),d0    ;es wird gerade downgeloadet
  348.         bne.s    .ende            ;(ne Msg würde den Betrieb
  349.                         ;stören !!)
  350.         tst.w    pnc_servmsgs(a2)
  351.         beq.s    .ende
  352.  
  353.         move.l    pronetio(pc),a4        * Message an den Handler
  354.         move.w    pnc_port(a2),pnr_NetDestPort(a4)    * schicken..
  355.         lea    sendbuf,a3
  356.         move.l    d6,(a3)+
  357.         cmp.l    #ACTION_DISKREM,d6
  358.         beq.s    .nocopy
  359.         move.l    a5,d0
  360.         lsr.l    #2,d0
  361.         move.l    d0,(a3)+
  362.         lea    dol_VolumeDate(a5),a0
  363.         move.l    (a0)+,(a3)+
  364.         move.l    (a0)+,(a3)+
  365.         move.l    (a0)+,(a3)+    ;VolumeDate und Name
  366.         move.l    dol_Name(a5),a0    ;müssen kopiert werden..
  367.         add.l    a0,a0
  368.         add.l    a0,a0
  369.         moveq    #0,d0
  370.         move.b    (a0),d0
  371. .copyname    move.b    (a0)+,(a3)+
  372.         dbra    d0,.copyname
  373. .nocopy        lea    sendbuf,a0
  374.         move.l    a0,pnr_Data(a4)
  375.         sub.l    a0,a3
  376.         move.l    a3,pnr_Length(a4)
  377.         move.l    4.w,a6
  378.         move.l    a4,a1
  379.         LIBCALL    DoIO
  380. .ende        rts
  381.  
  382. GetProNETMsg    move.l    4.w,a6
  383.         move.l    pronetport(pc),a0
  384.         LIBCALL    GetMsg
  385.         move.l    d0,actpronetmsg
  386.         beq    .ende
  387.  
  388.         move.l    d0,a2
  389.         move.w    LN_NAME(a2),d2    ;[d2] Source Port
  390.         lea    MN_SIZE(a2),a2    ;[a2] Data
  391.         move.l    (a2)+,d0    ;[d0] dp_Action
  392.         lea    sendbuf+12,a3    ;[a3] sendbuf+12
  393.         move.l    d0,-12(a3)
  394.         move.l    pronetio(pc),a4    ;[a4] PNRequest
  395.         move.w    d2,pnr_NetDestPort(a4)
  396.  
  397.         lea    clientslist(pc),a5
  398. .findnodeloop    move.l    (a5),a5
  399.         move.l    a5,d1
  400.         beq.s    .nullclient
  401.         cmp.w    pnc_port(a5),d2
  402.         bne.s    .findnodeloop
  403.         move.l    pnc_dlbytes(a5),d7
  404.         beq.s    .nodown
  405.  
  406.         lea    ACT_WRITEdownload(pc),a1
  407.         bra.s    .callit
  408.  
  409. .nullclient    lea    UnknownClient(pc),a1
  410.         bra.s    .callit
  411.  
  412. .nodown        move.l    pnc_packet(a5),a4
  413.         move.l    d0,dp_Action(a4)
  414.  
  415. .findrout    lea    at(pc),a0
  416.         moveq    #atl-1,d1
  417. .findroutloop    cmp.l    (a0),d0
  418.         bcs.s    .next
  419.         cmp.l    4(a0),d0
  420.         bls.s    .jsrroutine
  421. .next        lea    12(a0),a0
  422.         dbra    d1,.findroutloop
  423.         lea    ACT_NIL(pc),a1
  424.         bra.s    .callit
  425.  
  426. .jsrroutine    sub.l    (a0),d0
  427.         add.l    d0,d0
  428.         move.l    8(a0),a0
  429.         lea    at(pc),a1
  430.         add.w    (a0,d0.l),a1
  431. .callit        jsr    (a1)
  432.         move.l    actpronetmsg(pc),a1
  433.         move.l    4.w,a6
  434.         LIBCALL    ReplyMsg
  435.         bra    GetProNETMsg
  436.  
  437. .ende        rts
  438.  
  439. ** This is called when the source port couldn't be associated with
  440. ** a Client node. First we check the commands that may be executed
  441. ** this way, otherwise we'll signal the Client that the server has
  442. ** been reset since the last access. The Client is then supposed to
  443. ** reallocate all Locks and FileHandles and then to try again.
  444.  
  445. UnknownClient
  446.         cmp.l    #ACTION_NEWHANDLER,d0
  447.         beq    ACT_NEWHANDLER
  448.         cmp.l    #ACTION_DIE,d0
  449.         beq    ACT_DIE
  450.         cmp.l    #ACTION_PAGE,d0
  451.         beq    ACT_PAGE
  452.         cmp.l    #ACTION_RUN,d0
  453.         beq    ACT_RUN
  454.         move.l    #DOSFALSE,d0
  455.         move.l    #ERROR_PRONET_SERVER_RESET,d1
  456.         bra    answerpacket
  457.  
  458.         cnop    0,4
  459. at        ;dc.l    lowerbound,upperbound,tableaddress
  460.         dc.l    5,34,actiontable1
  461.         dc.l    40,40,actiontable2
  462.         dc.l    82,82,actiontable3
  463.         dc.l    87,87,actiontable4
  464.         dc.l    1004,1008,actiontable5
  465.         dc.l    1021,1034,actiontable6
  466.         dc.l    2008,2009,actiontable7
  467.         dc.l    4097,4098,actiontable8
  468.         dc.l    19941994,19941997,actiontable10
  469. atl        equ    (*-at)/12
  470.  
  471.         cnop    0,4
  472. actiontable1    dc.w    ACT_DIE-at,ACT_NIL-at
  473.         dc.w    ACT_CURRENT_VOLUME-at,ACT_LOCATE_OBJECT-at,ACT_RENAME_DISK-at,ACT_NIL-at,ACT_NIL-at
  474.         dc.w    ACT_NIL-at,ACT_NIL-at,ACT_NIL-at,ACT_FREE_LOCK-at,ACT_DELETE_OBJECT-at
  475.         dc.w    ACT_RENAME_OBJECT-at,ACT_MORE_CACHE-at,ACT_COPY_DIR-at,ACT_NIL-at
  476.         dc.w    ACT_SET_PROTECT-at,ACT_CREATE_DIR-at,ACT_EXAMINE_OBJECT-at,ACT_EXAMINE_OBJECT-at
  477.         dc.w    ACT_DISK_INFO-at,ACT_INFO-at,ACT_FLUSH-at,ACT_SET_COMMENT-at
  478.         dc.w    ACT_PARENT-at,ACT_NIL-at,ACT_INHIBIT-at,ACT_NIL-at
  479.         dc.w    ACT_NIL-at,ACT_SET_DATE-at
  480. actiontable2    dc.w    ACT_SAME_LOCK-at
  481. actiontable3    dc.w    ACT_READ-at
  482. actiontable4    dc.w    ACT_WRITE-at
  483. actiontable5    dc.w    ACT_FINDxxx-at
  484.         dc.w    ACT_FINDxxx-at,ACT_FINDxxx-at,ACT_END-at,ACT_SEEK-at
  485. actiontable6    dc.w    ACT_MAKE_LINK-at,ACT_SET_FILE_SIZE-at,ACT_WRITE_PROTECT-at
  486.         dc.w    ACT_READ_LINK-at,ACT_NIL-at,ACT_FH_FROM_LOCK-at,ACT_IS_FILESYSTEM-at
  487.         dc.w    ACT_CHANGE_MODE-at,ACT_NIL-at,ACT_COPY_DIR_FH-at,ACT_PARENT_FH-at
  488.         dc.w    ACT_NIL-at,ACT_NIL-at,ACT_EXAMINE_FH-at
  489. actiontable7    dc.w    ACT_LOCK_RECORD-at,ACT_FREE_RECORD-at
  490. actiontable8    dc.w    ACT_ADD_NOTIFY-at,ACT_REMOVE_NOTIFY-at
  491. actiontable10    dc.w    ACT_NEWHANDLER-at,ACT_RUN-at,ACT_PAGE-at,ACT_SERVMSGS-at
  492.  
  493.         cnop    0,4
  494. ** The routines will be called with the registers containing following:
  495. ** a6 Execbase
  496. ** a5 PNSHandlerNode für den entspr. Port oder NULL
  497. ** a4 pnc_packet (dp_Action is ready)
  498. ** a3 sendbuf+12 (sendbuf filled with dp_Action,{res1},{res2})
  499. ** a2 received data (after dp_Action)
  500. ** d2 Sourceport
  501.  
  502. ACT_NIL
  503.         move.l    #DOSFALSE,d0
  504.         move.l    #ERROR_ACTION_NOT_KNOWN,d1
  505.         bra    answerpacket
  506.  
  507. ACT_LOCATE_OBJECT
  508.         move.l    (a2)+,dp_Arg1(a4)
  509.         move.l    (a2)+,dp_Arg3(a4)
  510.         move.l    a2,d0
  511.         lsr.l    #2,d0
  512.         move.l    d0,dp_Arg2(a4)
  513.         bra.s    copydir_entry
  514.  
  515. ACT_CREATE_DIR
  516.         move.l    (a2)+,dp_Arg1(a4)
  517.         move.l    a2,d0
  518.         lsr.l    #2,d0
  519.         move.l    d0,dp_Arg2(a4)
  520.         bra.s    copydir_entry
  521.  
  522. ACT_COPY_DIR
  523.         move.l    (a2),dp_Arg1(a4)
  524. copydir_entry    bsr    dopacket
  525.         tst.l    d0
  526.         beq.s    .return
  527.         move.l    d0,a0
  528.         add.l    a0,a0
  529.         add.l    a0,a0
  530.         move.l    fl_Volume(a0),(a3)+
  531.         move.l    fl_Access(a0),(a3)+
  532. .return        bra    answerpacket
  533.  
  534. ACT_RENAME_DISK
  535.         move.l    a2,d0
  536.         lsr.l    #2,d0
  537.         move.l    d0,dp_Arg1(a4)
  538.         bsr    dopacket
  539.         bra    answerpacket
  540.  
  541. ACT_FREE_LOCK
  542.         move.l    (a2)+,dp_Arg1(a4)
  543.         bra    dopacket
  544.  
  545. ACT_DELETE_OBJECT
  546.         move.l    (a2)+,dp_Arg1(a4)
  547.         move.l    a2,d0
  548.         lsr.l    #2,d0
  549.         move.l    d0,dp_Arg2(a4)
  550.         bsr    dopacket
  551.         bra    answerpacket
  552.  
  553. ACT_RENAME_OBJECT
  554.         move.l    (a2)+,dp_Arg1(a4)
  555.         move.l    (a2)+,dp_Arg3(a4)
  556.         lea    256(a2),a0
  557.         move.l    a2,d0
  558.         move.l    a0,d1
  559.         lsr.l    #2,d0
  560.         lsr.l    #2,d1
  561.         move.l    d0,dp_Arg2(a4)
  562.         move.l    d1,dp_Arg4(a4)
  563.         bsr    dopacket
  564.         bra    answerpacket
  565.  
  566. ACT_MORE_CACHE
  567.         move.l    (a2),dp_Arg1(a4)
  568.         bsr    dopacket
  569.         bra    answerpacket
  570.  
  571. ACT_SET_PROTECT
  572.         move.l    (a2)+,dp_Arg2(a4)
  573.         move.l    (a2)+,dp_Arg4(a4)
  574.         move.l    a2,d0
  575.         lsr.l    #2,d0
  576.         move.l    d0,dp_Arg3(a4)
  577.         bsr    dopacket
  578.         bra    answerpacket
  579.  
  580. ACT_EXAMINE_OBJECT    ;EXAMINEs neu 29-04-95
  581.         move.l    (a2)+,dp_Arg1(a4)
  582. act_ex_entry    lea    workfib,a1
  583.         move.l    a1,d0
  584.         lsr.l    #2,d0
  585.         move.l    d0,dp_Arg2(a4)
  586.         move.l    (a2)+,(a1)+    ;fib_DiskKey
  587.         addq.l    #4,a1
  588.         move.w    #32/4-1,d0
  589. .copyname    move.l    (a2)+,(a1)+
  590.         dbra    d0,.copyname    ;fib_FileName
  591.  
  592.         bsr    dopacket
  593.  
  594.         lea    workfib,a1    ;return whole FIB
  595.         move.w    #(fib_SIZEOF)/4-1,d0
  596. .copyfib    move.l    (a1)+,(a3)+
  597.         dbra    d0,.copyfib
  598.  
  599.         movem.l    dp_Res1(a4),d0/d1
  600.         bra    answerpacket
  601.  
  602. ACT_EXAMINE_FH
  603.         GETBPTR    (a2)+,a0
  604.         move.l    fh_Arg1(a0),dp_Arg1(a4)
  605.         bra.s    act_ex_entry
  606.  
  607. ACT_FLUSH
  608.         bsr    dopacket
  609.         bra    answerpacket
  610.  
  611. ACT_IS_FILESYSTEM equ    ACT_FLUSH
  612.  
  613. ACT_SET_COMMENT
  614.         move.l    (a2)+,dp_Arg2(a4)
  615.         move.l    a2,d0
  616.         move.l    a2,d1
  617.         add.l    #82,d1
  618.         lsr.l    #2,d0
  619.         lsr.l    #2,d1
  620.         move.l    d1,dp_Arg3(a4)
  621.         move.l    d0,dp_Arg4(a4)
  622.         bsr    dopacket
  623.         bra    answerpacket
  624.  
  625. ACT_PARENT    equ    ACT_COPY_DIR
  626.  
  627. ACT_SET_DATE
  628.         move.l    (a2)+,dp_Arg2(a4)
  629.         move.l    a2,dp_Arg4(a4)
  630.         lea    14(a2),a2
  631.         move.l    a2,d0
  632.         lsr.l    #2,d0
  633.         move.l    d0,dp_Arg3(a4)
  634.         bsr    dopacket
  635.         bra    answerpacket
  636.  
  637. ACT_SAME_LOCK
  638.         move.l    (a2)+,dp_Arg1(a4)
  639.         move.l    (a2),dp_Arg2(a4)
  640.         bsr    dopacket
  641.         tst.w    d0
  642.         bne.s    .return
  643.         cmp.l    #ERROR_ACTION_NOT_KNOWN,d1
  644.         bne.s    .return
  645.         moveq    #DOSFALSE,d0
  646.         moveq    #0,d1
  647.         GETBPTR    -4(a2),a0    ;Locks von Hand vergleichen..
  648.         GETBPTR    (a2),a1
  649.         move.l    fl_Volume(a0),d2
  650.         cmp.l    fl_Volume(a1),d2
  651.         bne.s    .return
  652.         move.l    fl_Key(a0),d2
  653.         cmp.l    fl_Key(a1),d2
  654.         bne.s    .return
  655.         moveq    #DOSTRUE,d0
  656. .return        bra    answerpacket
  657.  
  658. ACT_READ    ** New routine on 17-04-95
  659.         GETBPTR    (a2)+,a0
  660.         move.l    fh_Arg1(a0),dp_Arg1(a4)
  661.         move.l    (a2),d7        ;Length of the read packet
  662.  
  663.         moveq    #0,d6        ;NumBytes already read
  664.  
  665.         move.l    pronetio(pc),a2
  666.         lea    sendbuf,a3
  667.         move.l    a3,pnr_Data(a2)
  668.  
  669. .loop        move.l    #MAXPACKETSIZE,d0    *Read A Bunch of Bytes
  670.         cmp.l    d0,d7
  671.         bcc.s    .lenok
  672.         move.l    d7,d0
  673. .lenok        move.l    d0,dp_Arg3(a4)
  674.         lea    12(a3),a0
  675.         move.l    a0,dp_Arg2(a4)
  676.         bsr    dopacket
  677.         tst.l    d0            *Error?
  678.         bmi.s    .ERROR
  679.  
  680.         move.l    d0,4(a3)        *Send packet including
  681.         add.l    #12,d0            *num bytes now read
  682.         move.l    d0,pnr_Length(a2)
  683.         move.l    a2,a1
  684.         LIBCALL    DoIO
  685.  
  686.         move.l    4(a3),d0
  687.         beq.s    .EOF            *EOF occured
  688.  
  689.         add.l    d0,d6
  690.         sub.l    d0,d7
  691.         bgt.s    .loop            *still bytes left
  692.  
  693. .EOF    * In case of EOF, we don't have to send an additional msg, because
  694.     * the handler already knows that we have reached the end.
  695.         rts
  696.  
  697. .ERROR        move.l    d0,4(a3)        *send error msg
  698.         move.l    d1,8(a3)
  699.         move.l    a3,pnr_Data(a2)
  700.         move.l    #12,pnr_Length(a2)
  701.         move.l    a2,a1
  702.         LIBCALL    SendIO
  703.  
  704.         move.l    #ACTION_SEEK,dp_Action(a4) *and reset filepointer
  705.         move.l    d6,dp_Arg2(a4)
  706.         move.l    #OFFSET_CURRENT,dp_Arg3(a4)
  707.         bsr    dopacket
  708.  
  709.         move.l    a2,a1
  710.         LIBCALL    WaitIO
  711.         rts
  712.  
  713. ACT_WRITE
  714.         GETBPTR    (a2)+,a0
  715.         move.l    fh_Arg1(a0),dp_Arg1(a4)
  716.         move.l    (a2),d0
  717.         move.l    d0,dp_Arg3(a4)
  718.         bsr    AllocVec
  719.         move.l    d0,d3
  720.         beq.s    .error_nostore
  721.         move.l    d3,dp_Arg2(a4)
  722.         moveq    #0,d0
  723.         bsr    answerpacket
  724.         move.l    d3,pnc_dlbuf(a5)
  725.         move.l    d3,pnc_dlbufpt(a5)
  726.         move.l    dp_Arg3(a4),pnc_dlbytes(a5)
  727.         rts
  728. .error_nostore
  729.         moveq    #-1,d0
  730.         move.l    #ERROR_OBJECT_TOO_LARGE,d1
  731.         bra    answerpacket
  732.  
  733.  
  734. ACT_WRITEdownload    ;called with phnnode in a5
  735.             ;and a2 *data+4 (must be 'sub'ed with 4)
  736.         move.l    pnc_dlbytes(a5),d2
  737.         move.l    #MAXPACKETSIZE,d3
  738.         cmp.l    d3,d2
  739.         bcc.s    .0
  740.         move.l    d2,d3
  741. .0        lea    -4(a2),a0
  742.         move.l    pnc_dlbufpt(a5),a1
  743.         move.l    d3,d0
  744.         move.l    4.w,a6
  745.         LIBCALL    CopyMem
  746.         add.l    d3,pnc_dlbufpt(a5)
  747.         sub.l    d3,pnc_dlbytes(a5)
  748.         bne.s    .ende
  749.         ; das war das letzte Stück -> jetzt ACTION_WRITE !!
  750.         bsr    dopacket
  751.         bsr    answerpacket
  752.         move.l    pnc_dlbuf(a5),a1
  753.         bra    FreeVec
  754. .ende        rts
  755.  
  756. ACT_FINDxxx
  757.         moveq    #fh_SIZEOF,d0
  758.         bsr    AllocVec
  759.         move.l    d0,d3
  760.         move.l    d0,a1
  761.         moveq    #-1,d0
  762.         move.l    d0,fh_Pos(a1)
  763.         move.l    d0,fh_End(a1)
  764.         move.l    pnc_handler(a5),fh_Type(a1)
  765.         move.l    (a2)+,dp_Arg2(a4)
  766.         move.l    a2,d0
  767.         lsr.l    #2,d0
  768.         move.l    d0,dp_Arg3(a4)
  769.         move.l    a1,d0
  770.         lsr.l    #2,d0
  771.         move.l    d0,dp_Arg1(a4)
  772.         bsr    dopacket
  773.         tst.w    d0
  774.         beq.s    .return_err
  775.         lsr.l    #2,d3
  776.         move.l    d3,(a3)+
  777.         GETBPTR    dp_Arg1(a4),a1
  778.         move.l    fh_Interactive(a1),(a3)+
  779.         bra    answerpacket
  780. .return_err    bsr    answerpacket
  781.         move.l    d3,a1
  782.         bra    FreeVec
  783.  
  784. ACT_END
  785.         GETBPTR    (a2),a0
  786.         move.l    fh_Arg1(a0),dp_Arg1(a4)
  787.         bsr    dopacket
  788.         bsr    answerpacket
  789.         GETBPTR    (a2),a1
  790.         bra    FreeVec
  791.  
  792. ACT_SEEK
  793.         GETBPTR    (a2)+,a0
  794.         move.l    fh_Arg1(a0),dp_Arg1(a4)
  795.         move.l    (a2)+,dp_Arg2(a4)
  796.         move.l    (a2),dp_Arg3(a4)
  797.         bsr    dopacket
  798.         bra    answerpacket
  799.  
  800. ACT_MAKE_LINK
  801.         move.l    (a2)+,d2
  802.         move.l    d2,dp_Arg4(a4)
  803.         move.l    (a2)+,dp_Arg1(a4)
  804.         cmp.l    #LINK_HARD,d2
  805.         beq.s    .hardlink
  806. .softlink    move.l    a2,dp_Arg3(a4)
  807.         lea    256(a2),a2
  808.         bra.s    .doit
  809. .hardlink    move.l    (a2)+,dp_Arg3(a4)
  810. .doit        move.l    a2,d0
  811.         lsr.l    #2,d0
  812.         move.l    d0,dp_Arg2(a4)
  813.         bsr    dopacket
  814.         bra    answerpacket
  815.  
  816. ACT_SET_FILE_SIZE equ    ACT_SEEK
  817.  
  818. ACT_WRITE_PROTECT
  819.         move.l    (a2)+,dp_Arg1(a4)
  820.         move.l    (a2),dp_Arg2(a4)
  821.         bsr    dopacket
  822.         bra    answerpacket
  823.  
  824. ACT_READ_LINK
  825.         move.l    (a2)+,dp_Arg1(a4)
  826.         move.l    (a2)+,dp_Arg4(a4)
  827.         move.l    a2,dp_Arg2(a4)
  828.         move.l    a3,dp_Arg3(a4)
  829.         add.l    dp_Arg4(a4),a3
  830.         bsr    dopacket
  831.         bra    answerpacket
  832.  
  833. ACT_FH_FROM_LOCK
  834.         moveq    #fh_SIZEOF,d0
  835.         bsr    AllocVec
  836.         move.l    d0,d3
  837.         move.l    d0,a1
  838.         moveq    #-1,d0
  839.         move.l    d0,fh_Pos(a1)
  840.         move.l    d0,fh_End(a1)
  841.         move.l    (a2)+,dp_Arg2(a4)
  842.         move.l    d3,d0
  843.         lsr.l    #2,d0
  844.         move.l    d0,dp_Arg1(a4)
  845.         bsr    dopacket
  846.         tst.w    d0
  847.         beq.s    .return_err
  848.         lsr.l    #2,d3
  849.         move.l    d3,(a3)+
  850.         GETBPTR    dp_Arg1(a4),a1
  851.         move.l    fh_Interactive(a1),(a3)+
  852.         bra    answerpacket
  853. .return_err    bsr    answerpacket
  854.         move.l    d3,a1
  855.         bra    FreeVec
  856.  
  857. ACT_CHANGE_MODE
  858.         move.l    (a2)+,d2
  859.         move.l    d2,dp_Arg1(a4)
  860.         cmp.l    #CHANGE_LOCK,d2
  861.         beq.s    .change_lock
  862. .change_fh    GETBPTR    (a2)+,a0
  863.         move.l    fh_Arg1(a0),dp_Arg2(a4)
  864.         bra.s    .cont
  865. .change_lock    move.l    (a2)+,dp_Arg2(a4)
  866. .cont        move.l    (a2),dp_Arg3(a4)
  867.         bsr    dopacket
  868.         cmp.l    #CHANGE_LOCK,d2
  869.         bne.s    .0
  870.         GETBPTR    dp_Arg2(a4),a2
  871.         move.l    fl_Access(a2),(a3)+
  872. .0        bra    answerpacket
  873.  
  874. ACT_PARENT_FH
  875.         GETBPTR    (a2),a0
  876.         move.l    fh_Arg1(a0),dp_Arg1(a4)
  877.         bsr    dopacket
  878.         tst.l    d0
  879.         beq.s    .return
  880.         move.l    d0,a0
  881.         add.l    a0,a0
  882.         add.l    a0,a0
  883.         move.l    fl_Volume(a0),(a3)+
  884.         move.l    fl_Access(a0),(a3)+
  885. .return        bra    answerpacket
  886.  
  887. ACT_COPY_DIR_FH    equ    ACT_PARENT_FH
  888.  
  889. ACT_LOCK_RECORD
  890.         GETBPTR    (a2)+,a0
  891.         move.l    fh_Arg1(a0),dp_Arg1(a4)
  892.         move.l    (a2)+,dp_Arg2(a4)
  893.         move.l    (a2)+,dp_Arg3(a4)
  894.         move.l    (a2)+,dp_Arg4(a4)
  895.         move.l    (a2),dp_Arg5(a4)
  896.         bsr    dopacket
  897.         bra    answerpacket
  898.  
  899. ACT_FREE_RECORD    equ    ACT_SEEK
  900.  
  901. ACT_ADD_NOTIFY    equ    ACT_NIL
  902.  
  903. ACT_REMOVE_NOTIFY equ    ACT_NIL
  904.  
  905. ACT_INHIBIT    equ    ACT_MORE_CACHE
  906.  
  907. ACT_INFO
  908.         move.l    (a2)+,d4
  909.         moveq    #id_SIZEOF,d0
  910.         bsr    AllocVec
  911.         move.l    d0,a2
  912.         move.l    a2,d3
  913.         lsr.l    #2,d0
  914.         move.l    d0,dp_Arg2(a4)
  915.         move.l    d4,dp_Arg1(a4)
  916.         bsr    dopacket
  917.         tst.w    d0
  918.         beq.s    .return
  919.         moveq    #8,d2
  920. .1        move.l    (a2)+,(a3)+
  921.         dbra    d2,.1
  922. .return        bsr    answerpacket
  923.         move.l    d3,a1
  924.         bra    FreeVec
  925.  
  926. ACT_DISK_INFO
  927.         moveq    #id_SIZEOF,d0
  928.         bsr    AllocVec
  929.         move.l    d0,a2
  930.         move.l    a2,d3
  931.         lsr.l    #2,d0
  932.         move.l    d0,dp_Arg1(a4)
  933.         bsr    dopacket
  934.         tst.w    d0
  935.         beq.s    .return
  936.         moveq    #8,d2
  937. .1        move.l    (a2)+,(a3)+
  938.         dbra    d2,.1
  939. .return        bsr    answerpacket
  940.         move.l    d3,a1
  941.         bra    FreeVec
  942.  
  943. ACT_CURRENT_VOLUME
  944.         GETBPTR    (a2),a0
  945.         move.l    fh_Arg1(a0),dp_Arg1(a4)
  946.         bsr    dopacket
  947.         move.l    d0,(a3)+
  948.         bra    answerpacket
  949.  
  950. ACT_NEWHANDLER
  951.         move.l    a5,d1
  952.         beq.s    .oki
  953.  
  954.         * Free all allocated data, since the Client computer has
  955.         * been restarted!    
  956.         move.l    a2,-(sp)
  957.         move.l    clientslist(pc),a2
  958. .freeloop    move.l    pnc_packet(a2),a0
  959.         sub.w    #sp_Pkt,a0
  960.         bsr    DeleteStdPacket    
  961.         move.l    a2,a1
  962.         move.l    (a2),a2
  963.         bsr    FreeVec
  964.         move.l    a2,d0
  965.         bne.s    .freeloop
  966.         move.l    (sp)+,a2
  967.         sub.l    a5,a5
  968.         clr.l    clientslist
  969.  
  970. ; -- everything OK now.
  971. .oki        move.l    a2,d1
  972.         move.l    dosbase(pc),a6
  973.         LIBCALL    DeviceProc
  974.         move.l    d0,d6        ;Handler-ProcessID finden
  975.         beq.s    .error
  976.  
  977.         moveq    #pnc_SIZEOF,d0
  978.         bsr    AllocVec
  979.         tst.l    d0
  980.         beq.s    .error
  981.         move.l    d0,a2
  982.         move.w    d2,pnc_port(a2)
  983.         move.l    d6,pnc_handler(a2)
  984.  
  985.         bsr    CreateStdPacket
  986.         tst.l    d0
  987.         beq.s    .error2
  988.         add.l    #sp_Pkt,d0
  989.         move.l    d0,pnc_packet(a2)
  990.  
  991.         lea    clientslist(pc),a0
  992.         move.l    (a0),pnc_next(a2)
  993.         move.l    a2,(a0)
  994.         moveq    #DOSTRUE,d0
  995.         bra    answerpacket
  996.  
  997. .error2        move.l    a2,a1
  998.         bsr    FreeVec
  999. .error        moveq    #DOSFALSE,d0
  1000.         moveq    #0,d1
  1001.         bra    answerpacket
  1002.  
  1003. ACT_DIE
  1004.         lea    clientslist(pc),a2
  1005. .loop        move.l    a2,a4
  1006.         move.l    (a2),d0
  1007.         beq.s    .ende
  1008.         move.l    d0,a2
  1009.  
  1010.         cmp.l    a5,a2
  1011.         bne.s    .loop
  1012.  
  1013.         move.l    pnc_packet(a2),a0    ;Found! Node löschen!
  1014.         sub.w    #sp_Pkt,a0
  1015.         bsr    DeleteStdPacket
  1016.         move.l    a2,a1
  1017.         move.l    (a2),(a4)
  1018.         bsr    FreeVec
  1019.  
  1020. .ende        bra    answerpacket
  1021.  
  1022. ACT_SERVMSGS
  1023.         move.w    (a2),pnc_servmsgs(a5)
  1024.         beq.s    .0
  1025.         bsr    MsgDiskIns
  1026. .0        rts
  1027.  
  1028. ; -- Do Packet and Return Results
  1029. dopacket    ; a5 *PNSHandlerNode
  1030.         move.l    pnc_handler(a5),a0
  1031.         move.l    pnc_packet(a5),a1
  1032.         sub.w    #sp_Pkt,a1    ;Zeiger zurückdrehen auf Msg-
  1033.         bra    SyncStdPkt    ;Struktur..
  1034.  
  1035. answerpacket    ; d0 Result1
  1036.         ; d1 Result2
  1037.         ; a3 *end of sendbuf
  1038.         lea    sendbuf,a0
  1039.         movem.l    d0/d1,4(a0)
  1040.         move.l    4.w,a6
  1041.         move.l    pronetio(pc),a1
  1042.         sub.l    a0,a3
  1043.         move.l    a0,pnr_Data(a1)
  1044.         move.l    a3,pnr_Length(a1)
  1045.         LIBCALL    DoIO
  1046.         rts
  1047.  
  1048. ****************************************************************************
  1049.  
  1050. ; -- Find DLT_VOLUME entry in DosList with dol_Task = a0
  1051. FindVolume    ; a0 *HandlerID
  1052.         ; RETURNS d0 *DosList or NULL
  1053.         movem.l    d6/a2/a5/a6,-(sp)
  1054.         moveq    #0,d6
  1055.         move.l    a0,a2
  1056.         move.l    4.w,a6
  1057.         LIBCALL    Forbid
  1058.         move.l    dosbase(pc),a5
  1059.         move.l    dl_Root(a5),a5
  1060.         move.l    rn_Info(a5),a5
  1061.         add.l    a5,a5
  1062.         add.l    a5,a5
  1063.         addq.w    #di_DevInfo,a5
  1064. .loop        move.l    (a5),d0
  1065.         beq.s    .ende
  1066.         add.l    d0,d0
  1067.         add.l    d0,d0
  1068.         move.l    d0,a5
  1069.         cmp.l    #DLT_VOLUME,dol_Type(a5)
  1070.         bne.s    .loop
  1071.         cmp.l    dol_Task(a5),a2
  1072.         bne.s    .loop
  1073.         ;gefunden !
  1074.         move.l    a5,d6
  1075. .ende        LIBCALL    Permit
  1076.         move.l    d6,d0
  1077.         movem.l    (sp)+,d6/a2/a5/a6
  1078.         rts
  1079.  
  1080. ; -- Compare two null-terminated strings. Case-insensitive
  1081. CompareStrings    ; a0 *String1
  1082.         ; a1 *String2
  1083.         ; RETURNS d0 = 0 --> Strings equal
  1084.         move.l    d2,-(sp)
  1085.         moveq    #-1,d0
  1086. .loop        move.b    (a0)+,d1
  1087.         move.b    (a1)+,d2
  1088.         bclr    #5,d1
  1089.         bclr    #5,d2
  1090.         cmp.b    d1,d2
  1091.         bne.s    .ende
  1092.         tst.b    d1
  1093.         bne.s    .loop
  1094.         moveq    #0,d0
  1095. .ende        move.l    (sp)+,d2
  1096.         rts
  1097.  
  1098. ; -- AllocVec on Kick1.3 - requirements fixed to PUBLIC|CLEAR
  1099. AllocVec    ; d0 bytesize
  1100.         movem.l    d2/a6,-(sp)
  1101.         move.l    4.w,a6
  1102.         addq.l    #4,d0
  1103.         move.l    d0,d2
  1104.         move.l    #MEMF_PUBLIC!MEMF_CLEAR,d1
  1105.         LIBCALL    AllocMem
  1106.         tst.l    d0
  1107.         beq.s    .nomem
  1108.         move.l    d0,a0
  1109.         move.l    d2,(a0)+
  1110.         move.l    a0,d0
  1111. .nomem        movem.l    (sp)+,d2/a6
  1112.         rts
  1113.  
  1114. ; -- FreeVec
  1115. FreeVec        ; a1 memory-block
  1116.         move.l    a6,-(sp)
  1117.         move.l    4.w,a6
  1118.         move.l    -(a1),d0
  1119.         LIBCALL    FreeMem
  1120.         move.l    (sp)+,a6
  1121.         rts
  1122.  
  1123. dec2long    ; konvertiert Dezimalstring ab (a0) zu Longword in D1 !!
  1124.         moveq    #0,d1
  1125. .loop        moveq    #0,d0
  1126.         move.b    (a0)+,d0
  1127.         sub.b    #"0",d0
  1128.         cmp.b    #9,d0
  1129.         bhi.s    .oki
  1130.         move.l    d1,d2
  1131.         lsl.l    #3,d1
  1132.         add.l    d2,d1
  1133.         add.l    d2,d1
  1134.         add.l    d0,d1
  1135.         bra.s    .loop
  1136. .oki        rts
  1137.  
  1138. ***************************************************************************
  1139. ; -- Spezielle Sachen, die nichts mit dem Netzwerk zu tun haben, sondern
  1140. ; -- für pronet-run und pronet-page gedacht sind !!!!
  1141.  
  1142. ; in a2 data nach dp_Action..
  1143. ACT_RUN
  1144.         move.l    dosbase(pc),a6
  1145.         move.l    a2,d1
  1146.         moveq    #0,d2
  1147.         moveq    #0,d3
  1148.         jsr    -222(a6)
  1149.         rts
  1150.  
  1151. ACT_PAGE
  1152.         move.l    4.w,a6
  1153.         lea    intname(pc),a1
  1154.         moveq    #0,d0
  1155.         jsr    -552(a6)
  1156.         move.l    d0,a6
  1157.         lea    sendbuf,a3
  1158.         lea    .tex1(pc),a0
  1159. .1        move.b    (a0)+,(a3)+
  1160.         bpl.s    .1
  1161.         move.b    #0,(a3)+
  1162.         move.b    #20,(a3)+
  1163.         move.b    #25,(a3)+
  1164. .2        move.b    (a2)+,(a3)+
  1165.         bne.s    .2
  1166. .3        clr.b    (a3)+
  1167.         clr.b    (a3)+
  1168.         lea    sendbuf,a0
  1169.         moveq    #0,d0
  1170.         moveq    #40,d1
  1171.         LIBCALL    DisplayAlert
  1172.         move.l    a6,a1
  1173.         move.l    4.w,a6
  1174.         jsr    -414(a6)
  1175.         rts
  1176.  
  1177. .tex1        dc.b    0,20,15,"pronet-page message:",0,-1
  1178.         even
  1179.  
  1180. * Routines for handling DosPackets
  1181.  
  1182. ; -- Create a StandardPacket
  1183. CreateStdPacket    ; RETURNS d0 *StandardPacket or NULL
  1184.         movem.l    a2-a6,-(sp)
  1185.         move.l    4.w,a6
  1186.         move.l    #sp_SIZEOF,d0
  1187.         move.l    #MEMF_PUBLIC,d1
  1188.         LIBCALL    AllocMem
  1189.         tst.l    d0
  1190.         beq.s    csp_nomem
  1191.         move.l    d0,a2
  1192.         bsr    CreatePort
  1193.         move.l    d0,sp_Msg+MN_REPLYPORT(a2)
  1194.         beq.s    csp_noport
  1195.         lea    sp_Pkt(a2),a3
  1196.         move.l    a3,sp_Msg+LN_NAME(a2)
  1197.         move.l    a2,sp_Pkt+dp_Link(a2)
  1198.         move.l    a2,d0
  1199.         movem.l    (sp)+,a2-a6
  1200.         rts
  1201.  
  1202. ; -- Deallocate a StandardPacket got by CreateStdPacket
  1203. DeleteStdPacket    ; a0 *StandardPacket
  1204.         movem.l    a2-a6,-(sp)
  1205.         move.l    4.w,a6
  1206.         move.l    a0,a2
  1207.         move.l    sp_Msg+MN_REPLYPORT(a2),a0
  1208.         bsr    DeletePort
  1209. csp_noport    move.l    a2,a1
  1210.         move.l    #sp_SIZEOF,d0
  1211.         LIBCALL    FreeMem
  1212. csp_nomem    movem.l    (sp)+,a2-a6
  1213.         moveq    #0,d0
  1214.         rts
  1215.  
  1216. ; -- Send a StandardPacket to a MsgPort
  1217. SendStdPkt    ; a0 *MsgPort
  1218.         ; a1 *StandardPacket
  1219.         move.l    a6,-(sp)
  1220.         move.l    4.w,a6
  1221.         move.l    sp_Msg+MN_REPLYPORT(a1),sp_Pkt+dp_Port(a1)
  1222.         LIBCALL    PutMsg
  1223.         move.l    (sp)+,a6
  1224.         rts
  1225.  
  1226. ; -- Send a StandardPacket to a MsgPort, wait for return and get results
  1227. SyncStdPkt    ; a0 *MsgPort
  1228.         ; a1 *StandardPacket
  1229.         ; RETURNS d0 dp_Res1
  1230.         ;         d1 dp_Res2
  1231.         move.l    a1,-(sp)
  1232.         bsr    SendStdPkt
  1233.         move.l    (sp)+,a0
  1234.         bra    WaitStdPkt
  1235.  
  1236. ; -- Wait for return of the packet and get results
  1237. WaitStdPkt    ; a0 *StandardPacket
  1238.         ; RETURNS d0 dp_Res1
  1239.         ;      d1 dp_Res2
  1240.         movem.l    a2/a6,-(sp)
  1241.         move.l    4.w,a6
  1242.         move.l    a0,a2
  1243.         move.l    sp_Msg+MN_REPLYPORT(a2),a0
  1244.         LIBCALL    WaitPort
  1245.         move.l    sp_Msg+MN_REPLYPORT(a2),a0
  1246.         LIBCALL    GetMsg
  1247.         move.l    sp_Pkt+dp_Res1(a2),d0
  1248.         move.l    sp_Pkt+dp_Res2(a2),d1
  1249.         movem.l    (sp)+,a2/a6
  1250.         rts
  1251.  
  1252.         include    "p:include/devio.s"
  1253.  
  1254. ;----------------------------------------------------------------------------
  1255.  
  1256. dosname        dc.b    "dos.library",0
  1257. intname        dc.b    "intuition.library",0
  1258. pronetname    dc.b    "pronet.device",0
  1259. inputname    dc.b    "input.device",0
  1260. err1        dc.b    "Unit not defined.",10,0
  1261. err2        dc.b    "Driver trouble: ",0
  1262. err3        dc.b    "Couldn't open pronet.device.",10,0
  1263. starttext    dc.b    "ProNET by Michael Krause - Server v38 active."
  1264. crtext        dc.b    10,0
  1265.         even
  1266.  
  1267. unit        dc.l    0
  1268. ourtask        dc.l    0
  1269. dosbase        dc.l    0
  1270. pronetio    dc.l    0
  1271. inputio        dc.l    0
  1272. pronetport    dc.l    0
  1273. actpronetmsg    dc.l    0
  1274. clientslist    dc.l    0    ;einfache Liste mit allen Handlers, die
  1275.                 ;an uns hängen..
  1276.  
  1277.         section    b,bss
  1278.  
  1279. sendbuf        ds.b    $4000
  1280. workfib        ds.b    fib_SIZEOF
  1281.