src/build/build.mak
| r9146 | r9147 | |
| 18 | 18 | # set of build targets |
| 19 | 19 | #------------------------------------------------- |
| 20 | 20 | |
| 21 | | FILE2STR = $(BUILDOUT)/file2str$(BUILD_EXE) |
| 22 | | PNG2BDC = $(BUILDOUT)/png2bdc$(BUILD_EXE) |
| 23 | | VERINFO = $(BUILDOUT)/verinfo$(BUILD_EXE) |
| 21 | FILE2STR_TARGET = $(BUILDOUT)/file2str$(BUILD_EXE) |
| 22 | MAKEDEP_TARGET = $(BUILDOUT)/makedep$(BUILD_EXE) |
| 23 | PNG2BDC_TARGET = $(BUILDOUT)/png2bdc$(BUILD_EXE) |
| 24 | VERINFO_TARGET = $(BUILDOUT)/verinfo$(BUILD_EXE) |
| 24 | 25 | |
| 26 | ifeq ($(TARGETOS),win32) |
| 27 | FILE2STR = $(subst /,\,$(FILE2STR_TARGET)) |
| 28 | MAKEDEP = $(subst /,\,$(MAKEDEP_TARGET)) |
| 29 | PNG2BDC = $(subst /,\,$(PNG2BDC_TARGET)) |
| 30 | VERINFO = $(subst /,\,$(VERINFO_TARGET)) |
| 31 | else |
| 32 | FILE2STR = $(FILE2STR_TARGET) |
| 33 | MAKEDEP = $(MAKEDEP_TARGET) |
| 34 | PNG2BDC = $(PNG2BDC_TARGET) |
| 35 | VERINFO = $(VERINFO_TARGET) |
| 36 | endif |
| 37 | |
| 25 | 38 | ifneq ($(CROSS_BUILD),1) |
| 26 | 39 | BUILD += \ |
| 27 | | $(FILE2STR) \ |
| 28 | | $(PNG2BDC) \ |
| 29 | | $(VERINFO) \ |
| 40 | $(FILE2STR_TARGET) \ |
| 41 | $(MAKEDEP_TARGET) \ |
| 42 | $(PNG2BDC_TARGET) \ |
| 43 | $(VERINFO_TARGET) \ |
| 30 | 44 | |
| 31 | 45 | |
| 32 | 46 | |
| r9146 | r9147 | |
| 37 | 51 | FILE2STROBJS = \ |
| 38 | 52 | $(BUILDOBJ)/file2str.o \ |
| 39 | 53 | |
| 40 | | $(FILE2STR): $(FILE2STROBJS) $(LIBOCORE) |
| 54 | $(FILE2STR_TARGET): $(FILE2STROBJS) $(LIBOCORE) |
| 41 | 55 | @echo Linking $@... |
| 42 | 56 | $(LD) $(LDFLAGS) $^ $(LIBS) -o $@ |
| 43 | 57 | |
| 44 | 58 | |
| 45 | 59 | |
| 46 | 60 | #------------------------------------------------- |
| 61 | # makedep |
| 62 | #------------------------------------------------- |
| 63 | |
| 64 | MAKEDEPOBJS = \ |
| 65 | $(BUILDOBJ)/makedep.o \ |
| 66 | |
| 67 | $(MAKEDEP_TARGET): $(MAKEDEPOBJS) $(LIBUTIL) $(LIBOCORE) $(ZLIB) |
| 68 | @echo Linking $@... |
| 69 | $(LD) $(LDFLAGS) $^ $(LIBS) -o $@ |
| 70 | |
| 71 | |
| 72 | |
| 73 | #------------------------------------------------- |
| 47 | 74 | # png2bdc |
| 48 | 75 | #------------------------------------------------- |
| 49 | 76 | |
| 50 | 77 | PNG2BDCOBJS = \ |
| 51 | 78 | $(BUILDOBJ)/png2bdc.o \ |
| 52 | 79 | |
| 53 | | $(PNG2BDC): $(PNG2BDCOBJS) $(LIBUTIL) $(LIBOCORE) $(ZLIB) |
| 80 | $(PNG2BDC_TARGET): $(PNG2BDCOBJS) $(LIBUTIL) $(LIBOCORE) $(ZLIB) |
| 54 | 81 | @echo Linking $@... |
| 55 | 82 | $(LD) $(LDFLAGS) $^ $(LIBS) -o $@ |
| 56 | 83 | |
| r9146 | r9147 | |
| 63 | 90 | VERINFOOBJS = \ |
| 64 | 91 | $(BUILDOBJ)/verinfo.o |
| 65 | 92 | |
| 66 | | $(VERINFO): $(VERINFOOBJS) $(LIBOCORE) |
| 93 | $(VERINFO_TARGET): $(VERINFOOBJS) $(LIBOCORE) |
| 67 | 94 | @echo Linking $@... |
| 68 | 95 | $(LD) $(LDFLAGS) $^ $(LIBS) -o $@ |
| 69 | 96 | |
src/osd/sdl/sdl.mak
| r9146 | r9147 | |
| 161 | 161 | |
| 162 | 162 | ifeq ($(TARGETOS),macosx) |
| 163 | 163 | BASE_TARGETOS = macosx |
| 164 | | DEFS += -DSDLMAME_UNIX -DSDLMAME_MACOSX |
| 164 | DEFS += -DSDLMAME_UNIX -DSDLMAME_MACOSX -DSDLMAME_DARWIN |
| 165 | 165 | DEBUGOBJS = $(SDLOBJ)/debugosx.o |
| 166 | 166 | SYNC_IMPLEMENTATION = ntc |
| 167 | 167 | SDLMAIN = $(SDLOBJ)/SDLMain_tmpl.o |
| r9146 | r9147 | |
| 208 | 208 | DEBUGOBJS = $(SDLOBJ)/debugwin.o $(SDLOBJ)/dview.o $(SDLOBJ)/debug-sup.o $(SDLOBJ)/debug-intf.o |
| 209 | 209 | LIBS += -lgtk-win32-2.0 -lgdk-win32-2.0 -lgmodule-2.0 -lglib-2.0 -lgobject-2.0 \ |
| 210 | 210 | -lpango-1.0 -latk-1.0 -lgdk_pixbuf-2.0 |
| 211 | | CCOMFLAGS += -mms-bitfields \ |
| 212 | | -I$(GTK_INSTALL_ROOT)/include/gtk-2.0 -I$(GTK_INSTALL_ROOT)/include/glib-2.0 \ |
| 211 | CCOMFLAGS += -mms-bitfields |
| 212 | INCPATH += -I$(GTK_INSTALL_ROOT)/include/gtk-2.0 -I$(GTK_INSTALL_ROOT)/include/glib-2.0 \ |
| 213 | 213 | -I$(GTK_INSTALL_ROOT)/include/cairo -I$(GTK_INSTALL_ROOT)/include/pango-1.0 \ |
| 214 | 214 | -I$(GTK_INSTALL_ROOT)/include/atk-1.0 \ |
| 215 | 215 | -I$(GTK_INSTALL_ROOT)/lib/glib-2.0/include -I$(GTK_INSTALL_ROOT)/lib/gtk-2.0/include |
| r9146 | r9147 | |
| 289 | 289 | OSDCLEAN = sdlclean |
| 290 | 290 | |
| 291 | 291 | # add the debugger includes |
| 292 | | CCOMFLAGS += -Isrc/debug |
| 292 | INCPATH += -Isrc/debug |
| 293 | 293 | |
| 294 | 294 | # add the prefix file |
| 295 | | CCOMFLAGS += -include $(SDLSRC)/sdlprefix.h |
| 295 | INCPATH += -include $(SDLSRC)/sdlprefix.h |
| 296 | 296 | |
| 297 | 297 | #------------------------------------------------- |
| 298 | 298 | # BASE_TARGETOS specific configurations |
| r9146 | r9147 | |
| 337 | 337 | endif |
| 338 | 338 | |
| 339 | 339 | ifndef SDL_INSTALL_ROOT |
| 340 | | CCOMFLAGS += `sdl-config --cflags` |
| 340 | INCPATH += `sdl-config --cflags` |
| 341 | 341 | LIBS += -lm `sdl-config --libs` |
| 342 | 342 | else |
| 343 | | CCOMFLAGS += -I$(SDL_INSTALL_ROOT)/include -D_GNU_SOURCE=1 |
| 343 | INCPATH += -I$(SDL_INSTALL_ROOT)/include |
| 344 | CCOMFLAGS += -D_GNU_SOURCE=1 |
| 344 | 345 | LIBS += -lm -L$(SDL_INSTALL_ROOT)/lib -Wl,-rpath,$(SDL_INSTALL_ROOT)/lib -lSDL |
| 345 | 346 | endif |
| 346 | 347 | |
| r9146 | r9147 | |
| 357 | 358 | OSDCOREOBJS += $(SDLMAIN) |
| 358 | 359 | |
| 359 | 360 | ifdef SDL_INSTALL_ROOT |
| 360 | | CCOMFLAGS += -I$(SDL_INSTALL_ROOT)/include |
| 361 | INCPATH += -I$(SDL_INSTALL_ROOT)/include |
| 361 | 362 | LIBS += -L$(SDL_INSTALL_ROOT)/lib |
| 362 | 363 | #-Wl,-rpath,$(SDL_INSTALL_ROOT)/lib |
| 363 | 364 | endif |
| r9146 | r9147 | |
| 387 | 388 | # Remove the "/SDL" component from the include path so that we can compile |
| 388 | 389 | # files (header files are #include "SDL/something.h", so the extra "/SDL" |
| 389 | 390 | # causes a significant problem) |
| 390 | | CCOMFLAGS += `sdl-config --cflags | sed 's:/SDL::'` -DNO_SDL_GLEXT |
| 391 | INCPATH += `sdl-config --cflags | sed 's:/SDL::'` |
| 392 | CCOMFLAGS += -DNO_SDL_GLEXT |
| 391 | 393 | # Remove libSDLmain, as its symbols conflict with SDLMain_tmpl.m |
| 392 | 394 | LIBS += `sdl-config --libs | sed 's/-lSDLmain//'` -lpthread |
| 393 | 395 | endif |
| r9146 | r9147 | |
| 400 | 402 | |
| 401 | 403 | ifeq ($(BASE_TARGETOS),os2) |
| 402 | 404 | |
| 403 | | CCOMFLAGS += `sdl-config --cflags` |
| 405 | INCPATH += `sdl-config --cflags` |
| 404 | 406 | LIBS += `sdl-config --libs` |
| 405 | 407 | |
| 406 | 408 | endif # OS2 |
| r9146 | r9147 | |
| 437 | 439 | ifdef MESA_INSTALL_ROOT |
| 438 | 440 | LIBS += -L$(MESA_INSTALL_ROOT)/lib |
| 439 | 441 | LDFLAGS += -Wl,-rpath=$(MESA_INSTALL_ROOT)/lib |
| 440 | | CCOMFLAGS += -I$(MESA_INSTALL_ROOT)/include |
| 442 | INCPATH += -I$(MESA_INSTALL_ROOT)/include |
| 441 | 443 | endif |
| 442 | 444 | endif |
| 443 | 445 | |
| r9146 | r9147 | |
| 454 | 456 | |
| 455 | 457 | # the new debugger relies on GTK+ in addition to the base SDLMAME needs |
| 456 | 458 | # Non-X11 builds can not use the debugger |
| 457 | | CCOMFLAGS += `pkg-config --cflags gtk+-2.0` `pkg-config --cflags gconf-2.0` |
| 459 | INCPATH += `pkg-config --cflags-only-I gtk+-2.0` `pkg-config --cflags-only-I gconf-2.0` |
| 460 | CCOMFLAGS += `pkg-config --cflags-only-other gtk+-2.0` `pkg-config --cflags-only-other gconf-2.0` |
| 458 | 461 | LIBS += `pkg-config --libs gtk+-2.0` `pkg-config --libs gconf-2.0` |
| 459 | 462 | #CCOMFLAGS += -DGTK_DISABLE_DEPRECATED |
| 460 | 463 | |
| 461 | 464 | # some systems still put important things in a different prefix |
| 462 | 465 | LIBS += -L/usr/X11/lib -L/usr/X11R6/lib -L/usr/openwin/lib |
| 463 | 466 | # make sure we can find X headers |
| 464 | | CCOMFLAGS += -I/usr/X11/include -I/usr/X11R6/include -I/usr/openwin/include |
| 467 | INCPATH += -I/usr/X11/include -I/usr/X11R6/include -I/usr/openwin/include |
| 465 | 468 | endif # NO_X11 |
| 466 | 469 | |
| 467 | 470 | #------------------------------------------------- |
| r9146 | r9147 | |
| 482 | 485 | endif # solaris |
| 483 | 486 | |
| 484 | 487 | # drawSDL depends on the core software renderer, so make sure it exists |
| 485 | | $(SDLOBJ)/drawsdl.o : $(SRC)/emu/rendersw.c $(SDLSRC)/drawogl.c $(SDLSRC)/texcopy.c |
| 488 | $(SDLOBJ)/drawsdl.o : $(SRC)/emu/rendersw.c $(SDLSRC)/drawogl.c |
| 489 | $(SDLOBJ)/drawogl.o : $(SDLSRC)/texcopy.c $(SDLSRC)/texsrc.h |
| 486 | 490 | |
| 487 | 491 | # draw13 depends on blit13.h |
| 488 | 492 | $(SDLOBJ)/draw13.o : $(SDLSRC)/blit13.h |
src/osd/windows/winmain.c
| r9146 | r9147 | |
| 118 | 118 | { |
| 119 | 119 | public: |
| 120 | 120 | stack_walker(); |
| 121 | | |
| 121 | |
| 122 | 122 | FPTR ip() const { return m_stackframe.AddrPC.Offset; } |
| 123 | 123 | FPTR sp() const { return m_stackframe.AddrStack.Offset; } |
| 124 | 124 | FPTR frame() const { return m_stackframe.AddrFrame.Offset; } |
| 125 | 125 | |
| 126 | bool reset(); |
| 126 | 127 | void reset(CONTEXT &context, HANDLE thread); |
| 127 | 128 | bool unwind(); |
| 128 | 129 | |
| r9146 | r9147 | |
| 138 | 139 | dynamic_bind<BOOL (WINAPI *)(HANDLE, LPCTSTR, BOOL)> m_sym_initialize; |
| 139 | 140 | dynamic_bind<PVOID (WINAPI *)(HANDLE, DWORD64)> m_sym_function_table_access_64; |
| 140 | 141 | dynamic_bind<DWORD64 (WINAPI *)(HANDLE, DWORD64)> m_sym_get_module_base_64; |
| 142 | dynamic_bind<VOID (WINAPI *)(PCONTEXT)> m_rtl_capture_context; |
| 141 | 143 | |
| 142 | 144 | static bool s_initialized; |
| 143 | 145 | }; |
| r9146 | r9147 | |
| 304 | 306 | { "multithreading;mt", "0", OPTION_BOOLEAN, "enable multithreading; this enables rendering and blitting on a separate thread" }, |
| 305 | 307 | { "numprocessors;np", "auto", 0, "number of processors; this overrides the number the system reports" }, |
| 306 | 308 | { "profile", "0", 0, "enable profiling, specifying the stack depth to track" }, |
| 309 | { "bench", "0", 0, "benchmark for the given number of emulated seconds; implies -video none -nosound -nothrottle" }, |
| 307 | 310 | |
| 308 | 311 | // video options |
| 309 | 312 | { NULL, NULL, OPTION_HEADER, "WINDOWS VIDEO OPTIONS" }, |
| r9146 | r9147 | |
| 391 | 394 | // allocate symbols |
| 392 | 395 | symbol_manager local_symbols(argv[0]); |
| 393 | 396 | symbols = &local_symbols; |
| 394 | | |
| 397 | |
| 395 | 398 | // set up exception handling |
| 396 | 399 | pass_thru_filter = SetUnhandledExceptionFilter(exception_filter); |
| 397 | 400 | SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX); |
| 398 | 401 | |
| 402 | // enable stack crawls for asserts |
| 403 | extern void (*s_debugger_stack_crawler)(); |
| 404 | s_debugger_stack_crawler = winmain_dump_stack; |
| 405 | |
| 399 | 406 | // if we're a GUI app, out errors to message boxes |
| 400 | 407 | if (win_is_gui_application() || is_double_click_start(argc)) |
| 401 | 408 | { |
| r9146 | r9147 | |
| 450 | 457 | void osd_init(running_machine *machine) |
| 451 | 458 | { |
| 452 | 459 | const char *stemp; |
| 460 | |
| 461 | // determine if we are benchmarking, and adjust options appropriately |
| 462 | int bench = options_get_int(machine->options(), WINOPTION_BENCH); |
| 463 | if (bench > 0) |
| 464 | { |
| 465 | options_set_bool(machine->options(), OPTION_THROTTLE, false, OPTION_PRIORITY_MAXIMUM); |
| 466 | options_set_bool(machine->options(), OPTION_SOUND, false, OPTION_PRIORITY_MAXIMUM); |
| 467 | options_set_string(machine->options(), WINOPTION_VIDEO, "none", OPTION_PRIORITY_MAXIMUM); |
| 468 | options_set_int(machine->options(), OPTION_SECONDS_TO_RUN, bench, OPTION_PRIORITY_MAXIMUM); |
| 469 | } |
| 453 | 470 | |
| 454 | 471 | // determine if we are profiling, and adjust options appropriately |
| 455 | 472 | int profile = options_get_int(machine->options(), WINOPTION_PROFILE); |
| r9146 | r9147 | |
| 457 | 474 | { |
| 458 | 475 | options_set_bool(machine->options(), OPTION_THROTTLE, false, OPTION_PRIORITY_MAXIMUM); |
| 459 | 476 | options_set_bool(machine->options(), WINOPTION_MULTITHREADING, false, OPTION_PRIORITY_MAXIMUM); |
| 460 | | options_set_bool(machine->options(), WINOPTION_NUMPROCESSORS, 1, OPTION_PRIORITY_MAXIMUM); |
| 477 | options_set_int(machine->options(), WINOPTION_NUMPROCESSORS, 1, OPTION_PRIORITY_MAXIMUM); |
| 461 | 478 | } |
| 462 | 479 | |
| 463 | 480 | // thread priority |
| r9146 | r9147 | |
| 572 | 589 | |
| 573 | 590 | |
| 574 | 591 | //============================================================ |
| 592 | // winmain_dump_stack |
| 593 | //============================================================ |
| 594 | |
| 595 | void winmain_dump_stack() |
| 596 | { |
| 597 | // set up the stack walker |
| 598 | stack_walker walker; |
| 599 | if (!walker.reset()) |
| 600 | return; |
| 601 | |
| 602 | // walk the stack |
| 603 | while (walker.unwind()) |
| 604 | fprintf(stderr, " %p: %p%s\n", (void *)walker.frame(), (void *)walker.ip(), (symbols == NULL) ? "" : symbols->symbol_for_address(walker.ip())); |
| 605 | } |
| 606 | |
| 607 | |
| 608 | //============================================================ |
| 575 | 609 | // check_for_double_click_start |
| 576 | 610 | //============================================================ |
| 577 | 611 | |
| r9146 | r9147 | |
| 744 | 778 | |
| 745 | 779 | // walk the stack |
| 746 | 780 | while (walker.unwind()) |
| 747 | | fprintf(stderr, " %p: %p%s\n", (void *)walker.frame(), (void *)walker.ip(), symbols->symbol_for_address(walker.ip())); |
| 781 | fprintf(stderr, " %p: %p%s\n", (void *)walker.frame(), (void *)walker.ip(), (symbols == NULL) ? "" : symbols->symbol_for_address(walker.ip())); |
| 748 | 782 | |
| 749 | 783 | // exit |
| 750 | 784 | return EXCEPTION_CONTINUE_SEARCH; |
| 751 | 785 | } |
| 752 | 786 | |
| 753 | 787 | |
| 754 | | |
| 755 | 788 | //************************************************************************** |
| 756 | 789 | // STACK WALKER |
| 757 | 790 | //************************************************************************** |
| r9146 | r9147 | |
| 767 | 800 | m_stack_walk_64(TEXT("dbghelp.dll"), "StackWalk64"), |
| 768 | 801 | m_sym_initialize(TEXT("dbghelp.dll"), "SymInitialize"), |
| 769 | 802 | m_sym_function_table_access_64(TEXT("dbghelp.dll"), "SymFunctionTableAccess64"), |
| 770 | | m_sym_get_module_base_64(TEXT("dbghelp.dll"), "SymGetModuleBase64") |
| 803 | m_sym_get_module_base_64(TEXT("dbghelp.dll"), "SymGetModuleBase64"), |
| 804 | m_rtl_capture_context(TEXT("kernel32.dll"), "RtlCaptureContext") |
| 771 | 805 | { |
| 772 | 806 | // zap the structs |
| 773 | 807 | memset(&m_stackframe, 0, sizeof(m_stackframe)); |
| r9146 | r9147 | |
| 786 | 820 | // reset - set up a new context |
| 787 | 821 | //------------------------------------------------- |
| 788 | 822 | |
| 823 | bool stack_walker::reset() |
| 824 | { |
| 825 | // set up the initial state |
| 826 | if (!m_rtl_capture_context) |
| 827 | return false; |
| 828 | (*m_rtl_capture_context)(&m_context); |
| 829 | m_thread = GetCurrentThread(); |
| 830 | m_first = true; |
| 831 | |
| 832 | // initialize the stackframe |
| 833 | memset(&m_stackframe, 0, sizeof(m_stackframe)); |
| 834 | m_stackframe.AddrPC.Mode = AddrModeFlat; |
| 835 | m_stackframe.AddrFrame.Mode = AddrModeFlat; |
| 836 | m_stackframe.AddrStack.Mode = AddrModeFlat; |
| 837 | |
| 838 | // pull architecture-specific fields from the context |
| 839 | #ifdef PTR64 |
| 840 | m_stackframe.AddrPC.Offset = m_context.Rip; |
| 841 | m_stackframe.AddrFrame.Offset = m_context.Rsp; |
| 842 | m_stackframe.AddrStack.Offset = m_context.Rsp; |
| 843 | #else |
| 844 | m_stackframe.AddrPC.Offset = m_context.Eip; |
| 845 | m_stackframe.AddrFrame.Offset = m_context.Ebp; |
| 846 | m_stackframe.AddrStack.Offset = m_context.Esp; |
| 847 | #endif |
| 848 | return true; |
| 849 | } |
| 850 | |
| 789 | 851 | void stack_walker::reset(CONTEXT &initial, HANDLE thread) |
| 790 | 852 | { |
| 791 | 853 | // set up the initial state |
src/emu/devcb.h
| r9146 | r9147 | |
| 61 | 61 | MACROS |
| 62 | 62 | ***************************************************************************/ |
| 63 | 63 | |
| 64 | // static template for a read_line stub function that calls through a given READ_LINE_MEMBER |
| 65 | template<class _Class, int (_Class::*_Function)()> |
| 66 | int devcb_line_stub(device_t *device) |
| 67 | { |
| 68 | _Class *target = downcast<_Class *>(device); |
| 69 | return (target->*_Function)(); |
| 70 | } |
| 71 | |
| 64 | 72 | // static template for a read8 stub function that calls through a given READ8_MEMBER |
| 65 | 73 | template<class _Class, UINT8 (_Class::*_Function)(address_space &, offs_t, UINT8)> |
| 66 | 74 | UINT8 devcb_stub(device_t *device, offs_t offset) |
| r9146 | r9147 | |
| 69 | 77 | return (target->*_Function)(*device->machine->m_nonspecific_space, offset, 0xff); |
| 70 | 78 | } |
| 71 | 79 | |
| 80 | // static template for a write_line stub function that calls through a given WRITE_LINE_MEMBER |
| 81 | template<class _Class, void (_Class::*_Function)(int state)> |
| 82 | void devcb_line_stub(device_t *device, int state) |
| 83 | { |
| 84 | _Class *target = downcast<_Class *>(device); |
| 85 | (target->*_Function)(state); |
| 86 | } |
| 87 | |
| 72 | 88 | // static template for a write8 stub function that calls through a given WRITE8_MEMBER |
| 73 | 89 | template<class _Class, void (_Class::*_Function)(address_space &, offs_t, UINT8, UINT8)> |
| 74 | 90 | void devcb_stub(device_t *device, offs_t offset, UINT8 data) |
| r9146 | r9147 | |
| 80 | 96 | #define DEVCB_NULL { DEVCB_TYPE_NULL } |
| 81 | 97 | |
| 82 | 98 | /* standard line or read/write handlers with the calling device passed */ |
| 83 | | #define DEVCB_LINE(func) { DEVCB_TYPE_SELF, NULL, (func), NULL, NULL } |
| 84 | | #define DEVCB_LINE_GND { DEVCB_TYPE_SELF, NULL, devcb_line_gnd_r, NULL, NULL } |
| 85 | | #define DEVCB_LINE_VCC { DEVCB_TYPE_SELF, NULL, devcb_line_vcc_r, NULL, NULL } |
| 86 | | #define DEVCB_HANDLER(func) { DEVCB_TYPE_SELF, NULL, NULL, (func), NULL } |
| 99 | #define DEVCB_LINE(func) { DEVCB_TYPE_SELF, NULL, (func), NULL, NULL } |
| 100 | #define DEVCB_LINE_MEMBER(func) { DEVCB_TYPE_SELF, NULL, &devcb_line_stub<cls, &cls::memb>, NULL, NULL } |
| 101 | #define DEVCB_LINE_GND { DEVCB_TYPE_SELF, NULL, devcb_line_gnd_r, NULL, NULL } |
| 102 | #define DEVCB_LINE_VCC { DEVCB_TYPE_SELF, NULL, devcb_line_vcc_r, NULL, NULL } |
| 103 | #define DEVCB_HANDLER(func) { DEVCB_TYPE_SELF, NULL, NULL, (func), NULL } |
| 104 | #define DEVCB_MEMBER(cls,memb) { DEVCB_TYPE_SELF, NULL, NULL, &devcb_stub<cls, &cls::memb>, NULL } |
| 87 | 105 | |
| 88 | 106 | /* line or read/write handlers for another device */ |
| 89 | | #define DEVCB_DEVICE_LINE(tag,func) { DEVCB_TYPE_DEVICE, tag, (func), NULL, NULL } |
| 90 | | #define DEVCB_DEVICE_HANDLER(tag,func) { DEVCB_TYPE_DEVICE, tag, NULL, (func), NULL } |
| 91 | | #define DEVCB_DEVICE_MEMBER(tag,cls,memb) { DEVCB_TYPE_DEVICE, tag, NULL, &devcb_stub<cls, &cls::memb>, NULL } |
| 107 | #define DEVCB_DEVICE_LINE(tag,func) { DEVCB_TYPE_DEVICE, tag, (func), NULL, NULL } |
| 108 | #define DEVCB_DEVICE_LINE_MEMBER(tag,cls,memb) { DEVCB_TYPE_DEVICE, tag, &devcb_line_stub<cls, &cls::memb>, NULL, NULL } |
| 109 | #define DEVCB_DEVICE_HANDLER(tag,func) { DEVCB_TYPE_DEVICE, tag, NULL, (func), NULL } |
| 110 | #define DEVCB_DEVICE_MEMBER(tag,cls,memb) { DEVCB_TYPE_DEVICE, tag, NULL, &devcb_stub<cls, &cls::memb>, NULL } |
| 92 | 111 | |
| 93 | 112 | /* read/write handlers for a given CPU's address space */ |
| 94 | 113 | #define DEVCB_MEMORY_HANDLER(cpu,space,func) { DEVCB_TYPE_MEMORY(ADDRESS_SPACE_##space), (cpu), NULL, NULL, (func) } |
| r9146 | r9147 | |
| 104 | 123 | #define READ_LINE_DEVICE_HANDLER(name) int name(ATTR_UNUSED device_t *device) |
| 105 | 124 | #define WRITE_LINE_DEVICE_HANDLER(name) void name(ATTR_UNUSED device_t *device, ATTR_UNUSED int state) |
| 106 | 125 | |
| 126 | #define DECLARE_READ_LINE_MEMBER(name) int name() |
| 127 | #define READ_LINE_MEMBER(name) int name() |
| 128 | #define DECLARE_WRITE_LINE_MEMBER(name) void name(ATTR_UNUSED int state) |
| 129 | #define WRITE_LINE_MEMBER(name) void name(ATTR_UNUSED int state) |
| 130 | |
| 107 | 131 | /* macros for inline device handler initialization */ |
| 108 | 132 | |
| 109 | 133 | #define MDRV_DEVICE_CONFIG_DEVCB_GENERIC(_access, _struct, _entry, _tag, _type, _linefunc, _devfunc, _spacefunc) \ |
src/emu/devintrf.c
| r9146 | r9147 | |
| 548 | 548 | m_baseconfig(config), |
| 549 | 549 | m_unscaled_clock(config.m_clock), |
| 550 | 550 | m_clock_scale(1.0), |
| 551 | | m_attoseconds_per_clock((config.m_clock == 0) ? 0 : HZ_TO_ATTOSECONDS(config.m_clock)) |
| 551 | m_attoseconds_per_clock((config.m_clock == 0) ? 0 : HZ_TO_ATTOSECONDS(config.m_clock)), |
| 552 | m_auto_finder_list(NULL) |
| 552 | 553 | { |
| 553 | 554 | } |
| 554 | 555 | |
| r9146 | r9147 | |
| 692 | 693 | // populate the region field |
| 693 | 694 | m_region = m_machine.region(tag()); |
| 694 | 695 | |
| 696 | // find all the registered devices |
| 697 | for (auto_finder_base *autodev = m_auto_finder_list; autodev != NULL; autodev = autodev->m_next) |
| 698 | autodev->findit(*this); |
| 699 | |
| 695 | 700 | // let the interfaces do their pre-work |
| 696 | 701 | for (device_interface *intf = m_interface_list; intf != NULL; intf = intf->interface_next()) |
| 697 | 702 | intf->interface_pre_start(); |
| r9146 | r9147 | |
| 864 | 869 | |
| 865 | 870 | |
| 866 | 871 | //------------------------------------------------- |
| 872 | // device_timer - called whenever a device timer |
| 873 | // fires |
| 874 | //------------------------------------------------- |
| 875 | |
| 876 | void device_t::device_timer(emu_timer &timer, int param, void *ptr) |
| 877 | { |
| 878 | // do nothing by default |
| 879 | } |
| 880 | |
| 881 | |
| 882 | //------------------------------------------------- |
| 867 | 883 | // notify_clock_changed - notify all interfaces |
| 868 | 884 | // that the clock has changed |
| 869 | 885 | //------------------------------------------------- |
| r9146 | r9147 | |
| 877 | 893 | // then notify the device |
| 878 | 894 | device_clock_changed(); |
| 879 | 895 | } |
| 896 | |
| 897 | |
| 898 | //------------------------------------------------- |
| 899 | // register_auto_finder - add a new item to the |
| 900 | // list of stuff to find after we go live |
| 901 | //------------------------------------------------- |
| 902 | |
| 903 | void device_t::register_auto_finder(auto_finder_base &autodev) |
| 904 | { |
| 905 | // add to this list |
| 906 | autodev.m_next = m_auto_finder_list; |
| 907 | m_auto_finder_list = &autodev; |
| 908 | } |
| 909 | |
| 910 | |
| 911 | //------------------------------------------------- |
| 912 | // auto_finder_base - constructor |
| 913 | //------------------------------------------------- |
| 914 | |
| 915 | device_t::auto_finder_base::auto_finder_base(device_t &base, const char *tag) |
| 916 | : m_next(NULL), |
| 917 | m_tag(tag) |
| 918 | { |
| 919 | // register ourselves with our device class |
| 920 | base.register_auto_finder(*this); |
| 921 | } |
| 922 | |
| 923 | |
| 924 | //------------------------------------------------- |
| 925 | // ~auto_finder_base - destructor |
| 926 | //------------------------------------------------- |
| 927 | |
| 928 | device_t::auto_finder_base::~auto_finder_base() |
| 929 | { |
| 930 | } |
| 931 | |
| 932 | |
| 933 | //------------------------------------------------- |
| 934 | // find_device - find a device; done here instead |
| 935 | // of inline in the template due to include |
| 936 | // dependency ordering |
| 937 | //------------------------------------------------- |
| 938 | |
| 939 | device_t *device_t::auto_finder_base::find_device(device_t &base, const char *tag) |
| 940 | { |
| 941 | return base.subdevice(tag); |
| 942 | } |
| 943 | |
| 944 | |
| 945 | //------------------------------------------------- |
| 946 | // find_shared_ptr - find a shared pointer |
| 947 | //------------------------------------------------- |
| 948 | |
| 949 | void *device_t::auto_finder_base::find_shared_ptr(device_t &base, const char *tag) |
| 950 | { |
| 951 | return memory_get_shared(*base.machine, tag); |
| 952 | } |
| 953 | |
| 954 | |
| 955 | //------------------------------------------------- |
| 956 | // find_shared_size - find a shared pointer size |
| 957 | //------------------------------------------------- |
| 958 | |
| 959 | size_t device_t::auto_finder_base::find_shared_size(device_t &base, const char *tag) |
| 960 | { |
| 961 | size_t result = 0; |
| 962 | memory_get_shared(*base.machine, tag, result); |
| 963 | return result; |
| 964 | } |
src/emu/devintrf.h
| r9146 | r9147 | |
| 126 | 126 | class device_state_interface; |
| 127 | 127 | struct rom_entry; |
| 128 | 128 | class machine_config; |
| 129 | class emu_timer; |
| 129 | 130 | |
| 130 | 131 | |
| 131 | 132 | // exception classes |
| r9146 | r9147 | |
| 405 | 406 | const region_info *subregion(const char *tag) const; |
| 406 | 407 | device_t *subdevice(const char *tag) const; |
| 407 | 408 | device_t *siblingdevice(const char *tag) const; |
| 409 | template<class T> inline T *subdevice(const char *tag) { return downcast<T *>(subdevice(tag)); } |
| 410 | template<class T> inline T *siblingdevice(const char *tag) { return downcast<T *>(siblingdevice(tag)); } |
| 408 | 411 | |
| 409 | 412 | // configuration helpers |
| 410 | 413 | const device_config &baseconfig() const { return m_baseconfig; } |
| r9146 | r9147 | |
| 422 | 425 | void set_clock_scale(double clockscale); |
| 423 | 426 | attotime clocks_to_attotime(UINT64 clocks) const; |
| 424 | 427 | UINT64 attotime_to_clocks(attotime duration) const; |
| 428 | void timer_fired(emu_timer &timer, int param, void *ptr) { device_timer(timer, param, ptr); } |
| 425 | 429 | |
| 426 | 430 | // debugging |
| 427 | 431 | device_debug *debug() const { return m_debug; } |
| r9146 | r9147 | |
| 456 | 460 | virtual void device_post_load(); |
| 457 | 461 | virtual void device_clock_changed(); |
| 458 | 462 | virtual void device_debug_setup(); |
| 463 | virtual void device_timer(emu_timer &timer, int param, void *ptr); |
| 459 | 464 | |
| 460 | 465 | //------------------- end derived class overrides |
| 461 | 466 | |
| r9146 | r9147 | |
| 480 | 485 | UINT32 m_unscaled_clock; // unscaled clock |
| 481 | 486 | double m_clock_scale; // clock scale factor |
| 482 | 487 | attoseconds_t m_attoseconds_per_clock;// period in attoseconds |
| 488 | |
| 489 | // helper class to request auto-object discovery in the constructor of a derived class |
| 490 | class auto_finder_base |
| 491 | { |
| 492 | public: |
| 493 | // construction/destruction |
| 494 | auto_finder_base(device_t &base, const char *tag); |
| 495 | virtual ~auto_finder_base(); |
| 496 | |
| 497 | // getters |
| 498 | virtual void findit(device_t &base) = 0; |
| 499 | |
| 500 | // helpers |
| 501 | device_t *find_device(device_t &device, const char *tag); |
| 502 | void *find_shared_ptr(device_t &device, const char *tag); |
| 503 | size_t find_shared_size(device_t &device, const char *tag); |
| 504 | |
| 505 | // internal state |
| 506 | auto_finder_base *m_next; |
| 507 | const char *m_tag; |
| 508 | }; |
| 509 | |
| 510 | // templated version bound to a specific type |
| 511 | template<typename _TargetType, bool _Required> |
| 512 | class auto_finder_type : public auto_finder_base |
| 513 | { |
| 514 | public: |
| 515 | // construction/destruction |
| 516 | auto_finder_type(device_t &base, const char *tag) |
| 517 | : auto_finder_base(base, tag), |
| 518 | m_target(0) { } |
| 519 | |
| 520 | // operators to make use transparent |
| 521 | operator _TargetType() { return m_target; } |
| 522 | operator _TargetType() const { return m_target; } |
| 523 | _TargetType operator->() { return m_target; } |
| 524 | |
| 525 | // setter for setting the object |
| 526 | void set_target(_TargetType target) |
| 527 | { |
| 528 | m_target = target; |
| 529 | if (target == 0 && _Required) |
| 530 | throw emu_fatalerror("Unable to find required object '%s'", this->m_tag); |
| 531 | } |
| 532 | |
| 533 | // internal state |
| 534 | _TargetType m_target; |
| 535 | }; |
| 536 | |
| 537 | // optional device finder |
| 538 | template<class _DeviceClass> |
| 539 | class optional_device : public auto_finder_type<_DeviceClass *, false> |
| 540 | { |
| 541 | public: |
| 542 | optional_device(device_t &base, const char *tag) : auto_finder_type<_DeviceClass *, false>(base, tag) { } |
| 543 | virtual void findit(device_t &base) { set_target(downcast<_DeviceClass *>(find_device(base, this->m_tag))); } |
| 544 | }; |
| 545 | |
| 546 | // required devices are similar but throw an error if they are not found |
| 547 | template<class _DeviceClass> |
| 548 | class required_device : public auto_finder_type<_DeviceClass *, true> |
| 549 | { |
| 550 | public: |
| 551 | required_device(device_t &base, const char *tag) : auto_finder_type<_DeviceClass *, true>(base, tag) { } |
| 552 | virtual void findit(device_t &base) { set_target(downcast<_DeviceClass *>(find_device(base, this->m_tag))); } |
| 553 | }; |
| 554 | |
| 555 | // optional shared pointer finder |
| 556 | template<typename _PointerType> |
| 557 | class optional_shared_ptr : public auto_finder_type<_PointerType *, false> |
| 558 | { |
| 559 | public: |
| 560 | optional_shared_ptr(device_t &base, const char *tag) : auto_finder_type<_PointerType *, false>(base, tag) { } |
| 561 | virtual void findit(device_t &base) { set_target(reinterpret_cast<_PointerType *>(find_shared_ptr(base, this->m_tag))); } |
| 562 | }; |
| 563 | |
| 564 | // required shared pointer finder |
| 565 | template<typename _PointerType> |
| 566 | class required_shared_ptr : public auto_finder_type<_PointerType *, true> |
| 567 | { |
| 568 | public: |
| 569 | required_shared_ptr(device_t &base, const char *tag) : auto_finder_type<_PointerType *, true>(base, tag) { } |
| 570 | virtual void findit(device_t &base) { set_target(reinterpret_cast<_PointerType *>(find_shared_ptr(base, this->m_tag))); } |
| 571 | }; |
| 572 | |
| 573 | // optional shared pointer size finder |
| 574 | class optional_shared_size : public auto_finder_type<size_t, false> |
| 575 | { |
| 576 | public: |
| 577 | optional_shared_size(device_t &base, const char *tag) : auto_finder_type<size_t, false>(base, tag) { } |
| 578 | virtual void findit(device_t &base) { set_target(find_shared_size(base, this->m_tag)); } |
| 579 | }; |
| 580 | |
| 581 | // required shared pointer size finder |
| 582 | class required_shared_size : public auto_finder_type<size_t, true> |
| 583 | { |
| 584 | public: |
| 585 | required_shared_size(device_t &base, const char *tag) : auto_finder_type<size_t, true>(base, tag) { } |
| 586 | virtual void findit(device_t &base) { set_target(find_shared_size(base, this->m_tag)); } |
| 587 | }; |
| 588 | |
| 589 | // internal helpers |
| 590 | void register_auto_finder(auto_finder_base &autodev); |
| 591 | |
| 592 | auto_finder_base * m_auto_finder_list; |
| 483 | 593 | }; |
| 484 | 594 | |
| 485 | 595 | |
src/emu/sound/asc.c
| r0 | r9147 | |
| 1 | /*************************************************************************** |
| 2 | |
| 3 | asc.c |
| 4 | |
| 5 | Apple Sound Chip (ASC) 344S0063 |
| 6 | Enhanced Apple Sound Chip (EASC) 343S1063 |
| 7 | |
| 8 | Emulation by R. Belmont |
| 9 | |
| 10 | ***************************************************************************/ |
| 11 | |
| 12 | #include "emu.h" |
| 13 | #include "streams.h" |
| 14 | #include "asc.h" |
| 15 | |
| 16 | //************************************************************************** |
| 17 | // GLOBAL VARIABLES |
| 18 | //************************************************************************** |
| 19 | |
| 20 | //************************************************************************** |
| 21 | // DEVICE CONFIGURATION |
| 22 | //************************************************************************** |
| 23 | |
| 24 | //------------------------------------------------- |
| 25 | // static_set_type - configuration helper to set |
| 26 | // the chip type |
| 27 | //------------------------------------------------- |
| 28 | |
| 29 | void asc_device_config::static_set_type(device_config *device, int type) |
| 30 | { |
| 31 | asc_device_config *asc = downcast<asc_device_config *>(device); |
| 32 | asc->m_type = type; |
| 33 | } |
| 34 | |
| 35 | //------------------------------------------------- |
| 36 | // asc_device_config - constructor |
| 37 | //------------------------------------------------- |
| 38 | |
| 39 | asc_device_config::asc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) |
| 40 | : device_config(mconfig, static_alloc_device_config, "ASC", tag, owner, clock), |
| 41 | device_config_sound_interface(mconfig, *this) |
| 42 | { |
| 43 | } |
| 44 | |
| 45 | |
| 46 | //------------------------------------------------- |
| 47 | // static_alloc_device_config - allocate a new |
| 48 | // configuration object |
| 49 | //------------------------------------------------- |
| 50 | |
| 51 | device_config *asc_device_config::static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) |
| 52 | { |
| 53 | return global_alloc(asc_device_config(mconfig, tag, owner, clock)); |
| 54 | } |
| 55 | |
| 56 | |
| 57 | //------------------------------------------------- |
| 58 | // alloc_device - allocate a new device object |
| 59 | //------------------------------------------------- |
| 60 | |
| 61 | device_t *asc_device_config::alloc_device(running_machine &machine) const |
| 62 | { |
| 63 | return auto_alloc(&machine, asc_device(machine, *this)); |
| 64 | } |
| 65 | |
| 66 | //************************************************************************** |
| 67 | // LIVE DEVICE |
| 68 | //************************************************************************** |
| 69 | |
| 70 | //------------------------------------------------- |
| 71 | // asc_device - constructor |
| 72 | //------------------------------------------------- |
| 73 | |
| 74 | asc_device::asc_device(running_machine &_machine, const asc_device_config &config) |
| 75 | : device_t(_machine, config), |
| 76 | device_sound_interface(_machine, config, *this), |
| 77 | m_config(config), |
| 78 | m_chip_type(m_config.m_type) |
| 79 | { |
| 80 | } |
| 81 | |
| 82 | |
| 83 | //------------------------------------------------- |
| 84 | // device_start - device-specific startup |
| 85 | //------------------------------------------------- |
| 86 | |
| 87 | void asc_device::device_start() |
| 88 | { |
| 89 | // create the stream |
| 90 | m_stream = stream_create(this, 0, 2, 22257, this, static_stream_generate); |
| 91 | } |
| 92 | |
| 93 | |
| 94 | //------------------------------------------------- |
| 95 | // device_reset - device-specific reset |
| 96 | //------------------------------------------------- |
| 97 | |
| 98 | void asc_device::device_reset() |
| 99 | { |
| 100 | stream_update(m_stream); |
| 101 | } |
| 102 | |
| 103 | //------------------------------------------------- |
| 104 | // stream_generate - handle update requests for |
| 105 | // our sound stream |
| 106 | //------------------------------------------------- |
| 107 | |
| 108 | STREAM_UPDATE( asc_device::static_stream_generate ) |
| 109 | { |
| 110 | reinterpret_cast<asc_device *>(param)->stream_generate(inputs, outputs, samples); |
| 111 | } |
| 112 | |
| 113 | void asc_device::stream_generate(stream_sample_t **inputs, stream_sample_t **outputs, int samples) |
| 114 | { |
| 115 | // reset the output stream |
| 116 | memset(outputs[0], 0, samples * sizeof(*outputs[0])); |
| 117 | } |
| 118 | |
| 119 | //------------------------------------------------- |
| 120 | // read - read from the chip's registers and internal RAM |
| 121 | //------------------------------------------------- |
| 122 | |
| 123 | UINT8 asc_device::read(UINT16 offset) |
| 124 | { |
| 125 | if (offset < 0x400) |
| 126 | { |
| 127 | return fifo_a[offset]; |
| 128 | } |
| 129 | else if (offset < 0x800) |
| 130 | { |
| 131 | return fifo_b[offset-0x400]; |
| 132 | } |
| 133 | else |
| 134 | { |
| 135 | switch (offset) |
| 136 | { |
| 137 | case 0x800: // VERSION |
| 138 | switch (m_chip_type) |
| 139 | { |
| 140 | case ASC_TYPE_ASC: |
| 141 | return 0; |
| 142 | |
| 143 | case ASC_TYPE_V8: |
| 144 | return 0xe8; |
| 145 | |
| 146 | case ASC_TYPE_SONORA: |
| 147 | return 0xbc; |
| 148 | |
| 149 | default: |
| 150 | return 0; |
| 151 | } |
| 152 | break; |
| 153 | |
| 154 | case 0x804: // FIFO Interrupt Status |
| 155 | if (m_chip_type == ASC_TYPE_V8) |
| 156 | { |
| 157 | return 3; |
| 158 | } |
| 159 | break; |
| 160 | |
| 161 | default: |
| 162 | break; |
| 163 | } |
| 164 | } |
| 165 | |
| 166 | return regs[offset-0x800]; |
| 167 | } |
| 168 | |
| 169 | //------------------------------------------------- |
| 170 | // write - write to the chip's registers and internal RAM |
| 171 | //------------------------------------------------- |
| 172 | |
| 173 | void asc_device::write(UINT16 offset, UINT8 data) |
| 174 | { |
| 175 | if (offset < 0x400) |
| 176 | { |
| 177 | fifo_a[offset] = data; |
| 178 | } |
| 179 | else if (offset < 0x800) |
| 180 | { |
| 181 | fifo_b[offset-0x400] = data; |
| 182 | } |
| 183 | else |
| 184 | { |
| 185 | regs[offset-0x800] = data; |
| 186 | } |
| 187 | } |
| 188 | |
| 189 | const device_type ASC = asc_device_config::static_alloc_device_config; |
| 190 | |
src/emu/sound/asc.h
| r0 | r9147 | |
| 1 | /*************************************************************************** |
| 2 | |
| 3 | asc.h |
| 4 | |
| 5 | Apple Sound Chip (ASC) 344S0063 |
| 6 | Enhanced Apple Sound Chip (EASC) 343S1063 |
| 7 | |
| 8 | ***************************************************************************/ |
| 9 | |
| 10 | #pragma once |
| 11 | |
| 12 | #ifndef __ASC_H__ |
| 13 | #define __ASC_H__ |
| 14 | |
| 15 | #include "streams.h" |
| 16 | |
| 17 | |
| 18 | |
| 19 | //************************************************************************** |
| 20 | // CONSTANTS |
| 21 | //************************************************************************** |
| 22 | |
| 23 | // chip behavior types |
| 24 | enum |
| 25 | { |
| 26 | ASC_TYPE_ASC = 0, // original discrete Apple Sound Chip |
| 27 | ASC_TYPE_EASC = 1, // discrete Enhanced Apple Sound Chip |
| 28 | ASC_TYPE_V8 = 2, // Subset of ASC included in the V8 ASIC (LC/LCII) |
| 29 | ASC_TYPE_EAGLE = 3, // Subset of ASC included in the Eagle ASIC (Classic II) |
| 30 | ASC_TYPE_SPICE = 4, // Subset of ASC included in the Spice ASIC (Color Classic) |
| 31 | ASC_TYPE_SONORA = 5, // Subset of ASC included in the Sonora ASIC (LCIII) |
| 32 | ASC_TYPE_VASP = 6, // Subset of ASC included in the VASP ASIC (IIvx/IIvi) |
| 33 | ASC_TYPE_ARDBEG = 7 // Subset of ASC included in the Ardbeg ASIC (LC520) |
| 34 | }; |
| 35 | |
| 36 | |
| 37 | |
| 38 | //************************************************************************** |
| 39 | // INTERFACE CONFIGURATION MACROS |
| 40 | //************************************************************************** |
| 41 | |
| 42 | #define MDRV_ASC_ADD(_tag, _clock, _type) \ |
| 43 | MDRV_DEVICE_ADD(_tag, ASC, _clock) \ |
| 44 | MDRV_ASC_TYPE(_type) |
| 45 | |
| 46 | #define MDRV_ASC_REPLACE(_tag, _clock, _type) \ |
| 47 | MDRV_DEVICE_REPLACE(_tag, ASC, _clock) \ |
| 48 | MDRV_ASC_TYPE(_type) |
| 49 | |
| 50 | #define MDRV_ASC_TYPE(_type) \ |
| 51 | asc_device_config::static_set_type(device, _type); \ |
| 52 | |
| 53 | |
| 54 | |
| 55 | //************************************************************************** |
| 56 | // TYPE DEFINITIONS |
| 57 | //************************************************************************** |
| 58 | |
| 59 | // ======================> asc_device_config |
| 60 | |
| 61 | class asc_device_config : public device_config, public device_config_sound_interface |
| 62 | { |
| 63 | friend class asc_device; |
| 64 | |
| 65 | // construction/destruction |
| 66 | asc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); |
| 67 | |
| 68 | public: |
| 69 | // allocators |
| 70 | static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); |
| 71 | virtual device_t *alloc_device(running_machine &machine) const; |
| 72 | |
| 73 | // inline configuration helpers |
| 74 | static void static_set_type(device_config *device, int type); |
| 75 | |
| 76 | protected: |
| 77 | // device_config overrides |
| 78 | virtual const address_space_config *memory_space_config(int spacenum = 0) const; |
| 79 | |
| 80 | // internal state |
| 81 | const address_space_config m_space_config; |
| 82 | |
| 83 | // inline data |
| 84 | UINT8 m_type; |
| 85 | }; |
| 86 | |
| 87 | |
| 88 | |
| 89 | // ======================> asc_device |
| 90 | |
| 91 | class asc_device : public device_t, public device_sound_interface |
| 92 | { |
| 93 | friend class asc_device_config; |
| 94 | |
| 95 | // construction/destruction |
| 96 | asc_device(running_machine &_machine, const asc_device_config &config); |
| 97 | |
| 98 | public: |
| 99 | UINT8 read(UINT16 offset); |
| 100 | void write(UINT16 offset, UINT8 data); |
| 101 | |
| 102 | protected: |
| 103 | // device-level overrides |
| 104 | virtual void device_start(); |
| 105 | virtual void device_reset(); |
| 106 | |
| 107 | // internal callbacks |
| 108 | static STREAM_UPDATE( static_stream_generate ); |
| 109 | virtual void stream_generate(stream_sample_t **inputs, stream_sample_t **outputs, int samples); |
| 110 | |
| 111 | // internal state |
| 112 | const asc_device_config &m_config; |
| 113 | |
| 114 | UINT8 m_chip_type; |
| 115 | sound_stream *m_stream; |
| 116 | |
| 117 | UINT8 fifo_a[0x400]; |
| 118 | UINT8 fifo_b[0x400]; |
| 119 | |
| 120 | UINT8 regs[0x100]; |
| 121 | }; |
| 122 | |
| 123 | |
| 124 | // device type definition |
| 125 | extern const device_type ASC; |
| 126 | |
| 127 | |
| 128 | #endif /* __ASC_H__ */ |
| 129 | |
src/emu/machine.h
| r9146 | r9147 | |
| 628 | 628 | virtual void device_start(); |
| 629 | 629 | virtual void device_reset(); |
| 630 | 630 | |
| 631 | | // helper class to request auto-object discovery in the constructor of a derived class |
| 632 | | class auto_finder_base |
| 633 | | { |
| 634 | | public: |
| 635 | | // construction/destruction |
| 636 | | auto_finder_base(driver_device &base, const char *tag); |
| 637 | | virtual ~auto_finder_base(); |
| 638 | | |
| 639 | | // getters |
| 640 | | virtual void findit(driver_device &base) = 0; |
| 641 | | |
| 642 | | // internal state |
| 643 | | auto_finder_base *m_next; |
| 644 | | const char *m_tag; |
| 645 | | }; |
| 646 | | |
| 647 | | // templated version bound to a specific type |
| 648 | | template<typename _TargetType, bool _Required> |
| 649 | | class auto_finder_type : public auto_finder_base |
| 650 | | { |
| 651 | | public: |
| 652 | | // construction/destruction |
| 653 | | auto_finder_type(driver_device &base, const char *tag) |
| 654 | | : auto_finder_base(base, tag), |
| 655 | | m_target(NULL) { } |
| 656 | | |
| 657 | | // operators to make use transparent |
| 658 | | operator _TargetType() { return m_target; } |
| 659 | | operator _TargetType() const { return m_target; } |
| 660 | | _TargetType operator->() { return m_target; } |
| 661 | | |
| 662 | | // setter for setting the object |
| 663 | | void set_target(_TargetType target) |
| 664 | | { |
| 665 | | m_target = target; |
| 666 | | if (target == 0 && _Required) |
| 667 | | throw emu_fatalerror("Unable to find required object '%s'", this->m_tag); |
| 668 | | } |
| 669 | | |
| 670 | | // internal state |
| 671 | | _TargetType m_target; |
| 672 | | }; |
| 673 | | |
| 674 | | // optional device finder |
| 675 | | template<class _DeviceClass> |
| 676 | | class optional_device : public auto_finder_type<_DeviceClass *, false> |
| 677 | | { |
| 678 | | public: |
| 679 | | optional_device(driver_device &base, const char *tag) : auto_finder_type<_DeviceClass *, false>(base, tag) { } |
| 680 | | virtual void findit(driver_device &base) { set_target(base.m_machine.device<_DeviceClass>(this->m_tag)); } |
| 681 | | }; |
| 682 | | |
| 683 | | // required devices are similar but throw an error if they are not found |
| 684 | | template<class _DeviceClass> |
| 685 | | class required_device : public auto_finder_type<_DeviceClass *, true> |
| 686 | | { |
| 687 | | public: |
| 688 | | required_device(driver_device &base, const char *tag) : auto_finder_type<_DeviceClass *, true>(base, tag) { } |
| 689 | | virtual void findit(driver_device &base) { set_target(base.m_machine.device<_DeviceClass>(this->m_tag)); } |
| 690 | | }; |
| 691 | | |
| 692 | | // optional shared pointer finder |
| 693 | | template<typename _PointerType> |
| 694 | | class optional_shared_ptr : public auto_finder_type<_PointerType *, false> |
| 695 | | { |
| 696 | | public: |
| 697 | | optional_shared_ptr(driver_device &base, const char *tag) : auto_finder_type<_PointerType *, false>(base, tag) { } |
| 698 | | virtual void findit(driver_device &base) { set_target(reinterpret_cast<_PointerType *>(memory_get_shared(base.m_machine, this->m_tag))); } |
| 699 | | }; |
| 700 | | |
| 701 | | // required shared pointer finder |
| 702 | | template<typename _PointerType> |
| 703 | | class required_shared_ptr : public auto_finder_type<_PointerType *, true> |
| 704 | | { |
| 705 | | public: |
| 706 | | required_shared_ptr(driver_device &base, const char *tag) : auto_finder_type<_PointerType *, true>(base, tag) { } |
| 707 | | virtual void findit(driver_device &base) { set_target(reinterpret_cast<_PointerType *>(memory_get_shared(base.m_machine, this->m_tag))); } |
| 708 | | }; |
| 709 | | |
| 710 | | // optional shared pointer size finder |
| 711 | | class optional_shared_size : public auto_finder_type<size_t, false> |
| 712 | | { |
| 713 | | public: |
| 714 | | optional_shared_size(driver_device &base, const char *tag) : auto_finder_type<size_t, false>(base, tag) { } |
| 715 | | virtual void findit(driver_device &base) { size_t size; memory_get_shared(base.m_machine, this->m_tag, size); set_target(size); } |
| 716 | | }; |
| 717 | | |
| 718 | | // required shared pointer size finder |
| 719 | | class required_shared_size : public auto_finder_type<size_t, true> |
| 720 | | { |
| 721 | | public: |
| 722 | | required_shared_size(driver_device &base, const char *tag) : auto_finder_type<size_t, true>(base, tag) { } |
| 723 | | virtual void findit(driver_device &base) { size_t size; memory_get_shared(base.m_machine, this->m_tag, size); set_target(size); } |
| 724 | | }; |
| 725 | | |
| 726 | | // internal helpers |
| 727 | | void register_auto_finder(auto_finder_base &autodev); |
| 728 | | |
| 729 | 631 | // internal state |
| 730 | 632 | const driver_device_config_base &m_config; |
| 731 | | auto_finder_base *m_auto_finder_list; |
| 732 | 633 | }; |
| 733 | 634 | |
| 734 | 635 | |
src/emu/memory.c
| r9146 | r9147 | |
| 280 | 280 | memory_block * m_next; // next memory block in the list |
| 281 | 281 | running_machine & m_machine; // need the machine to free our memory |
| 282 | 282 | address_space & m_space; // which address space are we associated with? |
| 283 | | bool m_isallocated; // did we allocate this ourselves? |
| 284 | 283 | offs_t m_bytestart, m_byteend; // byte-normalized start/end for verifying a match |
| 285 | 284 | UINT8 * m_data; // pointer to the data for this block |
| 285 | UINT8 * m_allocated; // pointer to the actually allocated block |
| 286 | 286 | }; |
| 287 | 287 | |
| 288 | 288 | |
| r9146 | r9147 | |
| 1961 | 1961 | // if we have a share entry, add it to our map |
| 1962 | 1962 | if (entry->m_share != NULL && m_machine.memory_data->sharemap.find(entry->m_share) == NULL) |
| 1963 | 1963 | { |
| 1964 | VPRINTF(("Creating share '%s' of length 0x%X\n", entry->m_share, entry->m_byteend + 1 - entry->m_bytestart)); |
| 1964 | 1965 | memory_share *share = auto_alloc(&m_machine, memory_share(entry->m_byteend + 1 - entry->m_bytestart)); |
| 1965 | 1966 | m_machine.memory_data->sharemap.add(entry->m_share, share, false); |
| 1966 | 1967 | } |
| r9146 | r9147 | |
| 2326 | 2327 | entry->m_memory = share->ptr(); |
| 2327 | 2328 | VPRINTF(("memory range %08X-%08X -> shared_ptr '%s' [%p]\n", entry->m_addrstart, entry->m_addrend, entry->m_share, entry->m_memory)); |
| 2328 | 2329 | } |
| 2330 | else |
| 2331 | { |
| 2332 | VPRINTF(("memory range %08X-%08X -> shared_ptr '%s' but not found\n", entry->m_addrstart, entry->m_addrend, entry->m_share)); |
| 2333 | } |
| 2329 | 2334 | } |
| 2330 | 2335 | |
| 2331 | 2336 | // otherwise, look for a match in this block |
| r9146 | r9147 | |
| 2340 | 2345 | { |
| 2341 | 2346 | memory_share *share = memdata->sharemap.find(entry->m_share); |
| 2342 | 2347 | if (share != NULL && share->ptr() == NULL) |
| 2348 | { |
| 2343 | 2349 | share->set_ptr(entry->m_memory); |
| 2350 | VPRINTF(("setting shared_ptr '%s' = %p\n", entry->m_share, entry->m_memory)); |
| 2351 | } |
| 2344 | 2352 | } |
| 2345 | 2353 | |
| 2346 | 2354 | // keep track of the first unassigned entry |
| r9146 | r9147 | |
| 4053 | 4061 | : m_next(NULL), |
| 4054 | 4062 | m_machine(space.m_machine), |
| 4055 | 4063 | m_space(space), |
| 4056 | | m_isallocated(memory == NULL), |
| 4057 | 4064 | m_bytestart(bytestart), |
| 4058 | 4065 | m_byteend(byteend), |
| 4059 | | m_data((memory != NULL) ? reinterpret_cast<UINT8 *>(memory) : auto_alloc_array_clear(&space.m_machine, UINT8, byteend + 1 - bytestart)) |
| 4066 | m_data(reinterpret_cast<UINT8 *>(memory)), |
| 4067 | m_allocated(NULL) |
| 4060 | 4068 | { |
| 4061 | 4069 | VPRINTF(("block_allocate('%s',%s,%08X,%08X,%p)\n", space.device().tag(), space.name(), bytestart, byteend, memory)); |
| 4062 | 4070 | |
| 4071 | // allocate a block if needed |
| 4072 | if (m_data == NULL) |
| 4073 | { |
| 4074 | offs_t length = byteend + 1 - bytestart; |
| 4075 | if (length < 4096) |
| 4076 | m_allocated = m_data = auto_alloc_array_clear(&space.m_machine, UINT8, length); |
| 4077 | else |
| 4078 | { |
| 4079 | m_allocated = auto_alloc_array_clear(&space.m_machine, UINT8, length + 0xfff); |
| 4080 | m_data = reinterpret_cast<UINT8 *>((reinterpret_cast<FPTR>(m_allocated) + 0xfff) & ~0xfff); |
| 4081 | } |
| 4082 | } |
| 4083 | |
| 4063 | 4084 | // register for saving, but only if we're not part of a memory region |
| 4064 | 4085 | const region_info *region; |
| 4065 | 4086 | for (region = space.m_machine.m_regionlist.first(); region != NULL; region = region->next()) |
| r9146 | r9147 | |
| 4086 | 4107 | |
| 4087 | 4108 | memory_block::~memory_block() |
| 4088 | 4109 | { |
| 4089 | | if (m_isallocated) |
| 4090 | | auto_free(&m_machine, m_data); |
| 4110 | if (m_allocated != NULL) |
| 4111 | auto_free(&m_machine, m_allocated); |
| 4091 | 4112 | } |
| 4092 | 4113 | |
| 4093 | 4114 | |
| r9146 | r9147 | |
| 4353 | 4374 | // compute the maximum possible subunits |
| 4354 | 4375 | int maxunits = m_datawidth / handlerbits; |
| 4355 | 4376 | assert(maxunits > 1); |
| 4356 | | assert(maxunits < ARRAY_LENGTH(m_subshift)); |
| 4377 | assert(maxunits <= ARRAY_LENGTH(m_subshift)); |
| 4357 | 4378 | |
| 4358 | 4379 | // walk the handlermask to find out how many we have |
| 4359 | 4380 | m_subunits = 0; |
src/emu/machine/6522via.c
| r9146 | r9147 | |
| 218 | 218 | m_t2ll = 0xff; /* taken from vice */ |
| 219 | 219 | m_t2lh = 0xff; |
| 220 | 220 | m_time2 = m_time1 = timer_get_time(&m_machine); |
| 221 | | m_t1 = timer_alloc(&m_machine, t1_timeout_callback, (void *)this); |
| 222 | | m_t2 = timer_alloc(&m_machine, t2_timeout_callback, (void *)this); |
| 223 | | m_shift_timer = timer_alloc(&m_machine, shift_callback, (void *)this); |
| 221 | m_t1 = device_timer_alloc(*this); |
| 222 | m_t2 = device_timer_alloc(*this); |
| 223 | m_shift_timer = device_timer_alloc(*this); |
| 224 | 224 | |
| 225 | 225 | /* Default clock is from CPU1 */ |
| 226 | 226 | if (clock() == 0) |
| r9146 | r9147 | |
| 415 | 415 | } |
| 416 | 416 | |
| 417 | 417 | |
| 418 | | /*------------------------------------------------- |
| 419 | | TIMER_CALLBACK( via_shift_callback ) |
| 420 | | -------------------------------------------------*/ |
| 421 | | |
| 422 | | TIMER_CALLBACK( via6522_device::shift_callback ) |
| 418 | void via6522_device::device_timer(emu_timer &timer, int param, void *ptr) |
| 423 | 419 | { |
| 424 | | via6522_device *via = reinterpret_cast<via6522_device *>(ptr); |
| 425 | | via->shift(); |
| 426 | | } |
| 427 | | |
| 428 | | |
| 429 | | /*------------------------------------------------- |
| 430 | | TIMER_CALLBACK( via_t1_timeout ) |
| 431 | | -------------------------------------------------*/ |
| 432 | | |
| 433 | | TIMER_CALLBACK( via6522_device::t1_timeout_callback ) |
| 434 | | { |
| 435 | | via6522_device *via = reinterpret_cast<via6522_device *>(ptr); |
| 436 | | via->t1_timeout(); |
| 437 | | } |
| 438 | | |
| 439 | | void via6522_device::t1_timeout() |
| 440 | | { |
| 441 | | if (T1_CONTINUOUS (m_acr)) |
| 442 | | { |
| 443 | | if (T1_SET_PB7(m_acr)) |
| 444 | | { |
| 445 | | m_out_b ^= 0x80; |
| 446 | | } |
| 447 | | timer_adjust_oneshot(m_t1, cycles_to_time(TIMER1_VALUE + IFR_DELAY), 0); |
| 448 | | } |
| 449 | | else |
| 450 | | { |
| 451 | | if (T1_SET_PB7(m_acr)) |
| 452 | | { |
| 453 | | m_out_b |= 0x80; |
| 454 | | } |
| 455 | | m_t1_active = 0; |
| 456 | | m_time1 = timer_get_time(&m_machine); |
| 457 | | } |
| 458 | | if (m_ddr_b) |
| 420 | // shift timer |
| 421 | if (&timer == m_shift_timer) |
| 422 | shift(); |
| 423 | |
| 424 | // t1 timeout |
| 425 | else if (&timer == m_t1) |
| 459 | 426 | { |
| 460 | | UINT8 write_data = (m_out_b & m_ddr_b) | (m_ddr_b ^ 0xff); |
| 461 | | devcb_call_write8(&m_out_b_func, 0, write_data); |
| 427 | if (T1_CONTINUOUS (m_acr)) |
| 428 | { |
| 429 | if (T1_SET_PB7(m_acr)) |
| 430 | { |
| 431 | m_out_b ^= 0x80; |
| 432 | } |
| 433 | timer_adjust_oneshot(m_t1, cycles_to_time(TIMER1_VALUE + IFR_DELAY), 0); |
| 434 | } |
| 435 | else |
| 436 | { |
| 437 | if (T1_SET_PB7(m_acr)) |
| 438 | { |
| 439 | m_out_b |= 0x80; |
| 440 | } |
| 441 | m_t1_active = 0; |
| 442 | m_time1 = timer_get_time(&m_machine); |
| 443 | } |
| 444 | if (m_ddr_b) |
| 445 | { |
| 446 | UINT8 write_data = (m_out_b & m_ddr_b) | (m_ddr_b ^ 0xff); |
| 447 | devcb_call_write8(&m_out_b_func, 0, write_data); |
| 448 | } |
| 449 | |
| 450 | if (!(m_ifr & INT_T1)) |
| 451 | { |
| 452 | set_int(INT_T1); |
| 453 | } |
| 462 | 454 | } |
| 455 | |
| 456 | // t2 timeout |
| 457 | else if (&timer == m_t2) |
| 458 | { |
| 459 | m_t2_active = 0; |
| 460 | m_time2 = timer_get_time(&m_machine); |
| 463 | 461 | |
| 464 | | if (!(m_ifr & INT_T1)) |
| 465 | | { |
| 466 | | set_int(INT_T1); |
| 467 | | } |
| 462 | if (!(m_ifr & INT_T2)) |
| 463 | { |
| 464 | set_int(INT_T2); |
| 465 | } |
| 466 | } |
| 468 | 467 | } |
| 469 | 468 | |
| 470 | | |
| 471 | 469 | /*------------------------------------------------- |
| 472 | | TIMER_CALLBACK( via_t2_timeout ) |
| 473 | | -------------------------------------------------*/ |
| 474 | | |
| 475 | | TIMER_CALLBACK( via6522_device::t2_timeout_callback ) |
| 476 | | { |
| 477 | | via6522_device *via = reinterpret_cast<via6522_device *>(ptr); |
| 478 | | via->t2_timeout(); |
| 479 | | } |
| 480 | | |
| 481 | | void via6522_device::t2_timeout() |
| 482 | | { |
| 483 | | m_t2_active = 0; |
| 484 | | m_time2 = timer_get_time(&m_machine); |
| 485 | | |
| 486 | | if (!(m_ifr & INT_T2)) |
| 487 | | { |
| 488 | | set_int(INT_T2); |
| 489 | | } |
| 490 | | } |
| 491 | | |
| 492 | | |
| 493 | | /*------------------------------------------------- |
| 494 | 470 | via_r - CPU interface for VIA read |
| 495 | 471 | -------------------------------------------------*/ |
| 496 | 472 | |
| 497 | | READ8_DEVICE_HANDLER_TRAMPOLINE(via6522, via_r) |
| 473 | READ8_MEMBER( via6522_device::read ) |
| 498 | 474 | { |
| 499 | 475 | int val = 0; |
| 500 | 476 | |
| r9146 | r9147 | |
| 652 | 628 | |
| 653 | 629 | case VIA_SR: |
| 654 | 630 | val = m_sr; |
| 631 | m_shift_counter=0; |
| 655 | 632 | clear_int(INT_SR); |
| 656 | 633 | if (SO_O2_CONTROL(m_acr)) |
| 657 | 634 | { |
| 658 | | m_shift_counter=0; |
| 659 | 635 | timer_adjust_oneshot(m_shift_timer, cycles_to_time(2), 0); |
| 660 | 636 | } |
| 661 | 637 | if (SO_T2_CONTROL(m_acr)) |
| 662 | 638 | { |
| 663 | | m_shift_counter=0; |
| 664 | 639 | timer_adjust_oneshot(m_shift_timer, cycles_to_time((m_t2ll + 2)*2), 0); |
| 665 | 640 | } |
| 666 | 641 | break; |
| r9146 | r9147 | |
| 689 | 664 | via_w - CPU interface for VIA write |
| 690 | 665 | -------------------------------------------------*/ |
| 691 | 666 | |
| 692 | | WRITE8_DEVICE_HANDLER_TRAMPOLINE(via6522, via_w) |
| 667 | WRITE8_MEMBER( via6522_device::write ) |
| 693 | 668 | { |
| 694 | 669 | offset &=0x0f; |
| 695 | 670 | |
| r9146 | r9147 | |
| 858 | 833 | clear_int(INT_SR); |
| 859 | 834 | if (SO_O2_CONTROL(m_acr)) |
| 860 | 835 | { |
| 861 | | timer_set(&m_machine, cycles_to_time(2), (void *)this, 0, shift_callback); |
| 836 | timer_adjust_oneshot(m_shift_timer, cycles_to_time(2), 0); |
| 862 | 837 | } |
| 863 | 838 | if (SO_T2_CONTROL(m_acr)) |
| 864 | 839 | { |
| 865 | | timer_set(&m_machine, cycles_to_time((m_t2ll + 2)*2), (void *)this, 0, shift_callback); |
| 840 | timer_adjust_oneshot(m_shift_timer, cycles_to_time((m_t2ll + 2)*2), 0); |
| 866 | 841 | } |
| 867 | 842 | break; |
| 868 | 843 | |
| r9146 | r9147 | |
| 959 | 934 | ca1_w - interface setting VIA port CA1 input |
| 960 | 935 | -------------------------------------------------*/ |
| 961 | 936 | |
| 962 | | //void via6522_device::via_ca1_w(UINT8 state) |
| 963 | | WRITE_LINE_DEVICE_HANDLER_TRAMPOLINE(via6522, via_ca1_w) |
| 937 | WRITE_LINE_MEMBER( via6522_device::write_ca1 ) |
| 964 | 938 | { |
| 965 | 939 | /* handle the active transition */ |
| 966 | 940 | if (state != m_in_ca1) |
| r9146 | r9147 | |
| 1008 | 982 | ca2_w - interface setting VIA port CA2 input |
| 1009 | 983 | -------------------------------------------------*/ |
| 1010 | 984 | |
| 1011 | | //void via6522_device::via_ca2_w(UINT8 state) |
| 1012 | | WRITE_LINE_DEVICE_HANDLER_TRAMPOLINE(via6522, via_ca2_w) |
| 985 | WRITE_LINE_MEMBER( via6522_device::write_ca2 ) |
| 1013 | 986 | { |
| 1014 | 987 | /* CA2 is in input mode */ |
| 1015 | 988 | if (CA2_INPUT(m_pcr)) |
| r9146 | r9147 | |
| 1034 | 1007 | cb1_w - interface setting VIA port CB1 input |
| 1035 | 1008 | -------------------------------------------------*/ |
| 1036 | 1009 | |
| 1037 | | //void via6522_device::via_cb1_w(UINT8 state) |
| 1038 | | WRITE_LINE_DEVICE_HANDLER_TRAMPOLINE(via6522, via_cb1_w) |
| 1010 | WRITE_LINE_MEMBER( via6522_device::write_cb1 ) |
| 1039 | 1011 | { |
| 1040 | 1012 | /* handle the active transition */ |
| 1041 | 1013 | if (state != m_in_cb1) |
| r9146 | r9147 | |
| 1083 | 1055 | cb2_w - interface setting VIA port CB2 input |
| 1084 | 1056 | -------------------------------------------------*/ |
| 1085 | 1057 | |
| 1086 | | //void via6522_device::via_cb2_w(UINT8 state) |
| 1087 | | WRITE_LINE_DEVICE_HANDLER_TRAMPOLINE(via6522, via_cb2_w) |
| 1058 | WRITE_LINE_MEMBER( via6522_device::write_cb2 ) |
| 1088 | 1059 | { |
| 1089 | 1060 | /* CB2 is in input mode */ |
| 1090 | 1061 | if (CB2_INPUT(m_pcr)) |
| r9146 | r9147 | |
| 1103 | 1074 | } |
| 1104 | 1075 | } |
| 1105 | 1076 | } |
| 1106 | | |
| 1107 | | |
| 1108 | | |
| 1109 | | /*************************************************************************** |
| 1110 | | TRAMPOLINES |
| 1111 | | ***************************************************************************/ |
| 1112 | | |
| 1113 | | READ_LINE_DEVICE_HANDLER(via_ca1_r) { return downcast<via6522_device *>(device)->via_ca1_r(); } |
| 1114 | | READ_LINE_DEVICE_HANDLER(via_ca2_r) { return downcast<via6522_device *>(device)->via_ca2_r(); } |
| 1115 | | READ_LINE_DEVICE_HANDLER(via_cb1_r) { return downcast<via6522_device *>(device)->via_cb1_r(); } |
| 1116 | | READ_LINE_DEVICE_HANDLER(via_cb2_r) { return downcast<via6522_device *>(device)->via_cb2_r(); } |
| 1117 | | WRITE8_DEVICE_HANDLER(via_porta_w) { downcast<via6522_device *>(device)->via_porta_w(data); } |
| 1118 | | READ8_DEVICE_HANDLER(via_portb_r) { return downcast<via6522_device *>(device)->via_portb_r(); } |
| 1119 | | WRITE8_DEVICE_HANDLER(via_portb_w) { downcast<via6522_device *>(device)->via_portb_w(data); } |
src/emu/machine/6522via.h
| r9146 | r9147 | |
| 109 | 109 | via6522_device(running_machine &_machine, const via6522_device_config &_config); |
| 110 | 110 | |
| 111 | 111 | public: |
| 112 | | UINT8 via_r(UINT32 offset); |
| 113 | | void via_w(UINT32 offset, UINT8 data); |
| 112 | DECLARE_READ8_MEMBER( read ); |
| 113 | DECLARE_WRITE8_MEMBER( write ); |
| 114 | 114 | |
| 115 | | void via_porta_w(UINT8 data) { m_in_a = data; } |
| 115 | DECLARE_WRITE8_MEMBER( write_porta ) { m_in_a = data; } |
| 116 | 116 | |
| 117 | | UINT8 via_portb_r() { return m_in_b; } |
| 118 | | void via_portb_w(UINT8 data) { m_in_b = data; } |
| 117 | DECLARE_READ8_MEMBER( read_portb ) { return m_in_b; } |
| 118 | DECLARE_WRITE8_MEMBER( write_portb ) { m_in_b = data; } |
| 119 | 119 | |
| 120 | | UINT8 via_ca1_r() { return m_in_ca1; } |
| 121 | | void via_ca1_w(UINT8 data); |
| 120 | DECLARE_READ_LINE_MEMBER( read_ca1 ) { return m_in_ca1; } |
| 121 | DECLARE_WRITE_LINE_MEMBER( write_ca1 ); |
| 122 | 122 | |
| 123 | | UINT8 via_ca2_r() { return m_in_ca2; } |
| 124 | | void via_ca2_w(UINT8 data); |
| 123 | DECLARE_READ_LINE_MEMBER( read_ca2 ) { return m_in_ca2; } |
| 124 | DECLARE_WRITE_LINE_MEMBER( write_ca2 ); |
| 125 | 125 | |
| 126 | | UINT8 via_cb1_r() { return m_in_cb1; } |
| 127 | | void via_cb1_w(UINT8 data); |
| 126 | DECLARE_READ_LINE_MEMBER( read_cb1 ) { return m_in_cb1; } |
| 127 | DECLARE_WRITE_LINE_MEMBER( write_cb1 ); |
| 128 | 128 | |
| 129 | | UINT8 via_cb2_r() { return m_in_cb2; } |
| 130 | | void via_cb2_w(UINT8 data); |
| 129 | DECLARE_READ_LINE_MEMBER( read_cb2 ) { return m_in_cb2; } |
| 130 | DECLARE_WRITE_LINE_MEMBER( write_cb2 ); |
| 131 | 131 | |
| 132 | 132 | protected: |
| 133 | 133 | // device-level overrides |
| 134 | 134 | virtual void device_start(); |
| 135 | 135 | virtual void device_reset(); |
| 136 | | virtual void device_post_load() { } |
| 137 | | virtual void device_clock_changed() { } |
| 136 | virtual void device_timer(emu_timer &timer, int param, void *ptr); |
| 138 | 137 | |
| 139 | | static TIMER_CALLBACK( t1_timeout_callback ); |
| 140 | | static TIMER_CALLBACK( t2_timeout_callback ); |
| 141 | | static TIMER_CALLBACK( shift_callback ); |
| 142 | | |
| 143 | 138 | private: |
| 144 | 139 | attotime cycles_to_time(int c); |
| 145 | 140 | UINT32 time_to_cycles(attotime t); |
| r9146 | r9147 | |
| 148 | 143 | void set_int(int data); |
| 149 | 144 | void clear_int(int data); |
| 150 | 145 | void shift(); |
| 151 | | void t1_timeout(); |
| 152 | | void t2_timeout(); |
| 153 | 146 | |
| 154 | 147 | devcb_resolved_read8 m_in_a_func; |
| 155 | 148 | devcb_resolved_read8 m_in_b_func; |
| r9146 | r9147 | |
| 212 | 205 | extern const device_type VIA6522; |
| 213 | 206 | |
| 214 | 207 | |
| 215 | | |
| 216 | | /*************************************************************************** |
| 217 | | PROTOTYPES |
| 218 | | ***************************************************************************/ |
| 219 | | |
| 220 | | READ8_DEVICE_HANDLER(via_r); |
| 221 | | WRITE8_DEVICE_HANDLER(via_w); |
| 222 | | |
| 223 | | WRITE8_DEVICE_HANDLER(via_porta_w); |
| 224 | | |
| 225 | | READ8_DEVICE_HANDLER(via_portb_r); |
| 226 | | WRITE8_DEVICE_HANDLER(via_portb_w); |
| 227 | | |
| 228 | | READ_LINE_DEVICE_HANDLER(via_ca1_r); |
| 229 | | WRITE_LINE_DEVICE_HANDLER(via_ca1_w); |
| 230 | | |
| 231 | | READ_LINE_DEVICE_HANDLER(via_ca2_r); |
| 232 | | WRITE_LINE_DEVICE_HANDLER(via_ca2_w); |
| 233 | | |
| 234 | | READ_LINE_DEVICE_HANDLER(via_cb1_r); |
| 235 | | WRITE_LINE_DEVICE_HANDLER(via_cb1_w); |
| 236 | | |
| 237 | | READ_LINE_DEVICE_HANDLER(via_cb2_r); |
| 238 | | WRITE_LINE_DEVICE_HANDLER(via_cb2_w); |
| 239 | | |
| 240 | 208 | #endif /* __6522VIA_H__ */ |
src/emu/timer.c
| r9146 | r9147 | |
| 56 | 56 | attotime period; /* the repeat frequency of the timer */ |
| 57 | 57 | attotime start; /* time when the timer was started */ |
| 58 | 58 | attotime expire; /* time when the timer will expire */ |
| 59 | device_t * device; /* for device timers, a pointer to the device */ |
| 59 | 60 | }; |
| 60 | 61 | |
| 61 | 62 | |
| r9146 | r9147 | |
| 368 | 369 | global->callback_timer_expire_time = timer->expire; |
| 369 | 370 | |
| 370 | 371 | /* call the callback */ |
| 371 | | if (was_enabled && timer->callback != NULL) |
| 372 | if (was_enabled) |
| 372 | 373 | { |
| 373 | | LOG(("Timer %s:%d[%s] fired (expire=%s)\n", timer->file, timer->line, timer->func, attotime_string(timer->expire, 9))); |
| 374 | | g_profiler.start(PROFILER_TIMER_CALLBACK); |
| 375 | | (*timer->callback)(machine, timer->ptr, timer->param); |
| 376 | | g_profiler.stop(); |
| 374 | if (timer->device != NULL) |
| 375 | timer->device->timer_fired(*timer, timer->param, timer->ptr); |
| 376 | else if (timer->callback != NULL) |
| 377 | { |
| 378 | LOG(("Timer %s:%d[%s] fired (expire=%s)\n", timer->file, timer->line, timer->func, attotime_string(timer->expire, 9))); |
| 379 | g_profiler.start(PROFILER_TIMER_CALLBACK); |
| 380 | (*timer->callback)(machine, timer->ptr, timer->param); |
| 381 | g_profiler.stop(); |
| 382 | } |
| 377 | 383 | } |
| 378 | 384 | |
| 379 | 385 | /* clear the callback timer global */ |
| r9146 | r9147 | |
| 603 | 609 | timer->file = file; |
| 604 | 610 | timer->line = line; |
| 605 | 611 | timer->func = func; |
| 612 | timer->device = NULL; |
| 606 | 613 | |
| 607 | 614 | /* compute the time of the next firing and insert into the list */ |
| 608 | 615 | timer->start = time; |
| r9146 | r9147 | |
| 626 | 633 | return _timer_alloc_common(machine, callback, ptr, file, line, func, FALSE); |
| 627 | 634 | } |
| 628 | 635 | |
| 636 | emu_timer *device_timer_alloc(device_t &device, void *ptr, int param) |
| 637 | { |
| 638 | emu_timer *timer = _timer_alloc_common(device.machine, NULL, ptr, __FILE__, __LINE__, device.tag(), FALSE); |
| 639 | timer->param = param; |
| 640 | timer->device = &device; |
| 641 | return timer; |
| 642 | } |
| 629 | 643 | |
| 644 | |
| 630 | 645 | /*------------------------------------------------- |
| 631 | 646 | timer_remove - remove a timer from the |
| 632 | 647 | system |
src/mess/machine/apple3.c
| r9146 | r9147 | |
| 263 | 263 | |
| 264 | 264 | INTERRUPT_GEN( apple3_interrupt ) |
| 265 | 265 | { |
| 266 | | running_device *via_1 = device->machine->device("via6522_1"); |
| 266 | via6522_device *via_1 = device->machine->device<via6522_device>("via6522_1"); |
| 267 | 267 | |
| 268 | | via_ca2_w(via_1, (AY3600_keydata_strobe_r() & 0x80) ? 1 : 0); |
| 269 | | via_cb1_w(via_1, device->machine->primary_screen->vblank()); |
| 270 | | via_cb2_w(via_1, device->machine->primary_screen->vblank()); |
| 268 | via_1->write_ca2((AY3600_keydata_strobe_r() & 0x80) ? 1 : 0); |
| 269 | via_1->write_cb1(device->machine->primary_screen->vblank()); |
| 270 | via_1->write_cb2(device->machine->primary_screen->vblank()); |
| 271 | 271 | } |
| 272 | 272 | |
| 273 | 273 | |
| r9146 | r9147 | |
| 459 | 459 | { |
| 460 | 460 | running_device *via_0 = space->machine->device("via6522_0"); |
| 461 | 461 | running_device *via_1 = space->machine->device("via6522_1"); |
| 462 | | memory_install_read8_device_handler(space, via_0, 0xFFD0, 0xFFDF, 0, 0, via_r); |
| 463 | | memory_install_write8_device_handler(space, via_0, 0xFFD0, 0xFFDF, 0, 0, via_w); |
| 464 | | memory_install_read8_device_handler(space, via_1, 0xFFE0, 0xFFEF, 0, 0, via_r); |
| 465 | | memory_install_write8_device_handler(space, via_1, 0xFFE0, 0xFFEF, 0, 0, via_w); |
| 462 | |
| 463 | space->install_handler(0xFFD0, 0xFFDF, 0, 0, read8_delegate_create(via6522_device, read, *via_0), write8_delegate_create(via6522_device, write, *via_0)); |
| 464 | space->install_handler(0xFFE0, 0xFFEF, 0, 0, read8_delegate_create(via6522_device, read, *via_1), write8_delegate_create(via6522_device, write, *via_1)); |
| 466 | 465 | } |
| 467 | 466 | } |
| 468 | 467 | |
src/mess/machine/vic1112.c
| r9146 | r9147 | |
| 31 | 31 | int via1_irq; /* VIA #1 interrupt request */ |
| 32 | 32 | |
| 33 | 33 | /* devices */ |
| 34 | | running_device *via0; |
| 35 | | running_device *via1; |
| 36 | | running_device *bus; |
| 34 | via6522_device *via0; |
| 35 | via6522_device *via1; |
| 36 | via6522_device *bus; |
| 37 | 37 | }; |
| 38 | 38 | |
| 39 | 39 | /*************************************************************************** |
| r9146 | r9147 | |
| 67 | 67 | { |
| 68 | 68 | vic1112_t *vic1112 = get_safe_token(device); |
| 69 | 69 | |
| 70 | | via_cb1_w(vic1112->bus, state); |
| 70 | vic1112->bus->write_cb1(state); |
| 71 | 71 | } |
| 72 | 72 | |
| 73 | 73 | /*------------------------------------------------- |
| r9146 | r9147 | |
| 298 | 298 | address_space *program = cpu_get_address_space(device->machine->firstcpu, ADDRESS_SPACE_PROGRAM); |
| 299 | 299 | |
| 300 | 300 | /* find devices */ |
| 301 | | vic1112->via0 = device->subdevice(M6522_0_TAG); |
| 302 | | vic1112->via1 = device->subdevice(M6522_1_TAG); |
| 303 | | vic1112->bus = device->machine->device(config->bus_tag); |
| 301 | vic1112->via0 = device->subdevice<via6522_device>(M6522_0_TAG); |
| 302 | vic1112->via1 = device->subdevice<via6522_device>(M6522_1_TAG); |
| 303 | vic1112->bus = device->machine->device<via6522_device>(config->bus_tag); |
| 304 | 304 | |
| 305 | 305 | /* set VIA clocks */ |
| 306 | 306 | vic1112->via0->set_unscaled_clock(device->machine->firstcpu->unscaled_clock()); |
| 307 | 307 | vic1112->via1->set_unscaled_clock(device->machine->firstcpu->unscaled_clock()); |
| 308 | 308 | |
| 309 | 309 | /* map VIAs to memory */ |
| 310 | | memory_install_readwrite8_device_handler(program, vic1112->via0, 0x9800, 0x980f, 0, 0, via_r, via_w); |
| 311 | | memory_install_readwrite8_device_handler(program, vic1112->via1, 0x9810, 0x981f, 0, 0, via_r, via_w); |
| 310 | program->install_handler(0x9800, 0x980f, 0, 0, read8_delegate_create(via6522_device, read, *vic1112->via0), write8_delegate_create(via6522_device, write, *vic1112->via0)); |
| 311 | program->install_handler(0x9810, 0x981f, 0, 0, read8_delegate_create(via6522_device, read, *vic1112->via1), write8_delegate_create(via6522_device, write, *vic1112->via1)); |
| 312 | 312 | |
| 313 | 313 | /* map ROM to memory */ |
| 314 | 314 | memory_install_rom(program, 0xb000, 0xb7ff, 0, 0, memory_region(device->machine, "vic1112:vic1112")); |
src/mess/machine/c2040.c
| r9146 | r9147 | |
| 111 | 111 | running_device *riot0; |
| 112 | 112 | running_device *riot1; |
| 113 | 113 | running_device *miot; |
| 114 | | running_device *via; |
| 114 | via6522_device *via; |
| 115 | 115 | running_device *bus; |
| 116 | 116 | |
| 117 | 117 | /* timers */ |
| r9146 | r9147 | |
| 259 | 259 | /* set byte ready flag */ |
| 260 | 260 | c2040->ready = ready; |
| 261 | 261 | |
| 262 | | via_ca1_w(c2040->via, ready); |
| 263 | | via_cb1_w(c2040->via, ERROR); |
| 262 | c2040->via->write_ca1(ready); |
| 263 | c2040->via->write_cb1(ERROR); |
| 264 | 264 | |
| 265 | 265 | if ((device->type() == C8050) || (device->type() == C8250) || (device->type() == SFD1001)) |
| 266 | 266 | { |
| r9146 | r9147 | |
| 442 | 442 | static ADDRESS_MAP_START( c2040_fdc_map, ADDRESS_SPACE_PROGRAM, 8 ) |
| 443 | 443 | ADDRESS_MAP_GLOBAL_MASK(0x1fff) |
| 444 | 444 | AM_RANGE(0x0000, 0x003f) AM_MIRROR(0x0300) AM_RAM // 6530 |
| 445 | | AM_RANGE(0x0040, 0x004f) AM_MIRROR(0x0330) AM_DEVREADWRITE(M6522_TAG, via_r, via_w) |
| 445 | AM_RANGE(0x0040, 0x004f) AM_MIRROR(0x0330) AM_DEVREADWRITE_MODERN(M6522_TAG, via6522_device, read, write) |
| 446 | 446 | AM_RANGE(0x0080, 0x008f) AM_MIRROR(0x0330) AM_DEVREADWRITE(M6530_TAG, mos6530_r, mos6530_w) |
| 447 | 447 | AM_RANGE(0x0400, 0x07ff) AM_RAM AM_SHARE("share1") |
| 448 | 448 | AM_RANGE(0x0800, 0x0bff) AM_RAM AM_SHARE("share2") |
| r9146 | r9147 | |
| 475 | 475 | static ADDRESS_MAP_START( c4040_fdc_map, ADDRESS_SPACE_PROGRAM, 8 ) |
| 476 | 476 | ADDRESS_MAP_GLOBAL_MASK(0x1fff) |
| 477 | 477 | AM_RANGE(0x0000, 0x003f) AM_MIRROR(0x0300) AM_RAM // 6530 |
| 478 | | AM_RANGE(0x0040, 0x004f) AM_MIRROR(0x0330) AM_DEVREADWRITE(M6522_TAG, via_r, via_w) |
| 478 | AM_RANGE(0x0040, 0x004f) AM_MIRROR(0x0330) AM_DEVREADWRITE_MODERN(M6522_TAG, via6522_device, read, write) |
| 479 | 479 | AM_RANGE(0x0080, 0x008f) AM_MIRROR(0x0330) AM_DEVREADWRITE(M6530_TAG, mos6530_r, mos6530_w) |
| 480 | 480 | AM_RANGE(0x0400, 0x07ff) AM_RAM AM_SHARE("share1") |
| 481 | 481 | AM_RANGE(0x0800, 0x0bff) AM_RAM AM_SHARE("share2") |
| r9146 | r9147 | |
| 507 | 507 | static ADDRESS_MAP_START( c8050_fdc_map, ADDRESS_SPACE_PROGRAM, 8 ) |
| 508 | 508 | ADDRESS_MAP_GLOBAL_MASK(0x1fff) |
| 509 | 509 | AM_RANGE(0x0000, 0x003f) AM_MIRROR(0x0300) AM_RAM // 6530 |
| 510 | | AM_RANGE(0x0040, 0x004f) AM_MIRROR(0x0330) AM_DEVREADWRITE(M6522_TAG, via_r, via_w) |
| 510 | AM_RANGE(0x0040, 0x004f) AM_MIRROR(0x0330) AM_DEVREADWRITE_MODERN(M6522_TAG, via6522_device, read, write) |
| 511 | 511 | AM_RANGE(0x0080, 0x008f) AM_MIRROR(0x0330) AM_DEVREADWRITE(M6530_TAG, mos6530_r, mos6530_w) |
| 512 | 512 | AM_RANGE(0x0400, 0x07ff) AM_RAM AM_SHARE("share1") |
| 513 | 513 | AM_RANGE(0x0800, 0x0bff) AM_RAM AM_SHARE("share2") |
| r9146 | r9147 | |
| 539 | 539 | static ADDRESS_MAP_START( sfd1001_fdc_map, ADDRESS_SPACE_PROGRAM, 8 ) |
| 540 | 540 | ADDRESS_MAP_GLOBAL_MASK(0x1fff) |
| 541 | 541 | AM_RANGE(0x0000, 0x003f) AM_MIRROR(0x0300) AM_RAM // 6530 |
| 542 | | AM_RANGE(0x0040, 0x004f) AM_MIRROR(0x0330) AM_DEVREADWRITE(M6522_TAG, via_r, via_w) |
| 542 | AM_RANGE(0x0040, 0x004f) AM_MIRROR(0x0330) AM_DEVREADWRITE_MODERN(M6522_TAG, via6522_device, read, write) |
| 543 | 543 | AM_RANGE(0x0080, 0x008f) AM_MIRROR(0x0330) AM_DEVREADWRITE(M6530_TAG, mos6530_r, mos6530_w) |
| 544 | 544 | AM_RANGE(0x0400, 0x07ff) AM_RAM AM_SHARE("share1") |
| 545 | 545 | AM_RANGE(0x0800, 0x0bff) AM_RAM AM_SHARE("share2") |
| r9146 | r9147 | |
| 842 | 842 | c2040->mode = state; |
| 843 | 843 | |
| 844 | 844 | update_gcr_data(c2040); |
| 845 | | via_cb1_w(device, ERROR); |
| 845 | c2040->via->write_cb1(ERROR); |
| 846 | 846 | } |
| 847 | 847 | |
| 848 | 848 | static WRITE_LINE_DEVICE_HANDLER( rw_sel_w ) |
| r9146 | r9147 | |
| 853 | 853 | c2040->rw = state; |
| 854 | 854 | |
| 855 | 855 | update_gcr_data(c2040); |
| 856 | | via_cb1_w(device, ERROR); |
| 856 | c2040->via->write_cb1(ERROR); |
| 857 | 857 | } |
| 858 | 858 | |
| 859 | 859 | static const via6522_interface via_intf = |
| r9146 | r9147 | |
| 1511 | 1511 | c2040->riot0 = device->subdevice(M6532_0_TAG); |
| 1512 | 1512 | c2040->riot1 = device->subdevice(M6532_1_TAG); |
| 1513 | 1513 | c2040->miot = device->subdevice(M6530_TAG); |
| 1514 | | c2040->via = device->subdevice(M6522_TAG); |
| 1514 | c2040->via = device->subdevice<via6522_device>(M6522_TAG); |
| 1515 | 1515 | c2040->bus = device->machine->device(config->bus_tag); |
| 1516 | 1516 | c2040->unit[0].image = device->subdevice(FLOPPY_0); |
| 1517 | 1517 | c2040->unit[1].image = device->subdevice(FLOPPY_1); |
src/mess/machine/pet.c
| r9146 | r9147 | |
| 456 | 456 | |
| 457 | 457 | static WRITE8_HANDLER( cbm8096_io_w ) |
| 458 | 458 | { |
| 459 | | running_device *via_0 = space->machine->device("via6522_0"); |
| 459 | via6522_device *via_0 = space->machine->device<via6522_device>("via6522_0");; |
| 460 | 460 | running_device *pia_0 = space->machine->device("pia_0"); |
| 461 | 461 | running_device *pia_1 = space->machine->device("pia_1"); |
| 462 | 462 | running_device *mc6845 = space->machine->device("crtc"); |
| r9146 | r9147 | |
| 466 | 466 | else if (offset < 0x20) ; |
| 467 | 467 | else if (offset < 0x24) pia6821_w(pia_1, offset & 3, data); |
| 468 | 468 | else if (offset < 0x40) ; |
| 469 | | else if (offset < 0x50) via_w(via_0, offset & 0xf, data); |
| 469 | else if (offset < 0x50) via_0->write(*space, offset & 0xf, data); |
| 470 | 470 | else if (offset < 0x80) ; |
| 471 | 471 | else if (offset == 0x80) mc6845_address_w(mc6845, 0, data); |
| 472 | 472 | else if (offset == 0x81) mc6845_register_w(mc6845, 0, data); |
| r9146 | r9147 | |
| 474 | 474 | |
| 475 | 475 | static READ8_HANDLER( cbm8096_io_r ) |
| 476 | 476 | { |
| 477 | | running_device *via_0 = space->machine->device("via6522_0"); |
| 477 | via6522_device *via_0 = space->machine->device<via6522_device>("via6522_0");; |
| 478 | 478 | running_device *pia_0 = space->machine->device("pia_0"); |
| 479 | 479 | running_device *pia_1 = space->machine->device("pia_1"); |
| 480 | 480 | running_device *mc6845 = space->machine->device("crtc"); |
| r9146 | r9147 | |
| 485 | 485 | else if (offset < 0x20) ; |
| 486 | 486 | else if (offset < 0x24) data = pia6821_r(pia_1, offset & 3); |
| 487 | 487 | else if (offset < 0x40) ; |
| 488 | | else if (offset < 0x50) data = via_r(via_0, offset & 0xf); |
| 488 | else if (offset < 0x50) data = via_0->read(*space, offset & 0xf); |
| 489 | 489 | else if (offset < 0x80) ; |
| 490 | 490 | else if (offset == 0x81) data = mc6845_register_r(mc6845, 0); |
| 491 | 491 | return data; |
| r9146 | r9147 | |
| 686 | 686 | |
| 687 | 687 | static TIMER_CALLBACK( pet_tape2_timer ) |
| 688 | 688 | { |
| 689 | | running_device *via_0 = machine->device("via6522_0"); |
| 689 | via6522_device *via_0 = machine->device<via6522_device>("via6522_0"); |
| 690 | 690 | // cassette 2 |
| 691 | 691 | UINT8 data = (cassette_input(machine->device("cassette2")) > +0.0) ? 1 : 0; |
| 692 | | via_cb1_w(via_0, data); |
| 692 | via_0->write_cb1(data); |
| 693 | 693 | } |
| 694 | 694 | |
| 695 | 695 | |
src/mess/machine/oric.c
| r9146 | r9147 | |
| 282 | 282 | { |
| 283 | 283 | int data; |
| 284 | 284 | int input_port_9; |
| 285 | | running_device *via_0 = machine->device("via6522_0"); |
| 285 | via6522_device *via_0 = machine->device<via6522_device>("via6522_0"); |
| 286 | 286 | |
| 287 | 287 | data = 0; |
| 288 | 288 | |
| r9146 | r9147 | |
| 302 | 302 | data = input_port_9>>4; |
| 303 | 303 | } |
| 304 | 304 | |
| 305 | | via_cb1_w(via_0, data); |
| 305 | via_0->write_cb1(data); |
| 306 | 306 | } |
| 307 | 307 | |
| 308 | 308 | static unsigned char previous_portb_data = 0; |
| r9146 | r9147 | |
| 705 | 705 | |
| 706 | 706 | static READ8_HANDLER (oric_jasmin_r) |
| 707 | 707 | { |
| 708 | | running_device *via_0 = space->machine->device("via6522_0"); |
| 708 | via6522_device *via_0 = space->machine->device<via6522_device>("via6522_0"); |
| 709 | 709 | running_device *fdc = space->machine->device("wd179x"); |
| 710 | 710 | unsigned char data = 0x0ff; |
| 711 | 711 | |
| r9146 | r9147 | |
| 725 | 725 | data = wd17xx_data_r(fdc, 0); |
| 726 | 726 | break; |
| 727 | 727 | default: |
| 728 | | data = via_r(via_0, offset & 0x0f); |
| 728 | data = via_0->read(*space,offset & 0x0f); |
| 729 | 729 | //logerror("unhandled io read: %04x %02x\n", offset, data); |
| 730 | 730 | break; |
| 731 | 731 | |
| r9146 | r9147 | |
| 736 | 736 | |
| 737 | 737 | static WRITE8_HANDLER(oric_jasmin_w) |
| 738 | 738 | { |
| 739 | | running_device *via_0 = space->machine->device("via6522_0"); |
| 739 | via6522_device *via_0 = space->machine->device<via6522_device>("via6522_0");; |
| 740 | 740 | running_device *fdc = space->machine->device("wd179x"); |
| 741 | 741 | switch (offset & 0x0f) |
| 742 | 742 | { |
| r9146 | r9147 | |
| 780 | 780 | break; |
| 781 | 781 | |
| 782 | 782 | default: |
| 783 | | via_w(via_0, offset & 0x0f, data); |
| 783 | via_0->write(*space,offset & 0x0f, data); |
| 784 | 784 | break; |
| 785 | 785 | } |
| 786 | 786 | } |
| r9146 | r9147 | |
| 952 | 952 | |
| 953 | 953 | default: |
| 954 | 954 | { |
| 955 | | running_device *via_0 = space->machine->device("via6522_0"); |
| 956 | | data = via_r(via_0, offset & 0x0f); |
| 955 | via6522_device *via_0 = space->machine->device<via6522_device>("via6522_0");; |
| 956 | data = via_0->read(*space, offset & 0x0f); |
| 957 | 957 | } |
| 958 | 958 | break; |
| 959 | 959 | |
| r9146 | r9147 | |
| 1001 | 1001 | |
| 1002 | 1002 | default: |
| 1003 | 1003 | { |
| 1004 | | running_device *via_0 = space->machine->device("via6522_0"); |
| 1005 | | via_w(via_0, offset & 0x0f, data); |
| 1004 | via6522_device *via_0 = space->machine->device<via6522_device>("via6522_0");; |
| 1005 | via_0->write(*space, offset & 0x0f, data); |
| 1006 | 1006 | } |
| 1007 | 1007 | break; |
| 1008 | 1008 | } |
| r9146 | r9147 | |
| 1146 | 1146 | |
| 1147 | 1147 | READ8_HANDLER ( oric_IO_r ) |
| 1148 | 1148 | { |
| 1149 | | running_device *via_0 = space->machine->device("via6522_0"); |
| 1149 | via6522_device *via_0 = space->machine->device<via6522_device>("via6522_0");; |
| 1150 | 1150 | switch (input_port_read(space->machine, "FLOPPY") & 0x07) |
| 1151 | 1151 | { |
| 1152 | 1152 | default: |
| r9146 | r9147 | |
| 1179 | 1179 | } |
| 1180 | 1180 | } |
| 1181 | 1181 | /* it is repeated */ |
| 1182 | | return via_r(via_0, offset & 0x0f); |
| 1182 | return via_0->read(*space, offset & 0x0f); |
| 1183 | 1183 | } |
| 1184 | 1184 | |
| 1185 | 1185 | WRITE8_HANDLER ( oric_IO_w ) |
| 1186 | 1186 | { |
| 1187 | | running_device *via_0 = space->machine->device("via6522_0"); |
| 1187 | via6522_device *via_0 = space->machine->device<via6522_device>("via6522_0");; |
| 1188 | 1188 | switch (input_port_read(space->machine, "FLOPPY") & 0x07) |
| 1189 | 1189 | { |
| 1190 | 1190 | default: |
| r9146 | r9147 | |
| 1217 | 1217 | //logerror("via 0 w: %04x %02x %04x\n", offset, data,(unsigned) cpu_get_reg(space->machine->device("maincpu"), STATE_GENPC)); |
| 1218 | 1218 | } |
| 1219 | 1219 | |
| 1220 | | via_w(via_0, offset & 0x0f, data); |
| 1220 | via_0->write(*space, offset & 0x0f, data); |
| 1221 | 1221 | } |
| 1222 | 1222 | |
| 1223 | 1223 | |
src/mess/machine/c1541.c
| r9146 | r9147 | |
| 193 | 193 | |
| 194 | 194 | /* devices */ |
| 195 | 195 | running_device *cpu; |
| 196 | | running_device *via0; |
| 197 | | running_device *via1; |
| 196 | via6522_device *via0; |
| 197 | via6522_device *via1; |
| 198 | 198 | running_device *bus; |
| 199 | 199 | running_device *image; |
| 200 | 200 | |
| r9146 | r9147 | |
| 278 | 278 | int byte_ready = !(byte && c1541->soe); |
| 279 | 279 | |
| 280 | 280 | cpu_set_input_line(c1541->cpu, M6502_SET_OVERFLOW, byte_ready); |
| 281 | | via_ca1_w(c1541->via1, byte_ready); |
| 281 | c1541->via1->write_ca1(byte_ready); |
| 282 | 282 | |
| 283 | 283 | c1541->byte = byte; |
| 284 | 284 | } |
| r9146 | r9147 | |
| 374 | 374 | c1541_t *c1541 = get_safe_token(device); |
| 375 | 375 | int data_out = !c1541->data_out && !(c1541->atna ^ !state); |
| 376 | 376 | |
| 377 | | via_ca1_w(c1541->via0, !state); |
| 377 | c1541->via0->write_ca1(!state); |
| 378 | 378 | |
| 379 | 379 | cbm_iec_data_w(c1541->bus, device, data_out); |
| 380 | 380 | } |
| r9146 | r9147 | |
| 401 | 401 | int nrfd = c1541->nrfd_out; |
| 402 | 402 | int ndac = c1541->ndac_out; |
| 403 | 403 | |
| 404 | | via_ca1_w(c1541->via0, !state); |
| 404 | c1541->via0->write_ca1(!state); |
| 405 | 405 | |
| 406 | 406 | if (!state ^ c1541->atna) |
| 407 | 407 | { |
| r9146 | r9147 | |
| 430 | 430 | |
| 431 | 431 | static ADDRESS_MAP_START( c1540_map, ADDRESS_SPACE_PROGRAM, 8 ) |
| 432 | 432 | AM_RANGE(0x0000, 0x07ff) AM_MIRROR(0x6000) AM_RAM |
| 433 | | AM_RANGE(0x1800, 0x180f) AM_MIRROR(0x63f0) AM_DEVREADWRITE(M6522_0_TAG, via_r, via_w) |
| 434 | | AM_RANGE(0x1c00, 0x1c0f) AM_MIRROR(0x63f0) AM_DEVREADWRITE(M6522_1_TAG, via_r, via_w) |
| 433 | AM_RANGE(0x1800, 0x180f) AM_MIRROR(0x63f0) AM_DEVREADWRITE_MODERN(M6522_0_TAG, via6522_device, read, write) |
| 434 | AM_RANGE(0x1c00, 0x1c0f) AM_MIRROR(0x63f0) AM_DEVREADWRITE_MODERN(M6522_1_TAG, via6522_device, read, write) |
| 435 | 435 | AM_RANGE(0x8000, 0xbfff) AM_MIRROR(0x4000) AM_ROM AM_REGION("c1540:c1540", 0x0000) |
| 436 | 436 | ADDRESS_MAP_END |
| 437 | 437 | |
| r9146 | r9147 | |
| 441 | 441 | |
| 442 | 442 | static ADDRESS_MAP_START( c1541_map, ADDRESS_SPACE_PROGRAM, 8 ) |
| 443 | 443 | AM_RANGE(0x0000, 0x07ff) AM_MIRROR(0x6000) AM_RAM |
| 444 | | AM_RANGE(0x1800, 0x180f) AM_MIRROR(0x63f0) AM_DEVREADWRITE(M6522_0_TAG, via_r, via_w) |
| 445 | | AM_RANGE(0x1c00, 0x1c0f) AM_MIRROR(0x63f0) AM_DEVREADWRITE(M6522_1_TAG, via_r, via_w) |
| 444 | AM_RANGE(0x1800, 0x180f) AM_MIRROR(0x63f0) AM_DEVREADWRITE_MODERN(M6522_0_TAG, via6522_device, read, write) |
| 445 | AM_RANGE(0x1c00, 0x1c0f) AM_MIRROR(0x63f0) AM_DEVREADWRITE_MODERN(M6522_1_TAG, via6522_device, read, write) |
| 446 | 446 | AM_RANGE(0x8000, 0xbfff) AM_MIRROR(0x4000) AM_ROM AM_REGION("c1541:c1541", 0x0000) |
| 447 | 447 | ADDRESS_MAP_END |
| 448 | 448 | |
| r9146 | r9147 | |
| 452 | 452 | |
| 453 | 453 | static ADDRESS_MAP_START( c1541c_map, ADDRESS_SPACE_PROGRAM, 8 ) |
| 454 | 454 | AM_RANGE(0x0000, 0x07ff) AM_MIRROR(0x6000) AM_RAM |
| 455 | | AM_RANGE(0x1800, 0x180f) AM_MIRROR(0x63f0) AM_DEVREADWRITE(M6522_0_TAG, via_r, via_w) |
| 456 | | AM_RANGE(0x1c00, 0x1c0f) AM_MIRROR(0x63f0) AM_DEVREADWRITE(M6522_1_TAG, via_r, via_w) |
| 455 | AM_RANGE(0x1800, 0x180f) AM_MIRROR(0x63f0) AM_DEVREADWRITE_MODERN(M6522_0_TAG, via6522_device, read, write) |
| 456 | AM_RANGE(0x1c00, 0x1c0f) AM_MIRROR(0x63f0) AM_DEVREADWRITE_MODERN(M6522_1_TAG, via6522_device, read, write) |
| 457 | 457 | AM_RANGE(0x8000, 0xbfff) AM_MIRROR(0x4000) AM_ROM AM_REGION("c1541:c1541c", 0x0000) |
| 458 | 458 | ADDRESS_MAP_END |
| 459 | 459 | |
| r9146 | r9147 | |
| 463 | 463 | |
| 464 | 464 | static ADDRESS_MAP_START( c1541ii_map, ADDRESS_SPACE_PROGRAM, 8 ) |
| 465 | 465 | AM_RANGE(0x0000, 0x07ff) AM_MIRROR(0x6000) AM_RAM |
| 466 | | AM_RANGE(0x1800, 0x180f) AM_MIRROR(0x63f0) AM_DEVREADWRITE(M6522_0_TAG, via_r, via_w) |
| 467 | | AM_RANGE(0x1c00, 0x1c0f) AM_MIRROR(0x63f0) AM_DEVREADWRITE(M6522_1_TAG, via_r, via_w) |
| 466 | AM_RANGE(0x1800, 0x180f) AM_MIRROR(0x63f0) AM_DEVREADWRITE_MODERN(M6522_0_TAG, via6522_device, read, write) |
| 467 | AM_RANGE(0x1c00, 0x1c0f) AM_MIRROR(0x63f0) AM_DEVREADWRITE_MODERN(M6522_1_TAG, via6522_device, read, write) |
| 468 | 468 | AM_RANGE(0x8000, 0xbfff) AM_MIRROR(0x4000) AM_ROM AM_REGION("c1541:c1541ii", 0x0000) |
| 469 | 469 | ADDRESS_MAP_END |
| 470 | 470 | |
| r9146 | r9147 | |
| 474 | 474 | |
| 475 | 475 | static ADDRESS_MAP_START( sx1541_map, ADDRESS_SPACE_PROGRAM, 8 ) |
| 476 | 476 | AM_RANGE(0x0000, 0x07ff) AM_MIRROR(0x6000) AM_RAM |
| 477 | | AM_RANGE(0x1800, 0x180f) AM_MIRROR(0x63f0) AM_DEVREADWRITE(M6522_0_TAG, via_r, via_w) |
| 478 | | AM_RANGE(0x1c00, 0x1c0f) AM_MIRROR(0x63f0) AM_DEVREADWRITE(M6522_1_TAG, via_r, via_w) |
| 477 | AM_RANGE(0x1800, 0x180f) AM_MIRROR(0x63f0) AM_DEVREADWRITE_MODERN(M6522_0_TAG, via6522_device, read, write) |
| 478 | AM_RANGE(0x1c00, 0x1c0f) AM_MIRROR(0x63f0) AM_DEVREADWRITE_MODERN(M6522_1_TAG, via6522_device, read, write) |
| 479 | 479 | AM_RANGE(0x8000, 0xbfff) AM_MIRROR(0x4000) AM_ROM AM_REGION("c1541:sx1541", 0x0000) |
| 480 | 480 | ADDRESS_MAP_END |
| 481 | 481 | |
| r9146 | r9147 | |
| 485 | 485 | |
| 486 | 486 | static ADDRESS_MAP_START( c2031_map, ADDRESS_SPACE_PROGRAM, 8 ) |
| 487 | 487 | AM_RANGE(0x0000, 0x07ff) AM_MIRROR(0x6000) AM_RAM |
| 488 | | AM_RANGE(0x1800, 0x180f) AM_MIRROR(0x63f0) AM_DEVREADWRITE(M6522_0_TAG, via_r, via_w) |
| 489 | | AM_RANGE(0x1c00, 0x1c0f) AM_MIRROR(0x63f0) AM_DEVREADWRITE(M6522_1_TAG, via_r, via_w) |
| 488 | AM_RANGE(0x1800, 0x180f) AM_MIRROR(0x63f0) AM_DEVREADWRITE_MODERN(M6522_0_TAG, via6522_device, read, write) |
| 489 | AM_RANGE(0x1c00, 0x1c0f) AM_MIRROR(0x63f0) AM_DEVREADWRITE_MODERN(M6522_1_TAG, via6522_device, read, write) |
| 490 | 490 | AM_RANGE(0x8000, 0xbfff) AM_MIRROR(0x4000) AM_ROM AM_REGION("c2031:c2031", 0x0000) |
| 491 | 491 | ADDRESS_MAP_END |
| 492 | 492 | |
| r9146 | r9147 | |
| 496 | 496 | |
| 497 | 497 | static ADDRESS_MAP_START( oc118_map, ADDRESS_SPACE_PROGRAM, 8 ) |
| 498 | 498 | AM_RANGE(0x0000, 0x07ff) AM_MIRROR(0x6000) AM_RAM |
| 499 | | AM_RANGE(0x1800, 0x180f) AM_MIRROR(0x63f0) AM_DEVREADWRITE(M6522_0_TAG, via_r, via_w) |
| 500 | | AM_RANGE(0x1c00, 0x1c0f) AM_MIRROR(0x63f0) AM_DEVREADWRITE(M6522_1_TAG, via_r, via_w) |
| 499 | AM_RANGE(0x1800, 0x180f) AM_MIRROR(0x63f0) AM_DEVREADWRITE_MODERN(M6522_0_TAG, via6522_device, read, write) |
| 500 | AM_RANGE(0x1c00, 0x1c0f) AM_MIRROR(0x63f0) AM_DEVREADWRITE_MODERN(M6522_1_TAG, via6522_device, read, write) |
| 501 | 501 | AM_RANGE(0x8000, 0xbfff) AM_MIRROR(0x4000) AM_ROM AM_REGION("oc118:oc118", 0x0000) |
| 502 | 502 | ADDRESS_MAP_END |
| 503 | 503 | |
| r9146 | r9147 | |
| 977 | 977 | |
| 978 | 978 | c1541->soe = state; |
| 979 | 979 | |
| 980 | | cpu_set_input_line(c1541->cpu, M6502_SET_OVERFLOW, byte_ready); |
| 981 | | via_ca1_w(device, byte_ready); |
| 980 | cpu_set_input_line(c1541->cpu, M6502_SET_OVERFLOW, byte_ready); |
| 981 | c1541->via1->write_ca1(byte_ready); |
| 982 | 982 | } |
| 983 | 983 | |
| 984 | 984 | static WRITE_LINE_DEVICE_HANDLER( mode_w ) |
| r9146 | r9147 | |
| 1214 | 1214 | c1541->cpu = device->subdevice(M6502_TAG); |
| 1215 | 1215 | |
| 1216 | 1216 | /* find devices */ |
| 1217 | | c1541->via0 = device->subdevice(M6522_0_TAG); |
| 1218 | | c1541->via1 = device->subdevice(M6522_1_TAG); |
| 1217 | c1541->via0 = device->subdevice<via6522_device>(M6522_0_TAG); |
| 1218 | c1541->via1 = device->subdevice<via6522_device>(M6522_1_TAG); |
| 1219 | 1219 | c1541->bus = device->machine->device(config->bus_tag); |
| 1220 | 1220 | c1541->image = device->subdevice(FLOPPY_0); |
| 1221 | 1221 | |
src/mess/machine/mac.c
| r9146 | r9147 | |
| 632 | 632 | static TIMER_CALLBACK(kbd_clock) |
| 633 | 633 | { |
| 634 | 634 | int i; |
| 635 | | running_device *via_0 = machine->device("via6522_0"); |
| 635 | via6522_device *via_0 = machine->device<via6522_device>("via6522_0"); |
| 636 | 636 | mac_state *mac = machine->driver_data<mac_state>(); |
| 637 | 637 | |
| 638 | 638 | if (mac->kbd_comm == TRUE) |
| r9146 | r9147 | |
| 641 | 641 | { |
| 642 | 642 | /* Put data on CB2 if we are sending*/ |
| 643 | 643 | if (mac->kbd_receive == FALSE) |
| 644 | | via_cb2_w(via_0, mac->kbd_shift_reg&0x80?1:0); |
| 644 | via_0->write_cb2(mac->kbd_shift_reg&0x80?1:0); |
| 645 | 645 | mac->kbd_shift_reg <<= 1; |
| 646 | | via_cb1_w(via_0, 0); |
| 647 | | via_cb1_w(via_0, 1); |
| 646 | via_0->write_cb1(0); |
| 647 | via_0->write_cb1(1); |
| 648 | 648 | } |
| 649 | 649 | if (mac->kbd_receive == TRUE) |
| 650 | 650 | { |
| r9146 | r9147 | |
| 1852 | 1852 | |
| 1853 | 1853 | static TIMER_CALLBACK(mac_adb_tick) |
| 1854 | 1854 | { |
| 1855 | | running_device *via_0 = machine->device("via6522_0"); |
| 1855 | via6522_device *via_0 = machine->device<via6522_device>("via6522_0"); |
| 1856 | 1856 | mac_state *mac = machine->driver_data<mac_state>(); |
| 1857 | 1857 | |
| 1858 | 1858 | // do one clock transition on CB1 to advance the VIA shifter |
| 1859 | 1859 | mac->adb_extclock ^= 1; |
| 1860 | | via_cb1_w(via_0, mac->adb_extclock); |
| 1860 | via_0->write_cb1(mac->adb_extclock); |
| 1861 | 1861 | mac->adb_extclock ^= 1; |
| 1862 | | via_cb1_w(via_0, mac->adb_extclock); |
| 1862 | via_0->write_cb1(mac->adb_extclock); |
| 1863 | 1863 | |
| 1864 | 1864 | mac->adb_timer_ticks--; |
| 1865 | 1865 | if (!mac->adb_timer_ticks) |
| r9146 | r9147 | |
| 2635 | 2635 | READ16_HANDLER ( mac_via_r ) |
| 2636 | 2636 | { |
| 2637 | 2637 | UINT16 data; |
| 2638 | | running_device *via_0 = space->machine->device("via6522_0"); |
| 2638 | via6522_device *via_0 = space->machine->device<via6522_device>("via6522_0");; |
| 2639 | 2639 | |
| 2640 | 2640 | offset >>= 8; |
| 2641 | 2641 | offset &= 0x0f; |
| 2642 | 2642 | |
| 2643 | 2643 | if (LOG_VIA) |
| 2644 | 2644 | logerror("mac_via_r: offset=0x%02x\n", offset); |
| 2645 | | data = via_r(via_0, offset); |
| 2645 | data = via_0->read(*space, offset); |
| 2646 | 2646 | |
| 2647 | 2647 | return (data & 0xff) | (data << 8); |
| 2648 | 2648 | } |
| 2649 | 2649 | |
| 2650 | 2650 | WRITE16_HANDLER ( mac_via_w ) |
| 2651 | 2651 | { |
| 2652 | | running_device *via_0 = space->machine->device("via6522_0"); |
| 2652 | via6522_device *via_0 = space->machine->device<via6522_device>("via6522_0");; |
| 2653 | 2653 | |
| 2654 | 2654 | offset >>= 8; |
| 2655 | 2655 | offset &= 0x0f; |
| r9146 | r9147 | |
| 2658 | 2658 | logerror("mac_via_w: offset=0x%02x data=0x%08x\n", offset, data); |
| 2659 | 2659 | |
| 2660 | 2660 | if (ACCESSING_BITS_8_15) |
| 2661 | | via_w(via_0, offset, (data >> 8) & 0xff); |
| 2661 | via_0->write(*space, offset, (data >> 8) & 0xff); |
| 2662 | 2662 | } |
| 2663 | 2663 | |
| 2664 | 2664 | /* ************************************************************************* |
| r9146 | r9147 | |
| 2673 | 2673 | READ16_HANDLER ( mac_via2_r ) |
| 2674 | 2674 | { |
| 2675 | 2675 | int data; |
| 2676 | | running_device *via_1 = space->machine->device("via6522_1"); |
| 2676 | via6522_device *via_1 = space->machine->device<via6522_device>("via6522_1"); |
| 2677 | 2677 | |
| 2678 | 2678 | offset >>= 8; |
| 2679 | 2679 | offset &= 0x0f; |
| 2680 | 2680 | |
| 2681 | 2681 | if (LOG_VIA) |
| 2682 | 2682 | logerror("mac_via2_r: offset=0x%02x\n", offset*2); |
| 2683 | | data = via_r(via_1, offset); |
| 2683 | data = via_1->read(*space, offset); |
| 2684 | 2684 | |
| 2685 | 2685 | return (data & 0xff) | (data << 8); |
| 2686 | 2686 | } |
| 2687 | 2687 | |
| 2688 | 2688 | WRITE16_HANDLER ( mac_via2_w ) |
| 2689 | 2689 | { |
| 2690 | | running_device *via_1 = space->machine->device("via6522_1"); |
| 2690 | via6522_device *via_1 = space->machine->device<via6522_device>("via6522_1"); |
| 2691 | 2691 | |
| 2692 | 2692 | offset >>= 8; |
| 2693 | 2693 | offset &= 0x0f; |
| r9146 | r9147 | |
| 2696 | 2696 | logerror("mac_via2_w: offset=%x data=0x%08x\n", offset, data); |
| 2697 | 2697 | |
| 2698 | 2698 | if (ACCESSING_BITS_8_15) |
| 2699 | | via_w(via_1, offset, (data >> 8) & 0xff); |
| 2699 | via_1->write(*space, offset, (data >> 8) & 0xff); |
| 2700 | 2700 | } |
| 2701 | 2701 | |
| 2702 | 2702 | |
| r9146 | r9147 | |
| 2741 | 2741 | |
| 2742 | 2742 | static WRITE8_DEVICE_HANDLER(mac_via2_out_b) |
| 2743 | 2743 | { |
| 2744 | | running_device *via_0 = device->machine->device("via6522_0"); |
| 2744 | via6522_device *via_0 = device->machine->device<via6522_device>("via6522_0"); |
| 2745 | 2745 | |
| 2746 | 2746 | // logerror("VIA2 OUT B: %02x (PC %x)\n", data, cpu_get_pc(device->machine->device("maincpu"))); |
| 2747 | 2747 | |
| 2748 | 2748 | // printf("VIA2 OUT B: %02x (MMU = %02x)\n", data, data & 0x08); |
| 2749 | 2749 | |
| 2750 | 2750 | // chain 60.15 Hz to VIA1 |
| 2751 | | via_ca1_w(via_0, data>>7); |
| 2751 | via_0->write_ca1(data>>7); |
| 2752 | 2752 | } |
| 2753 | 2753 | |
| 2754 | 2754 | /* ************************************************************************* |
| r9146 | r9147 | |
| 3066 | 3066 | |
| 3067 | 3067 | if ((mac->mac_nubus_irq_state & 0x3f) != 0x3f) |
| 3068 | 3068 | { |
| 3069 | | running_device *via_1 = machine->device("via6522_1"); |
| 3069 | via6522_device *via_1 = machine->device<via6522_device>("via6522_1"); |
| 3070 | 3070 | |
| 3071 | 3071 | mac->via2_ca1 ^= 1; |
| 3072 | | via_ca1_w(via_1, mac->via2_ca1); |
| 3072 | via_1->write_ca1(mac->via2_ca1); |
| 3073 | 3073 | } |
| 3074 | 3074 | } |
| 3075 | 3075 | |
| 3076 | 3076 | static void mac_vblank_irq(running_machine *machine) |
| 3077 | 3077 | { |
| 3078 | 3078 | static int irq_count = 0, ca1_data = 0, ca2_data = 0; |
| 3079 | | running_device *via_0 = machine->device("via6522_0"); |
| 3079 | via6522_device *via_0 = machine->device<via6522_device>("via6522_0"); |
| 3080 | 3080 | mac_state *mac = machine->driver_data<mac_state>(); |
| 3081 | 3081 | |
| 3082 | 3082 | /* handle ADB keyboard/mouse */ |
| r9146 | r9147 | |
| 3105 | 3105 | if (mac->mac_model < MODEL_MAC_II) |
| 3106 | 3106 | { |
| 3107 | 3107 | ca1_data ^= 1; |
| 3108 | | via_ca1_w(via_0, ca1_data); |
| 3108 | via_0->write_ca1(ca1_data); |
| 3109 | 3109 | } |
| 3110 | 3110 | |
| 3111 | 3111 | if (++irq_count == 60) |
| r9146 | r9147 | |
| 3114 | 3114 | |
| 3115 | 3115 | ca2_data ^= 1; |
| 3116 | 3116 | /* signal 1 Hz irq on CA2 input on the VIA */ |
| 3117 | | via_ca2_w(via_0, ca2_data); |
| 3117 | via_0->write_ca2(ca2_data); |
| 3118 | 3118 | |
| 3119 | 3119 | rtc_incticks(mac); |
| 3120 | 3120 | } |
src/mess/machine/lisa.c
| r9146 | r9147 | |
| 347 | 347 | |
| 348 | 348 | INLINE void COPS_send_data_if_possible(running_machine *machine) |
| 349 | 349 | { |
| 350 | | running_device *via_0 = machine->device("via6522_0"); |
| 350 | via6522_device *via_0 = machine->device<via6522_device>("via6522_0"); |
| 351 | address_space *space = cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM); |
| 351 | 352 | |
| 352 | 353 | if ((! hold_COPS_data) && fifo_size && (! COPS_Ready)) |
| 353 | 354 | { |
| 354 | 355 | logerror("Pushing one byte of data to VIA\n"); |
| 355 | 356 | |
| 356 | | via_porta_w(via_0, 0, fifo_data[fifo_head]); /* output data */ |
| 357 | via_0->write_porta(*space, 0, fifo_data[fifo_head]); /* output data */ |
| 357 | 358 | if (fifo_head == mouse_data_offset) |
| 358 | 359 | mouse_data_offset = -1; /* we just phased out the mouse data in buffer */ |
| 359 | 360 | fifo_head = (fifo_head+1) & 0x7; |
| 360 | 361 | fifo_size--; |
| 361 | | via_ca1_w(via_0, 1); /* pulse ca1 so that VIA reads it */ |
| 362 | | via_ca1_w(via_0, 0); /* BTW, I have no idea how a real COPS does it ! */ |
| 362 | via_0->write_ca1(1); /* pulse ca1 so that VIA reads it */ |
| 363 | via_0->write_ca1(0); /* BTW, I have no idea how a real COPS does it ! */ |
| 363 | 364 | } |
| 364 | 365 | } |
| 365 | 366 | |
| r9146 | r9147 | |
| 535 | 536 | static TIMER_CALLBACK(read_COPS_command) |
| 536 | 537 | { |
| 537 | 538 | int command; |
| 538 | | running_device *via_0 = machine->device("via6522_0"); |
| 539 | | |
| 539 | via6522_device *via_0 = machine->device<via6522_device>("via6522_0"); |
| 540 | address_space *space = cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM); |
| 541 | |
| 540 | 542 | COPS_Ready = 0; |
| 541 | 543 | |
| 542 | 544 | /*logerror("read_COPS_command : trying to send data to VIA\n");*/ |
| 543 | 545 | COPS_send_data_if_possible(machine); |
| 544 | 546 | |
| 545 | 547 | /* some pull-ups allow the COPS to read 1s when the VIA port is not set as output */ |
| 546 | | command = (COPS_command | (~ via_r(via_0, VIA_DDRA))) & 0xff; |
| 548 | command = (COPS_command | (~ via_0->read(*space, VIA_DDRA))) & 0xff; |
| 547 | 549 | |
| 548 | 550 | if (command & 0x80) |
| 549 | 551 | return; /* NOP */ |
| r9146 | r9147 | |
| 827 | 829 | |
| 828 | 830 | static WRITE8_DEVICE_HANDLER(COPS_via_out_b) |
| 829 | 831 | { |
| 830 | | running_device *via_0 = device->machine->device("via6522_0"); |
| 832 | via6522_device *via_0 = device->machine->device<via6522_device>("via6522_0"); |
| 833 | address_space *space = cputag_get_address_space(device->machine, "maincpu", ADDRESS_SPACE_PROGRAM); |
| 831 | 834 | |
| 832 | 835 | /* pull-up */ |
| 833 | | data |= (~ via_r(via_0, VIA_DDRA)) & 0x01; |
| 836 | data |= (~ via_0->read(*space,VIA_DDRA)) & 0x01; |
| 834 | 837 | |
| 835 | 838 | if (data & 0x01) |
| 836 | 839 | { |
| r9146 | r9147 | |
| 1179 | 1182 | init_COPS(machine); |
| 1180 | 1183 | |
| 1181 | 1184 | { |
| 1182 | | running_device *via_0 = machine->device("via6522_0"); |
| 1185 | via6522_device *via_0 = machine->device<via6522_device>("via6522_0"); |
| 1183 | 1186 | COPS_via_out_ca2(via_0, 0, 0); /* VIA core forgets to do so */ |
| 1184 | 1187 | } |
| 1185 | 1188 | |
| r9146 | r9147 | |
| 1914 | 1917 | |
| 1915 | 1918 | static READ16_HANDLER ( lisa_IO_r ) |
| 1916 | 1919 | { |
| 1917 | | running_device *via_0 = space->machine->device("via6522_0"); |
| 1918 | | running_device *via_1 = space->machine->device("via6522_1"); |
| 1920 | via6522_device *via_0 = space->machine->device<via6522_device>("via6522_0"); |
| 1921 | via6522_device *via_1 = space->machine->device<via6522_device>("via6522_1"); |
| 1919 | 1922 | int answer=0; |
| 1920 | 1923 | |
| 1921 | 1924 | switch ((offset & 0x7000) >> 12) |
| r9146 | r9147 | |
| 1967 | 1970 | case 2: /* parallel port */ |
| 1968 | 1971 | /* 1 VIA located at 0xD901 */ |
| 1969 | 1972 | if (ACCESSING_BITS_0_7) |
| 1970 | | return via_r(via_1, (offset >> 2) & 0xf); |
| 1973 | return via_1->read(*space, (offset >> 2) & 0xf); |
| 1971 | 1974 | break; |
| 1972 | 1975 | |
| 1973 | 1976 | case 3: /* keyboard/mouse cops via */ |
| 1974 | 1977 | /* 1 VIA located at 0xDD81 */ |
| 1975 | 1978 | if (ACCESSING_BITS_0_7) |
| 1976 | | return via_r(via_0, offset & 0xf); |
| 1979 | return via_0->read(*space, offset & 0xf); |
| 1977 | 1980 | break; |
| 1978 | 1981 | } |
| 1979 | 1982 | } |
| r9146 | r9147 | |
| 2043 | 2046 | |
| 2044 | 2047 | static WRITE16_HANDLER ( lisa_IO_w ) |
| 2045 | 2048 | { |
| 2046 | | running_device *via_0 = space->machine->device("via6522_0"); |
| 2047 | | running_device *via_1 = space->machine->device("via6522_1"); |
| 2049 | via6522_device *via_0 = space->machine->device<via6522_device>("via6522_0"); |
| 2050 | via6522_device *via_1 = space->machine->device<via6522_device>("via6522_1"); |
| 2048 | 2051 | |
| 2049 | 2052 | switch ((offset & 0x7000) >> 12) |
| 2050 | 2053 | { |
| r9146 | r9147 | |
| 2092 | 2095 | |
| 2093 | 2096 | case 2: /* paralel port */ |
| 2094 | 2097 | if (ACCESSING_BITS_0_7) |
| 2095 | | via_w(via_1, (offset >> 2) & 0xf, data & 0xff); |
| 2098 | via_1->write(*space, (offset >> 2) & 0xf, data & 0xff); |
| 2096 | 2099 | break; |
| 2097 | 2100 | |
| 2098 | 2101 | case 3: /* keyboard/mouse cops via */ |
| 2099 | 2102 | if (ACCESSING_BITS_0_7) |
| 2100 | | via_w(via_0, offset & 0xf, data & 0xff); |
| 2103 | via_0->write(*space, offset & 0xf, data & 0xff); |
| 2101 | 2104 | break; |
| 2102 | 2105 | } |
| 2103 | 2106 | } |
src/mess/machine/c1571.c
| r9146 | r9147 | |
| 83 | 83 | |
| 84 | 84 | /* devices */ |
| 85 | 85 | running_device *cpu; |
| 86 | | running_device *via0; |
| 87 | | running_device *via1; |
| 86 | via6522_device *via0; |
| 87 | via6522_device *via1; |
| 88 | 88 | running_device *cia; |
| 89 | 89 | running_device *wd1770; |
| 90 | 90 | running_device *serial_bus; |
| r9146 | r9147 | |
| 195 | 195 | int byte_ready = !(byte && c1571->soe); |
| 196 | 196 | |
| 197 | 197 | cpu_set_input_line(c1571->cpu, M6502_SET_OVERFLOW, byte_ready); |
| 198 | | via_ca1_w(c1571->via1, byte_ready); |
| 198 | c1571->via1->write_ca1(byte_ready); |
| 199 | 199 | |
| 200 | 200 | c1571->byte = byte; |
| 201 | 201 | } |
| r9146 | r9147 | |
| 309 | 309 | { |
| 310 | 310 | c1571_t *c1571 = get_safe_token(device); |
| 311 | 311 | |
| 312 | | via_ca1_w(c1571->via0, !state); |
| 312 | c1571->via0->write_ca1(!state); |
| 313 | 313 | iec_data_w(device); |
| 314 | 314 | } |
| 315 | 315 | |
| r9146 | r9147 | |
| 359 | 359 | |
| 360 | 360 | static ADDRESS_MAP_START( c1570_map, ADDRESS_SPACE_PROGRAM, 8 ) |
| 361 | 361 | AM_RANGE(0x0000, 0x07ff) AM_RAM |
| 362 | | AM_RANGE(0x1800, 0x180f) AM_DEVREADWRITE(M6522_0_TAG, via_r, via_w) |
| 363 | | AM_RANGE(0x1c00, 0x1c0f) AM_DEVREADWRITE(M6522_1_TAG, via_r, via_w) |
| 362 | AM_RANGE(0x1800, 0x180f) AM_DEVREADWRITE_MODERN(M6522_0_TAG, via6522_device, read, write) |
| 363 | AM_RANGE(0x1c00, 0x1c0f) AM_DEVREADWRITE_MODERN(M6522_1_TAG, via6522_device, read, write) |
| 364 | 364 | AM_RANGE(0x2000, 0x2003) AM_DEVREADWRITE(WD1770_TAG, wd17xx_r, wd17xx_w) |
| 365 | 365 | AM_RANGE(0x4000, 0x400f) AM_DEVREADWRITE(M6526_TAG, mos6526_r, mos6526_w) |
| 366 | 366 | AM_RANGE(0x8000, 0xffff) AM_ROM AM_REGION("c1570:c1570", 0) |
| r9146 | r9147 | |
| 372 | 372 | |
| 373 | 373 | static ADDRESS_MAP_START( c1571_map, ADDRESS_SPACE_PROGRAM, 8 ) |
| 374 | 374 | AM_RANGE(0x0000, 0x07ff) AM_RAM |
| 375 | | AM_RANGE(0x1800, 0x180f) AM_MIRROR(0x03f0) AM_DEVREADWRITE(M6522_0_TAG, via_r, via_w) |
| 376 | | AM_RANGE(0x1c00, 0x1c0f) AM_MIRROR(0x03f0) AM_DEVREADWRITE(M6522_1_TAG, via_r, via_w) |
| 375 | AM_RANGE(0x1800, 0x180f) AM_MIRROR(0x03f0) AM_DEVREADWRITE_MODERN(M6522_0_TAG, via6522_device, read, write) |
| 376 | AM_RANGE(0x1c00, 0x1c0f) AM_MIRROR(0x03f0) AM_DEVREADWRITE_MODERN(M6522_1_TAG, via6522_device, read, write) |
| 377 | 377 | AM_RANGE(0x2000, 0x2003) AM_MIRROR(0x1ffc) AM_DEVREADWRITE(WD1770_TAG, wd17xx_r, wd17xx_w) |
| 378 | 378 | AM_RANGE(0x4000, 0x400f) AM_MIRROR(0x3ff0) AM_DEVREADWRITE(M6526_TAG, mos6526_r, mos6526_w) |
| 379 | 379 | AM_RANGE(0x8000, 0xffff) AM_ROM AM_REGION("c1571:c1571", 0) |
| r9146 | r9147 | |
| 385 | 385 | |
| 386 | 386 | static ADDRESS_MAP_START( c1571cr_map, ADDRESS_SPACE_PROGRAM, 8 ) |
| 387 | 387 | AM_RANGE(0x0000, 0x07ff) AM_RAM |
| 388 | | AM_RANGE(0x1800, 0x180f) AM_DEVREADWRITE(M6522_0_TAG, via_r, via_w) |
| 389 | | AM_RANGE(0x1c00, 0x1c0f) AM_DEVREADWRITE(M6522_1_TAG, via_r, via_w) |
| 388 | AM_RANGE(0x1800, 0x180f) AM_DEVREADWRITE_MODERN(M6522_0_TAG, via6522_device, read, write) |
| 389 | AM_RANGE(0x1c00, 0x1c0f) AM_DEVREADWRITE_MODERN(M6522_1_TAG, via6522_device, read, write) |
| 390 | 390 | // AM_RANGE(0x2000, 0x2005) 5710 FDC |
| 391 | 391 | // AM_RANGE(0x400c, 0x400e) 5710 CIA |
| 392 | 392 | // AM_RANGE(0x4010, 0x4017) 5710 CIA |
| r9146 | r9147 | |
| 721 | 721 | c1571->soe = state; |
| 722 | 722 | |
| 723 | 723 | cpu_set_input_line(c1571->cpu, M6502_SET_OVERFLOW, byte_ready); |
| 724 | | via_ca1_w(device, byte_ready); |
| 724 | c1571->via1->write_ca1(byte_ready); |
| 725 | 725 | } |
| 726 | 726 | |
| 727 | 727 | static WRITE_LINE_DEVICE_HANDLER( mode_w ) |
| r9146 | r9147 | |
| 823 | 823 | static WRITE_LINE_DEVICE_HANDLER( wpt_w ) |
| 824 | 824 | { |
| 825 | 825 | c1571_t *c1571 = get_safe_token(device->owner()); |
| 826 | | |
| 827 | | via_ca2_w(c1571->via0, !state); |
| 826 | |
| 827 | c1571->via0->write_ca2(!state); |
| 828 | 828 | } |
| 829 | 829 | |
| 830 | 830 | static const floppy_config c1570_floppy_config = |
| r9146 | r9147 | |
| 950 | 950 | c1571->cpu = device->subdevice(M6502_TAG); |
| 951 | 951 | |
| 952 | 952 | /* find devices */ |
| 953 | | c1571->via0 = device->subdevice(M6522_0_TAG); |
| 954 | | c1571->via1 = device->subdevice(M6522_1_TAG); |
| 953 | c1571->via0 = device->subdevice<via6522_device>(M6522_0_TAG); |
| 954 | c1571->via1 = device->subdevice<via6522_device>(M6522_1_TAG); |
| 955 | 955 | c1571->cia = device->subdevice(M6526_TAG); |
| 956 | 956 | c1571->wd1770 = device->subdevice(WD1770_TAG); |
| 957 | 957 | c1571->serial_bus = device->machine->device(config->serial_bus_tag); |
src/mess/machine/bbc.c
| r9146 | r9147 | |
| 609 | 609 | |
| 610 | 610 | |
| 611 | 611 | if ((offset>=0x200) && (offset<=0x2ff)) /* SHEILA */ |
| 612 | | { |
| 613 | | running_device *via_0 = space->machine->device("via6522_0"); |
| 614 | | running_device *via_1 = space->machine->device("via6522_1"); |
| 612 | { |
| 613 | via6522_device *via_0 = space->machine->device<via6522_device>("via6522_0"); |
| 614 | via6522_device *via_1 = space->machine->device<via6522_device>("via6522_1"); |
| 615 | 615 | |
| 616 | 616 | myo=offset-0x200; |
| 617 | 617 | if ((myo>=0x00) && (myo<=0x07)) return bbc_6845_r(space, myo-0x00); /* Video Controller */ |
| r9146 | r9147 | |
| 632 | 632 | if ((myo>=0x30) && (myo<=0x33)) return 0xfe; /* page select */ |
| 633 | 633 | if ((myo>=0x34) && (myo<=0x37)) return bbcm_ACCCON_read(space, myo-0x34); /* ACCCON */ |
| 634 | 634 | if ((myo>=0x38) && (myo<=0x3f)) return 0xfe; /* NC ?? */ |
| 635 | | if ((myo>=0x40) && (myo<=0x5f)) return via_r(via_0, myo-0x40); |
| 636 | | if ((myo>=0x60) && (myo<=0x7f)) return via_r(via_1, myo-0x60); |
| 635 | if ((myo>=0x40) && (myo<=0x5f)) return via_0->read(*space,myo-0x40); |
| 636 | if ((myo>=0x60) && (myo<=0x7f)) return via_1->read(*space,myo-0x60); |
| 637 | 637 | if ((myo>=0x80) && (myo<=0x9f)) return 0xfe; |
| 638 | 638 | if ((myo>=0xa0) && (myo<=0xbf)) return 0xfe; |
| 639 | 639 | if ((myo>=0xc0) && (myo<=0xdf)) return 0xfe; |
| r9146 | r9147 | |
| 649 | 649 | |
| 650 | 650 | if ((offset>=0x200) && (offset<=0x2ff)) /* SHEILA */ |
| 651 | 651 | { |
| 652 | | running_device *via_0 = space->machine->device("via6522_0"); |
| 653 | | running_device *via_1 = space->machine->device("via6522_1"); |
| 652 | via6522_device *via_0 = space->machine->device<via6522_device>("via6522_0"); |
| 653 | via6522_device *via_1 = space->machine->device<via6522_device>("via6522_1"); |
| 654 | 654 | |
| 655 | 655 | myo=offset-0x200; |
| 656 | 656 | if ((myo>=0x00) && (myo<=0x07)) bbc_6845_w(space, myo-0x00,data); /* Video Controller */ |
| r9146 | r9147 | |
| 671 | 671 | if ((myo>=0x30) && (myo<=0x33)) page_selectbm_w(space, myo-0x30,data); /* page select */ |
| 672 | 672 | if ((myo>=0x34) && (myo<=0x37)) bbcm_ACCCON_write(space, myo-0x34,data); /* ACCCON */ |
| 673 | 673 | //if ((myo>=0x38) && (myo<=0x3f)) /* NC ?? */ |
| 674 | | if ((myo>=0x40) && (myo<=0x5f)) via_w(via_0, myo-0x40, data); |
| 675 | | if ((myo>=0x60) && (myo<=0x7f)) via_w(via_1, myo-0x60, data); |
| 674 | if ((myo>=0x40) && (myo<=0x5f)) via_0->write(*space,myo-0x40, data); |
| 675 | if ((myo>=0x60) && (myo<=0x7f)) via_1->write(*space,myo-0x60, data); |
| 676 | 676 | //if ((myo>=0x80) && (myo<=0x9f)) |
| 677 | 677 | //if ((myo>=0xa0) && (myo<=0xbf)) |
| 678 | 678 | //if ((myo>=0xc0) && (myo<=0xdf)) |
| r9146 | r9147 | |
| 813 | 813 | "COL0", "COL1", "COL2", "COL3", "COL4", |
| 814 | 814 | "COL5", "COL6", "COL7", "COL8", "COL9" |
| 815 | 815 | }; |
| 816 | | running_device *via_0 = device->machine->device("via6522_0"); |
| 816 | via6522_device *via_0 = device->machine->device<via6522_device>("via6522_0"); |
| 817 | 817 | |
| 818 | 818 | /* only do auto scan if keyboard is not enabled */ |
| 819 | 819 | if (b3_keyboard == 1) |
| r9146 | r9147 | |
| 829 | 829 | being pressed on the selected column */ |
| 830 | 830 | if ((input_port_read(device->machine, colnames[column]) | 0x01) != 0xff) |
| 831 | 831 | { |
| 832 | | via_ca2_w(via_0, 1); |
| 832 | via_0->write_ca2(1); |
| 833 | 833 | } |
| 834 | 834 | else |
| 835 | 835 | { |
| 836 | | via_ca2_w(via_0, 0); |
| 836 | via_0->write_ca2(0); |
| 837 | 837 | } |
| 838 | 838 | |
| 839 | 839 | } |
| 840 | 840 | else |
| 841 | 841 | { |
| 842 | | via_ca2_w(via_0, 0); |
| 842 | via_0->write_ca2(0); |
| 843 | 843 | } |
| 844 | 844 | } |
| 845 | 845 | } |
| r9146 | r9147 | |
| 851 | 851 | "COL0", "COL1", "COL2", "COL3", "COL4", |
| 852 | 852 | "COL5", "COL6", "COL7", "COL8", "COL9" |
| 853 | 853 | }; |
| 854 | | running_device *via_0 = device->machine->device("via6522_0"); |
| 854 | via6522_device *via_0 = device->machine->device<via6522_device>("via6522_0"); |
| 855 | 855 | |
| 856 | 856 | /* only do auto scan if keyboard is not enabled */ |
| 857 | 857 | if (b3_keyboard == 1) |
| r9146 | r9147 | |
| 869 | 869 | being pressed on the selected column */ |
| 870 | 870 | if ((input_port_read(device->machine, colnames[column]) | 0x01) != 0xff) |
| 871 | 871 | { |
| 872 | | via_ca2_w(via_0, 1); |
| 872 | via_0->write_ca2(1); |
| 873 | 873 | } |
| 874 | 874 | else |
| 875 | 875 | { |
| 876 | | via_ca2_w(via_0, 0); |
| 876 | via_0->write_ca2(0); |
| 877 | 877 | } |
| 878 | 878 | |
| 879 | 879 | } |
| 880 | 880 | else |
| 881 | 881 | { |
| 882 | | via_ca2_w(via_0, 0); |
| 882 | via_0->write_ca2(0); |
| 883 | 883 | } |
| 884 | 884 | } |
| 885 | 885 | } |
| r9146 | r9147 | |
| 895 | 895 | "COL0", "COL1", "COL2", "COL3", "COL4", |
| 896 | 896 | "COL5", "COL6", "COL7", "COL8", "COL9" |
| 897 | 897 | }; |
| 898 | | running_device *via_0 = space->machine->device("via6522_0"); |
| 898 | via6522_device *via_0 = space->machine->device<via6522_device>("via6522_0"); |
| 899 | 899 | |
| 900 | 900 | column = data & 0x0f; |
| 901 | 901 | row = (data>>4) & 0x07; |
| r9146 | r9147 | |
| 919 | 919 | |
| 920 | 920 | if ((res | 1) != 0xff) |
| 921 | 921 | { |
| 922 | | via_ca2_w(via_0, 1); |
| 922 | via_0->write_ca2(1); |
| 923 | 923 | } |
| 924 | 924 | else |
| 925 | 925 | { |
| 926 | | via_ca2_w(via_0, 0); |
| 926 | via_0->write_ca2(0); |
| 927 | 927 | } |
| 928 | 928 | |
| 929 | 929 | return (data & 0x7f) | (bit<<7); |
| r9146 | r9147 | |
| 1342 | 1342 | |
| 1343 | 1343 | static UPD7002_EOC(BBC_uPD7002_EOC) |
| 1344 | 1344 | { |
| 1345 | | running_device *via_0 = device->machine->device("via6522_0"); |
| 1346 | | via_cb1_w(via_0, data); |
| 1345 | via6522_device *via_0 = device->machine->device<via6522_device>("via6522_0"); |
| 1346 | via_0->write_cb1(data); |
| 1347 | 1347 | } |
| 1348 | 1348 | |
| 1349 | 1349 | const uPD7002_interface bbc_uPD7002 = |
| r9146 | r9147 | |
| 1381 | 1381 | } |
| 1382 | 1382 | |
| 1383 | 1383 | static TIMER_CALLBACK(bbc_tape_timer_cb) |
| 1384 | | { |
| 1384 | { |
| 1385 | 1385 | |
| 1386 | 1386 | double dev_val; |
| 1387 | 1387 | dev_val=cassette_input(machine->device("cassette")); |
| r9146 | r9147 | |
| 2058 | 2058 | { |
| 2059 | 2059 | bbc_Master=1; |
| 2060 | 2060 | bbc_tape_timer = timer_alloc(machine, bbc_tape_timer_cb, NULL); |
| 2061 | | mc146818_init(machine, MC146818_STANDARD); |
| 2062 | 2061 | } |
| 2063 | 2062 | |
| 2064 | 2063 | MACHINE_START( bbca ) |
src/mess/drivers/vic20.c
| r9146 | r9147 | |
| 100 | 100 | // AM_RANGE(0x6000, 0x7fff) BLK3 |
| 101 | 101 | AM_RANGE(0x8000, 0x8fff) AM_ROM |
| 102 | 102 | AM_RANGE(0x9000, 0x900f) AM_DEVREADWRITE(M6560_TAG, mos6560_port_r, mos6560_port_w) |
| 103 | | AM_RANGE(0x9110, 0x911f) AM_DEVREADWRITE(M6522_0_TAG, via_r, via_w) |
| 104 | | AM_RANGE(0x9120, 0x912f) AM_DEVREADWRITE(M6522_1_TAG, via_r, via_w) |
| 103 | AM_RANGE(0x9110, 0x911f) AM_DEVREADWRITE_MODERN(M6522_0_TAG, via6522_device, read, write) |
| 104 | AM_RANGE(0x9120, 0x912f) AM_DEVREADWRITE_MODERN(M6522_1_TAG, via6522_device, read, write) |
| 105 | 105 | AM_RANGE(0x9400, 0x97ff) AM_RAM |
| 106 | 106 | // AM_RANGE(0x9800, 0x9bff) I/O2 |
| 107 | 107 | // AM_RANGE(0x9c00, 0x9fff) I/O3 |
| r9146 | r9147 | |
| 427 | 427 | vic20_state *state = timer.machine->driver_data<vic20_state>(); |
| 428 | 428 | int data = (cassette_input(state->cassette) > +0.0) ? 1 : 0; |
| 429 | 429 | |
| 430 | | via_ca1_w(state->via1, data); |
| 430 | state->via1->write_ca1(data); |
| 431 | 431 | } |
| 432 | 432 | |
| 433 | 433 | /* IEC Serial Bus */ |
| r9146 | r9147 | |
| 435 | 435 | static CBM_IEC_DAISY( cbm_iec_daisy ) |
| 436 | 436 | { |
| 437 | 437 | { M6522_0_TAG }, |
| 438 | | { M6522_1_TAG, DEVCB_DEVICE_LINE(M6522_1_TAG, via_cb1_w) }, |
| 438 | { M6522_1_TAG, DEVCB_DEVICE_LINE_MEMBER(M6522_1_TAG, via6522_device, write_cb1), }, |
| 439 | 439 | { C1541_IEC(C1540_TAG) }, |
| 440 | 440 | { NULL} |
| 441 | 441 | }; |
| r9146 | r9147 | |
| 520 | 520 | address_space *program = cputag_get_address_space(machine, M6502_TAG, ADDRESS_SPACE_PROGRAM); |
| 521 | 521 | |
| 522 | 522 | /* find devices */ |
| 523 | | state->via0 = machine->device(M6522_0_TAG); |
| 524 | | state->via1 = machine->device(M6522_1_TAG); |
| 523 | state->via0 = machine->device<via6522_device>(M6522_0_TAG); |
| 524 | state->via1 = machine->device<via6522_device>(M6522_1_TAG); |
| 525 | 525 | state->iec = machine->device(IEC_TAG); |
| 526 | 526 | state->cassette = machine->device(CASSETTE_TAG); |
| 527 | 527 | state->cassette_timer = machine->device<timer_device>(TIMER_C1530_TAG); |
src/mess/drivers/pet.c
| r9146 | r9147 | |
| 406 | 406 | AM_RANGE(0xa000, 0xe7ff) AM_ROM |
| 407 | 407 | AM_RANGE(0xe810, 0xe813) AM_DEVREADWRITE("pia_0", pia6821_r, pia6821_w) |
| 408 | 408 | AM_RANGE(0xe820, 0xe823) AM_DEVREADWRITE("pia_1", pia6821_r, pia6821_w) |
| 409 | | AM_RANGE(0xe840, 0xe84f) AM_DEVREADWRITE("via6522_0", via_r, via_w) |
| 409 | AM_RANGE(0xe840, 0xe84f) AM_DEVREADWRITE_MODERN("via6522_0", via6522_device, read, write) |
| 410 | 410 | /* AM_RANGE(0xe900, 0xe91f) AM_DEVREAD("ieee_bus", cbm_ieee_state) // for debugging */ |
| 411 | 411 | AM_RANGE(0xf000, 0xffff) AM_ROM |
| 412 | 412 | ADDRESS_MAP_END |
| r9146 | r9147 | |
| 416 | 416 | AM_RANGE(0xa000, 0xe7ff) AM_ROM |
| 417 | 417 | AM_RANGE(0xe810, 0xe813) AM_DEVREADWRITE("pia_0", pia6821_r, pia6821_w) |
| 418 | 418 | AM_RANGE(0xe820, 0xe823) AM_DEVREADWRITE("pia_1", pia6821_r, pia6821_w) |
| 419 | | AM_RANGE(0xe840, 0xe84f) AM_DEVREADWRITE("via6522_0", via_r, via_w) |
| 419 | AM_RANGE(0xe840, 0xe84f) AM_DEVREADWRITE_MODERN("via6522_0", via6522_device, read, write) |
| 420 | 420 | AM_RANGE(0xe880, 0xe880) AM_DEVWRITE("crtc", mc6845_address_w) |
| 421 | 421 | AM_RANGE(0xe881, 0xe881) AM_DEVREADWRITE("crtc", mc6845_register_r, mc6845_register_w) |
| 422 | 422 | AM_RANGE(0xf000, 0xffff) AM_ROM |
| r9146 | r9147 | |
| 433 | 433 | #else |
| 434 | 434 | AM_RANGE(0xe810, 0xe813) AM_DEVREADWRITE("pia_0", pia6821_r, pia6821_w) |
| 435 | 435 | AM_RANGE(0xe820, 0xe823) AM_DEVREADWRITE("pia_1", pia6821_r, pia6821_w) |
| 436 | | AM_RANGE(0xe840, 0xe84f) AM_DEVREADWRITE("via6522_0", via_r, via_w) |
| 436 | AM_RANGE(0xe840, 0xe84f) AM_DEVREADWRITE_MODERN("via6522_0", via6522_device, read, write) |
| 437 | 437 | AM_RANGE(0xe880, 0xe880) AM_DEVWRITE("crtc", mc6845_address_w) |
| 438 | 438 | AM_RANGE(0xe881, 0xe881) AM_DEVREADWRITE("crtc", mc6845_register_r, mc6845_register_w) |
| 439 | 439 | #endif |
| r9146 | r9147 | |
| 464 | 464 | AM_RANGE(0xa000, 0xe7ff) AM_ROM |
| 465 | 465 | AM_RANGE(0xe810, 0xe813) AM_DEVREADWRITE("pia_0", pia6821_r, pia6821_w) |
| 466 | 466 | AM_RANGE(0xe820, 0xe823) AM_DEVREADWRITE("pia_1", pia6821_r, pia6821_w) |
| 467 | | AM_RANGE(0xe840, 0xe84f) AM_DEVREADWRITE("via6522_0", via_r, via_w) |
| 467 | AM_RANGE(0xe840, 0xe84f) AM_DEVREADWRITE_MODERN("via6522_0", via6522_device, read, write) |
| 468 | 468 | AM_RANGE(0xe880, 0xe880) AM_DEVWRITE("crtc", mc6845_address_w) |
| 469 | 469 | AM_RANGE(0xe881, 0xe881) AM_DEVREADWRITE("crtc", mc6845_register_r, mc6845_register_w) |
| 470 | 470 | /* 0xefe0, 0xefe3, mos 6702 */ |
| r9146 | r9147 | |
| 480 | 480 | AM_RANGE(0xa000, 0xe7ff) AM_ROM |
| 481 | 481 | AM_RANGE(0xe810, 0xe813) AM_DEVREADWRITE("pia_0", pia6821_r, pia6821_w) |
| 482 | 482 | AM_RANGE(0xe820, 0xe823) AM_DEVREADWRITE("pia_1", pia6821_r, pia6821_w) |
| 483 | | AM_RANGE(0xe840, 0xe84f) AM_DEVREADWRITE("via6522_0", via_r, via_w) |
| 483 | AM_RANGE(0xe840, 0xe84f) AM_DEVREADWRITE_MODERN("via6522_0", via6522_device, read, write) |
| 484 | 484 | AM_RANGE(0xe880, 0xe880) AM_DEVWRITE("crtc", mc6845_address_w) |
| 485 | 485 | AM_RANGE(0xe881, 0xe881) AM_DEVREADWRITE("crtc", mc6845_register_r, mc6845_register_w) |
| 486 | 486 | AM_RANGE(0xeff8, 0xefff) AM_READWRITE(superpet_r, superpet_w) |
src/mess/drivers/jr100.c
| r9146 | r9147 | |
| 27 | 27 | static bool jr100_use_pcg; |
| 28 | 28 | static UINT8 jr100_speaker; |
| 29 | 29 | |
| 30 | | static WRITE8_DEVICE_HANDLER( jr100_via_w ) |
| 30 | static WRITE8_HANDLER( jr100_via_w ) |
| 31 | 31 | { |
| 32 | 32 | static UINT16 t1latch; |
| 33 | 33 | static UINT8 beep_en; |
| r9146 | r9147 | |
| 39 | 39 | beep_en = ((data & 0xe0) == 0xe0); |
| 40 | 40 | |
| 41 | 41 | if(!beep_en) |
| 42 | | beep_set_state(device->machine->device("beeper"),0); |
| 42 | beep_set_state(space->machine->device("beeper"),0); |
| 43 | 43 | } |
| 44 | 44 | |
| 45 | 45 | /* T1L-L */ |
| r9146 | r9147 | |
| 58 | 58 | /* writing here actually enables the beeper, if above masking condition is satisfied */ |
| 59 | 59 | if(beep_en) |
| 60 | 60 | { |
| 61 | | beep_set_state(device->machine->device("beeper"),1); |
| 62 | | beep_set_frequency(device->machine->device("beeper"),894886.25 / (double)(t1latch) / 2.0); |
| 61 | beep_set_state(space->machine->device("beeper"),1); |
| 62 | beep_set_frequency(space->machine->device("beeper"),894886.25 / (double)(t1latch) / 2.0); |
| 63 | 63 | } |
| 64 | 64 | } |
| 65 | | |
| 66 | | via_w(device,offset,data); |
| 65 | via6522_device *via = space->machine->device<via6522_device>("via"); |
| 66 | via->write(*space,offset,data); |
| 67 | 67 | } |
| 68 | 68 | |
| 69 | 69 | static ADDRESS_MAP_START(jr100_mem, ADDRESS_SPACE_PROGRAM, 8) |
| r9146 | r9147 | |
| 71 | 71 | AM_RANGE(0x0000, 0x3fff) AM_RAM AM_BASE(&jr100_ram) |
| 72 | 72 | AM_RANGE(0xc000, 0xc0ff) AM_RAM AM_BASE(&jr100_pcg) |
| 73 | 73 | AM_RANGE(0xc100, 0xc3ff) AM_RAM AM_BASE(&jr100_vram) |
| 74 | | AM_RANGE(0xc800, 0xc80f) AM_DEVREADWRITE("via", via_r, jr100_via_w) |
| 74 | AM_RANGE(0xc800, 0xc80f) AM_DEVREAD_MODERN("via", via6522_device, read) AM_WRITE(jr100_via_w) |
| 75 | 75 | AM_RANGE(0xe000, 0xffff) AM_ROM |
| 76 | 76 | ADDRESS_MAP_END |
| 77 | 77 | |
| r9146 | r9147 | |
| 263 | 263 | speaker_level_w(speaker,jr100_speaker); |
| 264 | 264 | jr100_speaker = 0; |
| 265 | 265 | |
| 266 | | running_device *via = timer.machine->device("via"); |
| 266 | via6522_device *via = timer.machine->device<via6522_device>("via"); |
| 267 | 267 | double level = cassette_input(timer.machine->device("cassette")); |
| 268 | 268 | if (level > 0.0) { |
| 269 | | via_ca1_w(via, 0); |
| 270 | | via_cb1_w(via, 0); |
| 269 | via->write_ca1(0); |
| 270 | via->write_cb1(0); |
| 271 | 271 | } else { |
| 272 | | via_ca1_w(via, 1); |
| 273 | | via_cb1_w(via, 1); |
| 272 | via->write_ca1(1); |
| 273 | via->write_cb1(1); |
| 274 | 274 | } |
| 275 | 275 | |
| 276 | 276 | |
src/mess/drivers/mac.c
| r9146 | r9147 | |
| 228 | 228 | static READ16_HANDLER ( mac_rbv_r ) |
| 229 | 229 | { |
| 230 | 230 | int data; |
| 231 | | running_device *via_1 = space->machine->device("via6522_1"); |
| 231 | via6522_device *via_1 = space->machine->device<via6522_device>("via6522_1"); |
| 232 | 232 | |
| 233 | 233 | logerror("rbv_r: %x, mask %x\n", offset, mem_mask); |
| 234 | 234 | |
| r9146 | r9147 | |
| 250 | 250 | offset >>= 8; |
| 251 | 251 | offset &= 0x0f; |
| 252 | 252 | |
| 253 | | data = via_r(via_1, offset); |
| 253 | data = via_1->read(*space, offset); |
| 254 | 254 | |
| 255 | 255 | return (data & 0xff) | (data << 8); |
| 256 | 256 | } |
| 257 | 257 | |
| 258 | 258 | static WRITE16_HANDLER ( mac_rbv_w ) |
| 259 | 259 | { |
| 260 | | running_device *via_1 = space->machine->device("via6522_1"); |
| 260 | via6522_device *via_1 = space->machine->device<via6522_device>("via6522_1"); |
| 261 | 261 | |
| 262 | 262 | logerror("rbv_w: %x to offset %x, mask %x\n", data, offset, mem_mask); |
| 263 | 263 | |
| r9146 | r9147 | |
| 265 | 265 | offset &= 0x0f; |
| 266 | 266 | |
| 267 | 267 | if (ACCESSING_BITS_8_15) |
| 268 | | via_w(via_1, offset, (data >> 8) & 0xff); |
| 268 | via_1->write(*space, offset, (data >> 8) & 0xff); |
| 269 | 269 | } |
| 270 | 270 | |
| 271 | 271 | // LC/LC II "V8" video and friends |
| r9146 | r9147 | |
| 277 | 277 | static READ16_HANDLER ( mac_v8_r ) |
| 278 | 278 | { |
| 279 | 279 | int data, viaoffs; |
| 280 | | running_device *via_1 = space->machine->device("via6522_1"); |
| 280 | via6522_device *via_1 = space->machine->device<via6522_device>("via6522_1"); |
| 281 | 281 | |
| 282 | 282 | // printf("v8_r: %x, mask %x (PC %x)\n", offset*2, mem_mask, cpu_get_pc(space->cpu)); |
| 283 | 283 | |
| r9146 | r9147 | |
| 286 | 286 | switch (offset) |
| 287 | 287 | { |
| 288 | 288 | case 0: |
| 289 | | data = via_r(via_1, viaoffs); |
| 289 | data = via_1->read(*space, viaoffs); |
| 290 | 290 | return (data<<8) | v8_regs[0]; |
| 291 | 291 | |
| 292 | 292 | default: |
| 293 | | data = via_r(via_1, viaoffs); |
| 293 | data = via_1->read(*space, viaoffs); |
| 294 | 294 | return (data<<8)|data; |
| 295 | 295 | } |
| 296 | 296 | |
| r9146 | r9147 | |
| 298 | 298 | |
| 299 | 299 | static WRITE16_HANDLER ( mac_v8_w ) |
| 300 | 300 | { |
| 301 | | running_device *via_1 = space->machine->device("via6522_1"); |
| 301 | via6522_device *via_1 = space->machine->device<via6522_device>("via6522_1"); |
| 302 | 302 | int viaoffs; |
| 303 | 303 | |
| 304 | 304 | // printf("v8_w: %x to offset %x, mask %x (PC %x)\n", data, offset*2, mem_mask, cpu_get_pc(space->cpu)); |
| r9146 | r9147 | |
| 310 | 310 | case 0: |
| 311 | 311 | if (ACCESSING_BITS_8_15) |
| 312 | 312 | { |
| 313 | | via_w(via_1, viaoffs, (data >> 8) & 0xff); |
| 313 | via_1->write(*space, viaoffs, (data >> 8) & 0xff); |
| 314 | 314 | } |
| 315 | 315 | else |
| 316 | 316 | { |
| r9146 | r9147 | |
| 321 | 321 | default: |
| 322 | 322 | if (ACCESSING_BITS_8_15) |
| 323 | 323 | { |
| 324 | | via_w(via_1, viaoffs, (data >> 8) & 0xff); |
| 324 | via_1->write(*space, viaoffs, (data >> 8) & 0xff); |
| 325 | 325 | } |
| 326 | 326 | break; |
| 327 | 327 | } |
| r9146 | r9147 | |
| 369 | 369 | static READ16_HANDLER ( mac_sonora_r ) |
| 370 | 370 | { |
| 371 | 371 | int data, viaoffs; |
| 372 | | running_device *via_1 = space->machine->device("via6522_1"); |
| 372 | via6522_device *via_1 = space->machine->device<via6522_device>("via6522_1"); |
| 373 | 373 | |
| 374 | 374 | // printf("sonora_r: %x, mask %x (PC %x)\n", offset*2, mem_mask, cpu_get_pc(space->cpu)); |
| 375 | 375 | |
| r9146 | r9147 | |
| 378 | 378 | switch (offset) |
| 379 | 379 | { |
| 380 | 380 | case 0: |
| 381 | | data = via_r(via_1, viaoffs); |
| 381 | data = via_1->read(*space, viaoffs); |
| 382 | 382 | return (data<<8) | sonora_regs[0]; |
| 383 | 383 | |
| 384 | 384 | default: |
| 385 | | data = via_r(via_1, viaoffs); |
| 385 | data = via_1->read(*space, viaoffs); |
| 386 | 386 | return (data<<8)|data; |
| 387 | 387 | } |
| 388 | 388 | |
| r9146 | r9147 | |
| 390 | 390 | |
| 391 | 391 | static WRITE16_HANDLER ( mac_sonora_w ) |
| 392 | 392 | { |
| 393 | | running_device *via_1 = space->machine->device("via6522_1"); |
| 393 | via6522_device *via_1 = space->machine->device<via6522_device>("via6522_1"); |
| 394 | 394 | int viaoffs; |
| 395 | 395 | |
| 396 | 396 | // printf("sonora_w: %x to offset %x, mask %x (PC %x)\n", data, offset*2, mem_mask, cpu_get_pc(space->cpu)); |
| r9146 | r9147 | |
| 402 | 402 | case 0: |
| 403 | 403 | if (ACCESSING_BITS_8_15) |
| 404 | 404 | { |
| 405 | | via_w(via_1, viaoffs, (data >> 8) & 0xff); |
| 405 | via_1->write(*space, viaoffs, (data >> 8) & 0xff); |
| 406 | 406 | } |
| 407 | 407 | else |
| 408 | 408 | { |
| r9146 | r9147 | |
| 413 | 413 | default: |
| 414 | 414 | if (ACCESSING_BITS_8_15) |
| 415 | 415 | { |
| 416 | | via_w(via_1, viaoffs, (data >> 8) & 0xff); |
| 416 | via_1->write(*space, viaoffs, (data >> 8) & 0xff); |
| 417 | 417 | } |
| 418 | 418 | break; |
| 419 | 419 | } |
src/mess/drivers/victor9k.c
| r9146 | r9147 | |
| 49 | 49 | AM_RANGE(0xe0040, 0xe0043) AM_DEVREADWRITE(UPD7201_TAG, upd7201_cd_ba_r, upd7201_cd_ba_w) |
| 50 | 50 | AM_RANGE(0xe8000, 0xe8000) AM_DEVREADWRITE(HD46505S_TAG, mc6845_status_r, mc6845_address_w) |
| 51 | 51 | AM_RANGE(0xe8001, 0xe8001) AM_DEVREADWRITE(HD46505S_TAG, mc6845_register_r, mc6845_register_w) |
| 52 | | AM_RANGE(0xe8020, 0xe802f) AM_DEVREADWRITE(M6522_1_TAG, via_r, via_w) |
| 53 | | AM_RANGE(0xe8040, 0xe804f) AM_DEVREADWRITE(M6522_2_TAG, via_r, via_w) |
| 52 | AM_RANGE(0xe8020, 0xe802f) AM_DEVREADWRITE_MODERN(M6522_1_TAG, via6522_device, read, write) |
| 53 | AM_RANGE(0xe8040, 0xe804f) AM_DEVREADWRITE_MODERN(M6522_2_TAG, via6522_device, read, write) |
| 54 | 54 | AM_RANGE(0xe8060, 0xe8061) AM_DEVREADWRITE(MC6852_TAG, mc6852_r, mc6852_w) |
| 55 | | AM_RANGE(0xe8080, 0xe808f) AM_DEVREADWRITE(M6522_3_TAG, via_r, via_w) |
| 56 | | AM_RANGE(0xe80a0, 0xe80af) AM_DEVREADWRITE(M6522_4_TAG, via_r, via_w) |
| 57 | | AM_RANGE(0xe80c0, 0xe80cf) AM_DEVREADWRITE(M6522_6_TAG, via_r, via_w) |
| 58 | | AM_RANGE(0xe80e0, 0xe80ef) AM_DEVREADWRITE(M6522_5_TAG, via_r, via_w) |
| 55 | AM_RANGE(0xe8080, 0xe808f) AM_DEVREADWRITE_MODERN(M6522_3_TAG, via6522_device, read, write) |
| 56 | AM_RANGE(0xe80a0, 0xe80af) AM_DEVREADWRITE_MODERN(M6522_4_TAG, via6522_device, read, write) |
| 57 | AM_RANGE(0xe80c0, 0xe80cf) AM_DEVREADWRITE_MODERN(M6522_6_TAG, via6522_device, read, write) |
| 58 | AM_RANGE(0xe80e0, 0xe80ef) AM_DEVREADWRITE_MODERN(M6522_5_TAG, via6522_device, read, write) |
| 59 | 59 | AM_RANGE(0xf0000, 0xf0fff) AM_MIRROR(0x1000) AM_RAM AM_BASE_MEMBER(victor9k_state, video_ram) |
| 60 | 60 | AM_RANGE(0xfe000, 0xfffff) AM_ROM AM_REGION(I8088_TAG, 0) |
| 61 | 61 | ADDRESS_MAP_END |
| r9146 | r9147 | |
| 958 | 958 | |
| 959 | 959 | static IEEE488_DAISY( ieee488_daisy ) |
| 960 | 960 | { |
| 961 | | { M6522_1_TAG, DEVCB_NULL, DEVCB_NULL, DEVCB_DEVICE_LINE(M6522_1_TAG, via_ca1_w), DEVCB_DEVICE_LINE(M6522_1_TAG, via_ca2_w) }, |
| 961 | { M6522_1_TAG, DEVCB_NULL, DEVCB_NULL, DEVCB_DEVICE_LINE_MEMBER(M6522_1_TAG, via6522_device, write_ca1), DEVCB_DEVICE_LINE_MEMBER(M6522_1_TAG, via6522_device, write_ca2) }, |
| 962 | 962 | { NULL } |
| 963 | 963 | }; |
| 964 | 964 | |
src/mess/drivers/bbc.c
| r9146 | r9147 | |
| 117 | 117 | /* W: fe20-fe2f Video ULA Video system chip */ |
| 118 | 118 | AM_RANGE(0xfe30, 0xfe3f) AM_READWRITE(bbc_fe_r , bbc_page_selecta_w ) /* R: fe30-fe3f NC Not Connected */ |
| 119 | 119 | /* W: fe30-fe3f 84LS161 Paged ROM selector */ |
| 120 | | AM_RANGE(0xfe40, 0xfe5f) AM_DEVREADWRITE("via6522_0", via_r, via_w) /* fe40-fe5f 6522 VIA SYSTEM VIA */ |
| 120 | AM_RANGE(0xfe40, 0xfe5f) AM_DEVREADWRITE_MODERN("via6522_0", via6522_device, read, write) /* fe40-fe5f 6522 VIA SYSTEM VIA */ |
| 121 | 121 | AM_RANGE(0xfe60, 0xfe7f) AM_NOP /* fe60-fe7f 6522 VIA 1 USER VIA */ |
| 122 | 122 | AM_RANGE(0xfe80, 0xfe9f) AM_NOP /* fe80-fe9f 8271/1770 FDC 1 Floppy disc controller */ |
| 123 | 123 | AM_RANGE(0xfea0, 0xfebf) AM_READ (bbc_fe_r ) /* fea0-febf 68B54 ADLC 1 ECONET controller */ |
| r9146 | r9147 | |
| 151 | 151 | /* W: fe20-fe2f Video ULA Video system chip */ |
| 152 | 152 | AM_RANGE(0xfe30, 0xfe3f) AM_READWRITE(bbc_fe_r , bbc_page_selectb_w ) /* R: fe30-fe3f NC Not Connected */ |
| 153 | 153 | /* W: fe30-fe3f 84LS161 Paged ROM selector */ |
| 154 | | AM_RANGE(0xfe40, 0xfe5f) AM_DEVREADWRITE("via6522_0", via_r, via_w) /* fe40-fe5f 6522 VIA SYSTEM VIA */ |
| 155 | | AM_RANGE(0xfe60, 0xfe7f) AM_DEVREADWRITE("via6522_1", via_r, via_w) /* fe60-fe7f 6522 VIA USER VIA */ |
| 154 | AM_RANGE(0xfe40, 0xfe5f) AM_DEVREADWRITE_MODERN("via6522_0", via6522_device, read, write) /* fe40-fe5f 6522 VIA SYSTEM VIA */ |
| 155 | AM_RANGE(0xfe60, 0xfe7f) AM_DEVREADWRITE_MODERN("via6522_1", via6522_device, read, write) /* fe60-fe7f 6522 VIA USER VIA */ |
| 156 | 156 | AM_RANGE(0xfe80, 0xfe9f) AM_READWRITE(bbc_disc_r , bbc_disc_w ) /* fe80-fe9f 8271 FDC Floppy disc controller */ |
| 157 | 157 | AM_RANGE(0xfea0, 0xfebf) AM_READ (bbc_fe_r ) /* fea0-febf 68B54 ADLC ECONET controller */ |
| 158 | 158 | AM_RANGE(0xfec0, 0xfedf) AM_DEVREADWRITE("upd7002",uPD7002_r,uPD7002_w ) /* fec0-fedf uPD7002 Analogue to digital converter */ |
| r9146 | r9147 | |
| 186 | 186 | /* W: fe20-fe2f Video ULA Video system chip */ |
| 187 | 187 | AM_RANGE(0xfe30, 0xfe3f) AM_READWRITE(bbc_fe_r , bbc_page_selectbp_w ) /* R: fe30-fe3f NC Not Connected */ |
| 188 | 188 | /* W: fe30-fe3f 84LS161 Paged ROM selector */ |
| 189 | | AM_RANGE(0xfe40, 0xfe5f) AM_DEVREADWRITE("via6522_0", via_r, via_w) /* fe40-fe5f 6522 VIA SYSTEM VIA */ |
| 190 | | AM_RANGE(0xfe60, 0xfe7f) AM_DEVREADWRITE("via6522_1", via_r, via_w) /* fe60-fe7f 6522 VIA USER VIA */ |
| 189 | AM_RANGE(0xfe40, 0xfe5f) AM_DEVREADWRITE_MODERN("via6522_0", via6522_device, read, write) /* fe40-fe5f 6522 VIA SYSTEM VIA */ |
| 190 | AM_RANGE(0xfe60, 0xfe7f) AM_DEVREADWRITE_MODERN("via6522_1", via6522_device, read, write) /* fe60-fe7f 6522 VIA USER VIA */ |
| 191 | 191 | AM_RANGE(0xfe80, 0xfe9f) AM_READWRITE(bbc_wd1770_read , bbc_wd1770_write ) /* fe80-fe9f 1770 FDC Floppy disc controller */ |
| 192 | 192 | AM_RANGE(0xfea0, 0xfebf) AM_READ (bbc_fe_r ) /* fea0-febf 68B54 ADLC ECONET controller */ |
| 193 | 193 | AM_RANGE(0xfec0, 0xfedf) AM_DEVREADWRITE("upd7002", uPD7002_r, uPD7002_w) /* fec0-fedf uPD7002 Analogue to digital converter */ |
| r9146 | r9147 | |
| 223 | 223 | /* W: fe20-fe2f Video ULA Video system chip */ |
| 224 | 224 | AM_RANGE(0xfe30, 0xfe3f) AM_READWRITE(bbc_fe_r , bbc_page_selectbp_w ) /* R: fe30-fe3f NC Not Connected */ |
| 225 | 225 | /* W: fe30-fe3f 84LS161 Paged ROM selector */ |
| 226 | | AM_RANGE(0xfe40, 0xfe5f) AM_DEVREADWRITE("via6522_0", via_r, via_w) /* fe40-fe5f 6522 VIA SYSTEM VIA */ |
| 227 | | AM_RANGE(0xfe60, 0xfe7f) AM_DEVREADWRITE("via6522_1", via_r, via_w) /* fe60-fe7f 6522 VIA USER VIA */ |
| 226 | AM_RANGE(0xfe40, 0xfe5f) AM_DEVREADWRITE_MODERN("via6522_0", via6522_device, read, write) /* fe40-fe5f 6522 VIA SYSTEM VIA */ |
| 227 | AM_RANGE(0xfe60, 0xfe7f) AM_DEVREADWRITE_MODERN("via6522_1", via6522_device, read, write) /* fe60-fe7f 6522 VIA USER VIA */ |
| 228 | 228 | AM_RANGE(0xfe80, 0xfe9f) AM_READWRITE(bbc_wd1770_read , bbc_wd1770_write ) /* fe80-fe9f 1770 FDC Floppy disc controller */ |
| 229 | 229 | AM_RANGE(0xfea0, 0xfebf) AM_READ (bbc_fe_r ) /* fea0-febf 68B54 ADLC ECONET controller */ |
| 230 | 230 | AM_RANGE(0xfec0, 0xfedf) AM_DEVREADWRITE("upd7002",uPD7002_r, uPD7002_w ) /* fec0-fedf uPD7002 Analogue to digital converter */ |
| r9146 | r9147 | |
| 289 | 289 | AM_RANGE(0xfe30, 0xfe33) AM_READWRITE(return8_FE , bbc_page_selectbp_w ) fe30-fe33 84LS161 Paged ROM selector |
| 290 | 290 | AM_RANGE(0xfe34, 0xfe37) AM_READWRITE(bbcm_ACCCON_read , bbcm_ACCCON_write ) fe34-fe37 ACCCON ACCCON select Latch |
| 291 | 291 | AM_RANGE(0xfe38, 0xfe3f) AM_READ (return8_FE ) fe38-fe3f NC |
| 292 | | AM_RANGE(0xfe40, 0xfe5f) AM_DEVREADWRITE("via6522_0", via_r, via_w) fe40-fe5f 6522 VIA SYSTEM VIA |
| 293 | | AM_RANGE(0xfe60, 0xfe7f) AM_DEVREADWRITE("via6522_1", via_r, via_w) fe60-fe7f 6522 VIA USER VIA |
| 292 | AM_RANGE(0xfe40, 0xfe5f) AM_DEVREADWRITE_MODERN("via6522_0", via6522_device, read, write) fe40-fe5f 6522 VIA SYSTEM VIA |
| 293 | AM_RANGE(0xfe60, 0xfe7f) AM_DEVREADWRITE_MODERN("via6522_1", via6522_device, read, write) fe60-fe7f 6522 VIA USER VIA |
| 294 | 294 | AM_RANGE(0xfe80, 0xfe9f) AM_READ (return8_FE ) fe80-fe9f NC |
| 295 | 295 | AM_RANGE(0xfea0, 0xfebf) AM_READ (return8_FE ) fea0-febf 68B54 ADLC ECONET controller |
| 296 | 296 | AM_RANGE(0xfec0, 0xfedf) AM_READ (return8_FE ) fec0-fedf NC |
| r9146 | r9147 | |
| 710 | 710 | |
| 711 | 711 | static INTERRUPT_GEN( bbcb_vsync ) |
| 712 | 712 | { |
| 713 | | running_device *via_0 = device->machine->device("via6522_0"); |
| 714 | | via_ca1_w(via_0, 1); |
| 715 | | via_ca1_w(via_0, 0); |
| 713 | via6522_device *via_0 = device->machine->device<via6522_device>("via6522_0"); |
| 714 | via_0->write_ca1(1); |
| 715 | via_0->write_ca1(0); |
| 716 | 716 | bbc_frameclock(); |
| 717 | 717 | } |
| 718 | 718 | |
| r9146 | r9147 | |
| 736 | 736 | |
| 737 | 737 | static WRITE_LINE_DEVICE_HANDLER(bbcb_ack_w) |
| 738 | 738 | { |
| 739 | | via_ca1_w(device, !state); /* ack seems to be inverted? */ |
| 739 | via6522_device *via_1 = device->machine->device<via6522_device>("via6522_1"); |
| 740 | via_1->write_ca1(!state); /* ack seems to be inverted? */ |
| 740 | 741 | } |
| 741 | 742 | |
| 742 | 743 | static const centronics_interface bbcb_centronics_config = |
| 743 | 744 | { |
| 744 | 745 | FALSE, |
| 745 | | DEVCB_DEVICE_LINE("via6522_1", bbcb_ack_w), |
| 746 | DEVCB_DEVICE_LINE("via6522_1",bbcb_ack_w), |
| 746 | 747 | DEVCB_NULL, |
| 747 | 748 | DEVCB_NULL |
| 748 | 749 | }; |
makefile
| r9146 | r9147 | |
| 24 | 24 | #------------------------------------------------- |
| 25 | 25 | |
| 26 | 26 | ifndef TARGET |
| 27 | | TARGET = mess |
| 27 | TARGET = mame |
| 28 | 28 | endif |
| 29 | 29 | |
| 30 | 30 | ifndef SUBTARGET |
| r9146 | r9147 | |
| 489 | 489 | #------------------------------------------------- |
| 490 | 490 | |
| 491 | 491 | # add core include paths |
| 492 | | CCOMFLAGS += \ |
| 492 | INCPATH += \ |
| 493 | 493 | -I$(SRC)/$(TARGET) \ |
| 494 | 494 | -I$(OBJ)/$(TARGET)/layout \ |
| 495 | 495 | -I$(SRC)/emu \ |
| r9146 | r9147 | |
| 500 | 500 | -I$(SRC)/osd/$(OSD) \ |
| 501 | 501 | |
| 502 | 502 | |
| 503 | |
| 503 | 504 | #------------------------------------------------- |
| 504 | 505 | # archiving flags |
| 505 | 506 | #------------------------------------------------- |
| r9146 | r9147 | |
| 585 | 586 | |
| 586 | 587 | # add expat XML library |
| 587 | 588 | ifeq ($(BUILD_EXPAT),1) |
| 588 | | CCOMFLAGS += -I$(SRC)/lib/expat |
| 589 | INCPATH += -I$(SRC)/lib/expat |
| 589 | 590 | EXPAT = $(OBJ)/libexpat.a |
| 590 | 591 | else |
| 591 | 592 | LIBS += -lexpat |
| r9146 | r9147 | |
| 594 | 595 | |
| 595 | 596 | # add ZLIB compression library |
| 596 | 597 | ifeq ($(BUILD_ZLIB),1) |
| 597 | | CCOMFLAGS += -I$(SRC)/lib/zlib |
| 598 | INCPATH += -I$(SRC)/lib/zlib |
| 598 | 599 | ZLIB = $(OBJ)/libz.a |
| 599 | 600 | else |
| 600 | 601 | LIBS += -lz |
| r9146 | r9147 | |
| 643 | 644 | include $(SRC)/tools/tools.mak |
| 644 | 645 | |
| 645 | 646 | # combine the various definitions to one |
| 647 | CCOMFLAGS += $(INCPATH) |
| 646 | 648 | CDEFS = $(DEFS) |
| 647 | 649 | |
| 648 | 650 | |
| r9146 | r9147 | |
| 655 | 657 | |
| 656 | 658 | buildtools: maketree $(BUILD) |
| 657 | 659 | |
| 660 | # In order to keep dependencies reasonable, we exclude objects in the base of |
| 661 | # $(SRC)/emu, as well as all the OSD objects and anything in the $(OBJ) tree |
| 662 | depend: maketree $(MAKEDEP_TARGET) |
| 663 | @echo Rebuilding depend.mak... |
| 664 | $(MAKEDEP) -I. $(INCPATH) -X$(SRC)/emu -X$(SRC)/osd/... -X$(OBJ)/... src/mame > depend.mak |
| 665 | |
| 666 | INCPATH += \ |
| 667 | -I$(SRC)/$(TARGET) \ |
| 668 | -I$(OBJ)/$(TARGET)/layout \ |
| 669 | -I$(SRC)/emu \ |
| 670 | -I$(OBJ)/emu \ |
| 671 | -I$(OBJ)/emu/layout \ |
| 672 | -I$(SRC)/lib/util \ |
| 673 | -I$(SRC)/osd \ |
| 674 | -I$(SRC)/osd/$(OSD) \ |
| 675 | |
| 658 | 676 | tools: maketree $(TOOLS) |
| 659 | 677 | |
| 660 | 678 | maketree: $(sort $(OBJDIRS)) |
| r9146 | r9147 | |
| 725 | 743 | @echo Compiling $<... |
| 726 | 744 | $(CC) $(CDEFS) $(CFLAGS) -S $< -o $@ |
| 727 | 745 | |
| 728 | | $(OBJ)/%.lh: $(SRC)/%.lay $(FILE2STR) |
| 746 | $(OBJ)/%.lh: $(SRC)/%.lay $(FILE2STR_TARGET) |
| 729 | 747 | @echo Converting $<... |
| 730 | 748 | @$(FILE2STR) $< $@ layout_$(basename $(notdir $<)) |
| 731 | 749 | |
| 732 | | $(OBJ)/%.fh: $(SRC)/%.png $(PNG2BDC) $(FILE2STR) |
| 750 | $(OBJ)/%.fh: $(SRC)/%.png $(PNG2BDC_TARGET) $(FILE2STR_TARGET) |
| 733 | 751 | @echo Converting $<... |
| 734 | 752 | @$(PNG2BDC) $< $(OBJ)/temp.bdc |
| 735 | 753 | @$(FILE2STR) $(OBJ)/temp.bdc $@ font_$(basename $(notdir $<)) UINT8 |
| r9146 | r9147 | |
| 745 | 763 | $(CC) $(CDEFS) $(COBJFLAGS) $(CCOMFLAGS) -c $< -o $@ |
| 746 | 764 | endif |
| 747 | 765 | |
| 766 | |
| 767 | |
| 768 | #------------------------------------------------- |
| 769 | # optional dependencies file |
| 770 | #------------------------------------------------- |
| 771 | |
| 772 | -include depend.mak |