home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / LAN / LAN_V1 < prev    next >
Encoding:
Text File  |  1991-05-17  |  36.7 KB  |  3 lines

  1. ⓪ MODULE LANMonitor; (*$H+,Z+,R-*)
  2. ⓪ 
  3. ⓪ (*
  4. ⓪ IMPORT TOSDebug;
  5. ⓪ *)
  6. ⓪ 
  7. ⓪ IMPORT SYSTEM;
  8. ⓪ FROM SYSTEM IMPORT ASSEMBLER, BYTE;
  9. ⓪ 
  10. ⓪ IMPORT MOSGlobals, PrgCtrl;
  11. ⓪ IMPORT RandomGen;
  12. ⓪ 
  13. ⓪ IMPORT TOSIO; (*$E MOS *)
  14. ⓪ IMPORT InOut, FuncStrings, StrConv;
  15. ⓪ FROM InOut IMPORT WriteLn, Write, WriteCard, ReadCard, ReadLCard, Read,
  16. ⓪0GotoXY, WritePg, WriteString, WriteHex, WriteLHex,
  17. ⓪0KeyPressed, Done, WriteNum, WriteLNum;
  18. ⓪ 
  19. ⓪ FROM GEMDOS IMPORT Super;
  20. ⓪ IMPORT VT52; FROM VT52 IMPORT Codes;
  21. ⓪ IMPORT XBIOS;
  22. ⓪ FROM Storage IMPORT ALLOCATE;
  23. ⓪ 
  24. ⓪ 
  25. ⓪ (*****************************************************************************)
  26. ⓪ 
  27. ⓪ MODULE TimerA;
  28. ⓪ (*$L-*)
  29. ⓪ 
  30. ⓪ (*
  31. ⓪!* Der MFP ist mit 2.4576 MHz getaktet.
  32. ⓪!*)
  33. ⓪ 
  34. ⓪ FROM SYSTEM IMPORT ASSEMBLER;
  35. ⓪ 
  36. ⓪ EXPORT QUALIFIED Init, Delay1Bit, Delay1Byte,
  37. ⓪(DelayµsUntil, DelayBytesUntil, StopProc;
  38. ⓪ 
  39. ⓪ TYPE    StopProc = PROCEDURE  (): BOOLEAN;
  40. ⓪ 
  41. ⓪ PROCEDURE Delay1Bit;
  42. ⓪"BEGIN
  43. ⓪$ASSEMBLER
  44. ⓪(; Delay: 1.5 * bitTime (6.51µs) = 16 Zyklen
  45. ⓪(MOVEA.W #$FA00,A0
  46. ⓪(MOVE.B  #$DF,$0B(A0)    ; IPRA: Clear Timer-A Pending Bit
  47. ⓪(MOVE.B  #4,$1F(A0)      ; TADR: Set Timer Count
  48. ⓪(MOVE.B  #1,$19(A0)      ; TACR: Timer Start (Teiler: 1/4)
  49. ⓪%l: BTST    #5,$0B(A0)      ; IPRA
  50. ⓪(BEQ     l
  51. ⓪(MOVE.B  #$00,$19(A0)    ; TACR: Timer Stop
  52. ⓪$END
  53. ⓪"END Delay1Bit;
  54. ⓪ 
  55. ⓪ PROCEDURE Delay1Byte;
  56. ⓪"BEGIN
  57. ⓪$ASSEMBLER
  58. ⓪(; Delay: 1.5 * byteTime (39µs) = 58 Zyklen
  59. ⓪(MOVEA.W #$FA00,A0
  60. ⓪(MOVE.B  #$DF,$0B(A0)    ; IPRA: Clear Timer-A Pending Bit
  61. ⓪(MOVE.B  #35,$1F(A0)     ; TADR: Set Timer Count
  62. ⓪(MOVE.B  #1,$19(A0)      ; TACR: Timer Start (Teiler: 1/4)
  63. ⓪%l: BTST    #5,$0B(A0)      ; IPRA
  64. ⓪(BEQ     l
  65. ⓪(MOVE.B  #$00,$19(A0)    ; TACR: Timer Stop
  66. ⓪$END
  67. ⓪"END Delay1Byte;
  68. ⓪ 
  69. ⓪ PROCEDURE DelayBytesUntil (n: CARDINAL; stop: StopProc; condition: BOOLEAN): BOOLEAN;
  70. ⓪"BEGIN
  71. ⓪$ASSEMBLER
  72. ⓪(; Delay: n * 1.5 * byteTime (39µs) = n * 58.5 Zyklen
  73. ⓪(; RETURN: FALSE, wenn Zeit abgelaufen,
  74. ⓪(;         TRUE, wenn stop()=condition lieferte
  75. ⓪(MOVEM.L D3-D5/A4/A6,-(A7)
  76. ⓪(MOVE.W  -(A3),D5        ; condition
  77. ⓪(MOVE.L  -(A3),D4        ; stop (static link)
  78. ⓪(MOVE.L  -(A3),A4        ; stop (addr)
  79. ⓪(MOVE.W  -(A3),D3        ; n
  80. ⓪(MOVEA.W #$FA00,A6
  81. ⓪(MOVE.B  #$DF,$0B(A6)    ; IPRA: Clear Timer-A Pending Bit
  82. ⓪(MOVE.B  #36,$1F(A6)     ; TADR: Set Timer Count
  83. ⓪(MOVE.B  #1,$19(A6)      ; TACR: Timer Start (Teiler: 1/4)
  84. ⓪(BRA     c
  85. ⓪%l: BTST    #5,$0B(A6)      ; IPRA
  86. ⓪(BNE     g
  87. ⓪(MOVE.L  D4,D2
  88. ⓪(JSR     (A4)
  89. ⓪(CMP.W   D0,D5
  90. ⓪(BNE     l
  91. ⓪(MOVEQ   #1,D0
  92. ⓪(BRA     e
  93. ⓪%g: MOVE.B  #$DF,$0B(A6)    ; IPRA: Clear Timer-A Pending Bit
  94. ⓪%c: DBRA    D3,l
  95. ⓪(MOVEQ   #0,D0
  96. ⓪%e: MOVE.B  #$00,$19(A6)    ; TACR: Timer Stop
  97. ⓪(MOVEM.L (A7)+,D3-D5/A4/A6
  98. ⓪$END
  99. ⓪"END DelayBytesUntil;
  100. ⓪ 
  101. ⓪ PROCEDURE DelayµsUntil (n: CARDINAL; stop: StopProc; condition: BOOLEAN): BOOLEAN;
  102. ⓪"BEGIN
  103. ⓪$ASSEMBLER
  104. ⓪(; Delay: n µs
  105. ⓪(; RETURN: FALSE, wenn Zeit abgelaufen,
  106. ⓪(;         TRUE, wenn stop()=condition lieferte
  107. ⓪(MOVEM.L D4-D5/A4/A6,-(A7)
  108. ⓪(MOVE.W  -(A3),D5        ; condition
  109. ⓪(MOVE.L  -(A3),D4        ; stop (static link)
  110. ⓪(MOVE.L  -(A3),A4        ; stop (addr)
  111. ⓪(MOVE.W  -(A3),D0        ; n
  112. ⓪(LSR     #2,D0           ; n DIV 4
  113. ⓪(MOVEA.W #$FA00,A6
  114. ⓪(MOVE.B  #$DF,$0B(A6)    ; IPRA: Clear Timer-A Pending Bit
  115. ⓪(MOVE.B  D0,$1F(A6)      ; TADR: Set Timer Count
  116. ⓪(MOVE.B  #2,$19(A6)      ; TACR: Timer Start (Teiler: 1/10)
  117. ⓪%l: MOVE.L  D4,D2
  118. ⓪(JSR     (A4)
  119. ⓪(CMP.W   D0,D5
  120. ⓪(BEQ     t
  121. ⓪(BTST    #5,$0B(A6)      ; IPRA
  122. ⓪(BEQ     l
  123. ⓪(MOVEQ   #0,D0
  124. ⓪(BRA     e
  125. ⓪%t: MOVEQ   #1,D0
  126. ⓪%e: MOVE.B  #$00,$19(A6)    ; TACR: Timer Stop
  127. ⓪(MOVEM.L (A7)+,D4-D5/A4/A6
  128. ⓪$END
  129. ⓪"END DelayµsUntil;
  130. ⓪ 
  131. ⓪ PROCEDURE Delay (teiler, count: CARDINAL);
  132. ⓪"BEGIN
  133. ⓪$ASSEMBLER
  134. ⓪(MOVEA.W #$FA00,A0
  135. ⓪(MOVE.B  #$DF,$0B(A0)    ; IPRA: Clear Timer-A Pending Bit
  136. ⓪(MOVE.W  -(A3),D0
  137. ⓪(MOVE.W  -(A3),D1
  138. ⓪(MOVE.B  D0,$1F(A0)      ; TADR: Set Timer Count
  139. ⓪(MOVE.B  D1,$19(A0)      ; TACR: Timer Start
  140. ⓪%l: BTST    #5,$0B(A0)      ; IPRA
  141. ⓪(BEQ     l
  142. ⓪(MOVE.B  #$00,$19(A0)    ; TACR: Timer Stop
  143. ⓪$END
  144. ⓪"END Delay;
  145. ⓪ 
  146. ⓪ PROCEDURE Start (teiler, count: CARDINAL);
  147. ⓪"BEGIN
  148. ⓪$ASSEMBLER
  149. ⓪(MOVEA.W #$FA00,A0
  150. ⓪(MOVE.B  #$DF,$0B(A0)    ; IPRA: Clear Timer-A Pending Bit
  151. ⓪(MOVE.W  -(A3),D0
  152. ⓪(MOVE.W  -(A3),D1
  153. ⓪(MOVE.B  D0,$1F(A0)      ; TADR: Set Timer Count
  154. ⓪(MOVE.B  D1,$19(A0)      ; TACR: Timer Start
  155. ⓪%l: END
  156. ⓪"END Start;
  157. ⓪ 
  158. ⓪ PROCEDURE Stop;
  159. ⓪"BEGIN
  160. ⓪$ASSEMBLER
  161. ⓪(MOVE.B  #$00,$FFFA19    ; TACR: Timer Stop
  162. ⓪$END
  163. ⓪"END Stop;
  164. ⓪ 
  165. ⓪ PROCEDURE Down (): BOOLEAN;
  166. ⓪"BEGIN
  167. ⓪$ASSEMBLER
  168. ⓪(BTST    #5,$FFFA0B      ; IPRA
  169. ⓪(BEQ     no
  170. ⓪(BCLR    #5,$FFFA0B      ; IPRA: Clear Timer-A Pending Bit
  171. ⓪(MOVEQ   #1,D0
  172. ⓪(RTS
  173. ⓪$no: CLR     D0
  174. ⓪$END
  175. ⓪"END Down;
  176. ⓪ 
  177. ⓪ (* nur mit dieser optimierten Schleife sind auf dem Mega STE die
  178. ⓪!* 1.5*bitTime zu messen:
  179. ⓪"Start (1,4);
  180. ⓪"ASSEMBLER
  181. ⓪(MOVE.L  n,D1
  182. ⓪(MOVE.L  l,D0
  183. ⓪(MOVEQ   #5,D2
  184. ⓪(LEA     $FFFA0B,A0
  185. ⓪$lo: BTST    D2,(A0)         ; IPRA
  186. ⓪(BEQ     lo
  187. ⓪(BCLR    D2,(A0)         ; IPRA: Clear Timer-A Pending Bit
  188. ⓪(ADDQ.L  #1,D1
  189. ⓪(CMP.L   hz200,D0
  190. ⓪(BHI     lo
  191. ⓪(MOVE.L  D1,n
  192. ⓪"END;
  193. ⓪ *)
  194. ⓪ 
  195. ⓪ PROCEDURE Init;
  196. ⓪"BEGIN
  197. ⓪$ASSEMBLER
  198. ⓪(MOVEA.W #$FA00,A0
  199. ⓪(MOVE.B  #$00,$19(A0)    ; TACR: Timer Stop
  200. ⓪(ANDI.B  #$DF,$13(A0)    ; IMRA: Mask Timer A IR
  201. ⓪(ORI.B   #$20,$07(A0)    ; IERA: Enable Timer-A Pending Bit
  202. ⓪(MOVE.B  #$DF,$0B(A0)    ; IPRA: Clear Timer-A Pending Bit
  203. ⓪$END
  204. ⓪"END Init;
  205. ⓪ 
  206. ⓪ (*$L=*)
  207. ⓪ END (* MODULE *) TimerA;
  208. ⓪ 
  209. ⓪ (*****************************************************************************)
  210. ⓪ 
  211. ⓪ MODULE SCCDMA;
  212. ⓪ (*$L-*)
  213. ⓪ 
  214. ⓪ FROM SYSTEM IMPORT WORD, ADDRESS, ASSEMBLER;
  215. ⓪ 
  216. ⓪ EXPORT QUALIFIED SetAddr, Addr, SetCount, Count, SetIn, SetOut, Enable,
  217. ⓪1Finished;
  218. ⓪ 
  219. ⓪ CONST DMA = $FFFF8C00;
  220. ⓪ 
  221. ⓪ PROCEDURE SetAddr (ad: ADDRESS);
  222. ⓪"BEGIN
  223. ⓪$ASSEMBLER
  224. ⓪(MOVE.L  -(A3),D0
  225. ⓪(MOVE.W  #DMA,A0
  226. ⓪(MOVEP.L D0,1(A0)
  227. ⓪$END
  228. ⓪"END SetAddr;
  229. ⓪ 
  230. ⓪ PROCEDURE Addr (): ADDRESS;
  231. ⓪"BEGIN
  232. ⓪$ASSEMBLER
  233. ⓪(MOVE.W  #DMA,A0
  234. ⓪(MOVEP.L 1(A0),D0
  235. ⓪$END
  236. ⓪"END Addr;
  237. ⓪ 
  238. ⓪ PROCEDURE SetCount (n: LONGCARD);
  239. ⓪"BEGIN
  240. ⓪$ASSEMBLER
  241. ⓪(MOVE.L  -(A3),D0
  242. ⓪(MOVE.W  #DMA,A0
  243. ⓪(MOVEP.L D0,9(A0)
  244. ⓪$END
  245. ⓪"END SetCount;
  246. ⓪ 
  247. ⓪ PROCEDURE Count (): LONGCARD;
  248. ⓪"BEGIN
  249. ⓪$ASSEMBLER
  250. ⓪(MOVE.W  #DMA,A0
  251. ⓪(MOVEP.L 9(A0),D0
  252. ⓪$END
  253. ⓪"END Count;
  254. ⓪ 
  255. ⓪ PROCEDURE SetControl (n: WORD);
  256. ⓪"BEGIN
  257. ⓪$ASSEMBLER
  258. ⓪(MOVE.W  -(A3),D0
  259. ⓪(MOVE.B  D0,DMA+$15
  260. ⓪$END
  261. ⓪"END SetControl;
  262. ⓪ 
  263. ⓪ PROCEDURE Control (): WORD;
  264. ⓪"BEGIN
  265. ⓪$ASSEMBLER
  266. ⓪(MOVEQ   #0,D0
  267. ⓪(MOVE.B  DMA+$15,D0
  268. ⓪$END
  269. ⓪"END Control;
  270. ⓪ 
  271. ⓪ PROCEDURE SetOut;
  272. ⓪"BEGIN
  273. ⓪$ASSEMBLER
  274. ⓪(BSET    #0,DMA+$15
  275. ⓪$END
  276. ⓪"END SetOut;
  277. ⓪ 
  278. ⓪ PROCEDURE SetIn;
  279. ⓪"BEGIN
  280. ⓪$ASSEMBLER
  281. ⓪(BCLR    #0,DMA+$15
  282. ⓪$END
  283. ⓪"END SetIn;
  284. ⓪ 
  285. ⓪ PROCEDURE Enable;
  286. ⓪"BEGIN
  287. ⓪$ASSEMBLER
  288. ⓪(BSET    #1,DMA+$15
  289. ⓪$END
  290. ⓪"END Enable;
  291. ⓪ 
  292. ⓪ PROCEDURE Disable;
  293. ⓪"BEGIN
  294. ⓪$ASSEMBLER
  295. ⓪(BCLR    #1,DMA+$15
  296. ⓪$END
  297. ⓪"END Disable;
  298. ⓪ 
  299. ⓪ PROCEDURE Finished (): BOOLEAN;
  300. ⓪"BEGIN
  301. ⓪$ASSEMBLER
  302. ⓪(MOVE.B  DMA+$15,D0
  303. ⓪(ANDI.W  #11000000%,D0   ; bus error oder zero count?
  304. ⓪(SNE     D0
  305. ⓪(ANDI.W  #1,D0
  306. ⓪$END
  307. ⓪"END Finished;
  308. ⓪ 
  309. ⓪ (*$L=*)
  310. ⓪ END (* MODULE *) SCCDMA;
  311. ⓪ 
  312. ⓪ (*****************************************************************************)
  313. ⓪ 
  314. ⓪ MODULE SCC;
  315. ⓪ (*$L-*)
  316. ⓪ 
  317. ⓪ FROM SYSTEM IMPORT WORD, ADDRESS, ASSEMBLER;
  318. ⓪ 
  319. ⓪ IMPORT Super;
  320. ⓪ FROM PrgCtrl IMPORT TermCarrier, CatchProcessTerm;
  321. ⓪ FROM MOSGlobals IMPORT MemArea;
  322. ⓪ 
  323. ⓪ EXPORT QUALIFIED Reg, SetReg, Reset, CTLA;
  324. ⓪ 
  325. ⓪ CONST CTLA = $FFFF8C81;
  326. ⓪ 
  327. ⓪ PROCEDURE Reg (n: CARDINAL): CARDINAL;
  328. ⓪"BEGIN
  329. ⓪$ASSEMBLER
  330. ⓪(MOVE    SR,-(A7)
  331. ⓪(MOVE    #$2500,SR
  332. ⓪(MOVEA.W #CTLA,A1
  333. ⓪(MOVE.W  -(A3),D0
  334. ⓪(BEQ     read0
  335. ⓪(MOVE.B  D0,(A1)          ; SCC A control
  336. ⓪&read0:
  337. ⓪(MOVE.B  (A1),D0
  338. ⓪(MOVE    (A7)+,SR
  339. ⓪$END;
  340. ⓪"END Reg;
  341. ⓪ 
  342. ⓪ PROCEDURE SetReg (no, value: CARDINAL);
  343. ⓪"BEGIN
  344. ⓪$ASSEMBLER
  345. ⓪(MOVE    SR,-(A7)
  346. ⓪(MOVE    #$2500,SR
  347. ⓪(MOVEA.W #CTLA,A1
  348. ⓪(MOVE.W  -(A3),D1        ; value
  349. ⓪(MOVE.W  -(A3),D0        ; no
  350. ⓪(BEQ     write0
  351. ⓪(MOVE.B  D0,(A1)         ; SCC A control
  352. ⓪&write0:
  353. ⓪(MOVE.B  D1,(A1)
  354. ⓪(MOVE    (A7)+,SR
  355. ⓪$END;
  356. ⓪"END SetReg;
  357. ⓪ 
  358. ⓪ (*$L=*)
  359. ⓪ 
  360. ⓪ (****** Vorsicht: ab hier $L+ ******)
  361. ⓪ 
  362. ⓪ PROCEDURE Reset;
  363. ⓪"BEGIN
  364. ⓪$SetReg (9, $C0);
  365. ⓪"END Reset;
  366. ⓪ 
  367. ⓪ PROCEDURE term;
  368. ⓪"VAR ssp: LONGCARD;
  369. ⓪"BEGIN
  370. ⓪$ssp:= Super (0);
  371. ⓪$SetReg (9, $C0);
  372. ⓪$ssp:= Super (ssp)
  373. ⓪"END term;
  374. ⓪ 
  375. ⓪ VAR carrier: TermCarrier;
  376. ⓪ 
  377. ⓪ BEGIN
  378. ⓪"CatchProcessTerm (carrier, term, MemArea{NIL,0});
  379. ⓪ END (* MODULE *) SCC;
  380. ⓪ 
  381. ⓪ (*****************************************************************************)
  382. ⓪ 
  383. ⓪ MODULE ALAP;
  384. ⓪ 
  385. ⓪ FROM SYSTEM IMPORT ADR, ASSEMBLER, BITNUM, BYTE, WORD, LONGWORD, ADDRESS, SHIFT;
  386. ⓪ IMPORT SCC, SCCDMA, TimerA;
  387. ⓪ FROM SCC IMPORT CTLA;
  388. ⓪ IMPORT RandomGen;
  389. ⓪ FROM XBIOS IMPORT GIOffBit;
  390. ⓪ IMPORT Super, ALLOCATE;
  391. ⓪ 
  392. ⓪ (* I/O-Routinen für Testausgaben *)
  393. ⓪ IMPORT InOut;
  394. ⓪ FROM FuncStrings IMPORT ConcStr;
  395. ⓪ FROM StrConv IMPORT CardToStr;
  396. ⓪ 
  397. ⓪ EXPORT QUALIFIED
  398. ⓪"WriteFrame, WriteStatus,
  399. ⓪"Init, TransmitStatus, TransmitPacket, ReceiveFrame, ReceivePacket,
  400. ⓪"myAddress, fAdrValid, fAdrInUse, FramesReceived, Interrupts,
  401. ⓪"maxIFGtime, test, NewPacketBuffer, FrameStatus, anAddress, aLAPtype,
  402. ⓪"aDataField,
  403. ⓪"aFrame, aPacket, ptrPacket, maxDataSize, headPacket, tailPacket;
  404. ⓪ 
  405. ⓪ 
  406. ⓪ CONST   minFrameSize = 3;
  407. ⓪(maxFrameSize = 605;
  408. ⓪(maxDataSize = 600;
  409. ⓪(
  410. ⓪((* alle Zeitwerte sind in µs angegeben *)
  411. ⓪(bitTime = 5 (* 4.34 *);
  412. ⓪(byteTime = 39;
  413. ⓪(minIDGtime = 400;
  414. ⓪(IDGslottime = 100;
  415. ⓪(maxIFGtime = 200; (* ist für ENQ->ACK offenbar zu klein. 400-600 besser *)
  416. ⓪(
  417. ⓪(maxDefers = 32;
  418. ⓪(maxCollsns = 32;
  419. ⓪(lapENQ = BYTE($81);
  420. ⓪(lapACK = BYTE($82);
  421. ⓪(lapRTS = BYTE($84);
  422. ⓪(lapCTS = BYTE($85);
  423. ⓪(wksTries = 2 (* 20!! *);
  424. ⓪(
  425. ⓪(rxEnable = $DD;
  426. ⓪(setRTS   = $62;
  427. ⓪(txEnable = $6B;
  428. ⓪ 
  429. ⓪ TYPE    TransmitStatus = (transmitOK, excessDefers, excessCollsns, dupAddress);
  430. ⓪(ReceiveStatus = (receiveOK, receiving, nullReceive, frameError);
  431. ⓪(FrameStatus = (noFrame, lapDATAframe, lapENQframe, lapACKframe,
  432. ⓪(lapRTSframe, lapCTSframe, badframeCRC, badframeSize, badframeType,
  433. ⓪(overrunError, underrunError, undefined);
  434. ⓪(
  435. ⓪(bitVector = SET OF BITNUM[0..7];
  436. ⓪(octet = BYTE;
  437. ⓪(anAddress = octet;
  438. ⓪(aLAPtype = octet;
  439. ⓪(aDataField = ARRAY [1..maxDataSize] OF octet;
  440. ⓪(ptrDataField = POINTER TO aDataField;
  441. ⓪ 
  442. ⓪(frameInterpretation = (raw, structured);
  443. ⓪(aFrame = RECORD
  444. ⓪3CASE :frameInterpretation OF
  445. ⓪5raw:
  446. ⓪7rawData: ARRAY [1..maxFrameSize] OF octet|
  447. ⓪5structured:
  448. ⓪7dstAddr: anAddress;
  449. ⓪7srcAddr: anAddress;
  450. ⓪7lapType: aLAPtype;
  451. ⓪7dataField: aDataField
  452. ⓪3END
  453. ⓪1END;
  454. ⓪ 
  455. ⓪(ptrPacket = POINTER TO aPacket;
  456. ⓪(aPacket = RECORD
  457. ⓪4status: FrameStatus;
  458. ⓪4length: [0..maxFrameSize];
  459. ⓪4next  : ptrPacket;
  460. ⓪4frame : aFrame;
  461. ⓪4no    : CARDINAL;
  462. ⓪2END;
  463. ⓪ 
  464. ⓪ VAR     myAddress: anAddress;
  465. ⓪(backoff: INTEGER;
  466. ⓪(fAdrValid: BOOLEAN;
  467. ⓪(fAdrInUse: BOOLEAN;
  468. ⓪(fCTSexpected: BOOLEAN;
  469. ⓪(deferCount, collsnCount: INTEGER;
  470. ⓪(deferHistory, collsnHistory: bitVector;
  471. ⓪(outgoingLength: INTEGER;
  472. ⓪(outgoingPacket: aFrame;
  473. ⓪(
  474. ⓪(packetBuffers: CARDINAL;
  475. ⓪(tailPacket: ptrPacket;  (* zeigt aufs älteste gültige Paket *)
  476. ⓪(headPacket: ptrPacket;  (* zeigt hinter jüngstes Paket *)
  477. ⓪((* wenn head = tail, stehen keine neuen Pakete an. *)
  478. ⓪(
  479. ⓪(FramesReceived, Interrupts: CARDINAL;
  480. ⓪(
  481. ⓪(test: BOOLEAN;
  482. ⓪(
  483. ⓪(IR_Vector [$360]: PROC;
  484. ⓪ 
  485. ⓪ (*$L-*)
  486. ⓪ 
  487. ⓪ PROCEDURE And (a,b:CARDINAL): CARDINAL;
  488. ⓪"BEGIN
  489. ⓪$ASSEMBLER
  490. ⓪(MOVE.W  -(A3),D0
  491. ⓪(AND.W   -(A3),D0
  492. ⓪$END
  493. ⓪"END And;
  494. ⓪ 
  495. ⓪ PROCEDURE Or (a,b:CARDINAL): CARDINAL;
  496. ⓪"BEGIN
  497. ⓪$ASSEMBLER
  498. ⓪(MOVE.W  -(A3),D0
  499. ⓪(OR.W    -(A3),D0
  500. ⓪$END
  501. ⓪"END Or;
  502. ⓪ 
  503. ⓪ PROCEDURE BClr (value, bitno:CARDINAL): CARDINAL;
  504. ⓪"BEGIN
  505. ⓪$ASSEMBLER
  506. ⓪(MOVE.W  -(A3),D1
  507. ⓪(MOVE.W  -(A3),D0
  508. ⓪(BCLR    D1,D0
  509. ⓪$END
  510. ⓪"END BClr;
  511. ⓪ 
  512. ⓪ PROCEDURE BSet (value, bitno:CARDINAL): CARDINAL;
  513. ⓪"BEGIN
  514. ⓪$ASSEMBLER
  515. ⓪(MOVE.W  -(A3),D1
  516. ⓪(MOVE.W  -(A3),D0
  517. ⓪(BSET    D1,D0
  518. ⓪$END
  519. ⓪"END BSet;
  520. ⓪ 
  521. ⓪ PROCEDURE In (bitno, value: CARDINAL): BOOLEAN;
  522. ⓪"BEGIN
  523. ⓪$ASSEMBLER
  524. ⓪(MOVE.W  -(A3),D0
  525. ⓪(MOVE.W  -(A3),D1
  526. ⓪(BTST    D1,D0
  527. ⓪(SNE     D0
  528. ⓪(ANDI    #1,D0
  529. ⓪$END
  530. ⓪"END In;
  531. ⓪ 
  532. ⓪ PROCEDURE BitCount (bits: BYTE): INTEGER;
  533. ⓪"BEGIN
  534. ⓪$ASSEMBLER
  535. ⓪(SUBQ.L  #1,A3
  536. ⓪(MOVE.B  -(A3),D1
  537. ⓪(MOVEQ   #0,D0
  538. ⓪(MOVEQ   #7,D2
  539. ⓪%l: LSR.B   #1,D1
  540. ⓪(BCC     c
  541. ⓪(ADDQ    #1,D0
  542. ⓪%c: DBRA    D2,l
  543. ⓪$END
  544. ⓪"END BitCount;
  545. ⓪ 
  546. ⓪ (*$L+*)
  547. ⓪ 
  548. ⓪ (* ------------- Beginn Low-Level ------------------- *)
  549. ⓪ 
  550. ⓪ PROCEDURE carrierSense (): BOOLEAN;
  551. ⓪"(*$L-*)
  552. ⓪"BEGIN
  553. ⓪$(* RETURN NOT (4 IN BITSET(SCC.Reg(0))) *)
  554. ⓪$ASSEMBLER
  555. ⓪(BTST    #4,CTLA
  556. ⓪(SEQ     D0
  557. ⓪(ANDI    #1,D0
  558. ⓪$END
  559. ⓪"END carrierSense;
  560. ⓪"(*$L=*)
  561. ⓪ 
  562. ⓪ PROCEDURE missingClock (): BOOLEAN;
  563. ⓪"(*$L-*)
  564. ⓪"BEGIN
  565. ⓪$(* RETURN (7 IN BITSET(SCC.Reg(10))) *)
  566. ⓪$ASSEMBLER
  567. ⓪(MOVEA.W #CTLA,A1
  568. ⓪(MOVE.B  #10,(A1)
  569. ⓪(TST.B   (A1)            ; RR10
  570. ⓪(SMI     D0
  571. ⓪(ANDI    #1,D0
  572. ⓪$END
  573. ⓪"END missingClock;
  574. ⓪"(*$L=*)
  575. ⓪ 
  576. ⓪ PROCEDURE resetError;
  577. ⓪"BEGIN
  578. ⓪$SCC.SetReg (0, $30)
  579. ⓪"END resetError;
  580. ⓪ 
  581. ⓪ PROCEDURE setAddress (n: BYTE);
  582. ⓪"BEGIN
  583. ⓪$SCC.SetReg(6, ORD(n))
  584. ⓪"END setAddress;
  585. ⓪ 
  586. ⓪ PROCEDURE enableRx;
  587. ⓪"BEGIN
  588. ⓪$SCC.SetReg(3, rxEnable)
  589. ⓪"END enableRx;
  590. ⓪ 
  591. ⓪ PROCEDURE resetRx;
  592. ⓪"BEGIN
  593. ⓪$ASSEMBLER
  594. ⓪(MOVEA.W #CTLA,A1
  595. ⓪(; resetRx
  596. ⓪(MOVE.B  #3,(A1)
  597. ⓪(MOVE.B  #$D0,(A1)       ; disableRx
  598. ⓪(MOVEQ   #2,D0
  599. ⓪&flushFIFO:
  600. ⓪(TST.B   2(A1)
  601. ⓪(DBRA    D0,flushFIFO
  602. ⓪(
  603. ⓪(MOVE.B  #3,(A1)
  604. ⓪(MOVE.B  #rxEnable,(A1)  ; enableRx
  605. ⓪(; reset error
  606. ⓪(MOVE.B  #$30,(A1)
  607. ⓪(
  608. ⓪(; MOVE.B  #1,(A1)
  609. ⓪(; MOVE.B  #$08,(A1)         ; enable IR on first Rx
  610. ⓪(
  611. ⓪(; MOVE.B  #$20,(A1)         ; enable IR on next Rx
  612. ⓪$END
  613. ⓪"END resetRx;
  614. ⓪ 
  615. ⓪ PROCEDURE resetMissingClock ();
  616. ⓪"BEGIN
  617. ⓪$SCC.SetReg(14, $41);
  618. ⓪"END resetMissingClock;
  619. ⓪ 
  620. ⓪ (* ------------- Ende Low-Level ------------------- *)
  621. ⓪ 
  622. ⓪ PROCEDURE min (a,b: INTEGER): INTEGER;
  623. ⓪"BEGIN
  624. ⓪$IF a < b THEN RETURN a ELSE RETURN b END
  625. ⓪"END min;
  626. ⓪ 
  627. ⓪ PROCEDURE max (a,b: INTEGER): INTEGER;
  628. ⓪"BEGIN
  629. ⓪$IF a > b THEN RETURN a ELSE RETURN b END
  630. ⓪"END max;
  631. ⓪ 
  632. ⓪ PROCEDURE random (maxMin1: INTEGER): INTEGER;
  633. ⓪"BEGIN
  634. ⓪$RETURN RandomGen.RandomCard (0, maxMin1-1)
  635. ⓪"END random;
  636. ⓪ 
  637. ⓪ PROCEDURE Wr (REF s: ARRAY OF CHAR);
  638. ⓪"BEGIN
  639. ⓪$InOut.WriteString (s);
  640. ⓪$InOut.WriteLn;
  641. ⓪"END Wr;
  642. ⓪ 
  643. ⓪ PROCEDURE WriteFrame (REF packet: aPacket; no: CARDINAL);
  644. ⓪"VAR n: CARDINAL;
  645. ⓪"BEGIN
  646. ⓪$FOR n:= 1 TO 5 DO
  647. ⓪&IF n > packet.length THEN
  648. ⓪(InOut.WriteString ('   ');
  649. ⓪&ELSE
  650. ⓪(InOut.WriteHex (LONG (packet.frame.rawData [n]), 3);
  651. ⓪&END
  652. ⓪$END;
  653. ⓪$FOR n:= 6 TO no DO
  654. ⓪&IF n <= packet.length THEN
  655. ⓪(InOut.WriteHex (LONG (packet.frame.rawData [n]), 3);
  656. ⓪(IF (ORD (packet.frame.rawData [n]) >= 32) AND
  657. ⓪+(ORD (packet.frame.rawData [n]) < 128) THEN
  658. ⓪*InOut.Write ('/');
  659. ⓪*InOut.Write (CHAR(packet.frame.rawData [n]));
  660. ⓪(END
  661. ⓪&END
  662. ⓪$END;
  663. ⓪$InOut.WriteString (' ');
  664. ⓪"END WriteFrame;
  665. ⓪ 
  666. ⓪ PROCEDURE WriteStatus (status: FrameStatus);
  667. ⓪"BEGIN
  668. ⓪$CASE status OF
  669. ⓪&|badframeCRC: InOut.WriteString ('>badframeCRC<')
  670. ⓪&|badframeSize: InOut.WriteString ('>badframeSize<');
  671. ⓪&|badframeType: InOut.WriteString ('>badframeType<')
  672. ⓪&|overrunError: InOut.WriteString ('>overrunError<')
  673. ⓪&|underrunError: InOut.WriteString ('>underrunError<')
  674. ⓪&|lapACKframe: InOut.WriteString ('>ACKframe<')
  675. ⓪&|lapENQframe: InOut.WriteString ('>ENQframe<');
  676. ⓪&|lapRTSframe: InOut.WriteString ('>RTSframe<');
  677. ⓪&|lapDATAframe: InOut.WriteString ('>DATAframe<');
  678. ⓪&|noFrame: InOut.WriteString ('no frame!');
  679. ⓪$ELSE
  680. ⓪&InOut.WriteString ('unknown frame!');
  681. ⓪$END;
  682. ⓪"END WriteStatus;
  683. ⓪ 
  684. ⓪ (* --------------------------- *)
  685. ⓪ 
  686. ⓪ FORWARD AcquireAddress (hint: BYTE; server: BOOLEAN);
  687. ⓪ FORWARD TransmitPacket (dstParam: anAddress; typeParam: aLAPtype; REF dataParam: aDataField; dataLength: INTEGER): TransmitStatus;
  688. ⓪ FORWARD TransmitLinkMgmt (): TransmitStatus;
  689. ⓪ FORWARD TransmitFrame (REF frame: aFrame; framesize: CARDINAL);
  690. ⓪ FORWARD ReceiveFrame (VAR packet: ptrPacket): FrameStatus;
  691. ⓪ FORWARD ReceiveLinkMgmt (VAR packet: ptrPacket): ReceiveStatus;
  692. ⓪ FORWARD IR_Handler;
  693. ⓪ FORWARD GetFrame;
  694. ⓪ 
  695. ⓪ PROCEDURE NewPacketBuffer;
  696. ⓪"VAR p, prev, last: ptrPacket; sr: CARDINAL;
  697. ⓪"BEGIN
  698. ⓪$ASSEMBLER
  699. ⓪(MOVE    SR,sr(A6)
  700. ⓪(MOVE    #$2500,SR
  701. ⓪$END;
  702. ⓪$NEW (p);
  703. ⓪$IF p # NIL THEN
  704. ⓪&IF packetBuffers = 0 THEN
  705. ⓪(headPacket:= p;
  706. ⓪(tailPacket:= p;
  707. ⓪(last:= p
  708. ⓪&ELSE
  709. ⓪(prev:= headPacket;
  710. ⓪(WHILE prev^.next # tailPacket DO
  711. ⓪*prev:= prev^.next
  712. ⓪(END;
  713. ⓪(last:= prev^.next;
  714. ⓪(prev^.next:= p
  715. ⓪&END;
  716. ⓪&INC (packetBuffers);
  717. ⓪&WITH p^ DO
  718. ⓪(next:= last;
  719. ⓪(status:= undefined;
  720. ⓪(no:= packetBuffers
  721. ⓪&END;
  722. ⓪$END;
  723. ⓪$ASSEMBLER
  724. ⓪(MOVE    sr(A6),SR
  725. ⓪$END;
  726. ⓪"END NewPacketBuffer;
  727. ⓪ 
  728. ⓪ PROCEDURE ResetReceiveBuffer;
  729. ⓪"BEGIN
  730. ⓪$tailPacket:= headPacket
  731. ⓪"END ResetReceiveBuffer;
  732. ⓪ 
  733. ⓪ PROCEDURE Init (hint: BYTE; server: BOOLEAN);
  734. ⓪"VAR i: CARDINAL;
  735. ⓪"BEGIN
  736. ⓪$backoff:= 0;
  737. ⓪$deferHistory:= bitVector {};
  738. ⓪$collsnHistory:= bitVector {};
  739. ⓪$deferCount:= 0;
  740. ⓪$collsnCount:= 0;
  741. ⓪$
  742. ⓪$WHILE packetBuffers < 2 DO
  743. ⓪&NewPacketBuffer
  744. ⓪$END;
  745. ⓪$
  746. ⓪$TimerA.Init;
  747. ⓪$
  748. ⓪$(**** SCC initialisieren ****)
  749. ⓪$(*
  750. ⓪%* Die Clock an RTxCA ist 3.672 MHz, benötigte Baudrate ist 230400 Bit/s.
  751. ⓪%* Dazu müßte die Clock auf 1/16 geteilt werden.
  752. ⓪%* Da für Receive DPLL verwendet wird, und DPLL den 16fachen Clk
  753. ⓪%* braucht, wird trotzdem kein Teiler verwendet. Stattdessen wird
  754. ⓪%* über den BRG geteilt.
  755. ⓪%*
  756. ⓪%* Der SCC arbeitet im Interrupt-Betrieb. Es wird der Non-Auto-Vektor-
  757. ⓪%* Modus verwendet, auf Adr. $360. Der IR läuft im Level 5.
  758. ⓪%* Da nur eine einzige IR-Quelle benutzt wird (IR on 1st Rx Char or
  759. ⓪%* special condition), wird die vector-includes-status-Option nicht
  760. ⓪%* verwerdet.
  761. ⓪%*)
  762. ⓪$GIOffBit ($7F);
  763. ⓪$SCC.Reset ();
  764. ⓪$(* X1 clock mode, SDLC mode, no parity *)
  765. ⓪$SCC.SetReg ( 4, 00100000%);
  766. ⓪$(* FM0 encoding, CRC preset 1 *)
  767. ⓪$SCC.SetReg (10, 11100000%);
  768. ⓪$(* Address: 0 *)
  769. ⓪$SCC.SetReg ( 6, 0);
  770. ⓪$(* SDCL flag *)
  771. ⓪$SCC.SetReg ( 7, 01111110%);
  772. ⓪$(* time constant: $0006 *)
  773. ⓪$SCC.SetReg (12, 6);
  774. ⓪$SCC.SetReg (13, 0);
  775. ⓪$(* FM mode *)
  776. ⓪$SCC.SetReg (14, 11000000%);
  777. ⓪$(* 8 Rx Bits *)
  778. ⓪$SCC.SetReg ( 3, 11010000%);
  779. ⓪$
  780. ⓪$(* Rx Clk: DPLL, Tx Clk: BRG *)
  781. ⓪$SCC.SetReg (11, 01110000%);
  782. ⓪$
  783. ⓪$(* activate DPLL, enable BRG *)
  784. ⓪$SCC.SetReg (14, 00100001%);
  785. ⓪$
  786. ⓪$(* 8 Tx Bits, SDLC CRC check *)
  787. ⓪$SCC.SetReg ( 5, 01100000%);
  788. ⓪$
  789. ⓪$(* *** IR vorbereiten *** *)
  790. ⓪$IR_Vector:= IR_Handler;
  791. ⓪$SCC.SetReg ( 2, SHORT (LONGCARD (ADR (IR_Vector)) DIV 4)); (* IR-Vektor *)
  792. ⓪$SCC.SetReg (15, 00000000%);
  793. ⓪$SCC.SetReg ( 1, 00001000%); (* IR on 1st Rx or special condition *)
  794. ⓪$SCC.SetReg ( 9, 00001000%); (* Enable IR (no VIS) *)
  795. ⓪$
  796. ⓪$enableRx;
  797. ⓪$
  798. ⓪$AcquireAddress (hint, server)
  799. ⓪"END Init;
  800. ⓪ 
  801. ⓪ PROCEDURE AcquireAddress (hint: BYTE; server: BOOLEAN);
  802. ⓪ 
  803. ⓪"VAR maxTrys, trys: CARDINAL;
  804. ⓪&ok: BOOLEAN;
  805. ⓪&ENQframe: aFrame;
  806. ⓪"
  807. ⓪"BEGIN
  808. ⓪$IF CHAR(hint) > 0C THEN
  809. ⓪&myAddress:= hint
  810. ⓪$ELSIF server THEN
  811. ⓪&myAddress:= SHORT (random (127) + 128)
  812. ⓪$ELSE
  813. ⓪&myAddress:= SHORT (random (127) + 1)
  814. ⓪$END;
  815. ⓪$setAddress (myAddress);
  816. ⓪$trys:= 0;
  817. ⓪$
  818. ⓪$fAdrValid:= FALSE;
  819. ⓪$IF server THEN maxTrys:= wksTries * 6 ELSE maxTrys:= wksTries END;
  820. ⓪$fAdrInUse:= FALSE;
  821. ⓪$
  822. ⓪$WHILE trys < maxTrys DO
  823. ⓪&IF (TransmitPacket (myAddress, lapENQ, ENQframe.dataField, 0) = transmitOK)
  824. ⓪&OR fAdrInUse THEN
  825. ⓪(IF server THEN
  826. ⓪*myAddress:= SHORT (random (127) + 128)
  827. ⓪(ELSE
  828. ⓪*myAddress:= SHORT (random (127) + 1)
  829. ⓪(END;
  830. ⓪(setAddress (myAddress);
  831. ⓪(trys:= 0;
  832. ⓪&ELSE
  833. ⓪(INC (trys)
  834. ⓪&END
  835. ⓪$END; (* WHILE *)
  836. ⓪$
  837. ⓪$fAdrValid:= TRUE
  838. ⓪"END AcquireAddress;
  839. ⓪ 
  840. ⓪ PROCEDURE TransmitPacket (    dstParam: anAddress;
  841. ⓪>typeParam: aLAPtype;
  842. ⓪:REF dataParam: aDataField;
  843. ⓪>dataLength: INTEGER): TransmitStatus;
  844. ⓪"BEGIN
  845. ⓪$IF fAdrInUse THEN
  846. ⓪&RETURN dupAddress
  847. ⓪$ELSE
  848. ⓪&WITH outgoingPacket DO
  849. ⓪(dstAddr:= dstParam;
  850. ⓪(srcAddr:= myAddress;
  851. ⓪(lapType:= typeParam;
  852. ⓪(dataField:= dataParam (*!!! hier werden 600 Byte kopiert *)
  853. ⓪&END;
  854. ⓪&outgoingLength:= dataLength + 3;
  855. ⓪&RETURN TransmitLinkMgmt ()
  856. ⓪$END
  857. ⓪"END TransmitPacket;
  858. ⓪ 
  859. ⓪ PROCEDURE TransmitLinkMgmt (): TransmitStatus;
  860. ⓪"
  861. ⓪"VAR deferTries, collsnTries, lclbackoff: INTEGER;
  862. ⓪&dummy, fBroadCast, fENQ: BOOLEAN;
  863. ⓪&RTSframe: aFrame;
  864. ⓪&rcvdFrame: FrameStatus;
  865. ⓪&rcvdPacket: ptrPacket;
  866. ⓪&status: TransmitStatus;
  867. ⓪&sr: CARDINAL;
  868. ⓪"
  869. ⓪"BEGIN
  870. ⓪$WITH RTSframe DO
  871. ⓪&dstAddr:= outgoingPacket.dstAddr;
  872. ⓪&srcAddr:= myAddress;
  873. ⓪&lapType:= lapRTS
  874. ⓪$END;
  875. ⓪$
  876. ⓪$fBroadCast:= (outgoingPacket.dstAddr = BYTE($FF));
  877. ⓪$fENQ:= (outgoingPacket.lapType = lapENQ);
  878. ⓪$
  879. ⓪$IF BitCount (collsnHistory) > 2 THEN
  880. ⓪&backoff:= min (max (backoff*2,2), 16);
  881. ⓪&collsnHistory:= bitVector {}
  882. ⓪$ELSIF BitCount (deferHistory) < 2 THEN
  883. ⓪&backoff:= backoff DIV 2;
  884. ⓪&deferHistory:= bitVector {}
  885. ⓪$END;
  886. ⓪$
  887. ⓪$collsnHistory:= SHIFT (collsnHistory, 1);
  888. ⓪$deferHistory:= SHIFT (deferHistory, 1);
  889. ⓪$
  890. ⓪$deferTries:= 0;
  891. ⓪$collsnTries:= 0;
  892. ⓪$lclbackoff:= backoff;
  893. ⓪$
  894. ⓪$LOOP
  895. ⓪&REPEAT
  896. ⓪(IF carrierSense () THEN
  897. ⓪*lclbackoff:= max (lclbackoff, 2);
  898. ⓪*INCL (deferHistory, 0);
  899. ⓪*
  900. ⓪*IF NOT TimerA.DelayBytesUntil (maxFrameSize, carrierSense, FALSE) THEN
  901. ⓪,(* carrierSense () = TRUE *)
  902. ⓪,resetRx()
  903. ⓪*END;
  904. ⓪(END;
  905. ⓪(
  906. ⓪(dummy:= TimerA.DelayµsUntil (minIDGtime, carrierSense, TRUE)
  907. ⓪&UNTIL NOT carrierSense ();
  908. ⓪&
  909. ⓪&resetMissingClock ();
  910. ⓪&
  911. ⓪&dummy:= TimerA.DelayµsUntil (random (lclbackoff) * IDGslottime, carrierSense, TRUE);
  912. ⓪&
  913. ⓪&IF carrierSense () OR missingClock () THEN
  914. ⓪(INC (deferCount);
  915. ⓪(lclbackoff:= max (lclbackoff, 2);
  916. ⓪(INCL (deferHistory, 0);
  917. ⓪(IF deferTries >= maxDefers THEN
  918. ⓪*status:= excessDefers; EXIT
  919. ⓪(END;
  920. ⓪(INC (deferTries);
  921. ⓪&ELSE
  922. ⓪((*$D-*)
  923. ⓪(fCTSexpected:= TRUE;
  924. ⓪((*!!! da ggf. noch andere IRs kamen:
  925. ⓪*ResetReceiveBuffer;
  926. ⓪(*)
  927. ⓪(IF fENQ THEN
  928. ⓪*TransmitFrame (outgoingPacket, 3)
  929. ⓪(ELSE
  930. ⓪*TransmitFrame (RTSframe, 3)
  931. ⓪(END;
  932. ⓪(rcvdFrame:= ReceiveFrame (rcvdPacket);
  933. ⓪(fCTSexpected:= FALSE;
  934. ⓪(
  935. ⓪(IF rcvdPacket # NIL THEN
  936. ⓪*InOut.WriteCard (rcvdPacket^.no, 1); InOut.Write (' ');
  937. ⓪*WriteFrame (rcvdPacket^, 20);
  938. ⓪(END;
  939. ⓪(
  940. ⓪(CASE rcvdFrame OF
  941. ⓪(|badframeCRC, badframeSize, badframeType, overrunError, underrunError:
  942. ⓪*Wr ('Answer: >frameError<');
  943. ⓪(|lapACKframe:
  944. ⓪*Wr ('Answer: >ACKframe<')
  945. ⓪(|lapENQframe:
  946. ⓪*Wr ('Answer: >ENQframe<');
  947. ⓪(|lapRTSframe:
  948. ⓪*Wr ('Answer: >RTSframe<');
  949. ⓪(|lapDATAframe:
  950. ⓪*Wr ('Answer: >DATAframe<');
  951. ⓪(|noFrame:
  952. ⓪*(*IF fAdrValid THEN Wr ('Answer: no frame!') END*)
  953. ⓪(ELSE
  954. ⓪*Wr ('Answer: unknown frame!');
  955. ⓪(END;
  956. ⓪(
  957. ⓪((*$D=*)
  958. ⓪(IF fAdrInUse THEN
  959. ⓪*status:= dupAddress; EXIT
  960. ⓪(ELSIF (rcvdFrame = noFrame) & fBroadCast
  961. ⓪(OR (rcvdFrame = lapCTSframe) & ~fENQ & ~fBroadCast THEN
  962. ⓪*TransmitFrame (outgoingPacket, outgoingLength);
  963. ⓪*status:= transmitOK; EXIT
  964. ⓪(END;
  965. ⓪(
  966. ⓪(INC (collsnCount);
  967. ⓪(INCL (collsnHistory, 0);
  968. ⓪(IF collsnTries >= maxCollsns THEN
  969. ⓪*status:= excessCollsns; EXIT
  970. ⓪(END;
  971. ⓪(lclbackoff:= min (max (lclbackoff*2,2), 16);
  972. ⓪(INC (collsnTries)
  973. ⓪&END
  974. ⓪$END (* LOOP *);
  975. ⓪$RETURN status
  976. ⓪"END TransmitLinkMgmt;
  977. ⓪ (*$D-*)
  978. ⓪ 
  979. ⓪ PROCEDURE TransmitFrameAsm;
  980. ⓪"(*$L-*)
  981. ⓪"BEGIN
  982. ⓪$ASSEMBLER
  983. ⓪(; A0: ^Daten, D0: Anzahl, A1: CTLA, A2: $FFFFFA00
  984. ⓪(; enableTxDrivers
  985. ⓪(MOVE.B  #5,(A1)
  986. ⓪(MOVE.B  #setRTS,(A1)
  987. ⓪(
  988. ⓪(; Pause f. Sync-Pulse (1 Bit: 1.5 * bitTime (6.51µs) = 16 Zyklen)
  989. ⓪(MOVE.B  #$DF,$0B(A2)    ; IPRA: Clear Timer-A Pending Bit
  990. ⓪(MOVE.B  #4,$1F(A2)      ; TADR: Set Timer Count
  991. ⓪(MOVE.B  #1,$19(A2)      ; TACR: Timer Start (Teiler: 1/4)
  992. ⓪%l: BTST    #5,$0B(A2)      ; IPRA
  993. ⓪(BEQ     l
  994. ⓪(MOVE.B  #$00,$19(A2)    ; TACR: Timer Stop
  995. ⓪(
  996. ⓪(; disableTxDrivers
  997. ⓪(MOVE.B  #5,(A1)
  998. ⓪(MOVE.B  #$60,(A1)
  999. ⓪(
  1000. ⓪(; Pause f. Sync-Pulse (1 Bit: 1.5 * bitTime (6.51µs) = 16 Zyklen)
  1001. ⓪(MOVE.B  #$DF,$0B(A2)    ; IPRA: Clear Timer-A Pending Bit
  1002. ⓪(MOVE.B  #4,$1F(A2)      ; TADR: Set Timer Count
  1003. ⓪(MOVE.B  #1,$19(A2)      ; TACR: Timer Start (Teiler: 1/4)
  1004. ⓪%l2 BTST    #5,$0B(A2)      ; IPRA
  1005. ⓪(BEQ     l2
  1006. ⓪(MOVE.B  #$00,$19(A2)    ; TACR: Timer Stop
  1007. ⓪(
  1008. ⓪(; enableTxDrivers, enableTx
  1009. ⓪(MOVE.B  #5,(A1)
  1010. ⓪(MOVE.B  #txEnable,(A1)
  1011. ⓪(
  1012. ⓪(; disableRx
  1013. ⓪(MOVE.B  #3,(A1)
  1014. ⓪(MOVE.B  #$D0,(A1)
  1015. ⓪(
  1016. ⓪(; 2 * txFlag
  1017. ⓪(; Delay: 2 * 1.5 * byteTime (39µs) = 116 Zyklen
  1018. ⓪(MOVE.B  #$DF,$0B(A2)    ; IPRA: Clear Timer-A Pending Bit
  1019. ⓪(MOVE.B  #70,$1F(A2)     ; TADR: Set Timer Count
  1020. ⓪(MOVE.B  #1,$19(A2)      ; TACR: Timer Start (Teiler: 1/4)
  1021. ⓪%l3 BTST    #5,$0B(A2)      ; IPRA
  1022. ⓪(BEQ     l3
  1023. ⓪(MOVE.B  #$00,$19(A2)    ; TACR: Timer Stop
  1024. ⓪(
  1025. ⓪(; resetCRC
  1026. ⓪(MOVE.B  #$80,(A1)
  1027. ⓪(
  1028. ⓪%nextChar:
  1029. ⓪(; TxChar
  1030. ⓪(MOVE.B  (A0)+,2(A1)
  1031. ⓪(NOP
  1032. ⓪(NOP
  1033. ⓪%notEmpty:
  1034. ⓪(BTST    #2,(A1)
  1035. ⓪(BEQ     notEmpty
  1036. ⓪(SUBQ    #1,D0
  1037. ⓪(BNE     nextChar
  1038. ⓪(
  1039. ⓪(; resetUnderrun
  1040. ⓪(MOVE.B  #$C0,(A1)
  1041. ⓪(
  1042. ⓪(; TxFCS: wait for underrun
  1043. ⓪%notUnder:
  1044. ⓪(BTST    #6,(A1)
  1045. ⓪(BEQ     notUnder
  1046. ⓪(
  1047. ⓪(; TxFlag (?)
  1048. ⓪%notEmpty2:
  1049. ⓪(BTST    #2,(A1)
  1050. ⓪(BEQ     notEmpty2
  1051. ⓪(
  1052. ⓪(; enableTxDrivers, disableTx
  1053. ⓪(MOVE.B  #5,(A1)
  1054. ⓪(MOVE.B  #setRTS,(A1)
  1055. ⓪(
  1056. ⓪(; txONEs (?)
  1057. ⓪(; Delay: 1.5 * byteTime (39µs) = 58 Zyklen
  1058. ⓪(MOVE.B  #$DF,$0B(A2)    ; IPRA: Clear Timer-A Pending Bit
  1059. ⓪(MOVE.B  #35,$1F(A2)     ; TADR: Set Timer Count
  1060. ⓪(MOVE.B  #1,$19(A2)      ; TACR: Timer Start (Teiler: 1/4)
  1061. ⓪%l4 BTST    #5,$0B(A2)      ; IPRA
  1062. ⓪(BEQ     l4
  1063. ⓪(MOVE.B  #$00,$19(A2)    ; TACR: Timer Stop
  1064. ⓪(
  1065. ⓪(; disableTxDrivers
  1066. ⓪(MOVE.B  #5,(A1)
  1067. ⓪(MOVE.B  #$60,(A1)
  1068. ⓪(
  1069. ⓪(; resetMissingClock
  1070. ⓪(MOVE.B  #14,(A1)
  1071. ⓪(MOVE.B  #$41,(A1)
  1072. ⓪(
  1073. ⓪(; enableRx
  1074. ⓪(MOVE.B  #3,(A1)
  1075. ⓪(MOVE.B  #rxEnable,(A1)
  1076. ⓪$END;
  1077. ⓪"END TransmitFrameAsm;
  1078. ⓪"(*$L=*)
  1079. ⓪ 
  1080. ⓪ PROCEDURE TransmitFrame (REF frame: aFrame; frameSize: CARDINAL);
  1081. ⓪"(*$L-*)
  1082. ⓪"BEGIN
  1083. ⓪$ASSEMBLER
  1084. ⓪(MOVE    SR,D2
  1085. ⓪(ORI     #$2700,SR
  1086. ⓪(MOVEA.W #CTLA,A1
  1087. ⓪(MOVEA.W #$FA00,A2
  1088. ⓪(MOVE.W  -(A3),D0
  1089. ⓪(MOVE.L  -(A3),A0
  1090. ⓪(JSR     TransmitFrameAsm
  1091. ⓪(MOVE    D2,SR
  1092. ⓪$END;
  1093. ⓪"END TransmitFrame;
  1094. ⓪"(*$L=*)
  1095. ⓪ 
  1096. ⓪ PROCEDURE ReceivePacket (VAR dstParam: anAddress;
  1097. ⓪9VAR srcParam: anAddress;
  1098. ⓪9VAR typeParam: aLAPtype;
  1099. ⓪9VAR dataParam: aDataField;
  1100. ⓪9VAR dataLength: INTEGER);
  1101. ⓪"VAR status: ReceiveStatus; packet: ptrPacket;
  1102. ⓪"BEGIN
  1103. ⓪$REPEAT UNTIL (ReceiveLinkMgmt (packet) = receiveOK) OR InOut.KeyPressed ();
  1104. ⓪$WITH packet^.frame DO
  1105. ⓪&dstParam:= dstAddr;
  1106. ⓪&srcParam:= srcAddr;
  1107. ⓪&typeParam:= lapType;
  1108. ⓪&dataParam:= dataField (*!!! hier werden 600 Byte kopiert -> Ptr verw.*)
  1109. ⓪$END;
  1110. ⓪"END ReceivePacket;
  1111. ⓪ 
  1112. ⓪ PROCEDURE ReceiveLinkMgmt (VAR packet: ptrPacket): ReceiveStatus;
  1113. ⓪"
  1114. ⓪"VAR status: ReceiveStatus;
  1115. ⓪&rcvdStatus: FrameStatus;
  1116. ⓪&CTSframe, ACKframe: aFrame;
  1117. ⓪&sr: CARDINAL;
  1118. ⓪"
  1119. ⓪"BEGIN
  1120. ⓪$ASSEMBLER
  1121. ⓪(MOVE    SR,sr(A6)
  1122. ⓪(MOVE    #$2500,SR
  1123. ⓪$END;
  1124. ⓪$status:= receiving;
  1125. ⓪$REPEAT
  1126. ⓪&rcvdStatus:= ReceiveFrame (packet);
  1127. ⓪&IF rcvdStatus # noFrame THEN
  1128. ⓪(InOut.WriteCard (packet^.no, 1); InOut.Write (' ');
  1129. ⓪(WriteFrame (packet^,99);
  1130. ⓪(InOut.WriteLn;
  1131. ⓪(WriteStatus (rcvdStatus); InOut.WriteLn;
  1132. ⓪&END;
  1133. ⓪&CASE rcvdStatus OF
  1134. ⓪&|badframeCRC, badframeSize, badframeType, overrunError, underrunError:
  1135. ⓪(status:= frameError
  1136. ⓪&|lapACKframe:
  1137. ⓪&|lapENQframe:
  1138. ⓪(IF fAdrValid THEN
  1139. ⓪*WITH ACKframe DO
  1140. ⓪,dstAddr:= packet^.frame.srcAddr;
  1141. ⓪,srcAddr:= myAddress;
  1142. ⓪,lapType:= lapACK
  1143. ⓪*END;
  1144. ⓪*TransmitFrame (ACKframe, 3);
  1145. ⓪(ELSE
  1146. ⓪*fAdrInUse:= TRUE
  1147. ⓪(END;
  1148. ⓪(status:= nullReceive
  1149. ⓪&|lapRTSframe:
  1150. ⓪((* wird nun schon beim Empfang erledigt *)
  1151. ⓪(HALT
  1152. ⓪((*
  1153. ⓪*IF fAdrValid THEN
  1154. ⓪,WITH CTSframe DO
  1155. ⓪.dstAddr:= headPacket^.frame.srcAddr;
  1156. ⓪.srcAddr:= myAddress;
  1157. ⓪.lapType:= lapCTS
  1158. ⓪,END;
  1159. ⓪,TransmitFrame (CTSframe, 3);
  1160. ⓪*ELSE
  1161. ⓪,fAdrInUse:= TRUE;
  1162. ⓪,status:= nullReceive
  1163. ⓪*END;
  1164. ⓪(*)
  1165. ⓪&|lapDATAframe:
  1166. ⓪(IF fAdrValid THEN
  1167. ⓪*status:= receiveOK
  1168. ⓪(ELSE
  1169. ⓪*fAdrInUse:= TRUE;
  1170. ⓪*status:= nullReceive
  1171. ⓪(END;
  1172. ⓪&|noFrame:
  1173. ⓪(status:= nullReceive
  1174. ⓪&ELSE
  1175. ⓪&END
  1176. ⓪$UNTIL status # receiving;
  1177. ⓪$ASSEMBLER
  1178. ⓪(MOVE    sr(A6),SR
  1179. ⓪$END;
  1180. ⓪$RETURN status
  1181. ⓪"END ReceiveLinkMgmt;
  1182. ⓪ 
  1183. ⓪ PROCEDURE ReceiveFrame (VAR packet: ptrPacket): FrameStatus;
  1184. ⓪"
  1185. ⓪"VAR status: FrameStatus;
  1186. ⓪ 
  1187. ⓪"BEGIN
  1188. ⓪$ASSEMBLER
  1189. ⓪(MOVEA.W #CTLA,A1
  1190. ⓪(MOVEA.W #$FA00,A2
  1191. ⓪(MOVE.L  tailPacket,A0
  1192. ⓪(
  1193. ⓪(; *** warten auf Frame-Empfang (IR o. Polling) ***
  1194. ⓪(
  1195. ⓪(MOVEQ   #0,D1
  1196. ⓪(
  1197. ⓪$l1: MOVEQ   #maxIFGtime DIV 4,D0
  1198. ⓪(MOVE.B  #$DF,$0B(A2)    ; IPRA: Clear Timer-A Pending Bit
  1199. ⓪(MOVE.B  D0,$1F(A2)      ; TADR: Set Timer Count
  1200. ⓪(MOVE.B  #2,$19(A2)      ; TACR: Timer Start (Teiler: 1/10)
  1201. ⓪$l0: ; zuerst prüfen, ob evtl. noch ein Frame zu pollen ist,
  1202. ⓪(; auch wenn noch weitere Pakete schon im Puffer warten.
  1203. ⓪(;BTST    #0,(A1)
  1204. ⓪(MOVE.B  #3,(A1)
  1205. ⓪(BTST.B  #5,(A1)         ; RR3: Rx IR pending?
  1206. ⓪(BNE     pollFrame
  1207. ⓪(CMPA.L  headPacket,A0
  1208. ⓪(BNE     gotFrame
  1209. ⓪(BTST    #5,$0B(A2)      ; time over?
  1210. ⓪(BEQ     l0
  1211. ⓪(; IR-Receive nochmal prüfen, falls IR zw. vorigem CMP und Time-Chk kam.
  1212. ⓪(CMPA.L  headPacket,A0
  1213. ⓪(BNE     gotFrame
  1214. ⓪(
  1215. ⓪((*
  1216. ⓪(TST     test
  1217. ⓪(BEQ     timeout
  1218. ⓪(
  1219. ⓪(ADDQ    #1,D1
  1220. ⓪(BRA     l1
  1221. ⓪(*)
  1222. ⓪(
  1223. ⓪$timeout:
  1224. ⓪(; time out
  1225. ⓪(MOVE.B  #$00,$19(A2)    ; TACR: Timer Stop
  1226. ⓪(MOVE.L  packet(A6),A1
  1227. ⓪(CLR.L   (A1)
  1228. ⓪(MOVE    #noFrame,status(A6)
  1229. ⓪(BRA.W   exit2
  1230. ⓪(
  1231. ⓪$gotFrame:
  1232. ⓪(MOVE.B  #$00,$19(A2)    ; TACR: Timer Stop
  1233. ⓪(BRA     exit
  1234. ⓪(
  1235. ⓪$pollFrame:
  1236. ⓪(MOVE    SR,D2
  1237. ⓪(ORI     #$0700,SR
  1238. ⓪(MOVE.B  #$00,$19(A2)    ; TACR: Timer Stop
  1239. ⓪(JSR     GetFrame
  1240. ⓪(MOVE.B  #1,(A1)
  1241. ⓪(MOVE.B  #$08,(A1)
  1242. ⓪(; MOVE.B  #2,4(A1)
  1243. ⓪(; TST.B   4(A1)                   ; RR2B
  1244. ⓪(MOVE    D2,SR
  1245. ⓪(
  1246. ⓪$exit:
  1247. ⓪(MOVE.L  tailPacket,A0
  1248. ⓪(MOVE.L  packet(A6),A1
  1249. ⓪(MOVE.L  A0,(A1)
  1250. ⓪(MOVE    aPacket.status(A0),status(A6)
  1251. ⓪(MOVE.L  aPacket.next(A0),tailPacket
  1252. ⓪(
  1253. ⓪$exit2:
  1254. ⓪$END;
  1255. ⓪$RETURN status 
  1256. ⓪"END ReceiveFrame;
  1257. ⓪ 
  1258. ⓪ PROCEDURE IR_Handler;
  1259. ⓪"(*$L-*)
  1260. ⓪"BEGIN
  1261. ⓪$ASSEMBLER
  1262. ⓪(ORI     #$0700,SR
  1263. ⓪(MOVEM.L A0-A2/D0-D1,-(A7)
  1264. ⓪(
  1265. ⓪(MOVEA.W #$FA00,A2
  1266. ⓪(MOVEA.W #CTLA,A1
  1267. ⓪(JSR     GetFrame
  1268. ⓪(
  1269. ⓪(ADDQ.W  #1,Interrupts
  1270. ⓪(
  1271. ⓪(MOVEM.L (A7)+,A0-A2/D0-D1
  1272. ⓪(RTE
  1273. ⓪$END;
  1274. ⓪"END IR_Handler;
  1275. ⓪"(*$L=*)
  1276. ⓪ 
  1277. ⓪ PROCEDURE GetFrame;
  1278. ⓪"(*$L-*)
  1279. ⓪"BEGIN
  1280. ⓪$ASSEMBLER
  1281. ⓪(MOVE.B  2(A1),D0                ; 1. char sofort holen
  1282. ⓪(MOVE.L  headPacket,A0
  1283. ⓪(MOVE.B  D0,aPacket.frame(A0)
  1284. ⓪(
  1285. ⓪(MOVE.B  #2,4(A1)
  1286. ⓪(BTST.B  #0,4(A1)                ; RR2B
  1287. ⓪(BNE     specCond
  1288. ⓪(
  1289. ⓪(MOVEQ   #100,D1
  1290. ⓪&wait2:
  1291. ⓪(BTST    #0,(A1)
  1292. ⓪(DBNE    D1,wait2
  1293. ⓪(MOVE.B  2(A1),aPacket.frame+1(A0)
  1294. ⓪(
  1295. ⓪(MOVEQ   #2,D0
  1296. ⓪(BRA     nextChar
  1297. ⓪(
  1298. ⓪$specCond:
  1299. ⓪(MOVE #$2500,SR BREAK
  1300. ⓪(
  1301. ⓪$again:
  1302. ⓪(CLR     D0
  1303. ⓪(
  1304. ⓪$loop2:
  1305. ⓪(; overrun?
  1306. ⓪(MOVE.B  #1,(A1)   ; RR1
  1307. ⓪(BTST.B  #5,(A1)
  1308. ⓪(BEQ     noOverrun
  1309. ⓪(
  1310. ⓪(MOVE    D0,aPacket.length(A0)
  1311. ⓪(MOVE.W  #overrunError,aPacket.status(A0)
  1312. ⓪(BRA.W   exit2
  1313. ⓪(
  1314. ⓪$timeOut:
  1315. ⓪(MOVE    D0,aPacket.length(A0)
  1316. ⓪(MOVE.W  #noFrame,aPacket.status(A0)
  1317. ⓪(BRA.W   exit2
  1318. ⓪(
  1319. ⓪$noOverrun:
  1320. ⓪(MOVEQ   #100,D1
  1321. ⓪&wait4:
  1322. ⓪(BTST    #0,(A1)
  1323. ⓪(DBNE    D1,wait4
  1324. ⓪(BEQ     timeOut
  1325. ⓪(
  1326. ⓪((*
  1327. ⓪(BTST.B  #0,(A1)   ; Data avail?
  1328. ⓪(BEQ     noDataNow ; !!!timeout berücksichtigen
  1329. ⓪(*)
  1330. ⓪(
  1331. ⓪(; *** read data ***
  1332. ⓪(CMPI.W  #maxFrameSize,D0        ; incomingLength
  1333. ⓪(BCS     getChar
  1334. ⓪(
  1335. ⓪$sizeError:
  1336. ⓪(MOVE    D0,aPacket.length(A0)
  1337. ⓪(MOVE.W  #badframeSize,aPacket.status(A0)
  1338. ⓪(BRA.W   exit2
  1339. ⓪(
  1340. ⓪$getChar:
  1341. ⓪(; headPacket^.frame.rawData [incomingLength]:= rxData ()
  1342. ⓪(MOVE.B  2(A1),aPacket.frame(A0,D0.W)  ; RR8
  1343. ⓪(ADDQ.W  #1,D0             ; incomingLength
  1344. ⓪(
  1345. ⓪$nextChar:
  1346. ⓪$noDataNow:
  1347. ⓪(; end of frame?
  1348. ⓪(MOVE.B  #1,(A1)   ; RR1
  1349. ⓪(TST.B   (A1)
  1350. ⓪(BPL     loop2
  1351. ⓪(
  1352. ⓪(; CRC OK?
  1353. ⓪(MOVE.B  #1,(A1)   ; RR1
  1354. ⓪(BTST.B  #6,(A1)
  1355. ⓪(BEQ     crcOK
  1356. ⓪(
  1357. ⓪(MOVE    D0,aPacket.length(A0)
  1358. ⓪(MOVE.W  #badframeCRC,aPacket.status(A0)
  1359. ⓪(BRA.W   exit2
  1360. ⓪(
  1361. ⓪$crcOK:
  1362. ⓪(SUBQ.W  #2,D0           ; incomingLength
  1363. ⓪(MOVE    D0,aPacket.length(A0)
  1364. ⓪(CMPI.W  #minFrameSize,D0
  1365. ⓪(BCS     sizeError
  1366. ⓪(
  1367. ⓪((* Der folgende Teil kann auch aus dem IR-Handler herausgenommen werden*)
  1368. ⓪(
  1369. ⓪(; *** frameDone ***
  1370. ⓪(TST.W   fAdrValid
  1371. ⓪(BEQ     notValid
  1372. ⓪(
  1373. ⓪(MOVE.B  aPacket.frame.lapType(A0),D0
  1374. ⓪(BMI     ctrlFrame
  1375. ⓪(
  1376. ⓪(MOVE.W  #lapDATAframe,aPacket.status(A0)
  1377. ⓪(BRA.W   exit2
  1378. ⓪(
  1379. ⓪&ctrlFrame:
  1380. ⓪(CMPI.B  #lapENQ,D0
  1381. ⓪(BEQ     isENQ
  1382. ⓪(CMPI.B  #lapACK,D0
  1383. ⓪(BEQ     isACK
  1384. ⓪(CMPI.B  #lapRTS,D0
  1385. ⓪(BEQ     isRTS
  1386. ⓪(CMPI.B  #lapCTS,D0
  1387. ⓪(BEQ     isCTS
  1388. ⓪&badFrame:
  1389. ⓪(MOVE.W  #badframeType,aPacket.status(A0)
  1390. ⓪(BRA     exit2
  1391. ⓪&isENQ:
  1392. ⓪(MOVE.W  #lapENQframe,aPacket.status(A0)
  1393. ⓪(BRA     exit2
  1394. ⓪&isACK:
  1395. ⓪(MOVE.W  #lapACKframe,aPacket.status(A0)
  1396. ⓪(MOVE.W  #1,fAdrInUse
  1397. ⓪(BRA     exit2
  1398. ⓪&isRTS:
  1399. ⓪(MOVE.W  #lapRTSframe,aPacket.status(A0)
  1400. ⓪(BRA     exit2
  1401. ⓪&isCTS:
  1402. ⓪(MOVE.W  #lapCTSframe,aPacket.status(A0)
  1403. ⓪(TST.W   fCTSexpected
  1404. ⓪(BNE     exit2
  1405. ⓪(MOVE.W  #1,fAdrInUse
  1406. ⓪(BRA     badFrame
  1407. ⓪(
  1408. ⓪¬Valid:
  1409. ⓪(CMPI.B  #$FF,aPacket.frame.dstAddr(A0)
  1410. ⓪(BEQ     exit2
  1411. ⓪(
  1412. ⓪(MOVE    #1,fAdrInUse
  1413. ⓪(MOVE.W  #noFrame,aPacket.status(A0)
  1414. ⓪(
  1415. ⓪$exit2:
  1416. ⓪(
  1417. ⓪(CMPI.W  #lapRTSframe,aPacket.status(A0)
  1418. ⓪(BNE     noRTS
  1419. ⓪(
  1420. ⓪(; CTS senden, falls kein Broadcast
  1421. ⓪(CMPI.B  #$FF,aPacket.frame.dstAddr(A0)
  1422. ⓪(BEQ     noCTS
  1423. ⓪(MOVE.B  #lapCTS,-(A7)
  1424. ⓪(MOVE.B  aPacket.frame.srcAddr(A0),D0
  1425. ⓪(LSL     #8,D0
  1426. ⓪(MOVE.B  myAddress,D0
  1427. ⓪(MOVE.W  D0,-(A7)
  1428. ⓪(MOVE.L  A7,A0
  1429. ⓪(MOVE.W  #3,D0
  1430. ⓪(JSR     TransmitFrameAsm
  1431. ⓪(ADDQ.L  #4,A7
  1432. ⓪(MOVE.L  headPacket,A0
  1433. ⓪&noCTS:
  1434. ⓪(MOVE.W  #noFrame,aPacket.status(A0)
  1435. ⓪(
  1436. ⓪&noRTS:
  1437. ⓪(
  1438. ⓪(; resetRx
  1439. ⓪(MOVE.B  #3,(A1)
  1440. ⓪(MOVE.B  #$D0,(A1)       ; disableRx
  1441. ⓪(
  1442. ⓪(MOVEQ   #2,D0
  1443. ⓪&flushFIFO:
  1444. ⓪(TST.B   2(A1)
  1445. ⓪(DBRA    D0,flushFIFO
  1446. ⓪(
  1447. ⓪(; resetMissingClock
  1448. ⓪(MOVE.B  #14,(A1)
  1449. ⓪(MOVE.B  #$41,(A1)
  1450. ⓪(
  1451. ⓪(MOVE.B  #3,(A1)
  1452. ⓪(MOVE.B  #rxEnable,(A1)  ; enableRx
  1453. ⓪(
  1454. ⓪(; reset error
  1455. ⓪(MOVE.B  #$30,(A1)
  1456. ⓪(
  1457. ⓪(MOVE.B  #$20,(A1)         ; enable IR on next Rx
  1458. ⓪(
  1459. ⓪(; resetMissingClock
  1460. ⓪(MOVE.B  #14,(A1)
  1461. ⓪(MOVE.B  #$41,(A1)
  1462. ⓪(
  1463. ⓪(ADDQ.W  #1,FramesReceived
  1464. ⓪(
  1465. ⓪(MOVE.L  aPacket.next(A0),A0
  1466. ⓪(MOVE.L  A0,headPacket
  1467. ⓪(
  1468. ⓪(; reset IUS
  1469. ⓪(MOVE.B  #$38,(A1)
  1470. ⓪(
  1471. ⓪(; more IRs?
  1472. ⓪((* hat wohl keinen Sinn, da das nicht so gemeldet wird
  1473. ⓪*MOVE.B  #3,(A1)
  1474. ⓪*TST.B   (A1)            ; RR3
  1475. ⓪*BNE     again
  1476. ⓪(*)
  1477. ⓪(BTST    #0,(A1)
  1478. ⓪(BNE     again
  1479. ⓪(
  1480. ⓪(; MOVE.B  #1,(A1)
  1481. ⓪(; MOVE.B  #$08,(A1)         ; enable IR on first Rx
  1482. ⓪$END
  1483. ⓪"END GetFrame;
  1484. ⓪"(*$L=*)
  1485. ⓪ 
  1486. ⓪ BEGIN
  1487. ⓪"packetBuffers:= 0;
  1488. ⓪ END (* MODULE *) ALAP;
  1489. ⓪ 
  1490. ⓪ (*****************************************************************************)
  1491. ⓪ 
  1492. ⓪ TYPE BS = SET OF [0..7];
  1493. ⓪%RegSet = SET OF [0..15];
  1494. ⓪ 
  1495. ⓪ CONST ReadRegs  = RegSet {0,1,2,3,8,10,12,13,15};
  1496. ⓪&WriteRegs = RegSet {0..15};
  1497. ⓪&
  1498. ⓪&RegsToDisplay = RegSet {0,1,2,3,8,10,12,13,15};
  1499. ⓪&
  1500. ⓪ 
  1501. ⓪ PROCEDURE WriteReg (n: CARDINAL);
  1502. ⓪"VAR reg: CARDINAL;
  1503. ⓪"BEGIN
  1504. ⓪$reg:= SCC.Reg (n);
  1505. ⓪$WriteNum (reg, 16, 2, '0');
  1506. ⓪$WriteString ('  ');
  1507. ⓪$WriteNum (reg, 2, 8, '0');
  1508. ⓪"END WriteReg;
  1509. ⓪ 
  1510. ⓪ 
  1511. ⓪ VAR ch: CHAR;
  1512. ⓪$rxIdx, n, c: CARDINAL;
  1513. ⓪$lc: LONGCARD;
  1514. ⓪$i: INTEGER;
  1515. ⓪$ssp, li: LONGINT;
  1516. ⓪$redraw, quit, ok, b: BOOLEAN;
  1517. ⓪$by: BS;
  1518. ⓪$
  1519. ⓪$packet: ALAP.ptrPacket;
  1520. ⓪$dstParam, srcParam: ALAP.anAddress;
  1521. ⓪$typeParam: ALAP.aLAPtype;
  1522. ⓪$dataParam: ALAP.aDataField;
  1523. ⓪$txStatus: ALAP.TransmitStatus;
  1524. ⓪$frameStatus: ALAP.FrameStatus;
  1525. ⓪$dataLength: INTEGER;
  1526. ⓪ 
  1527. ⓪ BEGIN
  1528. ⓪"WritePg;
  1529. ⓪"ssp:= Super (0);
  1530. ⓪"
  1531. ⓪"(*
  1532. ⓪"WriteLn;
  1533. ⓪"WriteString ('Start...');
  1534. ⓪"FOR c:= 1 TO 5 DO
  1535. ⓪$FOR n:= 1 TO 5*1000 DO
  1536. ⓪&ASSEMBLER
  1537. ⓪(MOVEA.W #$FA00,A2
  1538. ⓪(MOVEQ   #50,D0
  1539. ⓪(MOVE.B  #$DF,$0B(A2)    ; IPRA: Clear Timer-A Pending Bit
  1540. ⓪(MOVE.B  D0,$1F(A2)      ; TADR: Set Timer Count
  1541. ⓪(MOVE.B  #2,$19(A2)      ; TACR: Timer Start (Teiler: 1/10)
  1542. ⓪$l0: BTST    #5,$0B(A2)      ; time over?
  1543. ⓪(BEQ     l0
  1544. ⓪(MOVE.B  #$00,$19(A2)    ; TACR: Timer Stop
  1545. ⓪&END;
  1546. ⓪$END;
  1547. ⓪"END;
  1548. ⓪"WriteString ('Stop!');
  1549. ⓪"WriteLn;
  1550. ⓪"*)
  1551. ⓪"
  1552. ⓪"WriteLn;
  1553. ⓪"WriteString ('Init...');
  1554. ⓪"WriteLn;
  1555. ⓪"
  1556. ⓪"ALAP.Init (0, FALSE);
  1557. ⓪"
  1558. ⓪"ALAP.NewPacketBuffer;
  1559. ⓪"ALAP.NewPacketBuffer;
  1560. ⓪"ALAP.NewPacketBuffer;
  1561. ⓪"ALAP.NewPacketBuffer;
  1562. ⓪"
  1563. ⓪"WriteString ('OK');
  1564. ⓪"WriteLn;
  1565. ⓪"
  1566. ⓪"rxIdx:= 0;
  1567. ⓪"redraw:= TRUE;
  1568. ⓪"quit:= FALSE;
  1569. ⓪"REPEAT
  1570. ⓪$IF redraw THEN
  1571. ⓪&GotoXY (4,0);
  1572. ⓪&WriteString (' interrupts');
  1573. ⓪&GotoXY (4,1);
  1574. ⓪&WriteString (' frames received');
  1575. ⓪&GotoXY (0,2);
  1576. ⓪&FOR n:= 0 TO 15 DO
  1577. ⓪(IF n IN ReadRegs THEN
  1578. ⓪*WriteString ('Reg '); WriteNum (n, 16, 1, '0'); WriteString (': '); WriteLn;
  1579. ⓪(END
  1580. ⓪&END;
  1581. ⓪&WriteString (VT52.Seq[clearEOS]);
  1582. ⓪&
  1583. ⓪&c:= 2;
  1584. ⓪&FOR n:= 0 TO 15 DO
  1585. ⓪(IF n IN ReadRegs THEN
  1586. ⓪*IF n IN RegsToDisplay THEN GotoXY (7,c); WriteReg (n) END;
  1587. ⓪*INC (c);
  1588. ⓪(END;
  1589. ⓪&END;
  1590. ⓪&
  1591. ⓪&GotoXY (0, 11);
  1592. ⓪&WriteString ('myAddress: '); WriteHex (LONG (ALAP.myAddress), 3);
  1593. ⓪&
  1594. ⓪&redraw:= FALSE
  1595. ⓪$END;
  1596. ⓪$GotoXY (0,0);
  1597. ⓪$WriteCard (ALAP.Interrupts, 4);
  1598. ⓪$GotoXY (0,1);
  1599. ⓪$WriteCard (ALAP.FramesReceived, 4);
  1600. ⓪$
  1601. ⓪$IF ALAP.headPacket # ALAP.tailPacket THEN
  1602. ⓪&frameStatus:= ALAP.ReceiveFrame (packet);
  1603. ⓪&GotoXY (40, rxIdx);
  1604. ⓪&WriteCard (rxIdx, 2);
  1605. ⓪&INC (rxIdx);
  1606. ⓪&WriteString (': ');
  1607. ⓪&ALAP.WriteFrame (packet^, 5);
  1608. ⓪&InOut.WriteCard (packet^.no, 1); InOut.Write (' ');
  1609. ⓪&ALAP.WriteStatus (packet^.status);
  1610. ⓪$END;
  1611. ⓪$
  1612. ⓪$IF KeyPressed() THEN
  1613. ⓪&GotoXY (0,14);
  1614. ⓪&WriteString (VT52.Seq[clearEOS]);
  1615. ⓪&WriteLn;
  1616. ⓪&Read (ch); ch:= CAP (ch);
  1617. ⓪&IF ch = 'Q' THEN
  1618. ⓪(quit:= TRUE;
  1619. ⓪&ELSIF ch = 'T' THEN
  1620. ⓪(WriteLn;
  1621. ⓪(WriteString ('Transmitting...');
  1622. ⓪(WriteLn;
  1623. ⓪(txStatus:= ALAP.TransmitPacket (BYTE($FF), BYTE($81), dataParam, 0);
  1624. ⓪(ALAP.fAdrInUse:= FALSE;
  1625. ⓪(WriteString ('Status: ');
  1626. ⓪(CASE txStatus OF
  1627. ⓪(| ALAP.transmitOK: WriteString ('transmitOK')
  1628. ⓪(| ALAP.excessDefers: WriteString ('excessDefers')
  1629. ⓪(| ALAP.excessCollsns: WriteString ('excessCollsns')
  1630. ⓪(| ALAP.dupAddress: WriteString ('dupAddress')
  1631. ⓪(END;
  1632. ⓪(WriteLn;
  1633. ⓪&ELSIF ch = 'R' THEN
  1634. ⓪(WriteLn;
  1635. ⓪(WriteString ('Receiving...');
  1636. ⓪(WriteLn;
  1637. ⓪(ALAP.ReceivePacket (dstParam, srcParam, typeParam, dataParam, dataLength);
  1638. ⓪(IF InOut.KeyPressed () THEN
  1639. ⓪*WriteString ('Aborted');
  1640. ⓪*Read (ch)
  1641. ⓪(ELSE
  1642. ⓪*WriteString ('OK');
  1643. ⓪(END
  1644. ⓪&ELSIF ch = 'G' THEN
  1645. ⓪(WriteLn;
  1646. ⓪(WriteString ('Getting Addresses on Bus...');
  1647. ⓪(WriteLn;
  1648. ⓪(FOR n:= $15 TO $15 DO
  1649. ⓪*ALAP.test:= TRUE;
  1650. ⓪*txStatus:= ALAP.TransmitPacket (SHORT(n), BYTE($81), dataParam, 0);
  1651. ⓪*IF txStatus = ALAP.dupAddress THEN
  1652. ⓪,Write ('>'); WriteHex (n, 3); Write ('<'); WriteLn;
  1653. ⓪*END;
  1654. ⓪*ALAP.fAdrInUse:= FALSE;
  1655. ⓪(END;
  1656. ⓪(ALAP.test:= FALSE;
  1657. ⓪(WriteLn;
  1658. ⓪&ELSIF ch = ' ' THEN
  1659. ⓪(WritePg;
  1660. ⓪(rxIdx:= 0;
  1661. ⓪(redraw:= TRUE
  1662. ⓪&ELSIF ch = 'I' THEN
  1663. ⓪(WriteString ('Init...');
  1664. ⓪(WriteLn;
  1665. ⓪(ALAP.Init (0, FALSE);
  1666. ⓪&ELSIF (ch >= '0') & (ch <= '9') OR (ch >= 'A') & (ch <= 'F') THEN
  1667. ⓪(Write (10C); (* BS *)
  1668. ⓪(n:= ORD (ch) - ORD ('0'); IF n > 9 THEN DEC (n, 7) END;
  1669. ⓪(IF n IN WriteRegs THEN
  1670. ⓪*WriteString ('Write Reg '); WriteNum (n, 16, 1, '0');
  1671. ⓪*WriteString ('? ');
  1672. ⓪*ReadCard (c);
  1673. ⓪*IF Done & (c <= 255) THEN
  1674. ⓪,SCC.SetReg (n, c);
  1675. ⓪*ELSE
  1676. ⓪,WriteString ('No write!'); WriteLn
  1677. ⓪*END
  1678. ⓪(END
  1679. ⓪&END;
  1680. ⓪$END;
  1681. ⓪"UNTIL quit;
  1682. ⓪"ssp:= Super (ssp)
  1683. ⓪ END LANMonitor.
  1684. ⓪ ə
  1685. (* $FFF006F0$00006FDE$FFF006F0$FFF006F0$0000798F$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$000036BC$FFF006F0$000045ED$FFF006F0$FFF006F0$FFF006F0$00007ECF$FFF006F0$00006F5F$00006E60$00003E9D$000069AB$FFF006F0$00004BE7$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$00006073$FFF006F0$FFF006F0$FFF006F0$00002864$00003546$FFF006F0$FFF006F0Ç$00000025T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$000088C1$0000524C$000063F9$00006429$0000640F$00000025$000036C5$000036EF$000036C5$000036EF$0000373A$FFF006F0$FFF006F0$0000369B$000036C8$00003547ÿÇé*)
  1686.