home *** CD-ROM | disk | FTP | other *** search
- ⓪ MODULE LANMonitor; (*$H+,Z+,R-*)
- ⓪
- ⓪ (*
- ⓪ NOTES
- ⓪ -----
- ⓪ - Testen auch ohne Interrupts - nur Polling!
- ⓪ - Die CRC-Prüfung scheint nicht zu klappen. Zumindest wird kein Fehler angezeigt,
- ⓪"wenn beim empf. Dataframe das 1.Byte fehlt.
- ⓪"-> Evtl. wird overrun gelmeldet und nicht erkannt?
- ⓪ - Wenn 'excessCollsns' gemeldet wird, kann das auch heißen, daß
- ⓪"der Partner überhaupt nicht geantwortet hat (also kein CTS auf's RTS
- ⓪"gesandt hat).
- ⓪ - oft passiert es, daß das CTS zu spät kommt. Dann wird in 'GetFrame'
- ⓪"'fAdrInUse' gesetzt, weil man annimmt, daß jemand anderes auf ein RTS
- ⓪"geantwortet hat (denn 'fCTSexpected ist schon FALSE).
- ⓪"Das ist eigentlich OK, nur daß das *erwartete* CTS offenbar dann zu spät kam.
- ⓪ - seltsamerweise klappt beim TransmitPacket immer der erste RTS nicht.
- ⓪"Es kommt dann kein CTS? Bei weiteren RTS klappt's dafür immer.
- ⓪ *)
- ⓪
- ⓪ (*
- ⓪ IMPORT TOSDebug;
- ⓪ *)
- ⓪
- ⓪ IMPORT TOSIO; (*$E MOS *)
- ⓪
- ⓪ IMPORT SYSTEM;
- ⓪ FROM SYSTEM IMPORT ASSEMBLER, ADR, BYTE;
- ⓪
- ⓪ IMPORT ALAP;
- ⓪
- ⓪ IMPORT MOSGlobals, PrgCtrl;
- ⓪
- ⓪ FROM InOut IMPORT WriteLn, Write, WriteCard, ReadCard, ReadLCard, Read,
- ⓪0GotoXY, WritePg, WriteString, WriteHex, WriteLHex,
- ⓪0KeyPressed, Done, WriteNum, WriteLNum;
- ⓪
- ⓪ FROM GEMDOS IMPORT Super;
- ⓪ IMPORT VT52; FROM VT52 IMPORT Codes;
- ⓪
- ⓪
- ⓪ CONST NMI_Mask = $0700; (* !!! $0700 *)
- ⓪
- ⓪
- ⓪ (*****************************************************************************)
- ⓪
- ⓪
- ⓪ MODULE SCC;
- ⓪ (*$L-*)
- ⓪
- ⓪ FROM SYSTEM IMPORT WORD, ADDRESS, ASSEMBLER;
- ⓪
- ⓪ IMPORT Super;
- ⓪ FROM PrgCtrl IMPORT TermCarrier, CatchProcessTerm;
- ⓪ FROM MOSGlobals IMPORT MemArea;
- ⓪
- ⓪ EXPORT QUALIFIED Reg, SetReg, CTLA;
- ⓪
- ⓪ CONST CTLA = $FFFF8C81;
- ⓪
- ⓪ PROCEDURE Reg (n: CARDINAL): CARDINAL;
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪(MOVE SR,-(A7)
- ⓪(MOVE #$2500,SR
- ⓪(MOVEA.W #CTLA,A1
- ⓪(MOVE.W -(A3),D0
- ⓪(BEQ read0
- ⓪(MOVE.B D0,(A1) ; SCC A control
- ⓪&read0:
- ⓪(MOVE.B (A1),D0
- ⓪(MOVE (A7)+,SR
- ⓪$END;
- ⓪"END Reg;
- ⓪
- ⓪ PROCEDURE SetReg (no, value: CARDINAL);
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪(MOVE SR,-(A7)
- ⓪(MOVE #$2500,SR
- ⓪(MOVEA.W #CTLA,A1
- ⓪(MOVE.W -(A3),D1 ; value
- ⓪(MOVE.W -(A3),D0 ; no
- ⓪(BEQ write0
- ⓪(MOVE.B D0,(A1) ; SCC A control
- ⓪&write0:
- ⓪(MOVE.B D1,(A1)
- ⓪(MOVE (A7)+,SR
- ⓪$END;
- ⓪"END SetReg;
- ⓪
- ⓪ (*$L=*)
- ⓪
- ⓪ (****** Vorsicht: ab hier $L+ ******)
- ⓪
- ⓪ PROCEDURE term;
- ⓪"VAR ssp: LONGCARD;
- ⓪"BEGIN
- ⓪$ssp:= Super (0);
- ⓪$SetReg (9, $C0);
- ⓪$ssp:= Super (ssp)
- ⓪"END term;
- ⓪
- ⓪ VAR carrier: TermCarrier;
- ⓪
- ⓪ BEGIN
- ⓪"CatchProcessTerm (carrier, term, MemArea{NIL,0});
- ⓪ END (* MODULE *) SCC;
- ⓪
- ⓪
- ⓪ TYPE BS = SET OF [0..7];
- ⓪%RegSet = SET OF [0..15];
- ⓪
- ⓪ CONST ReadRegs = RegSet {0,1,2,3,8,10,12,13,15};
- ⓪&WriteRegs = RegSet {0..15};
- ⓪&
- ⓪&RegsToDisplay = RegSet {0,1,2,3,8,10,12,13,15};
- ⓪&
- ⓪
- ⓪ PROCEDURE WriteReg (n: CARDINAL);
- ⓪"VAR reg: CARDINAL;
- ⓪"BEGIN
- ⓪$reg:= SCC.Reg (n);
- ⓪$WriteNum (reg, 16, 2, '0');
- ⓪$WriteString (' ');
- ⓪$WriteNum (reg, 2, 8, '0');
- ⓪"END WriteReg;
- ⓪
- ⓪
- ⓪ VAR ch: CHAR;
- ⓪$rxIdx, n, c: CARDINAL;
- ⓪$lc: LONGCARD;
- ⓪$i: INTEGER;
- ⓪$ssp, li: LONGINT;
- ⓪$redraw, quit, ok, b: BOOLEAN;
- ⓪$by: BS;
- ⓪$myaddr, outaddr: CARDINAL;
- ⓪$sentDatas,sendTrials,rcvdDatas: LONGCARD;
- ⓪$
- ⓪$txFrame: ALAP.aTxFrame;
- ⓪$packet: ALAP.ptrPacket;
- ⓪$dstParam, srcParam: ALAP.anAddress;
- ⓪$typeParam: ALAP.aLAPtype;
- ⓪$dataParam: ALAP.aDataField;
- ⓪$txStatus: ALAP.TransmitStatus;
- ⓪$frameStatus: ALAP.FrameStatus;
- ⓪$dataLength: INTEGER;
- ⓪
- ⓪ BEGIN
- ⓪"WritePg;
- ⓪"ssp:= Super (0);
- ⓪"
- ⓪"(*
- ⓪"WriteLn;
- ⓪"WriteString ('Start...');
- ⓪"FOR c:= 1 TO 5 DO
- ⓪$FOR n:= 1 TO 5*1000 DO
- ⓪&ASSEMBLER
- ⓪(MOVEA.W #$FA00,A2
- ⓪(MOVEQ #50,D0
- ⓪(MOVE.B #$DF,$0B(A2) ; IPRA: Clear Timer-A Pending Bit
- ⓪(MOVE.B D0,$1F(A2) ; TADR: Set Timer Count
- ⓪(MOVE.B #2,$19(A2) ; TACR: Timer Start (Teiler: 1/10)
- ⓪$l0: BTST #5,$0B(A2) ; time over?
- ⓪(BEQ l0
- ⓪(MOVE.B #$00,$19(A2) ; TACR: Timer Stop
- ⓪&END;
- ⓪$END;
- ⓪"END;
- ⓪"WriteString ('Stop!');
- ⓪"WriteLn;
- ⓪"*)
- ⓪"
- ⓪"WriteLn;
- ⓪"WriteString ('Init...');
- ⓪"WriteLn;
- ⓪"
- ⓪"ASSEMBLER
- ⓪(MOVEQ #0,D0
- ⓪(JSR ALAP.Init;
- ⓪"END;
- ⓪"
- ⓪"ALAP.NewPacketBuffer;
- ⓪"ALAP.NewPacketBuffer;
- ⓪"ALAP.NewPacketBuffer;
- ⓪"ALAP.NewPacketBuffer;
- ⓪"
- ⓪"WriteString ('OK');
- ⓪"WriteLn;
- ⓪"
- ⓪"rxIdx:= 0;
- ⓪"redraw:= TRUE;
- ⓪"quit:= FALSE;
- ⓪"REPEAT
- ⓪$IF redraw THEN
- ⓪&GotoXY (4,0);
- ⓪&WriteString (' interrupts');
- ⓪&GotoXY (4,1);
- ⓪&WriteString (' frames received');
- ⓪&GotoXY (0,2);
- ⓪&FOR n:= 0 TO 15 DO
- ⓪(IF n IN ReadRegs THEN
- ⓪*WriteString ('Reg '); WriteNum (n, 16, 1, '0'); WriteString (': '); WriteLn;
- ⓪(END
- ⓪&END;
- ⓪&WriteString (VT52.Seq[clearEOS]);
- ⓪&
- ⓪&c:= 2;
- ⓪&FOR n:= 0 TO 15 DO
- ⓪(IF n IN ReadRegs THEN
- ⓪*IF n IN RegsToDisplay THEN GotoXY (7,c); WriteReg (n) END;
- ⓪*INC (c);
- ⓪(END;
- ⓪&END;
- ⓪&
- ⓪&GotoXY (0, 11);
- ⓪&WriteString ('myAddress: '); WriteHex (LONG (ALAP.myAddress), 3);
- ⓪&WriteString (', dest-Addr: '); WriteHex (outaddr, 3);
- ⓪&GotoXY (0, 12);
- ⓪&WriteString ('collsns: , defers:');
- ⓪&GotoXY (0, 13);
- ⓪&WriteString ('RTS: , CTS: , Data:');
- ⓪&redraw:= FALSE
- ⓪$END;
- ⓪$GotoXY (0,0);
- ⓪$WriteCard (ALAP.Interrupts, 4);
- ⓪$GotoXY (0,1);
- ⓪$WriteCard (ALAP.FramesReceived, 4);
- ⓪$GotoXY (8,12);
- ⓪$WriteCard (ALAP.collsnCount,3);
- ⓪$GotoXY (20,12);
- ⓪$WriteCard (ALAP.deferCount,3);
- ⓪$GotoXY (4,13);
- ⓪$WriteCard (ALAP.RTSFramesOut,3);
- ⓪$GotoXY (13,13);
- ⓪$WriteCard (ALAP.CTSFramesOut,3);
- ⓪$GotoXY (23,13);
- ⓪$WriteCard (ALAP.DataFramesOut,3);
- ⓪$
- ⓪$ASSEMBLER MOVE SR,-(A7) ORI.W #$0700,SR END;
- ⓪$IF ALAP.headPacket # ALAP.tailPacket THEN
- ⓪&frameStatus:= ALAP.ReceiveFrame (packet);
- ⓪&GotoXY (40, rxIdx);
- ⓪&WriteCard (rxIdx, 2);
- ⓪&INC (rxIdx);
- ⓪&WriteString (': ');
- ⓪&ALAP.WriteFrame (packet^, 5);
- ⓪&WriteCard (packet^.no, 1); Write (' ');
- ⓪&ALAP.WriteStatus (packet^.status);
- ⓪$END;
- ⓪$ASSEMBLER MOVE.W (A7)+,SR END;
- ⓪$
- ⓪$IF KeyPressed() THEN
- ⓪&GotoXY (0,14);
- ⓪&WriteString (VT52.Seq[clearEOS]);
- ⓪&WriteLn;
- ⓪&Read (ch); ch:= CAP (ch);
- ⓪&IF ch = 'Q' THEN
- ⓪(quit:= TRUE;
- ⓪&ELSIF ch = 'T' THEN
- ⓪(WriteLn;
- ⓪(WriteString ('Transmitting...');
- ⓪(WriteLn;
- ⓪(
- ⓪((*txStatus:= ALAP.TransmitPacket (outaddr, BYTE($10), dataParam, 0);*)
- ⓪(WITH txFrame DO
- ⓪*ctrl.srcAddr:= ALAP.myAddress;
- ⓪*ctrl.dstAddr:= SHORT (outaddr);
- ⓪*ctrl.lapType:= BYTE ($10);
- ⓪*dataCnt1:= 2;
- ⓪*dataPtr1:= ADR (dataParam);
- ⓪*dataCnt2:= 0;
- ⓪*dataParam[1]:= BYTE ($12);
- ⓪*dataParam[2]:= BYTE ($34);
- ⓪(END;
- ⓪(ASSEMBLER
- ⓪*LEA txFrame,A0
- ⓪*JSR ALAP.TransmitPacket
- ⓪*MOVE D0,txStatus
- ⓪(END;
- ⓪(
- ⓪(ALAP.fAdrInUse:= FALSE;
- ⓪(WriteString ('Status: ');
- ⓪(CASE txStatus OF
- ⓪(| ALAP.transmitOK: WriteString ('transmitOK')
- ⓪(| ALAP.excessDefers: WriteString ('excessDefers')
- ⓪(| ALAP.excessCollsns: WriteString ('excessCollsns')
- ⓪(| ALAP.dupAddress: WriteString ('dupAddress')
- ⓪(END;
- ⓪(WriteLn;
- ⓪&ELSIF ch = 'R' THEN
- ⓪(WriteLn;
- ⓪(WriteString ('Receiving...');
- ⓪(WriteLn;
- ⓪(ALAP.ReceivePacket (dstParam, srcParam, typeParam, dataParam, dataLength);
- ⓪(IF KeyPressed () THEN
- ⓪*WriteString ('Aborted');
- ⓪*Read (ch)
- ⓪(ELSE
- ⓪*WriteString ('OK');
- ⓪(END
- ⓪&ELSIF ch = 'G' THEN
- ⓪(WriteLn;
- ⓪(WriteString ('Getting Addresses on Bus...');
- ⓪(WriteLn;
- ⓪(FOR n:= $01 TO $7F DO
- ⓪*
- ⓪*(*txStatus:= ALAP.TransmitPacket (SHORT(n), BYTE($81), dataParam, 0);*)
- ⓪*WITH txFrame DO
- ⓪,ctrl.srcAddr:= ALAP.myAddress;
- ⓪,ctrl.dstAddr:= SHORT (n);
- ⓪,ctrl.lapType:= ALAP.lapENQ;
- ⓪,dataCnt1:= 0;
- ⓪,dataCnt2:= 0;
- ⓪*END;
- ⓪*ASSEMBLER
- ⓪,LEA txFrame,A0
- ⓪,JSR ALAP.TransmitPacket
- ⓪,MOVE D0,txStatus
- ⓪*END;
- ⓪*
- ⓪*IF txStatus = ALAP.dupAddress THEN
- ⓪,Write ('>'); WriteHex (n, 3); Write ('<'); WriteLn;
- ⓪*END;
- ⓪*ALAP.fAdrInUse:= FALSE;
- ⓪(END;
- ⓪(WriteLn;
- ⓪(WriteString ('OK.');
- ⓪(WriteLn;
- ⓪&ELSIF ch = ' ' THEN
- ⓪(WritePg;
- ⓪(rxIdx:= 0;
- ⓪(redraw:= TRUE
- ⓪&ELSIF ch = 'I' THEN
- ⓪(WriteString ('Address? ');
- ⓪(ReadCard (myaddr);
- ⓪(IF Done THEN
- ⓪*ASSEMBLER
- ⓪,MOVE myaddr,D0
- ⓪,JSR ALAP.Init
- ⓪*END
- ⓪(END
- ⓪&ELSIF ch = 'A' THEN
- ⓪(WriteString ('Dest-Address? ');
- ⓪(ReadCard (outaddr);
- ⓪&ELSIF ch = '0' THEN
- ⓪((*
- ⓪*Test-Modus.
- ⓪*sieht NUR mit Polling nach, ob Daten angekommen sind.
- ⓪(*)
- ⓪(rcvdDatas:= 0;
- ⓪(ASSEMBLER MOVE SR,-(A7) ORI.W #$0500,SR END;
- ⓪(LOOP
- ⓪*frameStatus:= ALAP.ReceiveFrame (packet);
- ⓪*IF frameStatus = ALAP.lapDATAframe THEN
- ⓪,(*
- ⓪.WriteHex (LONG(packet^.frame.srcAddr),3);
- ⓪,*)
- ⓪,IF packet^.frame.lapType = BYTE ($11) THEN EXIT END;
- ⓪,INC (rcvdDatas);
- ⓪*END;
- ⓪(END;
- ⓪(ASSEMBLER MOVE.W (A7)+,SR END;
- ⓪(WriteLn;
- ⓪(WriteCard (rcvdDatas,0); WriteString (' frames received');
- ⓪(Read (ch);
- ⓪&ELSIF ch = '1' THEN
- ⓪((*
- ⓪*Test-Modus.
- ⓪*sieht mit Polling nach, ob Daten angekommen sind.
- ⓪(*)
- ⓪(rcvdDatas:= 0;
- ⓪(LOOP
- ⓪*frameStatus:= ALAP.ReceiveFrame (packet);
- ⓪*IF frameStatus = ALAP.lapDATAframe THEN
- ⓪,IF packet^.frame.lapType = BYTE ($11) THEN EXIT END;
- ⓪,INC (rcvdDatas);
- ⓪,WriteHex (LONG(packet^.frame.srcAddr),3);
- ⓪*END;
- ⓪*IF KeyPressed() THEN EXIT END;
- ⓪(END;
- ⓪(WriteLn;
- ⓪(WriteCard (rcvdDatas,0); WriteString (' frames received');
- ⓪(Read (ch);
- ⓪&ELSIF ch = '2' THEN
- ⓪((*
- ⓪*Test-Modus.
- ⓪*sieht NUR im Interrupt nach, ob Daten angekommen sind.
- ⓪(*)
- ⓪(rcvdDatas:= 0;
- ⓪(LOOP
- ⓪*ASSEMBLER MOVE SR,-(A7) ORI.W #$0500,SR END;
- ⓪*WHILE ALAP.headPacket # ALAP.tailPacket DO
- ⓪,frameStatus:= ALAP.ReceiveFrame (packet);
- ⓪,IF frameStatus = ALAP.lapDATAframe THEN
- ⓪.IF packet^.frame.lapType = BYTE ($11) THEN
- ⓪0ASSEMBLER MOVE.W (A7)+,SR END;
- ⓪0EXIT
- ⓪.END;
- ⓪.INC (rcvdDatas);
- ⓪.WriteHex (LONG(packet^.frame.srcAddr),3);
- ⓪,END;
- ⓪*END;
- ⓪*ASSEMBLER MOVE.W (A7)+,SR END;
- ⓪*IF KeyPressed() THEN EXIT END;
- ⓪(END;
- ⓪(WriteLn;
- ⓪(WriteCard (rcvdDatas,0); WriteString (' frames received');
- ⓪(Read (ch);
- ⓪&ELSIF ch = '3' THEN
- ⓪((*
- ⓪*Test-Modus.
- ⓪*Jede Station sendet ununterbrochen;
- ⓪*sieht jedesmal nach, ob Daten angekommen sind.
- ⓪(*)
- ⓪(rcvdDatas:= 0;
- ⓪(sentDatas:= 0;
- ⓪(sendTrials:= 0;
- ⓪(WITH txFrame DO
- ⓪*ctrl.srcAddr:= ALAP.myAddress;
- ⓪*ctrl.dstAddr:= SHORT (outaddr);
- ⓪*ctrl.lapType:= BYTE ($10);
- ⓪*dataCnt1:= 1024;
- ⓪*dataPtr1:= ADR (dataParam);
- ⓪*dataCnt2:= 0;
- ⓪*dataParam[1]:= BYTE ($12);
- ⓪*dataParam[2]:= BYTE ($34);
- ⓪*dataParam[3]:= BYTE ($56);
- ⓪(END;
- ⓪(LOOP
- ⓪*ASSEMBLER LEA txFrame,A0 JSR ALAP.TransmitPacket MOVE D0,txStatus END;
- ⓪*INC (sendTrials);
- ⓪*IF ALAP.fAdrInUse THEN Write ('#'); ALAP.fAdrInUse:= FALSE; END;
- ⓪*CASE txStatus OF
- ⓪*| ALAP.transmitOK: Write ('.'); INC (sentDatas)
- ⓪*| ALAP.excessDefers: Write ('+')
- ⓪*| ALAP.excessCollsns: Write ('-')
- ⓪*| ALAP.dupAddress:
- ⓪*END;
- ⓪*ASSEMBLER MOVE SR,-(A7) ORI.W #$0500,SR END;
- ⓪*WHILE ALAP.headPacket # ALAP.tailPacket DO
- ⓪,frameStatus:= ALAP.ReceiveFrame (packet);
- ⓪,IF frameStatus = ALAP.lapDATAframe THEN
- ⓪.INC (rcvdDatas);
- ⓪.WriteHex (LONG(packet^.frame.srcAddr),3);
- ⓪.IF packet^.frame.lapType = BYTE ($11) THEN EXIT END;
- ⓪,END;
- ⓪*END;
- ⓪*ASSEMBLER MOVE.W (A7)+,SR END;
- ⓪*IF KeyPressed() THEN EXIT END;
- ⓪(END;
- ⓪(WriteLn;
- ⓪(WriteCard (sendTrials,0); WriteString (' frames tried to sent, ');
- ⓪(WriteCard (sentDatas,0); WriteString (' frames sent, ');
- ⓪(WriteCard (rcvdDatas,0); WriteString (' frames received');
- ⓪(Read (ch);
- ⓪&ELSIF ch = '4' THEN
- ⓪((*
- ⓪*Send Abort to all (Broadcast)
- ⓪(*)
- ⓪(WITH txFrame DO
- ⓪*ctrl.srcAddr:= ALAP.myAddress;
- ⓪*ctrl.dstAddr:= BYTE ($FF);
- ⓪*ctrl.lapType:= BYTE ($11);
- ⓪*dataCnt1:= 0;
- ⓪*dataCnt2:= 0;
- ⓪(END;
- ⓪(ASSEMBLER LEA txFrame,A0 JSR ALAP.TransmitPacket MOVE D0,txStatus END;
- ⓪&(*
- ⓪&ELSIF (ch >= '0') & (ch <= '9') OR (ch >= 'A') & (ch <= 'F') THEN
- ⓪(Write (10C); (* BS *)
- ⓪(n:= ORD (ch) - ORD ('0'); IF n > 9 THEN DEC (n, 7) END;
- ⓪(IF n IN WriteRegs THEN
- ⓪*WriteString ('Write Reg '); WriteNum (n, 16, 1, '0');
- ⓪*WriteString ('? ');
- ⓪*ReadCard (c);
- ⓪*IF Done & (c <= 255) THEN
- ⓪,SCC.SetReg (n, c);
- ⓪*ELSE
- ⓪,WriteString ('No write!'); WriteLn
- ⓪*END
- ⓪(END
- ⓪&*)
- ⓪&END;
- ⓪$END;
- ⓪"UNTIL quit;
- ⓪"ssp:= Super (ssp)
- ⓪ END LANMonitor.
- ⓪ ə
- (* $FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$00000FA1$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0Ç$000023E8T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$00002159$000023A9$000023E8$000023A9$000020DF$00001815$00001C1C$00001C09$00002600$00002ACE$FFF006F0$00000417$000003A2$00001F4E$00001FCE$00002198öüé*)
-