home *** CD-ROM | disk | FTP | other *** search
/ Scene Xplorer 1 / Scene_Xplorer_1.iso / Tools / ProNet / source / filesystem / pronet-handler.s < prev    next >
Text File  |  1978-01-11  |  29KB  |  1,397 lines

  1. ;: pronet-handler.s
  2. ;:
  3. ;:
  4. ;: 19.07.1994    started..
  5.  
  6. ;: 17-04-1995    READ-Transfer umgebaut v34.0
  7. ;: 29-04-1995    EXAMINE-Packets neu programmiert v34.1
  8. ;: 18-06-1995    "+"-Exansion -> Unitnumber v34.2
  9.  
  10. DEBUG        equ    0
  11.  
  12.         include    "exec/exec.i"
  13.         include    "dos/dos.i"
  14.         include    "dos/dosextens.i"
  15.         include    "dos/filehandler.i"
  16.         include    "devices/timer.i"
  17.         include    "devices/input.i"
  18.         include    "devices/inputevent.i"
  19.         include    "A:ProNET/include/devices/pronet.i"
  20.         include    "A:OSmacros.i"
  21.  
  22.         include    "A:ProNET/source/network.i"
  23.  
  24.         include    "exec_lib.i"
  25.         include    "dos_lib.i"
  26.  
  27. ; -- Convert given BPTR to FileLock in FL->fl_Key data or NULL if FL=0
  28. ; -- Changes d0 !!
  29. GETsFL        macro        ;GETsFL dp_Arg1(a2),a0
  30.         GETBPTR    \1,\2
  31.         move.l    \2,d0
  32.         beq.s    .\@getsfl
  33.         move.l    fl_Key(\2),\2
  34. .\@getsfl
  35.         endm
  36.  
  37. ; -- Struktur zum Speichern der Volumes
  38.           STRUCTURE    PHVolNode,0
  39.         STRUCT    phvn_node,MLN_SIZE    ;zur Verkettung
  40.         APTR    phvn_doslist        ;*VolumeNode
  41.         BPTR    phvn_locklist        ;BPTR->LockList
  42.         BPTR    phvn_srvdoslist        ;BPTR->VolNode beim Server
  43.         LABEL    phvn_SIZEOF
  44.  
  45. j
  46.         IFNE    DEBUG
  47.         bsr    dinit
  48.         ENDC
  49.  
  50.         move.l    4.w,a6
  51.         move.l    ThisTask(a6),d0
  52.         move.l    d0,ourprocess
  53.         move.l    d0,a0
  54.         lea    pr_MsgPort(a0),a0
  55.         move.l    a0,ourport
  56.         move.b    MP_SIGBIT(a0),Signal.packet
  57.  
  58.         move.l    ourport(pc),a0
  59.         LIBCALL    WaitPort
  60.         bsr    GetPacket
  61.         move.l    d0,startuppacket
  62.         move.l    d0,a0
  63.         move.l    dp_Arg3(a0),a0
  64.         add.l    a0,a0
  65.         add.l    a0,a0
  66.         move.l    a0,devnode
  67.  
  68.         GETBPTR    dol_Startup(a0),a0
  69.         move.l    fssm_Unit(a0),d0
  70.         GETBPTR    fssm_Environ(a0),a0
  71.         tst.l    de_HighCyl(a0)
  72.         beq.s    .ok1
  73.         add.b    #"0",d0
  74.         move.b    d0,plusflag
  75.  
  76. .ok1        lea    dosname(pc),a1
  77.         moveq    #36,d0
  78.         jsr    -552(a6)
  79.         move.l    d0,dosbase
  80.         beq    nodos
  81.  
  82.         bsr    startpronet
  83.         tst.w    d0
  84.         bne    nopronet
  85.  
  86. ; jetzt neuen Handler anmelden.
  87.         move.l    pronetio(pc),a4
  88.         lea    sendbuf,a3
  89.         move.l    #ACTION_NEWHANDLER,(a3)+
  90.         move.l    IO_DEVICE(a4),a6
  91.         move.l    devnode(pc),a0
  92.         move.l    dn_Name(a0),a0
  93.         add.l    a0,a0
  94.         add.l    a0,a0
  95.         addq.l    #1,a0
  96.         lea    localbuf,a1
  97. .copyloc1    move.b    (a0)+,(a1)+
  98.         bne.s    .copyloc1
  99.         move.b    #":",-1(a1)
  100.         clr.b    (a1)
  101.         lea    localbuf,a0
  102.         LIBCALL    GetConfigString
  103.         move.l    d0,a1
  104.         move.l    d0,a0
  105. .cc1        move.b    (a0)+,(a3)+
  106.         bne.s    .cc1
  107.         move.l    a1,a0
  108.         LIBCALL    FreeConfigString
  109.         bsr    sendpnpacket
  110.  
  111.         move.l    pronetmsgport(pc),a0
  112.         move.l    4.w,a6
  113.         LIBCALL    WaitPort
  114.         move.l    pronetmsgport(pc),a0
  115.         LIBCALL    GetMsg
  116.         move.l    d0,actpronetmsg
  117.         move.l    d0,a2
  118.         lea    MN_SIZE+2(a2),a2
  119.         move.l    4(a2),d0
  120.         beq.s    .cc0
  121.         move.l    actpronetmsg(pc),a1
  122.         LIBCALL    ReplyMsg
  123.         bra    noserver
  124. .cc0        move.l    actpronetmsg(pc),a1
  125.         LIBCALL    ReplyMsg
  126.  
  127. ; alles klar jetzt..
  128.         move.l    devnode(pc),a0
  129.         move.l    ourport(pc),dol_Task(a0)
  130.         move.l    startuppacket(pc),a0
  131.         moveq    #DOSTRUE,d0
  132.         moveq    #0,d1
  133.         bsr    ReturnPacket    ;Startuppacket zurückgeben
  134.     IFNE    DEBUG
  135.     st    debok
  136.     ENDC
  137.  
  138.         bsr    Wait4Message
  139.  
  140.         clr.l    startuppacket    ;damit es nicht nochmal zurückgeht
  141.  
  142. noserver    bsr    stoppronet
  143.  
  144. nopronet    move.l    dosbase(pc),a1
  145.         move.l    4.w,a6
  146.         jsr    -414(a6)
  147. nodos        move.l    startuppacket(pc),d0
  148.         beq.s    .0
  149.         move.l    d0,a0
  150.         move.l    #DOSFALSE,d0
  151.         move.l    #ERROR_NO_FREE_STORE,d1
  152.         bsr    ReturnPacket
  153. .0        moveq    #0,d0
  154.         rts
  155.  
  156.         dc.b    "$VER: pronet-handler 34.2 (18-06-95)",13,10,0
  157.         even
  158.  
  159. startpronet    moveq    #pnr_Size,d0
  160.         bsr    GetIORequest
  161.         move.l    d0,pronetio
  162.         beq    spnoioreq
  163.         bsr    CreatePort
  164.         move.l    d0,pronetmsgport
  165.         beq    spnomsgport
  166.  
  167.         move.l    devnode(pc),a1        ;Device, Unit und Flags
  168.         move.l    dn_Startup(a1),a1    ;aus der Mountlist nehmen!!
  169.         add.l    a1,a1
  170.         add.l    a1,a1
  171.         move.l    fssm_Unit(a1),d0
  172.         move.l    fssm_Flags(a1),d1
  173.         move.l    fssm_Device(a1),a0
  174.         add.l    a0,a0
  175.         add.l    a0,a0
  176.         addq.w    #1,a0
  177.         move.l    pronetio(pc),a1
  178.         move.w    #PNP_NEXTFREE,pnr_NetSourcePort(a1)
  179.         move.l    pronetmsgport(pc),pnr_MsgPort(a1)
  180.         move.l    4.w,a6
  181.         LIBCALL    OpenDevice
  182.         tst.l    d0
  183.         bne    spnodev
  184.         move.l    pronetio(pc),a1
  185.         move.w    #CMD_WRITE,IO_COMMAND(a1)
  186.         clr.l    pnr_Length2(a1)
  187.         clr.w    pnr_NetDestPort(a1)
  188.         move.l    pronetmsgport(pc),a0
  189.         move.b    MP_SIGBIT(a0),Signal.pronet
  190.         moveq    #0,d0
  191.         rts
  192.  
  193. stoppronet    move.l    4.w,a6
  194.         move.l    pronetio(pc),a1
  195.         LIBCALL    CloseDevice
  196. spnodev        move.l    pronetmsgport(pc),a0
  197.         bsr    DeletePort
  198. spnomsgport    move.l    pronetio(pc),a0
  199.         bsr    FreeIORequest
  200. spnoioreq    moveq    #-1,d0
  201.         rts
  202.  
  203. w4mquitflag    dc.w    0
  204. Wait4Message    tst.w    w4mquitflag
  205.         bne    .quit
  206.         clr.w    w4mquitflag
  207.  
  208.         lea    Signals(pc),a3    * auf die Messages
  209.         moveq    #0,d0        * an allen möglichen
  210.         moveq    #numports-1,d1    * Ports warten
  211. .loop1        move.b    (a3),d2
  212.         bmi.s    .0
  213.         bset    d2,d0
  214. .0        addq.w    #6,a3
  215.         dbra    d1,.loop1
  216.         move.l    4.w,a6
  217.         LIBCALL    Wait
  218.                     * entsprechende Routinen
  219.         moveq    #31,d7        * aufrufen
  220. .00        rol.l    d0
  221.         bcc.s    .notthisbit
  222.         lea    Signals(pc),a3
  223.         moveq    #numports-1,d4
  224. .01        cmp.b    (a3),d7
  225.         bne.s    .notthisport
  226.         movem.l    d0/d4/d7/a3,-(sp)
  227.         move.l    2(a3),a3
  228.         jsr    (a3)
  229.         movem.l    (sp)+,d0/d4/d7/a3
  230. .notthisport    addq.w    #6,a3
  231.         dbra    d4,.01
  232. .notthisbit    dbra    d7,.00    
  233.  
  234.         bra    Wait4Message
  235. .quit        rts
  236. Signals:
  237. Signal.pronet    dc.b    -1,0            ;Signalbit
  238.         dc.l    GetProNETMsg        ;entsprechende Routine
  239. Signal.packet    dc.b    -1,0
  240.         dc.l    GetPacketMsg
  241. numports    equ    2
  242.  
  243. GetProNETMsg    move.l    pronetmsgport(pc),a0
  244.         move.l    4.w,a6
  245.         LIBCALL    GetMsg
  246.         move.l    d0,actpronetmsg
  247.         beq.s    GetPacketMsg    ;Ende !!
  248.         move.l    d0,a3
  249.         lea    MN_SIZE+2(a3),a3
  250.         move.l    (a3)+,d2
  251.         move.l    actpacket(pc),a2
  252.         cmp.l    #ACTION_DISKINS,d2
  253.         beq    ACT_DISKINS
  254.         cmp.l    #ACTION_DISKREM,d2
  255.         beq    ACT_DISKREM
  256.         move.l    actanswerroutine(pc),a0
  257.         jsr    (a0)
  258.         clr.l    actpacket
  259.  
  260.         move.l    actpronetmsg(pc),d0
  261.         beq.s    .0
  262.  
  263.         move.l    d0,a1
  264.         move.l    4.w,a6
  265.         LIBCALL    ReplyMsg
  266. .0        bra.s    GetProNETMsg
  267.  
  268. ; -- hier wird immer nur ein Packet geholt, dann auf die Abarbeitung ge-
  269. ; wartet und nachdem alle ProNETMsgs erledigt sind, wird nochmal versucht,
  270. ; ob hier Messages anliegen. Erst wenn beide Ports leer sind, wird der
  271. ; Task in Sleepstatus gelegt.
  272. GetPacketMsg
  273.         move.l    actpacket(pc),d0    ;Wird ein anderes Packet
  274.         bne.s    .ende        ;gerade bearbeitet ? --> Warten
  275.         move.l    4.w,a6
  276.         bsr    GetPacket
  277.         move.l    d0,actpacket
  278.         beq.s    .ende
  279.         move.l    d0,a2        ;[a2] DosPacket
  280.         move.l    dp_Action(a2),d0
  281.     IFNE    DEBUG
  282.     bsr    dcr
  283.     bsr    dtypedec
  284.     ENDC
  285.         lea    sendbuf,a3    ;[a3] sendbuf
  286.         move.l    d0,(a3)+
  287.         move.l    pronetio(pc),a4    ;[a4] PNRequest
  288.         lea    at(pc),a0
  289.         moveq    #atl-1,d1
  290. .findroutloop    cmp.l    (a0),d0
  291.         bcs.s    .next
  292.         cmp.l    4(a0),d0
  293.         bls.s    .jsrroutine
  294. .next        lea    12(a0),a0
  295.         dbra    d1,.findroutloop
  296.         bsr    ACT_NIL
  297.         bra.s    GetPacketMsg
  298. .jsrroutine    sub.l    (a0),d0
  299.         add.l    d0,d0
  300.         move.l    8(a0),a0
  301.         lea    at(pc),a1
  302.         add.w    (a0,d0.l),a1
  303.         jsr    (a1)
  304.         bra.s    GetPacketMsg
  305. .ende        rts
  306.  
  307.         cnop    0,4
  308. at        ;dc.l    lowerbound,upperbound,tableaddress
  309.         dc.l    7,34,actiontable1
  310.         dc.l    40,40,actiontable2
  311.         dc.l    82,82,actiontable3
  312.         dc.l    87,87,actiontable4
  313.         dc.l    1004,1008,actiontable5
  314.         dc.l    1020,1034,actiontable6
  315.         dc.l    2008,2009,actiontable7
  316.         dc.l    4097,4098,actiontable8
  317.         dc.l    4200,4200,actiontable9
  318. atl        equ    (*-at)/12
  319.  
  320. actiontable1    dc.w    ACT_CURRENT_VOLUME-at
  321.         dc.w    ACT_LOCATE_OBJECT-at,ACT_RENAME_DISK-at,ACT_NIL-at,ACT_NIL-at
  322.         dc.w    ACT_NIL-at,ACT_NIL-at,ACT_NIL-at,ACT_FREE_LOCK-at,ACT_DELETE_OBJECT-at
  323.         dc.w    ACT_RENAME_OBJECT-at,ACT_MORE_CACHE-at,ACT_COPY_DIR-at,ACT_NIL-at
  324.         dc.w    ACT_SET_PROTECT-at,ACT_CREATE_DIR-at,ACT_EXAMINE_OBJECT-at,ACT_EXAMINE_OBJECT-at
  325.         dc.w    ACT_DISK_INFO-at,ACT_INFO-at,ACT_FLUSH-at,ACT_SET_COMMENT-at
  326.         dc.w    ACT_PARENT-at,ACT_NIL-at,ACT_INHIBIT-at,ACT_NIL-at
  327.         dc.w    ACT_NIL-at,ACT_SET_DATE-at
  328. actiontable2    dc.w    ACT_SAME_LOCK-at
  329. actiontable3    dc.w    ACT_READ-at
  330. actiontable4    dc.w    ACT_WRITE-at
  331. actiontable5    dc.w    ACT_FINDxxx-at
  332.         dc.w    ACT_FINDxxx-at,ACT_FINDxxx-at,ACT_END-at,ACT_SEEK-at
  333. actiontable6    dc.w    ACT_FORMAT-at,ACT_MAKE_LINK-at,ACT_SET_FILE_SIZE-at,ACT_WRITE_PROTECT-at
  334.         dc.w    ACT_READ_LINK-at,ACT_NIL-at,ACT_FH_FROM_LOCK-at,ACT_IS_FILESYSTEM-at
  335.         dc.w    ACT_CHANGE_MODE-at,ACT_NIL-at,ACT_COPY_DIR_FH-at,ACT_PARENT_FH-at
  336.         dc.w    ACT_NIL-at,ACT_NIL-at,ACT_EXAMINE_FH-at
  337. actiontable7    dc.w    ACT_LOCK_RECORD-at,ACT_FREE_RECORD-at
  338. actiontable8    dc.w    ACT_ADD_NOTIFY-at,ACT_REMOVE_NOTIFY-at
  339. actiontable9    dc.w    ACT_SERIALIZE_DISK-at
  340.  
  341. ** The routines will be called with the registers containing following:
  342. ** a6 Execbase
  343. ** a4 PNRequest (pnr_NetDestPort is ready !)
  344. ** a3 sendbuf+4 (first long already contains dp_Action..)
  345. ** a2 DosPacket
  346.  
  347. ** Answerroutine will be called with:
  348. ** a6 Execbase
  349. ** a3 data received from server (without dp_Action -> Res1,Res2,Data..)
  350. ** a2 DosPacket to be returned
  351. ** d2 dp_A