Previous 199869 Revisions Next

r26137 Wednesday 13th November, 2013 at 16:36:30 UTC by Jürgen Buchmüller
Add missing memory mapped i/o hardware and keyboard. Debug log the JK-FF toggling.
[/branches/alto2/src/emu/cpu]cpu.mak
[/branches/alto2/src/emu/cpu/alto2]a2curt.c a2dht.c a2disk.c a2disp.c a2dwt.c a2emu.c a2ether.c a2hw.c* a2kbd.c* a2ksec.c a2mem.c a2ram.c a2roms.c a2roms.h alto2.c alto2.h
[/branches/alto2/src/emu/machine]diablo_hd.h
[/branches/alto2/src/mess/includes]alto2.h

branches/alto2/src/emu/machine/diablo_hd.h
r26136r26137
2929   diablo_hd_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
3030   ~diablo_hd_device();
3131
32   static const int DIABLO_UNIT_MAX = 2;         //!< max number of drive units
33   static const int DIABLO_CYLINDERS = 203;      //!< number of cylinders per drive
34   static const int DIABLO_CYLINDER_MASK = 0777;   //!< bit maks for cylinder number (9 bits)
35   static const int DIABLO_SPT = 12;            //!< number of sectors per track
36   static const int DIABLO_SECTOR_MASK = 017;      //!< bit maks for cylinder number (4 bits)
37   static const int DIABLO_HEADS = 2;            //!< number of heads per drive
38   static const int DIABLO_HEAD_MASK = 1;         //!< bit maks for cylinder number (4 bits)
39   static const int DIABLO_PAGES = 203*2*12;      //!< number of pages per drive
40   //! convert a cylinder/head/sector to a logical block address (page)
41   static inline int DRIVE_PAGE(int c,int h,int s)   { return (c * DIABLO_HEADS + h) * DIABLO_SPT + s; }
42
3243   void set_sector_callback(void* cookie, void(*callback)(void*, int));
3344
3445   int bits_per_sector() const;
r26136r26137
7182#else
7283#   define   LOG_DRIVE(x)
7384#endif
74
75   static const int DIABLO_UNIT_MAX = 2;         //!< max number of drive units
76   static const int DIABLO_CYLINDERS = 203;      //!< number of cylinders per drive
77   static const int DIABLO_CYLINDER_MASK = 0777;   //!< bit maks for cylinder number (9 bits)
78   static const int DIABLO_SPT = 12;            //!< number of sectors per track
79   static const int DIABLO_SECTOR_MASK = 017;      //!< bit maks for cylinder number (4 bits)
80   static const int DIABLO_HEADS = 2;            //!< number of heads per drive
81   static const int DIABLO_HEAD_MASK = 1;         //!< bit maks for cylinder number (4 bits)
82   static const int DIABLO_PAGES = 203*2*12;      //!< number of pages per drive
83   //! convert a cylinder/head/sector to a logical block address (page)
84   static inline int DRIVE_PAGE(int c,int h,int s)   { return (c * DIABLO_HEADS + h) * DIABLO_SPT + s; }
85
8685   bool m_diablo31;                  //!< true, if this is a DIABLO31 drive
8786   int m_unit;                        //!< drive unit number (0 or 1)
8887   char m_description[32];               //!< description of the drive(s)
branches/alto2/src/emu/cpu/alto2/a2curt.c
r26136r26137
2525void alto2_cpu_device::f2_load_xpreg_1()
2626{
2727   m_dsp.xpreg = A2_GET32(m_bus,16,6,15);
28   LOG((LOG_CURT,2,"   XPREG<- BUS[6-15] (%#o)\n", m_dsp.xpreg));
28   LOG((LOG_CURT,2,"   XPREG BUS[6-15] (%#o)\n", m_dsp.xpreg));
2929}
3030
3131/**
r26136r26137
4848void alto2_cpu_device::f2_load_csr_1()
4949{
5050   m_dsp.csr = m_bus;
51   LOG((LOG_CURT,2,"   CSR<- BUS (%#o)\n", m_dsp.csr));
51   LOG((LOG_CURT,2,"   CSR BUS (%#o)\n", m_dsp.csr));
5252   int x = 1023 - m_dsp.xpreg; \
5353   m_dsp.curdata = m_dsp.csr << (16 - (x & 15)); \
5454   m_dsp.curword = x / 16; \
branches/alto2/src/emu/cpu/alto2/a2hw.c
r0r26137
1/*****************************************************************************
2 *
3 *   Portable Xerox AltoII memory mapped I/O hardware
4 *
5 *   Copyright: Juergen Buchmueller <pullmoll@t-online.de>
6 *
7 *   Licenses: MAME, GPLv2
8 *
9 *****************************************************************************/
10#include "alto2.h"
11
12/**
13 * @brief read the UTILIN port
14 *
15 * @param addr memory mapped I/O address to be read
16 * @return current value on the UTILIN port
17 */
18UINT16 alto2_cpu_device::utilin_r(UINT32 addr)
19{
20   UINT16  data;
21   // FIXME: update the printer status
22   // printer_read();
23
24   data = m_hw.utilin;
25
26   LOG((LOG_HW,2,"   read UTILIN %#o (%#o)\n", addr, data));
27   return data;
28}
29
30/**
31 * @brief read the XBUS port
32 *
33 * @param addr memory mapped I/O address to be read
34 * @return current value on the XBUS port latch
35 */
36UINT16 alto2_cpu_device::xbus_r(UINT32 addr)
37{
38   UINT16 data = m_hw.xbus[addr & 3];
39
40   LOG((LOG_HW,2,"   read XBUS[%d] %#o (%#o)\n", addr&3, addr, data));
41   return data;
42}
43
44/**
45 * @brief write the XBUS port
46 *
47 * The actual outputs are active-low.
48 *
49 * @param addr memory mapped I/O address to be read
50 * @param data value to write to the XBUS port latch
51 */
52void alto2_cpu_device::xbus_w(UINT32 addr, UINT16 data)
53{
54   LOG((LOG_HW,2,"   write XBUS[%d] %#o (%#o)\n", addr & 3, addr, data));
55   m_hw.xbus[addr&3] = data;
56}
57
58/**
59 * @brief read the UTILOUT port
60 *
61 * @param addr memory mapped I/O address to be read
62 * @return current value on the UTILOUT port latch
63 */
64UINT16 alto2_cpu_device::utilout_r(UINT32 addr)
65{
66   UINT16 data = m_hw.utilout ^ 0177777;
67   LOG((0,2,"   read UTILOUT %#o (%#o)\n", addr, data));
68   return data;
69}
70
71/**
72 * @brief write the UTILOUT port
73 *
74 * The actual outputs are active-low.
75 *
76 * @param addr memory mapped I/O address to be read
77 * @param data value to write to the UTILOUT port latch
78 */
79void alto2_cpu_device::utilout_w(UINT32 addr, UINT16 data)
80{
81   LOG((LOG_HW,2,"   write UTILOUT %#o (%#o)\n", addr, data));
82   m_hw.utilout = data ^ 0177777;
83
84   // FIXME: write printer data
85   // printer_write();
86}
87
88/**
89 * @brief clear all keys and install the mmio handler for KBDAD to KBDAD+3
90 */
91void alto2_cpu_device::init_hardware()
92{
93   memset(&m_hw, 0, sizeof(m_hw));
94
95   // open inputs on UTILIN
96   m_hw.utilin = 0177777;
97
98   // open inputs on the XBUS (?)
99   m_hw.xbus[0] = 0177777;
100   m_hw.xbus[1] = 0177777;
101   m_hw.xbus[2] = 0177777;
102   m_hw.xbus[3] = 0177777;
103
104   // install memory handlers
105   install_mmio_fn(0177016, 0177016, &alto2_cpu_device::utilout_r, &alto2_cpu_device::utilout_w);
106   install_mmio_fn(0177020, 0177023, &alto2_cpu_device::xbus_r, &alto2_cpu_device::xbus_w);
107   install_mmio_fn(0177030, 0177033, &alto2_cpu_device::utilin_r, 0);
108}
109
Property changes on: branches/alto2/src/emu/cpu/alto2/a2hw.c
Added: svn:eol-style
   + native
