src/mame/machine/archimds.c
| r8908 | r8909 | |
| 54 | 54 | UINT8 ioc_regs[0x80/4]; |
| 55 | 55 | UINT8 vidc_bpp_mode; |
| 56 | 56 | UINT8 vidc_interlace; |
| 57 | static UINT8 vidc_pixel_clk; |
| 58 | static const UINT32 pixel_rate[4] = { 8000000, 12000000, 16000000, 24000000}; |
| 59 | static UINT8 vidc_stereo_reg[8]; |
| 57 | 60 | |
| 58 | 61 | static emu_timer *timer[4], *snd_timer, *vid_timer; |
| 59 | 62 | emu_timer *vbl_timer; |
| r8908 | r8909 | |
| 134 | 137 | static TIMER_CALLBACK( vidc_audio_tick ) |
| 135 | 138 | { |
| 136 | 139 | address_space *space = cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM); |
| 140 | UINT8 ulaw_comp; |
| 137 | 141 | INT16 res; |
| 142 | UINT8 ch; |
| 143 | static const char *const dac_port[8] = { "dac0", "dac1", "dac2", "dac3", "dac4", "dac5", "dac6", "dac7" }; |
| 138 | 144 | |
| 139 | | res = (space->read_word(vidc_sndstart+vidc_sndcur)); |
| 145 | for(ch=0;ch<8;ch++) |
| 146 | { |
| 147 | ulaw_comp = (space->read_byte(vidc_sndstart+vidc_sndcur + ch)); |
| 140 | 148 | |
| 141 | | dac_signed_data_w(space->machine->device("dac"), res); |
| 149 | res=1<<((ulaw_comp>>5)+4); |
| 150 | res+=(((ulaw_comp>>1)&0xF)<<(ulaw_comp>>5)); |
| 151 | if (ulaw_comp&1) res=-res; |
| 142 | 152 | |
| 143 | | vidc_sndcur++; |
| 153 | dac_signed_data_16_w(space->machine->device(dac_port[ch & 7]), res); |
| 154 | } |
| 144 | 155 | |
| 145 | | if (vidc_sndcur >= (vidc_sndend-vidc_sndstart)+0x40) |
| 156 | vidc_sndcur+=8; |
| 157 | |
| 158 | if (vidc_sndcur >= (vidc_sndend-vidc_sndstart)+0x10) |
| 146 | 159 | { |
| 147 | 160 | vidc_sndcur = 0; |
| 148 | 161 | archimedes_request_irq_b(machine, ARCHIMEDES_IRQB_SOUND_EMPTY); |
| r8908 | r8909 | |
| 150 | 163 | if(!audio_dma_on) |
| 151 | 164 | { |
| 152 | 165 | timer_adjust_oneshot(snd_timer, attotime_never, 0); |
| 153 | | dac_signed_data_16_w(space->machine->device("dac"), 0x8000); |
| 166 | for(ch=0;ch<8;ch++) |
| 167 | dac_signed_data_16_w(space->machine->device(dac_port[ch & 7]), 0x8000); |
| 154 | 168 | } |
| 155 | 169 | } |
| 156 | 170 | } |
| r8908 | r8909 | |
| 693 | 707 | return 0; |
| 694 | 708 | } |
| 695 | 709 | |
| 710 | static void vidc_dynamic_res_change(running_machine *machine) |
| 711 | { |
| 712 | /* sanity checks - first pass */ |
| 713 | /* |
| 714 | total cycles + border end |
| 715 | */ |
| 716 | if(vidc_regs[VIDC_HCR] && vidc_regs[VIDC_HBER] && |
| 717 | vidc_regs[VIDC_VCR] && vidc_regs[VIDC_VBER]) |
| 718 | { |
| 719 | /* sanity checks - second pass */ |
| 720 | /* |
| 721 | total cycles >= border end >= border start |
| 722 | */ |
| 723 | if((vidc_regs[VIDC_HCR] >= vidc_regs[VIDC_HBER]) && |
| 724 | (vidc_regs[VIDC_HBER] >= vidc_regs[VIDC_HBSR]) && |
| 725 | (vidc_regs[VIDC_VCR] >= vidc_regs[VIDC_VBER]) && |
| 726 | (vidc_regs[VIDC_VBER] >= vidc_regs[VIDC_VBSR])) |
| 727 | { |
| 728 | rectangle visarea; |
| 729 | attoseconds_t refresh; |
| 730 | |
| 731 | visarea.min_x = 0; |
| 732 | visarea.min_y = 0; |
| 733 | visarea.max_x = vidc_regs[VIDC_HBER] - vidc_regs[VIDC_HBSR] - 1; |
| 734 | visarea.max_y = vidc_regs[VIDC_VBER] - vidc_regs[VIDC_VBSR]; |
| 735 | |
| 736 | logerror("Configuring: htotal %d vtotal %d border %d x %d display %d x %d\n", |
| 737 | vidc_regs[VIDC_HCR], vidc_regs[VIDC_VCR], |
| 738 | visarea.max_x, visarea.max_y, |
| 739 | vidc_regs[VIDC_HDER]-vidc_regs[VIDC_HDSR],vidc_regs[VIDC_VDER]-vidc_regs[VIDC_VDSR]+1); |
| 740 | |
| 741 | /* FIXME: pixel clock */ |
| 742 | refresh = HZ_TO_ATTOSECONDS(pixel_rate[vidc_pixel_clk]*2) * vidc_regs[VIDC_HCR] * vidc_regs[VIDC_VCR]; |
| 743 | |
| 744 | machine->primary_screen->configure(vidc_regs[VIDC_HCR], vidc_regs[VIDC_VCR], visarea, refresh); |
| 745 | } |
| 746 | } |
| 747 | } |
| 748 | |
| 696 | 749 | WRITE32_HANDLER(archimedes_vidc_w) |
| 697 | 750 | { |
| 698 | 751 | UINT32 reg = data>>24; |
| r8908 | r8909 | |
| 753 | 806 | } |
| 754 | 807 | |
| 755 | 808 | } |
| 809 | else if (reg >= 0x60 && reg <= 0x7c) |
| 810 | { |
| 811 | vidc_stereo_reg[(reg >> 2) & 7] = val & 0x07; |
| 812 | |
| 813 | // popmessage("%02x %02x %02x %02x %02x %02x %02x %02x",vidc_stereo_reg[0],vidc_stereo_reg[1],vidc_stereo_reg[2],vidc_stereo_reg[3] |
| 814 | // ,vidc_stereo_reg[4],vidc_stereo_reg[5],vidc_stereo_reg[6],vidc_stereo_reg[7]); |
| 815 | } |
| 756 | 816 | else if (reg >= 0x80 && reg <= 0xbc) |
| 757 | 817 | { |
| 758 | 818 | switch(reg) |
| r8908 | r8909 | |
| 781 | 841 | logerror("VIDC: %s = %d\n", vrnames[(reg-0x80)/4], vidc_regs[reg]); |
| 782 | 842 | //#endif |
| 783 | 843 | |
| 784 | | /* sanity checks - first pass */ |
| 785 | | /* |
| 786 | | total cycles + border end |
| 787 | | */ |
| 788 | | if(vidc_regs[VIDC_HCR] && vidc_regs[VIDC_HBER] && |
| 789 | | vidc_regs[VIDC_VCR] && vidc_regs[VIDC_VBER]) |
| 790 | | { |
| 791 | | /* sanity checks - second pass */ |
| 792 | | /* |
| 793 | | total cycles >= border end >= border start |
| 794 | | */ |
| 795 | | if((vidc_regs[VIDC_HCR] >= vidc_regs[VIDC_HBER]) && |
| 796 | | (vidc_regs[VIDC_HBER] >= vidc_regs[VIDC_HBSR]) && |
| 797 | | (vidc_regs[VIDC_VCR] >= vidc_regs[VIDC_VBER]) && |
| 798 | | (vidc_regs[VIDC_VBER] >= vidc_regs[VIDC_VBSR])) |
| 799 | | { |
| 800 | | rectangle visarea; |
| 801 | | attoseconds_t refresh; |
| 802 | | |
| 803 | | visarea.min_x = 0; |
| 804 | | visarea.min_y = 0; |
| 805 | | visarea.max_x = vidc_regs[VIDC_HBER] - vidc_regs[VIDC_HBSR] - 1; |
| 806 | | visarea.max_y = vidc_regs[VIDC_VBER] - vidc_regs[VIDC_VBSR]; |
| 807 | | |
| 808 | | logerror("Configuring: htotal %d vtotal %d border %d x %d display %d x %d\n", |
| 809 | | vidc_regs[VIDC_HCR], vidc_regs[VIDC_VCR], |
| 810 | | visarea.max_x, visarea.max_y, |
| 811 | | vidc_regs[VIDC_HDER]-vidc_regs[VIDC_HDSR],vidc_regs[VIDC_VDER]-vidc_regs[VIDC_VDSR]+1); |
| 812 | | |
| 813 | | /* FIXME: pixel clock */ |
| 814 | | refresh = HZ_TO_ATTOSECONDS(16000000) * vidc_regs[VIDC_HCR] * vidc_regs[VIDC_VCR]; |
| 815 | | |
| 816 | | space->machine->primary_screen->configure(vidc_regs[VIDC_HCR], vidc_regs[VIDC_VCR], visarea, refresh); |
| 817 | | } |
| 818 | | } |
| 819 | | |
| 844 | vidc_dynamic_res_change(space->machine); |
| 820 | 845 | } |
| 821 | 846 | else if(reg == 0xe0) |
| 822 | 847 | { |
| 823 | | vidc_bpp_mode = ((val & 0xc) >> 2); |
| 848 | vidc_bpp_mode = ((val & 0x0c) >> 2); |
| 824 | 849 | vidc_interlace = ((val & 0x40) >> 6); |
| 850 | vidc_pixel_clk = (val & 0x03); |
| 851 | vidc_dynamic_res_change(space->machine); |
| 825 | 852 | } |
| 826 | 853 | else |
| 827 | 854 | { |
| r8908 | r8909 | |
| 892 | 919 | double sndhz; |
| 893 | 920 | |
| 894 | 921 | /* FIXME: is the frequency correct? */ |
| 895 | | sndhz = (250000.0 * 4) / (double)((vidc_regs[0xc0]&0xff)+2); |
| 922 | sndhz = (250000.0 / 2) / (double)((vidc_regs[0xc0]&0xff)+2); |
| 896 | 923 | |
| 897 | 924 | printf("MEMC: Starting audio DMA at %f Hz, buffer from %x to %x\n", sndhz, vidc_sndstart, vidc_sndend); |
| 898 | 925 | |
src/mess/drivers/a310.c
| r8908 | r8909 | |
| 107 | 107 | archimedes_init(machine); |
| 108 | 108 | |
| 109 | 109 | // reset the DAC to centerline |
| 110 | | dac_signed_data_w(machine->device("dac"), 0x80); |
| 110 | //dac_signed_data_w(machine->device("dac"), 0x80); |
| 111 | 111 | } |
| 112 | 112 | |
| 113 | 113 | static MACHINE_RESET( a310 ) |
| r8908 | r8909 | |
| 275 | 275 | MDRV_RAM_DEFAULT_SIZE("2M") |
| 276 | 276 | MDRV_RAM_EXTRA_OPTIONS("512K, 1M, 4M, 8M, 16M") |
| 277 | 277 | |
| 278 | | MDRV_SPEAKER_STANDARD_MONO("a310") |
| 279 | | MDRV_SOUND_ADD("dac", DAC, 0) |
| 280 | | MDRV_SOUND_ROUTE(0, "a310", 1.00) |
| 281 | | |
| 282 | 278 | MDRV_WD1772_ADD("wd1772", a310_wd17xx_interface ) |
| 283 | 279 | |
| 284 | 280 | //MDRV_FLOPPY_4_DRIVES_ADD(a310_floppy_config) |
| 281 | |
| 282 | MDRV_SPEAKER_STANDARD_MONO("mono") |
| 283 | MDRV_SOUND_ADD("dac0", DAC, 0) |
| 284 | MDRV_SOUND_ROUTE(0, "mono", 0.10) |
| 285 | |
| 286 | MDRV_SOUND_ADD("dac1", DAC, 0) |
| 287 | MDRV_SOUND_ROUTE(0, "mono", 0.10) |
| 288 | |
| 289 | MDRV_SOUND_ADD("dac2", DAC, 0) |
| 290 | MDRV_SOUND_ROUTE(0, "mono", 0.10) |
| 291 | |
| 292 | MDRV_SOUND_ADD("dac3", DAC, 0) |
| 293 | MDRV_SOUND_ROUTE(0, "mono", 0.10) |
| 294 | |
| 295 | MDRV_SOUND_ADD("dac4", DAC, 0) |
| 296 | MDRV_SOUND_ROUTE(0, "mono", 0.10) |
| 297 | |
| 298 | MDRV_SOUND_ADD("dac5", DAC, 0) |
| 299 | MDRV_SOUND_ROUTE(0, "mono", 0.10) |
| 300 | |
| 301 | MDRV_SOUND_ADD("dac6", DAC, 0) |
| 302 | MDRV_SOUND_ROUTE(0, "mono", 0.10) |
| 303 | |
| 304 | MDRV_SOUND_ADD("dac7", DAC, 0) |
| 305 | MDRV_SOUND_ROUTE(0, "mono", 0.10) |
| 285 | 306 | MACHINE_DRIVER_END |
| 286 | 307 | |
| 287 | 308 | ROM_START(a310) |