home *** CD-ROM | disk | FTP | other *** search
- ⓪ MODULE GetMPB;
- ⓪ (*$E MOS *)
- ⓪
- ⓪ FROM MOSCtrl IMPORT ProcessID;
- ⓪ FROM SYSTEM IMPORT ASSEMBLER, ADDRESS, LONGWORD;
- ⓪ FROM Console IMPORT WriteString, WriteLn, Read;
- ⓪ FROM StrConv IMPORT LHexToStr;
- ⓪
- ⓪ TYPE P_MD = POINTER TO MD;
- ⓪%
- ⓪%MD = RECORD
- ⓪,next: P_MD;
- ⓪,start: ADDRESS;
- ⓪,length: LONGCARD;
- ⓪,owner: LONGWORD
- ⓪*END;
- ⓪
- ⓪%P_MPB = POINTER TO MPB;
- ⓪%
- ⓪%MPB = RECORD
- ⓪-free: P_MD;
- ⓪-used: P_MD;
- ⓪-boomer: P_MD
- ⓪+END;
- ⓪
- ⓪
- ⓪ VAR MPBPtr: P_MPB;
- ⓪
- ⓪$ch: CHAR;
- ⓪
- ⓪ CONST end_os = $4FA;
- ⓪
- ⓪ BEGIN
- ⓪"ASSEMBLER
- ⓪(; Malloc (2)
- ⓪(MOVEQ #2,D0
- ⓪(MOVE.L D0,-(A7)
- ⓪(MOVE #$48,-(A7)
- ⓪(TRAP #1
- ⓪(ADDQ.L #6,A7
- ⓪(MOVE.L D0,-(A7)
- ⓪(
- ⓪(CLR.L -(A7)
- ⓪(MOVE #$20,-(A7) ; Super (0)
- ⓪(TRAP #1
- ⓪(MOVE.L D0,2(A7)
- ⓪(
- ⓪(MOVE.L $4F2,A0 ; ^TOS-Header
- ⓪(MOVE.L 8(A0),A0 ; wg. altem AHDI
- ⓪(CMPI.B #$03,2(A0)
- ⓪(BEQ.W error ; erstmal nicht bei TT wg. Fast-RAM
- ⓪(
- ⓪(LEA $800,A0
- ⓪(MOVE.L end_os,D1
- ⓪(SUB.L A0,D1
- ⓪(LSR #1,D1 ; D1: Anzahl zu suchender Words
- ⓪(
- ⓪(; *** nach dem MD suchen ***
- ⓪(
- ⓪(MOVE.L 6(A7),D0 ; zu suchender 'start'
- ⓪(MOVE.L ProcessID,A2
- ⓪(MOVE.L (A2),D2 ; zu suchender 'owner'
- ⓪(
- ⓪(CLR.L -(A7) ; Flag: bisher nix gefunden
- ⓪(
- ⓪$l1: CMP.W (A0)+,D0
- ⓪(DBEQ D1,l1
- ⓪(BNE e1
- ⓪(CMP.L -4(A0),D0 ; stimmt 'start'?
- ⓪(DBEQ D1,l1
- ⓪(BNE e1
- ⓪(CMPI.L #2,(A0) ; stimmt 'length'?
- ⓪(DBEQ D1,l1
- ⓪(BNE e1
- ⓪(CMP.L 4(A0),D2 ; stimmt 'owner'?
- ⓪(DBEQ D1,l1
- ⓪(BNE e1
- ⓪(
- ⓪(; *** MD gefunden ***
- ⓪(
- ⓪(TST.L (A7)+
- ⓪(BNE error ; mehrfach gefunden -> Abbruch
- ⓪(
- ⓪(LEA -8(A0),A1
- ⓪(MOVE.L A1,-(A7) ; Adr. des MD merken
- ⓪(
- ⓪(DBRA D1,l1 ; weitersuchen
- ⓪
- ⓪$e1: MOVE.L (A7)+,A1
- ⓪(MOVE.L A1,D2
- ⓪(BEQ error ; nicht gefunden
- ⓪(
- ⓪(; *** nach möglichen MPBs suchen ***
- ⓪(
- ⓪(LEA $800,A0
- ⓪(MOVE.L end_os,D1
- ⓪(SUB.L A0,D1
- ⓪(LSR #1,D1 ; D1: Anzahl zu suchender Words
- ⓪(
- ⓪(CLR.L -(A7) ; Endmarke f. gefundene Adressen
- ⓪(
- ⓪$l2: CMP.W (A0)+,D2
- ⓪(DBEQ D1,l2
- ⓪(BNE e2
- ⓪(CMP.L -4(A0),D2 ; steht ^MD in MPB.used?
- ⓪(DBEQ D1,l2
- ⓪(BNE e2
- ⓪(; einen haben wir...
- ⓪(PEA -8(A0)
- ⓪(DBRA D1,l2 ; weitersuchen
- ⓪(
- ⓪$e2:
- ⓪(; *** Bereich wieder freigeben. Dann ***
- ⓪(; *** steht in MPB.used der ^MD.next ***
- ⓪(
- ⓪(MOVE.L (A1),-(A7) ; MD.next merken
- ⓪(MOVE.L D0,-(A7)
- ⓪(MOVE #$49,-(A7) ; Mfree()
- ⓪(TRAP #1
- ⓪(ADDQ.L #6,A7
- ⓪(MOVE.L (A7)+,D2 ; MD.next
- ⓪(
- ⓪(; *** nochmal die mögl. MPBs prüfen ***
- ⓪(
- ⓪$l3: MOVE.L (A7)+,D0 ; ^MD
- ⓪(BEQ e3
- ⓪(MOVE.L D0,A0
- ⓪(CMP.L 4(A0),D2 ; MBP.used = MD.next?
- ⓪(BNE l3
- ⓪(TST.L MPBPtr
- ⓪(BNE err2 ; mehrfach gefunden -> Abbruch
- ⓪(; *** MPB gefunden ***
- ⓪(MOVE.L A0,MPBPtr
- ⓪(BRA l3 ; weitersuchen
- ⓪(
- ⓪"err2: TST.L (A7)+
- ⓪(BNE err2
- ⓪(CLR.L MPBPtr
- ⓪
- ⓪$e3: TRAP #1 ; Super (SSP)
- ⓪(ADDQ.L #6,A7
- ⓪(BRA ende
- ⓪(
- ⓪!error: TRAP #1 ; Super (SSP)
- ⓪(ADDQ.L #6,A7
- ⓪(MOVE #$49,-(A7) ; Mfree()
- ⓪(TRAP #1
- ⓪(ADDQ.L #2,A7
- ⓪(CLR.L MPBPtr
- ⓪
- ⓪"ende: ADDQ.L #4,A7 ; Adr. vom angeforderten Block vom Stack
- ⓪"END;
- ⓪"WriteString ('MPBPtr: ');
- ⓪"WriteString (LHexToStr (MPBPtr, 7));
- ⓪"WriteLn;
- ⓪"Read (ch)
- ⓪ END GetMPB.
- ⓪ ə
- (* $FFED5C54$FFED5C54$FFED5C54$FFED5C54$FFED5C54$FFED5C54$FFED5C54$FFED5C54$FFED5C54$FFED5C54$FFED5C54$FFED5C54$FFED5C54$FFED5C54$FFED5C54$FFED5C54$FFED5C54$FFED5C54$FFED5C54$FFED5C54$FFED5C54$FFED5C54$FFED5C54$FFED5C54$FFED5C54$FFED5C54$FFED5C54$FFED5C54$FFED5C54$FFED5C54$FFED5C54$FFED5C54$FFED5C54$FFED5C54$FFED5C54$FFED5C54$FFED5C54$FFED5C54$FFED5C54$FFED5C54$FFED5C54$FFED5C54Ç$000001ADT.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$0000089F$0000075B$0000076B$0000077B$0000078A$0000080A$0000085A$0000089F$000006DD$000007FD$0000082E$00000884$00000A86$000001AD$000001F0$00000380ÇÇé*)
-