Previous 199869 Revisions Next

r26401 Sunday 24th November, 2013 at 21:40:39 UTC by Jürgen Buchmüller
WIP modeling the ethernet schematics
[/branches/alto2/src/emu/cpu/alto2]a2ether.c a2ether.h

branches/alto2/src/emu/cpu/alto2/a2ether.c
r26400r26401
572572void alto2_cpu_device::eth_startf()
573573{
574574   for (int sysclk = 0; sysclk < 2; sysclk++)
575   {
576      UINT8 s0, s1;
577      /*
578       * JK flip-flop 35a (SIO' and SYSCLK clocked)
579       * (Sheet 7)
580       *
581       * CLK   (SIO & SYSCLK)'
582       * J   BUS[15]
583       * K'   1
584       * S'   1
585       * C'   ERESET'
586       * Q   OCMD
587       * Q'   OCMD'
588       */
589      s0 = m_eth.ff_35a;
590      s1 = sysclk ? JKFF_CLK : JKFF_0;
591      if (X_BIT(m_bus,16,15))
592         s1 |= JKFF_J;
593      s1 |= JKFF_K;
594      s1 |= JKFF_C;      // ERESET not now
595      m_eth.ff_35a = update_jkff(s0, s1, "35a OCMD   ");
596
597      /*
598       * JK flip-flop 35b (SIO' and SYSCLK clocked)
599       * (Sheet 7)
600       *
601       * CLK   (SIO & SYSCLK)'
602       * J   BUS[14]
603       * K'   1
604       * S'   1
605       * C'   ERESET'
606       * Q   ICMD
607       * Q'   ICMD'
608       */
609      s0 = m_eth.ff_35b;
610      s1 = sysclk ? JKFF_CLK : JKFF_0;
611      if (X_BIT(m_bus,16,14))
612         s1 |= JKFF_J;
613      s1 |= JKFF_K;
614      s1 |= JKFF_C;      // ERESET not now
615      m_eth.ff_35b = update_jkff(s0, s1, "35b ICMD   ");
616   }
575      update_sysclk(sysclk);
617576   PUT_ETH_OCMD(m_eth.status, m_eth.ff_35a & JKFF_Q ? 1 : 0);
618577   PUT_ETH_ICMD(m_eth.status, m_eth.ff_35b & JKFF_Q ? 1 : 0);
619578   LOG((LOG_ETH,3, "   STARTF; ICMD=%u OCMD=%u\n", GET_ETH_ICMD(m_eth.status), GET_ETH_ICMD(m_eth.status)));
r26400r26401
878837   m_ewfct = 0;
879838}
880839
881void alto2_cpu_device::update_ether()
840/**
841 * @brief update the ethernet circuit JK flip-flops that depend on SYSCLK
842 * @param sysclk current SYSCLK level 0 or 1
843 */
844void alto2_cpu_device::update_sysclk(int sysclk)
882845{
883846   UINT8 s0, s1;
884847
885848   /*
886    * JK flip-flop 65a IDL (Sheet 10)
849    * JK flip-flop 35a (SIO' and SYSCLK clocked)
850    * (Sheet 7)
887851    *
888    * CLK   ARC'
889    * J   65b Q
852    * Note: SIO is the emulator F1 STARTF
853    *
854    * CLK   (SIO & SYSCLK)'
855    * J   BUS[15]
890856    * K'   1
891857    * S'   1
892858    * C'   ERESET'
893    * Q   IDL
894    * Q'   IDL'
859    * Q   OCMD
860    * Q'   OCMD'
895861    */
896   s0 = m_eth.ff_65a;
897   s1 = JKFF_CLK;
898   m_eth.ff_65a = update_jkff(s0, s1, "65a IDL      ");
862   s0 = m_eth.ff_35a;
863   s1 = (m_d_f1 == f1_emu_startf && sysclk) ? JKFF_CLK : JKFF_0;
864   if (X_BIT(m_bus,16,15))
865      s1 |= JKFF_J;
866   s1 |= JKFF_K;
867   s1 |= JKFF_C;      // ERESET' not now
868   m_eth.ff_35a = update_jkff(s0, s1, "35a OCMD   ");
899869
900870   /*
901    * JK flip-flop 65b IO (Sheet 10)
871    * JK flip-flop 35b (SIO' and SYSCLK clocked)
872    * (Sheet 7)
902873    *
903    * CLK   ISRFULL
904    * J   WLF
905    * K'   1
906    * S'   1
907    * C'   ERESET
908    * Q   to 65a J
909    * Q'   ---
910    */
911   s0 = m_eth.ff_65b;
912   s1 = JKFF_CLK;
913   m_eth.ff_65b = update_jkff(s0, s1, "65b IO       ");
914
915   /*
916    * JK flip-flop 77a WR (Sheet 10)
874    * Note: SIO is the emulator F1 STARTF
917875    *
918    * CLK   ARC'
919    * J   RW'
920    * K'   (WLF & BF')'
921    * S'   BUSY
922    * C'   1
923    * Q   WR'
924    * Q'   WR
925    */
926   s0 = m_eth.ff_77a;
927   s1 = JKFF_CLK;
928   m_eth.ff_77a = update_jkff(s0, s1, "77a WR       ");
929
930   /*
931    * JK flip-flop 77b WLF (Sheet 10)
932    *
933    * CLK   WLLOAD
934    * J   1
876    * CLK   (SIO & SYSCLK)'
877    * J   BUS[14]
935878    * K'   1
936879    * S'   1
937    * C'   (BUSY | WE')
938    * Q   WLF
939    * Q'   WLF'
880    * C'   ERESET'
881    * Q   ICMD
882    * Q'   ICMD'
940883    */
941   s0 = m_eth.ff_77b;
942   s1 = JKFF_CLK;
943   m_eth.ff_77b = update_jkff(s0, s1, "77b WLF      ");
884   s0 = m_eth.ff_35b;
885   s1 = (m_d_f1 == f1_emu_startf && sysclk) ? JKFF_CLK : JKFF_0;
886   if (X_BIT(m_bus,16,14))
887      s1 |= JKFF_J;
888   s1 |= JKFF_K;
889   s1 |= JKFF_C;      // ERESET' not now
890   m_eth.ff_35b = update_jkff(s0, s1, "35b ICMD   ");
944891
945892   /*
946893    * JK flip-flop 10a IBUSY (Sheet 13)
r26400r26401
954901    * Q'   IBUSY
955902    */
956903   s0 = m_eth.ff_10a;
957   s1 = JKFF_CLK;
904   s1 = sysclk ? JKFF_CLK : JKFF_0;
905   if (m_d_f2 != f2_ether_eisfct)
906      s1 |= JKFF_K;
907   s1 |= JKFF_C;
958908   m_eth.ff_10a = update_jkff(s0, s1, "10a IBUSY    ");
959909
960910   /*
911    * DEMUX 74S157 76
912    * 1A   (SYSCLK & EODFCT)'
913    * 2A   OSLOAD'
914    * 3A   OSLOAD
915    * 4A   (SYSCLK & EODFCT)'
916    * 1B   ISRFULL
917    * 2B   (SYSCLK & EIDFCT)'
918    * 3B   EILDFCTA = (EIDFCT' & EILFCT')'
919    * 4B   WLF'
920    * SEL  IBUSY
921    * 1Y   WLLOAD
922    * 2Y   RDCNT'
923    * 3Y   RR
924    * 4Y   WLL'
925    */
926   UINT8 WLLOAD;
927   UINT8 RDCNT0;
928   UINT8 RR;
929   UINT8 WLL0;
930   if (m_eth.ff_10a & JKFF_Q) {
931      WLLOAD = ~(sysclk & (m_d_f2 == f2_ether_eodfct)) & 1;
932      RDCNT0 = m_eth.ff_52b & JKFF_Q ? 1 : 0;
933      RR     = m_eth.ff_52b & JKFF_Q0 ? 1 : 0;
934      WLL0   = ~(sysclk & (m_d_f2 == f2_ether_eodfct)) & 1;
935   } else {
936      // ISRFULL
937      WLLOAD = (m_eth.serin >> 1) & 1;
938      RDCNT0 = ~(sysclk & (m_d_bs == bs_ether_eidfct)) & 1;
939      RR     = m_d_bs == bs_ether_eidfct || m_d_f1 == f1_ether_eilfct;
940      WLL0   = m_eth.ff_77b & JKFF_Q0 ? 1 : 0;
941   }
942   // TODO: use the signals
943   (void)RDCNT0;
944   (void)RR;
945   (void)WLL0;
946
947   /*
961948    * JK flip-flop 10b OBUSY (Sheet 13)
962949    *
963950    * CLK   SYSCLK'
r26400r26401
969956    * Q'   OBUSY
970957    */
971958   s0 = m_eth.ff_10b;
972   s1 = JKFF_CLK;
959   s1 = sysclk ? JKFF_CLK : JKFF_0;
960   if (m_d_f2 != f2_ether_eosfct)
961      s1 |= JKFF_K;
973962   m_eth.ff_10b = update_jkff(s0, s1, "10b OBUSY    ");
974963
975964   /*
965    * JK flip-flop 51a EWFCT latch (Sheet 19)
966    *
967    * CLK   SYSCLK'
968    * J   OCDW
969    * K'   EWFCT'
970    * S'   ERESET'
971    * C'   1
972    * Q   EWFCT latch(?)
973    * Q'   ---
974    */
975   s0 = m_eth.ff_51a;
976   s1 = sysclk ? JKFF_CLK : JKFF_0;
977   m_eth.ff_51a = update_jkff(s0, s1, "51a EWFCT_L  ");
978
979   /*
980    * JK flip-flop 31b OEOT (Sheet 19)
981    *
982    * CLK   SYSCLK'
983    * J   0
984    * K'   EEFCT'
985    * S'   ERESET'
986    * C'   1
987    * Q   OEOT'
988    * Q'   ---
989    */
990   s0 = m_eth.ff_31b;
991   s1 = sysclk ? JKFF_CLK : JKFF_0;
992   m_eth.ff_31b = update_jkff(s0, s1, "31b OEOT     ");
993
994   /*
976995    * JK flip-flop 69a IT (Sheet 14)
977996    *
978997    * CLK   ARC'
r26400r26401
9881007   m_eth.ff_69a = update_jkff(s0, s1, "69a IT       ");
9891008
9901009   /*
991    * JK flip-flop 69b INON (Sheet 14)
1010    * JK flip-flop 65a IDL (Sheet 10)
9921011    *
9931012    * CLK   ARC'
994    * J   CARRIER'
995    * K'   (IMID' & ILOC)'
1013    * J   65b Q
1014    * K'   1
9961015    * S'   1
997    * C'   IBUSY
998    * Q   INON
999    * Q'   INON'
1016    * C'   ERESET'
1017    * Q   IDL
1018    * Q'   IDL'
10001019    */
1001   s0 = m_eth.ff_69b;
1020   s0 = m_eth.ff_65a;
10021021   s1 = JKFF_CLK;
1003   m_eth.ff_69b = update_jkff(s0, s1, "69b INON     ");
1022   m_eth.ff_65a = update_jkff(s0, s1, "65a IDL      ");
10041023
10051024   /*
1006    * JK flip-flop 70a IMID (Sheet 14)
1025    * JK flip-flop 65b IO (Sheet 10)
10071026    *
1008    * CLK   RCLK
1009    * J   ISR00
1027    * CLK   ISRFULL
1028    * J   WLF
10101029    * K'   1
10111030    * S'   1
1012    * C'   INON
1013    * Q   IMID
1014    * Q'   IMID'
1031    * C'   ERESET
1032    * Q   to 65a J
1033    * Q'   ---
10151034    */
1016   s0 = m_eth.ff_70a;
1035   s0 = m_eth.ff_65b;
10171036   s1 = JKFF_CLK;
1018   m_eth.ff_70a = update_jkff(s0, s1, "70a IMID     ");
1037   m_eth.ff_65b = update_jkff(s0, s1, "65b I     ");
10191038
10201039   /*
1021    * JK flip-flop 70b ILOC (Sheet 14)
1040    * JK flip-flop 77b WLF (Sheet 10)
10221041    *
1023    * CLK   CARRIER'
1042    * CLK   WLLOAD
10241043    * J   1
10251044    * K'   1
10261045    * S'   1
1027    * C'   INON
1028    * Q   ILOC
1029    * Q'   ILOC'
1046    * C'   (BUSY | WE')
1047    * Q   WLF
1048    * Q'   WLF'
10301049    */
1031   s0 = m_eth.ff_70b;
1032   s1 = JKFF_CLK;
1033   m_eth.ff_70b = update_jkff(s0, s1, "70b ILOC     ");
1050   s0 = m_eth.ff_77b;
1051   s1 = WLLOAD ? JKFF_CLK : JKFF_0;
1052   m_eth.ff_77b = update_jkff(s0, s1, "77b WLF      ");
10341053
10351054   /*
1036    * JK flip-flop 47a OUTON (Sheet 15)
1055    * JK flip-flop 77a WR (Sheet 10)
10371056    *
1038    * CLK   RCLK
1039    * J   (ISR15 | ISRFULL)'
1040    * K'    dito
1041    * S'   INON
1057    * CLK   ARC'
1058    * J   RW'
1059    * K'   (WLF & BF')'
1060    * S'   BUSY
10421061    * C'   1
1043    * Q   ---
1044    * Q'   ISR14
1062    * Q   WR'
1063    * Q'   WR
10451064    */
1046   s0 = m_eth.ff_47a;
1065   s0 = m_eth.ff_77a;
10471066   s1 = JKFF_CLK;
1048   m_eth.ff_47a = update_jkff(s0, s1, "47a ISR14    ");
1067   if (m_eth.ff_77b)
1068   m_eth.ff_77a = update_jkff(s0, s1, "77a WR       ");
10491069
10501070   /*
1051    * JK flip-flop 47b COLL (Sheet 15)
1071    * JK flip-flop 69b INON (Sheet 14)
10521072    *
1053    * CLK   RCLK
1054    * J   RDATA
1055    * K'    dito
1073    * CLK   ARC'
1074    * J   CARRIER'
1075    * K'   (IMID' & ILOC)'
10561076    * S'   1
1057    * C'   INON
1058    * Q   ISR15
1059    * Q'   ---
1077    * C'   IBUSY
1078    * Q   INON
1079    * Q'   INON'
10601080    */
1061   s0 = m_eth.ff_47b;
1081   s0 = m_eth.ff_69b;
10621082   s1 = JKFF_CLK;
1063   m_eth.ff_47b = update_jkff(s0, s1, "47b ISR15    ");
1083   m_eth.ff_69b = update_jkff(s0, s1, "69b INON     ");
10641084
10651085   /*
1066    * JK flip-flop 52b OSLOAD (Sheet 17)
1086    * JK flip-flop 70b ILOC (Sheet 14)
10671087    *
1068    * CLK   TCLK'
1069    * J   PROM a42 O2
1070    * K'    dito
1088    * CLK   CARRIER'
1089    * J   1
1090    * K'   1
10711091    * S'   1
1072    * C'   1
1073    * Q   OSLOAD'
1074    * Q'   OSLOAD
1092    * C'   INON
1093    * Q   ILOC
1094    * Q'   ILOC'
10751095    */
1076   s0 = m_eth.ff_52b;
1096   s0 = m_eth.ff_70b;
10771097   s1 = JKFF_CLK;
1078   m_eth.ff_52b = update_jkff(s0, s1, "52b OSLOAD   ");
1098   m_eth.ff_70b = update_jkff(s0, s1, "70b ILO   ");
10791099
10801100   /*
1081    * JK flip-flop 51a EWFCT latch (Sheet 19)
1082    *
1083    * CLK   SYSCLK'
1084    * J   OCDW
1085    * K'   EWFCT'
1086    * S'   ERSET'
1087    * C'   1
1088    * Q   EWFCT latch(?)
1089    * Q'   ---
1090    */
1091   s0 = m_eth.ff_51a;
1092   s1 = JKFF_CLK;
1093   m_eth.ff_51a = update_jkff(s0, s1, "51a EWFCT_L  ");
1094
1095   /*
10961101    * JK flip-flop 51b OCDW (Sheet 19)
10971102    *
10981103    * CLK   ARC'
r26400r26401
11511156   s0 = m_eth.ff_31a;
11521157   s1 = JKFF_CLK;
11531158   m_eth.ff_31a = update_jkff(s0, s1, "31a OUTGONE  ");
1159}
11541160
1161/**
1162 * @brief update the ethernet circuit JK flip-flops that depend on RCLK
1163 * @param rclk current RCLK level 0 or 1
1164 */
1165void alto2_cpu_device::update_rclk(int rclk)
1166{
1167   UINT8 s0, s1;
1168
11551169   /*
1156    * JK flip-flop 31b OEOT (Sheet 19)
1170    * JK flip-flop 70a IMID (Sheet 14)
11571171    *
1158    * CLK   SYSCLK'
1159    * J   0
1160    * K'   EEFCT'
1161    * S'   ERESET'
1172    * CLK   RCLK
1173    * J   ISR00
1174    * K'   1
1175    * S'   1
1176    * C'   INON
1177    * Q   IMID
1178    * Q'   IMID'
1179    */
1180   s0 = m_eth.ff_70a;
1181   s1 = rclk ? JKFF_CLK : JKFF_0;
1182   m_eth.ff_70a = update_jkff(s0, s1, "70a IMID     ");
1183
1184   /*
1185    * JK flip-flop 47a OUTON (Sheet 15)
1186    *
1187    * CLK   RCLK
1188    * J   (ISR15 | ISRFULL)'
1189    * K'    dito
1190    * S'   INON
11621191    * C'   1
1163    * Q   OEOT'
1192    * Q   ---
1193    * Q'   ISR14
1194    */
1195   s0 = m_eth.ff_47a;
1196   s1 = rclk ? JKFF_CLK : JKFF_0;
1197   m_eth.ff_47a = update_jkff(s0, s1, "47a ISR14    ");
1198
1199   /*
1200    * JK flip-flop 47b COLL (Sheet 15)
1201    *
1202    * CLK   RCLK
1203    * J   RDATA
1204    * K'    dito
1205    * S'   1
1206    * C'   INON
1207    * Q   ISR15
11641208    * Q'   ---
11651209    */
1166   s0 = m_eth.ff_31b;
1167   s1 = JKFF_CLK;
1168   m_eth.ff_31b = update_jkff(s0, s1, "31b OEOT     ");
1210   s0 = m_eth.ff_47b;
1211   s1 = rclk ? JKFF_CLK : JKFF_0;
1212   m_eth.ff_47b = update_jkff(s0, s1, "47b ISR15    ");
1213}
11691214
1215/**
1216 * @brief update the ethernet circuit JK flip-flops that depend on TCLK
1217 * @param tclk current TCLK level 0 or 1
1218 */
1219void alto2_cpu_device::update_tclk(int tclk)
1220{
1221   UINT8 s0, s1;
1222
11701223   /*
1224    * JK flip-flop 52b OSLOAD (Sheet 17)
1225    *
1226    * CLK   TCLK'
1227    * J   PROM a42 O2
1228    * K'    dito
1229    * S'   1
1230    * C'   1
1231    * Q   OSLOAD'
1232    * Q'   OSLOAD
1233    */
1234   s0 = m_eth.ff_52b;
1235   s1 = tclk ? JKFF_0 : JKFF_CLK;
1236   m_eth.ff_52b = update_jkff(s0, s1, "52b OSLOAD   ");
1237
1238   /*
11711239    * JK flip-flop 61a CRCGO (Sheet 21)
11721240    *
11731241    * CLK   TCLK'
r26400r26401
11791247    * Q'   CRCGO'
11801248    */
11811249   s0 = m_eth.ff_61a;
1182   s1 = JKFF_CLK;
1250   s1 = tclk ? JKFF_0 : JKFF_CLK;
11831251   m_eth.ff_61a = update_jkff(s0, s1, "61a CRCGO    ");
11841252
11851253   /*
r26400r26401
11941262    * Q'   ---
11951263    */
11961264   s0 = m_eth.ff_61b;
1197   s1 = JKFF_CLK;
1265   s1 = tclk ? JKFF_0 : JKFF_CLK;
11981266   m_eth.ff_61b = update_jkff(s0, s1, "61b OUTRGO   ");
11991267
12001268   /*
r26400r26401
12091277    * Q'   ---
12101278    */
12111279   s0 = m_eth.ff_62a;
1212   s1 = JKFF_CLK;
1280   s1 = tclk ? JKFF_0 : JKFF_CLK;
12131281   m_eth.ff_62a = update_jkff(s0, s1, "62a OUTGO    ");
12141282
12151283   /*
r26400r26401
12241292    * Q'   OUTON'
12251293    */
12261294   s0 = m_eth.ff_62b;
1227   s1 = JKFF_CLK;
1295   s1 = tclk ? JKFF_0 : JKFF_CLK;
12281296   m_eth.ff_62b = update_jkff(s0, s1, "62b OUTON    ");
12291297}
12301298
1299
12311300/**
12321301 * @brief ethernet task slot initialization
12331302 */
branches/alto2/src/emu/cpu/alto2/a2ether.h
r26400r26401
5050};
5151
5252struct {
53   UINT32 serin;                        //!< serial input shift registers 74164 #37 and #33
5354   UINT16 fifo[ALTO2_ETHER_FIFO_SIZE];         //!< FIFO buffer
5455   UINT16 fifo_rd;                        //!< FIFO input pointer
5556   UINT16 fifo_wr;                        //!< FIFO output pointer
r26400r26401
107108void f2_late_ecbfct();                     //!< F2 func: Ethernet countdown branch function
108109void f2_late_eisfct();                     //!< F2 func: Ethernet input start function
109110void activate_eth();                     //!< called by the CPU when the Ethernet task becomes active
110void update_ether();                     //!< update all JK flip-flops for this cycle
111void update_sysclk(int sysclk);               //!< update all JK flip-flops for one cycle of SYSCLK
112void update_rclk(int rclk);                  //!< update all JK flip-flops for one cycle of RCLK
113void update_tclk(int tclk);                  //!< update all JK flip-flops for one cycle of TCLK
111114void init_ether(int task = task_ether);         //!< initialize the ethernet task
112115void exit_ether();                        //!< deinitialize the ethernet task
113116void reset_ether();                        //!< reset the ethernet task

Previous 199869 Revisions Next


© 1997-2024 The MAME Team