eth-ax88796.fs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506
  1. ( Low-level MAC actions JCB 13:23 08/24/10)
  2. ================================================================
  3. Initialization:
  4. mac-cold
  5. Packet reception and reading:
  6. mac-fullness
  7. mac-inoffset
  8. mac@
  9. macc@
  10. mac@n
  11. mac-consume
  12. Packet construction and transmission:
  13. mac-pkt-begin
  14. mac-pkt-,
  15. mac-pkt-c,
  16. mac-pkt-d,
  17. mac-pkt-2,
  18. mac-pkt-3,
  19. mac-pkt-,0
  20. mac-pkt-s,
  21. mac-pkt-src
  22. packetout-off
  23. mac!
  24. macc!
  25. mac-complete
  26. mac-checksum
  27. mac-send
  28. ================================================================
  29. ( NE2K JCB 10:23 11/08/10)
  30. : ne2sel
  31. false ether_cs_n ! ;
  32. : ne2unsel
  33. true ether_cs_n ! ;
  34. : ne2a ( a -- )
  35. pb_a ! ;
  36. : ne2rc@ ( a -- u ) \ NE2 byte reg read
  37. true ether_bhe_n !
  38. true ether_aen !
  39. ne2sel
  40. ne2a
  41. false pb_rd_n !
  42. \ pause144
  43. pb_d @ h# ff and
  44. true pb_rd_n !
  45. \ false ether_aen !
  46. \ ne2unsel
  47. ;
  48. : ne2rc! ( u a -- )
  49. \ over hex2 s" -> " type dup hex2 cr
  50. true ether_bhe_n !
  51. ne2sel
  52. ne2a
  53. pb_d !
  54. d# 0 ddir !
  55. false pb_wr_n !
  56. true pb_wr_n !
  57. \ ne2unsel
  58. d# 1 ddir !
  59. ;
  60. : ne2r! ( u a -- )
  61. over d# 8 rshift over 1+ ne2rc! ne2rc! ;
  62. : ne2r. \ dump registers
  63. d# 16 0do
  64. d# 1000 0do pause144 loop
  65. i hex2 space
  66. i ne2rc@ hex4 cr
  67. loop
  68. ;
  69. h# 00 constant ne2-CR
  70. h# 01 constant ne2-PSTART
  71. h# 01 constant ne2-PAR0
  72. h# 03 constant ne2-PAR2
  73. h# 05 constant ne2-PAR4
  74. h# 01 constant ne2-CR9346
  75. h# 02 constant ne2-PSTOP
  76. h# 03 constant ne2-BNRY
  77. h# 04 constant ne2-TSR
  78. h# 04 constant ne2-TPSR
  79. h# 05 constant ne2-TBCR0
  80. h# 05 constant ne2-NCR
  81. h# 06 constant ne2-CPR
  82. h# 06 constant ne2-TBCR1
  83. h# 07 constant ne2-ISR
  84. h# 07 constant ne2-CURR
  85. h# 08 constant ne2-RSAR0
  86. h# 08 constant ne2-CRDA0
  87. h# 09 constant ne2-RSAR1
  88. h# 09 constant ne2-CRDA1
  89. h# 0A constant ne2-RBCR0
  90. h# 0B constant ne2-RBCR1
  91. h# 0C constant ne2-RSR
  92. h# 0C constant ne2-RCR
  93. h# 0D constant ne2-TCR
  94. h# 0D constant ne2-CNTR0
  95. h# 0E constant ne2-DCR
  96. h# 0E constant ne2-CNTR1
  97. h# 0F constant ne2-IMR
  98. h# 0F constant ne2-CNTR2
  99. h# 10 constant ne2-RDMAPORT
  100. h# 14 constant ne2-MIIEEP
  101. h# 15 constant ne2-TR
  102. h# 17 constant ne2-GPOC
  103. h# 17 constant ne2-GPI
  104. h# 1F constant ne2-RSTPORT
  105. : ne2-page0 h# 22 ne2-CR ne2rc! ;
  106. : ne2-page1 h# 62 ne2-CR ne2rc! ;
  107. : ne2-clrisr \ clear the ISR
  108. h# ff ne2-ISR ne2rc! ;
  109. : ne2r.2
  110. s" Page 0" type cr
  111. ne2-page0
  112. ne2r.
  113. s" Page 1" type cr
  114. ne2-page1
  115. ne2r.
  116. ne2-page0 ;
  117. ( The MII interface JCB 12:47 11/09/10)
  118. h# 08 constant MII_EEP_MDO
  119. h# 04 constant MII_EEP_MDI
  120. h# 01 constant MII_EEP_MDC
  121. : eep-on ( u ) ne2-MIIEEP ne2rc@ or ne2-MIIEEP ne2rc! ;
  122. : eep-off ( u ) invert ne2-MIIEEP ne2rc@ and ne2-MIIEEP ne2rc! ;
  123. : miix ( u c -- u ) \ Send c bit data u
  124. tuck
  125. d# 16 swap - lshift
  126. swap
  127. 0do
  128. MII_EEP_MDO over 0< if
  129. eep-on
  130. else
  131. eep-off
  132. then
  133. MII_EEP_MDC eep-on \ clock up
  134. 2*
  135. ne2-MIIEEP ne2rc@ MII_EEP_MDI and if 1+ then
  136. MII_EEP_MDC eep-off \ clock down
  137. loop
  138. ;
  139. : phy@ ( a -- u )
  140. h# ffff d# 16 miix drop
  141. h# ffff d# 16 miix drop
  142. h# 0d0 d# 9 miix drop
  143. d# 5 miix drop
  144. h# 0 d# 1 miix drop
  145. h# 0 d# 16 miix
  146. ;
  147. : phy! ( u a -- )
  148. h# ffff d# 16 miix drop
  149. h# ffff d# 16 miix drop
  150. h# 0b0 d# 9 miix drop
  151. d# 5 miix drop
  152. h# 2 d# 2 miix drop
  153. d# 16 miix drop
  154. ;
  155. : phy.
  156. d# 32 0do
  157. i hex2 space i phy@ hex4 cr
  158. loop
  159. cr
  160. ;
  161. : phy-cold
  162. \ h# b000 d# 0 phy!
  163. h# 0800 d# 0 phy!
  164. s" PHY power down for 2.5s" type cr
  165. d# 2500000. sleepus
  166. \ h# 1200 d# 0 phy!
  167. h# 0000 d# 0 phy!
  168. exit
  169. sleep1
  170. sleep1
  171. sleep1
  172. sleep1
  173. sleep1
  174. sleep1
  175. \ h# 6030 d# 30 phy!
  176. phy. sleep1
  177. cr
  178. phy.
  179. ;
  180. : mac-cold ( ethaddr -- )
  181. false RESET_TRIGGER !
  182. sleep1
  183. true RESET_TRIGGER !
  184. sleep1
  185. true pb_rd_n !
  186. true pb_wr_n !
  187. true ether_cs_n !
  188. false ether_aen !
  189. true ether_bhe_n !
  190. d# 0 pb_a !
  191. d# 1 ddir !
  192. \ d# 4 0do ne2-RSTPORT ne2rc@ ne2-RSTPORT ne2rc! sleep1 loop
  193. phy-cold
  194. \ Wait for TR RST_B to go low and GPI link up
  195. s" TR GPI" type cr
  196. begin
  197. ne2-TR ne2rc@ hex2 d# 3 spaces
  198. ne2-GPI ne2rc@ hex2 d# 3 spaces
  199. sleep.1
  200. cr
  201. ne2-TR ne2rc@ d# 2 and 0=
  202. ne2-GPI ne2rc@ d# 1 and 0<> and
  203. until
  204. \ Wait for TR RST_B to go low
  205. \ begin
  206. \ sleep1
  207. \ ne2-TR ne2rc@ dup hex2 cr
  208. \ d# 2 and 0=
  209. \ until
  210. true if
  211. h# 21 ne2-CR ne2rc! \ Stop the NIC, abort DMA, page 0
  212. h# 00 ne2-DCR ne2rc! \ Selects byte-wide DMA transfers
  213. h# 00 ne2-RBCR0 ne2rc! \ Load data byte count for remote DMA
  214. h# 00 ne2-RBCR1 ne2rc!
  215. h# 20 ne2-RCR ne2rc! \ Temporarily set receiver to monitor mode
  216. h# 02 ne2-TCR ne2rc! \ Transmitter set to internal loopback mode
  217. \ Initialize Receive Buffer Ring: Boundary Pointer
  218. \ (BNDRY), Page Start (PSTART), and Page Stop
  219. \ (PSTOP)
  220. h# 46 ne2-PSTART ne2rc!
  221. h# 46 ne2-BNRY ne2rc!
  222. h# 80 ne2-PSTOP ne2rc!
  223. h# ff ne2-ISR ne2rc! \ Clear Interrupt Status Register (ISR) by writing 0FFh to it.
  224. h# 01 ne2-IMR ne2rc! \ Initialize interrupt mask
  225. h# 61 ne2-CR ne2rc! \ Stop the NIC, abort DMA, page 1
  226. h# 12 d# 1 ne2rc! \ Set Physical Address
  227. h# 34 d# 2 ne2rc!
  228. h# 56 d# 3 ne2rc!
  229. h# 77 d# 4 ne2rc!
  230. h# 77 d# 5 ne2rc!
  231. h# 77 d# 6 ne2rc!
  232. d# 16 d# 8 do \ Set multicast address
  233. h# 00 i ne2rc!
  234. loop
  235. h# 47 ne2-CURR ne2rc! \ Initialize CURRent pointer
  236. h# 22 ne2-CR ne2rc! \ Start the NIC, Abort DMA, page 0
  237. h# 10 ne2-GPOC ne2rc! \ Select media interface
  238. s" GPI = " type ne2-GPI ne2rc@ hex2 cr
  239. h# 00 ne2-TCR ne2rc! \ Transmitter full duplex
  240. h# 04 ne2-RCR ne2rc! \ Enable receiver and set accept broadcast
  241. else
  242. h# 21 ne2-CR ne2rc! \ Stop the NIC, abort DMA, page 0
  243. sleep.1
  244. h# 00 ne2-DCR ne2rc! \ Selects word-wide DMA transfers
  245. h# 00 ne2-RBCR0 ne2rc! \ Load data byte count for remote DMA
  246. h# 00 ne2-RBCR1 ne2rc!
  247. h# 20 ne2-RCR ne2rc! \ Temporarily set receiver to monitor mode
  248. h# 02 ne2-TCR ne2rc! \ Transmitter set to internal loopback mode
  249. h# 40 ne2-TPSR ne2rc! \ Set Tx start page
  250. \ Initialize Receive Buffer Ring: Boundary Pointer
  251. \ (BNDRY), Page Start (PSTART), and Page Stop
  252. \ (PSTOP)
  253. h# 46 ne2-PSTART ne2rc!
  254. h# 46 ne2-BNRY ne2rc!
  255. h# 80 ne2-PSTOP ne2rc!
  256. h# ff ne2-ISR ne2rc! \ Clear Interrupt Status Register (ISR) by writing 0FFh to it.
  257. h# 01 ne2-IMR ne2rc! \ Initialize interrupt mask
  258. h# 61 ne2-CR ne2rc! \ Stop the NIC, abort DMA, page 1
  259. sleep.1
  260. h# 12 d# 1 ne2rc! \ Set Physical Address
  261. h# 34 d# 2 ne2rc!
  262. h# 56 d# 3 ne2rc!
  263. h# 77 d# 4 ne2rc!
  264. h# 77 d# 5 ne2rc!
  265. h# 77 d# 6 ne2rc!
  266. d# 16 d# 8 do \ Set multicast address
  267. h# ff i ne2rc!
  268. loop
  269. h# 47 ne2-CURR ne2rc! \ Initialize CURRent pointer
  270. h# 20 ne2-CR ne2rc! \ DMA abort, page 0
  271. h# 10 ne2-GPOC ne2rc! \ Select media interface
  272. s" GPI = " type ne2-GPI ne2rc@ hex2 cr
  273. h# 1c ne2-RCR ne2rc! \ Enable receiver and set accept broadcast
  274. h# 00 ne2-TCR ne2rc! \ Transmitter full duplex
  275. h# ff ne2-ISR ne2rc! \ Clear Interrupt Status Register (ISR) by writing 0FFh to it.
  276. h# 22 ne2-CR ne2rc! \ Start the NIC, Abort DMA, page 0
  277. then
  278. ;
  279. : NicCompleteDma
  280. h# 22 ne2-CR ne2rc! \ Complete remote DMA
  281. ;
  282. : maca ( a -- ) \ set DMA address a
  283. dup d# 8 rshift ne2-RSAR1 ne2rc! ne2-RSAR0 ne2rc! ;
  284. : mac1b \ set DMA transfer for 1 byte
  285. h# 01 ne2-RBCR0 ne2rc!
  286. h# 00 ne2-RBCR1 ne2rc! ;
  287. : mac2b \ set DMA transfer for 2 bytes
  288. h# 02 ne2-RBCR0 ne2rc!
  289. h# 00 ne2-RBCR1 ne2rc! ;
  290. : macc@ ( a -- u )
  291. maca mac1b
  292. h# 0a ne2-CR ne2rc! \ running, DMA read
  293. ne2-RDMAPORT ne2rc@
  294. NicCompleteDma ;
  295. : macc! ( u a -- )
  296. maca mac1b
  297. h# 12 ne2-CR ne2rc! \ running, DMA write
  298. ne2-RDMAPORT ne2rc! ;
  299. : mac@ ( a -- u )
  300. maca mac2b
  301. h# 0a ne2-CR ne2rc! \ running, DMA read
  302. ne2-RDMAPORT ne2rc@ d# 8 lshift ne2-RDMAPORT ne2rc@ or
  303. NicCompleteDma ;
  304. : mac! ( u a -- )
  305. maca mac2b
  306. h# 12 ne2-CR ne2rc! \ running, DMA write
  307. dup d# 8 rshift ne2-RDMAPORT ne2rc! ne2-RDMAPORT ne2rc! ;
  308. : mac-dump ( a u -- )
  309. bounds
  310. begin
  311. 2dup u>
  312. while
  313. dup h# f and 0= if
  314. cr dup hex4 [char] : emit space
  315. then
  316. dup mac@ hex4 space
  317. 2+
  318. repeat 2drop cr ;
  319. variable currpkt
  320. : mac-inoffset ( u -- u ) \ compute offset into current incoming packet
  321. currpkt @ +
  322. dup 0< if
  323. h# 8000 -
  324. h# 4600 +
  325. then
  326. ;
  327. : mac@n ( n addr -- d0 .. dn )
  328. swap 0do dup mac@ swap 2+ loop drop ;
  329. ( words for constructing packet data JCB 07:01 08/20/10)
  330. variable writer
  331. : mac-pkt-begin h# 4000 writer ! ;
  332. : bump ( n -- ) writer +! ;
  333. : mac-pkt-c, ( n -- ) writer @ macc! d# 1 bump ;
  334. : mac-pkt-, ( n -- ) writer @ mac! d# 2 bump ;
  335. : mac-pkt-d, ( d -- ) mac-pkt-, mac-pkt-, ;
  336. : mac-pkt-2, ( n0 n1 -- ) swap mac-pkt-, mac-pkt-, ;
  337. : mac-pkt-3, rot mac-pkt-, mac-pkt-2, ;
  338. : mac-pkt-,0 ( n -- ) 0do d# 0 mac-pkt-, loop ;
  339. : mac-pkt-s, ( caddr u -- )
  340. 0do
  341. dup c@
  342. mac-pkt-c,
  343. 1+
  344. loop
  345. drop
  346. ;
  347. : mac-pkt-src ( n offset -- ) \ copy n words from incoming+offset
  348. swap 0do
  349. dup mac-inoffset mac@ mac-pkt-,
  350. 2+
  351. loop
  352. drop
  353. ;
  354. : mac-pkt-complete ( -- length ) \ set up size
  355. writer @ h# 4000 -
  356. \ h# 4000 over mac-dump
  357. dup ne2-TBCR0 ne2r! ;
  358. : mac-checksum ( addr nwords -- sum )
  359. d# 0 swap
  360. 0do
  361. over mac@ ( addr sum v )
  362. +1c
  363. swap 2+ swap
  364. loop
  365. nip
  366. invert
  367. ;
  368. : mac-snap
  369. s" CR PSTART PSTOP BNRY TSR NCR CPR ISR CRDA0 CRDA1 - - RSR CNTR0 CNTR1 CNTR2" type cr
  370. d# 16 0do
  371. i ne2rc@ hex2 d# 5 spaces
  372. loop
  373. ;
  374. : mac-fullness ( -- f )
  375. ether_irq @ if
  376. ne2-BNRY ne2rc@ 1+ ne2-CPR ne2rc@ <> dup if
  377. \ mac-snap
  378. ne2-BNRY ne2rc@ 1+ d# 8 lshift d# 4 + currpkt !
  379. \ s" currpkt=" type currpkt @ hex4 space
  380. \ currpkt @ d# 4 - macc@ hex2
  381. \ cr
  382. \ currpkt @ d# 4 - d# 16 mac-dump
  383. else
  384. ne2-clrisr
  385. then
  386. else
  387. false
  388. then
  389. ;
  390. : mac-consume ( -- ) \ finished with current packet, move on
  391. ne2-BNRY ne2rc@ 1+ d# 8 lshift 1+ macc@ \ next pkt
  392. 1- ne2-BNRY ne2rc!
  393. ;
  394. variable ne2cold
  395. : mac-send
  396. ne2cold @ 0= if
  397. h# 21 ne2-CR ne2rc!
  398. h# 22 ne2-CR ne2rc!
  399. true ne2cold !
  400. then
  401. h# 40 ne2-TPSR ne2rc!
  402. h# 26 ne2-CR ne2rc! \ START
  403. ;
  404. : packetout-off \ compute offset in output packet
  405. h# 4000 + ;
  406. : nicwork
  407. \ ISA mode
  408. \ begin
  409. s" TR= " type h# 15 ne2rc@ hex2 space
  410. s" ether_irq=" type ether_irq @ hex1 space
  411. s" ISR=" type ne2-ISR ne2rc@ hex2 space
  412. cr
  413. \ again
  414. false if
  415. h# 0000 ne2-RSAR0 ne2r!
  416. cr
  417. d# 16 0do
  418. ne2-RDMAPORT ne2rc@ hex2 space
  419. loop
  420. cr
  421. then
  422. s" CR PSTART PSTOP BNRY TSR NCR CPR ISR CRDA0 CRDA1 - - RSR CNTR0 CNTR1 CNTR2" type cr
  423. begin
  424. d# 16 0do
  425. i ne2rc@ hex2 d# 5 spaces
  426. loop
  427. ether_irq @ hex1
  428. cr
  429. sleep1
  430. ne2-CPR ne2rc@ h# 47 <>
  431. until
  432. \ h# 4700 h# 100 mac-dump
  433. \ cr
  434. \ h# 0947 h# 4700 mac!
  435. \ h# 4700 h# 100 mac-dump
  436. ;