XDEF Request XREF SysRequest,_DCScrBase INCLUDE exec/exec_lib.i INCLUDE intuition/intuition_lib.i INCLUDE libraries/dos_lib.i INCLUDE graphics/graphics_lib.i INCLUDE help.i SECTION "Request",CODE Request move.l a0,-(sp) ; Zeiger auf IText merken bsr OpenLibs ; Librarys öffnen SADD ReqWindow,a0 ; Zeiger auf Window in a0 move.l _DCScrBase,$1e(a0) ; Screen-Zeiger eintragen CALLPC _IntuitionBase,OpenWindow ; Window öffnen beq NoReq ; Fehler ? -> NoReq move.l d0,a1 lea _ReqWindBase(pc),a0 move.l a1,(a0) move.l $32(a1),4(a0) ; RastPort merken move.l $56(a1),8(a0) ; UserPort merken PEEKL _ReqWindRast,a0 move.l (sp)+,a1 moveq.l #0,d0 moveq.l #10,d1 CALLSYS PrintIText bsr MakeRBorder cmpi.l #"READ",Read? bne BeginRead bsr RefreshNames bra WaitReq BeginRead bra ReadIn WaitReq PEEKL _ReqWindUser,a0 CALLEXEC WaitPort PEEKL _ReqWindUser,a0 CALLSYS GetMsg move.l d0,a1 move.l $14(a1),d4 move.l $1c(a1),a4 CALLSYS ReplyMsg cmpi.b #$40,d4 beq.s GadUp cmpi.b #$20,d4 beq.s GadDown bra WaitReq GadUp cmpi.w #"CL",$26(a4) beq ReqQuit cmpi.w #"OK",$26(a4) beq ReqOK cmpi.w #"DC",$26(a4) beq.s BeginRead cmpi.w #"PT",$26(a4) bne.s NoParent bsr Parent bra BeginRead NoParent cmpi.w #"F0",$26(a4) blt.s WaitReq cmpi.w #"F5",$26(a4) bgt.s WaitReq bsr FileOrDir cmpi.l #"FILE",d7 bne BeginRead bra WaitReq GadDown cmpi.w #"PR",$26(a4) bne WaitReq PropAg bsr PropClick cmpi.w #$80,RProp+$c beq PropAg bra WaitReq ReqQuit bsr EndRequest NoReq moveq.l #0,d0 rts ReqOK bsr EndRequest bsr JoinName move.l #DirFileBuffer,d0 rts *** Fenster schließen EndRequest PEEKL _ReqWindBase,a0 CALLPC _IntuitionBase,CloseWindow rts *** Verwaltung der Devices GetDevs CALLEXEC Forbid ; Multitasking aus PEEKL _DOSBase,a0 move.l 34(a0),a0 move.l 24(a0),a0 adda.l a0,a0 adda.l a0,a0 move.l 4(a0),a0 adda.l a0,a0 adda.l a0,a0 Dev1 lea Entrys,a2 PEEKL EntryCount,d0 mulu #36,d0 adda.l d0,a2 tst.l 4(a0) bne.s TakeDev tst.l 8(a0) beq.s NoFound TakeDev move.l 4(a0),d0 addq.l #2,d0 move.b d0,31(a2) move.l $28(a0),a1 adda.l a1,a1 adda.l a1,a1 move.b (a1)+,d0 subq.l #1,d0 CopyDev move.b (a1)+,(a2)+ dbra d0,CopyDev move.b #":",(a2)+ move.b #0,(a2) add.l #1,EntryCount NoFound tst.l (a0) ; Letzte Device ? beq EndDev move.l (a0),a0 ; Wenn nicht dann adda.l a0,a0 ; nächsten Eintrag adda.l a0,a0 ; holen und weitersuchen bra Dev1 EndDev CALLSYS Permit ; Multi an rts *** Files einlesen ReadIn bsr ResetAll move.l #DirBuffer,d1 moveq.l #-2,d2 CALLPC _DOSBase,Lock beq NoLock move.l d0,-(sp) move.l (sp),d1 move.l #FileInfo,d2 CALLSYS Examine GetName move.l (sp),d1 move.l #FileInfo,d2 CALLPC _DOSBase,ExNext beq NoMore lea FileInfo+8,a0 PEEKL EntryCount,d0 mulu #36,d0 addi.l #Entrys,d0 move.l d0,a1 move.b #0,31(a1) tst.l 4-8(a0) bpl CopyName move.l $7c-8(a0),32(a1) ;File-Länge merken move.b #1,31(a1) CopyName move.b (a0)+,(a1)+ cmpi.b #0,-1(a1) bne.s CopyName addi.l #1,EntryCount bsr SortNames bsr RefreshNames bsr RemakeProp bsr PropClick PEEKL _ReqWindUser,a0 CALLEXEC GetMsg tst.l d0 beq NoMsg move.l d0,a1 move.l $14(a1),d4 move.l $1c(a1),a4 CALLSYS ReplyMsg cmpi.w #"PT",$26(a4) bne NoRPar move.l (sp)+,d1 CALLPC _DOSBase,UnLock bsr Parent bra ReadIn NoRPar cmpi.w #"OK",$26(a4) bne NoROK move.l (sp)+,d1 CALLPC _DOSBase,UnLock bra ReqOK NoROK cmpi.w #"CL",$26(a4) bne NoRCL move.l (sp)+,d1 CALLPC _DOSBase,UnLock bra ReqQuit NoRCL cmpi.w #"DC",$26(a4) bne NoRDC move.l (sp)+,d1 CALLPC _DOSBase,UnLock bra ReadIn NoRDC cmpi.w #"F0",$26(a4) blt NoMsg cmpi.w #"F5",$26(a4) bgt NoMsg bsr FileOrDir cmpi.l #"FILE",d7 beq.s NoMsg move.l (sp)+,d1 CALLPC _DOSBase,UnLock bra ReadIn NoMsg cmpi.l #100,EntryCount blt GetName SADD TableFull,a0 jsr SysRequest NoMore POKEL #"READ",Read? move.l (sp)+,d1 CALLPC _DOSBase,UnLock NoLock bra WaitReq EntryCount ds.l 1 Read? dc.l 0 *** Namen sortieren SortNames PEEKL EntryCount,d7 cmpi.b #2,d7 blt NoSort subq.l #2,d7 Sort1 moveq.l #0,d6 Sort2 bsr Compare cmp.l d7,d6 beq.s Sort3 addq.l #1,d6 bra Sort2 Sort3 dbra d7,Sort1 NoSort rts *** Namen vergleichen und austauschen Compare move.l d6,d2 mulu #36,d2 addi.l #Entrys,d2 move.l d2,a0 move.l d2,a1 adda.l #36,a1 move.b 31(a0),d0 move.b 31(a1),d1 cmp.b d0,d1 blt Swap bgt NoSwap Com1 move.b (a0)+,d0 move.b (a1)+,d1 bclr #5,d0 bclr #5,d1 cmp.b d0,d1 blt Swap bgt NoSwap cmpi.b #0,-1(a0) beq NoSwap bra Com1 Swap move.l d2,a0 move.l d2,a1 adda.l #36,a1 moveq.l #36-1,d1 Swap1 move.b (a0),d0 move.b (a1),(a0)+ move.b d0,(a1)+ dbra d1,Swap1 NoSwap rts *** Parent-Gadget angeklickt ... Parent lea DirBuffer,a0 ParFind0 cmpi.b #0,(a0)+ bne.s ParFind0 cmpi.b #58,-2(a0) bne.s ParFindEnd lea DirBuffer,a0 bra ParMake0 ParFindEnd suba.l #1,a0 cmpa.l #DirBuffer,a0 beq ParMake0 cmpi.b #47,(a0) beq.s ParMake0 cmpi.b #58,-1(a0) beq.s ParMake0 bra ParFindEnd ParMake0 move.b #0,(a0) bra RefreshStrings *** Name angeklickt ... FileOrDir moveq.l #0,d7 move.w $26(a4),d0 subi.w #"F0",d0 mulu #4,d0 SADD ITextList,a0 move.l 0(a0,d0.w),a0 move.l $c(a0),a0 cmpi.b #0,(a0) beq NoEntry cmpi.b #0,31(a0) beq DirClick cmpi.b #1,31(a0) bgt DevCl lea FileBuffer,a1 FileToBuffer move.b (a0)+,(a1)+ cmpi.b #0,-1(a1) bne.s FileToBuffer NoEntry move.l #"FILE",d7 bra RefreshStrings DirClick lea DirBuffer,a1 DirClFind0 cmpi.b #0,(a1)+ bne.s DirClFind0 suba.l #1,a1 cmpa.l #DirBuffer,a1 beq.s DirToBuffer cmpi.b #58,-1(a1) beq.s DirToBuffer move.b #47,(a1)+ DirToBuffer move.b (a0)+,(a1)+ cmpi.b #0,-1(a1) bne.s DirToBuffer bra RefreshStrings DevCl lea DirBuffer,a1 DevToBuffer move.b (a0)+,(a1)+ cmpi.b #0,-1(a1) bne.s DevToBuffer bra RefreshStrings *** Alles zurücksetzen ResetAll SADD RPropSpecial,a1 move.w #0,4(a1) POKEL #0,EntryCount POKEL #0,Read? lea Entrys,a0 move.w #36*100-1,d0 ClearEntrys move.b #0,(a0)+ dbra d0,ClearEntrys bsr ResetPointers bsr GetDevs bsr SortNames bsr RefreshNames bsr RemakeProp rts *** Pointers zurücksetzen ResetPointers SADD ITextList,a0 move.l #Entrys,d0 moveq.l #6-1,d1 ResetP1 move.l (a0)+,a1 move.l d0,$c(a1) addi.l #36,d0 dbra d1,ResetP1 rts *** Proportional-Gadget angeklickt ... PropClick PEEKL EntryCount,d1 cmpi.b #6,d1 bls NoMove subq.b #6,d1 move.l #$ffff,d0 divu d1,d0 and.l #$ffff,d0 moveq.l #0,d1 PEEKW RPropSpecial+4,d1 divu d0,d1 and.l #$ffff,d1 mulu #36,d1 add.l #Entrys,d1 SADD ITextList,a0 moveq.l #6-1,d2 move.l (a0),a1 cmp.l $c(a1),d1 beq NoMove Move move.l (a0)+,a1 move.l d1,$c(a1) add.l #36,d1 dbra d2,Move EndMove bsr RefreshNames NoMove rts *** File-Namen ausgeben RefreshNames bsr ClearRects bsr MakeLenght SADD ITextList,a0 moveq.l #6-1,d0 MakeColors move.l (a0)+,a1 move.l $c(a1),a2 SADD EntryCols,a3 move.b 31(a2),d1 ext.w d1 move.b 0(a3,d1.w),(a1) dbra d0,MakeColors PEEKL _ReqWindRast,a0 SADD IText0,a1 moveq.l #0,d0 moveq.l #0,d1 CALLPC _IntuitionBase,PrintIText rts EntryCols dc.b 3,2,1,3,1,0 *** Rechtecke löschen ClearRects PEEKL _ReqWindRast,a1 moveq.l #0,d0 CALLPC _GfxBase,SetAPen SADD ITextList,a2 moveq.l #47,d4 moveq.l #6-1,d5 DoRem move.l (a2)+,a3 PEEKL _ReqWindRast,a1 moveq.l #22,d0 move.l $c(a3),a3 MakeX cmpi.b #0,(a3)+ beq XisOK addq.w #8,d0 cmpi.w #260-8*8,d0 bls MakeX move.w #260-8*8,d0 XisOK move.l d4,d1 move.l d1,d3 add.l #9,d3 move.w #260-1-7*8,d2 CALLSYS RectFill add.l #10,d4 dbra d5,DoRem EndRem rts *** Proportional-Gadget neu berechnen RemakeProp PEEKL EntryCount,d0 cmpi.b #6,d0 bls NoRemakeProp move.l #$ffff,d1 mulu #6,d1 divu d0,d1 cmp.w RPropSpecial+8(pc),d1 beq.s NoRemakeProp POKEW d1,RPropSpecial+8 bsr RefreshProp NoRemakeProp rts *** Proportional-Gadget zeichnen RefreshProp SADD RProp,a0 PEEKL _ReqWindBase,a1 suba.l a2,a2 CALLPC _IntuitionBase,RefreshGadgets rts *** String-Gadgets zeichnen RefreshStrings SADD RDir,a0 PEEKL _ReqWindBase,a1 suba.l a2,a2 CALLPC _IntuitionBase,RefreshGadgets rts *** Verbindet Directory mit Name JoinName lea DirBuffer,a0 lea FileBuffer,a1 lea DirFileBuffer,a2 CopyDir move.b (a0)+,(a2)+ cmpi.b #0,-1(a2) bne.s CopyDir suba.l #1,a2 cmpa.l #DirFileBuffer,a2 beq JoinFile cmpi.b #58,-1(a2) beq JoinFile cmpi.b #47,-1(a2) beq JoinFile move.b #47,(a2)+ JoinFile move.b (a1)+,(a2)+ cmpi.b #0,-1(a2) bne.s JoinFile rts *** Datei-Längen berechnen MakeLenght SADD ITextList,a2 SADD LTextList,a3 moveq.l #6-1,d3 MakeL move.l (a3)+,a0 move.l (a2)+,a4 move.l $c(a4),a4 cmpi.b #1,31(a4) bne MakeLDir move.l 32(a4),d2 bsr D2ToASC bra MakeDec MakeLDir moveq.l #7-1,d4 ClearSize move.b #32,(a0)+ dbra d4,ClearSize MakeDec dbra d3,MakeL rts *** d2 in ASC wandeln D2ToASC moveq #6,d0 SADD ASCTens,a1 move.l a0,-(sp) ASCNext moveq.b #"0",d1 ASCDec addq.b #1,d1 sub.l (a1),d2 bcc.s ASCDec subq.b #1,d1 add.l (a1)+,d2 move.b d1,(a0)+ dbra d0,ASCNext move.l (sp)+,a0 moveq.l #5,d0 ASCNill cmpi.b #"0",(a0) bne.s ASCEnd move.b #32,(a0)+ dbra d0,ASCNill ASCEnd rts ASCTens dc.l 1000000,100000,10000,1000,100,10,1 *** Library-Zeiger suchen und merken OpenLibs move.l 4,a6 lea $17a(a6),a0 SADD IntName,a1 CALLSYS FindName POKEL d0,_IntuitionBase lea $17a(a6),a0 SADD DOSName,a1 CALLSYS FindName POKEL d0,_DOSBase lea $17a(a6),a0 SADD GrafName,a1 CALLSYS FindName POKEL d0,_GfxBase rts IntName INTNAME DOSName DOSNAME GrafName GRAFNAME _IntuitionBase ds.l 1 _DOSBase ds.l 1 _GfxBase ds.l 1 *** Border malen MakeRBorder PEEKL _ReqWindRast,a0 SADD RBorder0,a1 moveq.l #0,d0 moveq.l #0,d1 CALLPC _IntuitionBase,DrawBorder rts *** Data-Teil ReqWindow dc.w 160,21,320,158 dc.b -1,-1 dc.l 8!$20!$40,$800!$1000!$10000,RGad0,0,0,0,0 dc.w 0,0,0,0,15 _ReqWindBase ds.l 1 _ReqWindRast ds.l 1 _ReqWindUser ds.l 1 RGad0 dc.l RGad1 dc.w 20,47,240,10,0,1,1 dc.l 0,0,0,0,0 dc.w "F0" dc.l 0 RGad1 dc.l RGad2 dc.w 20,57,240,10,0,1,1 dc.l 0,0,0,0,0 dc.w "F1" dc.l 0 RGad2 dc.l RGad3 dc.w 20,67,240,10,0,1,1 dc.l 0,0,0,0,0 dc.w "F2" dc.l 0 RGad3 dc.l RGad4 dc.w 20,77,240,10,0,1,1 dc.l 0,0,0,0,0 dc.w "F3" dc.l 0 RGad4 dc.l RGad5 dc.w 20,87,240,10,0,1,1 dc.l 0,0,0,0,0 dc.w "F4" dc.l 0 RGad5 dc.l RCancel dc.w 20,97,240,10,0,1,1 dc.l 0,0,0,0,0 dc.w "F5" dc.l 0 RCancel dc.l RParent dc.w 20,137,80,11,2,1,1 dc.l RBorder2,RBorder4,RCancelText,0,0 dc.w "CL" dc.l 0 RCancelText dc.b 1,0,0,0 dc.w 40-6*4,2 dc.l 0,RCancelBytes,0 TEXT RCancelBytes,"CANCEL" RParent dc.l ROK dc.w 80+2*20,137,80,11,2,1,1 dc.l RBorder2,RBorder4,RParentText,0,0 dc.w "PT" dc.l 0 RParentText dc.b 1,0,0,0 dc.w 40-6*4,2 dc.l 0,RParentBytes,0 TEXT RParentBytes,"PARENT" ROK dc.l RProp dc.w 2*80+3*20,137,80,11,2,1,1 dc.l RBorder2,RBorder4,ROKText,0,0 dc.w "OK" dc.l 0 ROKText dc.b 1,0,0,0 dc.w 40-8*4,2 dc.l 0,ROKBytes,0 TEXT ROKBytes,"CONTINUE" RProp dc.l RDir dc.w 284,49,12,56,0,2,3 dc.l RPropInfo,0,0,0,RPropSpecial dc.w "PR" dc.l 0 RPropInfo ds.w 4 RPropSpecial dc.w 1!4!8,0,0,0,$ffff ds.w 6 RDir dc.l RFile dc.w 21,28,278,8,0,1,4 dc.l RBorder6,0,0,0,RDirSpecial dc.w "DC" dc.l 0 RDirSpecial dc.l DirBuffer,UndoBuffer dc.w 0,81 ds.w 12 RFile dc.l 0 dc.w 21,118,278,8,0,1,4 dc.l RBorder6,0,0,0,RFileSpecial dc.w 0 dc.l 0 RFileSpecial dc.l FileBuffer,UndoBuffer dc.w 0,31 ds.w 12 RBorder0 dc.w 0,0 ;Borders für Fenster- dc.b 2,0,0,3 ;rahmen dc.l RPairs0,RBorder1 RPairs0 dc.w 319,0,0,0,0,156 RBorder1 dc.w 0,0 dc.b 1,0,0,3 dc.l RPairs1,RBorder8 RPairs1 dc.w 0,157,319,157,319,1 RBorder2 dc.w 0,0 ;Borders für Bool-Gads dc.b 2,0,0,3 dc.l RPairs24,RBorder3 RBorder3 dc.w 0,0 dc.b 1,0,0,3 dc.l RPairs35,0 RBorder4 dc.w 0,0 dc.b 1,0,0,3 dc.l RPairs24,RBorder5 RBorder5 dc.w 0,0 dc.b 2,0,0,3 dc.l RPairs35,0 RPairs24 dc.w 79,0,0,0,0,9 RPairs35 dc.w 0,10,79,10,79,1 RBorder6 dc.w -1,-1 ;Borders für Strings dc.b 1,0,0,3 dc.l RPairs6,RBorder7 RPairs6 dc.w 279,0,0,0,0,8 RBorder7 dc.w -1,-1 dc.b 2,0,0,3 dc.l RPairs7,0 RPairs7 dc.w 0,9,279,9,279,1 RBorder8 dc.w 280,47 ;Border für Prop-Gad dc.b 1,0,0,3 dc.l RPairs8,RBorder9 RPairs8 dc.w 19,0,0,0,0,58 RBorder9 dc.w 280,47 dc.b 2,0,0,3 dc.l RPairs9,0 RPairs9 dc.w 0,59,19,59,19,1 IText0 dc.b 1,0,1,0 dc.w 22,48 dc.l 0,0,IText1 IText1 dc.b 1,0,1,0 dc.w 22,58 dc.l 0,0,IText2 IText2 dc.b 1,0,1,0 dc.w 22,68 dc.l 0,0,IText3 IText3 dc.b 1,0,1,0 dc.w 22,78 dc.l 0,0,IText4 IText4 dc.b 1,0,1,0 dc.w 22,88 dc.l 0,0,IText5 IText5 dc.b 1,0,1,0 dc.w 22,98 dc.l 0,0,LText0 ITextList dc.l IText0,IText1,IText2,IText3,IText4,IText5 LText0 dc.b 2,0,1,0 dc.w 260-7*8,48 dc.l 0,LBytes0,LText1 TEXT LBytes0,<" "> LText1 dc.b 2,0,1,0 dc.w 260-7*8,58 dc.l 0,LBytes1,LText2 TEXT LBytes1,<" "> LText2 dc.b 2,0,1,0 dc.w 260-7*8,68 dc.l 0,LBytes2,LText3 TEXT LBytes2,<" "> LText3 dc.b 2,0,1,0 dc.w 260-7*8,78 dc.l 0,LBytes3,LText4 TEXT LBytes3,<" "> LText4 dc.b 2,0,1,0 dc.w 260-7*8,88 dc.l 0,LBytes4,LText5 TEXT LBytes4,<" "> LText5 dc.b 2,0,1,0 dc.w 260-7*8,98 dc.l 0,LBytes5,0 TEXT LBytes5,<" "> LTextList dc.l LBytes0,LBytes1,LBytes2,LBytes3,LBytes4,LBytes5 *** Fehler TableFull dc.b 1,0,0,0 dc.w 140-21*4,0 dc.l 0,TFullBytes,0 TEXT TFullBytes,<"MY FILE TABLE IS FULL"> SECTION "Reserved",BSS Entrys ds.b 100*36 cnop 0,4 FileInfo ds.b 260 DirBuffer ds.b 82 FileBuffer ds.b 32 DirFileBuffer ds.b 80+30+1+1 UndoBuffer ds.b 82 END