Added: svn:mime-type
   + text/plain
branches/alto2/src/emu/cpu/alto2/a2mem.c
r26136r26137
451451         LOG((LOG_MEM,5,"   memory error at dword addr:%07o data:%011o check:%03o\n", dw_addr * 2, dw_data, hpb));
452452         LOG((LOG_MEM,6,"   MEAR: %06o\n", m_mem.mear));
453453         LOG((LOG_MEM,6,"   MESR: %06o\n", m_mem.mesr ^ 0177777));
454         LOG((LOG_MEM,6,"      Hamming code read    : %#o\n", GET_MESR_HAMMING(m_mem.mesr)));
455         LOG((LOG_MEM,6,"      Parity error         : %o\n", GET_MESR_PERR(m_mem.mesr)));
456         LOG((LOG_MEM,6,"      Memory parity bit    : %o\n", GET_MESR_PARITY(m_mem.mesr)));
457         LOG((LOG_MEM,6,"      Hamming syndrome     : %#o (bit #%d)\n", GET_MESR_SYNDROME(m_mem.mesr), hamming_lut[GET_MESR_SYNDROME(m_mem.mesr)]));
458         LOG((LOG_MEM,6,"      Memory bank          : %#o\n", GET_MESR_BANK(m_mem.mesr)));
454         LOG((LOG_MEM,7,"      Hamming code read    : %#o\n", GET_MESR_HAMMING(m_mem.mesr)));
455         LOG((LOG_MEM,7,"      Parity error         : %o\n", GET_MESR_PERR(m_mem.mesr)));
456         LOG((LOG_MEM,7,"      Memory parity bit    : %o\n", GET_MESR_PARITY(m_mem.mesr)));
457         LOG((LOG_MEM,7,"      Hamming syndrome     : %#o (bit #%d)\n", GET_MESR_SYNDROME(m_mem.mesr), hamming_lut[GET_MESR_SYNDROME(m_mem.mesr)]));
458         LOG((LOG_MEM,7,"      Memory bank          : %#o\n", GET_MESR_BANK(m_mem.mesr)));
459459         LOG((LOG_MEM,6,"   MECR: %06o\n", m_mem.mecr ^ 0177777));
460         LOG((LOG_MEM,6,"      Test Hamming code    : %#o\n", GET_MECR_TEST_CODE(m_mem.mecr)));
461         LOG((LOG_MEM,6,"      Test mode            : %s\n", GET_MECR_TEST_MODE(m_mem.mecr) ? "on" : "off"));
462         LOG((LOG_MEM,6,"      INT on single-bit err: %s\n", GET_MECR_INT_SBERR(m_mem.mecr) ? "on" : "off"));
463         LOG((LOG_MEM,6,"      INT on double-bit err: %s\n", GET_MECR_INT_DBERR(m_mem.mecr) ? "on" : "off"));
464         LOG((LOG_MEM,6,"      Error correction     : %s\n", GET_MECR_ERRCORR(m_mem.mecr) ? "off" : "on"));
460         LOG((LOG_MEM,7,"      Test Hamming code    : %#o\n", GET_MECR_TEST_CODE(m_mem.mecr)));
461         LOG((LOG_MEM,7,"      Test mode            : %s\n", GET_MECR_TEST_MODE(m_mem.mecr) ? "on" : "off"));
462         LOG((LOG_MEM,7,"      INT on single-bit err: %s\n", GET_MECR_INT_SBERR(m_mem.mecr) ? "on" : "off"));
463         LOG((LOG_MEM,7,"      INT on double-bit err: %s\n", GET_MECR_INT_DBERR(m_mem.mecr) ? "on" : "off"));
464         LOG((LOG_MEM,7,"      Error correction     : %s\n", GET_MECR_ERRCORR(m_mem.mecr) ? "off" : "on"));
465465      }
466466      if (-1 == hamming_lut[syndrome]) {
467467         /* double-bit error: wake task_part, if we're told so */
r26136r26137
629629       * starting a memory refresh cycle
630630       * currently we don't do anything special
631631       */
632      LOG((LOG_MEM,5, "   MAR<-; refresh cycle @ %#o\n", addr));
632      LOG((LOG_MEM,5, "   MAR; refresh cycle @ %#o\n", addr));
633633   } else if (addr < ALTO2_RAM_SIZE) {
634      LOG((LOG_MEM,2, "   MAR<-; mar = %#o\n", addr));
634      LOG((LOG_MEM,2, "   MAR; mar = %#o\n", addr));
635635      m_mem.access = ALTO2_MEM_RAM;
636636      m_mem.mar = addr;
637637      /* fetch memory double-word to read/write latches */
branches/alto2/src/emu/cpu/alto2/a2ram.c
r26136r26137
2323   if (reg) {
2424      UINT8 bank = m_s_reg_bank[m_task];
2525      r = m_s[bank][reg];
26      LOG((LOG_RAM,2,"   <-S%02o; bus &= S[%o][%02o] (%#o)\n", reg, bank, reg, r));
26      LOG((LOG_RAM,2,"   S%02o; bus &= S[%o][%02o] (%#o)\n", reg, bank, reg, r));
2727   } else {
2828      r = m_m;
29      LOG((LOG_RAM,2,"   <-S%02o; bus &= M (%#o)\n", reg, r));
29      LOG((LOG_RAM,2,"   S%02o; bus &= M (%#o)\n", reg, r));
3030   }
3131   m_bus &= r;
3232}
r26136r26137
3737void alto2_cpu_device::bs_load_sreg_0()
3838{
3939   int r = 0;   /* ??? */
40   LOG((LOG_RAM,2,"   S%02o<- BUS &= garbage (%#o)\n", MIR_RSEL(m_mir), r));
40   LOG((LOG_RAM,2,"   S%02o BUS &= garbage (%#o)\n", MIR_RSEL(m_mir), r));
4141   m_bus &= r;
4242}
4343
r26136r26137
4949   UINT8 reg = MIR_RSEL(m_mir);
5050   UINT8 bank = m_s_reg_bank[m_task];
5151   m_s[bank][reg] = m_m;
52   LOG((LOG_RAM,2,"   S%02o<- S[%o][%02o] := %#o\n", reg, bank, reg, m_m));
52   LOG((LOG_RAM,2,"   S%02o S[%o][%02o] := %#o\n", reg, bank, reg, m_m));
5353}
5454
5555/**
r26136r26137
252252/**
253253 * @brief f1_load_rmr late: load the reset mode register
254254 *
255 * F1=013 corresponds to RMR<- in the emulator. In Altos with the 3K
256 * RAM option, F1=013 performs RMR<- in all RAM-related tasks, including
255 * F1=013 corresponds to RMR← in the emulator. In Altos with the 3K
256 * RAM option, F1=013 performs RMR← in all RAM-related tasks, including
257257 * the emulator.
258258 */
259259void alto2_cpu_device::f1_load_rmr_1()
260260{
261   LOG((LOG_RAM,2,"   RMR<-; BUS (%#o)\n", m_bus));
261   LOG((LOG_RAM,2,"   RMR; BUS (%#o)\n", m_bus));
262262   m_reset_mode = m_bus;
263263}
264264#else   // ALTO2_UCODE_RAM_PAGES != 3
r26136r26137
268268void alto2_cpu_device::f1_load_srb_1()
269269{
270270   m_s_reg_bank[m_task] = A2_GET16(m_bus,16,12,14) % ALTO2_SREG_BANKS;
271   LOG((LOG_RAM,2,"   SRB<-; srb[%d] := %#o\n", m_task, m_s_reg_bank[m_task]));
271   LOG((LOG_RAM,2,"   SRB; srb[%d] := %#o\n", m_task, m_s_reg_bank[m_task]));
272272}
273273#endif
274274
branches/alto2/src/emu/cpu/alto2/a2dht.c
r26136r26137
3232{
3333   UINT16 r = A2_GET32(m_bus,16,0,0);
3434   m_dsp.setmode = m_bus;
35   LOG((LOG_DHT,2,"   SETMODE<- BUS (%#o), branch on BUS[0] (%#o | %#o)\n", m_bus, m_next2, r));
35   LOG((LOG_DHT,2,"   SETMODE BUS (%#o), branch on BUS[0] (%#o | %#o)\n", m_bus, m_next2, r));
3636   m_next2 |= r;
3737}
3838
branches/alto2/src/emu/cpu/alto2/a2roms.c
r26136r26137
6060 * @param base ROM base address in memory
6161 * @param type one of 1 for UINT8, 2 for UINT16, 4 for UINT32
6262 * @param addr address offset into base
63 * @param dand value to AND to contents before ORing
64 * @param dor value to OR before writing back
63 * @param dand value to AND to contents before XORing
64 * @param dxor value to XOR before writing back
6565 */
6666static void write_type_and_xor(void *base, int type, UINT32 addr, UINT32 dand, UINT32 dxor)
6767{
r26136r26137
9090   }
9191}
9292
93/**
94 * @brief load a PROM from a (list of) source region(s) shifting, swapping and inverting address and data bits
95 * @param prom PROM loading definition
96 * @param src source ROM region where to load data from
97 * @param pages number of pages of definitions
98 * @param segments number of segments in one page of the result
99 * @return pointer to the newly allocated memory filled with source bits
100 */
93101UINT8* prom_load(const prom_load_t* prom, const UINT8* src, int pages, int segments)
94102{
95103   void* array = 0;
branches/alto2/src/emu/cpu/alto2/a2ksec.c
r26136r26137
99 *****************************************************************************/
1010#include "alto2.h"
1111
12/** @brief block the disk sector task */
12//! f1_ksec_block early: block the disk sector task
1313void alto2_cpu_device::f1_ksec_block_0()
1414{
1515   LOG((LOG_KSEC,2,"   BLOCK %s\n", task_name(m_task)));
1616   disk_block(m_task);
1717}
1818
19/**
20 * @brief disk sector task slot initialization
21 */
19//! disk sector task slot initialization
2220void alto2_cpu_device::init_ksec(int task)
2321{
2422   set_bs(task, bs_ksec_read_kstat,   &alto2_cpu_device::bs_read_kstat_0, 0);
branches/alto2/src/emu/cpu/alto2/a2roms.h
r26136r26137
1818   UINT8 width;         //!< width in bits
1919   UINT8 shift;         //!< left shift in bits
2020   const UINT8 dmap[16];   //!< data bit mapping
21   UINT32 dand;         //!< ANDing destination with this value, before ORing the data
21   UINT32 dand;         //!< ANDing destination with this value, before XORing the data
2222   size_t type;         //!< type of the destination, i.e. sizeof(type)
2323}   prom_load_t;
2424
branches/alto2/src/emu/cpu/alto2/a2emu.c
r26136r26137
164164 * From the schematics: 08_ALU, page 6 (PDF page 4)
165165 *
166166 * EMACT            emulator task active
167 * F2[0-2]=111b     <-ACSOURCE and F2_17
168 * F2[0-2]=101b     DNS<- and ACDEST<-
167 * F2[0-2]=111b     ←ACSOURCE and F2_17
168 * F2[0-2]=101b     DNS← and ACDEST←
169169 *
170170 *  u49 (8 input NAND 74S30)
171171 *  ----------------------------------------------
r26136r26137
254254 *
255255 * The high order bits of IR cannot be read directly, but the
256256 * displacement field of IR (8 low order bits) may be read with
257 * the <-DISP bus source. If the X field of the instruction is
257 * the DISP bus source. If the X field of the instruction is
258258 * zero (i.e., it specifies page 0 addressing), then the DISP
259259 * field of the instruction is put on BUS[8-15] and BUS[0-7]
260260 * is zeroed. If the X field of the instruction is non-zero
r26136r26137
268268   if (IR_X(m_emu.ir)) {
269269      r = ((signed char)r) & 0177777;
270270   }
271   LOG((LOG_EMU,2, "   <-DISP (%06o)\n", r));
271   LOG((LOG_EMU,2, "   DISP (%06o)\n", r));
272272   m_bus &= r;
273273}
274274
r26136r26137
302302 */
303303void alto2_cpu_device::f1_emu_load_rmr_1()
304304{
305   LOG((LOG_EMU,2,"   RMR<-; BUS (%#o)\n", m_bus));
305   LOG((LOG_EMU,2,"   RMR; BUS (%#o)\n", m_bus));
306306   m_reset_mode = m_bus;
307307}
308308
r26136r26137
311311 */
312312void alto2_cpu_device::f1_emu_load_esrb_1()
313313{
314   LOG((LOG_EMU,2,"   ESRB<-; BUS[12-14] (%#o)\n", m_bus));
314   LOG((LOG_EMU,2,"   ESRB; BUS[12-14] (%#o)\n", m_bus));
315315   m_s_reg_bank[m_task] = A2_GET32(m_bus,16,12,14);
316316}
317317
r26136r26137
324324void alto2_cpu_device::f1_rsnf_0()
325325{
326326   UINT16 r = 0177400 | m_ether_id;
327   LOG((LOG_EMU,2,"   <-RSNF; (%#o)\n", r));
327   LOG((LOG_EMU,2,"   RSNF; (%#o)\n", r));
328328   m_bus &= r;
329329}
330330
r26136r26137
385385{
386386   int XC;
387387   switch (MIR_F1(m_mir)) {
388   case f1_l_lsh_1:   // <-L MLSH 1
388   case f1_l_lsh_1:   // L MLSH 1
389389      XC = (m_t >> 15) & 1;
390390      m_shifter = (m_l << 1) & 0177777;
391391      m_shifter |= XC;
392      LOG((LOG_EMU,2,"   <-L MLSH 1 (shifer:%06o XC:%o)", m_shifter, XC));
392      LOG((LOG_EMU,2,"   L MLSH 1 (shifer:%06o XC:%o)", m_shifter, XC));
393393      break;
394   case f1_l_rsh_1:   // <-L MRSH 1
394   case f1_l_rsh_1:   // L MRSH 1
395395      XC = m_t & 1;
396396      m_shifter = m_l >> 1;
397397      m_shifter |= XC << 15;
398      LOG((LOG_EMU,2,"   <-L MRSH 1 (shifter:%06o XC:%o)", m_shifter, XC));
398      LOG((LOG_EMU,2,"   L MRSH 1 (shifter:%06o XC:%o)", m_shifter, XC));
399399      break;
400   case f1_l_lcy_8:   // <-L LCY 8
400   case f1_l_lcy_8:   // L LCY 8
401401   default:         // other
402402      break;
403403   }
r26136r26137
415415#else
416416   A2_PUT8(m_rsel, 5, 3, 4, IR_DstAC(m_emu.ir) ^ 3);
417417#endif
418   LOG((LOG_EMU,2,"   DNS<-; rsel := DstAC (%#o %s)\n", m_rsel, r_name(m_rsel)));
418   LOG((LOG_EMU,2,"   DNS; rsel := DstAC (%#o %s)\n", m_rsel, r_name(m_rsel)));
419419}
420420
421421/**
r26136r26137
437437 *  XC        = !(!(DNS & exorD) & !(MAGIC & OUTza))
438438 *            = (DNS & exorD) | (MAGIC & OUTza)
439439 *            = exorD, because this is DNS
440 *  NEWCARRY  = [XC, L(00), L(15), XC] for F1 = no shift, <-L RSH 1, <-L LSH 1, LCY 8
440 *  NEWCARRY  = [XC, L(00), L(15), XC] for F1 = no shift, L RSH 1, L LSH 1, LCY 8
441441 *  SHZERO    = shifter == 0
442442 *  DCARRY    = !((!IR12 & NEWCARRY) | (IR12 & CARRY))
443443 *            = (((IR12 ^ 1) & NEWCARRY) | (IR12 & CARRY)) ^ 1
r26136r26137
466466   UINT8 SHZERO;
467467
468468   switch (MIR_F1(m_mir)) {
469   case f1_l_rsh_1:   // <-L RSH 1
469   case f1_l_rsh_1:   // L RSH 1
470470      NEWCARRY = m_l & 1;
471471      m_shifter = ((m_l >> 1) | (XC << 15)) & 0177777;
472      LOG((LOG_EMU,2,"   DNS; <-L RSH 1 (shifter:%06o XC:%o NEWCARRY:%o)", m_shifter, XC, NEWCARRY));
472      LOG((LOG_EMU,2,"   DNS; L RSH 1 (shifter:%06o XC:%o NEWCARRY:%o)", m_shifter, XC, NEWCARRY));
473473      break;
474   case f1_l_lsh_1:   // <-L LSH 1
474   case f1_l_lsh_1:   // L LSH 1
475475      NEWCARRY = (m_l >> 15) & 1;
476476      m_shifter = ((m_l << 1) | XC) & 0177777;
477      LOG((LOG_EMU,2,"   DNS; <-L LSH 1 (shifter:%06o XC:%o NEWCARRY:%o)", m_shifter, XC, NEWCARRY));
477      LOG((LOG_EMU,2,"   DNS; L LSH 1 (shifter:%06o XC:%o NEWCARRY:%o)", m_shifter, XC, NEWCARRY));
478478      break;
479   case f1_l_lcy_8:   // <-L LCY 8
479   case f1_l_lcy_8:   // L LCY 8
480480   default:      /* other */
481481      NEWCARRY = XC;
482482      LOG((LOG_EMU,2,"   DNS; (shifter:%06o NEWCARRY:%o)", m_shifter, NEWCARRY));
r26136r26137
506506#else
507507   A2_PUT8(m_rsel, 5, 3, 4, IR_DstAC(m_emu.ir) ^ 3);
508508#endif
509   LOG((LOG_EMU,2,"   ACDEST<-; mux (rsel:%#o %s)\n", m_rsel, r_name(m_rsel)));
509   LOG((LOG_EMU,2,"   ACDEST; mux (rsel:%#o %s)\n", m_rsel, r_name(m_rsel)));
510510}
511511
512512#if   ALTO2_DEBUG
r26136r26137
628628   if (IR_ARITH(m_emu.ir)) {
629629      /* 1xxxxxxxxxxxxxxx */
630630      r = IR_SH(m_emu.ir) ^ 3;         /* complement of SH */
631      LOG((LOG_EMU,2,"   IDISP<-; branch on SH^3 (%#o|%#o)\n", m_next2, r));
631      LOG((LOG_EMU,2,"   IDISP; branch on SH^3 (%#o|%#o)\n", m_next2, r));
632632   } else {
633633      int addr = CTL2K_U3(f2_emu_idisp) + A2_GET32(m_emu.ir,16,1,7);
634634      /* 0???????xxxxxxxx */
635635      r = m_ctl2k_u3[addr];
636      LOG((LOG_EMU,2,"   IDISP<-; IR (%#o) branch on PROM ctl2k_u3[%03o] (%#o|%#o)\n", m_emu.ir, addr, m_next2, r));
636      LOG((LOG_EMU,2,"   IDISP; IR (%#o) branch on PROM ctl2k_u3[%03o] (%#o|%#o)\n", m_emu.ir, addr, m_next2, r));
637637   }
638638   m_next2 |= r;
639639}
r26136r26137
649649#else
650650   A2_PUT8(m_rsel, 5, 3, 4, IR_SrcAC(m_emu.ir) ^ 3);
651651#endif
652   LOG((LOG_EMU,2,"   <-ACSOURCE; rsel := SrcAC (%#o %s)\n", m_rsel, r_name(m_rsel)));
652   LOG((LOG_EMU,2,"   ACSOURCE; rsel := SrcAC (%#o %s)\n", m_rsel, r_name(m_rsel)));
653653}
654654
655655/**
r26136r26137
662662   if (IR_ARITH(m_emu.ir)) {
663663      /* 1xxxxxxxxxxxxxxx */
664664      r = IR_SH(m_emu.ir) ^ 3;         /* complement of SH */
665      LOG((LOG_EMU,2,"   <-ACSOURCE; branch on SH^3 (%#o|%#o)\n", m_next2, r));
665      LOG((LOG_EMU,2,"   ACSOURCE; branch on SH^3 (%#o|%#o)\n", m_next2, r));
666666   } else {
667667      int addr = CTL2K_U3(f2_emu_acsource) + A2_GET32(m_emu.ir,16,1,7);
668668      /* 0???????xxxxxxxx */
669669      r = m_ctl2k_u3[addr];
670      LOG((LOG_EMU,2,"   <-ACSOURCE; branch on PROM ctl2k_u3[%03o] (%#o|%#o)\n", addr, m_next2, r));
670      LOG((LOG_EMU,2,"   ACSOURCE; branch on PROM ctl2k_u3[%03o] (%#o|%#o)\n", addr, m_next2, r));
671671   }
672672   m_next2 |= r;
673673}
branches/alto2/src/emu/cpu/alto2/a2disk.c
r26136r26137
9696static const char *rwc_name[4] = {"read", "check", "write", "write2"};
9797#endif
9898
99#if   JKFF_FUNCTION
100
10199#if   ALTO2_DEBUG
102100static const char *jkff_name;
103101/** @brief macro to set the name of a FF in DEBUG=1 builds only */
r26136r26137
106104#define   DEBUG_NAME(x)
107105#endif
108106
107#if   JKFF_FUNCTION
108
109109/**
110110 * @brief simulate a 74109 J-K flip-flop with set and reset inputs
111111 *
112112 * @param s0 is the previous state of the FF's in- and outputs
113113 * @param s1 is the next state
114 * @result returns the next state and probably modified Q output
114 * @return returns the next state and probably modified Q output
115115 */
116static inline jkff_t update_jkff(jkff_t s0, jkff_t s1)
116jkff_t alto2_cpu_device::update_jkff(UINT8 s0, UINT8 s1)
117117{
118118   switch (s1 & (JKFF_C | JKFF_S)) {
119119   case JKFF_C | JKFF_S:   /* C' is 1, and S' is 1 */
r26136r26137
124124            /* both J and K' are 0: set Q to 0, Q' to 1 */
125125            s1 = (s1 & ~JKFF_Q) | JKFF_Q0;
126126            if (s0 & JKFF_Q) {
127               LOG((LOG_DISK,5,"%s J:0 K':0 -> Q:0\n", jkff_name));
127               LOG((LOG_DISK,5,"%s J:0 K':0 Q:0\n", jkff_name));
128128            }
129129            break;
130130         case JKFF_J:
r26136r26137
151151            /* both J and K' are 1: set Q to 1 */
152152            s1 = (s1 | JKFF_Q) & ~JKFF_Q0;
153153            if (!(s0 & JKFF_Q)) {
154               LOG((LOG_DISK,5,"%s J:1 K':1 -> Q:1\n",
154               LOG((LOG_DISK,5,"%s J:1 K':1 Q:1\n",
155155               jkff_name));
156156            }
157157            break;
r26136r26137
165165      /* S' is 1, C' is 0: set Q to 0, Q' to 1 */
166166      s1 = (s1 & ~JKFF_Q) | JKFF_Q0;
167167      if (s0 & JKFF_Q) {
168         LOG((LOG_DISK,5,"%s C':0 -> Q:0\n", jkff_name));
168         LOG((LOG_DISK,5,"%s C':0 Q:0\n", jkff_name));
169169      }
170170      break;
171171   case JKFF_C:
172172      /* S' is 0, C' is 1: set Q to 1, Q' to 0 */
173173      s1 = (s1 | JKFF_Q) & ~JKFF_Q0;
174174      if (!(s0 & JKFF_Q)) {
175         LOG((LOG_DISK,5,"%s S':0 -> Q:1\n", jkff_name));
175         LOG((LOG_DISK,5,"%s S':0 Q:1\n", jkff_name));
176176      }
177177      break;
178178   case 0:
179179   default:
180180      /* unstable state (what to do?) */
181181      s1 = s1 | JKFF_Q | JKFF_Q0;
182      LOG((LOG_DISK,5,"%s C':0 S':0 -> Q:1 and Q':1 <unstable>\n", jkff_name));
182      LOG((LOG_DISK,5,"%s C':0 S':0 Q:1 and Q':1 <unstable>\n", jkff_name));
183183      break;
184184   }
185185   return s1;
r26136r26137
767767      0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f
768768   }
769769};
770#endif
770771
771
772/** @brief just ignore debug arguments with the lookup table */
773#define   DEBUG_NAME(name)
774
775/** @brief lookup JK flip-flop state change from s0 to s1 */
776#define   update_jkff(s0,s1) static_cast<jkff_t>(jkff_lookup[(s1)&63][(s0)&63])
777
772jkff_t alto2_cpu_device::update_jkff(UINT8 s0, UINT8 s1)
773{
774   UINT8 result = jkff_lookup[s1 & 63][ s0 & 63];
775#if   ALTO2_DEBUG
776   LOG((LOG_DISK,8,"%s : ", jkff_name));
777   if ((s0 ^ result) & JKFF_CLK)
778      LOG((LOG_DISK,8," CLK:%d→%d", s0 & 1, result & 1));
779   if ((s0 ^ result) & JKFF_J)
780      LOG((LOG_DISK,8," J:%d→%d", (s0 >> 1) & 1, (result >> 1) & 1));
781   if ((s0 ^ result) & JKFF_K)
782      LOG((LOG_DISK,8," K:%d→%d", (s0 >> 2) & 1, (result >> 2) & 1));
783   if ((s0 ^ result) & JKFF_S)
784      LOG((LOG_DISK,8," S:%d→%d", (s0 >> 3) & 1, (result >> 3) & 1));
785   if ((s0 ^ result) & JKFF_C)
786      LOG((LOG_DISK,8," C:%d→%d", (s0 >> 4) & 1, (result >> 4) & 1));
787   if ((s0 ^ result) & JKFF_Q)
788      LOG((LOG_DISK,8," Q:%d→%d", (s0 >> 5) & 1, (result >> 5) & 1));
789   if ((s0 ^ result) & JKFF_Q0)
790      LOG((LOG_DISK,8," Q':%d→%d", (s0 >> 6) & 1, (result >> 6) & 1));
791   LOG((LOG_DISK,8,"\n"));
778792#endif
793   return static_cast<jkff_t>(result);
794}
779795
780796/**
781797 * <PRE>
r26136r26137
10371053
10381054   diablo_hd_device* dhd = m_drive[m_dsk.drive];
10391055   if (!dhd) {
1056      LOG((LOG_DISK,3,"   unit #%d\n", m_dsk.drive));
10401057      // FIXME: set all signals for a not connected drive
10411058      return;
10421059   }
r26136r26137
10921109   }
10931110
10941111   if (wddone0 != wddone1) {
1095      LOG((LOG_DISK,2,"   WDDONE':%d->%d\n", wddone0, wddone1));
1112      LOG((LOG_DISK,2,"   WDDONE':%d%d\n", wddone0, wddone1));
10961113   }
10971114
10981115   if (m_dsk.carry) {
r26136r26137
11421159   for (i = 0; i < 4; i++) {
11431160
11441161      if (m_sysclka0[i] != m_sysclka1[i]) {
1145         LOG((LOG_DISK,7,"   SYSCLKA':%d->%d\n", m_sysclka0[i], m_sysclka1[i]));
1162         LOG((LOG_DISK,7,"   SYSCLKA'   : %d%d\n", m_sysclka0[i], m_sysclka1[i]));
11461163      }
11471164      if (m_sysclkb0[i] != m_sysclkb1[i]) {
1148         LOG((LOG_DISK,7,"   SYSCLKB':%d->%d\n", m_sysclkb0[i], m_sysclkb1[i]));
1165         LOG((LOG_DISK,7,"   SYSCLKB'   : %d%d\n", m_sysclkb0[i], m_sysclkb1[i]));
11491166      }
11501167
11511168      /**
r26136r26137
12341251      s1 |= JKFF_K;
12351252      s1 |= JKFF_S;
12361253      s1 |= JKFF_C;      // FIXME: CLRSTAT' ?
1237
12381254      m_dsk.ff_45a = update_jkff(s0, s1);
12391255
12401256      /**
r26136r26137
16351651   r = m_dsk.kstat;
16361652
16371653   LOG((LOG_DISK,1,"   ←KSTAT; BUS &= %#o\n", r));
1638   LOG((LOG_DISK,2,"      sector:    %d\n", GET_KSTAT_SECTOR(m_dsk.kstat)));
1639   LOG((LOG_DISK,2,"      done:      %d\n", GET_KSTAT_DONE(m_dsk.kstat)));
1640   LOG((LOG_DISK,2,"      seekfail:  %d\n", GET_KSTAT_SEEKFAIL(m_dsk.kstat)));
1641   LOG((LOG_DISK,2,"      seek:      %d\n", GET_KSTAT_SEEK(m_dsk.kstat)));
1642   LOG((LOG_DISK,2,"      notrdy:    %d\n", GET_KSTAT_NOTRDY(m_dsk.kstat)));
1643   LOG((LOG_DISK,2,"      datalate:  %d\n", GET_KSTAT_DATALATE(m_dsk.kstat)));
1644   LOG((LOG_DISK,2,"      idle:      %d\n", GET_KSTAT_IDLE(m_dsk.kstat)));
1645   LOG((LOG_DISK,2,"      cksum:     %d\n", GET_KSTAT_CKSUM(m_dsk.kstat)));
1646   LOG((LOG_DISK,2,"      completion:%d\n", GET_KSTAT_COMPLETION(m_dsk.kstat)));
1654   LOG((LOG_DISK,2,"      sector     : %#o\n", GET_KSTAT_SECTOR(m_dsk.kstat)));
1655   LOG((LOG_DISK,2,"      done       : %#o\n", GET_KSTAT_DONE(m_dsk.kstat)));
1656   LOG((LOG_DISK,2,"      seekfail   : %#o\n", GET_KSTAT_SEEKFAIL(m_dsk.kstat)));
1657   LOG((LOG_DISK,2,"      seek       : %#o\n", GET_KSTAT_SEEK(m_dsk.kstat)));
1658   LOG((LOG_DISK,2,"      notrdy     : %#o\n", GET_KSTAT_NOTRDY(m_dsk.kstat)));
1659   LOG((LOG_DISK,2,"      datalate   : %#o\n", GET_KSTAT_DATALATE(m_dsk.kstat)));
1660   LOG((LOG_DISK,2,"      idle       : %#o\n", GET_KSTAT_IDLE(m_dsk.kstat)));
1661   LOG((LOG_DISK,2,"      cksum      : %#o\n", GET_KSTAT_CKSUM(m_dsk.kstat)));
1662   LOG((LOG_DISK,2,"      completion : %#o\n", GET_KSTAT_COMPLETION(m_dsk.kstat)));
16471663
16481664   m_bus &= r;
16491665}
r26136r26137
17001716{
17011717   int i;
17021718   LOG((LOG_DISK,1,"   KSTAT←; BUS[12-15] %#o\n", m_bus));
1703   LOG((LOG_DISK,2,"      idle:      %d\n", GET_KSTAT_IDLE(m_bus)));
1704   LOG((LOG_DISK,2,"      cksum:     %d\n", GET_KSTAT_CKSUM(m_bus)));
1705   LOG((LOG_DISK,2,"      completion:%d\n", GET_KSTAT_COMPLETION(m_bus)));
1719   LOG((LOG_DISK,2,"      idle       : %#o\n", GET_KSTAT_IDLE(m_bus)));
1720   LOG((LOG_DISK,2,"      cksum      : %#o\n", GET_KSTAT_CKSUM(m_bus)));
1721   LOG((LOG_DISK,2,"      completion : %#o\n", GET_KSTAT_COMPLETION(m_bus)));
17061722
17071723   /* KSTAT[12] is just taken from BUS[12] */
17081724   PUT_KSTAT_IDLE(m_dsk.kstat, GET_KSTAT_IDLE(m_bus));
r26136r26137
18171833   case RECNO_HEADER:
18181834      m_dsk.krecno = RECNO_LABEL;
18191835      m_dsk.krwc = GET_KADR_LABEL(m_dsk.kadr);
1820      LOG((LOG_DISK,2,"   INCRECNO; HEADER -> LABEL (%o, rwc:%o)\n",
1821         m_dsk.krecno, m_dsk.krwc));
1836      LOG((LOG_DISK,2,"   INCRECNO; HEADER → LABEL (%o, rwc:%o)\n", m_dsk.krecno, m_dsk.krwc));
18221837      break;
18231838   case RECNO_PAGENO:
18241839      m_dsk.krecno = RECNO_HEADER;
18251840      m_dsk.krwc = GET_KADR_HEADER(m_dsk.kadr);
1826      LOG((LOG_DISK,2,"   INCRECNO; PAGENO -> HEADER (%o, rwc:%o)\n",
1827         m_dsk.krecno, m_dsk.krwc));
1841      LOG((LOG_DISK,2,"   INCRECNO; PAGENO → HEADER (%o, rwc:%o)\n", m_dsk.krecno, m_dsk.krwc));
18281842      break;
18291843   case RECNO_LABEL:
18301844      m_dsk.krecno = RECNO_DATA;
18311845      m_dsk.krwc = GET_KADR_DATA(m_dsk.kadr);
1832      LOG((LOG_DISK,2,"   INCRECNO; LABEL -> DATA (%o, rwc:%o)\n",
1833         m_dsk.krecno, m_dsk.krwc));
1846      LOG((LOG_DISK,2,"   INCRECNO; LABEL → DATA (%o, rwc:%o)\n", m_dsk.krecno, m_dsk.krwc));
18341847      break;
18351848   case RECNO_DATA:
18361849      m_dsk.krecno = RECNO_PAGENO;
18371850      m_dsk.krwc = 0;   /* read (?) */
1838      LOG((LOG_DISK,2,"   INCRECNO; DATA -> PAGENO (%o, rwc:%o)\n",
1839         m_dsk.krecno, m_dsk.krwc));
1851      LOG((LOG_DISK,2,"   INCRECNO; DATA → PAGENO (%o, rwc:%o)\n", m_dsk.krecno, m_dsk.krwc));
18401852      break;
18411853   }
18421854   // TODO: show disk indicator
r26136r26137
18541866{
18551867   diablo_hd_device* dhd = m_drive[m_dsk.drive];
18561868   LOG((LOG_DISK,1,"   CLRSTAT\n"));
1869   UINT8 s0, s1;
18571870
18581871   /* clears the LAI clocked flip-flop 44a
18591872    * JK flip-flop 44a (LAI' clocked)
r26136r26137
18651878    * Q   to seekok
18661879    */
18671880   DEBUG_NAME("      LAI 44a");
1868   m_dsk.ff_44a = update_jkff(m_dsk.ff_44a,
1869      (m_dsk.ff_44a & JKFF_CLK) |
1870      JKFF_J |
1871      JKFF_K |
1872      JKFF_S |
1873      0);
1881   s0 = m_dsk.ff_44a;
1882   s1 = m_dsk.ff_44a & JKFF_CLK;
1883   s1 |= JKFF_J;
1884   s1 |= JKFF_K;
1885   s1 |= JKFF_S;
1886   m_dsk.ff_44a = update_jkff(s0, s1);
18741887
18751888   /* clears the CKSUM flip-flop 44b
18761889    * JK flip-flop 44b (KSTAT← clocked)
r26136r26137
18821895    * Q   to seekok
18831896    */
18841897   DEBUG_NAME("      CKSUM 44b");
1885   m_dsk.ff_44b = update_jkff(m_dsk.ff_44b,
1886      (m_dsk.ff_44b & JKFF_CLK) |
1887      (m_dsk.ff_44b & JKFF_J) |
1888      JKFF_K |
1889      JKFF_S |
1890      0);
1898   s0 = m_dsk.ff_44b;
1899   s1 = m_dsk.ff_44b & JKFF_CLK;
1900   s1 |= m_dsk.ff_44b & JKFF_J;
1901   s1 |= JKFF_K;
1902   s1 |= JKFF_S;
1903   m_dsk.ff_44b = update_jkff(s0, s1);
18911904
18921905   /* clears the rdylat flip-flop 45a
18931906    * JK flip-flop 45a (ready latch)
r26136r26137
18991912    * Q   RDYLAT'
19001913    */
19011914   DEBUG_NAME("      RDYLAT 45a");
1902   m_dsk.ff_45a = update_jkff(m_dsk.ff_45a,
1903      (m_dsk.ff_45a & JKFF_CLK) |
1904      (dhd ? dhd->get_ready_0() : 1) |
1905      JKFF_K |
1906      JKFF_S |
1907      0);
1915   s0 = m_dsk.ff_45a;
1916   s1 = m_dsk.ff_45a & JKFF_CLK;
1917   if (dhd)
1918      s1 |= dhd->get_ready_0() ? JKFF_J : 0;
1919   else
1920      s1 |= JKFF_J;
1921   s1 |= JKFF_K;
1922   s1 |= JKFF_S;
1923   m_dsk.ff_45a = update_jkff(s0, s1);
19081924
19091925   /* sets the seqerr flip-flop 45b (Q' is SEQERR)
19101926    * JK flip-flop 45b (seqerr latch)
r26136r26137
19161932    * Q   to KSTAT[11] DATALATE
19171933    */
19181934   DEBUG_NAME("      SEQERR 45b");
1919   m_dsk.ff_45b = update_jkff(m_dsk.ff_45b,
1920      (m_dsk.ff_45b & JKFF_CLK) |
1921      JKFF_J |
1922      (m_dsk.ff_45b & JKFF_K) |
1923      0 |
1924      JKFF_C);
1935   s0 = m_dsk.ff_45b;
1936   s1 = m_dsk.ff_45b & JKFF_CLK;
1937   s1 |= JKFF_J;
1938   s1 |= m_dsk.ff_45b & JKFF_K;
1939   s1 |= JKFF_C;
1940   m_dsk.ff_45b = update_jkff(s0, s1);
19251941
19261942   /* set or reset monoflop 31a, depending on drive READY' */
19271943   m_dsk.ready_mf31a = dhd ? dhd->get_ready_0() : 1;
r26136r26137
19541970   if (m_dsk.kcom != m_bus) {
19551971      m_dsk.kcom = m_bus;
19561972      LOG((LOG_DISK,2,"   KCOM←; BUS %06o\n", m_dsk.kcom));
1957      LOG((LOG_DISK,2,"      xferoff: %d\n", GET_KCOM_XFEROFF(m_dsk.kcom)));
1958      LOG((LOG_DISK,2,"      wdinhib: %d\n", GET_KCOM_WDINHIB(m_dsk.kcom)));
1959      LOG((LOG_DISK,2,"      bclksrc: %d\n", GET_KCOM_BCLKSRC(m_dsk.kcom)));
1960      LOG((LOG_DISK,2,"      wffo:    %d\n", GET_KCOM_WFFO(m_dsk.kcom)));
1961      LOG((LOG_DISK,2,"      sendadr: %d\n", GET_KCOM_SENDADR(m_dsk.kcom)));
1973      LOG((LOG_DISK,2,"      xferoff    : %#o\n", GET_KCOM_XFEROFF(m_dsk.kcom)));
1974      LOG((LOG_DISK,2,"      wdinhib    : %#o\n", GET_KCOM_WDINHIB(m_dsk.kcom)));
1975      LOG((LOG_DISK,2,"      bclksrc    : %#o\n", GET_KCOM_BCLKSRC(m_dsk.kcom)));
1976      LOG((LOG_DISK,2,"      wffo       : %#o\n", GET_KCOM_WFFO(m_dsk.kcom)));
1977      LOG((LOG_DISK,2,"      sendadr    : %#o\n", GET_KCOM_SENDADR(m_dsk.kcom)));
19621978
1963      // TODO: show disk indicator
1979      // TODO: show disk indicator in the GUI?
19641980   }
19651981}
19661982
r26136r26137
20012017   m_dsk.krwc = GET_KADR_HEADER(m_dsk.kadr);
20022018
20032019   LOG((LOG_DISK,1,"   KADR←; BUS[8-14] #%o\n", m_dsk.kadr));
2004   LOG((LOG_DISK,2,"      seal:   %#o\n", GET_KADR_SEAL(m_dsk.kadr)));
2005   LOG((LOG_DISK,2,"      header: %s\n",  rwc_name[GET_KADR_HEADER(m_dsk.kadr)]));
2006   LOG((LOG_DISK,2,"      label:  %s\n",  rwc_name[GET_KADR_LABEL(m_dsk.kadr)]));
2007   LOG((LOG_DISK,2,"      data:   %s\n",  rwc_name[GET_KADR_DATA(m_dsk.kadr)]));
2008   LOG((LOG_DISK,2,"      noxfer: %d\n",  GET_KADR_NOXFER(m_dsk.kadr)));
2009   LOG((LOG_DISK,2,"      unused: %d (drive?)\n",  GET_KADR_UNUSED(m_dsk.kadr)));
2020   LOG((LOG_DISK,2,"      seal       : %#o\n", GET_KADR_SEAL(m_dsk.kadr)));
2021   LOG((LOG_DISK,2,"      header     : %s (%#o)\n",  rwc_name[GET_KADR_HEADER(m_dsk.kadr)], GET_KADR_HEADER(m_dsk.kadr)));
2022   LOG((LOG_DISK,2,"      label      : %s (%#o)\n",  rwc_name[GET_KADR_LABEL(m_dsk.kadr)], GET_KADR_LABEL(m_dsk.kadr)));
2023   LOG((LOG_DISK,2,"      data       : %s (%#o)\n",  rwc_name[GET_KADR_DATA(m_dsk.kadr)], GET_KADR_DATA(m_dsk.kadr)));
2024   LOG((LOG_DISK,2,"      noxfer     : %#o\n",  GET_KADR_NOXFER(m_dsk.kadr)));
2025   LOG((LOG_DISK,2,"      unused     : %#o (drive?)\n",  GET_KADR_UNUSED(m_dsk.kadr)));
20102026
2011   // TODO: show disk indicator
2027   // TODO: show disk indicator in the GUI?
20122028}
20132029
20142030/**
r26136r26137
22482264void alto2_cpu_device::next_sector(int unit)
22492265{
22502266   diablo_hd_device* dhd = m_drive[unit];
2267   LOG((LOG_DISK,0,"%s dhd=%p\n", __FUNCTION__, dhd));
22512268   if (m_dsk.bitclk_timer) {
22522269      LOG((LOG_DISK,0,"   unit #%d stop bitclk\n", m_dsk.bitclk));
22532270      m_dsk.bitclk_timer->enable(false);
r26136r26137
22862303 */
22872304void alto2_cpu_device::init_disk()
22882305{
2289   diablo_hd_device* dhd;
2290   for (int unit = 0; unit < 2; unit++) {
2291      dhd = m_drive[unit];
2292      if (!dhd)
2293         continue;
2294      dhd->set_sector_callback(this, &disk_sector_start);
2295   }
2296
22972306   memset(&m_dsk, 0, sizeof(m_dsk));
22982307
22992308   /** @brief simulate previous sysclka */
r26136r26137
23342343   m_dsk.ok_to_run_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(alto2_cpu_device::disk_ok_to_run),this));
23352344   m_dsk.ok_to_run_timer->set_param(1);
23362345   m_dsk.ok_to_run_timer->adjust(attotime::from_nsec(15 * ALTO2_UCYCLE), 1);
2346
2347   diablo_hd_device* dhd;
2348   for (int unit = 0; unit < diablo_hd_device::DIABLO_UNIT_MAX; unit++) {
2349      dhd = m_drive[unit];
2350      if (!dhd)
2351         continue;
2352      dhd->set_sector_callback(this, &disk_sector_start);
2353   }
23372354}
23382355
branches/alto2/src/emu/cpu/alto2/a2dwt.c
r26136r26137
3030 */
3131void alto2_cpu_device::f2_dwt_load_ddr_1()
3232{
33   LOG((LOG_DWT,2,"   DDR<- BUS (%#o)\n", m_bus));
33   LOG((LOG_DWT,2,"   DDR BUS (%#o)\n", m_bus));
3434   m_dsp.fifo[m_dsp.fifo_wr] = m_bus;
3535   m_dsp.fifo_wr = (m_dsp.fifo_wr + 1) % ALTO2_DISPLAY_FIFO;
3636   if (FIFO_STOPWAKE_0() == 0)
branches/alto2/src/emu/cpu/alto2/alto2.c
r26136r26137
11791179      "[DRIVE]",
11801180      "[DISK]",
11811181      "[DISPL]",
1182      "[MOUSE]"
1182      "[MOUSE]",
1183      "[HW]"
11831184   };
11841185   if (!(m_log_types & type))
11851186      return;
r26136r26137
24312432      bs = MIR_BS(m_mir);
24322433      f1 = MIR_F1(m_mir);
24332434      f2 = MIR_F2(m_mir);
2434      LOG((LOG_CPU,2,"\n%s-%04o: %011o r:%02o aluf:%02o bs:%02o f1:%02o f2:%02o t:%o l:%o next:%05o next2:%05o\n",
2435      LOG((LOG_CPU,2,"%s-%04o: %011o r:%02o aluf:%02o bs:%02o f1:%02o f2:%02o t:%o l:%o next:%05o next2:%05o\n",
24352436         task_name(m_task), m_mpc, m_mir, m_rsel, aluf, bs, f1, f2, MIR_T(m_mir), MIR_L(m_mir), m_next, m_next2));
24362437      debugger_instruction_hook(this, m_mpc);
24372438
r26136r26137
29662967
29672968   init_disk();
29682969   init_disp();
2970   init_hardware();
2971   init_kbd();
29692972
29702973   init_emu(task_emu);
29712974   init_001(task_1);
branches/alto2/src/emu/cpu/alto2/a2disp.c
r26136r26137
1212/**
1313 * @brief PROM a38 contains the STOPWAKE' and MBEMBPTY' signals for the FIFO
1414 * <PRE>
15 * The inputs to a38 are the UNLOAD counter RA[0-3] and the DDR<- counter
15 * The inputs to a38 are the UNLOAD counter RA[0-3] and the DDR counter
1616 * WA[0-3], and the designer decided to reverse the address lines :-)
1717 *
1818 *   a38  counter
branches/alto2/src/emu/cpu/alto2/a2kbd.c
r0r26137
1/*****************************************************************************
2 *
3 *   Portable Xerox AltoII memory mapped I/O keyboard
4 *
5 *   Copyright: Juergen Buchmueller <pullmoll@t-online.de>
6 *
7 *   Licenses: MAME, GPLv2
8 *
9 *****************************************************************************/
10#include "alto2.h"
11
12/**
13 * @brief read the keyboard address matrix
14 *
15 * @param addr memory mapped I/O address to be read
16 * @return keyboard matrix value for address modulo 4
17 */
18UINT16 alto2_cpu_device::kbd_ad_r(UINT32 addr)
19{
20   UINT16 data = 0177777;
21   switch (addr & 3) {
22   case 0:
23      data = machine().root_device().ioport("ROW0")->read();
24      break;
25   case 1:
26      data = machine().root_device().ioport("ROW1")->read();
27      break;
28   case 2:
29      data = machine().root_device().ioport("ROW2")->read();
30      break;
31   case 3:
32      data = machine().root_device().ioport("ROW3")->read();
33      break;
34   }
35   m_kbd.matrix[addr & 03] = data;
36   LOG((LOG_KBD,2,"   read KBDAD+%o (%#o)\n", addr & 3, data));
37   if (0 == (addr & 3) && (m_kbd.bootkey != 0177777)) {
38      LOG((0,2,"   boot keys (%#o & %#o)\n", data, m_kbd.bootkey));
39      data &= m_kbd.bootkey;
40      m_kbd.bootkey = 0177777;
41   }
42   return data;
43}
44
45void alto2_cpu_device::init_kbd(UINT16 bootkey)
46{
47   m_kbd.bootkey = bootkey;
48   m_kbd.matrix[0] = 0177777;
49   m_kbd.matrix[1] = 0177777;
50   m_kbd.matrix[2] = 0177777;
51   m_kbd.matrix[3] = 0177777;
52   // install memory handler
53   install_mmio_fn(0177034, 0177037, &alto2_cpu_device::kbd_ad_r, 0);
54}
55
Property changes on: branches/alto2/src/emu/cpu/alto2/a2kbd.c
Added: svn:eol-style
   + native
Added: svn:mime-type
   + text/plain
branches/alto2/src/emu/cpu/alto2/alto2.h
r26136r26137
273273      LOG_DISK   = (1 << 20),
274274      LOG_DISPL   = (1 << 21),
275275      LOG_MOUSE   = (1 << 22),
276      LOG_ALL      = ((1 << 23) - 1)
276      LOG_HW      = (1 << 23),
277      LOG_KBD      = (1 << 24),
278      LOG_ALL      = ((1 << 25) - 1)
277279   };
278280   int m_log_types;
279281   int m_log_level;
r26136r26137
12551257   void init_hardware();                  //!< initialize miscellaneous hardware
12561258
12571259   // ************************************************
1260   // keyboard stuff
1261   // ************************************************
1262   struct {
1263      UINT16 bootkey;                     //!< boot key - key code pressed before power on
1264      UINT16 matrix[4];                  //!< a bit map of the keys pressed (ioports ROW0 ... ROW3)
1265   }   m_kbd;
1266   UINT16 kbd_ad_r(UINT32 addr);            //!< read the keyboard matrix
1267   void init_kbd(UINT16 bootkey = 0177777);   //!< initialize the keyboard hardware, optinally set the boot key
1268
1269   // ************************************************
12581270   // mouse stuff
12591271   // ************************************************
12601272   /**
r26136r26137
13871399   jkff_t m_sysclka1[4];            //!< simulate current sysclka
13881400   jkff_t m_sysclkb0[4];            //!< simulate previous sysclkb
13891401   jkff_t m_sysclkb1[4];            //!< simulate current sysclkb
1402   //! lookup JK flip-flop state change from s0 to s1
1403   inline jkff_t update_jkff(UINT8 s0, UINT8 s1);
13901404
13911405   void kwd_timing(int bitclk, int datin, int block);   //!< disk word timing
13921406   TIMER_CALLBACK_MEMBER( disk_seclate );         //!< timer callback to take away the SECLATE pulse (monoflop)
branches/alto2/src/emu/cpu/alto2/a2ether.c
r26136r26137
440440{
441441   UINT16 r = m_eth.fifo[m_eth.fifo_rd];
442442
443   LOG((LOG_ETH,3, "   <-EIDFCT; pull %06o from FIFO[%02o]\n", r, m_eth.fifo_rd));
443   LOG((LOG_ETH,3, "   EIDFCT; pull %06o from FIFO[%02o]\n", r, m_eth.fifo_rd));
444444   m_eth.fifo_rd = (m_eth.fifo_rd + 1) % ALTO2_ETHER_FIFO_SIZE;
445445   m_bus &= r;
446446   m_eth.rx_count++;
r26136r26137
466466void alto2_cpu_device::f1_eilfct_0()
467467{
468468   UINT16 r = m_eth.fifo[m_eth.fifo_rd];
469   LOG((LOG_ETH,3, "   <-EILFCT; %06o at FIFO[%02o]\n", r, m_eth.fifo_rd));
469   LOG((LOG_ETH,3, "   EILFCT; %06o at FIFO[%02o]\n", r, m_eth.fifo_rd));
470470   m_bus &= r;
471471}
472472
r26136r26137
487487{
488488   UINT16 r = ~A2_GET16(m_eth.status,16,10,15) & 0177777;
489489
490   LOG((LOG_ETH,3, "   <-EPFCT; BUS[8-15] = STATUS (%#o)\n", r));
490   LOG((LOG_ETH,3, "   EPFCT; BUS[8-15] = STATUS (%#o)\n", r));
491491   m_bus &= r;
492492
493493   m_eth.status = 0;
r26136r26137
519519 */
520520void alto2_cpu_device::f2_eodfct_1()
521521{
522   LOG((LOG_ETH,3, "   EODFCT<-; push %06o into FIFO[%02o]\n", m_bus, m_eth.fifo_wr));
522   LOG((LOG_ETH,3, "   EODFCT; push %06o into FIFO[%02o]\n", m_bus, m_eth.fifo_wr));
523523
524524   m_eth.fifo[m_eth.fifo_wr] = m_bus;
525525   m_eth.fifo_wr = (m_eth.fifo_wr + 1) % ALTO2_ETHER_FIFO_SIZE;
branches/alto2/src/emu/cpu/cpu.mak
r26136r26137
22852285   $(CPUOBJ)/alto2/a2dwt.o \
22862286   $(CPUOBJ)/alto2/a2emu.o \
22872287   $(CPUOBJ)/alto2/a2ether.o \
2288   $(CPUOBJ)/alto2/a2hw.o \
2289   $(CPUOBJ)/alto2/a2kbd.o \
22882290   $(CPUOBJ)/alto2/a2ksec.o \
22892291   $(CPUOBJ)/alto2/a2kwd.o \
22902292   $(CPUOBJ)/alto2/a2mem.o \
r26136r26137
23242326$(CPUOBJ)/alto2/a2ether.o:  $(CPUSRC)/alto2/a2ether.c \
23252327                     $(CPUSRC)/alto2/alto2.h
23262328
2329$(CPUOBJ)/alto2/a2hw.o:     $(CPUSRC)/alto2/a2hw.c \
2330                     $(CPUSRC)/alto2/alto2.h
2331
2332$(CPUOBJ)/alto2/a2kbd.o:    $(CPUSRC)/alto2/a2kbd.c \
2333                     $(CPUSRC)/alto2/alto2.h
2334
23272335$(CPUOBJ)/alto2/a2ksec.o:   $(CPUSRC)/alto2/a2ksec.c \
23282336                     $(CPUSRC)/alto2/alto2.h
23292337
branches/alto2/src/mess/includes/alto2.h
r26136r26137
1717   alto2_state(const machine_config &mconfig, device_type type, const char *tag)
1818      : driver_device(mconfig, type, tag),
1919      m_maincpu(*this, "maincpu"),
20      // m_diablo0(*this, DIABLO_HD_0),
21      // m_diablo1(*this, DIABLO_HD_1),
2220      m_io_row0(*this, "ROW0"),
2321      m_io_row1(*this, "ROW1"),
2422      m_io_row2(*this, "ROW2"),
r26136r26137
4442
4543protected:
4644   required_device<cpu_device> m_maincpu;
47   // optional_device<diablo_hd_device> m_diablo0;      // should become required_device() once the devices work right
48   // optional_device<diablo_hd_device> m_diablo1;
4945   required_ioport m_io_row0;
5046   required_ioport m_io_row1;
5147   required_ioport m_io_row2;

Previous 199869 Revisions Next


© 1997-2024 The MAME Team