home *** CD-ROM | disk | FTP | other *** search
- ⓪ IMPLEMENTATION MODULE Binary; (* V#041 *)
- ⓪ (*$L-,R-*)
- ⓪ (*$Y+*)
- ⓪
- ⓪ (*
- ⓪"28.5.88 tt Überflüssiges MOVEQ #0,D2 am Ende v. 'write' entfernt
- ⓪"3.7.88 tt Bei write mit null Bytes wird A3 korrekt abgeräumt;
- ⓪.bei Seek wird auch richtig expandiert, wenn FilePos beim
- ⓪.Aufruf nicht am Fileende ist.
- ⓪"6.5.90 tt Read/WriteLargeBlock neu
- ⓪ *)
- ⓪
- ⓪ FROM FileBase IMPORT Unit, UDataProc, UCloseProc, UFlushProc, URStrProc,
- ⓪(UWStrProc, UGChrProc;
- ⓪
- ⓪ FROM Files IMPORT File, Access, @CheckState;
- ⓪
- ⓪ FROM SYSTEM IMPORT ASSEMBLER, BYTE, WORD, LONGWORD, ADDRESS, ADR;
- ⓪
- ⓪ IMPORT MOSGlobals;
- ⓪
- ⓪ (*$I FileDesc.Icl *)
- ⓪
- ⓪ (*$O+*)
- ⓪ TYPE File = POINTER TO FileDesc;
- ⓪ (*$O-*)
- ⓪
- ⓪
- ⓪ PROCEDURE ErrHandler;
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪(MOVE.L A0,(A3)+
- ⓪(JSR @CheckState
- ⓪(TST -(A3)
- ⓪(BEQ e0
- ⓪(CLR File.state(A0)
- ⓪%e0 CLR D0
- ⓪$END
- ⓪"END ErrHandler;
- ⓪
- ⓪ PROCEDURE CheckAccess;
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪(TST -(A3)
- ⓪(BEQ rf
- ⓪(CMPI #2,File.accmode(A0)
- ⓪(BLS rt
- ⓪(MOVE #MOSGlobals.fBadOp,File.state(A0)
- ⓪(JMP ErrHandler
- ⓪%rf RTS
- ⓪%rt MOVEQ #1,D0
- ⓪$END
- ⓪"END CheckAccess;
- ⓪
- ⓪
- ⓪ PROCEDURE FileSize (f: File): LONGCARD;
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪(LINK A5,#0
- ⓪(JSR @CheckState
- ⓪(JSR CheckAccess
- ⓪(UNLK A5
- ⓪(BEQ r0
- ⓪(MOVE.L File.len(A0),(A3)+
- ⓪(RTS
- ⓪%r0 CLR.L (A3)+
- ⓪$END
- ⓪"END FileSize;
- ⓪
- ⓪
- ⓪ PROCEDURE FilePos (f: File): LONGCARD;
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪(LINK A5,#0
- ⓪(JSR @CheckState
- ⓪(JSR CheckAccess
- ⓪(UNLK A5
- ⓪(BEQ r0
- ⓪(MOVE.L File.pos(A0),(A3)+
- ⓪(RTS
- ⓪%r0 CLR.L (A3)+
- ⓪$END
- ⓪"END FilePos;
- ⓪
- ⓪
- ⓪ PROCEDURE write (f:File; start: ADDRESS; len: LONGCARD);
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪(MOVE.L -12(A3),(A3)+
- ⓪(JSR @CheckState
- ⓪(TST -(A3)
- ⓪(BEQ err
- ⓪(MOVE File.accmode(A0),D0
- ⓪(BEQ badAcc
- ⓪(CMPI #2,D0
- ⓪(BHI badOp
- ⓪
- ⓪(MOVE.L -(A3),D0 ; LEN
- ⓪(BEQ ok0
- ⓪(MOVE.L -(A3),-(A7) ; START
- ⓪(MOVE.L D0,-(A7)
- ⓪(MOVE File.handle(A0),-(A7)
- ⓪(MOVE #$40,-(A7)
- ⓪(TRAP #1
- ⓪(ADDQ.L #4,A7
- ⓪(MOVE.L (A7)+,D1 ; LEN
- ⓪(ADDQ.L #4,A7
- ⓪(MOVE.L -(A3),A0
- ⓪(MOVE #1,File.modified(A0)
- ⓪(TST.L D0
- ⓪(BPL ok
- ⓪(MOVE D0,File.state(A0)
- ⓪(UNLK A5
- ⓪(RTS
- ⓪'ok0:
- ⓪(SUBQ.L #8,A3
- ⓪(UNLK A5
- ⓪(RTS
- ⓪
- ⓪'badOp:
- ⓪(MOVE #MOSGlobals.fBadOp,D0
- ⓪(BRA errH
- ⓪'badAcc:
- ⓪(MOVE #MOSGlobals.fBadAccess,D0
- ⓪'errH:
- ⓪(MOVE D0,File.state(A0)
- ⓪(MOVE.L A0,(A3)+
- ⓪(JSR ErrHandler
- ⓪'err:
- ⓪(SUBA.W #12,A3
- ⓪(UNLK A5
- ⓪(RTS
- ⓪
- ⓪'full:
- ⓪(MOVE #MOSGlobals.fDiskFull,File.state(A0)
- ⓪(UNLK A5
- ⓪(RTS
- ⓪
- ⓪'ok:
- ⓪(CMP.L D0,D1
- ⓪(BHI full
- ⓪(ADD.L D1,File.pos(A0)
- ⓪(MOVE.L File.pos(A0),D0
- ⓪(CMP.L File.len(A0),D0
- ⓪(BCS end
- ⓪(MOVE.L D0,File.len(A0)
- ⓪'end:
- ⓪(UNLK A5
- ⓪$END
- ⓪"END write;
- ⓪
- ⓪ PROCEDURE seek0;
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪(MOVE.W D3,-(A7)
- ⓪(MOVE.W File.handle(A4),-(A7)
- ⓪(MOVE.L D4,-(A7)
- ⓪(MOVE #$42,-(A7)
- ⓪(TRAP #1
- ⓪(ADDA.W #10,A7
- ⓪$END
- ⓪"END seek0;
- ⓪
- ⓪ PROCEDURE Seek (f: File; offset : LONGINT; base: SeekMode);
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪(LINK A5,#0
- ⓪(MOVEM.L D3-D5/A4,-(A7)
- ⓪(MOVE.W -(A3),D3 ; base
- ⓪(MOVE.L -(A3),D4 ; offset
- ⓪(JSR @CheckState
- ⓪(JSR CheckAccess
- ⓪(MOVE.L A0,A4 ; f
- ⓪(BEQ.L end
- ⓪(
- ⓪(; r := seek (offset,f^.handle,base);
- ⓪(JSR seek0
- ⓪(TST.L D0
- ⓪(BPL.L noErr
- ⓪(
- ⓪(CMPI.W #-64,D0
- ⓪(BNE.L genErr
- ⓪(TST File.accmode(A4)
- ⓪(BEQ.L genErr
- ⓪(
- ⓪(; Seek ans Ende
- ⓪(MOVE.L D4,D5
- ⓪(SWAP D3
- ⓪(MOVEQ #0,D4
- ⓪(MOVE #fromEnd,D3
- ⓪(JSR seek0
- ⓪(TST.L D0
- ⓪(BMI.L genErr
- ⓪(SWAP D3
- ⓪(MOVE.L D5,D4
- ⓪(
- ⓪(MOVE.L File.len(A4),D5 ; len
- ⓪(CMP.L D5,D0
- ⓪(BNE.L interr ; -> Fehler: len und seek-Pos nicht gleich
- ⓪(
- ⓪(CMPI #1,D3
- ⓪(BEQ frPos
- ⓪(BCS frBeg
- ⓪(ADD.L D5,D4
- ⓪&frPos
- ⓪(ADD.L File.pos(A4),D4
- ⓪&frBeg
- ⓪(
- ⓪(CMP.L D5,D4
- ⓪(BLS noExp
- ⓪(
- ⓪(SUB.L D4,D5
- ⓪(NEG.L D5
- ⓪(
- ⓪%l0 MOVE.L A4,(A3)+
- ⓪(MOVE.L #$8000,(A3)+
- ⓪(CMPI.L #$4000,D5
- ⓪(BLS t2
- ⓪(MOVE.L #$4000,D0
- ⓪(BRA t3
- ⓪%t2 MOVE.L D5,D0
- ⓪%t3 MOVE.L D0,(A3)+
- ⓪(PEA rtnadr(PC)
- ⓪(LINK A5,#0
- ⓪(JMP write
- ⓪%rtnadr:
- ⓪(TST File.state(A4)
- ⓪(BMI end
- ⓪(SUB.L #$4000,D5
- ⓪(BGT l0
- ⓪(
- ⓪(CLR D3 ; base:= fromBegin
- ⓪(JSR seek0
- ⓪(
- ⓪&noExp:
- ⓪(TST.L D0
- ⓪(BPL noErr
- ⓪(
- ⓪&genErr:
- ⓪(MOVE D0,File.state(A4)
- ⓪(BRA end
- ⓪(
- ⓪&interr
- ⓪(MOVE #MOSGlobals.fInternalErr1,D0
- ⓪(BRA genErr
- ⓪(
- ⓪&noErr:
- ⓪(MOVE.L D0,File.pos(A4)
- ⓪(CMP.L File.len(A4),D0
- ⓪(BLS end
- ⓪(MOVE.L D0,File.len(A4)
- ⓪(
- ⓪&end:
- ⓪(MOVEM.L (A7)+,D3-D5/A4
- ⓪(UNLK A5
- ⓪$END
- ⓪"END Seek;
- ⓪
- ⓪
- ⓪ PROCEDURE read;
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪(MOVEM.L D1/D2/A0,-(A7)
- ⓪(MOVE File.handle(A0),-(A7)
- ⓪(MOVE #$3F,-(A7)
- ⓪(TRAP #1
- ⓪(ADDQ.L #4,A7
- ⓪(MOVEM.L (A7)+,D1/D2/A0 ; len / * / f
- ⓪(TST.L D0
- ⓪(BPL ok
- ⓪(MOVE D0,File.state(A0)
- ⓪(UNLK A5
- ⓪(RTS
- ⓪'ok
- ⓪(ADD.L D1,File.pos(A0)
- ⓪'end
- ⓪(UNLK A5
- ⓪$END
- ⓪"END read;
- ⓪
- ⓪ PROCEDURE rd_prep;
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪(MOVE.L D1,D0
- ⓪(ADD.L File.pos(A0),D0
- ⓪(CMP.L File.len(A0),D0
- ⓪(BHI t0
- ⓪(JMP read
- ⓪%t0 MOVE #MOSGlobals.fEndOfFile,File.state(A0)
- ⓪(MOVE.L File.pos(A0),D0
- ⓪(CMP.L File.len(A0),D0
- ⓪(BCS e0
- ⓪(JSR ErrHandler
- ⓪%e0
- ⓪$END
- ⓪"END rd_prep;
- ⓪
- ⓪ PROCEDURE ReadByte (f: File; VAR byte: BYTE);
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪(LINK A5,#0
- ⓪(MOVE.L -(A3),-(A7)
- ⓪(JSR @CheckState
- ⓪(JSR CheckAccess
- ⓪(BEQ e0
- ⓪(MOVE.L (A7)+,D2 ; start
- ⓪(MOVEQ #1,D1 ; len
- ⓪(JSR rd_prep
- ⓪%e0 UNLK A5
- ⓪$END
- ⓪"END ReadByte;
- ⓪
- ⓪ PROCEDURE ReadWord (f: File; VAR word: WORD);
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪(LINK A5,#0
- ⓪(MOVE.L -(A3),-(A7)
- ⓪(JSR @CheckState
- ⓪(JSR CheckAccess
- ⓪(BEQ e0
- ⓪(MOVE.L (A7)+,D2 ; start
- ⓪(MOVEQ #2,D1 ; len
- ⓪(JSR rd_prep
- ⓪%e0 UNLK A5
- ⓪$END
- ⓪"END ReadWord;
- ⓪
- ⓪ PROCEDURE ReadLong (f: File; VAR long: LONGWORD);
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪(LINK A5,#0
- ⓪(MOVE.L -(A3),-(A7)
- ⓪(JSR @CheckState
- ⓪(JSR CheckAccess
- ⓪(BEQ e0
- ⓪(MOVE.L (A7)+,D2 ; start
- ⓪(MOVEQ #4,D1 ; len
- ⓪(JSR rd_prep
- ⓪%e0 UNLK A5
- ⓪$END
- ⓪"END ReadLong;
- ⓪
- ⓪ PROCEDURE ReadBlock (f: File; VAR block: ARRAY OF BYTE);
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪(LINK A5,#0
- ⓪(MOVE.W -(A3),-(A7)
- ⓪(MOVE.L -(A3),-(A7)
- ⓪(JSR @CheckState
- ⓪(JSR CheckAccess
- ⓪(BEQ e0
- ⓪(MOVE.L (A7)+,D2 ; start
- ⓪(MOVEQ #0,D1
- ⓪(MOVE.W (A7)+,D1 ; HIGH
- ⓪(ADDQ.L #1,D1
- ⓪(JSR rd_prep
- ⓪%e0 UNLK A5
- ⓪$END
- ⓪"END ReadBlock;
- ⓪
- ⓪ PROCEDURE ReadLargeBlock (f: File; VAR block: LONGARRAY OF BYTE);
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪(LINK A5,#0
- ⓪(MOVE.L -(A3),-(A7)
- ⓪(MOVE.L -(A3),-(A7)
- ⓪(JSR @CheckState
- ⓪(JSR CheckAccess
- ⓪(BEQ e0
- ⓪(MOVE.L (A7)+,D2 ; start
- ⓪(MOVE.L (A7)+,D1 ; HIGH
- ⓪(ADDQ.L #1,D1
- ⓪(JSR rd_prep
- ⓪%e0 UNLK A5
- ⓪$END
- ⓪"END ReadLargeBlock;
- ⓪
- ⓪ PROCEDURE ReadBytes ( f : File;
- ⓪9addr : ADDRESS;
- ⓪9bytes : LONGCARD;
- ⓪5VAR bytesRead: LONGCARD);
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪(LINK A5,#0
- ⓪(MOVE.L -(A3),-(A7) ; bytesRead
- ⓪(MOVE.L -(A3),-(A7)
- ⓪(MOVE.L -(A3),-(A7)
- ⓪(JSR @CheckState
- ⓪(JSR CheckAccess
- ⓪(BEQ e0
- ⓪(MOVE.L (A7)+,D2 ; addr
- ⓪(MOVE.L (A7)+,D1 ; bytes
- ⓪(MOVE.L (A7)+,A1 ; bytesRead
- ⓪(MOVE.L File.len(A0),D0
- ⓪(SUB.L File.pos(A0),D0
- ⓪(CMP.L D0,D1
- ⓪(BLS t0
- ⓪(MOVE.L D0,D1
- ⓪%t0 MOVE.L D1,(A1)
- ⓪(JMP read
- ⓪%e0 UNLK A5
- ⓪$END
- ⓪"END ReadBytes;
- ⓪
- ⓪
- ⓪ PROCEDURE WriteByte (f: File; byte: BYTE);
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪(LINK A5,#0
- ⓪(MOVE.W -(A3),-(A7)
- ⓪(MOVE.L A7,(A3)+
- ⓪(MOVEQ #1,D0
- ⓪(MOVE.L D0,(A3)+
- ⓪(JMP write
- ⓪$END
- ⓪"END WriteByte;
- ⓪
- ⓪ PROCEDURE WriteWord (f: File; word: WORD);
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪(LINK A5,#0
- ⓪(MOVE.W -(A3),-(A7)
- ⓪(MOVE.L A7,(A3)+
- ⓪(MOVEQ #2,D0
- ⓪(MOVE.L D0,(A3)+
- ⓪(JMP write
- ⓪$END
- ⓪"END WriteWord;
- ⓪
- ⓪ PROCEDURE WriteLong (f: File; long: LONGWORD);
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪(LINK A5,#0
- ⓪(MOVE.L -(A3),-(A7)
- ⓪(MOVE.L A7,(A3)+
- ⓪(MOVEQ #4,D0
- ⓪(MOVE.L D0,(A3)+
- ⓪(JMP write
- ⓪$END
- ⓪"END WriteLong;
- ⓪
- ⓪ PROCEDURE WriteBlock (f: File; REF block: ARRAY OF BYTE);
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪(LINK A5,#0
- ⓪(MOVEQ #0,D0
- ⓪(MOVE.W -(A3),D0
- ⓪(ADDQ.L #1,D0
- ⓪(MOVE.L D0,(A3)+
- ⓪(JMP write
- ⓪$END
- ⓪"END WriteBlock;
- ⓪
- ⓪ PROCEDURE WriteLargeBlock (f: File; REF block: LONGARRAY OF BYTE);
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪(LINK A5,#0
- ⓪(ADDQ.L #1,-4(A3)
- ⓪(JMP write
- ⓪$END
- ⓪"END WriteLargeBlock;
- ⓪
- ⓪ PROCEDURE WriteBytes (f: File; addr: ADDRESS; bytes: LONGCARD);
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪(LINK A5,#0
- ⓪(JMP write
- ⓪$END
- ⓪"END WriteBytes;
- ⓪
- ⓪ END Binary.
- ⓪ ə
- (* $00001B3D$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$000002CB$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDAÇ$00000259T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$00001FA8$00000A99$000020C8$FFF0C822$FFF0C822$00000838$00000259$FFED095D$00000BB8$0000146B$0000158B$000016AF$000017DA$000018DE$00001A3C$00002052£Çâ*)
-