/* z80pio port write */ void z80pio_p_w( int which , int ch , int data ) { z80pio *pio = pios + which; if( ch ) ch = 1; pio->in[ch] = data; switch( pio->mode[ch] ){ case PIO_MODE0: if (errorlog) fprintf(errorlog,"PIO-%c OUTPUT mode and data write\n",'A'+ch ); break; case PIO_MODE2: /* only port A */ ch = 1; /* handshake and IRQ is use portB */ case PIO_MODE1: pio->rdy[ch] = 0; z80pio_check_irq( pio , ch ); break; case PIO_MODE3: /* irq check */ z80pio_check_irq( pio , ch ); break; } }
/* pio data register read */ int z80pio_d_r( int which , int ch ) { z80pio *pio = pios + which; if( ch ) ch = 1; switch( pio->mode[ch] ){ case PIO_MODE0: /* mode 0 output */ return pio->out[ch]; case PIO_MODE1: /* mode 1 intput */ pio->rdy[ch] = 1; /* ready = H */ z80pio_check_irq( pio , ch ); return pio->in[ch]; case PIO_MODE2: /* mode 2 i/o */ if( ch ) if (errorlog) fprintf(errorlog,"PIO-B mode 2 \n"); pio->rdy[1] = 1; /* brdy = H */ z80pio_check_irq( pio , ch ); return pio->in[ch]; case PIO_MODE3: /* mode 3 bit */ return (pio->in[ch]&pio->dir[ch])|(pio->out[ch]&~pio->dir[ch]); } if (errorlog) fprintf(errorlog,"PIO-%c data read,bad mode\n",'A'+ch ); return 0; }
/* pio data register read */ int z80pio_d_r( int which , int ch ) { z80pio *pio = pios + which; if( ch ) ch = 1; switch( pio->mode[ch] ){ case PIO_MODE0: /* mode 0 output */ return pio->out[ch]; case PIO_MODE1: /* mode 1 intput */ z80pio_set_rdy(pio, ch, 1); /* ready = H */ z80pio_check_irq( pio , ch ); return pio->in[ch]; case PIO_MODE2: /* mode 2 i/o */ if( ch ) logerror("PIO-B mode 2 \n"); z80pio_set_rdy(pio, 1, 1); /* brdy = H */ z80pio_check_irq( pio , ch ); return pio->in[ch]; case PIO_MODE3: /* mode 3 bit */ return (pio->in[ch]&pio->dir[ch])|(pio->out[ch]&~pio->dir[ch]); } logerror("PIO-%c data read,bad mode\n",'A'+ch ); return 0; }
/* pio controll register write */ void z80pio_c_w( int which , int ch , int data ) { z80pio *pio = pios + which; if( ch ) ch = 1; /* load direction phase ? */ if( pio->mode[ch] == 0x13 ){ pio->dir[ch] = data; pio->mode[ch] = 0x03; return; } /* load mask folows phase ? */ if( pio->enable[ch] & PIO_INT_MASK ){ /* load mask folows */ pio->mask[ch] = data; pio->enable[ch] &= ~PIO_INT_MASK; if (errorlog) fprintf(errorlog,"PIO-%c interrupt mask %02x\n",'A'+ch,data ); return; } switch( data & 0x0f ){ case PIO_OP_MODE: /* mode select 0=out,1=in,2=i/o,3=bit */ pio->mode[ch] = (data >> 6 ); if( pio->mode[ch] == 0x03 ) pio->mode[ch] = 0x13; if (errorlog) fprintf(errorlog,"PIO-%c Mode %x\n",'A'+ch,pio->mode[ch] ); break; case PIO_OP_INTC: /* interrupt control */ pio->enable[ch] = data & 0xf0; pio->mask[ch] = 0x00; /* when interrupt enable , set vector request flag */ if (errorlog) fprintf(errorlog,"PIO-%c Controll %02x\n",'A'+ch,data ); break; case PIO_OP_INTE: /* interrupt enable controll */ pio->enable[ch] &= ~PIO_INT_ENABLE; pio->enable[ch] |= (data & PIO_INT_ENABLE); if (errorlog) fprintf(errorlog,"PIO-%c enable %02x\n",'A'+ch,data&0x80 ); break; default: if( !(data&1) ) { pio->vector[ch] = data; if (errorlog) fprintf(errorlog,"PIO-%c vector %02x\n",'A'+ch,data); } else if (errorlog) fprintf(errorlog,"PIO-%c illegal command %02x\n",'A'+ch,data ); } /* interrupt check */ z80pio_check_irq( pio , ch ); }
/* pio data register write */ void z80pio_d_w( int which , int ch , int data ) { z80pio *pio = pios + which; if( ch ) ch = 1; pio->out[ch] = data; /* latch out data */ switch( pio->mode[ch] ){ case PIO_MODE0: /* mode 0 output */ case PIO_MODE2: /* mode 2 i/o */ pio->rdy[ch] = 1; /* ready = H */ z80pio_check_irq( pio , ch ); return; case PIO_MODE1: /* mode 1 intput */ case PIO_MODE3: /* mode 0 bit */ return; default: if (errorlog) fprintf(errorlog,"PIO-%c data write,bad mode\n",'A'+ch ); } }
/* z80pio port read */ int z80pio_p_r( int which , int ch ) { z80pio *pio = pios + which; if( ch ) ch = 1; switch( pio->mode[ch] ){ case PIO_MODE2: /* port A only */ case PIO_MODE0: pio->rdy[ch] = 0; z80pio_check_irq( pio , ch ); break; case PIO_MODE1: if (errorlog) fprintf(errorlog,"PIO-%c INPUT mode and data read\n",'A'+ch ); break; case PIO_MODE3: /* input bits , output bits */ return (pio->in[ch]&pio->dir[ch])|(pio->out[ch]&~pio->dir[ch]); } return pio->out[ch]; }