From d50fa5d28033b0676b062fda6a80afa0c514ad9a Mon Sep 17 00:00:00 2001 From: jfroco Date: Thu, 12 May 2016 23:29:11 -0300 Subject: [PATCH] Standard 3.1.0 version This is the standard 3.1.0 version --- COPYING | 340 + DOC/BUGS | 114 + DOC/BUILD.PS2 | 22 + DOC/BUILD.RPI | 11 + DOC/CHANGES.OLD | 2293 ++++ DOC/CHANGES.dc | 120 + DOC/CREDITS | 425 + DOC/ChangeLog | 4890 +++++++ DOC/FAQ | 39 + DOC/HOWTO-DIRTYRECT | 116 + DOC/HOWTO-DIRTYSPAN | 110 + DOC/INSTALL | 243 + DOC/INSTALL.dos | 35 + DOC/INSTALL.falcon | 71 + DOC/INSTALL.ps2 | 35 + DOC/INSTALL.wince | 153 + DOC/LPTjoy.txt | 14 + DOC/NEWS | 907 ++ DOC/PORTING | 223 + DOC/PortMaintainers | 31 + DOC/README | 145 + DOC/README.RPI | 21 + DOC/README.android | 34 + DOC/README.dc | 164 + DOC/README.ps2 | 32 + DOC/TODO | 305 + DOC/USAGE | 596 + DOC/cart.txt | 998 ++ DOC/directx.txt | 229 + DOC/emuos.txt | 7 + DOC/pokeysnd.txt | 352 + DOC/r_device.txt | 119 + DOC/rdevice_faq.txt | 518 + DOC/readme.html.in | 143 + DOC/trainer.txt | 18 + README.1ST | 34 + act/Real.act | Bin 0 -> 768 bytes act/XFormer.act | Bin 0 -> 768 bytes act/default.act | Bin 0 -> 768 bytes act/gray.act | Bin 0 -> 768 bytes act/jakub.act | Bin 0 -> 768 bytes atari800.spec | 254 + data/atari2.png | Bin 0 -> 8267 bytes data/atari2.svg | 356 + data/atari800.ico | Bin 0 -> 3262 bytes data/atari_xe.ico | Bin 0 -> 766 bytes debian/README.Debian | 58 + debian/atari800.cfg | 91 + debian/changelog | 256 + debian/control | 20 + debian/copyright | 11 + debian/menu | 2 + debian/postinst | 4 + debian/postrm | 5 + debian/prerm | 7 + debian/rules | 149 + src/.cvsignore | 12 + src/Makefile.in | 158 + src/aclocal.m4 | 187 + src/af80.c | 390 + src/af80.h | 21 + src/afile.c | 245 + src/afile.h | 50 + src/akey.h | 255 + src/amiga/.cvsignore | 3 + src/amiga/Atari800.guide | 109 + src/amiga/Atari800_rev.h | 6 + src/amiga/Atari800_rev.i | 18 + src/amiga/Atari800_rev.rev | 1 + src/amiga/Atari800_rev.s | 21 + src/amiga/ReadMe | 79 + src/amiga/amiga.c | 2204 ++++ src/amiga/amiga.h | 70 + src/amiga/amiga_asm.asm | 133 + src/amiga/amiga_asm.h | 17 + src/amiga/async.c | 579 + src/amiga/async.h | 87 + src/amiga/config.h | 428 + src/amiga/gui.c | 322 + src/amiga/gui.h | 19 + src/amiga/makefile | 107 + src/amiga/support.c | 258 + src/amiga/support.h | 41 + src/amiga/unixfunc.c | 129 + src/android/AndroidManifest.xml | 27 + src/android/build.xml | 92 + src/android/jni/Android.mk.in | 47 + src/android/jni/Application.mk | 1 + src/android/jni/androidinput.c | 547 + src/android/jni/androidinput.h | 111 + src/android/jni/graphics.c | 480 + src/android/jni/graphics.h | 25 + src/android/jni/jni.c | 658 + src/android/jni/keys.inc | 140 + src/android/jni/platform.c | 86 + src/android/jni/sound.c | 62 + src/android/project.properties | 14 + src/android/res/drawable-hdpi/icon.png | Bin 0 -> 3456 bytes src/android/res/drawable-ldpi/icon.png | Bin 0 -> 1367 bytes src/android/res/drawable-mdpi/icon.png | Bin 0 -> 1898 bytes src/android/res/drawable/actionbar_bg.xml | 4 + src/android/res/drawable/folder.png | Bin 0 -> 3000 bytes src/android/res/drawable/ic_menu_archive.png | Bin 0 -> 1354 bytes .../drawable/ic_menu_close_clear_cancel.png | Bin 0 -> 5306 bytes .../res/drawable/ic_menu_preferences.png | Bin 0 -> 2144 bytes src/android/res/drawable/ic_menu_rotate.png | Bin 0 -> 2477 bytes src/android/res/drawable/ic_menu_search.png | Bin 0 -> 5059 bytes src/android/res/drawable/keyboard.png | Bin 0 -> 2576 bytes src/android/res/layout/extended_keymap.xml | 36 + .../res/layout/file_selector_footer.xml | 33 + src/android/res/layout/file_selector_row.xml | 21 + src/android/res/layout/slider_dialog.xml | 20 + src/android/res/menu/fsel_menu.xml | 8 + src/android/res/menu/menu.xml | 20 + src/android/res/values-v11/themes.xml | 5 + src/android/res/values/arrays.xml | 118 + src/android/res/values/attrs.xml | 13 + src/android/res/values/strings.xml | 260 + src/android/res/values/themes.xml | 4 + src/android/res/xml/preferences.xml | 308 + src/android/src/A800Renderer.java | 133 + src/android/src/A800view.java | 265 + src/android/src/AudioThread.java | 130 + src/android/src/FileSelector.java | 449 + src/android/src/KeymapPreference.java | 296 + src/android/src/MainActivity.java | 852 ++ src/android/src/Preferences.java | 248 + src/android/src/SliderPreference.java | 101 + src/antic.c | 4146 ++++++ src/antic.h | 137 + src/artifact.c | 217 + src/artifact.h | 40 + src/atari.c | 1482 +++ src/atari.h | 190 + src/atari800.man | 1530 +++ src/atari_basic.c | 64 + src/atari_curses.c | 860 ++ src/atari_falcon.c | 1234 ++ src/atari_ntsc/atari_ntsc.c | 374 + src/atari_ntsc/atari_ntsc.h | 229 + src/atari_ntsc/atari_ntsc_config.h | 25 + src/atari_ntsc/atari_ntsc_impl.h | 455 + src/atari_ps2.c | 1017 ++ src/atari_rpi.c | 209 + src/atari_x11.c | 3067 +++++ src/binload.c | 185 + src/binload.h | 22 + src/cartridge.c | 1746 +++ src/cartridge.h | 213 + src/cassette.c | 479 + src/cassette.h | 88 + src/cfg.c | 473 + src/cfg.h | 19 + src/colours.c | 332 + src/colours.h | 99 + src/colours_external.c | 65 + src/colours_external.h | 24 + src/colours_ntsc.c | 325 + src/colours_ntsc.h | 39 + src/colours_pal.c | 496 + src/colours_pal.h | 34 + src/compfile.c | 311 + src/compfile.h | 9 + src/config.guess | 1497 +++ src/config.h.in | 565 + src/config.sub | 1608 +++ src/configure | 10966 ++++++++++++++++ src/configure.ac | 1231 ++ src/configure_dos.bat | 1 + src/cpu.c | 2402 ++++ src/cpu.h | 77 + src/cpu_m68k.S | 4002 ++++++ src/cpu_m68k.asm | 4003 ++++++ src/crc32.c | 103 + src/crc32.h | 16 + src/cycle_map.c | 201 + src/cycle_map.h | 9 + src/dc/Makefile.dc | 116 + src/dc/atari800.cfg | 25 + src/dc/atari_dc.c | 2221 ++++ src/dc/config.h | 463 + src/dc/dc_chdir.c | 93 + src/dc/displayscreen.S | 594 + src/dc/icon.h | 44 + src/dc/version.h | 10 + src/dc/vmu.c | 84 + src/dc/vmu.h | 29 + src/devices.c | 2713 ++++ src/devices.h | 85 + src/dos/atari_vga.c | 1504 +++ src/dos/dos_ints.h | 14 + src/dos/dos_sb.c | 1102 ++ src/dos/dos_sb.h | 20 + src/dos/sound_dos.c | 87 + src/dos/vga_asm.s | 449 + src/dos/vga_gfx.c | 355 + src/dos/vga_gfx.h | 46 + src/emuos.c | 1054 ++ src/emuos.h | 8 + src/emuos.lis | 569 + src/esc.c | 243 + src/esc.h | 105 + src/falcon/c2p_uni.S | 225 + src/falcon/c2p_unid.S | 187 + src/falcon/c2pmac.S | 32 + src/falcon/ikbd.S | 252 + src/falcon/jclkcook.h | 121 + src/falcon/res.h | 30 + src/falcon/sound_dma.S | 44 + src/falcon/videl.S | 318 + src/falcon/xcb.h | 110 + src/filter_ntsc.c | 250 + src/filter_ntsc.h | 64 + src/gles2/video.c | 366 + src/gtia.c | 1298 ++ src/gtia.h | 138 + src/ide.c | 910 ++ src/ide.h | 25 + src/ide_internal.h | 729 + src/img_tape.c | 566 + src/img_tape.h | 99 + src/input.c | 1047 ++ src/input.h | 93 + src/install-sh | 238 + src/javanvm/UnixRuntime.patch | 28 + src/javanvm/atari800.java | 496 + src/javanvm/input.c | 799 ++ src/javanvm/input.h | 6 + src/javanvm/javanvm.h | 276 + src/javanvm/main.c | 106 + src/javanvm/sound.c | 116 + src/javanvm/video.c | 102 + src/javanvm/video.h | 6 + src/joycfg.c | 550 + src/log.c | 86 + src/log.h | 10 + src/macosx/macosx.tar.gz | Bin 0 -> 278265 bytes src/memory.c | 1219 ++ src/memory.h | 138 + src/mkimg.c | 208 + src/monitor.c | 2463 ++++ src/monitor.h | 64 + src/mzpokeysnd.c | 2553 ++++ src/mzpokeysnd.h | 16 + src/pal_blending.c | 248 + src/pal_blending.h | 20 + src/pbi.c | 329 + src/pbi.h | 24 + src/pbi_bb.c | 328 + src/pbi_bb.h | 21 + src/pbi_mio.c | 271 + src/pbi_mio.h | 20 + src/pbi_proto80.c | 152 + src/pbi_proto80.h | 15 + src/pbi_scsi.c | 241 + src/pbi_scsi.h | 21 + src/pbi_xld.c | 741 ++ src/pbi_xld.h | 23 + src/pcjoy.h | 17 + src/pia.c | 221 + src/pia.h | 26 + src/platform.h | 175 + src/pokey.c | 693 + src/pokey.h | 122 + src/pokeysnd.c | 1377 ++ src/pokeysnd.h | 140 + src/rdevice.c | 1455 ++ src/rdevice.h | 41 + src/remez.c | 643 + src/remez.h | 34 + src/rtime.c | 192 + src/rtime.h | 29 + src/screen.c | 684 + src/screen.h | 58 + src/sdl/init.c | 52 + src/sdl/init.h | 7 + src/sdl/input.c | 1701 +++ src/sdl/input.h | 16 + src/sdl/main.c | 202 + src/sdl/palette.c | 75 + src/sdl/palette.h | 32 + src/sdl/sound.c | 99 + src/sdl/video.c | 813 ++ src/sdl/video.h | 83 + src/sdl/video_gl.c | 927 ++ src/sdl/video_gl.h | 65 + src/sdl/video_sw.c | 813 ++ src/sdl/video_sw.h | 32 + src/sio.c | 1739 +++ src/sio.h | 63 + src/sndsave.c | 191 + src/sndsave.h | 12 + src/sound.c | 547 + src/sound.h | 95 + src/sound_falcon.c | 234 + src/sound_oss.c | 193 + src/statesav.c | 667 + src/statesav.h | 19 + src/sysrom.c | 650 + src/sysrom.h | 137 + src/ui.c | 4272 ++++++ src/ui.h | 225 + src/ui_basic.c | 1595 +++ src/ui_basic.h | 27 + src/util.c | 516 + src/util.h | 205 + src/videomode.c | 1241 ++ src/videomode.h | 236 + src/voicebox.c | 109 + src/voicebox.h | 11 + src/votrax.c | 472 + src/votrax.h | 23 + src/votraxsnd.c | 276 + src/votraxsnd.h | 15 + src/vtxsmpls.inc | 6917 ++++++++++ src/win32/.cvsignore | 1 + src/win32/atari.rc | 25 + src/win32/atari1.ico | Bin 0 -> 766 bytes src/win32/atari_win32.c | 1466 +++ src/win32/atari_win32.h | 123 + src/win32/joystick.c | 244 + src/win32/joystick.h | 47 + src/win32/keyboard.c | 181 + src/win32/keyboard.h | 21 + src/win32/main.cpp | 536 + src/win32/main.h | 30 + src/win32/main_menu.h | 34 + src/win32/msc/Makefile | 93 + src/win32/msc/config.h | 551 + src/win32/render_direct3d.cpp | 404 + src/win32/render_direct3d.h | 25 + src/win32/render_directdraw.c | 272 + src/win32/render_directdraw.h | 11 + src/win32/render_gdi.c | 83 + src/win32/render_gdi.h | 9 + src/win32/render_gdiplus.cpp | 113 + src/win32/render_gdiplus.h | 20 + src/win32/screen_win32.c | 1230 ++ src/win32/screen_win32.h | 143 + src/win32/sound.c | 553 + src/wince/PocketAtari.vcp | 5918 +++++++++ src/wince/port/atari_wince.c | 287 + src/wince/port/config.h | 433 + src/wince/port/icon1.ico | Bin 0 -> 1078 bytes src/wince/port/keyboard.cpp | 936 ++ src/wince/port/keyboard.h | 38 + src/wince/port/main.c | 258 + src/wince/port/main.h | 17 + src/wince/port/missing.c | 97 + src/wince/port/missing.h | 32 + src/wince/port/resource.rc | 26 + src/wince/port/screen_wince.cpp | 2409 ++++ src/wince/port/screen_wince.h | 29 + src/wince/port/sound.c | 267 + src/xep80.c | 1957 +++ src/xep80.h | 56 + src/xep80_fonts.c | 1887 +++ src/xep80_fonts.h | 26 + util/act2html.pl | 43 + util/atari/t7.asm | 65 + util/atari/t7.bas | Bin 0 -> 3421 bytes util/atari/t7.doc | 28 + util/bdata.c | 46 + util/benchmark.pl | 360 + util/colormix.asx | 114 + util/colormix.xex | Bin 0 -> 299 bytes util/colors.asx | 47 + util/colors.xex | Bin 0 -> 103 bytes util/export | 59 + util/hdevtest.lst | 185 + util/keyboard.png | Bin 0 -> 4203 bytes util/pokeybench.c | 376 + util/readme.txt | 21 + 373 files changed, 158213 insertions(+) create mode 100644 COPYING create mode 100644 DOC/BUGS create mode 100644 DOC/BUILD.PS2 create mode 100644 DOC/BUILD.RPI create mode 100644 DOC/CHANGES.OLD create mode 100644 DOC/CHANGES.dc create mode 100644 DOC/CREDITS create mode 100644 DOC/ChangeLog create mode 100644 DOC/FAQ create mode 100644 DOC/HOWTO-DIRTYRECT create mode 100644 DOC/HOWTO-DIRTYSPAN create mode 100644 DOC/INSTALL create mode 100644 DOC/INSTALL.dos create mode 100644 DOC/INSTALL.falcon create mode 100644 DOC/INSTALL.ps2 create mode 100644 DOC/INSTALL.wince create mode 100644 DOC/LPTjoy.txt create mode 100644 DOC/NEWS create mode 100644 DOC/PORTING create mode 100644 DOC/PortMaintainers create mode 100644 DOC/README create mode 100644 DOC/README.RPI create mode 100644 DOC/README.android create mode 100644 DOC/README.dc create mode 100644 DOC/README.ps2 create mode 100644 DOC/TODO create mode 100644 DOC/USAGE create mode 100644 DOC/cart.txt create mode 100644 DOC/directx.txt create mode 100644 DOC/emuos.txt create mode 100644 DOC/pokeysnd.txt create mode 100644 DOC/r_device.txt create mode 100644 DOC/rdevice_faq.txt create mode 100644 DOC/readme.html.in create mode 100644 DOC/trainer.txt create mode 100644 README.1ST create mode 100644 act/Real.act create mode 100644 act/XFormer.act create mode 100644 act/default.act create mode 100644 act/gray.act create mode 100644 act/jakub.act create mode 100644 atari800.spec create mode 100644 data/atari2.png create mode 100644 data/atari2.svg create mode 100644 data/atari800.ico create mode 100644 data/atari_xe.ico create mode 100644 debian/README.Debian create mode 100644 debian/atari800.cfg create mode 100644 debian/changelog create mode 100644 debian/control create mode 100644 debian/copyright create mode 100644 debian/menu create mode 100644 debian/postinst create mode 100644 debian/postrm create mode 100644 debian/prerm create mode 100644 debian/rules create mode 100644 src/.cvsignore create mode 100644 src/Makefile.in create mode 100644 src/aclocal.m4 create mode 100644 src/af80.c create mode 100644 src/af80.h create mode 100644 src/afile.c create mode 100644 src/afile.h create mode 100644 src/akey.h create mode 100644 src/amiga/.cvsignore create mode 100644 src/amiga/Atari800.guide create mode 100644 src/amiga/Atari800_rev.h create mode 100644 src/amiga/Atari800_rev.i create mode 100644 src/amiga/Atari800_rev.rev create mode 100644 src/amiga/Atari800_rev.s create mode 100644 src/amiga/ReadMe create mode 100644 src/amiga/amiga.c create mode 100644 src/amiga/amiga.h create mode 100644 src/amiga/amiga_asm.asm create mode 100644 src/amiga/amiga_asm.h create mode 100644 src/amiga/async.c create mode 100644 src/amiga/async.h create mode 100644 src/amiga/config.h create mode 100644 src/amiga/gui.c create mode 100644 src/amiga/gui.h create mode 100644 src/amiga/makefile create mode 100644 src/amiga/support.c create mode 100644 src/amiga/support.h create mode 100644 src/amiga/unixfunc.c create mode 100644 src/android/AndroidManifest.xml create mode 100644 src/android/build.xml create mode 100644 src/android/jni/Android.mk.in create mode 100644 src/android/jni/Application.mk create mode 100644 src/android/jni/androidinput.c create mode 100644 src/android/jni/androidinput.h create mode 100644 src/android/jni/graphics.c create mode 100644 src/android/jni/graphics.h create mode 100644 src/android/jni/jni.c create mode 100644 src/android/jni/keys.inc create mode 100644 src/android/jni/platform.c create mode 100644 src/android/jni/sound.c create mode 100644 src/android/project.properties create mode 100644 src/android/res/drawable-hdpi/icon.png create mode 100644 src/android/res/drawable-ldpi/icon.png create mode 100644 src/android/res/drawable-mdpi/icon.png create mode 100644 src/android/res/drawable/actionbar_bg.xml create mode 100644 src/android/res/drawable/folder.png create mode 100644 src/android/res/drawable/ic_menu_archive.png create mode 100644 src/android/res/drawable/ic_menu_close_clear_cancel.png create mode 100644 src/android/res/drawable/ic_menu_preferences.png create mode 100644 src/android/res/drawable/ic_menu_rotate.png create mode 100644 src/android/res/drawable/ic_menu_search.png create mode 100644 src/android/res/drawable/keyboard.png create mode 100644 src/android/res/layout/extended_keymap.xml create mode 100644 src/android/res/layout/file_selector_footer.xml create mode 100644 src/android/res/layout/file_selector_row.xml create mode 100644 src/android/res/layout/slider_dialog.xml create mode 100644 src/android/res/menu/fsel_menu.xml create mode 100644 src/android/res/menu/menu.xml create mode 100644 src/android/res/values-v11/themes.xml create mode 100644 src/android/res/values/arrays.xml create mode 100644 src/android/res/values/attrs.xml create mode 100644 src/android/res/values/strings.xml create mode 100644 src/android/res/values/themes.xml create mode 100644 src/android/res/xml/preferences.xml create mode 100644 src/android/src/A800Renderer.java create mode 100644 src/android/src/A800view.java create mode 100644 src/android/src/AudioThread.java create mode 100644 src/android/src/FileSelector.java create mode 100644 src/android/src/KeymapPreference.java create mode 100644 src/android/src/MainActivity.java create mode 100644 src/android/src/Preferences.java create mode 100644 src/android/src/SliderPreference.java create mode 100644 src/antic.c create mode 100644 src/antic.h create mode 100644 src/artifact.c create mode 100644 src/artifact.h create mode 100644 src/atari.c create mode 100644 src/atari.h create mode 100644 src/atari800.man create mode 100644 src/atari_basic.c create mode 100644 src/atari_curses.c create mode 100644 src/atari_falcon.c create mode 100644 src/atari_ntsc/atari_ntsc.c create mode 100644 src/atari_ntsc/atari_ntsc.h create mode 100644 src/atari_ntsc/atari_ntsc_config.h create mode 100644 src/atari_ntsc/atari_ntsc_impl.h create mode 100644 src/atari_ps2.c create mode 100644 src/atari_rpi.c create mode 100644 src/atari_x11.c create mode 100644 src/binload.c create mode 100644 src/binload.h create mode 100644 src/cartridge.c create mode 100644 src/cartridge.h create mode 100644 src/cassette.c create mode 100644 src/cassette.h create mode 100644 src/cfg.c create mode 100644 src/cfg.h create mode 100644 src/colours.c create mode 100644 src/colours.h create mode 100644 src/colours_external.c create mode 100644 src/colours_external.h create mode 100644 src/colours_ntsc.c create mode 100644 src/colours_ntsc.h create mode 100644 src/colours_pal.c create mode 100644 src/colours_pal.h create mode 100644 src/compfile.c create mode 100644 src/compfile.h create mode 100644 src/config.guess create mode 100644 src/config.h.in create mode 100644 src/config.sub create mode 100644 src/configure create mode 100644 src/configure.ac create mode 100644 src/configure_dos.bat create mode 100644 src/cpu.c create mode 100644 src/cpu.h create mode 100644 src/cpu_m68k.S create mode 100644 src/cpu_m68k.asm create mode 100644 src/crc32.c create mode 100644 src/crc32.h create mode 100644 src/cycle_map.c create mode 100644 src/cycle_map.h create mode 100644 src/dc/Makefile.dc create mode 100644 src/dc/atari800.cfg create mode 100644 src/dc/atari_dc.c create mode 100644 src/dc/config.h create mode 100644 src/dc/dc_chdir.c create mode 100644 src/dc/displayscreen.S create mode 100644 src/dc/icon.h create mode 100644 src/dc/version.h create mode 100644 src/dc/vmu.c create mode 100644 src/dc/vmu.h create mode 100644 src/devices.c create mode 100644 src/devices.h create mode 100644 src/dos/atari_vga.c create mode 100644 src/dos/dos_ints.h create mode 100644 src/dos/dos_sb.c create mode 100644 src/dos/dos_sb.h create mode 100644 src/dos/sound_dos.c create mode 100644 src/dos/vga_asm.s create mode 100644 src/dos/vga_gfx.c create mode 100644 src/dos/vga_gfx.h create mode 100644 src/emuos.c create mode 100644 src/emuos.h create mode 100644 src/emuos.lis create mode 100644 src/esc.c create mode 100644 src/esc.h create mode 100644 src/falcon/c2p_uni.S create mode 100644 src/falcon/c2p_unid.S create mode 100644 src/falcon/c2pmac.S create mode 100644 src/falcon/ikbd.S create mode 100644 src/falcon/jclkcook.h create mode 100644 src/falcon/res.h create mode 100644 src/falcon/sound_dma.S create mode 100644 src/falcon/videl.S create mode 100644 src/falcon/xcb.h create mode 100644 src/filter_ntsc.c create mode 100644 src/filter_ntsc.h create mode 100644 src/gles2/video.c create mode 100644 src/gtia.c create mode 100644 src/gtia.h create mode 100644 src/ide.c create mode 100644 src/ide.h create mode 100644 src/ide_internal.h create mode 100644 src/img_tape.c create mode 100644 src/img_tape.h create mode 100644 src/input.c create mode 100644 src/input.h create mode 100644 src/install-sh create mode 100644 src/javanvm/UnixRuntime.patch create mode 100644 src/javanvm/atari800.java create mode 100644 src/javanvm/input.c create mode 100644 src/javanvm/input.h create mode 100644 src/javanvm/javanvm.h create mode 100644 src/javanvm/main.c create mode 100644 src/javanvm/sound.c create mode 100644 src/javanvm/video.c create mode 100644 src/javanvm/video.h create mode 100644 src/joycfg.c create mode 100644 src/log.c create mode 100644 src/log.h create mode 100644 src/macosx/macosx.tar.gz create mode 100644 src/memory.c create mode 100644 src/memory.h create mode 100644 src/mkimg.c create mode 100644 src/monitor.c create mode 100644 src/monitor.h create mode 100644 src/mzpokeysnd.c create mode 100644 src/mzpokeysnd.h create mode 100644 src/pal_blending.c create mode 100644 src/pal_blending.h create mode 100644 src/pbi.c create mode 100644 src/pbi.h create mode 100644 src/pbi_bb.c create mode 100644 src/pbi_bb.h create mode 100644 src/pbi_mio.c create mode 100644 src/pbi_mio.h create mode 100644 src/pbi_proto80.c create mode 100644 src/pbi_proto80.h create mode 100644 src/pbi_scsi.c create mode 100644 src/pbi_scsi.h create mode 100644 src/pbi_xld.c create mode 100644 src/pbi_xld.h create mode 100644 src/pcjoy.h create mode 100644 src/pia.c create mode 100644 src/pia.h create mode 100644 src/platform.h create mode 100644 src/pokey.c create mode 100644 src/pokey.h create mode 100644 src/pokeysnd.c create mode 100644 src/pokeysnd.h create mode 100644 src/rdevice.c create mode 100644 src/rdevice.h create mode 100644 src/remez.c create mode 100644 src/remez.h create mode 100644 src/rtime.c create mode 100644 src/rtime.h create mode 100644 src/screen.c create mode 100644 src/screen.h create mode 100644 src/sdl/init.c create mode 100644 src/sdl/init.h create mode 100644 src/sdl/input.c create mode 100644 src/sdl/input.h create mode 100644 src/sdl/main.c create mode 100644 src/sdl/palette.c create mode 100644 src/sdl/palette.h create mode 100644 src/sdl/sound.c create mode 100644 src/sdl/video.c create mode 100644 src/sdl/video.h create mode 100644 src/sdl/video_gl.c create mode 100644 src/sdl/video_gl.h create mode 100644 src/sdl/video_sw.c create mode 100644 src/sdl/video_sw.h create mode 100644 src/sio.c create mode 100644 src/sio.h create mode 100644 src/sndsave.c create mode 100644 src/sndsave.h create mode 100644 src/sound.c create mode 100644 src/sound.h create mode 100644 src/sound_falcon.c create mode 100644 src/sound_oss.c create mode 100644 src/statesav.c create mode 100644 src/statesav.h create mode 100644 src/sysrom.c create mode 100644 src/sysrom.h create mode 100644 src/ui.c create mode 100644 src/ui.h create mode 100644 src/ui_basic.c create mode 100644 src/ui_basic.h create mode 100644 src/util.c create mode 100644 src/util.h create mode 100644 src/videomode.c create mode 100644 src/videomode.h create mode 100644 src/voicebox.c create mode 100644 src/voicebox.h create mode 100644 src/votrax.c create mode 100644 src/votrax.h create mode 100644 src/votraxsnd.c create mode 100644 src/votraxsnd.h create mode 100644 src/vtxsmpls.inc create mode 100644 src/win32/.cvsignore create mode 100644 src/win32/atari.rc create mode 100644 src/win32/atari1.ico create mode 100644 src/win32/atari_win32.c create mode 100644 src/win32/atari_win32.h create mode 100644 src/win32/joystick.c create mode 100644 src/win32/joystick.h create mode 100644 src/win32/keyboard.c create mode 100644 src/win32/keyboard.h create mode 100644 src/win32/main.cpp create mode 100644 src/win32/main.h create mode 100644 src/win32/main_menu.h create mode 100644 src/win32/msc/Makefile create mode 100644 src/win32/msc/config.h create mode 100644 src/win32/render_direct3d.cpp create mode 100644 src/win32/render_direct3d.h create mode 100644 src/win32/render_directdraw.c create mode 100644 src/win32/render_directdraw.h create mode 100644 src/win32/render_gdi.c create mode 100644 src/win32/render_gdi.h create mode 100644 src/win32/render_gdiplus.cpp create mode 100644 src/win32/render_gdiplus.h create mode 100644 src/win32/screen_win32.c create mode 100644 src/win32/screen_win32.h create mode 100644 src/win32/sound.c create mode 100644 src/wince/PocketAtari.vcp create mode 100644 src/wince/port/atari_wince.c create mode 100644 src/wince/port/config.h create mode 100644 src/wince/port/icon1.ico create mode 100644 src/wince/port/keyboard.cpp create mode 100644 src/wince/port/keyboard.h create mode 100644 src/wince/port/main.c create mode 100644 src/wince/port/main.h create mode 100644 src/wince/port/missing.c create mode 100644 src/wince/port/missing.h create mode 100644 src/wince/port/resource.rc create mode 100644 src/wince/port/screen_wince.cpp create mode 100644 src/wince/port/screen_wince.h create mode 100644 src/wince/port/sound.c create mode 100644 src/xep80.c create mode 100644 src/xep80.h create mode 100644 src/xep80_fonts.c create mode 100644 src/xep80_fonts.h create mode 100644 util/act2html.pl create mode 100644 util/atari/t7.asm create mode 100644 util/atari/t7.bas create mode 100644 util/atari/t7.doc create mode 100644 util/bdata.c create mode 100644 util/benchmark.pl create mode 100644 util/colormix.asx create mode 100644 util/colormix.xex create mode 100644 util/colors.asx create mode 100644 util/colors.xex create mode 100644 util/export create mode 100644 util/hdevtest.lst create mode 100644 util/keyboard.png create mode 100644 util/pokeybench.c create mode 100644 util/readme.txt diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..3912109 --- /dev/null +++ b/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/DOC/BUGS b/DOC/BUGS new file mode 100644 index 0000000..e343ba8 --- /dev/null +++ b/DOC/BUGS @@ -0,0 +1,114 @@ +Bugs and Known Problems +----------------------- + +* Cosmic Balance (game) hangs before the intro screen. This is probably + due to inaccurate emulation of POKEY interrupts (see below). The program + uses a hardware SIO loader as part of a presumed protection scheme. + There is a bug in the code which activates the POKEY timers at an + absurdly high frequency. This causes repeated interrupts which hangs the + program. + Probably there is some interaction with SIO which prevents this on + a real Atari. + A workaround is to invoke the monitor and type "c 10 40" and "cont". + +* new Pokey engine doesn't switch to mono output in STEREO_SOUND config + +* new Pokey engine doesn't support VOL_ONLY_SOUND on the second Pokey + +* a few keyboard-related bugs: e.g. pressing SHIFT+1 and then + releasing SHIFT should still give '!' characters + +* The cycle-exact ANTIC/GTIA/CPU timing is not 100%. + This causes display bugs in following programs: + - Surf's up (game) (the horizon) + - Satan's Hollow (game) (horizon) (confirmed sta WSYNC at WSYNC_C bug) + - Dimension X (game) (alignment problem) + - Te.mod (demo) (small glitched pixel in the final credits on the bottom left) + - Our 5oft Unity Part (demo) (cycle-alignment, probably WSYNC) + - Isolation (demo) (vector animations) + - 80 Random Moving Rectangles (demo) (top left of rectangles, screen data + is modified while drawing a scanline) + - Sirius games: Scores and Text in Worm War I, Final Orbit, Spider City, + Turmoil, Fantastic Voyage. These games store screen data in page 0 + and modify it each scan line. They reuse the same data for each + scan line with an LMS on every line. This makes the code look + like 2600 code. Emulating this requires trapping writes to + page 0 and doing partial ANTIC loads. + - Spider City has another bug in the map which is caused by player graphics + and HPOS being changed before the player is finished being drawn. This + is only possible for wide players. + - Extract (demo) (face) + +* Non-bugs: + - Ergo Bibamus (demo) (one pixel of the flower above the perspective scroll) + - Mail Order Monsters (game) + (some colour changes do not align with text, occurs on a real Atari) + - The Break (demo) (bugs on the left side of photo) + - Star Raiders (disk image) (game) (doesn't work on XL/XE, select OS/B) + - Many other disk images of cartridges that work on XL/XE require OS B + because a once-popular cart dumping program for the Atari 800 generates + an OS B-specific loader. IIRC it loads the image and jumps into the OS B + RESET vector location, which is changed on the XL. + - Strip Poker (game) (Atari Basic must be enabled) + - Joust (Atari 5200 game) (the game sets all colors to black on PAL systems, + you need to switch the emulator to NTSC mode) + +* The following programs are improved by using the new cycle-exact code: + - 8 Players Demo (demo) + - Bewesoft's Demo (demo) + - Bitter Reality (demo) + - Demonic Laughter (music collection) + - Extract (graphics collection) + - GED (graphics editor) + - Joyride (demo) + - Mail Order Monsters (game) + - Master of the Lamps (game) + - Orneta '95 invitro (demo) + - Our 5oft Unity Part (demo) + - Studio Dream (demo) + - Sweet Illusion (demo) + - Te.mod (demo) + - The Break (demo) + - Miner 2049'er (game) (rotating 5's) + - Dimension X (game) (title screen upper and lower bars) + - Graphics impossible (demo) (Antic magazine) + - Power Graph (graphics editor) + - Darkness Warrior (picture) + +* POKEY interrupts are scanline-, not cycle-exact. + This causes display or sound bugs in following programs: + - Joyride (demo) (white lines on title picture) + - Mirax Force (game) (speech) + - Saturday Demo (demo) (music) + - The Last Guardian (game) (speech) + - Digital Trash (demo) (music) + +* VOL_ONLY_SOUND causes sound bugs in following programs: + - Ghostbusters (game) + - Overmind (demo) + +* intensive 130xe-banks switching slows down emulation much. + This causes performance problems in following programs: + - Impossible but Real (demo) + - Sheol (demo) + - Total Daze (demo) + - Ultra (demo) + +* The following VAPI images are known to not work: + (This list may not be complete, as full VAPI documentation + has never been released by the author) + - Alternate Reality: The City + - Ankh + - Attack at EP CYG 4 + - Ballblazer Activision (UK) + - Jenny of the Prairie + - Mercenary - Escape from Targ _ Novagen Software + - Mr. Do! + - Music Studio (The) + - Promoteur + - Rescue on Fractalus! _ Activision (UK) + - Spy vs Spy + - Targets - A Number Game + +* SDL port uses call back system for filling sound buffer. + This causes wrong sound effects (noise) in some games. diff --git a/DOC/BUILD.PS2 b/DOC/BUILD.PS2 new file mode 100644 index 0000000..ed04d54 --- /dev/null +++ b/DOC/BUILD.PS2 @@ -0,0 +1,22 @@ +To compile use ps2dev from ps2dev.org +Additional libraries neeeded: +gsKit +Additional Modules +usbd.irx, kbd.irx, audsrv.irx +Convert irx modules to *.s via bin2s, +Copy *.s files to src directory. + +./configure \ +--target=ps2 \ +--build=i686-pc-linux-gnu \ +--host=mipsel \ +--disable-stereosound \ +--disable-monitorbreak +make + +To install read DOC/INSTALL.ps2 + +Thanks Piotr of atari800! +Thanks ps2dev! Esp NeoVanglist, author of gsKit. + +-Troy Ayers \ No newline at end of file diff --git a/DOC/BUILD.RPI b/DOC/BUILD.RPI new file mode 100644 index 0000000..3da8890 --- /dev/null +++ b/DOC/BUILD.RPI @@ -0,0 +1,11 @@ +Raspberry Pi (rpi) target is cross-compiling, so you need to get toolchain here: +https://github.com/raspberrypi/tools/tree/master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian + +Also you need to copy SDL headers and libs from Raspberry Pi device to this toolchain. + +Then you need to export RPI_SDK pointed to the rpi toolchain root folder. + +Then go to 'src' folder and type './configure --target=rpi --host=arm-linux --with-sdl-prefix=$RPI_SDK'. + +Then type 'make'. + diff --git a/DOC/CHANGES.OLD b/DOC/CHANGES.OLD new file mode 100644 index 0000000..ac112c9 --- /dev/null +++ b/DOC/CHANGES.OLD @@ -0,0 +1,2293 @@ +/***********************************************************************\ +|* This file is obsolete now. Update ChangeLog and NEWS files instead. *| +\***********************************************************************/ + +---- + +o the configure process can be silent now - use --enable-FEATURE or --disable-FEATURE + (e.g. --disable-SOUND). Sent by Dale Scheetz (the original author is Alan Shutko). + +o completely refactored UI by Vasyl. Now allows different (port specific) GUIs. + +o Basic XE (OSS Supercart) should work now + +o nonblocking open of sound device on linux + +o ANTIC.C is no longer LONG_ALIGNMENT dependent. Macros READ_U32/WRITE_U32 + take care of the memory access. + +o a fix in antic.c (lines 408-411) for artefacting on systems requiring + aligned memory access. + + +Changes in 1.0.7 +---------------- +o atari_x11.c: Added clipping and made the -large and -huge work with XShm. + The XShm code was rewritten, so that only the screen-portion which + has been changed is copied to the X-server (on older PCs with + PCI-graphic this brings a noticable performance gain). + New options are: + -clip_x + -clip_width + -clip_y + -clip_height + atari.h: commented out USE_COLOUR_TRANSLATION_TABLE because it produced + funny results with options -large and -huge. + Rudolf Opalla + +o introduced autoconf stuff +o win32: standard wave output routines added to sound driver (-wavonly switch + to disable direct sound) +o sound_update removed from port specific routines (moved to atari.c) and + some other sound fixes + +o unix, windows and dos makefiles rewritten and reorganized + +o all open() calls on regular files replaced by fopen(). + +o win32 conditionals removed; new win32 port + +o atari_sleep_ms() replaced by new function atari_sync() with better + synchronization code (lasttime is increased by constant interval + and previously could differ depending on gettime call delay) + +o bug causing vesa modes not to be detected correctly fixed. + +o cpu_m68k.s is 100% compatible with the cpu.c now + +o Don Mahurin added sound support to curses version. + Also Voxware_ routines were renamed. + +o it seems that zero in first byte of block 41/C1 should be interpreted + as 00, not 0x100 [eg. 1st disk of Big Demo couldn't be read because of + this]. Jakub Bogusz + +o double density DCM disks weren't handled properly ("Output + desynchronized...") [eg. 1st disk of Sweet Illusions demo couldn't be + read because of this] + +o some preliminary code for UI menu switch for readonly/readwrite disk + in UI.C. This needs to be discussed first, then finished. + + + +Changes in 1.0.6 - 2000/10/09 +---------------- + +o cpu_m68k.s updated + +- the rest is Piotr's work: + +o BUGS updated + +o antic: fixed PMG collisions bug in horizontally scrolled lines + (bug was found by Krzysztof) + +o antic: PMG flickering depends on VDELAY setting + +o makefile.dos: in 1.0.4 BASIC and PDCURSES weren't compilable, + because of pokeysnd call, while pokeysnd wasn't linked - fixed + +o antic,gtia: few warnings killed + +o devices: -H1..-H4 options work correctly now + +o E_Device, K_Device and AtariEscape moved from atari.c to devices.c + +o E_Device and K_Device ESC codes work only in BASIC version now + +o sio: debug code removed + +o devices, rt-config: H: devices can be set to read-only mode: + use -hdreadonly option or HD_READ_ONLY config file item + (0 disables, 1 enables read-only mode). For safety, by default + it is on + +o BASIC version: EOF in stdin quits emulator. BASIC version can be used now + with redirected input (from a script file, for example). + + +Changes in 1.0.5 - 2000/10/02 +---------------- + +o possibility to set color saturation + Now you can set black level, white level, color intensity and even color + shift if you prefer artificial palettes. + Added config option allows to select whether include existing palettes + into binary. By default artificial palette is generated (by surprise it + doesn't look very bad) + New options are: + -black + -white + -colors + -colshift + -realpal + -oldpal + -foxpal + + Krzysztof + +o sound.c got -help + +o bug causing vesa modes not to be detected correctly fixed. + +o sound_dos.c compiler warnings fixed + +o ui.c - reading of root dirs corrected + +o pokey.c - better reading of saved pokey state + +o statesav.c - strict version check and version increased to 3 + +o binload.c - C flag and boot flag are set now (some programs need it) + + +o joystick autofire emulation (dos and svgalib only). F11 key switches + between three modes: normal, autofire when fire pressed and autofire + all the time. It can be quite useful for some games >:) + +o gtia.c fix - pm_scanline was too short when HSCROL was used. + 'mountain king' game suffered from this bug. + +o atari_x11.c - small fix for keyrepeat (fvwm2, switching back to the + screen 2 FocusIn requests are generated). + +o DOS SoundBlaster driver updated. + The new SB code is very clean, and should fix the problem that one person + had with no sound being generated. + + If Atari800 enables near pointers (via __djgpp_enable_nearptr()), you may + want to define DJGPP_USE_NEARPTR; it will make the SB driver a bit faster, + as it can avoid an extra buffer copy to the low DOS area. + +o vga_asm.s patched to quell a compiler warning. + +o sio.c - new routine to rotate disks and slight parameter change in SIO_Mount + that allows a disk to be opened read only even if it is a read/write image. + + +o sndsave.[ch] (new module) - writes out .WAV files of arbitrary bitrate. + + +o linux joystick patch - both keyboard emulation and real joystick can be used + for multiplayer games now. + + +Changes in 1.0.4 - 2000/06/30 +---------------- + +o Amiga version updated + +o CRASH menu fixed + +--Piotr's changes: + +o UI: added artifacting mode selection + +o DOS/VGA sources moved to 'dos' subdirectory, Makefile.dos and atari_vga.c + updated + +o DOS/VGA: F8 disabled in UI + +o DOS/VGA: mouse initialized after return from monitor, right button enables + light pen cursor + +o gtia: TRIG latches (enabled by bit 2 of GRACTL) implemented + +o antic: light pen emulation improved + +o antic: GTIA modes implemented for ANTIC modes 9, 0xb and 0xc + +o atari_screen moved from antic.[ch] to atari.[ch] + +o old BIN loader removed + +o obsolete NAS support removed; Atari_AUDC/AUDF/AUDCTL routines removed - now + pokey.c directly calls pokeysnd.c + + +Changes in 1.0.3 - 2000/06/13 +---------------- + +o SVGALIB and Falcon ports save interlaced and non-interlaced screenshots + by pressing Shift+F10/F10 (this is just to sync it with DOS version) + +-- Piotr: +o new BIN loader rewritten - hopefully it can load any valid executable. + Please test if there's a file, which it can't run. + +o special support for Montezuma's Revenge removed - it's not needed + for playing this game + +o UI: +- fixed 'Cold Start' item - name was too long +- fixed background width - was too wide +- charset extracted from 5200's ROM - menu is visible in 5200 mode +- whenever prompted for filename, you can cancel with ESC +- added 'Enter monitor' item +- added PCX screenshots with user-specified filename + (F10 and Shift+F10 still generate it automatically) + +-- Raster: +o hot keys in UI aligned right + +o when CPU encounters invalid instruction (CIM or unassigned + ESC) the new Crash menu appears. Now you can select Reset, + Reboot, go to Menu or Monitor. You can also try to continue + running the program or exit the emulator. + +o CPU.C: CIM instruction emulation doesn't do PC-- so that the + 'continue' function of Crash menu can work + + +Changes in 1.0.2 - 2000/05/29 +---------------- + +o Matt fixed his DOS SB driver + +-- Piotr's changes: +o gray.act palette + +o DOS/VGA: assembly part of x_open moved to vga_asm.s as x_open_asm + - this should make new djgpp happy :) + +o cpu: opcodes $8b and $ab restored - they work different on Atari + than on C64 + +o monitor: READ and WRITE don't quit emulator on error + +o monitor: S can search for any number of bytes + +o monitor: HELP corrected - [] used for optional parameters only + + +Changes in 1.0.1 - 2000/05/25 +---------------- + +o ANTIC>IA: another PMG speed optimization + +o cpu_m68k.s: updated to reflect recent Piotr's changes + +o CPU: 6 undocumented instructions fixed + + +Changes in 1.0.0 - 2000/05/22 +---------------- + +o Atari Falcon +- makes use of draw_display which greatly improves playability + (on my Falcon040/40MHz most games run at 100% of original speed with + -refresh=5) +- Sound_Pause/Continue implemented (no more sound in menu). +- UI hotkeys implemented (try out Alt+A, for example) + +o UI: hotkeys are listed so everybody can learn them easily + +o new sound card driver for DOS version from Matt Conte + This allows us to increase replay freq and also implement STEREO sound in DOS + Try out command line parameters "-dsprate 44100" and maybe also "-bufsize 880" + (bufsize is 440 bytes by default which I think is too small for higher replay + rates) + +o fixed some wrong fopen calls - please always use "rt"/"wt" for reading/writting + text files and similarly "rb"/"wb" for reading/writting binary files. + +-- And Piotr's changes follow: + +o configure program checks endianess and defines ATARI800_BIG_ENDIAN + if necessary - POKEYSND_BIG_ENDIAN and ANTIC_BIG_ENDIAN removed + +o configure program defines ATARI800_64_BIT if sizeof(long) != 4 - __alpha__ + kludge removed + +o added -fomit-frame-pointer to makefile.dos - with this ebp register can hold + local variables + +o assembler routines from DOS/VGA port grouped in vga_asm.s - this fixes + problems with -fomit-frame-pointer and hopefully with new DJGPP - please + check + +o diskled fixed +- drawn on screen also when sio patch active +- support for modes with less than 240 visible lines +- Atari_Set_LED called only when state changes - this speeds up sio + and prevents keyboard hang-ups in DOS/VGA with keyboard led + +o DOS/VGA: now middle of Atari screen visible in 320x200 + - previously lines 24..223 + +ANTIC/GTIA fixes: + +o PMG flickering corrected again - DL opcode is passed to missiles, lsb of + address is passed to player 3 + +o need_load fixed - correct graphics and timing when DMA switched on and off + +o colour_translation_table fixed +- now colours in X11/SHM are hopefully correct in all modes except + artifacting +- colour_translation_table isn't used unless USE_COLOUR_TRANSLATION_TABLE is + defined (see atari.h) +- if used, colour_translation_table should be UWORD with msb = lsb + +o playfield/PMG priorities handling completely rewritten +- now all playfield/PMG/prior combinations are handled correctly +- PMG is slightly faster + + + +Changes in 0.9.9j +----------------- + +o Amiga port is compilable (Pen, Sound Start/Stop) + +o Unix port is compilable (Pen, Sound Start/Stop) + +o Atari Falcon port is not compilable yet! I left the patches at home :-( + + +o Makefile.unix: call sub-makes with "$(MAKE)" instead of "make". Helps on + machines where GNU make is not named "make" + +o atari.h: set ULONG and SLONG to be unsigned int on Alpha machines, + as longs there are 8 bytes (64bit). See also TODO file. + +o pokeysnd.c: fixed unaligned accesses. Tested on Alpha (= little endian) + +o UI: the order of options changed. + +o UI: driven by hotkeys diirectly from emulation + Currently DOS and Linux SVGALIB versions only: + * Hot keys (with left ALT): + ALT+D Disk management + ALT+C Cartridge management + ALT+R Run BIN file + ALT+Y Select system + ALT+O Sound Mono/Stereo + ALT+S Save state + ALT+L Load state + ALT+A About + (by pressing ESC you go back to emulation) + + Other platforms: set alt_function (defined in ui.c) to MENU_xxx (see + atari.h) and call the UI. + Example for Disk Management: + alt_function = MENU_DISK; + keycode = AKEY_UI; + +And the usual huge list of changes from Piotr follows +----------------------------------------------------- +o DD XFD images fixed - now both 128- and 256-byte boot sectors supported + +o cpu.c can be now compiled for using switch() - cpu_nogoto.c is no longer + necessary (Petr: use -DNO_GOTO when compiling) + +o many 6502's unofficial opcodes fixed + +o 'DMACLT' typo in symtable fixed + +ANTIC/GTIA fixes: + +o collisions in hi-res fixed - now Chicken and Super Bunny work + +o horizontal scroll in modes 8 and 9 fixed + +o PM5 in GTIA 11 fixed + +o mode 2 / GTIA 11 fixed + +o mode 2 / GTIA 10 implemented + +o PMG flickering made more accurate + +o some optimizations in ANTIC - mostly for hi-res modes (drawn with words) + and for blank lines (drawn with memset, if possible) + +o simplified Save/Load State in ANTIC and GTIA (Petr: ==> state files are no + longer compatible with previous versions (actually the compatibility's been + broken a few versions ago already)) + +o artifacting works now on long aligning and big endian machines + (Petr: seems like big endian machines have to define -DANTIC_BIG_ENDIAN for + proper compiling). + +o DMA for DL fixed + +o color table fix: +- now table is defined as global and compiled to separate object, so it exists + once in executable (previously was static - included by both + platform-specific stuff and ataripcx) +- '-palette filename' command line option allows loading external palette file. + Palette should be in '.act' file format, which is supported by Photoshop. + Format is very simple - 256 times (R,G,B), single byte per component. + I've implemented this option because I think color table should be fixed. + At the moment luminaces 14 and 15 are identical and other luminaces + aren't also linear. I include a palette created by me - fox.act. It has + linear luminaces, however it is ugly compared to current Atari800 palette + - default.act. It would be great if someone could create realistic palette, + best by grabbing graphics from real machine with a video card. + +o fixes for BASIC version + +o mode f / GTIA 11 colours fixed + +o delayed GTIA 11 - colours are propagated to next line. Now + graphics using dark GTIA 11 lines for colouring gray images is really + colourful, like on real Atari + +o emulation of a GTIA bug. While turning off GTIA mode while displaying + hi-res mode, GTIA doesn't back to hi-res, but starts generating 4-colour + graphics. This fixes title screen in 'Studio Dream' demo. + + +Changes in 0.9.9i +----------------- + +o fixed my stupid bug in Stereo sound emulation (thanks Marek) + +o SHIFT_KEY exported from atari_x11.c now (thanks Mark Watson for the hint) + +o UI: Select System does cancel the selection by Esc correctly now + (thanks Raster for the hint) + +o SIO: result wasn't set in default: (thanks Sebastian) + +o Amiga changes by + ------------- + atari_amiga.c + old Joystick code was buggy, it does work now. + supports the global draw_display variable now. + about Requester works now. + general cleanup and some comments in atari_amiga.c + + amiga/support.c + Added + + amiga/ReadMe + Added + + amiga/Atari800.guide + has been rewritten (not really finished yet) + + USAGE + removed old Amiga descriptions and refered to the + Atari800.guide file + + sio.c + removed the #ifndef AMIGA. Only one is still left (devices.c, + that's because I can't test this). + +List of changes from Piotr +-------------------------- + +o ANTIC: WSYNC fixed - changed xpos < WSYNC_C to xpos <= WSYNC_C :) + This fixes colours in Pitfall II + +o ANTIC: PMG flickering fixed. Data should be taken from data bus, + not rand(). :) However, it is get now from memory at regPC. + +o monitor: COLPM0 typo in symtable[] fixed + +o IRQ interrupts fixed: +- are reset by POKEY, not CPU +- real SIO is faster and more accurate +- POKEY counters are more accurate + +o diskled: Platform-independent disk LED - drawn on screen. + Can be disabled with #define NO_LED_ON_SCREEN. + +o DOS version: +- 320x240 made default video mode +- keyboard layout PC/Atari can be set at startup with 'KEYBOARD' + in configuration file or '-keyboard' command line option +- Num Lock LED indicates current keyboard layout and Caps Lock LED - disk LED, + if it isn't drawn on screen. Scroll Lock still indicates joy-only mode. +- paddles/touch pad emulation is enabled with 'MOUSE PAD' in configuration file + or '-mouse pad' command line option + Horizontal position of mouse is paddle 0, vertical is paddle 1, + buttons left and right are buttons of paddles 0 and 1 respectively. + Tested in ARKANOID and KABOOM. Should be tested on more programs, + especially those using touch pad. +- light pen emulation is enabled with 'MOUSE PEN' in configuration file + or '-mouse pen' command line option + Mouse emulates position of light pen. Left button is pen's button. + Right button is unused. + Tested in Atari BASIC only. Should also work in games using light gun. + +Atari_PEN() has to be added to all platforms. Atari_PEN(0) returns +horizontal, Atari_PEN(1) vertical position. If light pen emulation isn't +supported, the function should look like this: + +int Atari_PEN(int vertical) +{ + return vertical ? 0xff : 0; +} + +o ANTIC: mode 3 can be now artifacted and in GTIA modes 9/11 + (ANTIC mode 2 routines used) + +o GTIA: missiles optimized a bit + +o Delay before reading sector 2. Now OVERMIND works with both emulated + and real SIO + +o DOS version: sound disabled in UI and monitor + +o QUIT works when invalid opcode encountered + +o Monitor: you can enter system commands with !cmd, for example !dir + + +Changes in 0.9.9h +----------------- + +o a big bunch of changes from Piotr, completely rewritten Antic emulation, + changed Antic<->CPU synchronization, improved sound, improved PCX screen + shots including interlaced screenshots and much more. + + The rewritten Antic will need proper testing. Please do test and report + problems. + +o new binloader improved, sound improved + +o Amiga updates and general clean up + + +Changes in 0.9.9g +----------------- + +o STEREO sound support (2 POKEYs) added + +o if STEREO sound is compiled in you can switch between mono/stereo + output in the F1 menu. + +o new binary loader improved again + +o curses mode improved (now enables the F1 menu, warm start moved to F8) + Christian Groessler + +o a new BRKHERE command for the monitor - if enabled (BRKHERE on) then + the emulator invokes the monitor when it encounters a BRK instruction. + Useful only if you use the BRK insn for debugging your own programs. + Christian Groessler + +o new Amiga updates from Sebastian Bauer + DEFAULT_CFG_PATH + To alter the default config path + (if not defined the orginal path is used) + + SUPPORTS_ATARI_CONFIGINIT + The port provides a function Atari_ConfigInit() which + inits the configuration to default values. + + SUPPORTS_ATARI_CONFIGSAVE + The port provides a function Atari_ConfigSave() to save port + specific configuration lines in the config file. + + SUPPORTS_ATARI_CONFIGURE + The port provides a function Atari_Configure() for the lines + not recognized by RtConfigLoad() + + DONT_USE_RTCONFIGUPDATE + RtConfigUpdate() is not used and compiled (e.g. the Amiga Port + provides an own GUI for configuration and so this is not needed + here) + + A list of bugfixes from Piotr Fusik < pfusik@elka.pw.edu.pl > + ----------------------------------- + +* NMIST fixed - antic.c + +* invalid color of all multicolor players in same place fixed - antic.c + +* blank characters can be inverted - antic.c + +* PMG DMA in every scanline - antic.c + +* DL can not cross 1k boundary - antic.c + +* PENV set to $FF - antic.c + +* B flag set on BRK and PHP, reset on NMI and IRQ, can not be changed, + BRK doesn't care about I flag - cpu.c, monitor.c + +* TRIG2=1 on XL/XE, PAL=1 on PAL machine - gtia.c + +* typos in symtable fixed - monitor.c + +* 'q' to quit displaying display list - monitor.c + +* flags in "SHOW" displayed in a readable way - monitor.c + +* new "STACK" command in monitor - monitor.c + +* all printable ASCII characters displayed in "M" - monitor.c + +* "ANTIC" registers display fixed - monitor.c + +* better "HELP" in monitor - monitor.c + +* write protection checked in ATR header and returned in drive status + - atari.h, sio.c + +* CRITIC flag reset and C flag set when returning from emulated SIO - sio.c + + + +Changes in 0.9.9f +----------------- + +o new binary loader fixed again (some binary files do not set starting + address) + +Changes in 0.9.9e +----------------- + +o new binary loader fixed (some binary files contain additional $FF,$FF + in the block headers) + +o X11 keyboard autorepeat turned off during emulation + +o Antic: border color in GTIA 0x80 modes should be taken from $d012 not $d01a + + +o GTIA: return 0x0f for all write-only registers + +o monitor: added filename to write (memory dump) + +o svgalib: don't abort if joystick cannot be opened. Also allow cursorpad + keys/ctrl key for joystick emulation (enable it by defining + USE_CURSORBLOCK) + + +Changes in 0.9.9d +----------------- + Almost all changes in this version came from Marek Zelem. Thanks to him + we got digital sound effects (including keyboard clicking sound and other + sound effects) in all ports of Atari800 now. This is very cool. + Also svgalib and X11 support were improved. And a new binary loader was added. + ++ New features for end users: + - digital (volume only) sound (finally!) + - emulation of console and disk drive sound + - improved keyboard, joystick and screen support under X11 + - REALTIME mode for Linux - might speed up the emulator a bit + - new routine for direct loading of single binary files + - new cmdline command '-run program' that runs a program when emulator starts + - fixed a bug in XL/XE mode after warmstart + +List of changes for programmers: + +o keyboard in X11 didn't generate KEYPRESSED - fixed. Also second joystick + emulation was fixed. AKEY_HELP added. + +o X11 color support: if more than 256 colors then use full 256 colors in the + emulator (in 8bpp only 128 colors are used) + +o support for REALTIME process under Linux added. This is disabled by default + since it might hog the whole operating system. On slower systems this might + increase the emulator speed so test it out if you run on a 486. + +o atari_sleep_ms(100) added to ui() into cycle for reading pressed keys. + Emulator thus doesn't hog the operating system while waiting for a keypress. + This is essential when Atari800 runs in REALTIME mode under Linux. + +o digital sound (samples) emulation was added. It's enabled by default but + you can disable it by defining NO_VOL_ONLY (who would disable it, anyway?) + For better syncing a new global var cpu_clock was added. It's updated in + cpu.c, cpu_nogoto.c after every instruction (cpu_m68k.s is not updated yet) + This cpu_clock measures the number of physical ticks since the emulation + started. + +o console sound emulation added (keyboard clicking sound and the beep that + is produced by writting to CONSOL register). Can be disabled by a #define + + +o disk I/O transfer sound emulation added (can be disabled by a #define). + Hardcoded for 19200 bps for now. + +o the cmdline option '-refresh ' defines how often the screen is to + be generated. Previously if num > 1 the screen generating was skipped + (num-1) times but also interrupts weren't generated, no sound was produced + and CPU ran a bit faster (full 114 cycles per screen line which is not + possible under normal circumstances). Seems like this was meant for the + BASIC or CURSES emulations. + In this version the code for num > 1 was changed so that all interrupts + are still generated, sound works OK and CPU runs at the right speed. + Just the screen is not generated (antic.c) and not drawn (only in x11.c + and svgalib.c for now - other platforms will be updated ASAP). + This is driven by global var 'draw_display'. + This new approach can be disabled anytime by defining VERY_SLOW. + +o Warm Start on 800XL/XE fixed - turns on the ROM OS now. + +o new BIN file loader added. Does not need a temporary .ATR disk image. + Should be much better than the original attempt. Define USE_NEW_BINLOAD + and test it out. + +o atari_x11.c: if screen is not visible do not update the emulated screen. + Improves speed and is useful e.g. for listening the Atari800 music. Simply + cover the emulator window with another window and the emulation runs faster. + + +o atari_svgalib.c: support for running on an inactive virtual console, if + allowed by the underlying svgalib. + +o sound recording added. Global variable 'sound_record' contains a file + descriptor. If it's valid the played sound is written to the file. + It's up to atari_*.c to turn the sound recording on/off. So far supported + by CTRL-F8 under X11 only. + +o atari_x11.c and joystick: if the mouse is not over the Atari800 window + (doesn't have the input focus) the joystick is not read. + Also a preliminary 'experimental_mouse_joystick()' was added. As the name + says this is an experiment of joystick emulation using the mouse. Not used + yet. + +o trace-ing in monitor: doesn't display 24 insns after a single step. + +o Jari Karppinen sent a patch for new Allegro lib (v3.12) + +o Christian Groessler sent a little patch for joystick under Linux + +o all gets() were replaced by fgets() since the compiler complained. + +o new configure stuff - configure.c, config.in, config.h and Makefiles + Marek rewrote the configure stuff and introduced the config.in file. This + is a great idea (something the emulator source needed for a long time). + I tried to improve it even more (getting the idea from Linux kernel config + stuff). It's not perfect yet but the main purpose - allow people to see + and change all used #defines - works now. Also, my idea was to allow people + to compile with or without ZLIB without editing the Makefiles and adding + #define and -lz. This works too. Of course there's still a lot of work left, + for example the (premise) as Marek calls it could allow logical operators + like OR, NOT and AND (using C symbols |, !, & or even ||, &&) + + The .atari800 file format has been changed. The positive thing is that it's + now compatible between all platforms. The negative thing is that I had to + move it from $HOME dir into the current source dir in order to get the + include of Makefile working under DOS. I don't know make and Makefiles well + so all fixes are welcome. + + +Changes in 0.9.9c +----------------- + ++ New features for end users: + - keyboard autorepeat in UI + - separate current directories for operations in UI + - better Linux SVGA support (including new 320x240 graphics mode) + - new Linux SVGALIB keyboard handler + - better sound (interpolation, less system load, configurable sound delay) + +! coding style: + - please do not change indentation of a source file unless you rewrote major + part of it - this makes 'diff' impossible to use and causes hard time for + people tracking changes between versions + - use TABelators instead of spaces, if possible (set TAB size to 4 spaces) + - you can use 'indent -kr -nce -ts4 source.c' to format the source file + - if you're sending me diffs then please use diff -u (Unified), if possible + +List of changes for programmers: + +o TODO updated - volunteers, please read it. + +o created new function 'atari_sleep_ms(ULONG ms)' that should be used + everywhere in the emulator where you need to delay the execution for a while + in a portable manner. Right now used in ui.c for keyboard autorepeat. + #include "atari.h" for that. + Architectures without usleep() and nanosleep() will edit just this function + instead of polluting the whole source code by many #ifdefs. + + Similar thing needs to be done in the syncing code for main emulator loop + in the atari.c. + +o removed ALL warnings during compilation on DOS and Linux, with help of + Jari Karppinen. + Atari800 for DOS is known to have problems compiling under latest DJGPP 2.02 + and/or with latest Allegro 3.12. This will be fixed as soon as I download + the above mentioned dev tools. + +o ui.c: the keyboard repeat works on all platforms (thanks to 'atari_sleep_ms') + some array size hardcoded constants replaced by #define FILENAME_SIZE + memcpy(fname, ' ') and strcpy(fname, " ") replaced by memset + +o pokey.c: ULONG DivNIRQ[], DivNMAX[], TimeBase replaced by 'unsigned int'. + This removed the warnings in Pokey[Read|Save]State(). It should not have any + negative effects on machines where sizeof(long int) = sizeof(int). + Linux-ia32, DOS/DJGPP and Atari Falcon/TT machines (all using GCC) + should be OK. + Is there an other computer/compiler with 16-bit ints or 64-bit longs that + runs Atari800? If yes, state saving/restoring will neither work there, + I think. And 16-bit ints would probably broke most of the emulator, anyway... + + +Following changes in 0.9.9c done by Krzysztof Nikiel + +o new Makefile.linux (Makefile.unix still works for Linux) + +o pokeysnd.c: added sound interpolation to reduce dsp frequency interference + (now should work good even at low rates) and required main output loop + reorganization. + +o sound.c: added correct dsp device handling. Now shouldn't slow down + the emulation. + added option '-dsprate ' and changed default rate to 22050 Hz (why?) + added option '-snddelay ' that allows tuning sound delay + according to interval betwen sound updates + +o sound_dos.c: buffersize increased from 400 to 440 bytes + +o sbdrv.c: divided sound buffer into four parts. + +o Linux svgalib: better utilized svgalib capabilities; + used mode 320x240x256; + removed vgagl dependency; + added status of disk LED; + +o ui.c : bug in SaveState - no terminating zero at end of string + separate current dirs for different operations + refresh screen bug in GetKeyPress + added keyboard autorepeat + + +Changes in 0.9.9b +----------------- + +o fixed SD and ED floppy formatting in SIO code (sector size is hardcoded) + +o monitor's commands 'COLDSTART' and 'WARMSTART' perform the reboot + immediately now (previously you have to give it the 'cont' command + to actually perform the reboot). + +o statesave bug in SaveINT fixed (negative integers weren't saved + correctly). + +o Makefile.unix updated - the rawkey lib is now essential for the + linux-svgalib version of Atari800. + +o Linux-svgalib version now recognizes F8 keypress for jumping to monitor + + +Changes in 0.9.9a +----------------- + +o full NOVA graphics support on Falcon including double sized screen + +o double buffering of screen on NOVA gfx + +o 16,32-bit X11 shared memory support. Compile with -DSHM. + Quote: "Just in case you're interested, here's a patch for Atari800 that will + allow shared memory to be used in 16-bit and 32-bit colour modes. There + isn't much of a performance benefit on my system (the emulator's CPU usage + drop from around 68% to 53%, but the X server rises from 5% to 28%) but it + might be useful in some environments. + + It's a bit of a hack since it adds another copy of each frame's data, but + it's probably the best that can be done without changing the + non-interface-dependent code." + +o SIO fix: register A should always contain 0 on return from ROM(?) + +o Unix fix: call select() in the main sync loop to reduce system load + +o SIO format fix: realsize is set - formatting should work (7 Cities of Gold) + . Though I think we probably should not call SizeOfSector since + someone might want to reformat double density diskette to single density. + Thus I think realsize = 128; should work better. Let's test that. + +o Linux SVGALIB - proper keyboard support implemented using the rawkey lib + (http://sunsite.unc.edu/pub/Linux/libs/ui) + + +Changes in 0.9.8 +---------------- + +o antic.c: artif_mode is up to 4 (fixed) + +o compfile.c: ReadAtariExe() for direct loading of single EXE files (actually it + creates a temporary ATR file) + +o sio.c: formatting of ATR disk images fixed + +o supercart.c: fixed RTIME month (months are zero indexed) + +o ui.c: added Run Exe option. The LoadState file calls fileselector now. + +o rt-config.c: added two config options: EXE_DIR and STATE_DIR + +o compfile.c: fixed a serious bug when using prepend_tmp_file() + + +Changes in 0.9.8g +----------------- + +o Falcon030 direct VIDEL programming for 336x240 resolution, NOVA screen saver + +o START/SELECT/OPTION keys on Atari fixed + +o DOS drives for Atari (still needs to be fixed) + +o "Load State", "Save State", "Back to emulated Atari" + "Cold/Warm Start" reboots machine immediately + +o fixed the CPU opcode 0xcb and removed the BCD tables definitely + + +Changes in 0.9.8f +----------------- + +o PAGE BASED memory access implemented (partially). See memory*.[ch] files + and possibly #define PAGED_MEM in memory.h to see the (speed) difference. + + +o cpu.c: BCDtoDEC and DECtoBCD removed. + WARNING - cpu_nogoto.c is out-of-date! + +o cpu_asm.c, cpu_m68k.s updated + +o double buffering of screen output on Atari port + +o little fixes and general source cleanup (rcsid's were removed, at last) + + + +Changes in 0.9.8e +----------------- + +o Antic address counters fixed (both DisplayList and ScreenAddress). Salmon + Run and other games should now scroll the screen correctly. The bug was found + by Jindroush. + +o SelfTest must be disabled when OS ROM is disabled (suggested by Jindroush). + +o cpu_m68k.s is corrected (stack bug found and fixed). Spelunker runs now. + + + +Changes in 0.9.8d +----------------- + +o introduced #ifdef ZLIB_CAPABLE. Emulator is now compilable without + the zlib files. + +o deleted file 'djgpp.h' and added O_BINARY to all O_RDONLY in open() calls. + +TODO: update UI and add there menu items for state saving and restoring + + +Changes in 0.9.8c +----------------- + +o atari.c contains three functions that should rather be port-specific: + - zlib_capable() should return TRUE if we're linked against ZLIB + - prepend_tmpfile_path() should insert path to a Temp dir to supplied buffer + - ReadDisabledROMs() should read ROM files from disk instead from state image + The functions are not written yet (they just return FALSE or something like + that). Emulator code is not compilable without zlib header files... + +o cpu_m68k.s contains GetByte, PutByte and GenerateIRQ now. It's faster. + + + +Changes in 0.9.8b +----------------- + +o SIO bug fix: sectors are counted from 1! + +o new icon for Atari800 emulator + +o State Saving - a new feature that allows saving the state of emulated + environment anytime (in the VBL, actually) and restoring it later. + + +o cpu_m68k.s (assembler module for CPU 6502 emulation on M680x0 machines) + was updated (undocumented commands), corrected (Bruce Lee works now) + and greatly improved (profilling support, speed). + + +Changes in 0.9.8a +----------------- + +o added compfile.c for handling DCM and ZLIB compressed files. SIO module + updated. Please add call to 'Clear_Temp_Files()' into Atari800_Exit() in + all Atari800 ports. + +o some more printfs changed to Aprints (not sure if everything still + works correctly in all ports). + +o CTIA (artifacting mode 4) added. + +o DOS port: vertical retrace control in display functions (animations + are now much smoother) for both "official" and Allegro Dos versions. + It will probably need a fast CPU to work fine. + Vertical retrace is normally turned off, it may be activated by command + line '-vretrace' option or by adding 'VRETRACE=1' to atari800.cfg. + + +Changes in 0.9.7 +---------------- + +o CPU.C has got several new macros for stack (PH, PHW, PL) and memory + access (dGetByte, dPutByte, dGetWord). This is intented for easier + implementation of future memory management. + +o new command line switch "-nopatchall" and option in config file + "ENABLE_ROM_PATCH". If you disable ROM patches (either by setting the + ENABLE_ROM_PATCH to 0 or by using "-nopatchall") it will automatically + disable the SIO patch as well. But the main purpose of this is to get + a clean Atari800 ROM so Self-Test is happy when testing CRC and + some games that search for certain device in HATABS do work now. + + +o new undocumented GTIA priority ("transparent missiles") added. The 5th + player colour of missiles is transparent in mode 9 and 11. + Also it fixes a bug in the earlier implementation of gtia mode 11 + There is also a major change in the way priorities are handled which + is designed to be faster somewhat, it seems to help a bit with demos + that cover the screen with players. It will probably not help too much + for other programs. + +o #define BIG_ENDIAN -> POKEYSND_BIG_ENDIAN (why Linux-ix86 defines + BIG_ENDIAN???). + +o NTSC patch to get Joust running under A5200. + +o new: support of R-Time 8 cartridge. Try to type 'date' or 'time' under + SpartaDOS. + +o new: artifacting in ANTIC mode 2. + +o PM DOS version: sound routines (DOSSOUND.C) do not need SEAL library + as it uses ALLEGRO lib now. ALLEGRO is capable of sound card auto detection. + New code uses just double buffering (previously tripple buffered) and the + value of gain was reduced to fix some problems with digital sound. + Edit ALLEGRO.CFG to change sample rate and thus sound quality. + + +o CPU 6502 emulation core adapted to not use goto's all over the place. + Also the jump table was replaced by switch() statement, which should be + optimized into jump table by any modern compiler, anyway. + This has various results - under MSVC it speeded up the emulation, + while under GNU C on MC68040 it actually slowed the emulator down + (about 10%, which is too much). The new core is available in file + CPU_NOGOTO.C and is not used by default, however you may experiment + with it under your architecture. + +o SIO DVSTAT byte 1 changed from 128 to 255 in order to get Strip Poker + running. + +o WIN32 related additions and changes + +o stricmp() -> strcasecmp() in ui.c + +o TVmode enum members PAL and NTSC had to be changed to TV_PAL and TV_NTSC + (PAL and NTSC were already defined in falcon.h header file) + +o ESCape code for SIO invoking (at 0xe459) has got an additional check to + ensure that SIO emulation layer is not called by mistake when CPU gets + some random data instead of instructions (it used to cause mysterious + locks up of emulator). All other system patches should be protected this + way, I think. + +o ADDLOG and BACKUP_MSG were replaced with one universal routine in log.c + called Aprint (syntax same as printf). All printf() should be replaced + with this Aprint() routine that buffers the messages on systems where + the emulator runs in a special graphics mode (DOS/Falcon/Win32) and does + not want to have screen filled with a mess instead of debug reports. + +o Falcon port cleaned up a lot: cflib removed, three different routines + for chunky-to-planar conversion in 320x240, 352x240 and 384x240 resolutions + were replaced with one universal routine that works in any resolution and + centers the screen view automatically. The default resolution for Falcon + is 336x240 now. It also is NOT a Falcon specific port anymore, as it now + supports any Atari compatible hardware with MC68020 or higher and 8-bit + color graphics (320x240 is the minimum resolution for starting emulator). + It also supports LED emulation (floppy LED blinking during SIO activity). + +o source is compilable with -Wall, all previously uninitialised variables are + set to 0. + +o UI: long file names in Disk Selection dialog are shortened now. + +o Colour Artifacting! Use '-artif ' command line switch to enable + the artifacting. Mode is number between 0 and 3. + +o the WIN32 specific code for artifacting in antic was removed. + +o DOS specific files clean up and fixes (a lot). + +o PIA: fixed support for four joysticks in Atari800, tested on some games. + Improved emulation of joystick ports on XL/XE. Some games obviously + switch the ports into output state(!) and then read it. One would say + there is nothing but $FF when the port is in output state and you read + from it, but the real life is different. Atari800 emulator now supports + this hardware trick correctly. + +o UI: better directory tree browsing support in Select Disk, in MS-DOS you + can even select disk drives. + + +Changes in 0.9.6 +---------------- + +o DOS: keyboard and joystick handling changed a lot. Joysticks emulated + on keyboard can now be freely defined to (nearly) any key combinations + using comfortable JOYCFG.EXE tool. Besides, there are two modes of + keyboard: Joystick mode and Normal mode. In Joystick mode the keypresses + to joystick predefined keys are not passed to emulated environment. + You can switch between Joystick and Normal mode on-the-fly by pressing + the F7 key. + +o Falcon: NOVA graphics extended: 336x240 or 672x480 (double size) + +o UI: the too fast autorepeat was fixed - by disabling the repeat altogether. + +o SIO: serious bug in CopyToMem fixed. No more rewritten ROM OS. + +o ANTIC patch: no player DMA without missile DMA. + +o SIO: missing 'else' in DIR routines. + +o Allegro VGA: updated Makefile and fixed ShutdownVGA(). + +o VCOUNT patch + +o PIA_Initialise() should initialise PORTA to 0. + +o PIA registers are mirrored not only in Atari800, but in XL/XE models + as well (thus addr&=0xff03). Bounty Bob runs now? + +o DOS: VESA2 mode support (about three times faster than X-mode). VESA2 + also preserves the refresh rate. You can disable VESA2 modes by switch + -novesa. Also colour pallete initialisation is faster now. + +o DOS: Atari_Set_LED function (use -DSET_LED to enable that). + +o UI: the last ESC keypress is not passed to the emulated program anymore. + + +o Monitor: pressing [Return/Enter] can be used for single stepping as well. + + +o new routine for saving of screenshot in 336x240 size as PCX. So far used + in DOS and Falcon ports (press F10 to save current screen into a file). + + +o the Atari keyboard should now react quickly enough. DOS port contains + keyboard buffer for last two keys. + +o fix for initialisation of PORTA + +o DOS port: better joystick autodetection + +o several fixes for more ANSI like C code + +o ANTIC: fix for DLIST counter. + +o ANTIC: several more hardware registers are unreadable. + + +Changes in 0.9.5 +---------------- + +o ANTIC: fix for scrolling of empty lines. + +o CPU: little fix in remembering last N jumps. + +o new command line option: '-basic' to override Hold_Option in cfg file + +o UI: you can now go into folders when selecting image in Disk Management + + +o DOS port - finally full resolution 320x240, 320x480 interlaced. + +o SIO: ATR images created by SIO2PC are readable now. Also Read/Write + Config was updated to reflect real XF551. + +o monitor continues last command by pressing [Return/Enter] key. + +o PIA: reading PORTA fixed (now works exactly like real Atari800, + not compatible with Atari5200 yet). + +o UI fix: it's possible to disable disk drive by [Space] again. + +o Gtia fix: CONSOL (Start/Select/Option keys) handling. + +o Pokeysnd: poly4 and poly5 bit fields were changed for more accurate + sound emulation. The original values are still available with + -DPOKEY23_POLY. + + +Changes in 0.9.4 +---------------- + +o CPU fixes: several unofficial instructions compared with real + Atari800XE and their emulation fixed. ADC/SBC "V" bit bug found + and fixed (Thor's code used, which in turn was taken from Frodo + emulator, AFAIK). Compatibility greatly improved again! + +o Antic fix: cycle counting when DMA is disabled (improves sound + quality in non-interrupt driven sound update routines). + +o Voxware sound driver updated (tested under Linux). + pokey11.[ch] files removed. + +o the crashing in UI when switching to Atari5200 mode fixed. + +o internal monitor improved (symbolic names for often used hardware + registers etc). Line assembler implemented. Single instruction + step mode implemented. + Monitor remembers not only last N PC addresses, but also + last N jumps. To enable these features edit your Makefile + CFLAGS = -DMONITOR_BREAK -DMONITOR_HINTS -DMONITOR_ASSEMBLER. + + +o additional WIN32 code (Atari800 User Interface is used in + Windows port now) + +o all Hardware_GetByte(address) routines return 0xff for unknown + address now. + +o fixed several files so Makefile.allegro works now. + +o NMIEN is not readable now. + + +Changes in 0.9.3 +---------------- + +o POKEY interrupts implemented (inspired by Thor's version). + Ghostbusters run now! :-) + +o NOVA graphics support on Atari TT/Falcon computers finished. + Atari800 is no longer Atari Falcon specific port, now it works + on any TOS compatible machine with MC68020 or higher and a NOVA + graphics card (please test in on Medusa, Hades and Milan machines) + +o A special check for pending IRQ put into CLI, PLP and RTI insns. + It's a macro for speed reasons, though a function might be more + appropriate. + +o A new function GenerateIRQ() was written in CPU module and is used + where needed (ATARI and POKEY modules). + +o Handling of IRQ's changed. Before, we tested for IRQEN (is interrupt + enabled?) and then (in positive case) we set IRQST. + Now, we always set the IRQST and then we take an action only if + IRQEN is OK. I don't know if it's OK, I have just been told that + more demos work with this. + +o all HardwareGetByte(address) routines return now 0 for unknown + address (probably not ideal, but deterministic at least). + +o several routines from ANTIC, CPU and POKEYSND modules moved to + POKEY module, where they actually belong. + +o CPU emulation fixed (INDIRECT_X mode was overflowing) + +o CPU and Antic speeded up *slightly* by using type casts instead + of direct anding with 0xff (the compiler got a chance to + optimize it at least). + +o a lot of uneccessary castings to (UWORD) and (UBYTE) was removed + from CPU emulation + +o DiskDir of UI enhanced - now you can define up to eight + directories where disk images are stored - then you can + go through these directories in Disk Management by pressing + TAB key. + +o fixed sorting of file list in Disk management in DOS port + (a speciality of strcmp() function of DJGPP libc). + + +Changes in 0.9.2 +---------------- + +o LPTjoy implemented. Now you can connect up to three old style + CX-40 (Atari, Amiga digital joysticks) to the printer ports + of your PC (via a very simple interface). Then you just specify + "-LPTjoy1" on command line for joystick on LPT1 etc. + LPTjoy idea came from Petr Sumbera. + +o m68k assembler CPU emulation was updated to reflect recent + changes in CPU module . + +o preliminary support for NOVA graphics on Falcon + +o Allegro joystick routines slightly improved (now you can + play even without real joystick) + +o Atari800Win changes were put in the main source tree + +o after selecting another OS from UI emulator doesn't hang if + there is no ROM file. + + +Changes in 0.9.1 +---------------- + +o new POKEY v2.4 with sound channels filtering! Exclusively + written by Ron Fries for Atari800 emulator. Thanks, Ron! + +o merge of Perry's and (RASTER & Petr)'s source tree - great! + Current source can be compiled for DOS by either Makefile.dos + or by Perry's Makefile.allegro. Perry's Makefile needs DOS game + library Allegro. The only functional difference between these + two DOS versions is that Makefile.allegro enables keyclicks + (due to different sound handling). + +o major rewrite of DOS keyboard emulation - now allows two + modes of operation: native (the labels on English PC keyboard + are valid) and original (the keyboard layout is the same as + the original Atari800 keyboard). You can switch between these + two modes on-the-fly by pressing Control+F1 and Shift+F1). + Better handling of START/SELECT/OPTION keys (these console keys + are independent of the rest of keyboard). + Screen view movement changed to Control-numeric pad (just + like emulated joy, but with Control key). + +o ANTIC speeded up by narrowing the screen width to 42 chars + (originally it was 48 chars wide, but no TV can show more + than about 43 chars..). This should speed things up for + about 10% in wide modes and PM graphics. + +o Emulation of 320 kB of memory added. Two different modes are + supported - Rambo and Compy Shop. Extended memory tested by + Q-meg (alternative operating system for Atari320XE). + ROM/ShadowRAM and AtariXL Basic switching optimized. + +o Atari5200 emulation corrected (loading of ROMs, keyboard, + paddles). Special support for Bounty Bob on Atari5200 + added. + +o new SIO code that supports formatting (written by , + updated by Perry and Petr). + + +Changes in 0.9.0 +---------------- + +o slight speed up in antic.c + +o the right-most vertical line was missing on screen + +o DOS: BREAK key should not have auto-repeat, Invers key added + + +o ANTIC now contains #ifdef POKEY_UPDATE. That should be defined + in Makefiles for architectures where it's impossible to update + sound buffers in DMA interrupt (i.e. Unices etc) + +o source cleaned up (no C++ style of comments), docs updated + + +Changes in 0.8.9 +---------------- + +o ANTIC's DIRECT_VIDEO mode was completely rewritten. Now it is the + default mode of emulation, much faster than the previous approach. + This version of ANTIC is also 'line-oriented' - that means video + emulation is accurate to single scanlines. It allows such tricks + like changing charset during displaying an ANTIC text mode line. + ANTIC's scrolling in both horizontal and vertical direction is now + supported in all graphics modes. Thanks Perry for all these things. + +o GTIA now supports all possible combinations of PMG collisions. It + also supports third colour (many games are much more colourful now, + just like they were on original Atari800). Thanks Thomas Richter and + Perry. + +o -configure now preloads the default filenames of ROM images. It also + presets hold_option to 1 (for game players is better not to confuse + them with Atari Basic). + +o xcolpf1 kludge was removed (antic, gtia, rt-config files). +o DIRECT_VIDEO support was removed (configure.c) +o the compilation config file is named atari800.djgpp on DOS, so it + finally doesn't collide with atari800.cfg (config file of emulator itself) +o sio.c opens files in binary mode - works on DOS + +o Atari800 monitor changes: disassembler rewritten (now recognizes all 256 + opcodes and displays also cycles and hex codes), different (more logical?) + commands: [D]isassembler, [C]hange memory, dump [M]emory (previously Y, M, D) + + +o Fixed DMACTL and GRACTL registers (difference between enabled PMG and enabled + DMA for PMG). + +o Introduced PMG flickering (try out POKE 53248,160:POKE 704,14:POKE 53277,3). + + +o DOS keyboard: added Ctrl-1 (stops scrolling), Ctrl-2 (bell), Ctrl-3 (EOF) and + HOME key clears screen, END key stands for Atari BREAK key. INSERT and DELETE + keys insert and delete chars or whole lines (with Shift and Control keys). + + +Changes in 0.8.8 +---------------- + +o Antic, GTIA and CPU are now synchronized. Very precise timing + (up to 99.87% compared to real Atari800XE) with CPU cycle counting + was implemented by RASTER. This should be the final solution for + numerous DLI problems. + +Changes in 0.8.7 +---------------- + +o snailmeter (speed indicator on the screen) is disabled automatically + when the host computer is fast enough for emulating the Atari800 at + full speed. + +o Atari_Scanline() function was optimized - should be up to twice as fast + as was before. + +o Falcon: keyboard emulation of joystick was fixed once more. Now you can + hold down several keys at once and it works OK. + +o DOS: joystick is autodetected. If not present, keyboard emulates joy1. + If real joy is detected, keyboard emulates joy2. If "-joyswap" command + on command line is used, the joy1 and joy2 are exchanged. + +Changes in 0.8.6 +---------------- + +o improved IRQ handling in CPU (CLI instruction) - now Rescue on Fractalus + reacts on keyboard presses + +o Falcon: real DMA sound with interrupt driven buffer recalculation using + Ron Fries POKEY 2.3 + +o DOS: keyboard fix of HASH mark (Shift-3) + +o Falcon: keyboard fix of joystick emulation + +o DOS version starts even when sound card is not initialized (emulator is now + able to run under WindowsNT 4.0) + +o Falcon detects current video mode and doesn't touch VIDEL registers + if it's 320/352/384x240x8bp (see the -resolution switch) - Atari800 should + now run on RGB monitors as well. + +o fixed little typo in BACK_SLASH (thanks Perry) + +o improved DOS and Falcon keyboard emulation (common KEYPRESSED and SHIFT_KEY) + DOS version now recognizes extended keys properly - joystick emulation is OK + (Chimera, BruceLee and others are now playable) + +o XL operating system is turned on in Coldstart routine. + +o keyboard IRQ are set only if allowed by IRQEN + +o DOS port emulates TAB and HELP key (HELP is mapped to F10 - not optimal, + should be changed to another key - perhaps F6, which is useless in XL mode) + +o DOS port has faster screen update with dosmemputl (Perry) + +o files on virtual drive are opened in binary mode (Perry) + and are listed in uppercase (RASTER's suggestion) + +o fixed bug in SIO_Mount causing crashes when mounting drives in Disk management + +o in System menu (F1) copy font from operating system and not from shadow RAM + (another XL related bug fix) + +o added support for '\\' in file paths (see #define BACK_SLASH) + +Changes in 0.8.4 +---------------- + +o fixed bug in vertical scrolling (visible for example in Archon intro) - + thanks to Perry McFarlane + + +o DMA sound for Falcon version (using POKEY 2.2). Buffer recalculation is + not interrupt driven yet. + +o Error messages are buffered until the original text mode is restored + (see #define BACKUP_MSG) + +o Falcon version supports up to two joysticks + +o Snailmeter :-) A kind of indicator for slow machines - it shows you + how many times is the emulator slower than real Atari800. On my + Afterburner (68040 @ 40 MHz) it's about three or four times slower + than original :-( If your machine is fast enough, the snailmeter + is not visible. So watch the lower bottom of screen! :-) + +Changes in 0.8.3 +---------------- + +o Radek Sterba (raster@infos.cz) did a marvelous work on discovering + unofficial 6502 instructions. This CPU.C has implemented _all_ 256 + opcodes! He added more than 70 unofficial instructions, many of them + were even unkown before. ESC code had to be changed from 0xff to 0xf2 + (0xff is a kind of 'regular' instruction, while 0xf2 is the CIM). + Atari800 is the world's first 6502 emulator with full instruction set! + 100% software compatibility with original 6502. + +o I've integrated his code and fixed JMP (addr) for addr crossing + page boundary (6502 was 'buggy', though 65C02 should had this fixed). + +o IRQ variable has been changed from int to UBYTE (for C it shouldn't matter + and it helps in the m68k asm code). + +o Disk images created by XFormer and its utilities (having extension + .XFD or .DD) may be of double density - I implemented it in sio.c + (see #ifdef ORIGINAL_XFD_CODE). Tested and works (glad to get it working, + because I have a lot of XFD images). + +o In DOS/VGA version you can move the 320x200 screen around with Ctrl-Arrows + to see full 384x240 resolution of original Atari800. To restore the VGA + screen back to center press F10. + +o DOS/VGA version supports one real PC joystick (emulated in port 1). + You still can use the numeric keypad as emulated joystick - by default + in port 1, or in port 2 with "-joyswap" command line switch. Joystick + doesn't have the ghost-moves (interrupts are disabled during joy reading). + Also joystick is not read whenever the Atari800 wants it, but only in the + keyboard routine (i.e. regularly 50 times per second, basically in VBL). + This was important to prevent a game reading joy port too often to hang + or slow the emulation down (reading of PC joystick takes some time). + +o DOS port has finally got wonderfully clear sound, thanks to Ron Fries' + SoundBlaster Driver 1.2 and new, little/big-endian aware POKEY 2.2 routines. + +o New monitor S command for searching a value in memory. + +o The best news: found the reason why so many games didn't work in XL mode. + Fixed one MMU bug (XL didn't have TRIG2 and TRIG3 was connected to + cartridge) and introduced one MMU workaround (many 800-only games put + zero to PORTB. That's why Tapper and other games didn't work). Now the + compatibility ratio of Atari800 in XL/XE mode is at 97% or higher - + definitely the most compatible Atari800/XL/XE emulator in the world. + +Changes in 0.8.2Petr +---------------- + +o Fixed wrong missile width (all missiles had the same width) - now River + Raid looks much better. + +o Added 28 cycles in Antic after executing DLI - it was absolutely needed, + because otherwise the interrupt routine was executed too late and the + effects (color or font change) occured with another Antic line - now + Pitfall II has the score displayed in numbers and not in characters. + +o Added several checks into SIO code for seeking() after end of file - + on Falcon it caused enlarging of disk images (for example the well + known MENU.ATR has original size 1296 bytes, but after rebooting + of Atari800 the file was enlarged to 2598672 bytes). Maybe it's + a hidden endianess problem in SIO code? It happened on Amiga, too. + +o Added a method of invoking Monitor - by pressing the F8 key anytime + during emulation. + +o Added BREAK command into Monitor. Now it's possible to enter monitor, + use command BREAK and then CONT. The emulator then runs until + the PC (program counter) is exactly . Then the monitor is invoked + again. + +o DOS version has got joystick support and also sound support using Ron + Fries Pokey Emulation 2.0. The joystick is OK, but the sound is not + clear - need to change to interrupt driven sound buffer generating. + +o Atari800 has been ported to Atari Falcon (32-bit machine with MC68030 + or MC68040 and flexible graphics processor). Besides the port this + Falcon version contains special CPU 6502 emulation written in pure + MC68030 assembler by Empty Head (Karel Rous), special very fast routines + for chunky2planar conversion (written by Douglas Little @ Black Scorpion) + and special code for VIDEL programming (provided by Douglas as well). + The keyboard and joystick emulation, the port itself and the fixes + mentioned above were done by me, Petr Stehlik (stehlik@cas3.zlin.vutbr.cz). + +Changes in 0.8.2David +---------------- + +o New Monitor READ command to load file into memory. +o New Monitor COLDSTART command to perform a coldstart. +o New Monitor WARMSTART command to perform a warmstart. +o New Monitor F command to fill memory range with a value. +o Prevention of "config.h" being included during compilation for Amiga. +o Improved MS-DOS keyboard handling. The most noticable difference is + that the keypad joystick emulation now returns to centre when the + key is released. +o Re-instated replacement OS - Allows Defender and Star Raider to + run without the Atari OS Roms. +o Added Atari Falcon Support - Thanks to Petr Stehlik. +o NAS (Network Audio System) support is now obsolete. The entries have + been removed from the makefile and the intention is to remove the + obsolete code before the next release. + +Changes in 0.8.1 +---------------- + +o Added -private_cmap flag for X11 version. + +o Correction to handling of 6502 V flag during ADC and SBC operations. + +Changes in 0.8.0 +---------------- + +o Added Ron Fries Pokey Emulation routines for sound in Linux. + A million thanks to Ron for releasing these routines - I've + put off using sound for ages but it took less than an evening + to add sound using these routines :-) + + Sound is setup for Linux using /dev/dsp but it also seems to + produce something using /dev/audio, which leads me to believe + that it should work on most Unix boxes with a little work. + Patches welcomed :-) + + In order to support sound I've added a few new command line + options:- + + -sound and -nosound do what you'd expect. + + -dsp_divisor takes a decimal value which alters the quality of + the sound output. It is used to work out how much + sound should be created each time the screen is + refreshed. Ideally it should be 50 (PAL) or 60 (NTSC) + but I've found that the best value to use is about + 5 less than the emulators screen refresh rate WITH + SOUND DISABLED. If the values is to high you will + get gaps in the sound. If the value is to low the + emulator will run slower than it should. + + I strongly suggest you experiment with this parameter + in order to get both the best sound and performance. + +o Support for an Experimental New Cartridge Format - with the use of + OSS Super Cartridges there is no way of automatically + distinguishing standard 16K cartridges from the various Super + Cartridges. Hopefully this format will do for cartridges what ATR + files did for disk images. Feedback and view would be welcomed + especially from the other Emulator Authors. + + The current format is :- + + first 4 bytes containing 'C' 'A' 'R' 'T'. + next 4 bytes containing cartridge type in MSB format. + + Type 1 - Standard 8K Cartridge + Type 2 - Standard 16K Cartridge + Type 3 - OSS Super Cartridge (I heard rumours that there are two + different types of OSS Cartridges) + Type 4 - Atari 5200 Cartridge + + Note: There is probably a case for extra cartridge types + indicating the system that needs to be emulated. + e.g. Standard 8K Cartridge (800 Mode Only). + + next 4 bytes containing cartridge checksum in MSB format (ROM only). + next 4 bytes are currently unused. + followed immediately with the ROM data, typically 8, 16 or 32K. + + In the next version I'm intending on adding:- + 32 bytes for Cartridge Name + 32 bytes for Cartridge Serial Number + 32 bytes for Manufacturer + + The current version of the emulator includes options in the + Cartridge Management screen to Create Cartridges in the above + format but be warned this format is likely to change. + +Changes in 0.7.1 +---------------- + +o Note: I now consider the new Menu System that runs in the Emulated + Atari's window to be the prefered User Interface. I have no + intention of doing any further development for XVIEW + +o Cartridge Management added to Menu. + +o Removed FFP Code. + +Changes in 0.7.0 +---------------- + +o F1 enters Menu System at any time. ESC returns you to the previous + screen. Items are lcoated using the cursor keys and selected by + either RETURN, SPACE, TAB or BACKSPACE. In most cases these keys + can be used interchangeably, the exception is in the Disk Management + Screen where RETURN is used to select a new disk and SPACE, TAB and + BACKSPACE are used to eject a disk - If there is no disk in the + virtual drive then SPACE, TAB and BACKSPACE will switch the drive + off (Useful for Shamus). + +o X11, SVGALIB & DOS - F5 is now Warmstart and Shift F5 is Coldstart. + +o X11 - F8 Single Shot Screen Dump, Shift F8 continuous Screen Dumps. + +o MS-DOS version runs about three times quicker now that the emulator is + synchronising with a high resolution timer. + +o MS-DOS version resets the screen back to text mode when finished. + +Changes in 0.6.2 +---------------- + +o Antic Modes 2, 3 and f now display the normal Atari Colour and + Luminance by default. Extended Antic Modes 2, 3 and f are enabled + by starting the emulator with the "-xcolpf1" command line option. + This allows two completely different colours to be displayed in + these modes - as previously. + +o Improved Run-Time Configuration. Starting emulator with the "-configure" + command line option allows configuration of several items:- + + 1. Location of OS Roms + 2. Default Directory for Disk Images + 3. Default Directory for ROM Images + 4. Default Directory for H1, H2, H3 and H4 pseudo devices + 5. Command Print File (for Printer Support) + 6. Default Screen Refresh Ratio + 7. Default Startup System (OS/A, OS/B, XL, XE, 5200) + 8. Default TV Mode (PAL, NTSC) + 9. Hold Option during Coldstart + 10. Enable C000-CFFF RAM in Atari 800 mode + 11. Enable SIO Patch + 12. Enable FFP Patch + 13. Enable Extended COLPF1 (Two true colours in Antic Modes 2, 3 & F) + + The emulator writes a file called "atari800.cfg" in your default + directory. When reading the configuration the emulator first checks + to see if you've specified a configuration on the command line with + the "-config" option otherwise it first tries to read a configuration + file from your default directory, failing this it then tries to read + a configuration file from "/etc/atari800.cfg". + +o JoyMouse for Toshiba Portables running SVGALIB - Probably also + suitable for Trackball devices with minor modifications. + +Changes in 0.6.1 +---------------- + +*** IMPORTANT MESSAGE for EXISTING Users of Atari800 (Source Versions) + +You will need to make some changes during the sytem configuration +stage - the emulator now expects the full path to each of the system +ROM images to be explicitly stated. If you don't have all the ROM +images then just pretend you have! + +o FPS and SIO Monitor are no longer compile time configuration options. + Enabled by "-fps" or "-sio" command line option or via an XVIEW + pulldown menu. +o Motif fileselector retains state from one invocation to the next. +o Configuration program detects if longwords need to be aligned. +o Modification to X11 Paddle Emulation. +o Removed hardcoded paths in MOTIF code. +o Various fixes for curses mode. +o Correction to Colours in Antic Modes 4&5 causing Incorrect colours + in Rally Speedway, Galactic Chase and Mr. DO) +o Disabled DiskChange KEY (F8) in X11 version. +o Added "-nobasic" command line parameter. +o Added "-osa_rom", "-osb_rom", "-xlxe_rom", "-5200_rom" and "-basic_rom". + These command line options are used to specify the location of + various system ROMs on mis-configured systems or binary distributions. + +Note: To prevent cluttering up the CHANGES file all credits are listed + in the CREDITS file. + +Changes in 0.6.0 +---------------- + +- Emulator can now be compiled for DOS using the DJGPP port of GCC (Thanks + to Ivo van Poorten) + +Thanks to Maximum Entropy for the following Changes:- +- Implementation of Disable Drive menu item for Motif. +- Fixed scrolling problem for machines that can't access longwords on word + boundaries (e.g. SGI and SPARC). +- Added FPS Monitor to X11 and Motif versions. +- Changes to pattern matching for H: device. + +Changes in 0.5.5 +---------------- + +Thanks to Maximum Entropy for the following Changes:- +- Various corrections to MOTIF code. +- MOTIF callbacks for Insert Disk, Eject Disk and Insert ROM +- Bug Fixes in sio.c +- Bug Fix to devices.c allowing DOS 2.5 to get a directory of H: +- Bug Fix to monitor.c (EOF on INPUT + Blank Lines) +- Undocumented commands added to monitors HELP command. + +Changes in 0.5.4 +---------------- + +- Made Emulator C++ Friendly. +- BASIC version has not been working since CPU cycles were allocated during + scanlines processing. This problem was caused because the BASIC version + doesn't generate any scanlines and therefore didn't execute any + instructions. This version fixes the problem. + +Changes in 0.5.3 +---------------- + +- Removed GetWord macro from cpu.c +- Added XVIEW option to disable drive (via SIO_DisableDrive()). This + allows SHAMUS to work. The drive is automatically re-enabled next + time a disk is inserted. + +Changes in 0.5.2 +---------------- + +- Made CPU timing more accurate: It now issue 114 clock cycles per scanline + instead of 48 instructions. +- Removed obsolete functions: GetBinaryWord() and BinaryLoad(). +- Handle PORTA Direction Control Register. Fixes Joystick problem in Caverns + of Mars 1. +- The atari_basic array was incorrectly defined in pia.c as [8129]. This + has now been corrected to [8192] (Thanks to Chris Palmer). + +Changes in 0.5.1 +---------------- + +- Changed handling of CONSOL for X11 versions - previously it was hard + to start some games. +- Changed address of 5200 POKEY chip. The information I have states that + it is located in page $eb, but evidence in a disassembled cart suggests + its at $e8. Of course it could appear in both pages, does anyone + know for sure? +- CPU time allocation is now performed entirely within "antic.c". This is + a pre-condition for switchable PAL/NTCS modes. +- Compile time configurable to either PAL [default] or NTCS system. +- "-countdown" option has been removed. + +Changes in 0.5.0 +---------------- + +- Simplified interface to CPU module. +- DIRECT_VIDEO now works with PMG collision detection. This option increases + performance by about 28% but can result in different colours being displayed. + This is because this option relies on COLPF0, COLPF1, COLPF2, COLPF3 and + COLBK all having different values, hence the emulator sometimes modifies + the colours :-( This option can be enabled during the configuration phase. +- Correction to ANTIC Mode 5 Vertical Scrolling. +- Correction to PMG DMA Code - Demon Attack now works OK. +- Added code to limit the emulator to 50fps - this will not have any + effect if your machine can't run the emulator greater than 50fps. + F10 in X11, XVIEW, MOTIF and SVGALIB versions toggles the limit on/off. + When the limit is off the emulator will go as fast as it can. +- Path to directory containing the OS ROM images is now defined during + the configuration phase (Declaration of ATARI_LIBRARY has been removed + from the Makefile). +- Correction to handling of PMG DMA - Pitfall II now Works. +- The unused bits in PMBASE are now ignored correcting errors in Atari Chess + and Frogger. + +Changes in 0.4.5 +---------------- + +- Added a compile time configuration option to control the default + screen refresh rate. In previous version of the emulator the default + rate has been 4 frame: draw 1 skip 3. From this version you will + be prompted for the default during the compile stage (except VMS and + AMIGA which still default to 4). A value of 1 is required for the + most accurate emulation. Values other than one can produce some + collision detection problems on a few programs (e.g. Burried Bucks). +- Split Custom Chip code into seperate files. +- Added 5200 Emulation Code - Runs program but needs modifications to + support 5200 controllers. The 2K OS ROM must be called "atari5200.rom" + and placed in the same directory as the other OS ROMS. +- Linux Joystick enabled by configuration program. There are nolonger + any makefile targets containing "joystick". +- Removed code relating to Emulated Operating System. +- Added option that displays the number of Frames per Second. This option + is enabled within the configuration program and currently only works + with the XVIEW version. + +Changes in 0.4.4 +---------------- + +- SpartaDOS 3.2 works for both Read and Write Access. +- Alternate Reality "The City" now works. +- Added interrupt timings for Invalid SIO commands. +- Support for Direct Serial I/O Write and Put sectors commands. +- Correction for Double Density ATR files. + +Changes in 0.4.3 +---------------- + +- Corrected a Bug that prevented DOS 2.5 from copying files to/from H: +- Re-instated F8 Disk Change function for non XVIEW/MOTIF/AMIGA Systems. + +Changes in 0.4.2 +---------------- + +- Test code for faster screen generation, enabled by defining DIRECT_VIDEO + within "atari_custom.c". It needs a little more thought with respect to + collision detection, hence it is disabled by default. +- Better PMG Priority Handling. +- Tidied up code accessing hardware registers +- Changed handling of B, D and I flags. +- Changed handling of NMIs. + +Changes in 0.4.1 +---------------- + +- Flashes background colour while performing direct Serial I/O +- Minor optimisation to Player/Player collision detection +- Minor changes in CPU emulation +- Correction to new cartridge code causing it to fail under XL/XE + emulation (Thanks to Neil Shipp) +- New targets in the Makefile for freebsd systems (Thanks to Ivo + van Poorten) + +Changes in 0.4.0 +---------------- + +- Added MOTIF User Interface +- Support for DEC-Windows under VMS (Thanks to Chris F Chiesa) +- Removed dependency on 'ncycles' global variable. +- Support for direct access to serial port hardware - The emulator will + now run Alternate Reality "The Dungeon" (I haven't tried the others) +- Modified handling of XL/XE memory. +- Fixed the GTIA modes which broke after X Window shared memory support + was added in version 0.3.0 +- Correction allowing Montezumas Revenge to work again. + +Changes in 0.3.3 +---------------- + +- New System menu in XVIEW version allowing selection of operating + system etc. +- Amiga: Iconify working. +- Amiga: System menu contains options for Insert ROM, Remove ROM, + Enable PILL, Selection of Operating System and all previous disk + options. +- Amiga: Help menu option is now working using Multiview. + +Changes in 0.3.2 +---------------- + +- Modified BRK instruction to take account of the I flag. The BRK + instruction is ignored if the I flag is set. +- Added all unofficial NOP opcodes. +- New cartridge handling. The XVIEW version provides menu items + enabling the insertion and removal of cartridges. + +Changes in 0.3.1 +---------------- + +- Defined PRINT_COMMAND in devices.c for Amiga +- Minor optimisation to PMG handling +- Modified DLI Handling and ScanLine processing + +Changes in 0.3.0 +---------------- + +- Support for Atari 130XE memory banks (Antic currently accesses the + same bank as the CPU) +- XVIEW Exit item on the Disk menu. +- Printer device calls tmpnam() to allocate a temporary filename for + the spool file. +- XView version didn't enable HELP key for XL and XE emulation. +- X11 Backspace keys works in the same ways as the Delete key. + (Thanks to Cyrus Malek) +- Reset and Coldstart now work during XL and XE emulation. +- Added OK button to XVIEW controller and performance dialog boxes. +- Optional support for X11 Shared Memory Images resulting in a 32% + speed improvement. This option can only be used in conjunction + with the small screen display. Type make by itself to obtain + the new list of targets. "-shm" target extension enables this + option. +- Simple configuration program to avoid editing the Makefile as ofter. + make will invoke it the first time and afterwards "make config" can + be used. It currently handles the directories for the H: device, the + disk image directory for the XVIEW file chooser and the command used + to send a file to the printer. The print command should contain a %s + character sequence where a filename is expected (only the first %s + is relevant). + +Changes in 0.2.7 +---------------- + +- Renamed atari_h_device.c to a more general devices.c +- Emulator (private) opcode ESCRTS ($d2) added to support patching of OS. +- Printer device supported via Unix lpr command. +- Moved from RCS to CVS and added rcs Id keyword to all C files. +- Emulated OS: Better handling of Keyboard and ATASCII to screen + code conversion. Editor uses LMARGN, RMARGN, ROWCRS and COLCRS. +- Many other changes to EmuOS including implementation of SETVBV + COLDSV and WARMSV. +- Detection of X11 server supporting the MIT Shared Memory Extension in + preperation for shared memory pixmaps. +- Corrected bug in H: device (filename extraction routine). + +Changes in 0.2.6 +---------------- + +- Corrected calculation of number of sectors and reading of double + density ATR files (Thanks to Preston Crow) +- Correction for Linux ELF systems. +- XVIEW and NAS work under Linux/ELF +- Default directory for XVIEW Disk File Chooser is set within the + Makefile. By default it is pointing to /usr/local/lib/atari/DISKS +- Corrected bug in Missile 0 to Playfield collision detection. +- Corrected WSYNC bug (multiple stores to WSYNC during one scanline). + River Raid now runs correctly. +- -emuos to enable emulated operating system. Users without the + necessary atari OS ROMs can use this option to boot disk images/ROMs. + Currently this is very experimental and runs very little without + problems. Defender runs perfectly but if you haven't got the OS it's + unlikely you'll be able to get this either! +- H0: device accesses the current directory on your Unix Machine. +- H1: through H4: can access four directories specified either within + the Makefile or via the -H1, -H2, -H3 and -H4 command line options. + By default they are set to /usr/local/lib/atari/Hx where x is 1, 2, + 3 or 4. +- H5: through H9: duplicate H0 through H4 but have automatic ATASCII + to ASCII translation. They are not suitable for binary files. +- All files accessed via the H: device have Unix filenames consisting + entirely of lowercase letters. + +Changes in 0.2.5 +---------------- + +- Network Audio System support on Unix Systems [incl. Linux]. Waveform + can be selected via the -sinewave or -squarewave options. At the + moment it doesn't support the Atari Distortion values and switches + channels using distortion off. This is available in XVIEW, X Window + and Linux SVGALIB versions. The Network Audio System is freely + available on the Internet - I used nas-1.2p2.tar.gz. Any Linux XVIEW + version do not work when built with the Network Audio System. + *** See BUGS file for more information *** +- Support for /dev/sequencer removed since it didn't look like it + would ever produce satisfactory results. +- Introduced -help option that lists all options available in the + emulator. +- Added LAX unofficial opcodes +- Corrected Vertical Fine scrolling in Antic Mode 7. +- Enhanced DLIST command in "monitor.c" which now displays the display + list using mnemonics. +- Updated VMS command file. + +Changes in 0.2.4 +---------------- + +- Corrected mask in Atari800_GetByte() and Atari800_PutByte() +- In Atari800_PutByte(), only switch on cartridge type when an + access is made to page $d5 +- Screen generation using word access where possible. +- merged main.c with atari.c +- Fixed SVGALIB Escape and cursor keys. +- Emulated Floating Point Library which performs floating point + arithmetic directly on your host computer - bypasses 6502 CPU + emulation. Enabled by the -ffp option. + +Changes in 0.2.3 +---------------- + +- ADC and SBC functions are nolonger implemented as functions. +- 6502 PC, S, A, X, and Y register now handled using local + variables. Copied to global variables on exit from cpu and + restored on re-entry. +- Took advantage of a GCC feature: goto array[opcode]. Other compilers + still use a switch statement. +- Amiga: DisplayScreen() tidied up +- Added DLIST command to monitor. This command shows the address of + the display list (from hardware registers). +- Major recode of all Antic Graphics Modes. Now allows Horizontal and + Vertial fine scrolling. +- Added an -interlace option to the SVGALIB version, giving a + performance increase of about 10%. You would use this option to + increase the speed of programs that must be run with a screen + refresh rate of 1 (e.g. Burried Bucks) +- In the SVGALIB version, the F11 and F12 keys can be used to modify + the vertical positioning of the emulated screen. F11 moves the screen + down while F12 moves the screen up. +- Corrected a BUG causing River Raid to have corrupt screen display. + +Changes in 0.2.2 +---------------- + +- Made GetByte, GetWord and PutByte macros local to cpu.c +- Added some 386 inline asm() for some 6502 addressing modes +- Simplified Keyboard Handling +- Assembly routines for Amiga AGA screen handling + +Changes in 0.2.1 +---------------- + +- Created a new Makefile for Unix. The Amiga support is now in + Makefile.amiga +- Sorry, but I renamed the ATARI800 environment variable to ATARI_LIBRARY + which points to /usr/local/lib/atari by default. +- Control + Shift + Key combination for Linux SVGALIB implementation. +- SVGALIB version can be restarted after entering the monitor. +- HELP Key available in XL/XE mode +- Optional XVIEW (V3) Interface for X Window version. Allows disk changes + using a file selector, controller configuration and access to performance + variables. +- BREAK Key fixed +- PC Joysticks can be used with Linux (svgalib, x11 and xview) through the + /dev/js0 and /dev/js1 devices. Second button activates the space bar + which is very useful in Defender :-) Build with "make " where + is one of:- linux-x11-joystick, linux-xview-joystick or + linux-svgalib-joystick +- X11 Joystick emulation using keyboard re-implemented. Straight X11 can + use either numeric keypad or cursor keys + space. XVIEW can only use + cursor keys + space (Problem using keypad in xview!) +- Disk selector for Amiga version + controller configuration menu +- Started code to emulate SERIN and SEROUT registers. At the moment this + is ongoing and does not work. New startup option -nopatch disables the + SIO patch leaving the normal SIO routine in place. + +Changes in 0.2.0 +---------------- + +- Separated Playfield Scanlines from Player Missile Scanlines +- Corrected playfield colour errors in Antic modes 8 & 10 +- Horizontal Fine Scrolling +- Playfield and Player/Missile Priorities +- Allow Emulator to run either as an Amiga Screen or Window +- Added Paddle support for Amiga + +Changes in 0.1.9 +---------------- + +- Corrected bug in IRQST and IRQEN +- Corrected minor bug in player missile collision detection +- Amiga version is now full screen + Menus +- Faster disk I/O +- Added ATARI800 environment variable. This allows the emulator to be + run from different directories. If ATARI800 is unset it will still + try to load the OS images from object/ below the current working + directory. +- colours.h replaces colours.dat +- Added man page. +- New way of handling Joysticks, Triggers, Paddles and Console Keys +- Corrected handling of CHBASE which was causing K-RAZY ANTIKS to + display garbage. +- Corrected handling of VCOUNT which was causing screen handling + errors in Star Raiders (galactic map) and Henri (game screen). +- Added Sound API. A test sound implementation is available for + the Linux SVGALIB version via /dev/sequencer - It's not very good + and has only been used to test the API. It is enabled by starting + the program with the -sound option. Listen to the title screens + of Necromancer, K-Razy Antiks and Henri (these are the best + I've heard). +- argc and argv are passed to the platform specific initialisation + code - Atari_Initialise(). This allows platform specific options + like -sound on the Linux SVGALIB version. +- Extra Amiga options -ocs -ecs and -aga. Currently the default is + AGA. The -ocs and -ecs have been tested on an A1200 with the + OCS and ECS emulation modes enabled. At the moment it is not + guaranteed to work on real OCS or ECS equiped machines since it + has only been tested under Workbench 3.0. Hopefully someone will + provide some feedback. +- Another two Amiga options -grey and -colour. The -grey option + produces a grey scale display on OCS, ECS and AGA machines. The + -colour option produces a full colour display on AGA machines and + up to 32 simultaneous colours on OCS and ECS machines. +- The DOUBLE_SIZE compilation flag for the X11 version has been + replaced by a runtime options. The runtime options are -small, + -large and -huge. + +Changes in 0.1.8 +---------------- + +- Allows direct use of GRAFP0, GRAFP1, GRAFP2, GRAFP3 and GRAFM without + using DMA. +- -rom16 option to load standard 16K ROMs. +- -a option to load object/atariosa.rom +- -b [default] option to load object/atariosb.rom +- Simplified screen generation for host - Player missile graphics + collision detection has been moved into 'atari_custom.c' +- Corrected read from PORTB (XL/XE emulation) +- GTIA support for *all* antic modes. + i.e. GTIA can be enabled in graphics mode 0 (antic mode 2) just like + a real 800. POKE 623 with 64, 128 or 192 to test. +- Amiga version can be compiled using either DICE C or GNU C - see Makefile + +Changes in 0.1.7 +---------------- + +- Issue cpu cycles during screen update (corrects VCOUNT problem) + As a result DLI are not occuring on the correct mode line. +- Support for 256 bytes/sector ATR files +- Handle Insert, Delete and Tab keys properly +- Handle Shift + Control + A-Z properly (X11 only) +- Cartridge support tidied up (Thanks to Dave Bennett) + +Changes in 0.1.6 +---------------- + +- Correct Colours (Thanks to Chris Lam) +- Fetch correct number of screen bytes with horizontal scrolling enabled +- Speed improvements for Antic Display Modes +- Support for ATR files (128 bytes sectors only) +- Support for XL/XE ROM (Reset etc. do not work???) +- Corrected Bug in BCD SBC instruction. +- Added X11 window Expose event (Thanks to Ivo van Poorten) +- Control characters within CURSES (Thanks to Ivo van Poorten) +- Improved Portability +- Remove '-b' flag (Use -rom object/ataribas.rom instead) +- Graphical Support for Amiga 1200 +- Faster 6502 Emulation +- X11 Joystick emulation now uses the mouse + +Changes in 0.1.5 +---------------- + +- CURSES text only mode (Support for various terminals) +- Display list jump instruction corrected. +- Fixed SIO module (It didn't update DSTATS) + +Changes in 0.1.4 +---------------- + +- Changed GetByte and PutByte to macros +- Added SVGALIB support for Linux which is much quicker than X11. +- Added support for OSS Super Cartridges (Thanks to Dave Bennett) +- -rom option to specify alternative cartridges +- -oss option to specify alternative OSS Super Cartridges + +Changes in 0.1.3 +---------------- + +- Compilation option for double size screen +- Trigger now initialises to not pressed +- Joystick now initialises to central +- Fifth Player support added +- Support for Paddle 0 +- Preparation for changing GetByte and PutByte to macros. + +Changes in 0.1.2 +---------------- + +- Now include in atari_custom.h + +- Resets count to countdown as soon as it reaches zero. This was causing + problems with the RESET Key - count went negative. + +- Removed XImage structure. I am now updating only the pixels that have + changed within a Pixmap. XCopyArea is used to move the Pixmap onto + the Window. XCopyArea is not called if no pixels are changed. As a + result I am trying a higher refresh rate. + +- Correction for BASIC version - I left some X11 stuff in resulting in + unresolved sybols. + +- Remove unused status variable from atari_h_device.c + +- Added some test Amiga Intuition Code - not usable (No Colour or Keyboard) + It manages to get the 'READY' prompt up! Atari Basic Blue is one colour + and everything else is the other. When keyboard support is added you + will be able to use Atari Basic. + +- Registers are now allocated variables within atari_custom.c. They are + nolonger stored in main memory area. + +Changes in 0.1.1 +---------------- + +- Outputs an error message when ROM images are not available. + +Version 0.1.0 +------------- + +- Initial Release diff --git a/DOC/CHANGES.dc b/DOC/CHANGES.dc new file mode 100644 index 0000000..ad88f69 --- /dev/null +++ b/DOC/CHANGES.dc @@ -0,0 +1,120 @@ +30-Jan-2006 atari800dc v0.76 + + * use Atari800 cvs code base as of jan-27-2006 + * use KOS svn code base version 289 + * unplugging/replugging controllers after atari800dc has started + up works now + * screen update is now done by an assembler routine + +17-Jan-2003 atari800dc v0.75 + + * use Atari800 cvs code base as of jan-11-2003 + * reverted the sound changes which were introduced in the 0.72 + version - the sound should be similar to 0.71. + * saved states on the VMU now show a Atari icon. Due to a + change in the layout of the state save file, saved states of + previous versions aren't recognized. + * changing video mode of emulated Atari now doesn't change the + video mode used to drive the screen. These 2 video mode + settings (what the emulated Atari thinks the video mode is, + and the video mode used by the DC) can now be changed + independently. + Setting them to different values will disable double + buffering, so best results are achieved if both settings are + the same. + * buttons B, X, Y on the 1st DC controller can now be + redefined to generate simulated key presses on the + keyboard. If they are redefined, the Start, Select, and + Option keys can be entered in the keyboard emulation + screen. + +21-Sep-2002 atari800dc v0.72 + + * use Atari800 cvs code base as of sep-17-2002 + * changing CDs should now work more reliably + * load and save (VMU) state now display "please wait" messages + and report if the save failed + +21-Jul-2002 atari800dc v0.71 + + * use Atari800 1.2.3 code base + * support to save/restore status on VMU. + The status will be saved on the first VMU found, unless the + configuration file contains an entry for STATE_DIR which is + not empty and not ".". + * changing video mode of emulated Atari (PAL/NTSC) now changes + the video refresh rate of the DC (50 for PAL/60 for + NTSC). Since the timing of atari800dc now depends on the + video refresh rate, the PAL/NTSC differences are better + emulated. + * support for the Arcade Stick. + * implemented double buffered screen update with the + possibility to switch at runtime between normal screen + update and double buffered version + +17-May-2002 atari800dc v0.7 + + * support for autostarting executable files or atr images: + place autorun.com or autorun.exe or autorun.atr into the + root directory of the CD + autorunning cartridges is not implemented (the emulator + needs the cart type, and there is no way to tell him + automatically) + * selecting (inserting) a cartridge will now start it + immediately + * 800: added keyboard emulation using DC controller: now most + keys can be generated with the standard DC controller + * 5200: added keypad emulation (only for the 1st 5200 + controller) + * 800: Option/Select/Start are now emulated with the DC + keyboard (F2/F3/F4) + * support to change video mode of emulated Atari (PAL/NTSC) + +08-May-2002 atari800dc v0.65 + + * directory browsing on the CD implemented. Due to additional + CD accesses needed for this, don't populate a directory with + more than a few hundred files, otherwise entering the + directory will become very slow. + * after startup, the CD can be exchanged. + +15-Apr-2002 atari800dc v0.61 + + * fix display glitch on the left side introduced in the last + version + * in the crash menu one item wasn't centered + +11-Apr-2002 atari800dc v0.6 + + * speed increase: use new DIRTYRECT facility of the a800 main + code + * 5200: controller joystick now generates 5200 controller + compatible (analog) data. + * 800: controller joystick also generates joystick direction + events (previously only the joypad did) + * customized ui + * support for ui switch "emulate paddle": must now be turned + on when using paddles. Up to four paddles are supported + (only 2 tested, don't have more controllers; makes sense in + 800 mode only, 5200 results are undefined :-) + * in ui, B button is now the same as R trigger (go back) + +05-Apr-2002 atari800dc v0.5 + + * sound fixed (reason of the large version jump) + * improved ui "keyrepeat" + * 800: simple paddle support + * 5200: Y key now generates "H" - some games want a "H" to + start + +27-Mar-2002 atari800dc v0.2 + + * implemented "keyrepeat" while in the emulator ui (controller + only) + * fixed crash when system was set to atari 800 (not XL) and + less than 3 controllers were connected + * some sound changes (but they don't improve anything :-) + * added support for 5200 controller 2nd action button + +22-Mar-2002 atari800dc v0.1 + diff --git a/DOC/CREDITS b/DOC/CREDITS new file mode 100644 index 0000000..bbb5eb2 --- /dev/null +++ b/DOC/CREDITS @@ -0,0 +1,425 @@ +Current active members of the Atari800 development team: +-------------------------------------------------------- + + Petr Stehlik (maintainer) + Perry McFarlane (core developer) + Piotr Fusik (core developer) + Tomasz Krasuski (core developer) + Mark Grebe (Mac OSX) + Kostas Nakos (Windows CE, Android) + James Wilkinson (DOS, BeOS, Win32) + Christian Groessler (Sega Dreamcast) + Andrey Dj (Raspberry Pi) + + + +All contributors, past and present: +----------------------------------- + +Troy Ayers + - PlayStation 2 port + +Michael Beck + - SIO2PC ATR patch + - SIO config patches (tested on real XF551) + - monitor continues last command + +Dave Bennett + - code enabling the use of OSS super cartridges + - correction to Display List jump instruction + - tidied cartridge code up + +Adam Bienias + - a fix for better quality of sound + +Jakub Bogusz + - fixed memory corruption in input.c + - a fix for DCM decoding + - jakub.act palette file (built-in since 1.3.6) + +Michael Borisov + - completely new, high quality Pokey sound emulation + +Robert Brewer + - Voxware sound driver updated for POKEY v2.4 + +Chris Chiesa + - added code allowing emulator to run under DEC Windows + +Mike Coates +Tom Haukap + - Votrax SC-01 + +Ed Cogburn + - major improvements of configure & make process + - added copyright headers to all source files + - miscellaneous cleanups and fixes + +Matthew Conte + - new SoundBlaster driver for DOS + +Preston Crow + - corrected calculation of ATR sector count + - UI enhancement (folders in disk management) + +David Dahlstrom + - DirectX input and display enhancements + +Nir Dary + - detailed information about OSS, Williams, XEGS and MegaCart cartridges + +Andrey Dj + - Raspberry Pi support + +Jason Duerstock + - R-Time 8 cartridge support (real date and time from host machine) + - page based memory access + - PAGED_ATTRIB support + +Zdenek Eisenhammer + - real.act palette file + - util/keyboard.png + +Maximum Entropy + - various corrections to Motif code + - Motif callbacks for Insert Disk, Eject Disk and Insert ROM + - bug fixes in sio.c + - bug fix to devices.c allowing DOS 2.5 to get a directory of H: + - bug fix to monitor.c (EOF on input + blank lines) + - undocumented commands added to monitor's "HELP" command + - implementation of Disable Drive menu item for Motif + - fixed scrolling problem for SGI and SPARC machines + - added FPS Monitor to X11 and Motif versions + - changes to pattern matching for H: device + - Motif fileselector retains state from one invocation to the next + - fixed an unitialized pointer + - tidied up declaration of various functions + - removed warning messages when compiled with -Wall + - configuration program detects if longwords need to be aligned + - modification to X11 paddle emulation + - removed annoying flicker present under some X11 platforms + - removed hardcoded paths in Motif code + - various fixes for curses mode + +David Firth + - original author of Atari800 + +Stephen Firth + - graphical support for Amiga + +Friedrich Friedrichs + - RPM .spec file + +Ron Fries + - Pokey Sound Emulation library + +Rob Funk + - tidied up emulator abort code + - case insensitive monitor commands + +Piotr Fusik + - general rewrite of ANTIC and GTIA (accuracy and speed improvements) + - changed ANTIC/CPU synchronization + - corrected undocumented 6502 opcodes + - corrected PCX screenshots and added interlaced screenshots + - PNG screenshots + - improved IRQ accuracy + - ATR write protection + - monitor improvements + - loading of .act palette files + - improved disk LEDs + - rewritten executable loader + - UI enhancements + - read-only mode for H: devices + - exact 17-bit and 9-bit polys for sound and RANDOM + - improved emulation of potentiometers + - support for Express, Diamond, SpartaDOS X, XEGS, and other cartridges + - corrected disk formatting + - cassette recorder emulation + - emulation of paddles, Touch Tablet, Koala Pad, Light Pen/Gun, Trak-Ball + and Amiga/ST mice + - util/act2html + - initial cycle-exact GTIA emulation + - 16K, 576K, 1088K RAM machines + - Display List based screen in CURSES ports + - util/benchmark.pl + - loader for Atari BASIC programs + - file format autodetection + - ported DirectX version to MSVC + +Robert Golias + - UI enhancements and DJGPP fixes + - monitor enhancements (esp. line assembler) + - fullscreen in DOS port - 320x240 and 320x480 interlaced graphics + - VESA2 support in DOS + - keyboard and joystick handling, joystick emulated on keyboard + +Mark Grebe + - initial Mac OSX support + - new complete H: device support (with subdirectories) + - Multiple Disk Set support + - new state-file implementation supporting bank-switching cartridges + and disk images + - XEP80 + +Shay Green + - NTSC composite video emulator, based on NewRisingSun's algorithm + +Christian Groessler + - Sega Dreamcast port + - SVGAlib patch for joystick + - BRKHERE command + - missing autorepeat in Atari800 debugger under X11 fixed + - missing XSync calls in X11 + - UI improvements ("Please Wait" message for slow operations) + - improved R: device support (serial/network/both) + +Achim Haertel + - XF551 highspeed transfer emulation + - greatly improved standard cassette loading + - implemented cassette writing + - cassette loading with variable baud rate + - trainer searcher + +Nathan Hartwell + - Win32 fixes + - sethdr perl script + +Cameron Heide + - 16,32-bit X11 SHM support + +Alex Hornby + - Virtual 2600 Emulator the "/dev/dsp" code bases on + +Tom Hunt + - original author of R: device support + +Jakub Husak + - support for SIC! cartridge mapping (wihout the flash programming + feature) + +Gerhard Janka + - cpu_m68k.asm corrections and improvements + - double buffering of screen output + - cpu_m68k.asm massive updates that keep it compatible with cpu.c + +Ed Kaminski + - correction of Antic 4&5 Bug affecting Galactic Chase & Mr. Do + - improved speed of DOS version by syncing with a high resolution timer + - PORTB duplicated special handling of PORTA + +Jari Karppinen + - fixed some warnings and bugs such as "void main()" in joycfg + +Tomasz Krasuski + - various bugfixes + - accurate emulation of NTSC and PAL palettes + - support for color adjustments + - saving of color palettes + - integration of Blargg's video kernel version 0.2.2 + - rewrite of SDL video subsystem + - new options for display adjustments in SDL port + - OpenGL support in SDL + - support for V-Sync in SDL port (only on Windows fullscreen) + - slider widget in basic UI + - autosaving of the configuration file + - Tape Management menu with options for creation of tapes and rewinding + - display tape position during loading/saving + - fixes in tape emulation to support some non-standard tapes + - rewrite of cartridge subsystem to fix savestates and pigyback cartridges + - support OSS 8 KB, OSS 043M, Blizzard 4 KB, AST, Atrax SDX, Turbosoft, + Ultracart, Low bank, and standard 2 & 4 KB cartridge mappings + - rewrite of XEP80 emulation to fix inaccuracies + - automatic searching for OS ROM images based on CRC matching + - rewrite of Select system menu, incl. choosing OS & BASIC revision + - support for RAM amounts other than 16/48 KB in Atari 400/800 + - support for RAM expansions by RC Systems + - emulation of 1200XL and XEGS features + - autodetection of video and sound libraries in configure + +Kuba + - vertical retrace control in DOS port + +Jindrich Kubec + - various corrections and refinements (SIO) + - hours of testing on real Atari800XL + - research on real cartridges + +Jerzy Kut + - MapRAM memory expansion for the XL/XE + +Chris Lam + - RGB values for each Atari colour + +Rich Lawrence + - Atari800Win author + - DCM and ZLIB compressed files support + +Marcin Lewandowski + - Atari800Win PLus maintainer since version 4.0 + - initial implementation of "B" and "LABELS" monitor commands + - fixed incorrectly saved N flag when entering the monitor + - found a memory leak in remez.c + +Paulo Lopes + - windowed mode for Win32 + +maddoxik + - "Make Blank Boot Disk" option added to Disk Management UI + +Cyrus Malek + - patch to make the X11 Backspace key work the same as the Delete key + +Chris Martin + - R: device as Atari850 emulation via network + +Perry McFarlane + - Antic fix in vertical scroll + - complete Antic rewrite (DIRECT_VIDEO approach, but better) + - GTIA enhancements (based on Thomas' code, but using DIRECT_VIDEO) + - Allegro library in DOS port + - colour artifacting + - "digital sound" emulation in DOS port + - complete cycle-exact ANTIC/GTIA emulation + - SDL on MS Windows fixes + - interpolated scanlines (for SDL) + - various SDL fixes (Caps Lock) + - Axlon and Mosaic RAM expansions for Atari400/800 + - support for switching between NTSC and PAL color palettes + - Java port (NestedVM) + - sound improvements: nonlinear mixing, two-tone filter + - emulation of the 1400XL, 1450XLD, MIO and Black Box + - XEP80 emulation by Mark Grebe + - CX85 numeric keypad + - SIO: support for .pro images + - various bugfixes in all areas of Atari800 + - and much much more, including general source clean up in 2.1.0 + +Petr Mojzisek + - rawkey support for svgalib + +Nathan Monson + - fix for handling 6502 V flag during ADC and SBC operations + +Kostas Nakos + - update of the WinCE port + - porting to Smartphone devices + - the whole Android port ("Colleen") + +Krzysztof Nikiel + - SaveINT() fix in state save code + - Linux improvements (new svgalib keyboard input and screen output) + - sound improvements (interpolation, configurable delay, 4 buffers) + - autoconf stuff + - Windows code clean up and DirectX version + +John Oyler + - atari2.svg and atari2.png icons + +Chris Palmer + - spotted incorrect declaration of atari_basic[8129] in pia.c + +Ivo van Poorten + - added X11 window Expose Event + - made hardware registers repeat within their page + - control characters in CURSES version + - Makefile targets for FreeBSD systems + - modification to Curses character attributes handling (for FreeBSD) + - ported emulator to DOS using DJGPP + - IDE support + +Jacek Poplawski + - SDL port of Atari800 + +Erhard Puetz + - reported inaccurate PERCOM emulation + +Matthias Reichl + - POKEY ALLPOT register fix + - The!Cart emulation fixes + - reported quirks in behaviour of XEGS cartridges + +Thomas Richter + - GTIA collisions and third colour of players + - new SIO code with formatting support + - POKEY timers + - ADC/SBC "V" bit bug found and fixed using Frodo 6502 emu source + +Karel Rous (Empty Head) + - rewrote cpu.c to optimized MC68030 assembler + +Benjamin Schreiber +and Alexander Martinez + - SDL keyboard joystick emulation stored in the Atari800 config file + +Daniel Serpell + - SDL keyboard based on Unicode values, more keys emulated correctly + +Neil Ship + - correction to new cartridge code introduced in 0.4.0 + +Ken Sider + - his binary loader has been used by Rich for developing our EXE LOADER + +Petr Stehlik + - project coordinator/manager since v0.8.2 (spring of the 1998) + - added support for Atari Falcon (port itself, sound, kbd, joy) + - added sound, keyboard and joystick support for DOS version + - snailmeter + - various fixes in the SDL version + - Atari800 project web pages at http://atari800.sourceforge.net/ + - RT-Config fixes (per-user and system wide config, Y/N questions) + +Radek Sterba + - added all missing CPU 6502 instructions + - implemented precise timing in Antic and CPU + - fixed PMG registers and implemented PMG flickering + - added full 256 opcodes support to disassembler + - various DOS enhancements + - added emulation of 320 kB memory (Atari320XE) + +Petr Sumbera + - LPTjoy idea and design of the interface + +Tomasz Szymankowski + - Atari800Win PLus author + - "-state" command line option + - sector counter + +Vasyl Tsvirkunov + - WinCE port of Atari800 + - refactored UI (introduced ui_basic.c) + +Steven Tucker +and Wrathchild + - Atarimax cartridges + +B Watson + - mouse support for SDL + - direct mouse support (SDL and X11) + - readline support for the internal monitor (including command history) + - turbo mode + +James Wilkinson + - DirectX joystick support + - various enhancements and bug fixes + +Piotr Wiszowaty + - LPTjoy support for Linux + +Ken Zalewski + - segfault fix in GetKeyCode of atari_x11 + +Marek Zelem + - little improvements in SIO and main sync loop for Unix + - X11 keyboard + - X11 screen (background => faster emulation) + - digital (volume only) sound + - console sound emulation + - disk drive sound emulation + - various fixes + +Marcin Zukowski + - fix in ANTIC, GTIA + - slight monitor improvement + - fix in Atrax cartridge bank switching diff --git a/DOC/ChangeLog b/DOC/ChangeLog new file mode 100644 index 0000000..06c2d70 --- /dev/null +++ b/DOC/ChangeLog @@ -0,0 +1,4890 @@ +** 3.1.0 released on 2014-04-12 + +2014-04-12 Petr Stehlik +* DOC/ChangeLog, DOC/NEWS: updated for new release + +* README.1ST, atari800.spec, DOC/README, atari.h, atari800.man, configure.ac, + util/export: version++ + + +2014-04-05 Tomasz Krasuski +* cfg.c, mxpokeysnd.[ch], pokeysnd.[ch], sound.c, ui.c, configure.ac: Moved the + SYNCHRONIZED_SOUND code made more generic and moved out of mzpokeysnd.c to + pokeysnd.c. Now synchronized sound is supported by both pokey sound engines. + +* colours_pal.c: Minor formatting & constness fixes. + + +2014-03-03 Tomasz Krasuski +* atari.c, atari_basic.c, atari_curses.c, atari_falcon.c, atari_ps2.c, + atari_x11.c, amiga/amiga.c, dos/atari_vga.c, sdl/main.c, + win32/atari_win32.c, win32/main.cpp, atari_wince.c Ensure that Sound_Exit() + is called after config file is saved-on-exit, by moving the call to + Sound_Exit() out of PLATFORM_Exit() and into Atari800_Exit(). Reason: When + SOUND_THIN_API is enabled, autosaving after Sound_Exit would cause the + config file's SOUND_ENABLED entry to always be written as 0. + + +2014-02-27 Tomasz Krasuski +* sdl/init.c, sdl/main.c: Avoid "undefined reference to PLATFORM_Time" linker + error when configured --with-sound=sdl but --with-video != sdl. + +* atari.c: Fixed a bug with keyboard input not working on --with-video=ncurses + --with-audio=oss. On initialisation, Sound_enabled == TRUE but audio output + is not yet initialised. In such situation calling + sound_oss.c->PLATFORM_SoundSetup() would close standard input, thus disabling + keyboard. + + +2014-02-19 Tomasz Krasuski +* cartridge.[ch], ui.c, android/jni/jni.c, atari800.man, DOC/cart.txt, + DOC/USAGE, DOC/CREDITS: With Hias' help - documented behaviour of the XEGS + cartridges more precisely. Also added a different variant of the XEGS 64 KB + cartridge - both variants were manufactured by Atari. + + +2014-01-29 Tomasz Krasuski +* cartridge.[ch], ui.c, android/jni/jni.c, atari800.man, DOC/cart.txt, + DOC/USAGE: Based on description by Hias, added minimal support for the 32 + and 64 MB variants of The!Cart. + +* DOC/cart.txt: Added column that describes state of emulation support of + the cartridge types. Also other fixes. + + +2014-01-26 Tomasz Krasuski +* dos/dos_sb.c: Bring indentation more into line with the apparent standard. + +* dos/sound_dos.c, dos/dos_sb.[ch], configure.ac: Apply SOUND_THIN_API to DOS + sound. Also fix two old bugs: pitch being wrong, and sound not working in + one-shot mode (DSP 1.xx). + +* sound.c, ui.c: Move code that stores current sound settings in Sound_desired + - previously settings were stored only when changed from GUI, but not when + changed from command line params. + + +2014-01-18 Tomasz Krasuski +* ui.c: Fix obvious mistake in System Settings, that lead to buffer overflow. + +* cartridge.c, DOC/cart.txt, DOC/CREDITS: Fixes by Matthias Reichl for + emulation of The!Cart. + + +2013-12-28 Tomasz Krasuski +* atari.c: Make turbo mode considerably faster, by avoiding pointless screen + redraws. + +* sdl/sound.c, sound.c: Fix stereo sound on SDL and -sound/-nosound parameters, + broken when introducing SOUND_THIN_API. + + +2013-12-15 Tomasz Krasuski +* atari.c, util.[ch]: Atari_time and Atari_sleep renamed to Util_* and moved to + util.c module - they are now used externally from atari.c. + +* atari.c, cfg.c, platform.h, sound_oss.c, sound.[ch], ui.c, + javanvm/atari800.java, javanvm/javanvm.h, javanvm/sound.c, sdl/sound.c, + configure.ac, atari800.man, DOC/USAGE: Formerly SDL-specific support for + synchronized sound moved to new module sound.c and made platform-independent. + In effect, created a new thin API for platform-specific audio. Platforms that + support SOUND_THIN_API will have thinner layer of platform-specific sound + code and will support a common set of new functionality: + - ability to build with --enable-synchronized_sound, + - new UI Sound menu options for enabling/disabling sound, setting sample + rate, choosing 8- or 16-bit sound, setting hardwares ound buffer size, and + (with enabled synchronized_sound) setting sound latency, + - saving these new options in config, and setting them from command line + parameters. + Currently SOUND_THIN_API is implemented for SDL, JavaNVM and OSS sound. + + +2013-12-14 Tomasz Krasuski +* javanvm/input.c: Map F12 to Turbo, as in other targets. + + +2013-12-08 Tomasz Krasuski +* binload.c: When no OS patches were enabled, Running of BASIC files would + cause the emulated system to go sraight to Self Test: the calls to + Device_PatchOS() would enable E: patches, but wouldn't disable the OS memory + checks. Calling ESC_UpdatePatches() instead solves the issue. +* afile.c, atari.c, gtia.[ch]: Avoid sending Option and Start keystrokes to a + diagnostic cartridge when coldstarting. +* cartridge.[ch], ui.c, android/jni/jni.c, atari800.man, DOC/cart.txt, + DOC/USAGE: Added support for the 2 MB MegaCart mapping. + + +2013-12-07 Tomasz Krasuski +* cartridge.[ch], atari800.man, DOC/cart.txt: Added support for a small subset + of The!Cart mapping. +* cartridge.[ch]: CARTRIDGE_kb is not modified anywhere, made it const. + + +2013-12-04 Tomasz Krasuski +* cartridge.[ch], ui.c, android/jni/jni.c, atari800.man, DOC/cart.txt, + DOC/USAGE: Added read-only support for the 4 MB Flash MegaCart mapping. + + +2013-12-02 Tomasz Krasuski +* cartridge.[ch], ui.c, android/jni/jni.c, atari800.man, DOC/cart.txt, + DOC/USAGE: Added support for the MegaMax 2 MB cartridge mapping. Developers + of The!Cart confirmed that the CART ID for the 64MB variant is not needed, so + I've reused it. + + +2013-11-23 Tomasz Krasuski +* configure.ac, atari.c, platform.h, atari_ps2.c, sdl/main.c : Minimal cleanup + of platform-specific Sleep/Time routines. + + +2013-11-11 Tomasz Krasuski +* monitor.c: Fixed & updated symbols based on OS & BASIC source listings. + + +2013-11-09 Tomasz Krasuski +* DOC/cart.txt: By request of the developers of The!Cart, reserved two IDs + for this new cartridge type. + + +2013-05-02 Tomasz Krasuski +* DOC/INSTALL: Update NestedVM build manual - it doesn't build with + --enable-ide. + +* javanvm/atari_javanvm.c: Fix overflow of dsp_buffer - could happen on some + systems where JAVANVM_SoundAvailable sometimes returns value larger than + 2*line_buffer_size. + +* DOC/INSTALL, configure.ac, Makefile.in, javanvm/atari_javanvm.[ch], + javanvm/input.[ch], javanvm/javanvm.h, javanvm/main.c, javanvm/sound.c, + javanvm/video.[ch]: Code cleanup - split atari_javanvm.c to separate modules + for video, sound and input. Merge javanvm and javanvm-basic targets into the + default target - NestedVM host is now autodetected. + + +2013-04-28 Tomasz Krasuski +* Makefile.in: Use printf instead of echo -e - more portable (and -e didn't + work on GNU Make 3.81). + + +2013-04-23 Tomasz Krasuski +* artifact.[ch], atari.c, atari800.man, cfg.c, configure.ac, + pal_blending.[ch], ui.c, videomode.[ch], sdl/video_gl.c, sdl/video.sw.c, + sdl/video.c, DOC/USAGE, amiga/makefile, dc/Makefile.dc, + win32/msc/Makefile: New module, artifact.c, which manages settings of all + artifacting modes. Artifacting modes are now stored independently for PAL + and NTSC modes, and set according to the current TV mode setting. + +* sdl/main.c, sdl/video.c: When in monitor, avoid reopening the SDL window + during stepping through code. + + +2013-04-15 Tomasz Krasuski +* colours_pal.[ch], colours.[ch], configure.ac, pal_blending.[ch], platform.h, + ui.c, sdl/palette.[ch], sdl/video_gl.[ch], sdl/video_sw.[ch], sdl.video.[ch]: + Added accurate emulation of PAL delay line (PAL blending). + + +2013-04-08 Tomasz Krasuski +* antic.[ch], gtia.c, ui.c: Improve the existing PAL blending implementation, + which worked only on lines in GTIA mode 9 and was erroneously called + "GTIA11_DELAY". Previously it only blended lines placed below GTIA 11 lines, + now it works on all grasycale pixels. PAL blending now can be switched + on/off - see "Display settings->TV effect" (renamed from "NTSC artifacting + quality", as this option is no longer NTSC-specific). + + +2013-04-07 Tomasz Krasuski +* colours_pal.c: More accurate emulation of PAL colours based on analysis of + oscillograms of PAL GTIA output. + +* cartridge.[ch], ui.c, atari800.man, DOC/cart.txt, DOC/USAGE: Added support + for the cartridge mapping used by "Turbo Hit"/"Atari Blizzard Hit". + +* memory.h: Fix gcc 4.7.2 -Wstrict-aliasing warnings. + +* cartridge.[ch], ui.c, android/jni/jni.c: Avoid compiler warnings by moving + the table of cartridge names to jni.c. The default target doesn't need that + table anyway, it only needs the names. + +* cartridge.c: Fix uninitialised variable which could result in unnecessary + bank switching. + + +2013-03-21 Petr Stehlik +* configure.c, ui.c, atari_rpi.c, gles/video.c: committing new support + for Raspberry Pi made by Andrey Dj + +* DOC/README.RPI, DOC/BUILD.RPI: documentation added + + +** 3.0.0 released on 2013-03-03 + +2013-03-03 Petr Stehlik +* DOC/ChangeLog, DOC/NEWS: updated for new release + +* README.1ST, atari800.spec, DOC/README, atari.h, atari800.man, configure.ac, + util/export: version++ + +* emuos.c, emuos.lis: extended copyleft + +* debian/{chaneglog, control, rules}: updates from the official Debian + package merged with updates for a new release + + +2013-02-09 Tomasz Krasuski +* DOC/INSTALL, DOC/PORTING, DOC/README: Rename the "basic" version to "simple" + in the docs, to avoid confusion with the Atari BASIC and with the "basic" + target - there's no such target anymore. + +* debian/control, DOC/INSTALL, DOC/INSTALL.dos, DOC/INSTALL.falcon, + DOC/README, DOC/readme.html.in, src/atari800.man, atari800.spec, README.1ST: + Update docs to inlcude the 1200XL and the XEGS as emulated systems. + +* DOC/INSTALL.falcon: Update after renaming --disable-sound to --without-sound. + +* DOC/README, DOC/NEWS: Updated with all my contributions since 2.2.1. + + +2013-01-28 Tomasz Krasuski +* src/autogen.sh, src/configure.ac, src/configure_dos.bat: + Rename the "basic" target to "default" and make it the default - the + "--target" configure option can be omitted. Renamed the "--with-gui" + configure option to "--with-video". + +* util/benchmark.pl: + Update to reflect the above changes. Allow passing --with-* options to + configure. + +* atari800.spec: + Update to reflect the above changes. Allow building multiple binaries, each + with a different set of configure options. + +* DOC/README, DOC/INSTALL, DOC/PORTING, debian/rules: + Update to reflect the above changes. + + +2012-10-11 Tomasz Krasuski +* devices.c: Fix the H: read function to return status $03 if the next read + operation would yield EOF. This complies with Atari DOS behaviour and fixes + Turbo BASIC's BLOAD. + +* atari.c, cfg.c, memory.[ch], ui.c, atari800.man, DOC/CREDITS, DOC/README, + DOC/USAGE: Patch by Jerzy Kut with additional fixes. Adds + support for the MapRAM memory enhancement for XL/XE systems. + +* sdl/video_gl.c: Patch by Jerzy Kut . Spelling fix. + + +2012-09-09 Kostas Nakos +* android/*: More UI fine tuning, new dialog for cartridge type selection +* afile.c, cartridge.[ch], ui.c: Moved cartridge types' descriptive text to + a more central (reusable) location, hooked android port when a cartridge + type cannot be detected. + + +2012-09-08 Kostas Nakos +* android/*: UI fine tuning, soft keyboard fix for jelly bean + + +2012-09-05 Tomasz Krasuski +* android/jni/jni.c: Fix ROM selection hack to support the well-known OSB NTSC + ROM bundled with XFormer. That ROM is hacked and therefore it is not + recognised as SYSROM_B_NTSC, but as SYSROM_800_CUSTOM. + + +2012-09-04 Kostas Nakos +* android/*: Natively support UI on post-Honeycomb devices + + +2011-08-27 James Wilkinson +* config.guess: Detect Haiku as x86 BeOS. + + +2012-08-05 Tomasz Krasuski +* sysrom.c: Fixed CRC32 of the CC01r4 OS ROM - the previous one was for a + binary that I've myself incorrectly-assembled from sources. + + +2012-07-29 Kostas Nakos +* android/*: Update project to newer android sdk (jelly bean - 4.1), + Fine tuning of the B: device handling, + Fix audio stuttering on jelly bean, + Fix keymap preference crash on jelly bean, + Fix keyboard mapping dialog on jelly bean + + +2012-07-21 Tomasz Krasuski +* DOC/CREDITS: Fix alphabetical order. Update my own contributions. + + +2012-06-02 Kostas Nakos +* android/*: Small tweaks to the touchscreen mode +* afile.c, cartridge.c: Temporary fix for non auto-detected cartridges, until + the implementation of a proper menu + + +2012-05-20 Kostas Nakos +* android/*: Implement Planetary Defense mode, a Koala Pad click-where-I-point + mode +* devices.[ch], esc.h, android/*: Implement the B: device in the core and + android port + + +2012-05-19 Tomasz Krasuski +* cartridge.[ch], ui.c, atari800.man, DOC/cart.txt, DOC/USAGE: Support for + 2 KB and 4 KB ROMs used in early Atari cartridges. + +* configure.ac, platform.h, atari.c, ui_basic.c, ui.[ch], sdl/init.[ch], + sdl/main.c, sdl/sound.c, debian/rules, util/benchmark.pl, DOC/INSTALL: Merge + basic and sdl targets - GUI and sound libraries are now autodetected or + explicitely selected by --with-gui and --with-sound configure options. + +* configure_dos.bat: Fix the dosvga and basic targets being merged. + + +2012-05-16 Tomasz Krasuski +* cartridge.[ch], ui.c, atari800.man, DOC/cart.txt, DOC/CREDITS, DOC/USAGE: + Committing patch by Jakub Husak: Support for the SIC! cartridge mapping + (without the flash programming feature). + + +2012-05-04 Tomasz Krasuski +* configure.ac, util/benchmark.pl: Merge basic, curses, ncurses, pdcurses and + dosvga targets - appropriate GUI/input library is now autodetected or + selected explicitely by --with-gui configure option. + +* ui.c: Fix segfault in the ROM Locations menu. + +* atari_basic.c: Fix some GCC warnings. + + +2012-05-01 Tomasz Krasuski +* devices.c, ide_internal.h, input.c, log.c, pbi_scsi.c, sio.c, ui.c, util.h, + dos/dos_ints.h: Fix some GCC warnings. + + +2012-04-22 Tomasz Krasuski +* colours.[ch], colours_ntsc.[ch], colours_pal.[ch], ui.c, sdl/input.c, + atari800.man, DOC/USAGE: More exact emulation of PAL colors, including + colour delay - based on Altirra but with different table coeffitients, + derived from a real machine. Colour delay values for NTSC rescaled to + simplify the code. + + +2012-04-21 Tomasz Krasuski +* sdl/input.c: Make the display adjustment keyboard shortcuts work by pressing + and holding - no more need to press the keys repeatedly. + +* colours_ntsc.[ch], colurs_pal.c, colours.[ch], filter_ntsc.c, ui.c, + sdl/input.c, atari800.man, DOS/USAGE: Rename color control "Hue" to "Tint". + Add tint control also for PAL mode, as there are PAL TVs with tint control. + + +2012-03-31 Tomasz Krasuski +* cartridge.[ch], ui.c, atari800.man, DOC/cart.txt, DOC/USAGE: Added support + for the cartridge mapping used by "Monkey Wrench II for the Atari XL". + + +2012-03-29 Tomasz Krasuski +* cartridge.[ch], ui.c, atari800.man, DOC/cart.txt: Renamed MicroCalc + cartridge mapping to Ultracart - that's the name printed at the cartridge's + PCB. + + +2012-03-26 Tomasz Krasuski +* cartridge.[ch], ui.c, atari800.man, DOC/cart.txt, DOC/USAGE: Added support + for the MicroCalc cartridge mapping. + + +2012-03-24 Tomasz Krasuski +* atari.c, cfg.c, memory.[ch], ui.c: Simplify Axlon RAM code. Fix bug with + Axlon and Mosaic RAM switching to home bank on state read. Add option to + control Axlon RAM settings in GUI. Save Axlon RAM settings in config. + + +2012-03-23 Tomasz Krasuski +* atari.[ch], cfg.c, ui.c: Fixed 1200XL jumper emulation - the machine has + only one onboard jumper, not four. + +* atari.c, cfg.c, memory.[ch], ui.c: Simplify Mosaic RAM code. Add option to + control Mosaic RAM settings in GUI. Save Mosaic RAM setting in config. + + +2012-03-18 Tomasz Krasuski +* atari.c, emuos.[ch], memory.c, Makefile.in, android/jni/Amdroid.mk.in, + dc/Makefile.dc, win32/msc/Makefile: Always take UI font from EMUOS - fixes + missing font when running the emulator in 5200 mode without configured OS + ROMs. + +* atari.[ch], cartridge.c, cfg.c, devices.c, esc.c, input.c, memory.c, pia.c, + screen.c, sysrom.c, ui_basic.c, ui.c, sdl/input.c, android/jni/jni.c, + atari800.man, DOC/USAGE: + Reworked support for machine types. All XL/XE features can be enabled/ + disabled independently. UI menu "Select System" renamed to "System Settings" + and reworked - now it only lists systems manufactured originally, with + additional options for configuration. + +* devices.c, esc.c, sysrom.[ch], ui.c, atari800.man, DOC/USAGE: Support OS + revisions from the Arabic 65XE and prototype XL machines. + + +2012-03-11 Tomasz Krasuski +* pia.c: Fix recently-introduced bug with MEMORY_cartA0BF_enabled being saved + twice in savestates - in both memory.c and pia.c. + +* af80.c, cassette.c, devices.c, log.c, monitor.c, pbi_bb.c, pbi_mio.c, + pbi_proto80.c, pbi_xld.c, sysrom.c, ui.c, xep80.c, wince/port/missing.c: + Remove initialisation of local-static and global arrays to "", to prevent + them ending up in .data segment instead of .bss on some architectures/ + compilers (android-arm). The C standard requires them to be initialised with + zeroes at runtime, so initialisation with "" is not needed. + + +2012-03-10 Kostas Nakos +* android/*: Rename android port to Colleen + + +2012-03-08 Tomasz Krasuski +* atari.[ch], cfg.c, input.c, memory.[ch], sysrom.[ch], ui.c, atari800.man, + DOC/USAGE: Add emulation of the XEGS (builtin game, detachable keyboard). + +* atari.[ch], cfg.c, input.c, ui.c: Add emulation of 1200XL option jumpers, + as described in Atari XL Addendum section 3.8. + +* ui.c: Emulate 32KB and 48KB memory expansions for the 600XL manufactured by + RC Systems. + + +2012-03-05 Tomasz Krasuski +* memory.c, pia.[ch], statesav.c: Fix 2 errors related to separate access + of CPU and ANTIC to XE RAM: + - Self-Test should be visible also in the bank seen by ANTIC. + - When saving/loading a savestate in which only ANTIC has access to XE RAM, + XE bank number was not saved/loaded correctly. To fix this, loading/saving + of MEMORY_xe_bank had to be moved from PIA_StateRead to MEMORY_StateRead; so + I also moved a few other variables in those functions to where they belong. + +* atari.[ch], cartridge.c, cfg.c, devices.c, esc.c, input.c, memory.c, pia.c, + screen.[ch], sysrom.[ch], ui_basic.c, ui.c, atari800.man, DOC/USAGE: Add + emulation of the 1200XL (no builtin BASIC, LEDs overlayed on screen, 2 new + XL OS revisions). The System ROM Settings menu ceased to fit on one screen, + so it is split into submenus. + +* sdl/input.c: When in 1200XL mode, map arrows to F1-F4 keys. + +* atari.[ch], cartridge.c, devices.c, esc.c, input.c, memory.c, pia.c, + screen.c, ui.c, sdl/input.c, android/jni/jni.c: Replace most of the + "if Atari800_machine_type ==" statements with references to + Atari800_features - the code was starting to be too convoluted. + + +2012-02-23 Tomasz Krasuski +* cfg.c, memory.[ch], ui.c: Allow choosing more RAM amounts for 400/800, based + on possible combinations of CX852 and CX853 memory modules. Extending the + list of available systems in "Select System" menu to include all new RAM + sizes would be impractical, so a new option "RAM size" was added instead. + +* atari.[ch], memory.c, pia.c, statesav.c: Support for saving new RAM sizes + (and the old 52kb size, too) in save states. reading/saving MEMORY_ram_size + moved to memory.c, where it belongs; storing RAM size as two separate values + (base RAM, XE banks) to make it more future-proof. Fixed the "feature" of + saving of unused 192kb. + +* statesav.c: Fix old bug that allowed loading of save states with version + number higher than current. + + +2012-02-19 Tomasz Krasuski +* atari.[ch], devices.c, esc.c, sysrom.[ch]: Make OS patches work depending on + OS version. Now patches work correctly also with Rev. A PAL and Rev. 1 + (600XL). + +2012-02-16 Tomasz Krasuski +* atari.[ch], cartridge.c, cfg.c, devices.c, esc.c, memory.[ch], sysrom.[ch], + ui_basic.c, ui.c, android/jni/jni.c: Merge Atari800_MACHINE_OSA and + Atari800_MACHINE_OSB into Atari800_MACHINE_800 - no need for separate machine + types since OS revision can now be selected. + +* sysrom.c, atari800.man, DOC/USAGE: Support choosing OS revision from command + line. + + +2012-02-10 Tomasz Krasuski +* atari.c, cfg.[ch], crc32.[ch], sysrom.[ch], ui.c, Makefile.in, + dc/Makefile.dc, win32/msc/Makefile, android/jni/jni.c, + android/jni/Android.mk.in: Two new modules (crc32, sysrom) that add a new + functionality of searching for OS/BASIC ROM images based on known CRC32 + hashes. Added possibility to select an OS/BASIC version when many are + available ("Select System"). When switching between PAL/NTSC, NTSC or PAL + version of OS Rev. A is selected accordingly. + Android port updated to work correctly (OS/BASIC version selection is still + missing though). + + +2012-01-27 Tomasz Krasuski +* xep80.c: Rename SetCursor to SetCursorMode to avoid conflict with a winuser.h + function under MinGW. + + +2012-01-19 Tomasz Krasuski +* xep80_fonts.c, xep80.[ch], videomode.c: Rewtritten XEP80 emulation, based on + disassembly of the XEP80 ROM. Programs such as EIGHTY.BAS from XEP80 System + Diskette, or XEPLIST2.BAS from ANTIC Oct/1988, now work correctly. + +* videomode.c: Added authenthic aspect ratio for XEP80. Fixed issue with + 1x, 2x, 3x, and "custom" stretch settings - for all videomodes except NORMAL + the screen would stretch twice the amount it should. + + +2012-01-12 Kostas Nakos +* android/*: Implement state saving, fix a keymap preference corner case + + +2012-01-08 Tomasz Krasuski +* antic.c: Fix accuracy of ANTIC_CPU_CLOCK when NEW_CYCLE_EXACT is enabled. + +* monitor.c: Fix accuracy of cycle counts (when displaying the current state) + when NEX_CYCLE_EXACT is enabled. + +* xep80.c: Fix (and simplify) the code for I/O timing - it was not resistant + to random data appearing in PORTA, which resulted in XEP80 going haywire + after coldstart. The change breaks binary compatibility of savestates. + Standardise indentation (tabs instead of spaces). + Remove the XEP80_ prefix from names of static entities. + + +2012-01-07 Tomasz Krasuski +* sdl/input.c: No need to call SDL_GetKeyState() on each frame - moved the + call to SDL_INPUT_Initialise(). + +* xep80.[ch]: Removed variables XEP80_first_row, XEP80_last_row - not used + anywhere. + +* cfg.c, xep80_fonts.[ch], xep80.[ch]: Load XEP80 fonts from a ROM image + instead of storing them in the source file (ROM path stored in config). + Generate the XEP80 block font algorithmically instead of storing it in the + source file. + +* ui.c, videomode.[ch], xep80.[ch], atari800.man, DOC/USAGE, sdl/video_gl.c: + Support XEP80's ability to switch the TV system by software. After the + changes, the maximum height of the screen is 300 lines. + +* sdl/video.c: Fix a glitch that appeared during XEP80 initialisation. + +* ui.c: Add option to enable/disable XEP80 to the Emulator Settings menu. + + +2012-01-07 Kostas Nakos +* android/*: Optimize file selector, allow roaming outside of ext. storage dir + Added an exclusion border for paddle mode + + +2011-12-22 Tomasz Krasuski +* android/jni/Android.mk.in, dc/Makefile.dc, win32/msc/Makefile: Add missing + object img_tape.o to platform-specific Makefiles to make them work again + (see Makefile.in revision 1.52). + + +2011-11-29 Tomasz Krasuski +* cassette.c: Remove excessive logging, committed by mistake yesterday. + + +2011-11-28 Tomasz Krasuski +* cassette.c: Fix segfault when the -tape parameter points to a nonexistent + file. + + +2011-11-16 Tomasz Krasuski +* atari_falcon.c, sound_falcon.c, falcon/sound_dma.S: Fix Falcon compilation + errors with MiNTLib 0.59.1 and GCC 4.6.2 (still works with GCC 2.95.3 as + tested under SpareMiNT). + +* atari_basic.c, atari_curses.c, atari_falcon.c, atari_ps2.c, atari_x11.c, + sound_falcon.c, sound_oss.c, sound.h, android/jni/sound.c, dos/atari_vga.c, + dos/sound_dos.c, sdl/main.c, sdl/sound.[ch], win32/atari_win32.c, + win32/sound.c, wince/port/atari_wince.c, wince/port/sound.c: Make + Sound_Initialise fail gracefully instead of segfaulting when an option + argument is missing. Do not initialise sound unnecessarily when the "-help" + option is given. + +* antic.c, atari_curses.c, atari.c, platform.h, ui_basic.c, ui.c: Cleanup: + gather all declarations of curses_* functions together in platform.h. + +* atari.c, configure.ac, devices.c, log.c, monitor.c, screen.c, sio.c, + sound_oss.c, ui_basic.c, ui.c: Cleanup to make the ncurses target build with + more restrictive CFLAGS (same as the sdl target). + + +2011-11-11 Tomasz Krasuski +* af80.[ch], atari.c, cartridge.[ch], devices.[ch], ide.[ch], input.c, + pbi_bb.[ch], pbi_mio.[ch], pbi_proto80.[ch], pbi_xld.[ch], pbi.[ch], + sdl/video.c: Add or fix Exit functions for files/resources that were not + _explicitely_ closed/freed on exit. + Add call to Atari800_ErrExit also when commandline-parsing fails. + Previously when starting the dosvga target with "atari800 -artif", + the emulator would exit without uninitialising VGA, leaving mess on screen. + +* amiga/amiga.c, dc/atari_dc.c: Fix Platform_Initialise() not returning + a value. + + +2011-11-04 Tomasz Krasuski +* monitor.c: Fix a memory leak - buffer allocated by readline() should be + freed by user. + +* configure.ac: Clean-up of SDL detection - restore the "Don't redefine main" + snippet that got mistakenly deleted in revisions 1.108-1.109. + +* configure.ac, Makefile.in, DOC/README.android: Cleanup in detection of + libreadline and OpenGL: + Renamed options --enable-monitor-readline and --enable-opengl to + --with-readline and --with-opengl, respectively - Autoconf manual recommends + the --with prefix for options requiring external software. + Since the AC_CHECK_HEADER (used in OpenGL detection) requires proper setting + of CPPFLAGS, rudimentary support for this variable has been added. + +* sdl/video_gl.c: Fix wrong definition of "black" colour for the BGRA32 pixel + format, which caused a visible blue border around the screen with bilinear + filtering and stretch >= 2. + + +2011-10-27 Tomasz Krasuski +* afile.c, cassette.[ch], img_tape.[ch], screen.c, ui.c, Makefile.in: + Cassette-related code cleanup - functionality related to handling of + tape image files split from afile.c and cassette.c to new module img_tape. + Functional changes: During cassette insert the old tape is not unmounted + until opening of the new tape ended successfully; Added error message when + tape opening fails with the -tape command parameter. + + +2011-09-05 Tomasz Krasuski +* DOC/cart.txt, DOC/USAGE, atari800.man, cartridge.[ch], ui.c: Added support + for Atrax SDX 64/128K cartridge mapping and for the Turbosoft 64/128 + cartridge mappings. + +* cartridge.c: Fixed a bug in OSS 034M/043M mappings - the area filled by $FF + should be $A000-$AFF instead of $8000-$9FFF. + + +2011-09-04 Kostas Nakos +* android/*: Added paddle emulation + + +2011-09-03 Tomasz Krasuski +* monitor.c: Code cleanup - split MONITOR_Run() into separate functions for + each monitor command. Functionality unchanged. + +* af80.[ch], antic.[ch], cartridge.[ch], cpu.c, gtia.[ch], ide.[ch], + memory.[ch], monitor.c, pbi_bb.[ch], pbi_mio.[ch], pbi_proto80.[ch], + pbi.[ch], pia.[ch], pokey.[ch]: Added option of reading hardware memory + without side effects. Used this in the, monitor so now eg. the "M" option + doesn't switch cartridge banks while displaying page $D5. Fixed the + monitor's "disassemble" functionality - it didn't correctly disassemble code + in hardware memory. + + +2011-09-02 Tomasz Krasuski +* sdl/input.c: Swapped mapping of right and middle mouse buttons, to make it + identical to the X11 and Win32 ports. + + +2011-08-24 Tomasz Krasuski +* cartridge.[ch], ui.c, atari800.man, DOC/cart.txt, DOC/USAGE: Added support + for a 32 KB cartridge format used by Atari Super Turbo Multi-Cartridge. + +* cfg.c, rtime.[ch]: Support for saving the state of R-Time 8 in config file. + +* atari800.man: Improve formatting (bold, italic etc.), mainly according to + man-pages(7). + + +2011-08-06 Tomasz Krasuski +* afile.c: Fixed compilation errors for --target=basic introduced on + 2011-06-27. + + +2011-08-05 Tomasz Krasuski +* DOS/cart.txt, DOC/USAGE, cartridge.[ch], ui.c: Added support for the + Blizzard-type 4KB cartridge (which contains a 2732 EPROM inside). + + +2011-07-23 Kostas Nakos +* atari.c: Use FPS defines in autoframeskip +* android/*: Fix a nasty bug, when orientation was changed during the + preferences activity, + added shadow rectangle around console keys overlay + + +2011-07-02 Tomasz Krasuski +* cartridge.[ch], ui.c, atari800.man, DOC/cart.txt, DOC/USAGE: Added support + for the OSS 043M cartridge format. The old 034M format is marked as obsolete + but still supported. Renamed the OSS cartridge formats to include + information on number of ROM chips (043M/034M - two chip, M091 - one chip). + + +2011-06-27 Tomasz Krasuski +* cassette.c: Fixed a bug with eof_of_tape not always being set to 1 when it + should be, f.e. after a call to CASSETTE_Seek(). When the SIO patch was + enabled and the tape was Seek'ed past the last block, this could result in + a call to CASSETTE_IOLineStatus() while CASSETTE_current_block was higher + than CASSETTE_max_block. This in turn would cause division by 0 (due to + reading an uninitialilsed value from cassette_baudblock). + Now eof_of_tape is set properly after every change of either + CASSETTE_current_block or CASSETTE_max_block, so a dangerous call to + CASSETTE_IOLineStatus doesn't happen anymore. + +* cartridge.c: Fixed a bug introduced in rev. 1.48: CARTRIDGE_StateRead would + try to read the cartridge's bank state even if the cartridge was not + present; thus the whole state reading would fail. + +* afile.c: Support selecting cartridge type when loading a cartridge by Alt+R. + + +2011-06-21 Tomasz Krasuski +* ui.c: Fixed a segfault when opening the "Fullscreen resolution" submenu. + This was caused by the change in ui.h on 06-20. (reported by Krzysztof + Karkosza) + + +2011-06-20 Tomasz Krasuski +* sdl/input.c: Fixed a bug with F10 creating interlaced screenshots instead of + non-interlaced. + +* cartridge.[ch], ui.c, atari800.man, DOC/USAGE: Ported from Atari800WinPLus - + an option for enabling/disabling automatic reboot when the cartridge is + inserted or removed. (Only applies to the main cartridge. After inserting or + removing a piggyback cartridge, it works as earlier - ie. the system will + not reboot automatically.) + +* ui.h, ui_basic.c: Reworked detection of menu end (UI_MENU_END). The + previous solution stopped working correctly since in the CartManagement menu + there are hidden menuitems with the "item" field set to NULL which would be + incorrectly detected as end of menu. + + +2011-06-17 Tomasz Krasuski +* cartridge.c, DOC/cart.txt: Reverted the last change in the 034M mapping + regarding switched banks 1 and 2 - on second thought, applying such change + to a years-old specification without proper discussion is not a good idea. + + +2011-06-16 Tomasz Krasuski +*cartridge.c, DOC/cart.txt: Fixed an ages-old bug in the OSS 034M cartridge + banking scheme. Banks 1 and 2 were switched, which caused all known OSS + 034M dumps to fail. (There actually are only 3 known images of 034M + cartridges: + Action! 3.5: http://ftp.pigwa.net/stuff/collections/atari_forever/ROM/ACTION.OSS/ACTION.OSS + BASIC XL 1.02: http://ftp.pigwa.net/stuff/collections/atari_forever/ROM/BASICXL.OSS/BXL102.OSS + MAC/65 1.0: http://ftp.pigwa.net/stuff/collections/atari_forever/ROM/MAC65.OSS/MAC65.OSS + All failed to work before this fix.) + Additionally the combinations $D5x1 and $D5x5 were incorrectly described as + working - I've changed it to more closely reflect the reality (the + combinations cause selection of 2 banks simultaneously - but it's still not + emulated 100% exactly). + +* cartridge.[ch], atari.c, ui.c: Moved the logic that auto-switches machine + type after insertion of a cartridge. Now it resides in cartridge.c, where it + belongs. Introduced new function CARTRIDGE_SetType, that should be used to + change the cartridge's type. CARTRIDGE_IsFor5200 and CARTRIDGE_Start are not + used outside cartridge.c anymore, so I renamed them and made static. + + +2011-06-13 Tomasz Krasuski +* cartridge.[ch]: Major rewrite, required to fix bugs in piggyback cartridge + emulation and with writing/reading savestates with banked cartridges. + 1. SDX piggyback emulation was broken and apparently written without knowing + the cartridge's specs - the SDX cart only reacts to access to address + $D5Ex (also $D5Fx in case of the 128K version). + 2. A piggyback cartridge reacts to access to page $D5 even if it is disabled + by the SDX cart. So when processing a read/write to page $D5 both mounted + cartridges must be bank-switched. + 3. A cartridge reacts to page $D5 even if there's an R-Time or + IDE hardware installed. + 3. In savestates the bankswitched cartridge's current state was not stored, + and in some cases such savestates didn't work properly when loaded. + 4. Overall code cleanup - introduced the CARTRIDGE_image_t structure for + clarity. + +* gtia.[ch], statesav.c, cartridge.[ch] (CARTRIDGE_StateRead) + (CARTRIDGE_StateSave): GTIA needs to store its trigger latches in the + savestate in order to properly restore after loading a savestate with + a banked cartridge. Banked cartridge's current state must also be stored in + a savestate. Both changes require bumping up the savestate version number. + +* atari.c, ui.c: Apply the new API of cartridge.h. + +* DOC/cart.txt: Update the SpartaDOS X sections with info about piggyback + cartridges. + +* atari.c, cartridge.[ch] (CARTRIDGE_Initialise): Move code for processing + cartridge-related commandline optins to cartridge.c. + +* cartridge.c, atari800.man, DOC/USAGE: Add -cart-type and -cart2-type + options, that allow to choose cartridge type from commandline. + +* cartridge.c (CARTRIDGE_ReadConfig, CARTRIDGE_WriteConfig), cfg.c: Support + loading and saving of the cartridge settings in the config file. + +* cartridge.[ch], ui.c, atari800.man, DOC/cart.txt DOC/USAGE: Add support for + the OSS The Writer's Tool cartridge mapping. + + +2011-06-08 Tomasz Krasuski +* ui_basic.c: Allow opening up the file selector when the given PATH is + invalid. When a diskette image is mounted, its path is cached in the + emulator. If, in the meantime, the path to that file have become invalid + (e.g. the directory in which the file resided have been deleted), then + reopening the file selector for that particular diskette would have failed. + +* cartridge.c: Unify duplicate code in CARTRIDGE_Insert and + CARTRIDGE_Insert_Second. + + +2011-06-05 Kostas Nakos +* android/*: Implement extended key remapping, + Support Xperia play keycodes, + Remap dpad enter to break, + New NTSC/PAL tv mode preference + + +2011-05-22 Tomasz Krasuski +* DOC/USAGE, atari800.man, cassette.[ch], ui.c: Add an option for making the + attached cassette image read-only. + +* cassette.[ch]: Cleanup - rearrange function order to place the functions + related to the SIO patch together at the bottom of the files. + +* cartridge.[ch], ui.c: Merge "Insert Cartridge"/"Remove Cartridge" menu + options into one, to make it consistent with other file-selectors in the + menu (ie. display filename, Enter=Insert, BkSp=Remove). Ditto for the + "Insert|Remove SDX Piggyback Cartridge" options. + +* ui.c: Don't leave the "Cartridge Management" menu after inserting/removing + a cartridge. The behaviour was inconsistent with other menus. + +* screen.c: Minor fix - missing "else" in Screen_Initialise(). + + +2011-05-21 Tomasz Krasuski +* sio.c: Fixed a bug with SIO sounds remaining audible after saving to tape + with SIO patch (reported by Krzysztof Karkosza). + +* atari.c: During coldstart, don't automatically hold Option on non-XL/XE + machines. This fixes unwanted keystrokes when running cartridges on 400/800 + with the "Disable Basic" option. Also, don't hold Start on booting the 5200. + +* memory.c: Bugfix: When "Selecting System" and choosing 800/48KB RAM twice + in a row, BASIC would get disabled even if the "Disable BASIC" option was + set to "No". This was caused by missing initialisation of cartridge memory + in MEMORY_InitialiseMachine(). + + +2011-05-18 Tomasz Krasuski +* cassette.c: Fixed a bug with CASSETTE_description not being properly ended + with '\0' when tape is inserted (reported by Achim Haertel). + + +2011-05-15 Tomasz Krasuski +* cassette.[ch], pokey.c, sio.c: Improve cassette emulation, to allow loading + some non-standard tapes (e.g. Feud/Turbo 2600, Miecze Valdgira II, + Operation Blood). + Emulation of SERIN was inaccurate - new byte appeared in SERIN only if the + serial input IRQ was enabled, and it happened 2 scanlines after the byte's + transmission has _started_. On a real machine, a byte appears in + SERIN at the same time the serial input IRQ is generated, that is, when + the byte's transmission _ends_; and it happens even when the IRQ is + disabled. The bug caused issues with tapes of _certain_ baudrates (e.g. 577 + baud). + Changed the way cassette IRQ is invoked - there is no notion of + "cassette IRQ delay" anymore. Instead, CASSETTE_AddScanLine returns TRUE + on SERIN update. + Added partial emulation of SKCTL reset bits - due to improved SERIN + accuracy proper emulation of serial IO resetting is now needed to load tapes + correctly. + + +2011-05-09 Tomasz Krasuski +* pia.c: Fixed a bug with PIA's tape motor state and COMMAND line state not + being restored on loading of a savestate. + +* screen.c: Display SIO activity for tapes only when a tape image is attached. + +* cassette.[ch], sio.c: Fixed a segfault when reading tape blocks longer than + 4096 bytes, by dynamically allocationg memory when needed. Blocks loaded + with SIO patch are now copied to Atari memory even when they are too short + or the checksum is wrong - this duplicates the behaviour of the unpatched + system. CASSETTE_buffer no longer used outside cassette.c, so it's made + static. + + +2011-05-08 Tomasz Krasuski +* atari.c, cassette.[ch], cfg.c, screen.c, sio.c, ui.c: Added support for + switching bettween tape loading/saving without need to re-attach a tape + image. Added a "Tape management" menu with new options for tape rewinding + and creating a blank CAS image. Added loading/saving of the currently + attached tape image in the config file. Without the SIO patch, a user now + must manually switch tape recording on/off if needed. Fixed some bugs and + cleaned the code a bit. + +* DOC/directx.txt, atari_curses.c, atari_falcon.c, atari_ps2.c, + dos/atari_vga.c, javanvm/atari_javanvm.c, sdl/input.c, win32/atari_win32.c: + Added the Alt+T shortcut to the new Tape Management menu. The "tilt screen" + in the Win32 port has been remapped to Alt+Shift+Z to avoid conflict. + +* DOC/USAGE: Updated the "Cassette operation" section with the new features. + +* screen.c: Added displaying of current tape position when sector counter is + enabled. Display a "Dn" symbol instead of "n" during disk operations. + +* ui.c: Renamed the "Show disk activity" and "Show sector counter" options to + reflect the fact that they also affect tape operations. + + +2011-05-05 Petr Stehlik +* atari800.spec: David Bolt has provided an update that allows building + the RPM packages for Fedora, CentOS, SUSE and Mandriva distributions. + + +2011-04-30 Tomasz Krasuski +* videomode.c: Fixed a bug with not allowing a VIDEOMODE_HOST_ASPECT_RATIO=0:0 + entry in the config file. Now when this value is encountered, the emulator + performs aspect ratio autodetection. + +* DOC/USAGE, atari800.man, atari.[ch], atari_curses.c, cfg.[ch], colours.c, + input.c, ui.c, util.c, sdl/sound.c: Added support for automatic saving of + configuration on emulator exit. (Had to move the System ROM Settings to + a separate submenu in UI in order to make place for the new option.) + Autosaving is performed only when a user closed the emulator, and not when + the emulator closed itself eg. due to failure. For exiting an emulator due + to error, a new function Atari800_ErrExit() is provided. This function works + like Atari800_Exit but omits the autosaving. + + +** 2.2.1 released on 2011-04-28 + +2011-04-28 Petr Stehlik +* configure.ac: generalization for sound configuration + +* ui.c, videomode.c, sdl/input.c: slight optimization for snprintf() + +* monitor.c, rdevice.c, screen.[ch], sio.c, ui.c, ui_basic.c, util.c, + videomode.c: replace unsafe sprintf() with snprintf() + +* sdl/input.c: fix for over-optimized LPT TRIG, sprintf() removed + +* README.1ST, atari800.spec, DOC/README, DOC/NEWS, atari.h, util/export: + updated for a new release + + +2011-04-27 Petr Stehlik +* DOC/ChangeLog: blank lines added, "src/" from filenames removed + +* ide.c: fixes for IDE emulation from Ivo - fix for + 8-bit mode with an odd number of reads and adds a command line option + for enabling CF mode (slightly different from normal HD mode) + +* configure.ac: fixes non-SDL sound (example: X11 target) for Linux and BeOS + and also adds support for SDL sound on Falcon and other platforms + (like for example *BSD, which should fix the Debian Atari800 package) + +* debian/*: updated for a new release, dropping non-SDL binary packages. + + +2011-04-23 Kostas Nakos +* android/*: Speed up fileselector on orientation update & bugfix mount/insert + + +2011-04-22 Tomasz Krasuski +* sdl/input.c: Allow using SDL/LPT joysticks together with keyboard + joysticks. Previously if a user had a joystick connected, keyboard + joysticks were ignored. + +* sdl/video.c, sdl/video_gl.c: Rework the resolution of the segfault + when switching between software<->OpenGL in Windows - now it always + reinitialises the video subsystem. The previous solution would later cause + glitches when rapidly resizing the OpenGL window. + +* sdl/main.c, sdl/input.c: Delay processing of repeated window resize + requests on Windows to avoid a bug in SDL. + + +2011-04-18 Tomasz Krasuski +* ui_basic.c: Fix division by 0 in the slider control. + +* configure.ac: Fix recently-introduced issue with building SDL/Windows - + adding SDL flags to CFLAGS must be done after all AC_CHECK_FUNCS tests but + before the OpenGL check. + +* sdl/main.c: Fix Windows/SDL crash when the console window is closed by + user, by servicing console-sourced signals. The crash was due to the audio + subsystem not being closed properly. + +* atari.c, sdl/main.c, sdl/video.[ch], sdl/video_gl.c, sdl/video_sw.[ch]: + On Windows use the DirectX backend only in fullscreen (supports VSync) and + Windib otherwise (DirectX backend is glitchy in windowed modes). + +* ui.c: Use the slider control in the "Scanlines visibility" menu option; + improve several option names. + +* cfg.c, screen.[ch]: Store the "Show speed", "Show disk activity" and + "Show sector counter" settings in config file. + + +2011-04-13 Tomasz Krasuski +* atari.c: Fix bug introduced at 04-09 with atari.c not compiling when + HAVE_SIGNAL is not defined. + +* DOS/INSTALL, configure.ac, aclocal.m4: Detect presence of SDL + using the standard m4 script provided by SDL. New configure options are + available: --disable-sdltest, --with-sdl-prefix and --with-sdl-exec-prefix. + +* sdl/video.c, sdl/video_gl.c: Fix misuse of SDL - setting pointers + to OpenGL functions must be performed after each call to SDL_SetVideoMode. + Fix a bug with screen_texture not always being freed when needed. + Make OpenGL log messages slimmer and let them appear only when initialising + OpenGL. + + +2011-04-09 Tomasz Krasuski +* DOC/USAGE, atari800.man, ui.c, atari_ntsc/atari_ntsc.[ch], + sdl/palette.[ch], sdl/video.[ch], sdl/video_gl.[ch], + sdl/video_sw.[ch]: Add option for setting pixel (texture) format + in OpenGL mode - depending on graphics hardware, different formats give + the best performance. the BPP parameter is now only for software modes. + Also fix a bug with bit depth autodetection not working (in Windows BPP + autotetection works only before the first call to SDL_SetVideoMode), and use + the SDL 8-bit palettised video mode properly. + +* DOC/USAGE, atari800.man, ui.c, sdl/video.[ch], + sdl/video_gl.[ch], sdl/video_sw.c: Add option for enabling + synchronization with vertical retrace - for SDL fullscreen non-OpenGL modes. + +* DOC/USAGE, atari800.man, ui.c, sdl/video_gl.[ch]: + Add option for disabling OpenGL Pixel Buffer Objects - on some hardware they + decrease performance. + +* DOC/USAGE, atari800.man, ui.c, videomode.[ch]: + Add option for automatic detection of host screen aspect ratio. + +* DOC/USAGE, atari800.man, ui.c, videomode.[ch], sdl/video.c: + Rename several options to more intuitive names - in command line and in GUI: + -horiz-offset -> -horiz-shift, -vert-offset -> -vert-shift, + -stretch integer -> -stretch integral, + -keep-aspect 1to1 -> image-aspect square-pixels, + -[no]-opengl -> -[no]-video-accel + +* ui.c: Reorder the Video Mode Settings menu, for better usability. + Use the slider control for video area/shift options. + +* sdl/video_gl.c, sdl/video_sw.c: Call SDL_SetVideoMode() and display + ModeInfo only when necessary. + +* DOC/USAGE, atari800.man, videomode.c, sdl/video.c: Other fixes + in help/documentation. + +* sdl/main.c, sdl/video.[ch], sdl/video_gl.[ch], sdl/video_sw.c: + Try to reinitialise the SDL video subsystem after an error before failing. + This allows to recover from some hardware/driver-related errors. + +* platform.h, videomode.c, sdl/input.c, sdl.video.c, sdl/video_sw.c: + Fix broken handling of SDL_VIDEORESIZE event: the call to SDL_SetVideoMode + must set the same window size as returned by the event. Also when window + is maximised, it is not allowed to un-maximise it by software. When these + conditions are not met, glitches occur. + +* videomode.c: Fix broken aspect ratio correction in windowed rotated + modes. Make the windowed mode the default - it's more compatible. + +* sdl/video_gl.c: Fix glitches when switching software<->OpenGL on + Windows. Avoid unnecessary scanline-drawing when scanline-percentage is 0. + +* sdl/input.c: Work around unwanted keyboard events when pressing + Alt+Tab on Windows. + +* atari.c, ui.c, sdl/input.c: Fix abuse of signals. + Atari800_Exit() calls signal-unsafe functions, so it cannot be called from + within a signal handler. + +* sdl/main.c: Close the SDL window when the monitor is used, to avoid + unnecessary keyboard events. + +* monitor.c: Fix improper handling of the prompt when readline is used. + + +2011-04-04 James Wilkinson +* configure.ac, Makefile.in: maintain support for older compilers (DOS, BeOS) + + +2011-04-03 Kostas Nakos +* android/*: Implement new screen cropping preferences, + some small port fixes, + implement new arrow key derotation workaround for ext. keyboards + + +** 2.2.0 released on 2011-04-02 at Atariada in Prostejov + +2011-04-02 Petr Stehlik + Commiting patches submitted by Tomasz Krasuski + and Achim Haertel : +* many files: Tomasz Krasuski's large patch that adds a new control to the GUI, + a slider which allows to adjust a numeric value using left and right arrows. + The slider is used in the colour controls (brightness, contrast etc.) and in + NTSC Filter settings. The colour/palette settings and NTSC Filter settings + are now saved in the config file. Color handling in UI got better names: + "Color preset", "Standard", "Deep" and "Vibrant". + Added the option "Filter preset" to Display settings->NTSC Filter settings. + This option allows to adjust several presets for the NTSC filter: + Composite, S-Video, RGB and Monochrome. Previously this option was available + only as a keyboard shortcut in the SDL port. Also see -ntsc-filter-preset in + the command line. + Added a new function PreInitialise() that is intended to contain any + initialisation code that needs to be called before reading of the config file. + Fixed a few compilation errors and warnings for the MSVC build, and slightly + updated the build instructions. As a bonus, the colour/palette adjustments + are now also available in the DirectX port. + Simplified the code for processing Win32-specific hotkeys. Now there's less + platfrom-specific code scattered around. Functionality remains unchanged. + +* monitor.c: Achim Haertel's patch adds a minor change to the monitor: + BPC without argument shows now the current breakpoint location. + +* atari800.spec: X11 and ncurses dropped. libGL should be added + as a recommended library. + +* README.1ST, README, ChangeLog, NEWS, util/export: updated for a new release + +* sdl/video_sw.c: disabled an annoying debug print + + +2011-04-02 Kostas Nakos +* android/*: Implement a simple disk management menu +* ui.c: Rearranged an #include to silence a redefinition warning + + +2011-03-19 Kostas Nakos +* android/*: Map dpad-center and ~ to Atari's escape key, + fix a couple of races when restarting, pausing/resuming the audio + + +2011-03-06 Kostas Nakos +* atari.[ch], android/*: Implemented autoframeskip functionality +* android/*: Added .com & .exe to supported extensions, + bugfix crash when sound disabled, + added new joystick grace area preference + + +2011-02-13 Kostas Nakos +* log.c, atari.c, screen.c, configure.ac, Makefile.in, android/*: Imported the + android port +* antic.c: Fix dirty screen updates with WORDS_UNALIGNED_OK + + +2010-12-09 James Wilkinson +* af80.c: prevent extra carriage return in config file setting. + + +2010-11-25 Petr Stehlik +* cartridge.c, cassette.c, cfg.c, devices.c, monitor.c, pbi_scsi.c, sio.c, + sound_oss.c, statesav.c, ui.c: GCC warnings about unused results fixed + (mostly return values of fread() and similar libc functions). + +* atari.c: fixed benchmarking with SDL (DONT_DISPLAY) + + +2010-11-24 Petr Stehlik +* many files: Tomasz Krasuski's large patch that implements major SDL video + output improvements - see "Display settings" -> "Video mode settings". + +* util.c: fixed Util_stricmp() implementation (was broken for empty strings) + + +2010-11-23 Petr Stehlik +* configure.ac: Matthias Reichl's patches for cross-compilation of the Windows + version under Debian. Use as follows: + PATH="/opt/mingw/SDL-1.2.14/bin:${PATH}" \ + CPPFLAGS="-I/opt/mingw/libz-1.2.5/include" \ + LDFLAGS="-L/opt/mingw/libz-1.2.5/lib" \ + ./configure --target=sdl --host=i586-mingw32msvc + +* ui.c: Tomasz Krasuski's patch for hiding proper Display entries in PAL mode + +* configure.ac: Tomasz Krasuski's patch for termcap being available in other + libraries (readline, ncurses) + + +2010-10-05 James Wilkinson +* ui_basic.c: change #ifdef to DIRECTX for DoEvents() call (thanks Matthias) + + +2010-05-24 Petr Stehlik +* atari.c, cartridge.c, configure.ac, Makefile.in: make IDE emulation optional + though enabled by default (use --disable-ide configure option if it doesn't + compile on your platform) + +* colours_ntsc.c: fixed missing default return + +* atari.h: version increased to 2.2.0rc1 + +* atari800.spec, README.1ST, DOC/NEWS: updated for upcoming release + + +2010-05-17 Petr Stehlik +* colours.c: write file in binary mode (thanks Tomasz Krasuski for the patch) +* ide.c: read file in binary mode +* data folder added +* icon files moved from util to data folder +* atari2.svg and atari2.png added to data folder (credits to John Oyler, + thanks to Brian Watson) + + +2010-04-30 James Wilkinson +* akey.h, atari.c, colours.[ch], colours_ntsc.[ch], colours_pal.c, configure.ac, + ui.[ch], ui_basic.[ch], win32/atari_win32.[ch], win32/main.cpp, win32/main.h, + win32/main_menu.h, win32/render_direct3d.cpp, win32/render_direct3d.h, + win32/render_gdi.c, win32/render_gdiplus.cpp, win32/screen_win32.[ch], + DOC/directx.txt: + Committed DirectX display enhancements by David Dahlstrom + + +2010-04-29 James Wilkinson +* Makefile.in: switched to patsubst long form in win32 rule because compound short form did not work as expected with at least some compilers + +* win32/atari_win32.h: corrected prototype to remove compiler warning + + +2010-04-28 James Wilkinson +* ide.[ch], ide_internal.h: build fixes for Windows/BeOS/DOS fseek/ftell and compiler complaints + + +2010-04-27 Ivo van Poorten +Implementation of both 8- and 16-bit IDE. If the MSB's are ignored, +the interface is compatible with MyIDE (tested mainly with MYIDE44E.ROM). +Some advanced features, like SMART and DVD/CDROM support, are not there yet, +but this is more than enough to write and test low level IDE Microdrive/CF +code. For harddisks it might be beneficial to emulate a couple of busy cycles. + + +2010-04-26 James Wilkinson +* ui.c: corrected H: error caused by turbo patch + +* atari.c, colours.c: correct blank screen on platforms that do not support palette update + +* atari_sdl.c, sound_oss.c: improve turbo mode for SDL build with synchronized sound and OSS sound + + +2010-04-20 James Wilkinson +* atari.c, monitor.[ch] DOC/trainer.txt: committed trainer searcher by Achim Haertel. + +* atari.[ch], ui.c: committed savestate sound patch by Tomasz Krasuski. + + +2010-04-19 James Wilkinson +* akey.h, atari.[ch], atari_sdl.c, atari_x11.c, ui.c, dos/atari_vga.c, win32/atari_win32.c: + Added support for F12 turbo mode. + +* win32/joystick.c: do not stop joystick enumeration on dual stick settings failure + +* emuos.h, emuos.lis: update for 2010 + +* win32/atari_win32.h, win32/keyboard.c: DirectInput cleanup + + +2010-04-16 James Wilkinson +* win32/atari_win32.c: correct keystroke auto-repeat + + +2010-03-23 Perry McFarlane +* DOC/USAGE, atari.c, configure.ac, mzpokeysnd.c, pbi.c, pbi_xld.[ch], +pokey.c, pokeysnd.c, votrax.c, new files: voicebox.[ch], votraxsnd.[ch]: +emulate the Alien Group Voice Box I and II + + +2010-01-29 Piotr Fusik +* ui.h, ui_basic.c: changed source code from CRLF to LF + + +2010-01-27 Perry McFarlane +* af80.[ch], atari.c: fix coldstart for AF80. + + +2010-01-21 James Wilkinson +* win32/render_direct3d.cpp: disable extended functions if supporting runtime not installed. + +* configure.ac: remove dependency on libd3dx9. + + +2010-01-19 James Wilkinson +* pbi_proto80.c: prevent extra carriage return in config file setting. + +* win32/sound.c: don't try to reinit sound (causes crash) if -nosound was used. + + +2010-01-18 James Wilkinson +* ui.[ch], win32/atari_win32.c, win32/render_direct3d.*, win32/render_gdi.c, win32/render_gdiplus.cpp, win32/screen_win32.[ch]: + Committed updated DirectX display enhancements from David Dahlstrom. + +* pbi_bb.c, pbi_mio.c, pbi_xld.c: prevent extra carriage returns in config file rom settings. + + +2010-01-17 James Wilkinson +* configure.ac: define SUPPORTS_PLATFORM_CONFIGSAVE and SUPPORTS_PLATFORM_CONFIGURE for DirectX build. + + +2010-01-14 Piotr Fusik +* win32/msc/config.h: #define WIN32 -> HAVE_WINDOWS_H + +* win32/render_gdi.obj: was incidentally committed + + +2010-01-13 James Wilkinson +* configure.ac: removed -Wredundant-decls for BeOS + +* configure.ac, ui.c, win32/render_*.*, win32/screen_win32.[ch], win32/main.*: + Changes to support new DirectX code under gcc. + +* configure.ac, atari.[ch], atari_sdl.c, compfile.c, devices.c, platform.h, pokey.c, rdevice.c, rtime.c, ui.[ch], ui_basic.c, util.[ch], wince/port/missing.h: + Changes from WIN32 to DIRECTX and HAVE_WINDOWS_H definitions. + + +2010-01-12 James Wilkinson +* atari_sdl.c: + Committed patch by Tomaz Krasuski to fix DirectX default for Win32 SDL driver. + Also made change to correct garbage column in some scaling modes. + + +2010-01-10 Piotr Fusik +* util/colormix.asx, util/colormix.xex: program for testing PAL delay line; + use arrow keys and space + + +2010-01-07 Piotr Fusik +* ui.c: wrapped UpdateColourControls into ifdef + +* colours.c, colours_ntsc.c, colours_pal.c, sio.c: killed MSVC warnings + +* win32/msc/config.h, win32/msc/Makefile: updated (colour_ntsc etc.) + + Commiting patch submitted by David Dahlstrom +* platform.h, ui.c, ui.h, ui_basic.c, win32/atari_win32.[ch], + win32/joystick.[ch], win32/main.[ch], win32/main.cpp, win32/render_*.*, + win32/screen_win32.[ch]: display and controller enhancements + + +2009-12-28 Piotr Fusik +* configure.ac, devices.c: MKDIR_TAKES_ONE_ARG for MinGW + +* colours_ntsc.h: M_PI for MinGW + + Commiting patch submitted by Tomasz Krasuski +* DOC/USAGE, atari.c, atari800.man, atari_sdl.c, colours.[ch], + colours_external.[ch], colours_ntsc.[ch], colours_pal.[ch] filter_ntsc.[ch], + configure.ac, ui.c, atari_ntsc/atari_ntsc.[ch], + atari_ntsc/atari_ntsc_config.h, atari_ntsc/atari_ntsc_impl.h: + 1. Removed Atari800-specific code from the atari_ntsc library, and placed it + in a new module, FILTER_NTSC. This new module serves as an interface between + Atari800 and Blargg's library. + 2. Removed the palette generation code from atari_ntsc and placed it in a new + module, COLOURS_NTSC. Palette generation is from now on used both in + "standard" mode and in NTSC-filtered mode. Old default palettes have been + removed from the COLOURS module. + 3. Introduced a new module, COLOURS_PAL, that includes improved routines for + PAL palette generation. PAL Ataris produce colours in a similar way to NTSC + ones; the only difference lies in phases of hues in YIQ (or YUV) colourspace. + Unfortunately, while differences between hue phases are constant in NTSC, + it's not the case in PAL. I have failed in trying to develop a formula that + lies behind PAL hue phases, so I gave up on that; instead I measured PAL hue + phases based on several screenshots, and stuffed them in the colour_angles + table (see colours_pal.c->GeneratePalette()). The result looks very plausible + and accurately represents colours of my 65XE, at least. + 4. Controls for contrast, brightness, saturation, gamma, hue and colordelay + now apply to both NTSC and PAL palettes (hue and colordelay only to NTSC), + regardless of NTSC filter. Palette generation is now on by default, therefore + parameters -genpaln/p are not needed anymore. + 5. Support for externally-loaded palettes has moved to a new module, + COLOURS_EXTERNAL. Brightness, contrast, saturation and gamma can now be + applied also to external palettes (-paletten-adjust and -palettep-adjust + parameters). + 6. NTSC filter also supports external palettes. + 7. Added new and changed a few of existing colour-related command-line + parameters. + 8. Keyboard shortcuts in SDL have been shuffled a bit, so that controls + usable only for NTSC filter lie next to each other. + 9. Display Settings menu has been expanded - now it includes controls for + adjusting all colour settings (including NTSC filter settings), and also + loading and unloading of external palettes. + 10. A new functionality has been added - saving the current colours (with + adjustments) to a palette file. See Display Settings->Save current palette. + + +2009-12-13 Perry McFarlane +* /DOC/USAGE, atari_sdl.c, platform.h, ui.c, xep80.c: + All 80 column modes work like XEP80 with alt-shift-X to switch screens. + Rename PLATFORM_SwitchXep80() to PLATFORM_Switch80(), PLATFORM_xep80 to + PLATFORM_show_80. + + +2009-12-07 Perry McFarlane +* USAGE, af80.[ch], atari.c, atari_sdl.c, cartridge.c, cfg.c, configure.ac, +cpu.[ch], monitor.c, pbi.c, TODO: + Austin Franklin 80 Column card + Execution history now stores opcode data. + update TODO + + +2009-11-21 Perry McFarlane +* sio.c: replace random with rand for portability + Commiting patch submitted by Tomasz Krasuski +* DOC/USAGE, Makefile.in, atari.c, atari800.man, atari_ntsc.[ch] (removed), + atari_ntsc/atari_ntsc.[ch], atari_ntsc/atari_ntsc.config.h, + atari_ntsc/atari_ntsc_impl.h, atari_sdl.c, configure.ac: + Update to atari_ntsc based on Blargg's nes_ntsc 0.2.2, correct colour phases, + other fixes. + + +2009-10-08 Piotr Fusik + Commiting patch submitted by Tomasz Krasuski +* atari_sdl.c: fixed missing leftmost column in 16bpp and 32bpp modes + + +2009-09-29 Piotr Fusik +* ui.c: sf.net bug #2868897 "Build fails on platforms without sound" + + +2009-09-20 Perry McFarlane +* atari_sdl.c: fix support of -nosound with SYNCHRONIZED_SOUND +* Makefile.in: use more memory for javac for javanvm version +* input.c: remove unused result variable from call to mouse_step() to +suppress warning. +* javanvm/atari800.java: fix an issue with the screen sometimes not showing. + + +2009-09-18 Perry McFarlane +* DOC/BUGS, atari.[ch], atari_sdl.c, cfg.c, configure.ac, mzpokeysnd.[ch], +pbi_xld.c, platform.h, ui.c USAGE : added synchronized sound for the SDL +version. +Sound can now be generated in sync with the rest of the emulation and not in a +separate thread. VOL_ONLY_SOUND is no longer needed. GTIA and POKEY +digisounds now work properly. The old pokeysnd.c will not work with +synchronized sound, only mzpokeysnd will be supported. 16 bit sound is now +the default for SDL. Use -audio8 for 8 bit SDL sound. +Improved mzpokeysnd speed somewhat. + + +2009-08-12 Piotr Fusik + Commiting a modified patch from Magnus Lind +* input.c: fix for trak-ball (cx22) emulation: bits 0 and 3 keep + the last direction + + +2009-07-18 Petr Stehlik +* configure.ac: patch from Patrice Mandin for gemlib autodetection + + +2009-06-30 Piotr Fusik + Commiting patch submitted by Tomasz Krasuski +* atari_sdl.c, compfile.c: changed "#ifdef linux" to "#ifdef __linux__" + + +2009-04-18 Perry McFarlane +* sio.c: sio fix broke BINLOAD + + +2009-04-17 Perry McFarlane +* sio.c: fix sio for AMS music player + + +2009-03-30 Perry McFarlane +* gtia.c: compile without NEW_CYCLE_EXACT + + +2009-03-30 Petr Stehlik +* atari800.spec: png library added to dependencies. + + +2009-03-27 Piotr Fusik +* win32/atari_win32.c: missing return value in PLATFORM_Initialise +* win32/.cvsignore: atari.res + + +** 2.1.0 released on 2009-03-27 + +2009-03-27 Petr Stehlik +* atari800.spec: added dependencies to SDL, ncurses, zlib and readline +* debian/control: added dependency to libreadline5-dev +* debian/changelog, debian/atari800.cfg: updated for release +* emuos.{h,lis}: (c) 2005 -> 2009 +* DOC/FAQ: updated for release (SDL keyboard joysticks are configurable now) +* DOC/NEWS: yet another update (thanks Piotr for help with final editing) + + +2009-03-27 Piotr Fusik +* DOC/TODO: updated + + +2009-03-26 Petr Stehlik +* DOC/NEWS, DOC/CREDITS, atari800.man, atari.spec, README: release update +* configure.ac, atari.h, util/export: version increased + + +2009-03-23 Petr Stehlik +* DOC/NEWS, DOC/CREDITS: updated for upcoming release +* configure.ac: readline support in monitor enabled by default, + simple Autoconf readline check added. + + +2009-03-22 Perry McFarlane +* atari_sdl.c: fix warning +* atari.c: fix basic/curses version compile error +* DOC/TODO: update + + +2009-03-20 Petr Stehlik + Commiting patch submitted by Tomasz Krasuski +* too_many_files: check for existence of required parameter of some command + line options before using it. Let all *_Initialise() functions return + status (FALSE in case something failed). + + +2009-03-17 Piotr Fusik +* colours.c, win32/sound.c: killed MSVC 2008 warnings + + +2009-03-16 Perry McFarlane +* antic.c: fix for Ilusia demo + + +2009-03-01 Perry McFarlane +* DOC/USAGE, input.c: specify CX85 port +* atari_sdl.c: minor fix for CX85 + + +2009-02-28 Perry McFarlane +* /DOC/USAGE akey.h atari_sdl.c javanvm/atari_javanvm.c input.[ch]: Emulate + CX85 numeric keypad + + +2009-02-25 Perry McFarlane + Commiting patch submitted by Tomasz with my changes +* atari.c atari_sdl.c atari_ntsc.[ch] configure.ac platform.h ui.c: NTSC +Filter option in the UI. + + +2009-02-05 Perry McFarlane + Commiting patch submitted by Tomasz Krasuski +* atari_sdl.c: cleaned up display modes. + + +2009-01-11 Petr Stehlik + Commiting patch submitted by Tomasz Krasuski +* atari_sdl.c: -audio16 fixed +* pokeysnd.[ch]: Sound recording must stop when POKEY is reinitialised +* sndsave.c: Chunks in WAV format must be word-aligned, + 16-bit sound recording fixed. + + +2008-12-27 Petr Stehlik + Commiting patch submitted by Tomasz Krasuski +* atari.c: initialize color palette after loading saved state +* cfg.c, mzpokeysnd.c, pokeysnd.c, ui.c: serio_sound* -> POKEYSND_serio_sound* + + +2008-11-03 Perry McFarlane +* configure.ac: fix syntax error + + +2008-10-30 Perry McFarlane +* memory.c: 5200 GTIA c000-cfff and POKEY e800-efff mirrors. +* configure.ac: minor fix for Cygwin. + + +2008-10-29 Perry McFarlane +* afile.[ch], atari.c, sio.c: Support .pro images +* ui.c: replace ^R in source with \022 +* pbi_bb.c, pbi_mio.c: correct Util_filenamenotset error. +* mzpokeysnd.c, pokey.c, pokey.h: rename SKCTLS -> SKCTL +* monitor.c: 5200 equates. +* DOC/BUGS: add Extract demo. +* Makefile.in: use NestedVM javasource and UnixRuntime by default +* monitor.c: SKCTL and SKSTAT in pokey state output. + + +2008-10-13 Matthias Reichl +* pokey.c: fixed the ALLPOT register - it didn't work + and there was an access outside array bounds + + +2008-09-21 Petr Stehlik +* ui.c: visual configuration of keyboard joysticks layout, at long last! + Currently for the SDL target only. Also default joystick mapping + changed to num pad 4,8,6,5 + right ctrl and A,W,D,S + left ctrl keys. + Feel free to set up your own mapping and then save the configuration. + +* atari_sdl.c: removed keys for combined joystick directions (left+up, etc.) + +* util.[ch]: safe_strncpy() added + + +2008-09-21 B Watson +* input.[ch]: "-directmouse" added (directly converting the mouse's absolute + X/Y position to the POKEY pot. Used only for "-mouse pad", "-mouse koala", + or "-mouse touch". The "-mousespeed" option does nothing when "-directmouse" + is enabled. + +* atari_sdl.c: mouse support ("-mouse xxx", "-mousespeed N") added, including + the direct mouse support. Also adds a new "-grabmouse" command line option + and a new keystroke, alt-M, to grab/ungrab the mouse. + +* atari_x11.c: direct mouse support added + + +2008-09-17 Piotr Fusik +* win32/msc/Makefile: added new source files + + +2008-09-17 B Watson +* configure.ac, monitor.c: --enable-readline option for the configure script + - the monitor supports arrow keys (including up-arrow for command history), + home/end, etc. using the "readline" library + + +2008-08-28 Perry McFarlane +* javanvm/atari800.java: gain applet focus +* sio.h: remove Id tag +* xep80.c: XEP80_BlitGraphChar(int x, int y), add int before x and y +* pokeysnd.[ch], mzpokeysnd.c: SAMPBUF_MAX -> POKEYSND_SAMPBUF_MAX +* mzpokeysnd.c, pokeymix.inc: changed NONLINEAR_MIXING to use a better + method, pokeymix.inc is no longer needed. + + +2008-08-22 Petr Stehlik +* atari_svgalib.c, configure.ac, Makefile.in, DOC/*: SVGAlib target dropped + definitely. SVGAlib is long time dead and running programs setuid 'root' + is so dangerous. Use/improve the SDL target instead! + + +2008-07-12 Perry McFarlane +* most files: finished renaming globals. New files: akey.h, (AKEY_*), +esc.[ch](patches), afile.[ch](file loading), cfg.[ch] (configuration), +ui_basic.h + + +2008-07-03 Perry McFarlane +* remez.[ch], mzpokeysnd.c: rename Remez_, remez -> Remez_CreateFilter. +* devices.[ch], atari.c, binload.c, rdevice.c, ui.c: rename Devices_, Device_ +-> Devices. +* cpu.[ch], antic.c, atari.c, binload.c, cassette.c, devices.c, +input.c, monitor.c, pbi.c, pbi_bb.c, pbi_mio.c, pokey.c, rdevice.c, sio.c, +ui.c: rename CPU_. +* sio.[ch], atari.c, atari_x11.c, binload.c, pbi_xld.c, pia.c, pokey.c, +screen.c, ui.c: rename SIO_ + + +2008-07-02 Perry McFarlane +* javanvm/atari_javanvm.c: compile without SOUND +* atari_sdl.c: name changes +* sndsave.[ch], atari.c, pokeysnd.c, ui.c: rename externals with SndSave_ +* statesav.[ch], antic.c, atari.c, cartridge.c, cpu.c, dc/atari_dc.c, gtia.c, +memory.c, pbi.c, pbi_bb.c, pbi_mio.c, pbi_xld.c, pia.c, pokey.c, sio.c, ui.c, +xep80.c: rename externals with StateSav_ +* log.[ch], antic.c, atari.c, atari_basic.c, atari_curses.c, atari_falcon.c, +atari_ntsc.c, atari_ps2.c, atari_sdl.c, atari_svgalib.c, atari_x11.c, +binload.c, cassette.c, colours.c, devices.c, dos/atari_vga.c, dos/dos_sb.c, +dos/sound_dos.c, input.c, javanvm/atari_javanvm.c, memory.c, pbi_bb.c, +pbi_mio.c, pbi_xld.c, rdevice.c, remez.c, rtime.c, screen.c, sio.c, +sound_oss.c, statesav.c, ui_basic.c, win32/atari_win32.c, win32/joystick.c, +win32/screen_win32.c, win32/sound.c, wince/port/atari_wince.c, +wince/port/sound.c, xep80.c: rename externals with Log_, Aprint -> Log_print +Aflushlog -> Log_flushlog. +* compfile.[ch], sio.c, ui.c rename CompressedFile_ to CompFile_ so that it +matches the filename. +* xep80_fonts.[ch] xep80.c: rename externals with XEP80_Fonts_. +* votrax.[ch], pbi_xld.c: rename externals with Votrax_, INT16 -> SWORD. +* binload.[ch], atari.c, cartridge.c, devices.c, sio.c: rename externals with +BINLOAD_ +* colours.[ch], atari.[ch], atari_falcon.c, atari_ps2.c, atari_sdl.c, +atari_svgalib.c, atari_x11.c, dc/atari_dc.c, dos/atari_vga.c, atari_javanvm.c, +screen.c, win32/screen_win32.c, wince/port/screen_wince.cpp: rename externals +with Colours_, Palette -> Colours_ so that it matches the filename. +* screen.[ch], antic.c, atari.[ch], atari_falcon.c, atari_ps2.c, atari_sdl.c, +atari_x11.c, dc/atari_dc.c, dos/atari_vga.c, input.c, ui.c, +ui_basic.c, win32/atari_win32.c, wince/port/atari_wince.c, wince/port/main.c, +wince/port/screen_wince.cpp: rename externals to Screen_, atari_screen -> +Screen_atari, etc. move entire_screen_dirty from antic.c to screen.c, rename +Screen_EntireDirty. +* xep80.[ch]: rename ATARI_EOL -> XEP80_ATARI_EOL +* rtime.[ch], cartridge.c, ui.c: rename rtime_enabled -> RTIME_enabled +* cassette.[ch], atari.c, gtia.c, input.c, sio.c, ui.c, rename CASSETTE_, make +some vars static. +* rdevice.[ch], devices.c, atari.c: rename RDevice_ +* monitor.[ch], atari_basic.c, atari_curses.c, atari_falcon.c, atari_ps2.c, +atari_sdl.c, atari_svgalib.c, atari_x11.c, cpu.c, dos/atari_vga.c, +win32/atari_win32.c: rename Monitor_ + + +2008-06-30 Perry McFarlane +* atari.c, atari_sdl.c, configure.ac, javanvm/atari800.java, +javanvm/atari_javanvm.c, pokeysnd.c, sound.h, ui.c, win32/sound.c: +add support for stereo, new sound.h function Sound_Reint on some platforms, +fixes to sdl sound, minor fixes. +* win32/sound.c: fix STEREO_SOUND undefined + + +2008-06-29 Perry McFarlane +* configure.ac: -source 1.4 to suppress javac warnings + + +2008-06-28 Perry McFarlane +* memory.h: suppress PAGED_MEM warning + + +2008-06-27 Perry McFarlane +* atari.c: add -basic_rom none +* Makefile.in fix javanvm variables +* util.[ch] cassette.c, configure.ac: Util_strncpy to fix javanvm bug +* INSTALL, UnixRuntime.patch, atari800.java, atari_javanvm.c: Java applet + + +2008-06-24 Perry McFarlane +* pbi.[ch], pbi_xld.[ch], pbi_bb.[ch], pbi_mio.[ch], statesav.c: state saving +for MIO, Black Box, XLD. + + +2008-06-19 Perry McFarlane +* ui.c, xep80.c: improve XEP80 state saving + + +2008-06-18 Perry McFarlane +* DOC/CREDITS, DOC/TODO, USAGE, atari.c, atari_sdl.c, configure.ac, pia.c, +platform.h, statesav.c, ui.c, xep80.[ch], xep80_fonts.[ch]: +Added XEP80 emulation by Mark Grebe to the SDL version, from Atari800MacX + + +2008-06-18 Christian Groessler +* dc/atari_dc.c (Atari_Keyboard): recognize TAB key. +* atari_x11.c (Atari_DisplayScreen): add missing XSync call in not-SHM +part. +* ui.c, ui.h: add additional parameter to the fMessage function, +indicating whether to wait for a key press. Display a "please wait" +message in SaveState and LoadState. +* ui_basic.c: adapt to fMessage change. Change BasicUIMessage to use +the new parameter and clear status line before writing the new +message. + + +2008-06-15 Christian Groessler +* rdevice.c, dc/Makefile.dc, dc/config.h, dc/atari_dc.c: add serial R: +support for Dreamcast + + +2008-06-14 Perry McFarlane +* input.c: 5200 bit 5 toggle fix (Star Trek) +* atari_sdl.c, input.c: fix shift+control keys +* atari_sdl.c, dos/atari_vga.c, javanvm/atari_javanvm.c, + win32/atari_win32.c: further shift+control fixes +* USAGE: updated keyboard +* statesav.c: fix gzFile + + +2008-06-13 Perry McFarlane +* rdevice.c, configure.ac: fix for win32 R: device +* pokey.c: IRQEN fix +* pokeysnd.c: add #ifdef PBI_XLD + + +2008-06-12 Christian Groessler +* rdevice.c, configure.ac: R: device now not longer inherently supports +network (with serial as an additional option). Now serial-only, +network-only, or both can be selected. + + +2008-05-31 Piotr Fusik +* atari.c, pokey.c: made the BASIC version compilable + + +2008-05-29 Perry McFarlane +* atari_sdl.c, cassette.c, input.c, memory.c, pbi_bb.c, pbi_proto80.c, +pbi_xld.c, pokeysnd.c, sio.c, statesav.c, ui.h, util.[ch], votrax.c: +made compilable with g++. Fixed some bugs, and a bugfix for pbi_xld.c, +other minor fixes. + + +2008-05-28 Perry McFarlane +* DOC/USAGE, atari_sdl.c, configure.ac, pbi.c, pbi_proto80.c, pbi_proto80.h, +pbi_xld.c: added emulation of a prototype 80 column card for the Atari 1090 +expansion box (SDL version). Also fixed a problem with LoadImage in pbi_xld.c +* DOC/INSTALL: Improved documentation a bit, suggested use of SDL. +* input.[ch], pokey.c: record random_scanline_counter for event recording. + + +2008-05-27 Perry McFarlane +* antic.c, atari_ntsc.h, cassette.c, gtia.c, joycfg.c, monitor.c, +mzpokeysnd.c, pbi.c, pokeysnd.c, screen.c, sio.c, votrax.c: +Some spelling in comments corrected. +* mzpokeysnd.c: fix warnings + + +2008-05-26 Perry McFarlane +* antic.[ch], atari.[ch], atari_sdl.c, cartridge.h, cassette.c, cpu.h, +gtia.[ch], javanvm/atari_javanvm.c, mzpokeysnd.c, pbi_bb.c, pbi_mio.c, +pbi_scsi.c, pbi_xld.[ch], pia.h, platform.h, pokey.h, rtime.[ch], sio.h, +statesav.c, ui.c, ui_basic.c, util.[ch], votrax.[ch]: + I compiled with: + CC = gcc -ansi -pedantic -Wall -Waggregate-return -Wmissing-declarations + -Wmissing-prototypes -Wredundant-decls -Wstrict-prototypes -Winline + and I found missing headers and lack of static in many places. + Black Box and MIO will now continue with SCSI disabled if the disk image + is not found. + +* Makefile.in, configure.ac, cpu.c, atari_vga.c, sound_dos.c, vga_gfx.c, +javanvm/atari_javanvm.c, rdevice.c, win32/atari_win32.c, win32/keyboard.h, +win32/main.h, win32/screen_win32.c: + Made windx, sdl, and javanvm compile with -ansi -pedantic. Fixed more + warnings. Made improved gcc warnings the default for windx, sdl, javanvm + and dosvga. + +* rdevice.c: removed // comments and warnings. + +* cpu.c: gcc will use goto and use of __extension__ will avoid -pedantic + warnings. + + +2008-05-25 Perry McFarlane +* atari_sdl.c, cpu.c, pbi_mio.c, pbi_xld.c, win32/atari_win32.c, +win32/screen_win32.c: some gcc -ansi -pedantic fixes + + +2008-05-25 Piotr Fusik +* win32/msc/Makefile: added votrax and pbi_xld + +* sio.c, pbi_xld.c: made compilable with VC2005 + + +2008-05-25 Perry McFarlane +* votrax.[ch] vtxsmpls.inc pbi.[ch] pbi_xld.[ch] pbi_mio.[ch] pbi_bb.[ch] +pbi_scsi.[ch] sio.[ch] atari.c configure.ac atari_sdl.c +dos/atari_vga.c javanvm/atari_javanvm.c win32/atari_win32.c memory.c +pokeysnd.c DOC/CREDITS DOC/README DOC/TODO DOC/USAGE: +Added emulation of the 1400XL, 1450XLD, MIO and Black Box. + + +2008-05-24 Achim Haertel +* cassette.c: implemented loading with variable baud rate + + +2008-05-22 Petr Stehlik +* cpu_m68k.asm: made linkable (missing cim_encountered and rts_handler). + Surprisingly it is working (ATARI BASIC READY) eventhough it is 5 years + outdated and needs many changes to be in sync with cpu.c again. + +* cpu_m68k.S: made compilable and linkable. It even sort of works but + fails before reaching the ATARI BASIC READY prompt :-( The conversion + is still not correct but debugging it is hard... + + +2008-05-21 Petr Stehlik +* atari_x11.c: removed "-fps" support, use "-showspeed" instead +* USAGE, atari800.man: updated wrt. removed "-fps" +* cpu_m68k.S: added fresh conversion of 5 years outdated cpu_m68k.asm +* configure.ac: default LDFLAGS will be without the "-s" (strip binary) + since package maintainers don't like autostriping of the debug symbols. + + +2008-05-20 Petr Stehlik +* .asm->.S: Devpac syntax of asm files converted to gcc one +* gst2gcc: removed, no longer needed +* Makefike.in: updated for compiling/assembling the .S files +* atari_falcon.c: corrected include path to "falcon.h" +* atari.c: corrected C++-ism (my old gcc 2.91 didn't like it) +* DOC/INSTALL.falcon updated (an optimized rebuild script added) + + +2008-05-15 Perry McFarlane +* rdevice.[ch] atari.c configure.ac: Windows support for R: device. +* USAGE: added record/playback + + +2008-05-14 Perry McFarlane +* input.c: stdlib for exit() + + +2008-05-13 Perry McFarlane +* configure.ac: nonlinear mixing minor fix +* input.[ch], configure.ac, pokey.c, atari.c, TODO: event recording + + +2008-05-11 Perry McFarlane +* dos/atari_vga.c, configure.ac: Atari_PaletteUpdate +* win32/sound.c, pokeysnd.h SND_STEREO removed (obsolete) + + +2008-05-10 Perry McFarlane +* mzpokeysnd.c, pokeymix.inc: use shorts for smaller file size with table + + +2008-05-09 Perry McFarlane +* mzpokeysnd.c, pokey.c: fixed two-tone + + +2008-05-08 Petr Stehlik +* atari.c: get rid of #ifdef USE_CLOCK and also #ifdef DONT_SYNC_WITH_HOST +* configure.ac: get rid of USE_CLOCK for Falcon + + +2008-05-07 Petr Stehlik +* screen.c: DrawAtariSpeed() now computes the real speed by itself and always + shows it (if enabled) even if it is at 100% or around (previously it was + hidden when in range 99% - 101%). It even shows speed < 100% (previously + it didn't) - hopefully this will help profiling various ./configure + options on slow Atari800 hosts. + +* atari.c: just some cleanup around the atari_sync(), no functional changes. + + +2008-05-07 Perry McFarlane +* mzpokeysnd.c, configure.ac, pokey.h, pokeymix.inc: Nonlinear mixing, + two-tone filter, corrected STIMER. + + +2008-05-05 Perry McFarlane +* javanvm/atari_javanvm.c, atari_sdl.c: remove // comments +* javanvm/atari800.java: fix frame.pack() +* Makefile.in, DOC/INSTALL: changed to make jar file by default for Java +* Makefile.in: added comments to build from NestedVM javasource compiler + + +2008-04-16 Piotr Fusik +* antic.c, atari.c, memory.c: in C code local variable definitions should + precede statements + + +2008-04-16 Achim Haertel +* cassette.[ch], pia.c, pokey.c, screen.c, sio.[ch]: + implemented raw writing (via HW registers, not SIO) to cassette files + + +2008-04-08 Perry McFarlane +* javanvm/atari_javanvm.c, javanvm/atari800.java, configure.ac: sound support +for the Java NestedVM port + + +2007-11-28 Marcin Zukowski +* cartridge.c: fixed Atrax cartridge bank switching + + +2007-10-19 Perry McFarlane +* javanvm/atari_javanvm.c: keypad fix + + +2007-10-18 Perry McFarlane +* javanvm/atari_javanvm.[ch] javanvm/atari800.java added for Java NestedVM + port configure.ac, Makefile.in, platform.h, INSTALL, USAGE: modified for + NestedVM port + +* screen.c, USAGE: -showspeed command line option +* win32/*: suppress gcc warnings +* win32/screen_win32.c, configure.ac: support Atari_PaletteUpdate + + +2007-10-11 Perry McFarlane +* devices.h: make h_current_dir extern +* monitor.c: COLOUR -> COLOR + + +2007-10-04 Perry McFarlane +* colours.[ch], atari.[ch], platform.h, USAGE, atari_sdl.c, atari_ntsc.c, + configure.ac, TODO: added support for switching between NTSC and PAL + palettes. + The platform-specific function Atari_PaletteUpdate is now required in those + ports which calculate their own palette from colortable. The SDL version + is working but other ports will need to be updated. + + +2007-10-02 Perry McFarlane +* antic.c: cleaner macros +* cycle_map.c: minor cleanup +* ui.c, README, amiga/Atari800.guide: GPL version 2 now, not 1 +* most files: FSF address change in GPL notices. + + +2007-09-30 Perry McFarlane +* antic.c: Added better support for GTIA bug mode. + + +2007-09-12 Perry McFarlane +* memory.c: Fix PAGED_MEM error (missing break in switch) with POKEY in + loading saved states. + +* memory.[ch], statesav.c, cpu.c Support Axlon and Mosaic state saving. + SAVE_VERSION_NUMBER upgraded to from 4 to 5 + + +2007-09-06 Perry McFarlane +* memory.[ch], atari.c, TODO, USAGE: add Axlon and Mosaic RAM expansions + for the 400/800. + + +2007-08-04 Perry McFarlane +* memory.c: fix PBIM1/M2_Get/PutByte in MemStateRead +* atari_ntsc.c: tweak default parameters a bit + + +2007-08-02 Perry McFarlane +* atari_sdl.c: fix broken Caps Lock key handling +* atari_sdl.c: reduce default NTSC scanlines percentage from 20 to 5 + + +2007-07-31 Perry McFarlane +* configure.ac, INSTALL: fix for windows sdl version. Don't use -mwindows or + -Dmain=SDL_main and use -mno-cygwin on Cygwin. SDL_win32_main.c is now + required from the sdl source. Update documentation in INSTALL. This fixes + the stdout.txt problem. + +* atari_sdl.c: fix for windows sdl version. Make SDL_VIDEODRIVER=directx by + default because it is much faster. SDL 1.2.10+ uses windib as the default. + +* atari_sdl.c: added interpolated scanlines, made it the default, added + -scanlinesnoint option to disable it + + +2007-07-30 Perry McFarlane +* configure.ac: fix for windows sdl version. Don't require winmm or gdi32 + + +** 2.0.3 released on 2007-07-11 + +2007-04-23 Piotr Fusik +* win32/msc/Makefile: fixed a problem that appeared when I switched to another + version of NMAKE ("fatal error U1100: macro '$@' is illegal in the context + of batch rule '.c.obj'") + + +2007-04-23 Paulo Lopes +* win32/atari_win32.c: new command-line option "-win32keys" for keyboard + layouts different from US (the emulator relies on Win32 API to do scan code + translations) + + +2006-12-07 Paulo Lopes +* win32/main.c, win32/screen_win32.[ch]: an option to run the emulator + in a window ("-windowed" on the command line) + + +2006-11-05 Piotr Fusik +* DOC/PORTING: an introduction to writing platform-specific part of Atari800 + + +2006-10-31 Kostas Nakos +* util.c: Make sure user does not updir from the root in WinCE + + +2006-10-30 Kostas Nakos +* wince/port/*, ui_basic.c, DOC/INSTALL.wince: added support for QVGA landscape + smartphones, added the virtual keyboard (kb_ui) and updated documentation. + + +2006-09-04 Piotr Fusik +* cartridge.[ch], ui.c, DOC/cart.txt: added 128 KB SpartaDOS X cartridge type, + by the way: shortened the cartridge code and replaced letters with numbers + for bank indexing in the documentation + + +2006-07-23 Piotr Fusik +* input.[ch], atari_x11.c, win32/main.c: middle button support + for ST and Amiga mice + + +2006-07-21 Piotr Fusik +* antic.c: corrected PMG in bizarre ANTIC/GTIA modes + + +2006-07-01 Mark Grebe +* antic.[ch], ui.c: new style of artifacting + + +2006-06-29 Piotr Fusik +* win32/msc/Makefile, win32/msc/config.h, DOC/INSTALL: + upgraded VC++ from 6.0 to 2005 + + +2006-05-01 Piotr Fusik +* util/act2html.*: replaced my old C program with a Perl script; + the Perl script keeps hues from different palettes together + which I think is better for palette comparisons + +* util/colors.asx, util/colors.xex: Atari program that displays all 256 colors + +* util/crlf.*, util/keyboard.txt, util/usage2html.pl: removed + +* util/readme.txt: updated + +* act/gray.act: 0x00,0x11,0x22,... instead of 0x00,0x10,0x20,... + + +2006-04-24 Piotr Fusik +* util/sethdr.pl, util/sethdr.txt: removed; the script hasn't been updated + for years (so it supported only half of current cartridge types), + wasn't portable, etc. "Create Cartridge from ROM image" in the emulator + basically does the job of the removed script. + +* util/makebb.bat: removed; anyone who is serious about making a ROM image + of "Bounty Bob Strikes Back 5200" by concatenating 3 files can read + DOC/cart.txt + + +** 2.0.2 released on 2006-04-08 + +2006-04-08 Petr Stehlik +* atari_sdl.c: map ATARI key to SDL_BACKQUOTE key as well (similarly to DOS + port) since LSUPER key (the WINDOW key) is unusable in MS Windows (it + opens up the Start menu). + +* config.{guess,sub}: updated to version from 2006-02-23 + +* debian/*: update for new release. Fixes bugs in Debian BTS (#346876, #288543) + +* atari800.{h,man},configure.ac,README*,atari800.spec: update for 2.0.2 release + + +2006-04-06 Perry McFarlane +* antic.c: removed IR = 0 and anticmode = 0. Added a check to ignore JVB + in the jump instruction instead. + + +2006-03-29 Perry McFarlane +* atari_sdl.c, atari_ntsc.c: added command line options, help and rearranged + code a bit in the NTSC emulator. +* DOC/USAGE updated for the NTSC emulator. +* DOC/BUGS added Satan's Hollow and Sirius games. +* TODO updated to add NTSC emulator todos and a large number of other ideas. +* DOC/CREDITS added Shay Green as author the of NTSC emulator + + +2006-03-19 Piotr Fusik +* compfile.c: fixed DCM image handling - support 0x45 "End Of Pass" code + in an empty sector block starting at any sector (usually 0x0045) + + +2006-03-10 Perry McFarlane +* atari_sdl.c, atari_ntsc.c: Blargg's NTSC composite video emulator based on + NewRisingSun's algorithm. SDL port 640x480x16 only. Use -ntscemu. + + +2006-02-03 Piotr Fusik +* antic.c: a bug in do_border_gtia10 caused a crash on machines that don't + support unaligned words (problem reported by Mark Watson), on other machines + sprites on the right border in GTIA 10 modes were incorrectly shifted; + a pointer cast in DO_BORDER_1 replaced with IS_ZERO_ULONG, just in case + + +2006-01-31 Piotr Fusik +* win32/screen_win32.c: made DDERR_UNSUPPORTED user-friendly ;-) + +* atari.h, input.c, statesav.c, ui.c, ui.h, ui_basic.c, dc/atari_dc.c, + dc/atari800.cfg, dc/config.h, dc/dc_chdir.c, dc/icon.h, dc/Makefile.dc, + dc/version.h, dc/vmu.c, dc/vmu.h, DOC/CHANGES.dc, DOC/README.dc: + integrated Christian Groessler's SEGA Dreamcast port + + +2006-01-30 Perry McFarlane +* antic.c: fixes for Spider City and Fast Eddie + Don't display usual graphics if DMACTL width changed from 0 past a + certain cycle. Also don't continue to steal cycles. Bug made Fast Eddie + bounce up and down one scan line in the demo mode and caused garbage lines + in Spider City. + +* antic.c: fix update_scanline_* to adjust for HSCROL only when IR&0x10 is + true. I don't know if it caused any problems but it was wrong. + +* antic.c: fix for Final Orbit. Set IR = 0 after JVB instruction. Bug made the + screen shake badly. + + +2006-01-26 Piotr Fusik +* ui_basic.c: directory that has been left (via Backspace or "[..]") + is highlighted in the parent directory; display an error message + when cannot enter a directory + + +2006-01-14 Piotr Fusik +* monitor.c: "D" command displayed FFFE and FFFF instruction addresses + as FFFFFFFE and FFFFFFFF respectively + + +2006-01-11 Troy Ayers +* atari_ps2.c: Added routines for sound_pauses and sound resume for the PS2 + + +2006-01-09 Piotr Fusik +* pokeysnd.c: some fixes for stereo RF pokeysnd, essential for ASAP + + +2006-01-07 Piotr Fusik +* atari.[ch], memory.c, ui.c: 192 KB RAM + + +2006-01-06 Piotr Fusik +* configure.ac: small fix for sound on PS2 + +* DOC/BUGS: 5200 Joust sets all colors to black on PAL machines + (not Atari800's bug) + + +** 2.0.1 released on 2006-01-02 + +2006-01-02 Petr Stehlik +* atari_sdl.c: keysym.unicode is not defined for KEYUP event (reported + by Patrice Mandin, the Atari libSDL port author) + +* various doc files: update for 2.0.1 bugfix release + + +2006-01-02 Piotr Fusik +* devices.c: H: device defaults to read-only + +* atari_sdl.c: keys used for joystick emulation shouldn't be ignored in UI + (reported by Wiktor Grebla) + +* ui.c: fixed a bug in per-file ROM configuration in UI (reported + by Piotr Skamruk) + +* ui.[ch]: MENU_PLACEHOLDER is no longer necessary thanks to the new + FindMenuItem() + + +** 2.0.0 released on 2005-12-31 +*** started second decade of Atari800 development! + +2005-12-31 Petr Stehlik +* atari_falcon.c: 'fVDI' cookie almost surely indicates that we are running + on a graphics card with no bitplanes support. + header file is in mint subfolder in newer mintlibs. + + +2005-12-30 Kostas Nakos +* wince/*: code refinements + +* DOC/INSTALL.wince: updated + + +2005-12-30 Piotr Fusik +* cpu.[ch], mzpokeysnd.c, pokey.h, pokeysnd.c, remez.c: added conditional code + for an external project derived from Atari800, see http://asap.sf.net + + +2005-12-29 Petr Stehlik +* atari_sdl.c: keyboard joysticks: + - removed secondary trigger key + - added functions that list currently assigned keyboard joystick keys (for + use in the UI to show user how the joystick is mapped) + - SDL_X_TRIG renamed to SDL_JOY_X_TRIGGER (old config name still supported) + - SDL_JOY_X_ENABLED added to config file (so you can enable/disable + the keyboard joysticks and save that for future) + +* ui.c: SDL keyboard joysticks: show how the joystick keys are mapped + +* config.{guess, sub}: updated to versions from August 2005 + +* atari800.man: added -Hpath + +* DOC/FAQ: listed my solutions for keyboard joysticks and sound problems + under SDL with GNOME ESD. + +* atari800.spec, README.1ST, DOC/{README, NEWS}: updated for new release + + +2005-12-29 Piotr Fusik +* ui_basic.c: help line for the directory selector + + +2005-12-28 Petr Stehlik +* sound_oss.c: handles situations when Pokey generated channels don't match + the output channels - for example when stereo Pokey is to play on mono only + card, or vice-versa. Also stereo Pokey compiled in but disabled at runtime + now plays from both channels (not just the left one). + + +2005-12-27 Piotr Fusik +* DOC/INSTALL.amiga: removed (completely obsolete) + +* DOC/TODO: reorganized and added my ideas + +* pokey.c: made initialization of poly17_lookup[] about 10 times faster + + +2005-12-05 Piotr Fusik +* atari_ps2.c: sound support for the PS2 + + +2005-11-30 Piotr Skamruk +* ui.c: options for enabling/disabling SDL keyboard joysticks + + +2005-11-26 Piotr Fusik +* atari.c: fixed Atari_time() on the PS2 + +* atari.c: applied patch for *argc==0 (Chris) + +* ui_basic.c: minor fix in FileSelector() + + +2005-11-24 Petr Stehlik +* atari_sdl.c: keyboard joysticks don't pause games anymore. However, a + runtime switch between keyboard joysticks and normal keyboard is needed. + DOS/VGA uses . Will SDL use that or something else? Also some sort + of visual indication (similar to disk drives lights) is needed otherwise + users will get confused when half of their keyboard doesn't respond. + + +2005-11-19 Piotr Fusik +* configure.ac, sound_oss.c, sound_unix.c: new OSS sound handling: + - renamed sound_unix.c to sound_oss.c + - added "-lossaudio" (necessary on NetBSD) + - removed some advanced tricks (including "-snddelay" option), + now writing samples for one Atari frame at once + - implemented Sound_Pause() using SNDCTL_DSP_POST + +* monitor.c: the output of "GTIA" command is now 7 lines instead of 5, + but is much more readable (sprite registers are aligned) + + +2005-11-14 Piotr Fusik +* configure.ac: R: device disabled by default (use "--enable-riodevice" + at your own risk) + +* atari_ps2.c: fixed timer_interrupt_id, but the timer code probably + still won't work, so I wrapped it in USE_TIMERS + +* ui_basic.c: added "[mc0:]" to file selector on PS2; + use just one Win32 API call GetLogicalDrives() for all drive letters + + +2005-11-11 Piotr Fusik +* configure.ac, amiga/config.h, win32/msc/config.h, wince/port/config.h, + antic.c, cpu.c, memory.h, pokeysnd.c: + UNALIGNED_LONG_OK -> WORDS_UNALIGNED_OK + +* atari.[ch], antic.c, memory.h: STAT_UNALIGNED_WORDS + +* binload.c, devices.c: dGetWord -> dGetWordAligned, + dPutWord -> dPutWordAligned + +* configure.ac: WORDS_UNALIGNED_OK now bases on the built-in + CPU architecture database and can be overridden + with "--enable-unalignedwords" / "--disable-unalignedwords" + +* atari.c, atari_ps2.c: implemented Atari_time() and Atari_sleep() on PS2 + + +2005-11-08 Piotr Fusik +* atari_ps2.c, devices.c, ui_basic.c: support for directory listings on PS2 + ("mc0:" only) + + +2005-11-04 Piotr Fusik +* monitor.c: pacified warnings on 64-bit CPUs + + +2005-11-03 Piotr Fusik +* ui.c: "Uncompress disk image": there was a random message when the user + cancelled output file selection + +* sio.c: removed superfluous SIO_Dismount() - SIO_Mount() calls it + + +2005-11-02 Piotr Fusik +* atari.c: RESET key in 400/800 does not reset chips, but only generates + RNMI interrupt + +* gtia.c: pacified warnings in no-NEW_CYCLE_EXACT build + +* devices.c: pacified MSVCE warning in WORDS_BIGENDIAN build + +* ui_basic.c: file selector shows empty directories on WinCE + +* devices.c: H: directory listing with no matching entry now works on WinCE + +* devices.[ch], ui.[ch]: "Advanced H: options" + +* devices.c: fixed H: open mode 12 - now creates files that didn't exist; + added H: open mode 13 - append and read (most Atari DOSes don't support it, + but Sparta does) + +* devices.c: H: MyDOS Load Executable command now works on open files + (this is how MyDOS menu uses it) + +* configure.ac, amiga/config.h, win32/msc/config.h, util.[ch], devices.c, + sio.c: improved handling of temporary files: + - temporary files with H: directory listing are deleted on WinCE + - if available, tmpfile() is used for DCM and GZ disk images + (no need to store names of temporary files) + +* sio.c: fixed Aprint("%SIO... inside #ifdef DEBUG + +* sio.c: drive status command ('S') now reports the density configured + via PERCOM ('O') - MyDOS menu can reformat a disk with different sector size + +* compfile.[ch]: rewritten from scratch. New DCM code is partially inspired + by Ernest Schreurs' DCM2ATR utility: + - DCMs that aren't Single/Double/Enhanced Density are now supported + (example: double-sided disks) + - DCM sector coding type 0x42 is now supported + - DCM code is short, fast and clear (as opposed to old DCM code and DCM2ATR) + +* ui.c: "Uncompress Disk Image" converts XFD.GZ to XFD, ATR.GZ to ATR, + DCM to ATR + +* win32/main.c: replaced WinMain() with main() so that MSVC-compiled version + is a console application + +* atari.[ch], atari_curses.c, atari_sdl.c, atari_svgalib.c, + colours.c, compfile.c, devices.c, log.c, memory.c, monitor.c, mzpokeysnd.c, + pia.c, platform.h, pokeysnd.c, sio.c, sound_unix.c, statesav.c, ui.c, + ui_basic.c, dos/dos_ints.h, dos/dos_sb.[ch], win32/atari_win32.c, + win32/joystick.c, win32/keyboard.c, win32/main.c, win32/screen_win32.c, + win32/sound.c: removed CVS log from file contents + + +2005-10-29 Kostas Nakos +* atari.c: implementation of alternate host syncing scheme + With USE_CLOCK undefined, normal operation requires syncing (sleeping) for + each frame, even when refresh rate is > 1. By defining the + ALTERNATE_SYNC_WITH_HOST symbol results in calculating skipped and the drawn + frames, then sleeping once for a longer period. This scheme seems to yield + better results for slow devices. + + +2005-10-25 Piotr Fusik +* sio.c: compressed disk images are now open read-only. + Version 1.3.6 could open them in read-write mode, but the compressed + images were never modified, so changes were lost. It was commented + "this is a fake but some games need it", but, since read-only ATRs + (e.g. on a CD-ROM) cannot be open in read-write mode, why compressed + images should be? + +* antic.c, monitor.c: "VCOUNT" and "ypos" are now zero in the monitor + invoked outside ANTIC_Frame() (previously 0x9c and 312 respectively, + which doesn't make sense) + +* atari.[ch], devices.c, ui.c, util.h: Atari800 tries to guess ROM paths + that are not configured (no configuration file or no entries for ROM paths). + It checks in the current directory, "/usr/share/atari800" (only on Unix + and Linux), directory with the Atari800 binary and its "rom" and "ROM" + subdirectories. See source code of Atari800_FindROMImages() in atari.c + for the filenames that are checked. Note that only the presence of files + is checked here, not their contents. This is far from perfect, but probably + better than hard-coded default filenames (in the current directory) + as in Atari800 1.3.6 and earlier. + + +2005-10-23 Piotr Fusik +* ui_basic.c: silenced a warning + +* devices.c, hdevtest.lst: made H: functions 0x2f and 0x30 + SpartaDOS-compatible + +* devices.c, ui_basic.c: Win32 implementation of directory listing + no longer fails when no file matches the mask + +* devices.c: Win32 implementation of long directory listing + reports local file times rather than UTC + + +2005-10-22 Piotr Fusik +* monitor.c: #include "pokeysnd.h" for stereo_sound (previously + in rt-config.h) + +* dos/atari_vga.c: didn't compile after removing Atari_DisplayScreen's + argument + +* atari_x11.c: XVIEW didn't compile after introducing atari_files_dir + +* atari.[ch], ui.c: I forgot about configuration of tv_mode, now it's + in "Select System" + +* util.[ch], devices.c, ui_basic.c: Util_chrieq() + +* ui.[ch], ui_basic.c, wince/port/ui_wince.c, wince/port/main.c: + - display error message when SIO_Mount() fails + - introduced MENU_* macros to hide tMenuItem structure layout + in menu definitions + - removed tMenuItem.sig (used by wince_ui_driver only) + - simplified tMenuItem.flags values + - replaced tUIDriver.fAboutBox with more general tUIDriver.fInfoScreen + - added "tooltips" in Disk Management + - combined "H: device" with "Use H: devices in Read Only mode" + - added "Configure Directories" for configuration of atari_files_dir[] + and saved_files_dir[] (thanks Petr for idea) + - tUIDriver.fSelect now supports "dragging" (for reordering + atari_files_dir[] and saved_files_dir[]) + - FileSelector's scrolling is less tricky and more reliable, + as a side effect Left and Right arrows can be used to jump to first + and last menu item respectively + - you can quickly move in menus and file selector by pressing first + letter of an item + - fixed some problems with Alt+letter shortcuts + - Alt+O no longer displays a blue line at bottom of the screen + - moved WinCE-specific UI menu items to ui.c; only AboutPocketAtari() + left in ui_wince.c; wince_ui_driver is history, which is good, because + UI Driver is meant for View/Controller, not Model of User Interface; + Kostas should review my changes, naturally + - some naming changes to follow Atari800 convention + +* atari_svgalib.c, ui_basic.c: improved SVGA_SPEEDUP: + - now draws 1/refresh_rate part of screen every frame instead + of every refresh_rate frames; + - protected against problems when changing refresh_rate from UI + - should work correctly with refresh_rate not being a divisor of 240 + - removed special handling from ui_basic.c + +* atari.h, configure.ac: version 1.4.0 + + +2005-10-19 Piotr Fusik +* amiga/amiga.c: Atari_LoadAnyFile() additionally supports DCM, BAS, LST, + CART, ROM, CAS, BOOT_TAPE + +* ui.c: disks mounted as read-only now marked with '*' in Disk Management + +* sio.c: initialize sio_filename[] with "Off" to match drive_status[] + initialized with Off; simplified code by removing istmpfile[] + +* amiga/amiga.c, atari_curses.c, atari_falcon.c, atari_ps2.c, atari_sdl.c, + atari_svgalib.c, atari_vga.c, win32/atari_win32.c, wince/port/atari_wince.c, + atari_x11.c, win32/main.c, platform.h, ui_basic.c: + removed Atari_DisplayScreen's argument: use atari_screen directly + +* util.c: Util_splitpath() and Util_catpath() recognize slash in addition + to backslash + +* rt-config.[ch], ui.c, ui_basic.c, atari_x11.c: DISK_DIR, ROM_DIR, EXE_DIR + and STATE_DIR configuration options replaced with ATARI_FILES_DIR + and SAVED_FILES_DIR. See discussion on the mailing list (9-11 Sep 2005). + +* ui.[ch], ui_basic.c, wince/port/ui_wince.c: improved file selection: + - file selector's title is the path of the listed directory + - sort directories that start with a dot + - file selector starts on the previously selected file + - Backspace in the file selector goes to the parent directory + - filenames of saved files are no longer limited to 32 characters + - directory of a saved file appears in the edit box + - Tab in the edit box invokes directory browser + - added directory selection + +* ui.[ch], ui_basic.c, wince/port/ui_wince.c: + - removed box around screen title; screen title now always takes one line + and is shortened if necessary + - improved refresh_rate selection + - added "Controller Configuration" + - restored "Save Interlaced Screenshot" in the main menu + - "Atari Settings" -> "Emulator Configuration": added H: paths + and read-only, print command and ROM settings; + the easiest way to configure ROMs is "Find ROM images in a directory" + which looks for common names of ROM images (e.g. atarixl.rom) + - improved disabling of function keys and Alt+letter in User Interface + on WinCE (now using MENU_ACCEL() macro); applied to PlayStation 2, too + - changed items[] indexing to pointer access in BasicUISelect(); + this is not a matter of optimization, since a smart compiler should + generate same code for both - I'm 99% sure there's a bug in MSVC 6 + that caused the disabled R: menu item to appear on screen + - some code simplifications + +* devices.[ch], rt-config.[ch]: + RtIsPrintCommandSafe() -> Device_SetPrintCommand() + +* atari.c, prompts.[ch], rt-config.[ch], Makefile.in, amiga/Makefile, + win32/msc/Makefile: removed "-configure" command-line option + and the questions that appeared in the console window when no configuration + file was found; now a default configuration is written and you can modify it + using User Interface; removed prompts.[ch] + +* atari.[ch], rt-config.[ch], Makefile.in, amiga/Makefile, + win32/msc/Makefile: variables configured by the configuration file + moved to the modules they actually belong to; config read/write moved + to atari.[ch]; removed rt-config.[ch] + + +2005-10-12 Troy Ayers +* configure.ac: For PS2 port removed check for libgcc, added check for libz. + +* atari_ps2.c: Changed keyboard input to "raw" mode, as "normal" mode will not + read directional keys. Changed PS2 button assignments. + + +2005-10-09 Piotr Fusik +* atari_x11.c: removed "Help" menu item disabling, because "Help" was removed + recently + +* rdevice.c: improved Device_GetInetAddress: + - all non-control ASCII characters except space allowed (dunno if correct) + - memory wraps at 64K + - prevented buffer overflow + +* binload.c, devices.c: use fgetc() instead of fread() for single bytes; + start_binloading is a boolean, and should be set to TRUE or FALSE + +* devices.c, rt-config.[ch]: atari_h[1-4]_dir -> atari_h_dir[0..3]; + hd_read_only -> h_read_only + +* devices.[ch]: numerous improvements in H: device emulation: + - slash, backslash, colon and greater-than are allowed H: directory + separators on all platforms + - parent directory on H: is "<" or ".." + - access via H: outside the specified directories is not possible + (I hope so!) + - HPath -> h_exe_path, and is not modified in-place + - fixed match(): "F?" matched "F", "FOO?BAR" matched "FOO.BAR" + - apostrophe is valid in filenames + - MyDOS compatible H: commands: 0x22 = mkdir, 0x29 = cd + - H: rename command no longer allows moving files to a different directory + - command 0x30 is "ToAbsolutePath" rather than "CurrentDirectory" + - mkdir and rmdir no longer work in H: read-only mode + - mkdir no longer calls umask(), and now creates directory with default + permissions + - H5: is no longer valid (but H6:-H9: default to the current directory) + - apply fseek(fp, 0, SEEK_CUR) between reads and writes of a file open + in "rb+" mode (e.g. DJGPP needs that) + - H: directories prefixed with ':' in directory listing on MyDOS + - base names longer than 8 characters and extensions longer than + 3 characters are truncated and terminated with '+' in directory listings + - file size in long directory listing limited to 999999 + - long directory listing uses (SpartaDOS-compatible) 12-hour format + +* ui_basic.c: silenced a warning + +* win32/atari_win32.c: implemented Atari 5200 keys; + F11 and Scroll Lock no longer press L on Atari keyboard; + Ctrl+arrows emulate Atari arrows without Control; + adapted to Atari800 coding style + +* util/benchmark.pl: fixed program name in error messages + +* util/hdevtest.lst: automatic test of H: device. Usage instructions inside. + + +2005-09-27 Piotr Fusik +* atari_curses.c, ui_basic.c: screencode -> curses char code conversion + is now done in curses_display_line rather than Atari_DisplayScreen: + avoided conversion from ASCII to screencode and back in UI (it was wrong + for some characters), this fixes Alt+O menu in Self Test + +* memory.c, ui_basic.c: UI's charset is now in ATASCII order, + so ascii_to_screen is not necessary + +* monitor.c: silenced MSVC warnings + +* util.h: fixed a warning about implicit declaration of unlink() in sio.c + +* atari_x11.c: fixed keyboard on Motif and XView + +* configure.ac: PlayStation 2 fixes; lots of small improvements + + +2005-09-24 Piotr Fusik +* atari_ps2.c, configure.ac: added development version of the PlayStation 2 + port I'm working on together with Troy Ayers; it is limited at the moment: + no real speed synchronization, no sound, no file selector, no monitor + + +2005-09-18 Piotr Fusik +* cpu.c, monitor.[ch]: major improvement of monitor: + - new command "B" manages user-defined breakpoints + (based on Atari800Win PLus 4.0 by Marcin Lewandowski) + - monitor now displays registers and current instruction when invoked + - "SHOW" additionally displays current instruction + - disassembler displays bytes before the instruction, + to avoid misalignment where long labels are present + - disassembler no longer displays cycles (it was misleading, + because the number of cycles is variable for some instructions) + - removed memory contents display in single step mode (not useful) + - "ESCAPE" and "ESCRTS" disassembled with their argument + - "TRON", "TROFF" -> "TRACE" (output to file, not stdout; includes + ypos, xpos and registers) + - "BRKHERE" -> "BBRK" + - "BREAK" -> "BPC" + - "YBREAK" -> "BLINE" + - "H" is an alias to "HISTORY" + - "ROM", "RAM" work in PAGED_ATTRIB build + - "DLIST" groups identical instructions and prints them in one line + - assembler supports labels + - assembler handles "JSR 0", "LDA 0,Y" etc. + - improved branch range checking in assembler + - error messages for invalid "SETx" arguments + - unofficial "NOP" and "SBC #" are marked with "!" in disassembly + - assembler generates the official "NOP" opcode + +* configure.ac: MONITOR_BREAKPOINTS ("B" command), + MONITOR_PROFILE ("PROFILE" command), MONITOR_TRACE ("TRACE" command) + +* atari.c: size of auto-started XFD images must be multiple of 128 bytes. + Corrupted images won't work, but we gain a better detection of Atari files. + +* atari.c, cpu.[ch], monitor.[ch]: break_cim -> cim_encountered + (monitor displays "CIM encountered" not only in MONITOR_BREAK build) + +* antic.[ch], cpu.c, monitor.[ch]: ypos_break_addr -> break_ypos + +* cpu.c: support for Atari800Win PLus + +* rt-config.[ch], ui.c: don't exit emulator if "Update configuration file" + failed + +* ui_basic.c: fixed file selector: last directory entry wasn't sorted + +* ui_basic.c: right arrow in last column of file selector jumps + to the last entry + +* ui.c: improved "Extract ROM image from Cartridge": + - allocates only as much memory as necessary rather than 1 MB + - displays error message on write error + +* ui.h, ui_basic.c, wince/port/ui_wince.c: saved a few bytes per tMenuItem + +* wince/port/config.h: + #undef HAVE_NANOSLEEP, #undef HAVE_STRDUP, #define SIZEOF_LONG 4 + (this is for use with the preprocessor, so sizeof(long) was wrong), + #define STDC_HEADERS (this means there are stdlib.h, stdarg.h and string.h) + + +2005-09-14 Piotr Fusik +* atari.c, configure.ac: prefer nanosleep() (POSIX.1) to usleep() + and select(); prefer Sleep() on WIN32 + +* atari_x11.c: handle Motif/XView events in Atari_Keyboard() rather than + Atari_DisplayScreen() - F1 User Interface now works in these versions; + TODO: key repeat does not work on Motif and is too fast on XView + +* pokey.c: can use Win32 API instead of time() + +* rtime.c: can use Win32 API; fixed Y2K bug + +* compfile.c, devices.c, sio.c, util.[ch]: Util_unlink(); + use unlink() and not remove(), because remove() calls unlink() for files + and we never remove() directories + +* util.c: fixed Util_splitpath on root directory path + +* ui_basic.c: ".." in Win32 API based file selector on WINCE + +* ui_basic.c: include B: in DOS_DRIVES; detect floppies on WIN32 + + +2005-09-11 Piotr Fusik +* ui_basic.c: fixed file selector which I broke yesterday + +* atari.c: fixed parse error in zlib-less compilation + +* atari.c, devices.c: removed unnecessary "Fatal Error" messages + +* memory.c, remez.c, screen.c: use Util_malloc() instead of malloc() + +* rdevice.c: avoid malloc() + +* ui_basic.c: use Util_realloc() instead of realloc() + +* ui.h, ui_basic.c: fixed warnings + +* rtime.c: replaced "-rtime " with "-rtime" / "-nortime" + documented in "-help" + +* devices.c: replaced "-hdreadonly " with "-hreadonly" / "-hreadwrite" + +* devices.c, monitor.c, util.[ch]: Util_strupper() and Util_strlower() + +* pokey_resample.[ch]: removed dead code + +* act/fox.act: removed, use jakub.act instead (it is built-in) + +* monitor.c: extended labels (MONITOR_HINTS): + - can be disabled with "LABELS OFF" + - can be loaded with "LABELS LOAD" / "LABELS ADD" + (supported are label tables generated by xasm, Mad-Assembler + and HardCore Assembler) + - can be defined with "LABELS SET" + - you can use a label where a hex value is expected + - binary search replaced with linear, for simplicity + +* devices.c, win32/msc/config.h: H: lock/unlock work on MSVC, + using Win32 API directly; rename, mkdir, rmdir can be implemented + using Win32 API; Win32 API implementation of directory listing + is now the default and does not use stat(); fixed Y2100 bug :-) + +* ui_basic.c, util.[ch]: implemented file selector on MSVC + +* ui_basic.c: try to handle directories with ']' in their names + +* ui.c: removed an opendir() call (unnecessary, I think!) + +* compfile.[ch], sio.c: removed the unused diskno parameter from opendcm() + and openzlib() + +* remez.[ch]: fprintf(stderr, ...) -> Aprint(); + adapted to Atari800 coding style; added "static" to functions; + added "const" to pointers + +* atari.h, devices.c: "defined(WIN32) || defined(__PLUS)" -> "defined(WIN32)" + (Atari800Win PLus should define WIN32) + +* dos/dos_sb.c: fixed some of gcc -pedantic warnings; + adapted to Atari800 coding style + +* win32/atari_win32.c: F6 = Help, F7 = Break; TODO: 5200 keys + + +2005-09-10 Piotr Fusik +* configure.ac: #define our symbols to 1 (just like autoconf's own symbols); + described basic and *curses targets + +* win32/screen_win32.c: improved error handling: + - DirectX docs suggest using FAILED() instead of !=DD_OK + - display the name of the failed function and the return code + (unfortunately DXTrace() is available only in DirectX 8.0 and higher) + - display a hint if SetDisplayMode fails with DDERR_INVALIDMODE + (the default 320x240 doesn't work on my Win98SE / Radeon 9000, + although it works on XP on the same machine) + +* ui.h, ui_basic.c: char * -> const char * + +* rt-config.c, ui_basic.c, util.[ch]: simplified code by introducing + Util_splitpath() and Util_catpath() + + +2005-09-09 Piotr Fusik +* DOC/HOWTO-DIRTYSPAN: an alternative to DIRTYRECT (just an idea) + + +2005-09-07 Piotr Fusik +* sound_unix.c: set speed after stereo, because the allowed speed may be + different for stereo + +* antic.c, atari.[ch], atari_falcon.c, atari_sdl.c, atari_x11.c, cartridge.c, + cassette.c, colours.c, compfile.c, devices.c, input.c, monitor.c, + rt-config.c, rtime.c, screen.c, sound_falcon.c, sound_unix.c, ui.c, + ui_basic.c, util.[ch], dos/sound_dos.c, Makefile.in, amiga/makefile: + "util" is a new useful module not related directly to the emulation + +* configure.ac, list.[ch], ui_basic.c, amiga/makefile: improved file selector: + - sorts filenames case-insensitively + - displays "Please wait..." while the directory is read + - uses less memory (dynamic array instead of linked list, bye-bye list.[ch]) + - faster (quicksort instead of bubblesort) + +* compfile.c: fixed 32 KB memory leak per open zlib-compressed disk image + +* sio.c: optimized SIO_ChkSum() + +* ui.c: improved "Create Cartridge from ROM image": + - don't exit the emulator without any cleanup if the input file cannot + be read, display an error message instead + - display a message for files of non-standard sizes (including files that + are already CARTs) + - allocate only as much memory as necessary rather than 1 MB + +* ui.c: improved "Save Disk Set" and "Make blank ATR disk": + - can be cancelled by pressing Esc while editing the filename + - display a message on success + - display an error message on failure + - don't operate on NULL if fopen() fails + +* ui_basic.c: shorten the messages (especially the ones with long filenames) + to fit on screen + +* antic.c, atari.c, colours.h, cpu.c, mzpokeysnd.c, pia.c, pokey.c, + pokeysnd.c, win32/atari_win32.c, win32/joystick.c, win32/keyboard.c, + win32/sound.c: silenced MSVC 6 /W3 warnings + +* win32/main.c, win32/screen_win32.c, win32/msc/config.h, win32/msc/Makefile, + DOC/INSTALL: DirectX version can be compiled with Microsoft 32-bit C/C++ + Compiler 6.0. Currently missing features: + - file selector in ui_basic (one has to type the filename) + - lock/unlock operations on H: devices + - stereo (just haven't tested it yet) + + +2005-09-06 Perry McFarlane +* antic.c: a fix for DMACTL written twice in the same scanline + + +2005-09-05 Kostas Nakos +* wince/* : Updated the wince port to work with Smartphones. + Several other improvements to the port. + + +2005-09-04 Piotr Fusik +* monitor.c: initialize break_addr with 0xd000. Previously, Atari800 + compiled with MONITOR_BREAK (the default) entered the monitor + rather than executing the instruction at address 0x0000 + (perfectly legal for 6502 code). + +* ui_basic.c: don't hide ATR/XFD file extensions in the file selector + +* atari_svgalib.c: Atari 5200 keys + +* sound_unix.c: fixed sound on Linux. This is black magic to me. + I hope there will be some feedback from users. + + +2005-09-03 Piotr Fusik +* atari.c, gtia.c: I broke the BASIC version recently, fixed + +* cpu.c: cycle-exact Read-Modify-Write instructions for NEW_CYCLE_EXACT + +* antic.c, configure.ac, gtia.c, util/benchmark.pl: removed CYCLE_EXACT + (superseded by NEW_CYCLE_EXACT) + +* devices.c: improved "K:" input in BASIC version: use just the first + character from the entered line and ignore the remaining characters + (including EOL). This is because the input from the terminal + is line-buffered, so we have to press Enter for the Atari emulation + to continue - but we don't want this Enter to be delivered + to the emulated Atari. + +* devices.c: BASIC version: Atari Clear Screen, Backspace, Tab and Bell + converted to the corresponding ASCII codes + +* atari_x11.c, configure.ac: (x11-)xview(-shm) now compiles and works + +* atari_x11.c: fixed Shift+F5; F8 and (Shift+)F10 are now "Enter monitor" + and "Save (interlaced) screenshot", respectively (just like in other + versions of Atari800); don't clear key_shift when another key is pressed + TODO: Alt+letter shortcuts + +* atari_svgalib.c: implemented F6 (Help) and F7 (Break) + +* amiga/config.h: updated for clib2-1.194 + + +2005-08-31 Piotr Fusik +* atari.[ch], ui.c: auto-starting any file supported by the emulator + via the command line, User Interface or Alt+R + +* binload.c: a fix for BASIC loader that didn't work if drive 1 + was enabled but contained no disk + +* cpu.c: CYCLES_PER_OPCODE, NO_V_FLAG_VARIABLE, PC_PTR, PREFETCH_CODE + for better (?) performance (not enabled by default); + WRAP_64K and WRAP_ZPAGE for very precise emulation; + optimized CPU_GetStatus(), CPU_PutStatus(), BRANCH() + +* devices.c: created Device_OpenDir() and Device_ReadDir() that simplify + searching directories. On Windows, if opendir() is not available, + these functions are implemented using Win32 API. Changed behaviour: + - directory listing and wildcard functions Rename, Delete, Lock, Unlock + should now correctly handle the current directory, root directories + and files with uppercase letters on case-sensitive filesystems + - filenames in directory listing are no longer converted to uppercase + - filename extension in the directory listing is now the filename part + after the last dot and not the first one + +* devices.c: improved H5:-H9: + - reading supports CR/LF and CR files in addition to LF + - writing uses native EOLs rather than LFs + +* devices.c: Device_HHSPEC_Disk_Info(), Device_HHSPEC_Current_Dir() + no longer use dPutByte(), so the result is wrapped at 64K, + doesn't get written to ROM and may be written to hardware registers + +* gtia.c: optimized GTIA_GetByte() + +* log.c: fixed Aflushlog's bad behaviour when the log contained percents + +* memory.[ch]: added two extra bytes to memory[], because the CPU + emulation can access them + +* cartridge.h, memory.[ch]: state files should now work with PAGED_ATTRIB + +* boot.h, ui.c: MakeBlankDisk() now writes a blank Single Density disk + rather than a 3-sector disk with useless executable loader - removed boot.h + +* atari.[ch], colours.c, gtia.[ch], input.c, log.[ch], mzpokeysnd.[ch], + pokey.[ch], pokeysnd.[ch], rt-config.[ch]: support for Atari800Win PLus + +* util/benchmark.pl: dropped "-run" so any Atari program may be used + + +2005-08-27 Piotr Fusik +* atari_sdl.c, atari_x11.c: now compile with --disable-sound + +* cartridge.c, memory.c: cast the result of malloc() + +* cassette.h: declared CASSETTE_CreateFile() + +* compfile.[ch], sio.c: created compfile.h + +* cpu.c: restored that "continue" at the end of the main loop + +* devices.[ch]: DEFAULT_H_PATH moved to devices.h (for Atari800Win PLus) + +* input.c: corrected file description + +* memory.h: wrap macro arguments in parentheses, just in case + +* remez.c: fixed a memory leak (found by Marcin Lewandowski) + +* configure.ac, sound.c, sound_unix.c: + renamed sound.c to sound_unix.c to avoid confusion + +* statesav.c, ui_basic.c: MSVC declares getcwd() in + +* atari.c, util/benchmark.pl: performance tests + (some results posted to the mailing list) + + +2005-08-24 Piotr Fusik +* atari.c: load state files from the command line using "-state" + +* sio.c: recognize disk image format by the header rather than filename + extension (*.DC3 now work as DCM) + +* screen.h, ui.c: show_atari_speed, show_disk_led, show_sector_counter + available in "Display Settings" + +* devices.c: H: and R: work with PAGED_ATTRIB + +* screen.c: fixed Screen_DrawAtariSpeed() not updating with refresh_rate > 1 + +* ui_basic.c: use stricmp() if there's no strcasecmp() + +* monitor.c: people may mean accumulator mode when they write "ASL A" + in the assembler + +* atari_curses.c: keypad works on PDCurses + +* cpu.[ch]: changed remember_PC_curpos and remember_jmp_curpos + to unsigned, because "x % POWER_OF_TWO" is much faster for unsigned x + (1 instruction vs 6 on x86) + +* antic.c, monitor.[ch]: changed ypos_break_addr from UWORD to int (faster) + +* cpu.c, monitor.[ch]: PROFILE -> MONITOR_PROFILE, TRACE -> MONITOR_TRACE + +* monitor.c: combined consecutive printfs + + +2005-08-22 Piotr Fusik +* cartridge.c: Atarimax cartridges can be bank-switched by reading $D5xx + +* atari.c, emuos.h: stripped 2k more from emuos (it has no Floating Point, + obviously!) + +* atari.c, memory.c: don't try to load BASIC ROM in 400/800 emuos mode + +* devices.c, mkimg.c, monitor.c, prompts.c, rdevice.c, sio.c: + avoid the potentially signed-char-unsafe functions (macros?) + +* configure.ac: good advice for those poor souls who run "configure" + with just "--enable-veryslow" and expect a miracle ;-) + +* atari.h, ui.c: new "Display Settings" menu allows for changing the framerate + and toggling sprite_collisions_in_skipped_frames + + +2005-08-21 Piotr Fusik +* cartridge.[ch], ui.c: Atarimax cartridges + +* atari.c, statesav.c: fixed loading of non-verbose state files + +* atari.c: "--usage" and "--help" now work + +* memory.[ch], sio.c: CopyFromMem and CopyToMem (both used by SIO) + now work with hardware registers + +* monitor.c: use fflush(stdout) where necessary; + normalized all hex output to uppercase; + improved "JUMPS": now displays the instructions; + improved "PROFILE": now displays the instructions; + accept "ASL @" in assembler + +* rt-config.c: default filename for the 5200 ROM; + moved Atari_ConfigInit() to the end of RtPresetDefaults(), + so the Smartphone port can override enable_new_pokey + +* screen.c: improved Screen_DrawAtariSpeed: updated every 0.5 sec or so + +* sio.c: removed unportable DEBUG code + +* configure.ac, statesav.c: use #ifdef HAVE_STRERROR + +* configure.ac, compfile.c, devices.c: use #ifdef HAVE_REWIND + +* ui.c: error messages for state load/save + +* atari.[ch], compfile.c, configure.ac, devices.c: use ANSI/POSIX tmpnam() + for creating filenames of temporary files, rather than unportable + mktemp/mkstemp. tmpnam() generates filenames in system's temporary + directory. + +* antic.c, atari.c, atari_curses.c, gtia.c: Self Test menu highlighting + on Curses + +* atari_curses.c: fixed display of '\x7f'; + use KEY_HELP, KEY_SHELP, KEY_LHELP, KEY_BREAK, KEY_HOME, KEY_CLEAR, + KEY_IC, KEY_IL, KEY_DC, KEY_DL, KEY_STAB, KEY_CTAB if available + +* atari_sdl.c: "-rotate90" now works correctly on little-endian machines; + don't initialize sound with "-help"; 5200 keys; F6=Help, F7=Break; + Shift/Control for Atari, Help, Space, Return, Tab, arrows; + Alt+B isn't repeated at a crazy speed + +* atari_x11.c: MUCH faster screen display; 5200 keys; Caps can be released; + Shift/Control for Help, Escape, Space, Return, Tab + +* configure.ac: fixed x11-motif + +* antic.[ch], compfile.c, input.c, screen.h, dos/atari_vga.c, ui.c: + minor clean up + + +2005-08-19 Piotr Fusik +* atari.c, screen.[ch]: Screen_Initialise(); + support "-screenshots " on the command line: it defines a pattern + for quick screenshots (i.e. the ones made with (Shift+)F10). + For example "-screenshots /home/fred/foo##.pcx" means that + /home/fred/foo00.pcx, /home/fred/foo01.pcx, ... should be used. + Existing files are overwritten only if all the files defined by the pattern + exist. Submitted as a feature request on sf.net. + +* atari_curses.c: Alt+letter work on PDCurses; + Ctrl+letter should be Control+letter, not Shift+Control+letter; + Always treat 0x08 and KEY_BACKSPACE as Backspace; + F10 = Screenshot (must run configure with --disable-cursesbasic to make this + one work) + +* atari.c, emuos.h: stripped 6k of zeros from emuos + +* ui.[ch], ui_basic.c: shortcut keys (Alt+letter, F9, ...) didn't work in UI + (reported as a bug on sf.net) + +* monitor.c: addr defaults to regPC (handy for "D" and "LOOP"); + new command "LOOP": disassemble from the beginning of a loop that contains + the instruction at the specified address. + The loop is detected by looking for a branch instruction after the specified + address whose target is below (or equal to) the specified address. + Unconditional (JMP) loops are not detected. + + +2005-08-17 Piotr Fusik +* configure.ac, *.c: autoconf improvements for Playstation 2; + include config.h before system headers as autoconf's manual suggests + +* configure.ac: don't use AC_FUNC_MALLOC because we never do malloc(0) + +* rt-config.c: check if print_command is safe for sprintf format + +* atari_x11.c, memory.[ch], ui.c: removed PILL (use cartridge images instead) + + +2005-08-15 Piotr Fusik +* atari.c: corrected VOL_ONLY_SOUND in BASIC and CURSES_BASIC + +* binload.[ch], sio.c: BIN_loade_start -> BIN_loader_start + +* cpu.c: corrected cycles for unofficial opcodes 0xB3, 0xBB, 0xBF + +* cpu.c: auto-define NO_GOTO for non-gccs + +* cpu.[ch], monitor.c: HISTORY displays ypos xpos also with NEW_CYCLE_EXACT + disabled + +* cpu.c, memory.h: changed some | to +: this gives better code on x86 due to + the LEA instruction + +* monitor.c: "C", "M" and "S" support hardware registers + +* monitor.c: display correct value for ZP,Y instruction + +* monitor.c: PENL -> PENV + +* cartridge.c, memory.[ch]: code simplified by defining SetROM and SetRAM + for PAGED_ATTRIB + +* devices.c: '!', '#', '$', '&', '(', ')', '-' and '@' are now valid + in H: filenames + +* atari.c, binload.[ch], cartridge.c, cpu.[ch], devices.c, ui.c: + direct loading of Atari Basic programs. Supported are: + - SAVEd (*.BAS) programs + - LISTed (*.LST) programs with auto-detected Atari, LF, CR/LF or CR + line terminators + From the user's point of view, loading of Atari Basic programs works + exactly like loading binary executables: use "-run" from command line + or "Run Atari program directly" from the User Interface. + The inner workings are much more interesting: + 0a. BIN_loader() detects file type: *.BAS programs start with two 0x00 bytes, + *.LST programs must start with a digit. + 0b. During coldstart Atari Basic is enabled, even if disable_basic is set. + 0c. Device_PatchOS() installs a patch for E: write. + 1. The "READY" prompt is expected on E:. This is not necessarily + the first thing printed on E: - a DOS may print its messages before running + Atari Basic. + 2. RUN "E:" (for *.BAS) or ENTER "E:" (for *.LST) is passed to Atari Basic + via E:. + 3. A patched E: open handler installs handlers for read and close operations. + 4. Reading bytes from the file. A conversion is applied to *.LST files: + first 0x9b, (0x0d,0x0a), 0x0d or 0x0a found in the file becomes the line + terminator and is converted to 0x9b. + 5. Close file. Patches are removed. + 6. (for *.LST) The "READY" prompt is expected on E:. If something different + appears (probably "ERROR"), skip the step 7. + 7. (for *.LST) "RUN" is passed to Atari Basic via E:. + + +2005-08-14 Piotr Fusik +* dos/dos_sb.c, dos/sound_dos.c: stereo now works + +* dos/atari_vga.c, dos/sound_dos.h: sound_dos.h removed, use sound.h instead + +* rt-config.c: support 16, 576, 1088 RAM; skip non-working options + +* ui_basic.c: avoid negative array indexes with special keys pressed in UI + + +2005-08-13 Piotr Fusik +* atari_curses.c: TAB is now TAB rather than CONTROL+I; + F8 is "enter monitor" not coldstart; + Start, Select, Option can now be released; + fixed -wide2 mode + +* antic.c, atari.c, atari_curses.c: generate curses screen basing on the DL + rather than OS screen - Self Test and halt screen of emuos are now visible + +* configure.ac: support --target x11-shm, x11-motif, x11-xview, x11-xview-shm; + changed hints for symbols in config.h to full sentences, + to be consistent with autoconf-generated hints; + fixed hint for VOL_ONLY_SOUND; lack of zlib is no fatal error; + check for signal.h, termios.h, memmove, signal, strspn; + CURSES_BASIC; no sound objects if SOUND disabled + +* antic.c, atari.c, configure.ac, gtia.c, input.c, ui.c, ui_basic.c: + CURSES version without bitmap screen generation (i.e. no screenshots) + enabled with CURSES_BASIC - faster and smaller, enabled by default + +* cartridge.c, cassette.[ch], pokey.[ch], sio.c: fixed warnings + +* antic.[ch], gtia.c, pokey.c, statesav.[ch], ui_basic.c: fixed indentation + +* ui.c: not compiled-in features don't show in menus + +* cartridge.c, sio.c, statesav.[ch]: added functions for filename save/read + +* configure.ac, Makefile.in, ui.c: no sound emulation if sound is disabled + + +2005-08-10 Piotr Fusik +* atari_basic.c: sound support; don't link with input.o + +* atari.c: BASIC and VERY_SLOW now generate all kinds of interrupts. + This generally means that you can hear music and SIO works without a patch. + Timing in these versions is now much more precise. + +* antic.[ch], monitor.c: "dlist" in monitor now supports Display Lists + in extended memory with exclusive Antic access + +* devices.c: patching E: open doesn't make sense + +* cassette.c, ui.c: hold_start_on_reboot moved to cassette.c + +* antic.c, cartridge.c, gtia.c, memory.c, pia.c, pokey.c, sio.c: + no state files in BASIC version + +* configure.ac, Makefile.in: link cycle_map.o only for NEW_CYCLE_EXACT; + CYCLE_EXACT, NEW_CYCLE_EXACT, CRASH_MENU, VERY_SLOW not available in BASIC + version; input.o, screen.o, colours.o, statesav.o, list.o, ui_basic.o, ui.o + not linked in BASIC version + +* atari.c, cpu.c, gtia.c, pia.c, pokey.c: input.o and statesav.o not linked + in BASIC version + +* Makefile.in: "make clean" now additionally cleans dos/, falcon/ and win32/ + +* mzpokeysnd.c, pokeysnd.[ch], sndsave.[ch]: Sound Recording was designed + only for 8-bit unsigned samples mono on little-endian machines. Even in this + configuration it didn't work, because the frequency wasn't written + in the header (and you should have selected old pokeysnd in order to have + any samples in the file). Now 8-bit unsigned samples mono/stereo old/new + Pokey should work on all machines. 16-bit and signed samples are still TODO. + +* ui.c: Sound Recording to atari000.wav, atari001.wav, etc. rather than 0.raw, + 1.raw. Doesn't overwrite existing files now. TODO: prompt for filename. + +* atari.c: close sound file at exit, so correct headers are written + +* antic.c, cartridge.[ch], cpu.c, emuos.h, gtia.c: added consts + +* antic.c: fixed code formatting + +* configure.ac: small fix for ncurses and support for pdcurses + +* atari_curses.c: backspace now works on DJGPP/pdcurses + + +2005-08-07 Piotr Fusik +* mzpokeysnd.c: eschew traditional comments in log messages! + +* devices.c: MSVC headers have no S_IRUSR nor S_IWUSR + +* devices.c: empty Hx_DIR now refers to the current directory rather than + the root + +* ui.c: display error messages for "Run BIN file", "Select tape", + "Insert cartridge" and "Save screenshot" + +* compfile.c: fixed indentation; other minor improvements + + +2005-08-06 Piotr Fusik +* configure.ac, devices.c: check for rename() and snprintf() + +* devices.c: fixed error codes; fixed "unused" warnings; other minor fixes + +* antic.[ch], atari_sdl.c, atari_x11.c, cassette.[ch], cycle_map.h, + pokeysnd.[ch], screen.h, ui.[ch], ui_basic.c, dos/atari_vga.c, dos/vga_gfx.h: + changed () function signatures to (void) + +* antic.c, atari_sdl.c, atari_x11.c, cassette.c, cycle_map.c, monitor.c, + pokeysnd.c, ui_basic.c: fixed indentation + +* rtime.c: optimized RTIME_GetByte + +* mzpokeysnd.c, pokey.c, pokeysnd.h, pokey_resample.c, prompts.c: + // comments changed to /* */ + +* emuos.lis, emuos.h, ui_basic.c: updated copyright year + +* atari.c: if no sleep-like function available, fall back to time polling + +* monitor.c: fixed a warning + + +2005-08-05 Piotr Fusik +* configure.ac: added checks for some headers and functions used in devices.c + and atari.c. + VERY IMPORTANT: if you don't use Configure, make sure you define HAVE_* + symbols (in config.h) for the header files and functions you have. + +* sio.c: getcwd() may be unavailable + +* devices.c, devices.h: fancy I/O functions may be unavailable; + got rid of numerous #ifdef BACK_SLASH + +* statesav.c: ReadDisabledROMs wasn't actually called! + Thank you GCC 4 for the warning. + +* atari.c: use best time functions available - now checked by Configure, + not hard-coded for platforms (almost...) + + +2005-06-24 Piotr Fusik +* sio.c: fixed PERCOM configuration (spotted by Erhard Puetz): + - 1 track, 1 side for non-standard disk images (i.e. exactly 65535 sectors + for 65535 sectors image) + - 80 tracks for standard 720K, 1.44M and 2.88M disks + - MFM byte is 0 for SD, 4 otherwise + - unused bytes are set to 0 + + +2005-05-20 Piotr Fusik +* antic.c, sndsave.h, ui_basic.c: fixed an error and some warnings reported + by GCC 4.0.0 + + +2005-05-13 James Wilkinson +* win32/atari_win32.c, win32/joystick.[ch], win32/main.c: added DirectX + joystick support + +* win32/atari_win32.c: cleaned up initialization with nonexistent config file + + +** 1.3.6 released on 2005-04-30 + +2005-04-30 Petr Stehlik +* ui.c, boot.h: "Make Blank Boot Disk" added to "Disk Management", + inspired by LNG (lng.sourceforge.net). It creates a blank boot atr file. + Before you can use this blank disk, you must format it. Patch by + 'maddoxik' (whoever he is, didn't supply real name). + + +2005-03-24 Piotr Fusik +* cpu.c: fixed incorrectly saved N flag when entering the monitor (bug found + by Marcin Lewandowski) + +* devices.c: added "-help" + + +2005-03-15 Achim Haertel +* casette.[ch], pokey.[ch], sio.[ch], pia.c: implemented cassette loading + by hardware registers. + Examples of now working games: + - Ninja: (eof-)blocks pass on tape while the OS waits for a leader. + - Elektraglide has a nonstandard format which is not readable by the + SIO-patch but requires raw loading. + + +2005-03-11 Piotr Fusik +* atari_x11.c: "-mouse" works. Set default clipping area to 336x240. + x11-motif is now compilable, possibly also x11-xview. + + +2005-03-10 Piotr Fusik +* atari_basic.c: updated for new Atari800_Frame() + +* atari_sdl.c: corrected Atari_TRIG() and don't initialize sound on "-help" + +* ui.c: "Extract ROM image from Cartridge" should skip the CART header, + not just copy the whole file + +* ui_basic.c: fixed a memory leak + +* ui.[ch], atari.c, cpu.c: removed the unused "screen" parameter from ui() + and SelectCartType() + + +2005-03-09 Petr Stehlik +* atari_sdl.c: switched back to Atari800_Frame like all other ports do. + So far everything looks OK. Why did Jacek abandon the Atari800_Frame + way? Weird. + Also finally disabled propagating of the KP0-KP9 keys to key_code. + Without this the keyboard joystick emulation was mostly unusable. + Needs a more general solution - masking out all keyboard joystick keys. + Copy from atari_vga.c, it's solved properly there, IIRC. + +* atari_x11.c: disabled propagating of the KP0-KP9 keys to key_code. + +* configure.ac: enables linux joystick by default. The atari_x11.c needs + a lot of cleanup: move the mouse emulation to input.c and make sure + the keyboard joystick, mouse joystick and real joysticks do cope together. + + +2005-03-08 Piotr Fusik +* antic.c: added missing combinations of ANTIC modes with GTIA modes. + GTIA modes are correctly scrolled horizontally. + +* compfile.c, devices.c, gtia.c, monitor.c, mzpokeysnd.c, sio.c, ui_basic.c: + killed gcc -W warnings. Remained only the warnings about unused parameters. + +* antic.c, input.c, dos/sound_dos.c: handle "-help" option + + +2005-03-05 Piotr Fusik +* ui_basic.c: fixed "Error opening '' directory" + +* input.[ch]: support AKEY_BREAK + +* atari.[ch], atari_curses.c, atari_falcon.c, atari_svgalib.c, atari_x11.c, + amiga/amiga.c, dos/atari_vga.c, win32/main.c, wince/port/atari_wince.c: + support for special AKEY_*, refresh rate control and atari_sync() + moved to Atari800_Frame() + +* atari_curses.c, atari_falcon.c, atari_x11.c: F6 is Atari HELP key + + +2005-03-03 Piotr Fusik +* win32/*, configure.ac: + renamed win32/screen.[ch] to win32/screen_win32.[ch] + +* wince/port/*, wince/PocketAtari.vcp: + renamed wince/port/screen.* to wince/port/screen_wince.* + +* atari.[ch], screen.[ch], antic.c, cpu.c, input.c, ui_basic.c: + moved screen-related variables to the new "screen" module + +* configure.ac, makefile, atari.[ch], screen.[ch], sio.[ch], atari_sdl.c, + dos/atari_vga.c: + deleted diskled.[ch], moved disk LEDs to the new "screen" module, + added sector counter and speedometer + + +2005-02-23 Piotr Fusik +* colours.[ch]: refactored, using jakub.act by default + +* log.c, configure.ac: use vsnprintf only if available + +* screen.[ch]: renamed from ataripcx.[ch] and added PNG screenshots + +* atari.c, atari_curses.c, atari_sdl.c, atari_svgalib.c, atari_x11.c, ui.c, + Makefile.in, amiga/makefile, dos/atari_vga.c, win32/main.c, + wince/port/atari_wince.c, wince/PocketAtari.vcp: + PNG screenshots + + +2005-02-22 Piotr Fusik +* cartridge.c: switch back on the main bank of switchable XEGS cartridges + (bug found by Chris Hutt) + + +2005-01-06 Petr Stehlik +* atari_sdl.c: F8 (enter monitor) was not implemented. Fixed. Also + entering monitor now switches off the fullscreen mode which makes + the monitor usable in X-Windows (not sure about framebuffer but + I'd guess for that one we'd have to turn off the graphics completely). + + +** 1.3.5 released on 2004-12-30 + +2004-12-29 Petr Stehlik +* atari_x11.c: Ken Zalewski contributed a patch for keyboard handling + that fixes a segfault (XLookupString was called even if the event + was not keyboard related). + +* atari_x11.c: after looking into the keyboard handling under X11 + I realized that keyboard auto-repeat was not working at all. + I tried to fix it by keeping the keycode status persistent. + It seems to work in non-XVIEW/non-MOTIF version. + + +2004-12-28 Petr Stehlik +* atari_sdl.c: Daniel Serpell contributed a patch for keyboard handling + that makes the Atari800 keyboard working on non-US keyboard layouts + simply by using the Unicode values of the keys (instead of scancodes). + Also, keys Control-0 to 9 and Control-A to Z were added. The "Atari" + key is mapped to the left Windows key, the Caps-toggle key is mapped + to the right Windows key and the Atari Shift+F1 and Shift+F2 keys + are mapped to host's PageUp and PageDown keys (as this is the function + of those keys in the Atari-XL OS). + + +** 1.3.4 released on 2004-12-27 + +2004-11-26 Petr Stehlik +* rt-config.c: fixed many possible buffer overflows that were dangerous if + atari800 was installed suid root. Thanks for analysis go to Adam Zabrocki. + +* svgalib.c: fixes a compilation error when compiling with GCC 3.4.x + (compiler chokes on label at end of block). Thank for patch to Andrew Church + + +2004-11-17 Perry McFarlane +* antic.c: Fix for Timeslip game. Newcycleexact dmactl change bug. + + +2004-09-24 Sebastian Bauer +* ui_basic.c: fixed NULL pointer access in file dialog which happened if there + were no files in the selected directory. + +* amiga/*: updated + + +** 1.3.3 released + +2004-08-08 Petr Stehlik +* various files: updated for 1.3.3 release + + +2004-08-05 Christian Groessler +* atari_x11.c: adds the left ctrl key as joystick button if "-keypad" is + in use. Also cleans up mostly by adding ANSI C function headers. + + +2004-07-26 Sebastian Bauer +* amiga/*: major update, cleanup, fixed console keys, upgraded sound support + + +2004-07-05 Petr Stehlik +* configure.ac: Ken Ames sent a patch that supports OS/2 + + +2004-06-06 Petr Stehlik +* atari_x11.c: Christian Groessler's patch adds missing keyboard autorepeat + when in the internal Atari800 debugger. + +* prompts.c: fixed RemoveSpaces() - should not remove space from within + the string, only leading and trailing space chars should be removed. + +* rt-config.c, configure.ac: SUPPORTS_ATARI_CONFIG* now set in configure.ac + for DOSVGA and SDL. This also fixes joystick definition not loaded in + the DOSVGA port since the #ifdef VGA was changed to #ifdef DOSVGA. + +* atari_sdl.c: emulated joysticks configured in the atari800.cfg file + thanks to patch from Benny (Fishy_PKAT151). This is incompatible + with the DOS VGA port configuration so I expect this to change + before 1.3.3 release. + +* rt-config.c: RemoveSpaces() called on both keyword and its value. + +* rt-config.c, atari_sdl.c: bunch of Aprint() cleaned up + + +2004-06-04 Petr Stehlik +* config.{sub,guess}, debian/*: updated by the atari800 debian diff file + + +2004-06-03 Piotr Fusik +* antic.c: ANTIC mode 2 + GTIA mode 10 should be shifted right by a half + of a pixel [a fix for the upcoming demo :-) ] + + +2004-06-02 Petr Stehlik +* atari_x11.c: Christian Groessler suggested to add XK_Break key check + so that Ctrl+Pause on linux machine generates the AKEY_BREAK keypress. + + +2004-02-21 Petr Stehlik +* rdevice.c: Martin Albert, our new Debian package maintainer, suggested + to allow /dev/ttyS0 for all Linux archs, which is a good idea. + This device should be runtime configurable, anyway. + + +2003-12-21 Petr Stehlik +* ui_basic.c: Aprint warning that fileselector couldn't open a folder. + The warning should be propagated to the UI and shown to user. Or better + yet, the Fileselector should be able to modify the path until it could + open it (example: /tmp/state_files/ -> /tmp/) + + +** 1.3.2 released + +2003-12-20 Petr Stehlik +* macosx/*: all old files removed and new up-to-date ones (from Mark Grebe) + stored in a single macosx.tar.gz file for easier maintenance. + +* various files: increased version for new 1.3.2 release + + +2003-12-16 Piotr Fusik +* cartridge.[ch], ui.c, DOC/cart.txt, DOC/README: new cartridge types: + Phoenix and Blizzard + +* cassette.c: write cassette description, update tape position indicators + when writing, changed C++ style comments to traditional + +* atari.c: check OS before applying C: patches + + +2003-12-17 Mark Grebe +* compfile.c: Fixed serious bug in Type 41 decoding +* mzpokeysnd.c: Added console and SIO Sound back in + + +2003-11-22 Achim Haertel +* atari.c: when the snailmeter is enabled and the speed grown beyond 100% + a negative amount of memory was tried to be filled. + + +2003-11-14 Achim Haertel + Cassette handling greatly improved: + +* atari.[ch]: OS patched for tape leader recognition + +* cassette.[ch]: Loading improved, skips now blocks which pass on tape while + the OS waits for a leader. Writing implemented. Some bugfixes (CAS format + chunk header size is always 8, record checksum for raw files). + +* sio.c: Evaluates i/o-commands for cassette + +* ui.c: "Load tape image" renamed to "Select tape image" + + The remaining open points are: + - State of cassette operation is not saved in state file - is the expense + necessary? + + - Tape file selector (and disk too) would need 2 additional points at top: + and (atm tape save is only possible if you create a file + with 0 length and insert that). + + +2003-11-13 Perry McFarlane +* antic.c: DMACTL NEW_CYCLE_EXACT width decrease fix for SERIOUS diskmag #8 + + +2003-11-13 Petr Stehlik +* log.c: corrected buffer overflow found by Laios Mircea + + +2003-10-26 Mark Grebe +* cartridge.c, sio.c, statesav.c: saving disk and cartridge info + in the state file. Bumped the state file version number, and then added + save functions to the Cart and SIO files. It currently supports reading + the current version (3) as well as the new version (4) state files. + It writes only the new version (4). The filename information for cartridge + and disk information is stored in two ways. It is stored as a relative + path if the file is in the emulator's directory tree, and it is stored + as an absolute path if it isn't. If it doesn't find the cartridge or disk, + it does not refuse to load the state, but continues. New state file format + works extremely well with the bank switched cartridges. + + +2003-10-25 Petr Stehlik +* atari_falcon.c: disable compiling with stereo sound enabled + +* log.c: do MacOSX a favor and generally allow platform specific Aprint + output + +* atari.c: wrong path to disk image is not a reason to quit with an error + message + +* mzpokeysnd.c: simple fix for SERIO_SOUND (thanks to Mark Grebe) + +* pokey.c: some platforms (MacOSX) might need different SOUND_GAIN + so it's possible to define it in configure/Makefile now. + +* atari_sdl.c: hatefully backported fix from input.c (see 2003-09-21) + Somebody should inspect the atari_sdl.c why it doesn't use the + Atari800_Frame system and possibly use it in the SDL port as well. + +* DOC/TODO: some items removed, some edited. + + +2003-10-24 Piotr Fusik +* sio.c: "Overmind" runs with NEW_CYCLE_EXACT and SIO patch enabled. + I implemented NO_SECTOR_DELAY in 0.9.9i to allow running the "Overmind" + demo. Originally this hack relied on the xpos variable and thus wasn't + NEW_CYCLE_EXACT compatible. Now the delay occurs only between + successive reads of sector 1, not every time reading sector 2. + This makes every disk image boot 0.2 sec. faster. +* sio.h: NO_SECTOR_DELAY is internal to sio.c + + +2003-09-23 Piotr Fusik +* ui.c, sio.h: added Rotate_Disks() to UI + + +2003-09-22 Perry McFarlane +* antic.c: got sprite collisions working with NEW_CYCLE_EXACT + (broken by mistake) +* antic.c: a fix for "Sweet Illusions" part with wireframe vectors + (sprites highlighting the scrolling text) + + +2003-09-21 Piotr Fusik +* input.c: implemented bit 6 of SKSTAT - now you can exit from + the "spinning camera" part of "Cool Emotion" +* mkimg.c: general clean-up: int main, fixed #includes, etc. + + +2003-09-16 Perry McFarlane +* antic.c: cycle-perfect CHACTL mid-scanline changes +* DOC/BUGS: updated + + +2003-09-15 Chris Martin +* DOC/rdevice_faq.txt: detailed documentation + + +2003-05-28 Chris Martin +* rdevice.c: fixed several bugs with the sockets version, and it now includes + a serial port mode as well. The R: device can now be emulated by network + sockets or you can connect directly to the host serial ports (/dev/ttyS0, + etc.) in order to talk to a real modem. + + There is a variable near the top of the rdevice.c file called 'r_serial'. + When this is 0, network sockets are used; when it is 1, the RS232 port on + the host is used. This variable should be moved to rt-config.h and the + atari800 config file could have a line that says: + + R_SERIAL=1 + + +2003-09-04 Petr Stehlik +* compfile.c, devices.c: small fix for possibly undefined O_BINARY in the + mkstemp emulation from Perry. This could help me compiling Atari800 + on Falcon where I have an older version of MiNTlib. + Also make sure "config.h" is included wherever you rely on configure + defines.. + +* DOC/BUGS: some bugs removed as direct response on Perry's newest patches. + Possibly many more bugs from this list could be removed now. + +* DOC/TODO: added three very important things to do at the top of this + TO-DO list. Also added an item about configuring the R: device, this + time at the bottom of the list. + + +2003-09-14 Perry McFarlane +* win32/sound.c: round buffer to a sample pair if STEREO sound configured + +* compfile.c, devices.c, configure.ac: make sure mkstemp() is defined and + if it's not, emulate it using mktemp(). Helps compiling in mingw32. + +* antic.c: CHBASE timing is cycle-exact now. Fixes Endless Dream (credits + in the intro), among others. + +* gtia.c: DMACTL timing is now improved. Fixes Sweet Illusions (sprites + highlighting the scroll) and surely also other games and demos. + + +2003-09-04 Petr Stehlik +* configure.ac: forgot to increase version + +* util/export: added check for version in configure.ac + +* ChangeLog: some older entries about fixing bugs in Debian BTS corrected + +* debian/*: taken from fresh debian package of Atari800 1.3.1 + + +** tagged as ATARI800_1_3_1 + +2003-09-04 Petr Stehlik +* configure.ac: svgalib target added + +* SVGAlib target dropped from Debian and RPM build scripts + +* -rc1 removed from everywhere, it was causing pain for the build scripts + +* sockets.txt renamed to r_device.txt + +* Makefile.in: rewritten a bit the install process. Now actually becoming + usable - for example "make install DESTDIR=/tmp" now does something + useful. There's a bit more work to do - install the rest of documentation + and write 'uninstall' target. + +* atari800.spec: builds on the Makefile.in improvement. Now should finally + install the man page everytime. + + +** tagged as ATARI800_1_3_1-RC1 + +2003-09-03 Petr Stehlik +* dos/vga_gfx.h: wrong #endif fixed +* dos/atari_vga.c: cleaned up a bit, added #ifdef SHOW_DISK_LED +* configure_dos.bat: default target and bufferedlog pre-set +* atari.h: version increased to 1.3.1-rc1 + + +2003-08-31 Petr Stehlik +* rdevice.c: GPL header added (hope that it actually was free source before + Chris brought it to Atari800 project) + +* rt-config.c: R: patch is not enabled by default. It can be enabled in the UI + +* ui.c: R: patch named as "Atari850 emulation via network" (better description + welcome) + +* DOC/sockets.txt: this is the explanation of R: - couple of excerpts from + Atari800 mailing list mails. + + +2003-08-31 Ed Cogburn +* Makefile.in, configure.ac: rdevice.o compiled and linked in only on linux + or Unix and unless --disable-riodevice was used when configuring. + +* devices.c, atari.h: R: is compiled in only if R_IO_DEVICE is defined (see + configure --enable-riodevice, note that it is defined by default) + + +2003-08-05 Petr Stehlik +* atari.c: tried to fix a recent security issue known as CAN-2003-0630, + found by Debian Security Audit Project, Debian BTS #203707. + In order to provide a complex fix (better than the one suggested in BTS) + I wrote code that is not looking very well but works correctly, hopefully. + Nevertheless this fixes only the core module arguments parsing - the + sound module and port specific modules do it on their own and that + should be fixed as well. Best by going for GNU getopt! + + Also the osa/osb/xlxe/5200/basic rom loading options were not documented + in the "-help" list. Fixed. + +* atari_sdl.c: refresh_rate unused, removed + + +2003-08-05 Achim Haertel +* sio.c: fixed random timeout while sectorread at datatransfer with + command frames. + - added: xf551 hispeed commands (0xA1, 0xA2, 0xD0, 0xD2, 0xD7) + - added: status command reports errors in last read/write operation + + caveat: the only commandframe which transfers in hispeed is sectorread, + all other use normal speed in the emu + +* pokey.c: xf551 hispeed transfer uses SIO speed 0x10 + + +2003-07-04 Piotr Fusik +* mzpokeysnd.c: added key click + +* cpu.c: a fix for "CMC Demo" crashing NEW_CYCLE_EXACT emulator + (the problem could probably exist in many other demos + which play samples using IRQ) + + +2003-06-27 Perry McFarlane +* cycle_map.[ch]: a fix that prevents "Cool Emotion" demo from crashing + NEW_CYCLE_EXACT emulator if P: patch is disabled + + +2003-06-18 Petr Stehlik +* config.{sub,guess}: upgraded to latest versions from autotools-dev package + in order to fix the Debian BTS #193397 (problem supporting the Debian mips + and mipsel architectures). + + +2003-06-15 Petr Stehlik +* compfile.c: quick fix for non-zlib capable environments + + +2003-05-28 Petr Stehlik +* cpu_m68k.asm: major update, brings it to the 1.3.0+ level of cpu.c + Thanks Gerhard. + +* devices.c, atari.h, rdevice.[ch]: new R: device support (sockets). + Originally written by Tom Hunt. Fixed, updated and prepared for Atari800 + integration by Chris Martin . Thanks Chris! + +* atari.c, ui.c, rt-config.[ch], Makefile.in: updated to allow run-time + configuration of the R: entry in HATABS. + +* DOC/sockets.txt: it's an excerpt from mails I got from Chris. It may + explain some basic ideas about the R: device. + + +2003-03-07 Piotr Fusik +* pia.[ch], memory.[ch], atari.c: fixed MultiJoy and PORTB: + PORTA must be configured as output to select MultiJoy port. + PORTB direction register can be read. + PORTB lines stay high if configured as inputs + ("Road Race" works in XL/XE mode - didn't since 1.2.4). + Reset sets PORTB output (not 0xD301, which may be direction register + at the moment) to 0xFF. +* cartridge.c, cassette.c, input.c: copyright fix (I created these files) + + +2003-03-03 Mark Grebe +* ui.c: Save/Load Disk Set implemented. Result of Save is a text file + containing names of the disk images that are currently in the drives. + On saving drives with no disks are marked as "Empty" and on loading + no changes are made to such drives. This allows the user to load multiple + disk sets sequentially. File extension is ".set". + + +2003-03-03 Ed Cogburn +* mzpokeysnd.c: Initialize some uninitialized variables to fix gcc warning + +* devices.c, compfile.c: tmpnam() -> mkstemp() to fix gcc warning + +* atari_sdl.c: control key support added (how it could be compiled before?) + +* configure.ac: massive rewrite, new way of handling our options. Config + summary added. + +* Makefile.in: a number of small changes, and OBJ is changed to OBJS for + consistancy within configure.ac + +* atari.c, diskled.c, sio.c: diskled module is compiled in only if it's + enabled in configure. + + +2003-02-27 Piotr Fusik +* cartridge.[ch], ui.c, DOC/cart.txt, DOC/CREDITS, DOC/README: + new cartridge type + + +2003-02-24 Ed Cogburn +* added copyright headers to all *.c and *.asm files. Tried to collect + as much info as possible from the various ChangeLogs but if the author + in the header is incorrect please don't hesitate to send me a correction. + +* fixed all *.h files to use the same consistent format (#ifndef _FILE_H_ ) + +* reformatted DOC/CREDITS + + +2003-02-19 Ed Cogburn +* configure process: cleans up some things, fixes a few little things, + rewrote the message screen when nothing is typed, and reorganizes/changes + the --enable options and the symbol names (defines) for those options. + + First, all options are now --enable-xxx, because I flipped all the inverse + options. In other words, all symbol names declared for options here in + configure now mean the feature is enabled if the symbol is defined, for + consistancy, and to make it easier to figure out what options need to be + set. The display when you use '--help' also puts those features which + default to on at the top of the list, so its easy to look down the list + and understand whats going on now. + + For those options that I flipped, I made the necessary fixes to the other + source files, mainly changing #ifdef to #ifndef or vice-versa. + I also changed symbol names where I thought it made sense. So for examples: + 'NOSNDINTER' is flipped to "INTERPOLATE_SOUND". + 'NO_VOL_ONLY' is flipped to 'VOL_ONLY_SOUND'. + 'CLIP' is now 'CLIP_SOUND'. + 'STEREO' is now 'STEREO_SOUND'. + 'JOYMOUSE' is now 'SVGA_JOYMOUSE' + 'USE_CURSORBLOCK' is now'SVGA_CURSORBLOCK' because these two options are + only valid with the svgalib target, just like 'SVGA_SPEEDUP'. 'CPUASS' + is now 'FALCON_CPUASM' since its only valid with the falcon target. + Symbols that started with 'NO_' have been flipped, mostly to their original + name without 'NO_'. 'SET_LED' is gone, and 'NO_LED_ON_SCREEN' has been + flipped to 'SHOW_DISK_LED'. + +2003-02-18 Petr Stehlik +* atari_sdl.c: sends more Atari keys: SETTAB/CLRTAB, HELP, CAPSLOCK, + INSERT_LINE/CHAR, DELETE_LINE/CHAR. Thanks to Mark for updating the file. + +2003-02-17 Petr Stehlik +* debian/ folder with deb scripts added (taken from official Atari800 + debian package created by Dale Scheetz) +* atari_sdl.c: window gets a title (thanks to Jozef for suggestion) + +2003-02-11 Vasyl Tsvirkunov +* antic.c: added missing guard around extern reference +* mzpokeysnd.c: C standard compliance fix +* wince\*: WinCE/PocketPC updated + +** tagged as 1.3.0 + +2003-02-10 Petr Stehlik + +* pokey.c, monitor.c: added include. Interesting is that my compiler at + home hasn't complained but the gcc-3.2.2 here at work was uncompromising. +* atari.c: "--help", "--usage" and "--version" recognized now, though the + former two just ask user to type "-help" again. +* pokeysnd.[ch]: fixed typo errors +* configure.in: alternate user and system-wide config file names for DOS + and TOS ($HOME/atari800.cfg and C:\atari800.cfg) since their filesystem + is still limited to 8+3 filenames. +* win32/sound.c: restored original behaviour of "-quality" switch. +* atari800.man: version increased, SDL option "-audio16" added. +* win32/sound.c: "-bit16" renamed to "-audio16" to be in sync with SDL port +* emuos.h: finally updated with proper URL +* most files in DOC folder updated with minor fixes + +2003-02-09 Petr Stehlik + +* pokey.[ch]: 'stereo_enabled' variable moved to rt-config.c +* prompts.[ch]: YesNo() renamed to GetYesNo() and added GetYesNoAsInt() + that allows user to enter Y/N in the RtConfigUpdate process +* rt-config.c: added 'enable_new_pokey' + * added "ENABLE_NEW_POKEY" and "STEREO_POKEY" config options + * removed all the code for backward compatibility since it could cause + confusion if both old and new option existed in one config file + * updated for GetYesNoAsInt() prompt + * completely reworked the way the config file is searched for on disk: + now it first tries in user's $HOME folder file named ".atari800.cfg" + (which is configurable at compile-time) and later it falls back + to system wide "/etc/atari800.cfg" (also configurable at compile-time). + * also saving to user defined config file (-config ) should work + now (contrary to previous state where it saved to default file). + * actual config filename is printed so users are sure which file was + used (if their configured, or $HOME, or the system wide one) +* ui.c: updated for 'enable_new_pokey' +* pokeysnd.c: it wasn't clear to me how important the 'quality' parameter + was so I added a function Pokey_set_quality(int). If it wasn't that + important (was for testing only?) then let's remove this function. +* pokeysnd.c: a new function "Pokey_DoInit()" does the actual initialization + of the Pokey emulation. It's been separated from Pokey_sound_init to + allow calling from UI. +* atari_amiga.c, sound.c, sound_falcon.c, dos/sound_dos.c, win32/sound.c, + wince/sound.c: updated for Pokey_sound_init()'s number of parameters. +* atari_sdl.c: removed "-mzpokey", "-oldpokey" and "-stereo" command line + switches. This job (cleaning up the bloated command line options) was + actually one of the main reasons for all my today's changes. +* configure.in: STEREO sound enabled by default. Shouldn't hurt since + at the same time the 'enabled_stereo' is FALSE by default. So basically + released binaries will be able to turn on stereo anytime users'll wish. + Slower machines might want to disable this (as well as pixel-exact + Antic emulation and a few more things) before building. Configure script + could even take care of that if it knew which targets are running on + slow machines. +* atari.h, DOC/NEWS, DOC/INSTALL updated with info from above. + +** tagged as 1.2.10 + +2003-02-09 Petr Stehlik + +* pokeysnd.[ch]: added Pokey_set/get_quality() that allows me to switch + the Pokey routines (Ron Fries/Michael Borisov) on-the-fly from UI. +* ui.c: Sound Settings submenu added. Allows changing the Pokey routines + on-the-fly (automatically reboots) and also Mono/Stereo (if compiled in). +* emuos.lis: updated URL + +2003-02-08 Petr Stehlik + +* atari_sdl.c: signal keyboard interrupt only when it's enabled + (bugfix copied from input.c where it was fixed by Piotr) +* configure.in, acconfig.h: autoconf 2.5x required again. OS/2 and other + platforms with old autoconf can use the pre-generated configure script + found in released versions. +* atari_curses.c: exit() was not defined so I replaced it by return. +* atari_x11.c: some variables are used only if SHM is not defined +* configure.in, ui_basic.c: "CURSES" replaced by "USE_CURSES" so that + compiler doesn't complain about a redefined stuff +* pokeysnd.c: null functions defined properly to avoid compiler warnings + + +2003-02-04 Petr Stehlik + +* configure.in, acconfig.h: after few days of autoconf 2.5x support I + rolled back the changes since Ken Ames had a problem with upgrading + autoconf on OS/2. + +** tagged as 1.2.9 + +2003-01-27 Perry McFarlane + + I am going to send my cycle-exact patch now because I don't have any + more time to work on it. Hopefully it will be useful. I hope + it is not a problem to apply the patches. I tried to make them + to the current version. They need more testing, though. + In particular state saving is not tested. + + I have been working over the past few weeks on some improvements + to the Atari800 emulator. + I wanted to add support for mid-scanline changes to colours + and players which are used by some (few) games and demos. + I have written some code that does this, as a patch to + the current code base. + To avoid using the new code './configure --disable-cycleexact' + This patch will fix display bugs in Master of the Lamps, + Mail order monsters etc. + However there were still a few bugs in some programs (see BUGS) + and I haven't had time to fully test it. I also have run out + of personal time to work on this code for a while so I won't have + much time to maintain it. I think I should submit it now and + hopefully it can be used to help improve the emulator. If I had + more time I would have completed more of the changes I wanted, see + TODO in the code for some future ideas. + As for efficency, it is probably going to be slower than normal + to use this code, but it seems OK on my (fast) machine, so + since it is a #define to remove the new technique I hope this + will not be a problem. + + There is also a test program called T7.bas which I was using to + help find out how the real Atari's timing works, it might + be of interest to someone. (probably not) I am going to include + it anyways along with some brief documentation. There is asm code + t7.asm and a c program bdata.c that converts asm to Atari basic data + statements. T7.asm can be compiled with ATASM. + +* antic.c, gtia.c, cycle_map.c: + Cycle-exact changes to colours, player horizontal positions, player + graphics. + Basic idea: arrays cpu2antic and antic2cpu are created in + cycle_map.c Antic.c selects the correct cycle map + based on the IR mode and scanline #, DMACTL screen width and HSCROL + then cpu2antic_ptr and antic2cpu_ptr will convert the cpu's cycles + to those of antic and vice-versa. xpos will now represent the + cpu's perception of cycles and not the acutual xpos. + font_cycles, DMAR etc are not used. When the cpu changes + a display register, the display is updated partially to the point + where the change occurs. A function draw_partial_scanline does + this using the existing antic drawing code in a somewhat hackish way. + + cycle-exact GTIA11_DELAY for "Demonic laughter" demo. + using ring buffer approach + + Improved handling of DMACTL changes in the middle of a scanline. + Fixes: Decathlon, Mail order monsters. + Emulation of a DMACTL width change bug. + +* cpu.c, monitor.c: + The monitor remembers xpos and ypos in a buffer. + A new command, YBREAK, can cause a breakpoint at a given scanline(ypos) + setting YBREAK ypos+1000 causes a flickering line to appear at + that point on the screen rather than breaking the cpu. This allows + debugging what happens at that scanline more easily. + The memmove approach for remember_JMP, remmeber_PC has been replaced + with a more efficent ring buffer approach + The HISTORY command now gives a disassembly of the last N instructions + where N=64 by default, and if the new cycle-exact code is used, it + also gives the xpos and ypos of those instructions. + correction to SIZEP2 SIZEP3 equates + +* pokey.c: + cycle-exact random number generator reads. + +** tagged as 1.2.8 + +2003-01-27 Jason Duerstock + +* PAGED_ATTRIB support, removing the attrib[] array and replacing it with + a map of 256 pointers (one for each page of memory. If the pointer is + NULL, then the memory[] array will be accessed directly. + + This change is activated through './configure --enable-paged'. + + In my estimation, this should improve the performance of the emulator, + removing 64K of cache usage, and short-circuiting some switch {} + statements. + + Note that this will render old saved-state files incompatible. + + There are a few short bits not finished yet, one of which being the + "H:" device patch, which is mapped into 0xd1xx (parallel bus space), + the other being state saving. + + My idea on how to do this is through the following struct: + + map_save save_map[2] = { + {0, NULL, NULL}, /* RAM */ + {1, NULL, ROM_PutByte} /* ROM */ + }; + + The readmap and writemap will be compared with the pair of pointers + in the struct, and a byte (the first column) will be saved for each + page. + + On restore, the byte will be used to reconstruct the readmap and + writemap. + +* Several warnings have been cleaned up through inclusion of the proper + headers. + +* 'make distclean' has been added, to remove all the files generated + from autoconf and ./configure + + In the process, I removed the (admittedly ugly) memory.[ch] redirection + to memory-[pd].[ch]. If the general consensus is that PAGED_ATTRIB + is a step in the right direction, then I will look at tacking PAGED_MEM + back on through PAGED_ATTRIB. + + Any comments, suggestions, critiques, etc are appreciated. + +joy> something has to be done regarding the saved-state files. Backward + compatibility is a key thing in this area. + +** tagged as 1.2.7 + +2003-01-27 Mark Grebe +* devices.c: + I've finally got around to finishing the upgrade to + the hard disk emulation. It now fully support + subdirectories. It supports CREDIR, RMDIR, CWD, ?DIR + in SpartaDos and BW-DOS. It also supports their XIO + equivelents, and subdirectories work in all the other + DOS commands as well. It uses '>' and '>>' as + directory seperators like SpartaDOS and BW-DOS. I've + also added support for the binary load commands, and + added a path string for use with the H: devices, as + the standard path won't work for them. + + It really needs a documentation writeup, but I've + been gettting swamped at work, so that will come as I + get time, but thought I would get this to everyone + now, as I released it in the last release of + Atari800MacX. I've tested it on the Mac, as well as + Windows and the Linux SDL port. + + The only other change that is needed, is that + Device_HHINIT should be called during Coldstart(), so + that the working directories get reset to the root + directory. + +joy> Note that it may needs the same patches that were applied + to devices.c in version 1.14. But I don't have an Amiga handy + so I'll let someone else do it. + +** tagged as 1.2.6 + +2003-01-27 Piotr Fusik +* antic.c: swapped GTIA and CTIA artifacting modes + (swapped by mistake in 0.9.9j) +* input.c: signal keyboard interrupt only when it's enabled + (fixes Atari crash after SHIFT and * in Super Pacman 5200) + +2002-12-16 Krzysztof Nikiel +* colours.c: corrected color/BW conversion (Vasyl was right) + +2002-12-08 Krzysztof Nikiel +* pokeysnd.c mzpokeysnd.c: Added 16bit and quality sound setting support. + Added multiple sound engines support. + +2002-12-04 Mark Grebe +* devices.c: device H: now fully emulates the standard DOS functions + Rename, Delete, Lock, Unlock, Note, Point, and Open for Update. + Also changed the directory listing to look like the standard Atari + DOS 2.0 listing. (The sector count is based on 256 byte sectors). + +** released as 1.2.5 on 2002/12/02 + +2002-11-25 Piotr Fusik +* DOC/cart.txt: fixed a few typos + +2002-11-06 Petr Stehlik +* ui.c: + - applied patch from Ed Cogburn that fixes subsequent mounting + of R/W disks in slot that was mounted R/O previously. + - finally implemented the R/W <-> R/O mode switching using the Space Bar. + Please note that this R/W <-> R/O switch is just temporary and does + not change the writeprotect flag of ATR images. Besides, it cannot + override this flag so you actually can't mount a writeprotected ATR + image read/write using this Space Bar toggle. + +* atari.c: Ken Ames sent me a very simple patch that is supposed to allow + compiling the Atari800 on OS/2 "using Hob X11, XFree86, or IBM's X11 + server". + +2002-09-16 Piotr Fusik +* cartridge.[ch], ui.c, DOC/cart.txt: five new cartridge types (Nir Dary) + +2002-09-05 Piotr Fusik +* cartridge.[ch], ui.c, DOC/cart.txt, DOC/README: seven new cartridge types + (by Nir Dary) + +2002-08-26 Adam Bienias +* pokeysnd.c: a fix for better quality of sound + +2002-08-21 Piotr Fusik +* antic.c: ANTIC mode E + GTIA mode 9 ("Unconventional 2k", "Ass Kisiel") + +2002-08-15 Piotr Fusik +* DOC/BUGS: "Numen" soundtrack +* cartridge.[ch], ui.c, DOC/cart.txt: 1 MB XEGS cart +* input.c: Amiga/ST mouse right button ("Bombdown") +* input.h, input.c, pia.c: MultiJoy4 interface (4 joysticks for XL/XE) + +** released as 1.2.4 + +2002-08-07 Petr Stehlik +* atari_sdl.c: + - added atexit(SDL_Quit) to clean up after unsuccessful initialization. + - fixed "-help" so that it doesn't initialize graphics mode. + - added "-sound" and "-nosound" support so you can disable sound if + your sound card is not plugged in :) + - added "-dsprate" support + - added support for the configure option --disable-SOUND + - added Aflushlog() to Atari_Exit() thus debug info is displayed now + - when sound card init failed the application continues to run with sound + disabled (previously it was exiting immediately) +* atari_sdl.c, atari_falcon.c, cassette.c, atari.c, atari_vga.c: + fixed "-help" formatting +* atari_curses.c: added "-help" +* atari.c, atari_curses.c, atari_x11.c: added Aflushlog() to Atari_Exit() +* atari_x11.c: fixed the clean up code in Atari_Exit(), added help_only mode +* sound.c: all printf's changed to Aprintf(). +* atari.c: "-v" or "-version" displays the version correctly now +* atari_vga.c: added help_only mode and made sure Atari_Exit is aware of that +* sound_dos.c: removed EOL ("\n") from Aprint() (it adds the \n automatically) + +2002-07-24 Piotr Fusik +* cartridge.[ch], ui.c, DOC/cart.txt, DOC/README: 256K and 512K XEGS carts + (thanks to Nir Dary) + +2002-07-14 Piotr Fusik +* atari.c, memory-d.c, ui.c: emulation of 576K and 1088K RAM machines +* pia.c: removed a hack that affected 1088 XE +* antic.c, memory-d.c, atari800.man: separate ANTIC access to extended memory + for 130 XE and 320 Compy Shop +* DOC/README: updated features + +2002-07-11 Krzysztof Nikiel +* configure.in: Freature processing redesigned to be more consistent. + Correct enable/disable info is printed in help. + +** released as 1.2.3 + +2002-07-04 Vasyl Tsvirkunov +* ui.c,gtia.c,atari.h,cassette.h: cassette image loading is available from + main menu. Also, main menu allows to persist "Hold Start" setting. + Interlaced screenshot is commented out in main menu. +* ui_wince.c: updated to reflect above changes (one port-specific item was + piggyback on interlaced screenshot, had to move). + +2002-07-04 Piotr Fusik +* atari.c, memory-d.c, ui.c: emulation of 16K RAM machines: 400 and 600XL +* cpu.c: cycle-exact LSR $D01A +* input.c: after playing with real paddles changed mouse_pot_min to 1 +* monitor.c: fixed optype6502[] to match unofficial instructions + +2002-06-27 Petr Stehlik +* atari_sdl.c: updated LPTjoy support to compile under Linux only. If there's + another Unix flavor that can read parallel port using ioctl then it can be + easily added. Just define LPTJOY for it (see the begining of atari_sdl.c). + +2002-06-27 Piotr Wiszowaty +* atari_sdl.c: added LPTjoy support for Linux + +2002-06-23 Petr Stehlik +* OK, the "-palette" patch from Andrew was completely wrong. I fixed it + the right way and when I was at it I also moved the "-palette" command + line option from main atari.c to colours.c. +* I also decided to fix the command line options in general, so I made some + changes to atari.c and atari_x11.c. +* At last I corrected a bunch of things in atari_sdl.c so that now SDL port + recognizes "-help". The other options now use single "-" to conform to + the rest of Atari800 application. + +2002-06-20 Petr Stehlik +* atari.c: "unistd" header included - it should fix a start problem on FreeBSD + 4.5 according to an anonymous patch on sf.net. +* colours.c: loaded color palettes were ignored. Andrew Church posted a patch + on sf.net that fixes it. +* atari800.man: manual page updated by Rob McMullen + +2002-04-11 Piotr Fusik +* pokey.c: allow high-speed disk i/o (Alpha-Load works) + +2002-04-07 Christian Groessler and Petr Stehlik +* non-ANSI "t" parameter in fopen ("rt" and "wt" used for CR/LF files + in DOS-like operating systems) removed since it was causing problems + with KallistiOS Dreamcast library. Linux glibc could also be affected + as it aborts scanning the mode parameter when it encounters an unknown + char (consider "wt+"). Code was updated to take care of the possible + extra \r before \n at end of fgets string. fputs() should be OK as + the text mode is most probably the default mode. + +2002-03-29 Vasyl Tsvirkunov +* Dirty update scheme is completed + +2002-03-18 Piotr Fusik +* antic.c: NMIST bit 5 is external NMI (not reset) status in Antic, + unused in Atari +* input.c: second button in 5200 joystick generates "Break key" IRQ +* monitor.c: "DLIST" now accepts address as an argument + +2002-02-13 Petr Stehlik +* atari_sdl.c: fixed screen offset in 32bpp (thanks to Suzanne Archibald) +* atari_sdl.c: fixed sound initialisation (thanks to Tomas Mraz) +* pokey.c: fixed sound channel 1 in stereo mode (thanks to Radek Sterba) + +2002-02-04 Piotr Fusik +* DOC/BUGS: updated list of games + +2002-01-10 Jindrich Kubec +* new cartridge type added +* last #include "zlib.h" found and fixed. + +** released as 1.2.2 + +2001-12-31 Petr Stehlik +* renamed cpu_m68k.s to cpu_m68k.asm because it's not in gas format +* renamed *.s files in falcon/ to *.asm (same as above) +* updated Makefile.in to run xgen on *.asm files only + +2001-12-29 Petr Stehlik +* joysticks (both real and keyboard) in SDL port fixed. +* configure now allows to --enable-CPUASS for m68k assembler CPU core. + +2001-12-24 Jakub Bogusz +* memory corruption in input.c (joystick checking) fixed. + +2001-12-17 Petr Stehlik + +* configure.in changed so it doesn'ta ask any questions by default + Use --enable-FEATURE or --disable-FEATURE. +* configure.in updated for better Falcon support + +2001-12-08 Krzysztof Nikiel + +* acconfig.h: unused symbol COMPILED_PALETTE removed +* win32/atari1.ico: new windows icon (actually an old one but modified) +* win32/atari.rc: new icon included + +2001-12-07 Piotr Fusik + +* cpu.c: #include for exit() +* rtime.c: #include for strcmp() + +2001-12-04 Jacek Poplawski + +* log.c, log.h: fixed undefined Aflushlog +* atari_sdl.c: cleanups for readability + +2001-12-04 Petr Stehlik + +* util/sethdr, util/act2html.c: added Nathan's sethdr perl script and Piotr's + act2html C code +* SDL port now calls Aflushlog() before it exits +* fixed win32 compile and runtime problems (thanks to Nathan) + +2001-12-03 Petr Stehlik + +* configure.in: updated to support the Atari Falcon port +* Falcon port' proprietary -DDMASOUND changed to general -DSOUND + +2001-11-27 Krzysztof Nikiel + +* colours.c: default palette changed to the real palette created by + Zdenek Eisenhammer. +* colours.c: code to adjust palette properties improved and moved + to separate function Palette_Format. + +2001-11-26 Piotr Fusik + +* colours.c: #include for strcmp() + +2001-11-22 Krzysztof Nikiel + +* DOC/INSTALL: added autoconf instructions +* acconfig.h: added SVGALIB symbol + +2001-11-18 Piotr Fusik + +* ui.c: fixed a bug: modification of string literals + +2001-11-14 Vasyl Tsvirkunov + +* WinCE: Fixed a few keyboard issues +* Linear filter applied to screen image in portrait mode (looks much better) + +2001-11-09 Piotr Fusik + +* pbi.c, pbi.h, Makefile.in: removed pbi module (it did nothing useful and + was out of date) + +2001-11-04 Piotr Fusik + +* input.h, input.c: added Trak-Ball emulation ("Missile Command") + and blocked opposite joystick directions (good for "Mario Bros.") +* cartridge.h, cartridge.c, ui.c: right slot cartridge + +2001-10-29 Piotr Fusik + +* monitor.c: "DLIST" didn't stopped on JVB if Display List had multiple of 15 + instructions +* cpu.c, gtia.h: removed i386 asm tricks - gcc 2.95.3 does it better :-) +* atari.h, gtia.c: changed implementation of WSYNC/VCOUNT timing + (previously it assumed that the instruction accessing VCOUNT had 4 cycles) +* antic.c: corrected timing of DLISTL/H ("Spelunker" works) + +2001-10-26 Piotr Fusik + +* atari_vga.c, configure.in: moved atari_vga.c from src to src/dos +* configure.bat, configure_dos.bat: renamed configure.bat to configure_dos.bat + (in bash 2.04.7 "./configure" runs configure.bat instead of configure) +* atari.c, memory-d.c: made 130 XE state files compatible with previous + versions +* ui.c: current system is selected by default in SelectSystem() +* input.h, antic.c, input.c: light gun emulation, + "-mouse gun" is same as "-mouse pen", except that the button is inverted +* input.c: set default light pen/gun offsets to (42, 2) - good for light gun + games; a bigger light pen/gun cursor + +2001-10-16 Krzysztof Nikiel + +* ui_basic.c: better keyboard autorepeat rate +* configure.in: added AC_EXEEXT; removed A800_MAIN; used $target variable +* Makefile.in: improved dep target; added EXEEXT +* autogen.sh: new script to create 'configure' + +2001-10-12 Piotr Fusik + +* cartridge.h, cartridge.c, ui.c: added 8 KB and 4 KB cartridges for 5200 + +2001-10-11 Piotr Fusik + +* atari_curses.c, ui_basic.c, ui.c: removed CURSES-specific code from ui.c, + added curses_screen for UI + +2001-10-11 Krzysztof Nikiel + +* ui_basic: added atari_sync() call in keyboard loop--keyboard is sampled + at reasonable rate + +2001-10-10 Piotr Fusik + +* atari_x11.c, atari_curses.c: compilable now +* configure.in, ui.c: corrected typos + +2001-10-10 Krzysztof Nikiel + +* sound.c: improved output space calculation--can work much better + with some drivers + +2001-10-09 Piotr Fusik + +* ui.c: OSS 'M019' -> 'M091' + +2001-10-08 Piotr Fusik + +* input.c: removed CVS keywords +* ui.c: corrected stack bug (thanks Vasyl) and renamed some cartridge types + +2001-10-07 Piotr Fusik + +* input.c: smoother mouse pointer movement in Amiga/ST/joy modes +* atari_basic.c: removed Atari_POT (unused) +* pokey.c: fixed SEROUT (Sparta DOS X runs) + +2001-10-05 Piotr Fusik + +* atari.c, cartridge.h, cartridge.c, ui.c: added Bounty Bob Strikes Back + cartridge for 800/XL/XE (thanks Jindroush) +* atari.c: H: didn't worked until a patch was toggled + +2001-10-03 Piotr Fusik + +* input.h, input.c: finished mouse code +* pokey.c: added INPUT_Scanline() call (to emulate Amiga and ST mice) +* rt-config.c: fixed default TV mode in RtConfigUpdate +* cpu.c: killed some warnings, AtariEscape -> Atari800_RunEsc +* atari.h, atari.c, devices.c, devices.h, memory-d.c, binload.c: rewritten + escape codes handling +* devices.c: corrected Device_isvalid (isalnum((char) 0x9b) == 1 !) +* binload.c: killed a warning, used dGetWord/dPutWord +* diskled.h, diskled.c, sio.c, atari.c, atari_vga.c, platform.h: + SET_LED and Atari_Set_LED are no longer used, Update_LED -> LED_Frame +* atari.h, atari.c: added screen_visible_* variables +* input.c, atari_vga.c, platform.h: removed Atari_POT: special handling + of 5200 joysticks is in input.c +* Makefile.in: updated + +2001-10-03 Krzysztof Nikiel + +* win32/atari_win32.c, atari_svgalib.c: keyboard interface updated +* win32/main.c: added mouse input + +2001-10-01 Piotr Fusik + +* dos/vga_asm.s: corrected a bug in make_darker and commented whole routine + out (it was used in ALLEGRO version only). +* ui.h, devices.c, cpu.c, atari.c: #include "ui.h" for CRASH_MENU externs +* memory-d.h: added a few useful macros (dGetWord, etc.) +* sio.c, cpu.c, memory-d.c, atari.c, antic.c: updated for new macros in + memory-d.h +* cartridge.h, cartridge.c, ui.c: added new cartridge type: Atrax 128 KB + (thanks Jindroush) +* antic.h, antic.c, ui.c: renamed artif_init to ANTIC_UpdateArtifacting +* ui.c: CURSES code cleanup (spaces, memory[], goto) + +2001-09-27 Piotr Fusik + +* pia.c, pia.h: Atari_PORT -> PORT_input +* pokey.c, pokey.h: Atari_POT -> POT_input +* input.h: added INPUT_Initialise and a few mouse variables +* input.c: added INPUT_Initialise, PORT_input, POT_input +* atari_basic.c: removed Atari_CONSOL and Atari_PEN (not used anymore) +* cpu.c: fixed nasty bug with extern int wsync_halt + - there's UBYTE wsync_halt in antic.c (oooooppss!) +* cpu_m68k.s: fixed wsync_halt bug, bounty_bob1/2 -> CART_BountyBob1/2, + SupertCart_GetByte/PutByte -> CART_GetByte/PutByte +* input.h: mouse_speed, INPUT_CenterMousePointer, INPUT_DrawMousePointer +* input.c: emulation of Paddles, Atari Touch Tablet, Koala Pad + and Light Pen/Light Gun +* atari.c: called INPUT_Initialise and INPUT_DrawMousePointer +* atari_vga.c: updated mouse code +* Makefile.in: updated + +2001-09-26 Piotr Fusik + +* input.c, input.h: added mouse_mode, mouse_port, 5200 key codes +* antic.h, antic.c, platform.h, atari_vga.c: light_pen_enabled, Atari_PEN -> + mouse_mode==MOUSE_PEN, PENH_input, PENV_input (direct mouse support + for light pen emulation) + +2001-09-22 Piotr Fusik + +* input.h, input.c: added key_consol, joy_autofire, AKEY_SHFT etc. +* input.c: fixed key_break and key_code +* atari.h: declared nframes and deltatime, AKEY_SHFT etc. moved to input.h +* gtia.c, platform.h, atari_vga.c: Atari_CONSOL -> key_consol, + TRIG_auto -> joy_autofire + +2001-09-21 Piotr Fusik + +* antic.c: optimized character modes +* devices.c: removed unused variable +* atari.h, atari.c: Atari800_Frame(): new function that groups emulation + of one Atari frame. The functions for individual modules will be called + ANTIC_Frame(), GTIA_Frame(), etc. +* input.h, input.c: new module, for keyboard/joystick/mouse +* pokey.h: declared SKSTAT (for input) +* atari_vga.c, ui.c: included input.h +* atari.h: joystick positions and Atari key codes moved to input.h +* atari.c: part of keyboard handling moved to INPUT_Frame() +* Makefile.in: updated for the input module +* antic.h, antic.c, ataripcx.c, ui.c: ANTIC_RunDisplayList -> ANTIC_Frame +* gtia.h, gtia.c: GTIA_Triggers -> GTIA_Frame +* atari.h: removed draw_display, added Atari800_Initialise +* atari.c: main() is now in platform-dependent code, should call + Atari800_Initialise and Atari800_Frame +* input.c, input.h, pokey.c, atari_vga.c: SHIFT_KEY -> key_shift (consistent + naming convention) +* pokey.c, atari_vga.c: removed KEYPRESSED (not needed, since INPUT_Frame() + can check if key_code!=AKEY_NONE) +* atari_basic.c, atari_vga.c: added main() + +2001-09-20 Piotr Fusik + +* gtia.c: optimized players in new_pm_scanline + +2001-09-19 Piotr Fusik + +* pokey.c: corrected RANDOM + +2001-09-17 Piotr Fusik + +* antic.c: optimized: memcpy in ANTIC_Load +* memory-d.c, memory-d.h, atari.c: Initialise_Atari... functions moved + to atari.c (they don't need to be memory-d/-p specific, it should simplify + finishing PAGED_MEM code) +* atari.c, atari.h, atari_vga.c, cartridge.c, gtia.c, memory-d.c, pia.c, + rt-config.c, rt-config.h, statesav.c, ui.c: + machine, mach_xlxe, Ram256, os, default_system -> machine_type, ram_size + (removed lots of confusing variables, now it's easier to add new machines + - 16,192,1088,... KB of RAM) +* cartridge.c: killed a warning +* rt-config.c, rt-config.c, ui.c, memory-d.c, atari.c: + enable_c000_ram -> ram_size = 52 +* memory-d.c: malloc/free atarixe_memory (don't waste 256 KB if not + in XE mode) +* atari.c: shortened state file of 130 XE + +2001-09-16 Piotr Fusik + +* atari.c, rt-config.c, rt-config.h: removed default_tv_mode (not needed, + since there's tv_mode) + +2001-09-09 Piotr Fusik + +* pia.h: declared atari_basic and selftest_enabled +* rt-config.h, rt-config.c, atari.c, ui.c: hold_option -> disable_basic +* memory-d.h, memory-d.c, cartridge.c:o "-basic" and "-nobasic" work + for Atari 800 (Atari BASIC is attached as a cartridge in Atari 800) + +2001-09-08 Krzysztof Nikiel + +* compfile.c: unused definitions and inclusions removed +* ui.c, rt-config.h, rt-config.c: used FILENAME_MAX instead of + MAX_FILENAME_LEN +* sio.c, sio.h: used FILENAME_MAX instead of FILENAME_LEN + +2001-09-06 Piotr Fusik + +* atari.h: MENU_PATCHES -> MENU_SETTINGS + +2001-09-04 Piotr Fusik + +* pokey.c: implemented SKRES and bit 5 of SKSTAT +* cartridge.c: CART_Remove works in 5200 mode +* ui.c: hold_option, enable_c000_ram and rtime_enabled available in menu + +2001-09-03 Piotr Fusik + +* pokey.c: call SIO_GetByte() when triggering IRQ, not when reading SERIN + ("Timeless Announcement" loads now) +* sio.c: disk drive answers 'E' to an unknown command. + +2001-08-29 Piotr Fusik + +* cassette.h, cassette.c: using FILENAME_MAX from stdio.h + +2001-08-27 Piotr Fusik + +* pokey.c: RANDOM is 0xff if (SKCTLS&0x03)==0 (for stereo detection in + "Sheol") + +2001-08-27 Krzysztof Nikiel + +* acconfig.h, config.h.in: safer 'win32' definition +* win32/main.c: used _endthread() call without parameter + +2001-08-24 Piotr Fusik + +* pokey.h: declared stereo_enabled (for monitor.c) +* pokey.c: initialize KBCODE to 0xff - for a stereo detection routine + +2001-08-19 Krzysztof Nikiel + +* DOC/INSTALL: windows instructions + +2001-08-16 Piotr Fusik + +* atari.c: selecting cartridge type didn't worked in 5200 mode +* memory-d.c: deleted CART_Remove() in Initialise_Atari*, so auto-switching + to 5200 mode when inserting a 5200 cartridge works +* cartridge.c: fix for Bounty Bob 5200 cartridge (thanks Jindroush) + +2001-08-06 Piotr Fusik + +* colours.c: -help bug fix +* cassette.h, gtia.h, gtia.c, atari.c: hold_start support + (emulator presses Start and Space to boot the tape) +* cassette.c: CAS format support +* Makefile.in: added cassette.[ch] + +2001-08-03 Piotr Fusik + +* cassette.h, cassette.c: new module, for cassette recorder emulation +* sio.h: declared SIO_ChkSum (for cassette.c) +* atari.c, sio.c: cassette support + +2001-07-25 Piotr Fusik + +* sio.h, compfile.c, atari.c, sio.c: added SIO_Exit(), code clean ups +* sio.c: Format Disk rewritten. Now it can resize both ATR and XFD images. + The ATR header is being updated. Double density formatting works. + +2001-07-24 Piotr Fusik + +* antic.c: speeded up Vasyl's code + +2001-07-23 Piotr Fusik + +* sio.c: corrected and added checks if drive number is in range 1-8 + +2001-07-21 Piotr Fusik + +* sio.c: made double density ATR images compatible with SIO2PC + +2001-07-20 Piotr Fusik + +* monitor.c: "C 600 ABCD" does the same as "C 600 CD AB". + "DLIST" - 1 KB boundary respected. "POKEY" command. + "S" without parameters repeats last search. + Corrected Petr's mistake in rev.1.4. +* pia.c, pia.h: renamed atarixl_os to atari_os (this array may be used + also for storing 800 and 5200 OSes) +* rt-config.h, rt-config.c, atari.c, atari.h, memory-d.c, memory.d.h: + removed enable_rom_patches, added: enable_h_patch, enable_p_patch and + Atari800_UpdatePatches(). SIO, H: and P: patches are now independent + and can be toggled at run-time (original OS is saved in atari_os). + Removed SetSIOEsc() and RestoreSIO(). +* atari.h, ui.c: added "Atari OS patches" menu item +* cpu.c, devices.c, atari.h: removed ESC_BREAK (it wasn't really an escape + code, it was used for entering the monitor - the monitor can be called + directly) +* devices.c: replaced K_Device with Device_KHREAD, replaced E_Device with + Device_EHOPEN, Device_EHREAD and Device_EHWRITE (now K: and E: handlers + are implemented in the same way as H: and P:) +* rtime.h, rtime.c: new module, created from R-Time 8 emulation routines in + supercart +* cartridge.h, cartridge.c: new module, for inserting cartridges (previously + in memory-d) and bank-switching (previously in memory-d and supercart) +* monitor.c: not displaying rom_inserted in "PIA" command (because the new + cartridge types can be disabled by software) +* atari.h: added declarations of mach_xlxe and Ram256, + removed cartridge types and Insert/Remove functions for cartridges +* rt-config.c: removed #define TRUE/FALSE and extern int Ram256 (it's in + atari.h) +* memory-d.h, memory-d.c: rewritten to support the new cartridge module +* pia.c: Ram256 moved to atari.c (it's not related with PIA) +* gtia.h: declared TRIG and TRIG_latch (accessed by memory-d) +* pia.c, gtia.c: cartA0BF_enabled is used instead of rom_inserted +* ui.h: declared SelectCartType(), removed mach_xlxe and Ram256 + (which are declared in atari.h) +* atari.c: support for new rtime and cartridge modules +* ui.c: inserting, removing and converting of new cartridge types +* Makefile.in, common.mak: added cartridge and rtime, removed supercart +* supercart.c, supercart.h: removed - routines moved to new modules cartridge + and rtime + +2001-07-19 Piotr Fusik + +* binload.c: 0x31 stored at 0x300 ("Studio Dream" loads now) +* supercart.c: added "byte &= 0x0f" to prevent out of bounds accesses + to regset[] +* pokey.c: SKSTAT variable renamed to SKCTLS to avoid confusions + (it's the write-only, not the read-only Pokey register) +* devices.c: replaced "dGetByte(0x2e)" with "regX" in H: handler routines + (fixes problems with Atari BASIC's GET/PUT/INPUT/PRINT) +* cpu.c: on reset, the I flag is set (now reset works if stuck in interrupts) +* pia.c: & 0x3f on read PACTL and PBCTL (bits 6 and 7 are read-only in real + PIA) +* antic.c: described cycle-exact Antic timing for a few modes + (not implemented) +* devices.c: added open mode 9 (append) for H: device +* pokey.c: potentiometers emulation improved: POTGO and ALLPOT registers + and bit 2 of SKCTLS implemented, "Tree Surgeon" no longer hangs +* pokey.c, pokey.h, pokeysnd.c, pokeysnd.h: moved a few definitions from + pokeysnd to pokey (the goal is not to duplicate the variables of same + meaning in pokey and pokeysnd, e.g. AUDC/AUDF/AUDCTL) +* pokey.c: blocked POTs, SERIN, SEROUT, KBCODE, IRQ, SKSTAT, SKCTLS + in the second Pokey chip, second Pokey unaccesible until stereo_enabled set + (helps some stereo detection routines) +* pokey.c, pokey.h, pokeysnd.c: replaced bit17[] with poly9_lookup[] and + poly17_lookup[]. bit17[] was initialized with rand(), while poly9/17_lookups + use the original POKEY algorithms. Moreover, poly9/17_lookups are smaller, + which saves ca. 100 KB of memory. +* atari.h, pokey.h, antic.c, pokey.c: true RANDOM emulation (both 9- and + 17-bit poly) ! Not using rand() anymore. POKEY_Frame() and cpu_clock are + needed for it. Try the "Bank Bang!" game. +* antic.c, gtia.c: the background color can be changed inside a scanline. + Currently implemented only for blank lines without PMG. + Try the "Partyland" part of the "Bitter Reality" demo. + The feature can be disabled by defining NO_CYCLE_EXACT. +* pokey.c: STIMER fixed (speech in "Mirax Force" is better, but still + not perfect) +* cpu.c: slight optimization of ROL and ROR +* cpu.c: Read-Modify-Write (RMW) instructions (ASL, INC, etc.) store + the unmodified value of $D01A before they store the modified value. + Now you can see the white dots made with INC $D01A. +* ui.h: removed declaration of atarixl_os (why was it declared here?) diff --git a/DOC/FAQ b/DOC/FAQ new file mode 100644 index 0000000..ec293f5 --- /dev/null +++ b/DOC/FAQ @@ -0,0 +1,39 @@ +Frequently asked questions (with answers) +----------------------------------------- + +0. Q: Where to get ROM files for the emulator? + A: Download the xf25.zip from http://prdownloads.sf.net/atari800/xf25.zip + You'll get three .ROM files - ATARIBAS.ROM, ATARIOSB.ROM and ATARIXL.ROM. + We cannot distribute them due to licensing and copyright issues. Sorry. + In Atari800 UI there is an option to locate these ROM images. + +1. Q: I want Windows version of Atari800 with Windows GUI. + A: Try Atari800Win PLus: http://atariarea.histeria.pl/PLus/index_us.htm + +2. Q: If I use keyboard as the emulated joystick in the DOS version + it often stops some games (e.g. Bruce Lee). What should I do? + A: Press F7 to switch the keyboard into joy-only mode. Or better, + use a real joystick (either PC or the old CX-40 Atari one). + +3. Q: How about keyboard joysticks in the SDL version? + A: Up to two keyboard joysticks can be freely defined and enabled/disabled + on-the-fly in the UI (user interface). Press F1 to enter the UI, then + enter "Controller Configuration" and then "Define layout of ...". + There you can choose which keys will be used as joystick directions + and the fire button. Don't forget to enable the joysticks before + gaming and to disable it before using your keyboard in BASIC, DOS + or a text editor. When you're satisfied with your keyboard joystick + mapping you can save the settings. + +4. Q: Sound problems in xxx + A: We know about problems with volume-only sound (digitized sound effects). + See the BUGS file. You can try disabling the new HIFI Pokey + emulation (in the UI go to Sound Settings and disable the HIFI there). + + I also experienced sound problems in SDL on my Debian GNU/Linux with ESD + (a sound daemon coming with GNOME) that were fixed by installing + the libsdl1.2debian-alsa package (that is compiled to output sound + directly to ALSA instead of going through the ESD (this is applicable + only if you are using ALSA (http://alsa-project.org/) and have ESD + running, of course). + diff --git a/DOC/HOWTO-DIRTYRECT b/DOC/HOWTO-DIRTYRECT new file mode 100644 index 0000000..885c630 --- /dev/null +++ b/DOC/HOWTO-DIRTYRECT @@ -0,0 +1,116 @@ +USING DIRTY UPDATE SCHEME + +1. Why dirty updates? +Most Atari 800 games and applications update only very small part of +the screen every frame. Typical numbers range from 1% to 5%. On the +other hand many ports have to convert screen image from internal +emulator format to port native format and copy it to platform video +memory. Both conversion and copy (or blit) are typically slow. + +2. How to enable it? +To enable dirty update tracking the symbol DIRTYRECT must be #defined +globally (in CONFIG.H or in project settings). When it is defined the +array screen_dirty[] gets allocated. This is UBYTE array of the size +ATARI_HEIGHT*ATARI_WIDTH/8. In current implementation every element +is either 0 or 1. Initially the entire array is initialized with 0. +Each element in this array corresponds to eight consequtive pixels in +atari_screen[]. When any of this pixels is being changed the element +in screen_dirty[] is getting set to 1. Port's implementation of +Atari_DisplayScreen() can use this information and draw only those +pixels belonging to "changed" octets. Port must reset screen_dirty[] +at the end of its Atari_DisplayScreen(). Emulator core _never_ resets +screen_dirty[] elements. + +3. How to use it? +The simplest implementation would be this: every time your code is +attempting to process pixel at pointer src (which must point somewhere +_inside_ atari_screen[]) do a check: + + if(screen_dirty[((ULONG)src-(ULONG)atari_screen)/8]) ... + +If the condition succeeds, update the pixel. Otherwise, skip it. More +advanced implementation would do a check only once per eight pixels +but the check basically remains the same. The best use is to redesign +the entire update loop so it moves through the array screen_dirty[] +instead of typical loop through atari_screen[] or double loop through +screen coordinates x and y. Essentially, if screen_dirty[m]==1 then +eight pixels starting at atari_screen[m*8] needs to be refreshed. Or, +if you want these in screen coordinates: y=m/ATARI_WIDTH, eight pixels +starting at m%ATARI_WIDTH. Note that pixels are guaranteed to be at +the same scanline. Properly written loop would not even use division +there: + + for(m=0, x=0, y=0; m= ATARI_WIDTH) + { + x = 0; + y ++; + } + } + +The code in that last example also resets screen_dirty[] as it goes +and does it in very efficient way. If your code does not do that you +can just use: + + memset(screen_dirty, 0, ATARI_HEIGHT * ATARI_WIDTH/8); + +at the end of Atari_DisplayScreen(). + +4. Is it worth a trouble? +Believe me, yes, unless your target platform is so fast that you don't +care about the performance. I tested this implementation on PocketPC +(WinCE) port on iPaq. Old implementation was too slow even with +frameskip of 3 (anything higher tends to break PM graphics). With the +new implementation I am getting better speed at frameskip 1 than I had +with the old implementation at frameskip 3, and I finally got 100% +speed at frameskip 2! At the same time I am using linear filtering +with the new implemenation, something that was too expensive with the +old one. On the top of this, I am not using the most efficient +(described above) way to use the scheme. +There are only a few little catches there. First, you should use +compiler with at least semi-decent optimizer. Otherwise you will get +a few extra memory moves every time you access video memory. It's not +a big problem but it is something to be aware of. Second, there is +slight performance hit in ANTIC.C: changed pixels are slightly more +expensive (unchanged pixels stay the same, may be even cheaper than +before depending on platform memory controller). That only means that +if you #define DIRTYRECT you should definitely implement proper dirty +update support in your port or you'll burn CPU cycles. Then again, the +impact is not that big. + +5. Changing core emulator code. +If you need to draw anything on the screen from the emulator core you +need to follow certain protocol. First of all, you cannot use +atari_screen[] directly anymore. If your code resides in ANTIC.C you +should use macros WRITE_VIDEO_BYTE(), WRITE_VIDEO() (writes a word), +WRITE_VIDEO_LONG(), and FILL_VIDEO(). There is one case when code +reads from atari_screen[], that one uses macro READ_VIDEO_LONG() but +I would strongly discourage everybody from doing tricks like that. +For code outside of ANTIC.C there are two simple functions: +video_putbyte() and video_memset(). Those should suffice in most +situations. + +6. Other notes. +With current set of macros the emulator core is shielded from actual +atari_screen[] implementation. By all means, atari_screen can be fake +pointer now. It is possible to create set of macros that will cause +port code (outside of emulator core) to draw pixels directly to the +screen as emulator generates them, potentially saving some CPU clocks +(just replace screen_dirty[] changes with calls to client functions). +It is also possible to move atari_screen[] allocation completely to +the client side. Not sure if anybody needs these features, but they +come free. Another interesting use of dirty update implementation +would be very efficient way to record movies straight from the +emulator: no need to calculate diff frames anymore. This is rather +fancy feature but you never know. + +Vasyl +04/07/2002 \ No newline at end of file diff --git a/DOC/HOWTO-DIRTYSPAN b/DOC/HOWTO-DIRTYSPAN new file mode 100644 index 0000000..b8fa447 --- /dev/null +++ b/DOC/HOWTO-DIRTYSPAN @@ -0,0 +1,110 @@ +DIRTY SPANS TECHNIQUE + +Please note: this is just an idea. + +I'll explain it in pseudo-code: + +/* in antic.c: */ + +int dirty_left[ATARI_HEIGHT]; +int dirty_right[ATARI_HEIGHT]; + +static void draw_antic_*() +{ + int x; + for (x = left_margin; x < right_margin; x++) { + UBYTE new_pixel = generate_pixel(x); + if (new_pixel != scrn_ptr[x]) { + dirty_left[ypos - 8] = x; + x = right_margin; + do { + x--; + new_pixel = generate_pixel(x); + } while (new_pixel == scrn_ptr[x]); + dirty_right[ypos - 8] = x + 1; + for (x = dirty_left[ypos - 8]; x < dirty_right[ypos - 8]; x++) { + scrn_ptr[x] = generate_pixel(x); + } + return; + } + } + /* no pixels changed in this line */ + dirty_left[ypos - 8] = dirty_right[ypos - 8] = 0; +} + +/* Note: (ypos - 8) is because ypos ranges from 8 to 247 + for the visible scanlines */ + + +/* port-specific Atari_DisplayScreen(): */ + +void Atari_DisplayScreen(UBYTE *screen) +{ + int y; + for (y = 0; y < ATARI_HEIGHT; y++) { + /* copy pixels dirty_left[y] <= x < dirty_right[y] + from screen[] to the real screen */ + blit_pixels(screen, dirty_left[y], dirty_right[y], y); + } +} + +Now some less formal explanation: + +The idea is to update only parts of scanlines that changed since last frame. +We update one continuous sequence of pixels ("span") per scanline. +dirty_left[y] and dirty_right[y] are the boundaries of the span in scanline y. +In each scanline, we search for a first pixel that is different +from the previous frame. If we don't find one, then the whole scanline +is not dirty, which we mark with: +dirty_left[y] = dirty_right[y] = 0; +If we find left-most pixel that differs from the previous frame, +we save its x coordinate in dirty_left[y]. Then we search starting +from the right side for a pixel that changed since last frame. We know we'll +find one. We save (x + 1) in dirty_right[y]. Now we normally generate pixels +between dirty_left[y] and dirty_right[y]. + +The display routine doesn't need any additional comments, I think. + +Compared to the current approach (always display whole Atari screen), +the DIRTY SPANS technique adds almost zero overhead in the worst case. +In the best case we avoid screen updates completely. +On average, we update just the areas that changed. + +There's one case when DIRTY SPANS perform worse than DIRTY RECT: +if left and right sides of screen are changing while the center of screen +remains static. This is however extremely rare (actually, I cannot recall +any real Atari program that does such things). + +Compared to DIRTY RECT, DIRTY SPANS has nearly zero overhead in ANTIC code: +while searching for boundaries there are comparisons but no writes +to the screen; generating the changed part of the scanlines operates +as fast as without DIRTY techniques. + +Displaying pixels is much faster: we immediately know which pixels to update, +without stepping through 8K screen_dirty[]. It is also better for hardware +architectures where continuous writes to the video memory are faster +then random writes. + +It is possible to combine DIRTY SPANS with DIRTY RECT: in the first pass, +find span boundaries using DIRTY SPANS. Then, in the display loop, +update only the pixels that changed (compare current pixels to a backup copy +of the screen). + +DIRTY SPANS should be straightforward to implement on most platforms: +all we need is displaying 1-pixel-high bitmaps. + +The ANTIC code is what gets more complicated with DIRTY SPANS. +Basically, we have to split each function that generates an Atari graphics +mode into 3 parts: +1. Find dirty_left (similar to normal code, but compare instead of write + pixels). +2. Find dirty_right (likewise, but *right-to-left*; it should be possible + to implement it without a speed penalty). +3. Write pixels (same as the current code). +This probably means more and more macros (antic.c is already full of them). + +As noted at the beginning of this document, these are all plans +for the future. + +Piotr Fusik +2005-09-09 diff --git a/DOC/INSTALL b/DOC/INSTALL new file mode 100644 index 0000000..0692178 --- /dev/null +++ b/DOC/INSTALL @@ -0,0 +1,243 @@ +Installation of the Atari800 Emulator +-------------------------------------- + +Irrespective of whether you are going to compile the emulator yourself +or install a pre-compiled binary version you must obtain a copy of the +Operating System ROMs. + +The ROM images are distributed within the PC Xformer 2.5 package (other +versions of this program do not contain the ROMs in a suitable format) +which can be downloaded from:- + +http://prdownloads.sf.net/atari800/xf25.zip + +If you are creating the ROM images yourself they should be copied from +the following locations:- + +1. Atari BASIC (8192 bytes between $a000 and $bfff) + Note: On a 400/800/1200XL system a BASIC cartridge must be inserted, and on + other systems the built-in BASIC must be enabled by setting bit 1 of PORTB + to 0. +2. Atari 400/800 OS (10240 bytes between $d800 and $ffff) +3. Atari XL/XE OS (16384 bytes between $c000 and $ffff) + Note: If you are extracting the XL/XE OS you will find that the ROM area + under the custom chip ($d000 to $d7ff) is mapped between $5000 and $57ff + when bit 7 of PORTB is set to 1. I.e. you should set bit 7 of PORTB and + then dump the memory out in the following order:- $c000 to $cfff, + $5000 to $57ff and finally $d800 to $ffff. +4. Atari XEGS built-in game (8192 bytes between $a000 and $bfff) + Note: the built-in game must be enabled by setting bit 1 of PORTB to 1 and + bit 6 to 0. +5. Atari 5200 BIOS (2048 bytes between $f800 and $ffff) + +The first time you run the emulator you will be prompted for the +location of the ROMs and various other defaults. If you want to +change any of these in the future simply start the emulator with +the "-configure" command line option. + +Compiling the Emulator +---------------------- + +The emulator can be compiled for the following systems (and probably +many others with a little work):- + +1. X Window Version (including SUN OpenWindows) on a Unix Platform + (prefer the SDL version) +2. CURSES version +3. Graphical Version for the Amiga (not maintained) +4. Graphical version for the Atari TT/Falcon and compatible computers +5. "simple" version (no graphics). Should be straightforward to configure + for any 32-bit environment supporting ANSI C. +6. VGA Version for DOS +7. DirectX Version for Microsoft Windows (also try the SDL version) +8. SDL (Linux/Unix, Windows, BeOS) +9. WinCE +10. Java (various platforms) + +Installed zlib (compression library) enables building the emulator with +compressed statesave images support. Additionally installed libpng +makes the emulator capable of generating screenshots in the PNG format. + +Building the Emulator on most platforms +--------------------------------------- + +1. Change your working dir to the atari800/src path +2. Check if "configure" script is there. If it is skip to step 4. +3. Run "./autogen.sh" (make sure you have autoconf >= 2.5x installed). +4. Type "./configure". +5. Type "make". +6. Install the emulator by typing "make install". + +By default, the "configure" script attempts to auto-detect the best interfaces +available to use for emulating video and sound. It is also possible to +override autodetection and select a specific interface by appending the +"--with-video=" and "--with-sound=" options to the command +in step 4. Below is the list of available values for these options: +a) Video interfaces (--with-video): +- dosvga: use direct access to VGA card, only under DOS/DJGPP +- sdl: use the Simple DirectMedia Library +- curses: use the curses library +- ncurses: use the ncurses library +- pdcurses: use the pdcurses library +- no: use only stdin/stdout for input/output. Supported on all platforms +b) Sound interfaces (--with-sound): +- win: use the WinMM library, only under Windows +- falcon: use Atari Falcon native sound +- dossb: use direct access to a Sound Blaster-compatible card, only under + DOS/DJGPP +- sdl: use the Simple DirectMedia Library +- oss: use Open Sound System +- no: disable sound altogether. Supported on all platforms + +Only the video and sound interfaces listed above are autodetected, but the +emulator also supports other ones. To build for a platform that is +not automatically detected, replace step 4 of the above instructions with: + +4a. Type "./configure --target=help" for a list of supported platforms. +4b. Type "./configure --target=" (choose from the list above) + + +Building the Emulator for Curses +-------------------------------- + +Follow the instruction above but note that you must be using the +System V Curses Library. BSD Curses is lacking a few functions and +will not work (nodelay, attron, attroff, keypad and curs_set). + +Building the Emulator for DOS +----------------------------- + +To compile, use DJGPP the DOS port of gcc, which can be got from +http://www.delorie.com/djgpp/. You will need complete environment +in order to configure and build the executables. +You may need zlib (compression library) to use compressed statesave images +and libpng for PNG screenshots. To build curses (text mode) version install +curses-compatible library (e.g. PDCurses) and add +"--with-video=pdcurses" when invoking "./configure". + +Since the source code contains files with long file names, you must unpack +and compile the source on a filesystem supporting long file names (for example +VFAT of Windows95). An additional change of DJGPP setting is required: +open the DJGPP.ENV file in editor and change the LFN= line to LFN=y + +1. Run "configure_dos.bat". +2. Run "make" and "make joycfg". +3. If everything went good you should have atari800.exe and joycfg.exe - + copy them to destination directory. + +Building the Emulator for Windows using Cygwin +---------------------------------------------- + +Atari800 for Windows can be built using Cygwin environment: +http://cygwin.com/ + +1. Get and install at least one of SDL or DirectX for MinGW. +2. For SDL, get the file SDL_win32_main.c from the SDL source that matches + your version and copy it into the Atari800 src directory. +3. Type "./configure --target=windx" for DirectX or "./configure + --with-video=sdl --with-sound=sdl" for SDL. +4. Type "make". +5. Copy atari800.exe to destination directory. +6. Copy the needed DLLs: /bin/mgwz.dll and (for SDL) sdl.dll + +Building the Emulator for Windows using Microsoft 32-bit C/C++ Compiler +----------------------------------------------------------------------- + +Atari800 for Windows can be built using command-line tools +from Microsoft Visual C++ 2005. Avoid older compilers such as VC++ 6 +because they are buggy (even with service packs) and unsupported. +In addition to the compiler suite you need Windows Platform SDK (included +in Visual C++ 2008 or newer) and DirectX SDK (not newer than the August 2007 +version, as it is the last one to contain the now-deprecated DirectInput +libraries.) Set "Path", "INCLUDE" and "LIB" environment variables to point to +the correct locations in VC++, PSDK and DXSDK. + +1. Install the ZLIB library: +a. Download the source code from http://www.zlib.org +b. Remove -MD from CFLAGS in win32\Makefile.msc +c. Compile with "nmake /f win32\Makefile.msc zlib.lib". +d. Copy zlib.h and zconf.h to the Include directory of VC++. +e. Copy zlib.lib to the Lib directory of VC++. +2. Install the LIBPNG library: +a. Download the source code from http://www.libpng.org +b. Remove -MD from CFLAGS in scripts\makefile.vcwin32 +c. Compile with "nmake /f scripts\makefile.vcwin32". +d. Copy png.h and pngconf.h to the Include directory of VC++. +e. Copy libpng.lib to the Lib directory of VC++. +OR +1&2. #undef HAVE_LIBPNG and HAVE_LIBZ in Atari800's src\win32\msc\config.h. + The compiled emulator won't handle zlib-compressed disk images + and state files and won't produce PNG screenshots. +3. Navigate to the src directory of Atari800 sources. +4. Type "nmake /f win32\msc\Makefile". +5. If you are getting linking errors saying something about MSVCRT + then you probably ignored step 1b or 2b. +6. Copy atari800.exe to destination directory. + +Building the Emulator for Falcon +-------------------------------- + +You need a recent GCC, for example 2.7.2, running on a filesystem with long +file names (either minix-fs of MiNT, or VFAT of MagiC). + +1. Type "./configure --target=falcon". +2. Type "make". +3. Copy atari800 to destination directory or try "make install". + +You also can build the default target (by omitting the "--target" option) +with optional support for curses or SDL - see "Building the Emulator on most +platforms". + +Building the Emulator for SDL +----------------------------- + +1. Please install (and configure) SDL library (http://www.libsdl.org). +2. If you are using MinGW or Cygwin, get the file SDL_win32_main.c from the SDL + source (in src/main/win32) and copy it to the atari800 src directory. +3. If you want to build an OpenGL-capable version, you'll need OpenGL headers + installed. They should support OpenGL version 2.1 (support for the Pixel + Buffer Object extension). The result binary however will only need OpenGL + version 1.1 (PBOs simply won't be used). The same binary will work on + machines without OpenGL support - only software modes will be available. + For MinGW, get the OpenGL headers at + http://www.libsdl.org/extras/win32/common/opengl-devel.tar.gz + See also http://www.libsdl.org/extras/win32/mingw32/README.txt +4. Follow the instructions in the "Building the Emulator on most platforms" + section above. NOTE: If required, force using SDL by adding + "--with-video-input=sdl --with-sound=sdl" when calling "./configure". When + building using MinGW, you might also need to add "--with-sdl-prefix=/mingw". + +Building the Emulator for Java using NestedVM +--------------------------------------------- +1. Get and build NestedVM (nestedvm.ibex.org). make env.sh and unix_runtime.jar +2. source env.sh in the NestedVM directory. +3. Follow steps 1-5 of the "Building the Emulator on most platforms" section + above, but when calling ./configure, add these two parameters: + --host=mips-unknown-elf --disable-ide + ie. + ./configure --host=mips-unknown-elf --disable-ide + You might want to add --enable-veryslow --disable-monitorbreak to the above. + This should result in creation of the file named atari800.jar. +4. atari800.jar requires unix_runtime.jar in the same directory. Copy it from + the NestedVM directory where you made it using "make unix_runtime.jar" as + stated above. +5. To run use: java -jar atari800.jar +Add -o UnixRuntime to the NestedVM compiler options to enable directory +browsing. +This requires changing Windows paths to the form: /c:/file in all configuration +files and on the command line. It will look for .atari800.cfg in your +Windows home directory. +Applet version: +You must compile with -o UnixRuntime +Apply UnixRuntime.patch to NestedVM. +To use: + + + +All files should have /resource/http:// in front of their names. +Edit atari800_applet.cfg and add /resource/http:// to all rom files, even those +you are not providing. +Legal distribution of Atari800 as an applet cannot include the OS and BASIC +ROM Files. You can run without BASIC by using -basic_rom none and Thomas +Richter's Os++. + diff --git a/DOC/INSTALL.dos b/DOC/INSTALL.dos new file mode 100644 index 0000000..8e27e43 --- /dev/null +++ b/DOC/INSTALL.dos @@ -0,0 +1,35 @@ +Installation of the Atari800 emulator for MS-DOS +------------------------------------------------------ + +Irrespective of whether you are going to compile the emulator yourself +or install a pre-compiled binary version you must obtain a copy of the +Operating System ROMs. + +The ROM images are distributed within the PC Xformer 2.5 package (other +versions of this program do not contain the ROMs in a suitable format) +which can be downloaded from:- + +http://prdownloads.sf.net/atari800/xf25.zip + +PC-Xformer contains "ataribas.rom", "atariosb.rom" and "atarixl.rom". +If have the original OS it should be called "atariosa.rom" and if +you have the ROM for the 5200 Games System it should be called +"atari5200.rom". + +Installation of the Emulator +---------------------------- + +1. Create a toplevel directory called "atari800" + + mkdir c:\atari800 + +2. Copy the Atari800 ZIP file into the newly created "atari800" + directory and unzip. + + copy *.zip c:\atari800 + cd c:\atari800 + pkunzip *.zip + +3. Copy the Operating System ROMS into the same newly created "atari800" + +4. Start the emulator by typing "atari800". diff --git a/DOC/INSTALL.falcon b/DOC/INSTALL.falcon new file mode 100644 index 0000000..5186894 --- /dev/null +++ b/DOC/INSTALL.falcon @@ -0,0 +1,71 @@ + May 2008 + + Hi all Atari users, + +this is the Atari 8-bit computer emulator for Atari TT/Falcon range of computers. +It should run on any computer with 68030 or higher CPU and a graphics +capable of resolution 320x240 (or higher) in 256 colors. +Atari800 contains special routines for direct VIDEL programming (for achieving +336x240 resolution on VGA monitors) and also dedicated NOVA graphics (ISA ATI +Mach64) support. + +Atari800 had originally been developed by David Firth though it's been +a community project for more than 10 years already. +The Falcon port was initially done by me and I still try to keep it updated. +Empty Head (= Karel Rous) and Gerhard Janka wrote the 65C02 emulation +in pure MC68030 assembler. Douglas Little's assembler routines for VIDEL +and IKBD from his game/demo Bad Mood (a DOOM clone) were used for achieving +maximum possible speed and compatibility. + +ATARI800.TTP - atari800 (full C source, GNU C -m68020-60 -O3) +ATARICPU.TTP - atari800 (cpu.c rewritten in optimized MC68030 asm) + +The following script might be used for rebuilding the fastest possible +version: +============================== make.sh ==================================== +#!/bin/sh +CFLAGS="-m68020-60 -O3 -fomit-frame-pointer -Wall" ./configure --disable-newcycleexact --without-sound --enable-veryslow --disable-monitorbreak --target=falcon +make clean +time make +fixstk 256k atari800 +=========================================================================== + +Keyboard emulation works just like in other Atari800 flavors: + +F1 = Configuration menu +F2 = Option key +F3 = Select key +F4 = Start key +F5 = Reset key (warm start) +Shift+F5 = Switch Atari off and on (cold start) +F6 = Help key +F7 = Break key +F8 = Invoke monitor +F9 = Exit emulator +F10 = Save screenshot +Shift+F10 = Save interlaced screenshot +Help = Help key + +Joystick emulation works fine. Both real joysticks (CX-40 type) can be +connected. + +Several special command line parameters were introduced in this Falcon port: + +-interlace the is a number of skipped Falcon screens. + Normally the Falcon screen is updated every time + when it's build, i.e. is 0 by default. Higher + should cause faster emulation (because of + less time spent by updating slow Falcon screen). + +-joyswap swap Joysticks + +-videl on Falcon use direct VIDEL programing (allows you + to switch res on-the-fly and achieve special 336x240 + resolution on VGA) + +-double double the screen size on NOVA cards + +For bugreports of Falcon port please write to me (Petr Stehlik) + +e-mail pstehlik@sophics.cz +WWW http://atari800.sourceforge.net/ diff --git a/DOC/INSTALL.ps2 b/DOC/INSTALL.ps2 new file mode 100644 index 0000000..8c1733b --- /dev/null +++ b/DOC/INSTALL.ps2 @@ -0,0 +1,35 @@ +PS2 Specific installation guide + + +Build atari800.elf from source (see BUILD.ps2) if you +do not already have the pre-built binary. + +From Read DOC/INSTALL: +*** +Irrespective of whether you are going to compile the emulator yourself +or install a pre-compiled binary version you must obtain a copy of the +Operating System ROMs. + +The ROM images are distributed within the PC Xformer 2.5 package (other +versions of this program do not contain the ROMs in a suitable format) +which can be downloaded from:- + +http://prdownloads.sf.net/atari800/xf25.zip +*** + +Now, on the PS2: +Create an ATARI directory on memcard. +Copy atari800.elf,Atari roms, and some atari executables/images to the +ATARI directory. +launch atari800.elf. + +If your memcard is cramped for space, you should be able to run +atari800.elf from HDD (via Ulaunch, etc) or other mass device. +Note that currently atari800.elf only can look at MemCard for +atari roms and executables/images, and is hard-coded to store +the ATARI800.CFG file (the configuration file for atari800) there. + +Read README.ps2 + +Thanks Piotr of atari800! +Thanks ps2dev.org! Esp NeoVanglist, author of gsKi, and Oopo for the ps2dev toolchain. diff --git a/DOC/INSTALL.wince b/DOC/INSTALL.wince new file mode 100644 index 0000000..718b1c4 --- /dev/null +++ b/DOC/INSTALL.wince @@ -0,0 +1,153 @@ + PocketAtari: The Windows CE Port of the Atari 800 Emulator. + +(Last Update of this File: 30 Oct 06) + +I. PURPOSE +------------------------------------------------------------------------------ +This file describes the installation and compilation procedure for the Windows +CE port of the Atari800 emulator [1]. The port currently supports Pocket PC and +Smartphone devices deployed with the 2002 version of the OS, also known as +WCE300. It has also been tested on devices featuring version 2003 and Windows +Mobile 5 of the OS and runs just fine. Your mileage may vary. + +II. NEWS +------------------------------------------------------------------------------ +The updated version of this port: + +o Adds support for Smartphone devices. + - Now supporting QVGA Smartphone devices. + - Supports QVGA Landcape Smartphone devices. [NEW in 2.0.3] + - Adds a popup virtual keyboard. [NEW in 2.0.3] +o Support for VGA displays. +o Includes interpolating downsampling filter for Smartphone displays. +o Keeps the backlight always on. + +III. INSTALLING +------------------------------------------------------------------------------ +To intall PocketAtari on your PocketPC/Smartphone device: + +o Create a directory anywhere on your device (Smartphone users need a suitable + file explorer application; else you can create it in the Start Menu folder). +o Copy the pocketatari.exe file there. +o (Optional) Older Windows CE devices also need GAPI from Microsoft [6]. Copy + gx.dll into the folder as well. +o Copy the Atari OS ROM files in the same folder (see the FAQ for the ROMs). +o (Optional) Create a symbolic link to pocketatari.exe at + (IPSM)\Windows\Start Menu. +o You're good to go! + +NOTE: The PocketAtari binary does not support older Palm devices (eg. wince +2.11), but the source code should compile and run with no problems. If you +can contribute a build for these devices contact me through [3]. + +IV. USING +------------------------------------------------------------------------------ +Pocket Atari can operate in portrait, landscape and inverse landscape mode. +Port-specific options in the Windows CE version are: + +o Virtual Joystick (in Controller Configuration, Pocket PC only) + Enable joystick emulation with stylus. +o Enable Linear Filtering (in Display Settings) + Use filtering for better image quality. + +Controls for the different classes of devices: + +a. Pocket PC +Use the displayed keyboard/menu to operate the emulator. In landscape modes +tap the bottom right corner of the atari screen to display the keyboard/menu. + +b. Smartphone +Due to the lack of proper keyboard and pointing device, the emulated Atari features +are limited. You can play the majority of games though. Use the following keys: + +Directional keys : Simulate joystick 0 $ +Softkey A, Softkey B, 4, 6 : Fire joystick 0 $ +0 : Return key +7 : Option key +8 : Select key +9 : Start key +Softkey C (usually '*' key) : Show emulator menu $ +Talk/Call/Green key : Switch between the 3 display modes + +For navigating the emulator menus use buttons marked with '$' above. + +Pressing and holding the Softkey C for more than one (1) second during emulation +brings up the virtual Atari keyboard. Navigate with cursor keys to the desired +key and press Softkey A or B to inject one keystroke into the emulator. + +TIP: In some demos, pressing the SHIFT key skips the current part. In the virtual + keyboard the SHIFT key is a toggle, so select also another key. The SHIFT + keycode will register just fine. + +NOTE 1 : Functionality of Softkey A, Softkey B and * keys may be attributed + differently according to the drivers of your cellphone. +NOTE 2 : Until we get a fully modifiable controller configuration option in + Atari800, you have to live with the preassigned keys. As an exception, + some smartphones have reported problems with the simultaneous use of + the fire keys and the directional pad. I have included an option to + exchange the functionality of the Softkey B and C keys. This should be + considered as an UNSUPPORTED option which will go away in the future. + To enable it include the following line in your atari800.cfg file: + WCE_SMARTPHONE_KBHACK=1 + Also note that this behavior is enabled by default for QVGA Landscape + Smartphone devices, due to the possible lack of a Softkey C. + +V. COMPILING +------------------------------------------------------------------------------ +You will need the following tools: + +o Microsoft Embedded Visual Tools 3.0 [7]. +o GAPI emulation [4] for the emulators. +o The zlibce library [5]. + +Create a folder named zlib inside the src/wince directory. Copy zconf.h +and zlib.h in zlib/. Create two folders named arm and x86 (src/wince/zlib/arm +and src/wince/zlib/x86). Copy the appropriate zlibce.lib files in these +directories. Don't forget to upload gx.dll (if needed) and zlibce.dll to your +emulator. Also for older Smartphones you'll have to compile yourself a version of +the gx.dll using the GAPI emulator files. The Smartphone resolution is 176x220 +pixels with 16bpp (either 565 or 555 RGB configurations). + +NOTE 1 : If you cannot open the project file "PocketAtari.vcp" from the source + tarball or CVS checkout, make sure that it is in CR+LF format (and not + just LF). A utility like unix2dos can do the trick. + +NOTE 2 : PocketAtari can also compile OK using evc4 or Visual Studio 2005. + +VI. HISTORY +------------------------------------------------------------------------------ +The Pocket PC port was originally done by Vasyl Tsvirkunov [2]. +Kostas Nakos [3] updated the port and added support for Smartphone devices. +Many thanks to Vasyl for providing us with a stable codebase! + +VII. CONTACT +------------------------------------------------------------------------------ +Please visit my Atari800 page [3] for fresh builds and news. +To report bugs or request new features you can email me at: knakos@gmail.com +Also visit Vasyl's Atari800 page [2] and check out the links for more of his work. +For inquiries about the Pocket PC/Smartphone port or the emulator in general +you can also take a look at the Atari800-users mailing list available at [1]. + + + Enjoy! + Kostas Nakos, + 31/08/05 + Athens, Greece + + +VIII. REFERENCES +------------------------------------------------------------------------------ +[1] Atari800 project homepage + http://atari800.sourceforge.net/ +[2] Vasyl Tsvirkunov's Atari800 page + http://pocketatari.retrogames.com +[3] Kostas Nakos' Atari800 page + http://pocketatari.atari.org +[4] GAPI emulation + http://pocketfrog.droneship.com/ +[5] zlib for Windows CE + http://www.tenik.co.jp/~adachi/wince/ +[6] Microsoft GAPI 1.2 + http://www.microsoft.com/downloads/details.aspx?FamilyID=d9879b0e-4ef1-4049-9c61-e758933d84c4&displaylang=en +[7] Microsoft eMbedded Visual Tools 3.0 + http://msdn.microsoft.com/mobility/windowsmobile/downloads/default.aspx diff --git a/DOC/LPTjoy.txt b/DOC/LPTjoy.txt new file mode 100644 index 0000000..19e47b7 --- /dev/null +++ b/DOC/LPTjoy.txt @@ -0,0 +1,14 @@ +LPTjoy interface (designed by Petr Sumbera) + + [ CANON 25 MALE ] [ CANON 9 M ] + +(acknowledge) 10 ........................... 4 (right) +(busy) 11 ........................... 3 (left) +(out of paper) 12 ........................... 2 (down) +(select) 13 ........................... 1 (up) + +(error) 15 ........................... 6 (button) + +(strobe) 1 ........................... 7 (Ucc) +(ground) 25 ........................... 8 (ground) + diff --git a/DOC/NEWS b/DOC/NEWS new file mode 100644 index 0000000..3c22921 --- /dev/null +++ b/DOC/NEWS @@ -0,0 +1,907 @@ +Version 3.1.0 (2014/04/12) - release cooked at Atariada.cz + + Highlight of this release: Raspberry Pi port by Andrey Dj + + Hidden easter egg: on-screen keyboard in SDL by Christian Groessler + + All the following work has been done by Tomasz Krasuski: + + General new features: + --------------------- + * More accurate emulation of PAL colours (based on analysis of oscillograms + of real PAL GTIA output) + + * Improved PAL blending, working on all grayscale pixels and is accurate now + (can be enabled/disabled in "TV effect" display settings) + + * common sound layer implemented (SDL, JavaNVM, OSS, DOS) with synchro sound. + + * synchronized sound is now supported by both POKEY sound engines. + + * turbo mode (F12) is considerably faster + + * Added cartridge mapping used by "Turbo Hit"/"Atari Blizzard Hit". + * Added MegaMax 2 MB cartridge mapping. + * Added read-only support for the 4 MB Flash MegaCart mapping. + * Added minimal support for The!Cart. + + General Fixes: + -------------- + * fixed possible unnecessary cartridge bank switching + * fixes and clean up in Java port + * fixed diagnostic cartridge cold start (doesn't send Start+Option) + * fixed two old bugs in DOS sound (pitch being wrong and sound missing) + * fixed keyboard not working for ncurses video and OSS sound + + +Version 3.0.0 (2013/03/03) + + New features: + ------------- + * Option to automatically save configuration on exit + * More settings saved in configuration: + - currently attached tape file + - cartridge settings, including currently attached cartridges + - state of R-Time 8 + - system settings, including Mosaic/Axlon RAM size + * New Tape Management menu - can now create blank tape images, switch tape + to read/write in order to save additional data at the end of the current + tape image, rewind/fast forward the tape, and mark it as read-only. See + DOC/USAGE for details. + * Displaying tape position when "Show sector/block counter" is enabled. + * Reworked Cartridge Management menu - now displays filename of the + attached cartridge. + * Option to disable restarting of the machine after cartridge change. + * When attaching a cartridge from the command line, cartridge type can now + be specified using the new -cart-type and -cart2-type options. + * New cartridge types supported: + - OSS 8 KB cartridge + - OSS two chip 16 KB cartridge (043M) + - Blizzard 4 KB cartridge + - AST 32 KB cartridge + - Atrax SDX 64 KB cartridge + - Atrax SDX 128 KB cartridge + - Turbosoft 64 KB cartridge + - Turbosoft 128 KB cartridge + - Ultracart 32 KB cartridge + - Low bank 8 KB cartridge + - SIC! 128 KB cartridge + - SIC! 256 KB cartridge + - SIC! 512 KB cartridge + - Standard 2 KB cartridge + - Standard 4 KB cartridge + - Right slot 4 KB cartridge + * The configure script can now auto-detect some of the available display and + sound interfaces before compiling. + * Option to enable XEP80 added to The Emulator Settings menu. + * Emulation of the 1200XL, including console LEDs, no built-in BASIC, the + F1-F4 keys (mapped to arrow keys in the SDL version) and the on-board + J1 jumper. + * Emulation of the XE Game System, including the built-in game and + detachable keyboard. + * Revamped the Select System menu (now called System Settings). Can now + select many system settings, including RAM expansions, OS and BASIC + revision, and more. + * System ROM settings moved to a separate menu. Now it stores paths to all + known official revisions of the Atari OS, the 5200 BIOS, all BASIC + revisions, and the XEGS built-in game. The OS revision to use is chosen + automatically when selecting a machine type (for example, the 400/800 OS + PAL or NTSC version is chosen depending on the selected TV system). + * 400/800: Emulation of all RAM sizes achievable with different combinations + of the CX852 and CX853 modules - from 8 to 48 KB. + * Emulation of 32/48KB memory sizes in the XL/XE mode, compatible + with memory expansions for the 600XL manufactured by RC Systems. + * Emulation of the MapRAM hardware hack. + * Display settings: "Hue" renamed to "Tint". Tint now configurable also in + PAL mode. + + New Android port features: + -------------------------- + * Renamed Atari800 Android port to "Colleen" + * Implemented extended key remapping + * Implemented the B: device (8-bit games can reach the web now) + * Support for Xperia play keycodes added + * Remapped dpad enter to break + * Added paddle emulation + * Optimized file selector, allow roaming outside of ext. storage dir + * Added an exclusion border for paddle mode + * Implemented state saving + * Implemented Planetary Defense mode, a Koala Pad click-where-I-point mode + * Natively supported UI on post-Honeycomb devices + * Fixes for Jelly Bean (audio stuttering, keypad dialogs, soft keyboard) + * Added new dialog for cartridge type selection + * UI fine tuning + + General Fixes: + -------------- + * Bugfixes in cassette emulation - works reliably even for tape images with + long (> 4096 B) blocks. + * Fixes in save states - loading of save states works correctly even with an + attached bank-switched cartridge or with an Axlon/Mosaic RAM expansion. + Note 1: Format of the state files has changed. Old save states can still + be opened, but newly-created ones cannot be opened in older versions of + Atari800. + Note 2: Tape position is not restored on loading of save states. Do not + save state during tape loading/saving - it won't work as expected. + * "Disable BASIC when booting Atari" no longer emulates pressing of the + Option key when in the 400/800 mode. + * Fixed a bug with BASIC sometimes disabling itself when switching system + type to 400/800 + * Minor bugfixes in file selector + * Fixed emulation of SpartaDOS X piggyback cartridge functionality + * "Save Screenshot" fixed - it saved an interlaced screenshot instead of a + normal one. + * SDL version: Swapped mapping of right and middle mouse buttons, to make it + identical to the X11 and Win32 ports. + * Monitor: fixed displaying/disassembling of memory area $D000-$D7FF - with + the new supported cartridge types, code may reside on page $D5, and now it + can be debugged. + * SDL version: fixed a blue border when in OpenGL BGRA32 mode. + * Minor fixes in parsing of command-line options. + * Rewritten XEP80 emulation - now more accurate and supports switching + between NTSC/PAL modes with correct aspect ratio. XEP80 emulation now + requires a charset ROM image, path to which should be set in the + XEP80_CHARSET line in the config file. + * Fixed operating system patches not working with all official revisions of + the OS. + * Fixed emulation of separate ANTIC/CPU access to XE RAM when Self-Test is + enabled. + * Fixed the emulator menu sometimes being displayed incorrectly (missing + font) when running without an OS ROM image. + * Improved accuracy of generated colours in PAL mode. + * Fixed emulation of the H: read operation - Turbo Basic's BLOAD now works + on H: devices. + + +Version 2.2.1 (2011/04/28) + + Quick update fixing some annoying bugs from the previous release + and adding some new host screen optimizations and improvements: + + * X11 target can be compiled again + * SDL sound on *BSD should work + * older compilers (DOS/BeOS) should compile again + * many SDL/OpenGL workarounds for Microsoft Windows libSDL bugs + * IDE fix and CF emulation + * some small Android fixes and new arrow key derotation workaround + * UI sliders used for more settings (video area/shift options) + * several command line options renamed to be more intuitive (see the USAGE) + * automatic detection of host screen aspect ratio + * added option for disabling OpenGL Pixel Buffer Objects + * added option for enabling video synchronization with vertical retrace + * added option for selecting pixel format in OpenGL + * now saves the Show Speed/Disk Activity/Sector Counter in the settings + + +Version 2.2.0 (2011/04/02) + + Another update after two long years. A lot of changes and major improvements: + + New features: + ------------- + * SDL features synchronized sound (GTIA+POKEY digisounds play properly now) + * SDL display enhancements (hardware accelerated using OpenGL) + * DirectX display enhancements (also hardware accelerated) + * Improved NTSC and PAL colours (presets: Standard/Deep Black/Vibrant) + * Austin Franklin 80 Column card + * Emulate the Alien Group Voice Box I and II + * Added support for F12 turbo mode. + * IDE emulation (compatible with MyIDE) + * New Android port by Kostas Nakos (available in the App Market already) + * Auto frame skip for slower devices (currently enabled for Android only) + + Fixes: + ------ + * trak-ball (cx22) emulation fixed + * SDL: leftmost column missing in 16/32bpp fixed + * DirectX default for Win32 SDL + + SDL Display enhancements: + ------------------------- +1. Fullscreen resolution - this gives a list of all available resolutions from +which a user chooses one. The default resolution is the next-bigger-than +336x240. + +2. Fullscreen: yes/no - obvious. Window size is independent from the chosen +fullscreen resolution and can be changed by resizing the window. + +3. Rotate sideways: yes/no - rotates the screen by 90 deg. Works as earlier, +ie. only for "standard" display (no NTSC filter, no 80 column card). + +4. Stretch - this option controls how display stretching (scaling) is +performed. We can select one of: +a) none - no stretching at all +b) integer multiples (default) - width and height will be resized by 1x, 2x, +3x etc. +c) full - stretching is unrestricted, display will cover the entire screen. + +5. Keep aspect ratio - this option controls how the display's aspect ratio is +corrected. 3 options available: +a) disabled - no aspect ratio correction, display will fill entire +screen/window, +b) 1:1 (default) - width and height will be multipled by the same value +c) like real TV - display will be resized to reflect pixel aspect ratio of a +real Atari connected to a TV. Atari pixels are not square; pixel width-to- +height ratio is about 0.857 for NTSC and 1.039 for PAL. This option reflects +that. + +6. Host display aspect ratio - here the user enters aspect ratio of his +monitor. This value is used to properly compute display aspect ratio when +"Keep aspect ratio" is set to "like real TV". Set it to 4:3 (default), 16:9, +1.78:1 etc. + +7. Horizontal view area - this option sets the size of Atari screen area +visible horizontally. Choose one of: +a) narrow - 320 columns wide, +b) normal (default) - 336 columns wide, +c) full - 384 columns +d) custom - lets the user enter any value between 160 and 384. + +8. Vertical view area - similar to above: +a) short - 200 lines high +b) normal (default) - this setting is TV-system-dependent. In PAL this makes +all 240 lines visible, while in NTSC top and bottom 8 lines are hidden, which +leaves 224 lines visible. I've made this as such because apparently on NTSC +TVs not all 240 lines are visible. The value of 224 was taken by taking full +NTSC height (480, divided by 2) and cutting top and bottom 3.5% (different +sources say 3.5% is the "action-safe" overscan area). +c) full - 240 lines high +d) custom - any value between 100 and 240. + +9. Horizontal offset - when amount of columns displayed is less than 384, this +option "shifts" the visible screen area. Setting to higher than 0 shows more +of the right side, and lower than 0 shows more of the left side. + +10. Vertical offset - similar to above. + +Additionally, the Alt+Shift+X shortcut that switches beetween standard<->80 +column display is now also available as "Display settings->80 column display +if available: yes/no". + +The Alt+B switch however has been removed - since setting black/white colours +can be done in Display settings anyway. + +All new options are also available from command line and are saveable in +configuration. + + New Android port features: + ------------------------- +- Efficient performance +- Uses Opengl ES to handle scaling of the graphics +- Runs on Android 1.6+ +- Novel on screen touch joystick control for less hand cramps & intuitive + control +- Supports multi touch input +- Supports hardware keyboard with key remapping for joystick input +- Supports the Wii Controller for joystick input +- Supports the "move to SD" feature +- Sound emulation very good but not perfect yet +- Bypasses the emulator UI menu completely - goes 'the android way' about it +- Available in the App Market: market://details?id=name.nick.jubanka.atari800 + + +Version 2.1.0 (2009/03/27) + + The promised completely new next-gen Atari800 was postponed so this + is another incremental update of the good old Atari800. Let's see + what we have added and improved in the last 20 months: + + New features: + ------------- + * added Axlon and Mosaic RAM expansions for Atari 400/800 + * added emulation of 1400XL, 1450XLD, MIO and Black Box + * added support of .PRO copy-protected disk images + * implemented tape loading with variable bitrates + * implemented cassette writing via hardware registers + * added switching between NTSC and PAL color palettes + * added emulation of XEP80 and a prototype 80 column card + for the Atari 1090 (SDL only currently) + * added emulation of CX85 numeric keyboard (Java and SDL only) + * event recording added (-record, -playback): save your game walkthrough + using the "-record mygame.dat" and later impress your friends by + your game skills or highest score using the "-playback mygame.dat" + * NTSC Filter option added to UI + * -directmouse added to SDL and X11 (used for -mouse pad or koala) + * monitor supports arrow keys - e.g. up-arrow for history + * SDL: interpolated scanlines (use -scanlinesnoint to disable) + * SDL: added -mouse, -mousespeed, -grabmouse (also Alt+M) + * SDL: visual configuration of keyboard joysticks layout in the UI + (F1 -> Controller Configuration -> Define layout) + default mapping changed to 4,8,6,5 (joy0) and A,W,D,S (joy1) + * R: device can be serial-only, network-only or both (selectable) + * R: device now supported on MS Windows and Dreamcast as well + * a completely new port to Java using NestedVM, running also as an applet + * Falcon/TT: removed Devpac dependency in asm files (now gcc friendly) + + Fixes: + ------ + * fix for "Ilusia" demo + * better GTIA bug mode emulation + * POKEY sound: nonlinear mixing (not enabled by default), two-tone filter + * fixed POKEY registers: ALLPOT, IRQEN and STIMER + * various Atari5200 fixes + * fixed Atrax cartridge bank switching + * fixed sound recording to WAV + * -showspeed fixed, now shows speed <= 100% correctly + * major source code cleanup, compiles with -pedantic etc. + * Save State: added support for Axlon and Mosaic (version increased to 5), + fixed PBIM12 restoring, fixed PAGED_MEM error with POKEY, + color palette restoring fixed + * SDL: using DirectX driver on MS Windows (much faster), + fixed stdout.txt on MS Windows, + fixed broken Caps Lock key handling, + -audio16 fixed + * Dreamcast recognizes the TAB key + * MS-Windows: Shift+Control fixes + * dropped SVGAlib target - use SDL instead + + Thanks to Perry McFarlane and other developers for their contributions + to this release. Enjoy Atari800! + + +Version 2.0.3 (2007/07/11) + + This is probably the last release that is based on the source code + written by David Firth back in previous century. + A completely new Atari800, written from scratch, with even better + portability and maintainability is being planned so stay tuned! + + Changes: + -------- + * new style of artifacting + * corrected PMG in bizarre ANTIC/GTIA modes + * added 128 KB SpartaDOS X cartridge type + * added support for QVGA landscape smartphones, added the virtual keyboard + * new command-line option "-win32keys" for keyboard layouts different from US + * MS-Win: run the emulator in a window ("-windowed" on the command line) + * middle button support for ST and Amiga mice in X11 and MS-Win targets + + +Version 2.0.2 (2006/04/08) + + There is a new NTSC emulator available thanks to Blargg (Shay Green) + (http://www.slack.net/~ant) and NewRisingSun who made the original algorithm. + You can access it with -ntscemu in the SDL port only. + Only 640x480x16 is supported and will be invoked automatically. + You will need a fast processor (~700 MHz or so). + This code should be considered experimental but I hope you + will try it and report any problems. Please experiment with the + many settings and compare them with a real NTSC Atari if you have one. + If you come up with better settings than the current defaults please provide + feedback. Try -ntsc_burst 0.70 in Drol, Choplifter and Ultima. + Please read DOC/USAGE and check -help. + + Changes: + -------- + * Blargg's NTSC composite video emulator, based on NewRisingSun's Algorithm. + * small fixes in ANTIC/GTIA emulation + * fixed DCM image handling (broken in 2.0.0) + * added emulation of Atari XL/XE with 192 KB RAM + * integrated SEGA Dreamcast port + * Atari Inverse key mapped also to "`" (backquote) in SDL port (MS Win users) + * some minor improvements + * much more DOC/TODO + + +Version 2.0.1 (2006/01/02) + + Just a quick UI bugfixes release. + + +Version 2.0.0 (2005/12/31) - celebrating decade of Atari800 development! + + This release brings major source code clean up, numerous bug fixes and + many great new features and important improvements. 98% of changes since + last release have been made by Piotr Fusik - admire his dedication + to Atari800 project while you will be browsing through the impressive list + of changes below. + + Run-time configuration (via the .atari800.cfg file) has been improved. + All configuration options are now available in the User Interface. + Remember to use "Save configuration file" when necessary. + + If you are new to Atari800, press F1 and select "Emulator Configuration" + to configure the ROM images. This can be easily done with + "Find ROM images in a directory". + + DISK_DIR, ROM_DIR, EXE_DIR and STATE_DIR configuration options are no longer + supported in this version. You need to re-select your directories + using "Emulator Configuration" -> "Configure directories". + + Changes: + -------- + * auto-starting any file supported by the emulator + via the command line, User Interface or Alt+R + * direct loading of Atari Basic programs: + - SAVEd (*.BAS) programs + - LISTed (*.LST) programs with auto-detected Atari, LF, CR/LF or CR + line terminators + * numerous fixes and improvements in H: device emulation + * fixed a bug in DMACTL emulation + * cycle-exact Read-Modify-Write instructions for all GTIA registers + * Atarimax cartridges + * correct emulation of the RESET key in 400/800 (it generates RNMI) + * improved DCM format support + * improved PERCOM emulation (helps non-standard disk images) + * removed questions that appeared in the console window when no configuration + file was found; now a default configuration is written and you can + modify it using User Interface; the easiest way to configure ROMs is + "Find ROM images in a directory" which looks for common names of ROM images + * DISK_DIR, ROM_DIR, EXE_DIR and STATE_DIR configuration options replaced + with ATARI_FILES_DIR and SAVED_FILES_DIR + * sound recording now works (was completely broken) + * new in User Interface: "Emulator Configuration", "Controller + Configuration", "Save Interlaced Screenshot", "Uncompress Disk Image" + * improved "open file" selector: + - sorts case-insensitively + - sorts directories whose name begins with a dot + - starts on the previously selected file + - you can move to a file by pressing its first letter (works in menus, too) + - path of the listed directory is shown at the top of the screen + * improved "save file" filename selection: + - no longer limited to 32 characters + - directory appears in the edit box + - Tab invokes directory browser + * "Make Blank ATR Disk" creates standard Single Density disk image + * shortcut keys (Alt+letter, F9, ...) work in User Interface + * new "-screenshots " command-line option + * replaced "-rtime " with "-rtime" / "-nortime" + * replaced "-hdreadonly " with "-hreadonly" / "-hreadwrite" + * new monitor commands: "LABELS", "LOOP" + * "C", "M" and "S" monitor commands support hardware registers + * improved "SHOW", "DLIST", "D" and "A" monitor commands + * fixed memory leaks, buffer overflows, Y2K and Y2100 bugs + * fixed GCC 4 compilation error and warnings + * fixed sound in X11 version (feedback is welcome) + * much faster display in the X11 version + * MOTIF and XVIEW versions are now compilable + * standard key mappings for F6-F10 in DirectX, SDL, SVGALIB and X11 versions + * implemented Atari 5200 keys in DirectX, SDL, SVGALIB and X11 versions + * WinCE version ported to Smartphones + * DirectX version can be compiled with MSVC 6 + * stereo now works in DOS ports + * fixed "-rotate90" and Alt+B in SDL version + * greatly improved BASIC version: + - supports sound + - supports all interrupts + - timing much closer to real Atari + - Clear Screen, Backspace, Tab and Bell converted from ATASCII to ASCII + - improved "K:" input + - much smaller executable (does not include unused code) + * greatly improved CURSES version: + - support for PDCurses + - small fix for NCurses + - generates screen basing on the Display List + - fixed Tab, Backspace, Insert, Delete, Home, F2, F3, F4, F8 and Ctrl+letter + - fixed "-wide2" mode + - Alt+letter shortcuts work on PDCurses + - bitmap graphics emulation is now disabled by default + (smaller and faster executable), but can be enabled with "configure" + * new experimental PlayStation 2 port + * improved "configure" script + * SDL keyboard joysticks can be enabled/disabled in the UI (Controller Config) + * many small fixes and major source code clean up + + +Version 1.3.6 (2005/04/30) + + Changes: + -------- + * different color palette used by default + * PNG screenshots added + * added sector counter and speedometer + * F6 is Atari HELP key on Curses, Falcon and in X11 + * added missing combinations of ANTIC modes with GTIA modes + * keyboard joystick works in more games (doesn't pause the game) in SDL + * mouse joystick emulation works in X11 + * cassette loading by hardware registers (Ninja and Elektraglide + are examples of games that load correctly now) + * blank boot ATR disk image can be created in the Disk Management menu + * many small fixes and major source code clean up + + +Version 1.3.5 (2004/12/30) + + Changes: + -------- + * keyboard handling improved in SDL (working on non-US layouts, more + keys recognized) + * keyboard handling improved in X11 (crash fixed, auto-repeat working) + + +Version 1.3.4 (2004/12/27) + + Changes: + -------- + * security fixes (buffer overflows) and compilation errors (GCC 3.4) + * ANTIC timing fix for Timeslip game + * fix in UI fileselector (crashed if there were no files) + * Amiga port updated + + +Version 1.3.3 (2004/08/08) + + Changes: + -------- + * ANTIC mode 2 + GTIA mode 10 - half pixel shift fix + * Amiga port updated + * OS/2 port updated + * DOSVGA port updated - joystick definition read again + * X11 port has improved keyboard support (Ctrl+Pause, left Ctrl for joy button) + * SDL port updated: joysticks emulated on keyboard can be freely edited + now with SDL_JOY_0_ and SDL_TRIG_0 (same for JOY_1/TRIG_1) + config file parameters that expect values from SDL keySyms. + + +Version 1.3.2 (2003/12/20) + + Highlights since previous release: + ---------------------------------- + * R: can now be hooked to a real serial port (no runtime config yet) + * various ANTIC and POKEY fixes for perfect software compatibility + * disk and cartridge info saved in the state files + * casette handling greatly improved + * even more cartridges supported (40 now!) + * some rare buffer overflows fixed + + +Version 1.3.1 (2003/09/04) + + Highlights since last 1.3.0 release: + ------------------------------------ + * rewritten and much improved configure script + * new cartridge types supported (38 types now!) - see DOC/cart.txt + * Disk Sets - loading and saving of D1-D8 set is possible in the UI + * R: as the Atari850 serial port emulation added - see DOC/r_device.txt + * updated and improved m68k assembler emulation of the CPU + * XF551 HighSpeed transfer emulation added + + +Version 1.3.0 (2003/02/10) + + Highlights since last 1.2.5 release: + ------------------------------------ + * new HiFi sound (you may en/disable it in the UI) + * new cycle-exact Antic emulation + * "H:" emulation complete (including subfolders) + * Paged memory implementation (fast XE bank-switching) + * new configuration file name and location ($HOME/.atari800.cfg) + +Detailed list of changes follows: + +* configuration file ("atari800.cfg") related changes: + + 1) configuration file is renamed to ".atari800.cfg" by default (note + the leading dot in the name, similarly to most other configuration + files of programs on Unix platforms). On DOS/TOS (FS 8+3 limitation) + the old "atari800.cfg" will be supported. + + 2) RT-Config (the module in Atari800) tries to search the configuration + file in user's home folder first (environment variable HOME should + point there). If it's found then it's used. If it's not there then + RT-Config tries to open system wide configuration file (by default + it's "/etc/atari800.cfg"). Please note that the system wide file is + not updated by Save function of RT-Config because it's expected + that this file is read-only for regular user. + + 3) RT-Config can also be told where your configuration file is by + using the "-config " command line parameter. If the file + is not there yet it's created. So it's quite easy to let Atari800 + create a test config file and compare it with your current config + or to have several config files for various game/demo/application + uses of the Atari800 emulator. + + 4) Some config file options were renamed or otherwise changed some + time ago already but they were still recognized. This is no longer + true so better create a new config file from scratch. + + 5) There are two new important switches - "ENABLE_NEW_POKEY" and + "STEREO_POKEY" so better create new config file so you get these + options configured properly. + +* new Sound: + + The new MZ POKEY emulation is now enabled by default on all ports. + Also the STEREO sound (Dual POKEY) is compiled in by default + but is not enabled (so there's a single POKEY by default but you + can enable the second one very easily in the User Interface (press F1). + + Both can be en/disabled in the configuration file (call atari800 with + the "-configure" parameter to reconfigure these and other options). + + Win32 and SDL ports also recognize a new cmdline switch "-audio16" + that switches to 16-bit sound. + + +Unreleased version 1.2.10 (2003/02/09) + +* autoconf 2.5x required for building the source fetched from CVS. + However, released source code comes with prebuilt configure script + so you shouldn't even notice this change. + +* SDL version contains the same keyboard IRQ fix that was recently + done in the general input core. In human language: Super Pacman 5200 + will not crash after SHIFT and * keypress. + +* On-the-fly change of POKEY emulation core (old Ron Fries' or new + Michael Borisov's). Compare the new HiFi sound with the previous one. + + +Unreleased version 1.2.9 (2003/01/27) + +* New cycle-exact ANTIC/GTIA emulation. Enabled by default, disable by + ./configure --disable-cycleexact + +Unreleased version 1.2.8 (2003/01/27) + +* Paged memory implementation finished. Disabled by default, enable by + ./configure --enable-paged + +Unreleased version 1.2.7 (2003/01/27) + +* Harddisk emulation now complete including support for subdirectories. + +Unreleased version 1.2.6 (2003/01/27) + +* New sound core and 16 bit sound support -- high sound quality but slower. + Use -audio16 option to enable 16 bit sound and -quality to set sound + quality (level > 0 enables new sound core) on the win32 port. + Consult port specific doc for command line details. + +Version 1.2.5 (2002/12/02) + +* UI - the SpaceBar in disk management switches between the RW and RO flags + (this didn't work for a long time, now fixed). Please note that this RW/RO + switch is just temporary and does not change the writeprotect flag of ATR + images. Besides, it cannot override this flag so you actually can't mount + a writeprotected ATR image read/write using this Space Bar toggle. + +* Atari800 compilable under OS/2 + +* MultiJoy4 interface and Amiga/AtariST right mouse button supported + +* 13 new cartridge types supported + +* ANTIC mode E + GTIA mode 9 added (used in "Unconventional 2k", "Ass Kisiel") + + +Version 1.2.4 (2002/08/07) + +* 576 and 1088 kB RAM supported (selection available in the UI) + +* separate Antic access to extended memory for 130 XE and 320 Compy Shop + +* 256K and 512K XEGS carts + +* SDL version now + - cleans up after unsuccessful initialization + - supports "-nosound" and "-dsprate" + - continues to run even if sound initialization failed + +* command line options "-help" and "-v" ("-version") now work better + in most supported ports. + + +Version 1.2.3 (2002/07/08) + +* 16 kB RAM machines (Atari 400/600XL) emulated + +* LPTjoy support added to the SDL port + +* SDL port is generally much improved. To get list of SDL specific options + start the SDL version of Atari800 with -help. + +* casette image loading accessible from UI + +* -palette option (for loading an alternate ACT color palette file) fixed. + +* channel 1 in stereo mode fixed + +* antic: NMIST bit 5 fixed (is always zero) + +* input: second button in 5200 joystick generates "Break key" IRQ + (you can now jump in "Moon Patrol" - use Shift) + +* monitor: "DLIST" now accepts address as an argument + +* antic: Dirty update scheme that allows slower machines to run Atari800 + at full speed now! See DOC/HOWTO-DIRTYRECT for more information. + +* pokey: allow high-speed disk i/o (Alpha-Load works, thanks to Paul Irvine) + + +Version 1.2.2 (2001/12/31) + +* Falcon .s files had to be renamed to .asm, otherwise the vga + port could not be built. + + +Version 1.2.1 (2001/12/31) + +* serious memory overflow bug fixed (caused crashing of X11 port + and probably also other unexpected bugs or problems) + +* joysticks in SDL port fixed and improved. + +* RPM's .spec file fixed. + + +Version 1.2.1pre0 (2001/12/17) + +* Falcon port configurable and buildable again + +* SDL support for 32-bit display, screen width switching (LALT+g) + +* documentation updated (still can be much improved :) + +* util/ folder contains new sethdr and act2html utilities + +* configure process is non-interactive (doesn't ask any questions) + +* RPM .spec file for easy building of Atari800 from source .tar.gz + + +Version 1.2.0 (2001/11/29) + +* completely new SDL port (use ./configure --target=sdl) that should run + on most/all platforms/OSes SDL supports (http://www.libsdl.org/) + +* completely new WinCE port + +*** New features: + +* support for Express, Diamond, SpartaDOS X, XEGS, Action!, BASIC XL + and other cartridge types (see cart.txt for complete list). + The "-cart" option runs CART files and all types of raw images. + "-rtime 0" disables emulation of R-Time 8. + Thanks to: + - Jindroush, who described most of the cartridge types + - Nir Dary, for information on 8*8 KB D50x and OSS 'M091' cartridges + +* mouse can emulate following devices + (in parentheses the option that enables emulation): + - paddles (-mouse pad) + - Atari Touch Tablet (-mouse touch) + - Koala Pad (-mouse koala) + - Light Pen (-mouse pen) + - Light Gun (-mouse gun) + - Amiga mouse (-mouse amiga) + - Atari ST mouse (-mouse st) + - Atari Trak-Ball (-mouse trak) + - joystick (-mouse joy) + For Atari 5200 you can use "-mouse pad" (good for Gorf and Kaboom) + or "-mouse joy" (good for Missile Command and Super Breakout). + Use "-mouseport <1-4>" to select the Atari port. + Use "-mousespeed <1-9>" to select speed (default is 3). + +* cassette recorder emulation! (experimental) + Currently only reading works and only with SIO patch. + Supported are: + - CAS files - the digital cassette image format by Ernest Schreurs. + The format handles different lengths of blocks, gaps, non-standard blocks, + baud rates and more. See http://home.planet.nl/~ernest/home.html + for the excellent WAV2CAS converter, which includes detailed description + of the format. Atari800 supports the format only partially at the moment. + - raw files - any file can be attached, as if it has been written + to the C: device (standard Atari OS format). + No UI available yet. Attach a file with "-tape filename" + or "-boottape filename" (emulator presses Start and Space to boot the tape). + +* SIO, H: and P: patches are now independent and can be toggled at run-time + +* the H: device no longer replaces C:. + The H: device is now added to HATABS in RAM, and the escape codes + are put in 0xd100-0xd1ff, so H: doesn't modify Atari OS at all. + +* "-basic" and "-nobasic" work for Atari 800 (Atari BASIC is attached + as a cartridge in Atari 800) + +* devices: added open mode 9 (append) for H: device + +* input: the illegal joystick positions (e.g. left+right) are not passed + to the emulated Atari (good for "Mario Bros.") + +* monitor: + - "C 600 ABCD" does the same as "C 600 CD AB" + - 1 KB boundary is respected by "DLIST" + - "POKEY" command + - "S" without parameters repeats last search + +* ui: added Atari Settings (enable/disable BASIC, R-Time 8, SIO patch, H:, P:) + +*** Compatibility improvements: + +* antic,gtia: the background color can be changed inside a scanline. + Currently implemented only for blank lines without PMG. + Try the "Partyland" part of the "Bitter Reality" demo. + +* antic: corrected timing of DLISTL/H ("Spelunker" works) + +* binload: 0x31 stored at 0x300 ("Studio Dream" loads now) + +* cpu: Read-Modify-Write (RMW) instructions (ASL, INC, etc.) store + the unmodified value of $D01A before they store the modified value. + Now you can see the white dots made with INC $D01A. + +* cpu: on reset, the I flag is set (now reset works if stuck in interrupts) + +* devices: replaced "dGetByte(0x2e)" with "regX" in H: handler routines + (fixes problems with Atari BASIC's GET/PUT/INPUT/PRINT) + +* pia: & 0x3f on read PACTL and PBCTL + +* pokey: potentiometers emulation improved: POTGO and ALLPOT registers + and bit 2 of SKCTLS implemented, "Tree Surgeon" no longer hangs + +* pokey: true RANDOM emulation (both 9- and 17-bit poly) ! + Not using rand() anymore. Try the "Bank Bang!" game. + +* pokey: fixed STIMER (speech in "Mirax Force" is better, but still + not perfect) + +* pokey: a few fixes for stereo detection routines (helps "Sheol", + "Total Daze", "Crockett's Theme"...) + +* pokey: fixed SERIN ("Timeless Announcement" loads now) + +* pokeysnd: added exact poly9_lookup and poly17_lookup, removed bit17 + (which was initialised with rand()) saving ca. 100 KB of memory. + Do you hear any difference? + +* sio: made double density ATR images compatible with SIO2PC + +*** Bug fixes: + +* cpu: fixed wrong extern + +* devices: fixed Device_isvalid (problems with trailing 0x9b) + +* rtime: added "byte &= 0x0f" to prevent out of bounds accesses + to regset[] + +* sio: corrected and added checks if drive number is in range 1-8 + +* sio: Format Disk rewritten. Now it can resize both ATR and XFD images. + The ATR header is being updated. Double density format works. + +*** Optimizations: + +* antic: optimized ANTIC_Load and character modes + +* atari_vga: no unnecessary Atari_DisplayScreen() calls if "-refresh" is used + +* cpu: slight optimization of ROL and ROR + +* gtia: optimized players in new_pm_scanline + +*** Clean-ups in sources (for programmers): + +* created cartridge.[ch] and rtime.[ch], removed supercart.[ch] + +* created input.[ch] to handle keyboard, joysticks and mouse + +* removed enable_rom_patches, added enable_h_patch and enable_p_patch. + Original OS is saved in atari_os. Removed SetSIOEsc() and RestoreSIO(). + After changing enable_*_patch call Atari800_UpdatePatches(). + +* replaced following variables: machine, mach_xlxe, Ram256, os, + default_system and enable_c000_ram with only two: machine_type and ram_size + (ram_size is in kilobytes, and there're #define's for 320 Rambo/Compy). + There are no more Initialise_Atari... routines. Instead, set machine_type + and ram_size and call Atari800_InitialiseMachine(). + +* moved main() to platform-dependent code, + created Atari800_Initialise and Atari800_Frame + +* removed i386 asm tricks + +* diskled: rewritten to be cleaner and more flexible + +* pokey: SKSTAT variable renamed to SKCTLS to avoid confusions + (it's the write-only, not the read-only Pokey register) + +* pokeysnd: removed duplicates of Pokey constant definitions + and AUDC/AUDF/AUDCTL variables, included pokey.h + + +Previous changes (pre 1.2.0) are in the CHANGES.OLD file. diff --git a/DOC/PORTING b/DOC/PORTING new file mode 100644 index 0000000..78f5e2e --- /dev/null +++ b/DOC/PORTING @@ -0,0 +1,223 @@ +How to port Atari800 to new platforms +===================================== + +This is a guide for people who intend to create a new version of Atari800 +for their computer or operating system (called "target system" throughout +this document). + + +Prerequisites +------------- + +The target system must have a raw computing power at least comparable +to a Pentium 100, otherwise the emulator will run slower than the original +8-bit Atari. Other hardware requirements are usually easier to fulfill: +a few megs RAM, a few megs disk space, a display, some keys and an audio +output. + +You should have a working compiler of the C programming language +for the target system. The compiler, however, can run on another system +(such as PC), which is called cross-compiling and is common when developing +for small devices. + +You should understand at least the basics of programming in C. +The more you know, the better. + + +Getting started +--------------- + +Try compiling an existing version of Atari800 for a system different +from your target system, just to learn how this works. +See the INSTALL file for instructions. + +Try compiling something for your target system: a "Hello world" program +or (preferrably) a game. In case of problems, ask people who develop +for your target system. If you are not an expert of programming +the target system, get in touch with more experienced developers, +as you may need their advice sooner or later. + + +Compile-time configuration +-------------------------- + +Before you start feeding your C compiler with *.c files, +you need a file named "config.h". This file specifies the system +to compile for, the C library functions that are available and features +to include. There are two methods of creating this file: manually +and using the configure script. + +Using the configure script is recommended, because it makes your port +easier to maintain for people who have never seen your target system. +Yet if you find it too hard to use the configure script, go on with +editing config.h by hand and consider using the configure script later. +The configure script is works well on Unix and GNU/Linux systems, +but can be awkward to use on Windows, especially if you use +an Integrated Development Environment and not command-line tools. + +The configure script is the file named "configure" that should be run +by a Unix shell program such as "bash". The file is hardly human-readable. +It is generated from the source file "configure.ac" by a tool called +"autoconf". Another tool "autoheader" turns "configure.ac" into +"config.h.in", which is a template for "config.h" used by "configure". +"autogen.sh" is a shortcut that simply runs "autoheader" and "autoconf". + +If you opt to edit "config.h" by hand, make a copy of "config.h.in" +under the name "config.h" and edit it changing some #undef's into #define's. +Consult the comments and other config.h files created this way, in "dc", +"win32/msc" and "wince/port" directories. + + +Compiling for the first time +---------------------------- + +Try starting with something simple. Disable sound emulation, +either by passing "--without-sound" to the configure script or by #undef'ing +sound items in "config.h". + +The easiest way to start is to compile a "simple" version of the emulator, +that does not use any external libraries/interfaces for emulation of video, +audio and input, and uses only standard C library functions. With the +configure script you specify "--without-video --without-sound". If editing +"config.h", "#define BASIC 1" and figure out which files to compile. + +The "simple" version does not support graphics or joysticks and has a very +limited keyboard input. Most likely it will appear as a blank screen when +run. That's fine. Edit the runtime configuration file providing paths to +Atari ROM images and change "DISABLE_BASIC" to "0". If you're lucky, you'll +see the "READY" prompt of Atari BASIC. + + +Implementing platform-specific part +----------------------------------- + +Create a new source file with your platform-specific code. +You have several examples to copy-and-paste from. + +The entry point to the program normally looks like this: + +int main(int argc, char **argv) +{ + /* initialise Atari800 core */ + if (!Atari800_Initialise(&argc, argv)) + return 3; + + /* main loop */ + for (;;) { + key_code = Atari_Keyboard(); + Atari800_Frame(); + if (display_screen) + Atari_DisplayScreen(); + } +} + +You need to implement functions specified in "platform.h". +These functions should display graphics on screen and read keyboard +and joysticks/mouse in a platform-specific way. + + +Graphics +-------- + +Atari_Initialise() is the function that does platform-specific initialization. +You may need to switch the graphics mode in this function. + +Atari_DisplayScreen() should update the screen with the contents +of the atari_screen array. atari_screen is declared in screen.h as (ULONG *), +but it is really a pointer to a rectangular array of bytes. There are +240 (ATARI_HEIGHT) rows, 384 (ATARI_WIDTH) bytes each. While there are exactly +240 rows to display, only 336 middle columns of the 384 are meaningful. +Do never display more than 336 middle columns! Although the remaining columns +may appear black when you start the emulator, there's no such guarantee +when the emulator is running. + +It is fine to display only 320 middle columns if that's easier for you than 336. +You can also crop the Atari graphics from the top and the bottom, because most +programs use just the 192 middle lines. If your display has considerably lower +resolution, you need to provide your own bitmap rescaling. + +Bytes in atari_screen[] are Atari color codes (0-15 = shades of gray, +16-31 = shades of brown/yellow, etc). 8-bit Ataris have a fixed palette +of 256 colors. You can get 8-bit RGB components of Atari colors +with the macros Palette_GetR(code), Palette_GetG(code) and Palette_GetB(code), +defined in "colours.h". + + +Keyboard input +-------------- + +There are three variables that are read by the emulation core and should be +set by your platform-specific code: + +int key_code; +int key_shift; +int key_consol; + +key_code is the Atari scancode of the currently pressed keystroke, or one +of the emulator-defined special values, such as AKEY_NONE, AKEY_COLDSTART, +AKEY_BREAK, etc. Atari scancodes are 8-bit values with 6 low bits containing +the code of a regular key and two high bits reflecting the status of Shift +and Control modifiers. See input.h or some Atari documentation for details. +Codes that are special to the emulator are AKEY_NONE (which means no key +pressed, or just the Shift or the Control) and AKEY_* values defined +in "atari.h". + +key_shift should be TRUE when any Shift key is pressed, FALSE otherwise. + +In 8-bit Atari world the term "console keys" refers to the three function keys +(Start, Select and Option) commonly used in games. The keys are independent +of each other and of all other keys. The state of each console key should +be reflected by one bit in key_consol (cleared if the key is pressed). +See "input.h". + + +Joystick input +-------------- + +Four Atari joysticks are emulated, but few Atari games support more than two. + +Each joystick has one fire button. Your Atari_TRIG() is passed the joystick +number (0-3) and should return 0 if the corresponding fire button is pressed +and 1 if it's not. + +The joysticks are "digital", that is, they can be moved in one of 8 directions +from the center position. Joystick positions are passed in a bit obscure way. +Atari_PORT(0) should return the position of joysticks 0 and 1, Atari_PORT(1) +- the position of joysticks 2 and 3. The returned values are 8-bit, +four bits per joystick. The acceptable values of the four bits are defined +as STICK_* constants in "input.h". + + +Mouse input +----------- + +Nearly all Atari programs are controlled by keyboard or joysticks. +Other controllers were much less popular. However, it is easy to support +them in your version of Atari800. + +Paddles, touch tablet, light pen and other devices can be emulated +by a pointing device such as mouse. In the main emulation loop your code +should update the variables mouse_delta_x, mouse_delta_y and mouse_butons. +mouse_delta_x and mouse_delta_y are *relative* positions, that is, +how far the mouse was moved since last time. mouse_buttons is composed +of 3 bits that represent left, right and middle mouse button (1 = pressed). + +To test mouse input, select "Light pen" as the emulated device +and press right mouse button to enable the mouse pointer maintained +by the emulator. + + +Final words +----------- + +That's the end of this guide. I hope it's useful for developers new +to Atari800. Suggestions about what to add or improve are welcome. + +If you are serious about porting Atari800, please join our mailing list. +See the documentation or the web page for details. + + +Happy hacking! + +Piotr Fusik +November 5, 2006 diff --git a/DOC/PortMaintainers b/DOC/PortMaintainers new file mode 100644 index 0000000..bf9422a --- /dev/null +++ b/DOC/PortMaintainers @@ -0,0 +1,31 @@ +Who does build the binaries for Atari800 releases? +================================================== + +The regular binaries for Linux (curses, SDL and X11) distributed +in RPM and Debian packages and available at Sourceforge.net for download +are built by me (Petr Stehlik). + +Official Debian package is built by Martin Albert + +The following guys should build the binary for the other port/platform/OS: + +Port (platform, OS): Maintainer: +----------------------+----------------------------------------- +DOS James Wilkinson +BeOS James Wilkinson +Win32 James Wilkinson +WinCE, Android Kostas Nakos +Mac OS X Mark Grebe +Atari Falcon/TT Petr Stehlik +OS/2 +*BSD +Amiga Sebastian Bauer +Sega Dreamcast Christian Groessler +JVM Perry McFarlane + +If there is a volunteer for any of the above listed ports or if there +is another port working that I didn't list then please contact me +at . + +This document was created on 2003/02/11 and last updated on 2011/02/06. + diff --git a/DOC/README b/DOC/README new file mode 100644 index 0000000..a1ea03e --- /dev/null +++ b/DOC/README @@ -0,0 +1,145 @@ + Free and portable Atari 800 Emulator for everybody, Version 3.1.0 + ----------------------------------------------------------------- + + Copyright (C) 1995 David Firth. E-Mail: david@signus.demon.co.uk + Copyright (C) 1998-2013 Atari800 Development Team. + http://atari800.sourceforge.net/ + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + +This is the emulator of Atari 8-bit computer systems and the 5200 console +for Unix, Linux, Amiga, MS-DOS, Atari TT/Falcon, MS Windows, MS WinCE, +Sega Dreamcast, Android and systems running the SDL library. +Our main objective is to create a freely distributable portable emulator +(i.e. with source code available). +It can be configured to run in the following ways :- + + 1. "simple" version (many platforms) - uses only the standard C library + 2. curses (many platforms) + 3. X Window + Optional XVIEW or MOTIF User Interface + 4. CBM Amiga + 5. MS-DOS (DJGPP) + 6. Atari Falcon/TT and compatible machines + 7. MS Windows (DirectX) + 8. SDL (running on _many_ platforms) + 9. WinCE + 10. Sega Dreamcast + 11. JVM (Java applet) + 12. Android + 13. Raspberry Pi + +The "simple" version is only useful for running programs such as MAC65, +Atari BASIC etc. I have had this version running on Linux, +SunOS 4.1.3, Solaris 2.4, Silicon Graphics, VAX/VMS, CBM Amiga +(Dice C and GNU C), DOS/DJGPP and the HP-UX 9000/380. + +When using curses, the emulator is similar to the "simple" version, but it +also enables full screen editing capability. Some computer don't seem to +support curses fully - SunOS 4.1.3, VAX/VMS, LINUX (but ncurses is OK). + +The X Window version supports graphics and has an optional XVIEW +or MOTIF user interface. The Linux X Window version can be built with +joystick and mouse support. + +The Amiga version supports graphics but currently lacks Paddle support. + +The MS-DOS version supports 320x200, 320x240 and even 320x480 interlaced +graphics, sound (SoundBlaster compatible sound cards, 8bit), +keyboard, one joystick connected to game port and up to three additional +digital joysticks connected to parallel (printer) ports and mouse. + +The Atari Falcon030/040 version supports 320x240 and 336x240 Falcon/TT +8-bit planes graphics modes, NOVA graphics cards, DMA sound and both +joysticks (old CX-40, Atari800 compatible - not the new paddle-like ones). + +The SDL version should compile on Unix, Win32, BeOS, etc... It's optimized for +8, 16 and 32 color depth. Of course it will work fastest in 8bit. If you use it +in XFree86 - please set "Depth=8" in XF86Config to gain maximum speed. +Includes support for joystick and mouse. + +All versions supporting bitmapped graphics have a User Interface implemented +on the emulator's "screen". The User Interface is enter by pressing F1 at any +time. ESC is used to return to the previous screen. + +--------------------------------------------------------------------------- + +Features +-------- + +Note: Not all features are supported on all platforms. + +o Emulated machines: Atari 400, 800, 1200XL, 600XL, 800XL, 65XE, 130XE, 800XE, + XE Game System, 5200 SuperSystem. + +o Configurable 400/800 RAM size, between 8 and 48 KB. + +o Optional 4K RAM between 0xc000 and 0xcfff in 400/800 mode. + +o Axlon and Mosaic memory expansions for the 400/800. + +o 600XL memory expansions to 32 or 48 KB. + +o 130XE compatible memory expansions: 192K, 320K, 576K, 1088K. + +o MapRAM memory enhancement for the XL/XE. + +o Cycle-exact 6502 emulation, all unofficial instructions. + +o Cycle-exact NMI interrupts, scanline-based POKEY interrupts. + +o Cycle-exact ANTIC and GTIA emulation, all display modes. + +o Player/Missile Graphics, exact priority control and collision detection. + +o Exact POKEY shift registers (sound and random number generator). + +o 8 disk drives, emulated at computer-to-drive communication + and fast patched SIO levels. + +o ATR, XFD, DCM, ATR.GZ, XFD.GZ and .PRO disk images. + +o Direct loading of Atari executable files and Atari BASIC programs. + +o 59 cartridge types, raw and CART format. + +o Cassette recorder, raw and CAS images. + +o Printer support. + +o Files can be stored directly on your host computer via the H: device. + +o Current emulation state can be saved in a state file. + +o Sound support on Unix using "/dev/dsp". + +o Stereo (two POKEYs) emulation. + +o Joystick controller using numeric keypad. + +o Real joystick support. + +o Paddles, Atari touch tablet, Koala pad, light pen, light gun, + ST/Amiga mouse, Atari trak-ball, joystick and Atari 5200 analog + controller emulated using mouse. + +o R-Time 8 emulation using host computer clock. + +o Atari palette read from a file or calculated basing on user-defined + parameters. + +o Screen snapshots (normal and interlaced) to PCX and PNG files. + +o Sound output may be written to WAV files. + +o User interface on all versions supporting bitmapped graphics. + +o R: device (the Atari850 serial ports) mapped to net or real serial port. + +o Recording input events to a file and playing them back + +o MIO and Black Box emulation + +o 1400XL and 1450XLD emulation diff --git a/DOC/README.RPI b/DOC/README.RPI new file mode 100644 index 0000000..a610030 --- /dev/null +++ b/DOC/README.RPI @@ -0,0 +1,21 @@ +Note: you need to setup correct video mode for PAL/NTSC machines (proper video/audio sync and vsync). +edit /boot/config.txt + +for PAL version (50 Hz) you can supply this values: +720p mode: +hdmi_group=1 +hdmi_mode=19 +1080p mode: +hdmi_group=1 +hdmi_mode=31 + +for NTSC version (60 Hz): +720p mode: +hdmi_group=1 +hdmi_mode=4 +1080p mode: +hdmi_group=1 +hdmi_mode=16 + +See http://elinux.org/RPiconfig for more info. + diff --git a/DOC/README.android b/DOC/README.android new file mode 100644 index 0000000..2a6b3f1 --- /dev/null +++ b/DOC/README.android @@ -0,0 +1,34 @@ +Build instructions for the Android port +--------------------------------------- + +If you are looking for instructions on how to use the Android port, what the +preferences mean etc. you should check out instead: + +http://pocketatari.atari.org/android + +To compile the android port, you are going to need: + +* The Android SDK +* The Android NDK +* The Java JDK +* A working autotools/make environment (i.e. Cygwin on Windows) + +Setup the environment correctly: create an environment variable called +ANDROID_NDK_ROOT which points to the root of the NDK +(f.ex.:export ANDROID_NDK_ROOT="/android-ndk/"). +Next, add the NDK root, gcc and android tools paths to PATH (f.ex. export PATH= +"$ANDROID_NDK_ROOT:$ANDROID_NDK_ROOT/build/prebuilt/windows/arm-eabi-4.4.0/bin/: +/android-sdk-windows/tools/:/android-sdk-windows/platform-tools/:$PATH"). +Don't forget to also add the proper Java environment vars too (f.ex. +export PATH="/ant/bin:$PATH"; export JAVA_HOME='c:\Java\jdk1.6.0_21\';). + +Unpack the source tarball or get the CVS module. Go to the src directory and +update the project thusly: +android update project --path android/ --name colleen +Configure the build. I use this setup: +autoheader && autoconf && ./configure --target=android --disable-monitorbreak --enable-pagedattrib --enable-seriosound --disable-crashmenu --disable-monitorasm --disable-monitorhints --without-readline --enable-clipsound +Then just type make and your apk package should appear in: +android/bin/colleen-debug.apk + +Cheers, +Kostas diff --git a/DOC/README.dc b/DOC/README.dc new file mode 100644 index 0000000..f760def --- /dev/null +++ b/DOC/README.dc @@ -0,0 +1,164 @@ +Atari800 for SEGA Dreamcast +=========================== + +Usage +----- + +The mapping of the connected DC controllers to the Atari joysticks is +as follows: + +The leftmost controller is joystick #1. Then, while going to the +right, the next controller is joystick #2. The next one is joystick +#3. Joystick #4 is the rightmost controller if all 4 controller jacks +are in use. + +The 1st (leftmost) controller is used to provide the console keys +(start, select, etc). + +The mapping for the 1st controller is as follows (for computers, not +5200): + + B - START + (maps to ESC key while being in the + emulator menu) + Y - SELECT + X - OPTION + A - joystick button + + L - emulator menu + R - enter keyboard emulation screen + + Start - warm boot (reset key) + Start + X - cold boot (power cycle) + + joypad - joystick directions + +On the other controllers only the joypad and A are used. + +L and R are mapped to Z and C buttons on the Arcade Stick. +While in the emulator menu, pressing Start causes the Dreamcast to +reboot. + +The Dreamcast keyboard is also supported: + F1 - emulator menu + ESC - leave menu/go back + + F2 - OPTION + F3 - SELECT + F4 - START + + F5 - cold boot (power cycle) + F12 - Dreamcast reboot + + End - HELP + Pause - break + S3 - Atari key + +In 5200 mode the A, B, X, and Y buttons of the controllers are +redefined: + Y - Start key (only the 1st controller) + B - 4 (starts some games, " " " " ) + X - joystick button #2 + A - joystick button #1 + +In 800 mode up to 4 paddles are supported (only 2 tested by +me). A is the paddle trigger. + +Also in 800 mode, X, Y, and B can be redefined to generate keys from +the keyboard. If this is enabled, Option, Select, and Start keys can +be entered in the keyboard emulation screen. + +In order to use paddles, you have to switch on the "Emulate paddles" +setting in the "AtariDC Settings" menu. + + +Compiling +--------- + +You will need a SH4 cross compiler and the KallistiOS library +(http://cadcdev.sourceforge.net). + +Please follow the instructions at +http://gamedev.allusion.net/softprj/kos/dcsetup.php to build the cross +compiler and KOS library. + +After you have installed the cross compiler and compiled KOS, adapt +src/dc/Makefile.dc to your environment. You'll probably have to change +the SHBASE and KOS variables in dc/Makefile.dc to point to your +compiler and KOS locations, respectively. + +Then you can build the executable, "atari800.elf". In the atari800 src +directory type + + make -f dc/Makefile.dc + +to compile it. Use GNU make. + + +CD setup +-------- + +After you have compiled the atari800.elf file, you may want to make a +CD image which contains the a8 binary files and disk images you'd like +to use. + +If you don't want to burn a CD, but have a serial, broadband, or lan +adapter, then you can use the dc-load tool to transfer the ELF +executable to the Dreamcast and run it. (For dc-load see +http://adk.napalm-x.com/dc.) You need to create a CD ISO image, as +described below, and use the -i switch to dc-load, to emulate this +image over the the dc-load connection. + +If you create a real CD, there is one more step needed additionally to +the steps described below: You need to put the atari800 executable +file as boot file onto the CD. For information to create Dreamcast +bootable CDs see http://mc.pp.se/dc/cdr.html. Convert the atari800.elf +to a plain binary file with something like "sh-elf-objcopy -O binary +atari800.elf atari800.bin" and then scramble it. + +The CD must contain the atari800.cfg file in the root directory. If +you use the supplied demo atari800.cfg file, the Atari BIOS ROMS also +have to be in the CD root directory. If you don't like this layout, +change it and adapt the atari800.cfg file accordingly. + +Please note that paths in the atari800.cfg must start with /cd to +reference the CD, so for a /roms directory on the CD the atari800.cfg +entry must be ROM_DIR=/cd/roms. + +If you like to have a .com/.exe/.atr to be started automatically, copy +it into the CD root directory and name it autorun.com / autorun.exe / +autorun.atr, respectively. + + +Saving/restoring state to VMU +----------------------------- + +Be careful, since the VMU code is only beta, use only VMUs where there +are no important data files. + + +Bugs/ToDos +---------- + +* There are still sound glitches on some games. Fix them. +* Save state to vmu and/or run ATRs rw from vmu. (*** save state + implemented ***) +* More than 2 controllers are not well tested. +* Improve keyboard support +* Mouse support? + + +Help/Problems/Bugs/Suggestions +------------------------------ + +Please contact me at chris@groessler.org or cpg@aladdin.de. + +The newest version is at + + ftp://ftp.groessler.org/pub/chris/dreamcast/atari800dc + + +In the mean time have fun with it, +Christian Groessler +chris@groessler.org, 30-Jan-2006 + diff --git a/DOC/README.ps2 b/DOC/README.ps2 new file mode 100644 index 0000000..f7febc8 --- /dev/null +++ b/DOC/README.ps2 @@ -0,0 +1,32 @@ +This document assumes you are already familiar with +the standard atari documentation. + +INSTALL Information is in DOC/INSTALL.ps2 + +The following ps2 controller keys are mapped thus: + +During Emulation: +Circle=Enter +Cross=Fire +Square=spacebar +Triangle=UI (user interface) +L1=Cold Start +R1=Warm Start +pad=Joystick +start=Atari Start +select=Atari Select + +While in UI: +Circle=cancel/back +Cross=select/enter +Square=spacebar +L1=Cold Start +R1=Warm Start + +USB Keyboard is supported. + +TODO is located in src/atari_ps2.c itself. + +Thanks Piotr of atari800! +Thanks ps2dev.org! Esp NeoVanglist, author of gsKi, and Oopo for the ps2dev toolchain. + diff --git a/DOC/TODO b/DOC/TODO new file mode 100644 index 0000000..c727251 --- /dev/null +++ b/DOC/TODO @@ -0,0 +1,305 @@ +Plans for future versions +========================= + +Keyboard and controllers +------------------------ + +* map host joysticks to Atari ports in the emulation core in order to make + the configuration available in UI and config file + +* pass the state of all host keys to the emulation core in order to configure + keysticks in UI and config file + +* standardize key mappings in all ports (making host and Atari layouts + available everywhere) + +* emulate POKEY keyboard scanning (with optional debouncing) + +* enhance support for pointing devices, including touch screens; + "directmouse" should work in more ports, support light pen/gun + and correct mirroring of pad/touch/koala + +* Atari Keyboard Interface (AKI) emulation + + +Emulation core +-------------- + +* Java midlet + +* cycle-exact POKEY interrupts (timers, serial I/O, keyboard) + +* precisely emulate serial I/O rates + +* emulate POKEY reset (via SKCTL) + +* more accurate frame rates (for example 49.8607456 instead of 50 Hz in PAL) + +* improve VAPI and .PRO support + +* emulate POKEY SIO shift register + +* emulate SIO bus lines, and SIO cable data/audio cross-talk "feep" sound + +* redirection of specific Dn: devices to Hn: (for software that supports + only the D: device) + +* log POKEY audio writes, SIO commands (hardware level or DCB level), + executed Display List commands, all activity to a defined range + of adressess etc. in a way similar to the 6502 trace + +* log events that affect software compatibility: undocumented 6502 opcodes, + unofficial system calls (including the 5200), extended memory access + +* emulate drives at the hardware level (810, 1050, XF551.) use code from other + emulators which does this. (drive rotation, FM/MFM raw bits). WDCxxxx + controller. RIOT chip. 6507. Intel 8048-line chip for the XFD551. + Use emulated SIO line for bit-banging. Emulate Drive upgrades (Happy etc.) + Emulate 3rd party drives (Rana, Karin Maxi etc.) + +* sound effects. Drive retracking noise (BlueMSX has.) Motor whine. + On/off switch sound. Physical key-press sounds. Cartridge slot sounds. + Drive door sounds. Floppy rotation flap sound. + +* Atari vapourware emulation. XEM (see below). 1090. + 1060 CP/M (sweet-pea.) + +* emulate the 850 interface at the hardware level. + +* ATR-8000 emulation. ATR-8500. + Adapt an existing CPM emulator. + +* emulate the 800-only FULL-VIEW 80 BOARD by Bit3 Computer Corp + Need ROM images and schematics. + +* 6502 BRK bug + +* try to understand 6502's "unstable" opcodes (0x93, 0x9b, 0x9f) that seem + to have unpredictable (at least not easily predictable) results, + preferrably by studying 6502 schematics + +* an option to emulate the variant of 6502 used in new XE machines + (which lacks most of the undocumented opcodes of the classic 6502) + +* fully emulate executing 6502 code from Hardware, cycle-exact ANTIC_load + from hardware, cycle-exact PMG flickering bus data + +* CPU upgrades (65816, etc) + +* improve emuos so it can boot disks and executables + +* create emuos for 5200 + +* emulate printer graphics (on screen or bitmap/PDF output): 1029, 1020, etc. + The Mac OS X port of Atari800 has lots of printer emulation routines. + +* RAM Carts (cartridges with battery-powered RAM), writes to flash carts + +* serial "network" interfaces (e.g. 8 Ataris connected, is it GameLink?) + +* ability to play multi-player games across network + +* generate hard disk images or write directly to media that the 8-bit Ataris + can use, like CompactFlash or MyIDE/SmartIDE/BB + +* "Turbo" cassette upgrades (Turbo 2000 etc.) + +* cassette emulation of WAV files. Load a WAV file like WAV2CAS does. Save + to a WAV file or real cassette like CAS2WAV does. Load voice-and-data + combined programmed audio tape images from WAV files. Support compressed + (lossless? lossy even?) tape sound images. + +* disk auto-flip. Examine screen data for text string "Insert Side B + and press any key/fire/return." Flip disk, print on-screen message and + optionally press key. More a core feature than UI. Requires a database. + +* support physical floppy media (hard, port-specific and not very useful) + +* support physical Atari drives (hard, port-specific and not very useful) + +* improve the event recording. Avoid cycle-exact RANDOM? + + +Graphics +-------- + +* investigate different palettes for different models such as GTIA vs CTIA + or 400/800, 1200XL, 800XL, XE, 5200, hardware modifications to the colour + circuts etc. + +* SECAM palette and video emulation. + +* "flicker fixer": display average pixel values of last two Atari frames + +* use YUV output if available. Will it help? + +* PAL emulation. VICE has it, but it's not as complete as Blargg's emulation + of NTSC. PAL luma/chroma artifacts are missing (it is like S-Video). + Blargg's optimization technique won't work so easily for PAL. + (perry: I have a hack of Blargg's slow version of the NTSC emulator that + I tried to make work for PAL. But it isn't quite right and is way too slow. + Ask me if you are interested.) + +* the NTSC emulator should support other resolutions. It should be supported + in all possible ports. + +* fix the remaining bugs in the NTSC emulation. Artificating colours are + not quite right. odd-even and even-odd combined artifacts (light red + and light green) do not show unless Gaussian factor is changed a lot, + which causes even worse artifacts. Fully document the Atari's video + output signal (might require a scope.) Fully document NTSC decoding + of late 70's and 80's era TVs. + +* document CTIA and emulate properly. Emulate the players not aligning + with playfield bug/feature of CTIA which is said to exist. Need + at least screenshots of a CTIA Atari showing all possible artifacts. + +* an option to emulate the buggy GTIA chip found in new XE machines. + +* fix all remaining collision bugs in the ANTIC and GTIA code (border+scroll, + player HPOS and GRAF changes, partial_scanline changes.) Use the technique + of saving data that might generate false collisions, drawing, and then + restoring the data (pm_scanline). + +* cycle-exact DMACTL and HSCROL including all glitches + +* ANTIC glitch: + POKE 39974,18:POKE 39975,8:POKE 54276,15 + or + POKE 39974,18:POKE 39975,40:POKE 54276,15:POKE 54277,15 + +* Video Board XE emulation + + +Sound +----- + +* correctly emulate serial I/O sound + +* one POKEY sound engine + +* include sound settings in the emulation core (command line options, + config file, UI) and make it possible to change them at runtime + +* support WAV files in configurations with no live sound + +* an option to auto-enable stereo when an Atari program uses it + +* Covox emulation + +* 2 POKEY mono, 4 POKEY stereo, 4 POKEY quad + +* MIDI <> serial port interface. In it's simplest form there's only MIDI + output from the Atari. The more complicated version is enabled by the motor + control line and includes two MIDI outputs selected by the command control + line and one MIDI input. There is a MIDI composer program for Atari. + +* A/D Converter - 4-bit sampler that returns 0xf0-0xff in the 0xd500-0xd5ff + address space. + +* XEM AMY-1 Chip. This is a huge project. Schematics (netlist) + are said to exist. Prototyping software for the PC (connected to parallel + port) is available online. Datasheet is online. Need netlist for AMY-1, + schematics for XEM and any software. + +* SID chip + + +User Interface +-------------- + +* make sure all command-line options are available in UI and config file + +* error messages should appear on screen and not in the log + +* on screen display, like a TV remote, for the NTSC (or other) screen filter. + +* support pointing devices (mouse, touch screen) in UI + +* a database to identify programs and choose appropriate settings. + OS version. Memory size. Memory expansion type. Peripherals. + Machine type. Joystick/Trackball/Paddle etc. controller type. + Artifacting mode. SIO patch compatibility. Even if compatible with + SIO patch, loading screen graphics are often interesting to watch, so + give the user an option to view or ignore them if present. If not + SIO patch compatible, optional warp-speed through the loading. + Keyboard layout. Advisories as to bad dump/bad image/special considerations + Provide documentation, box scan, label scan for the program + PAL/NTSC mode. Database should indicate PAL/NTSC + compatibility, and which system the program was originally designed for. + Allow PAL users to prefer PAL for NTSC-designed programs, but NTSC users + to prefer NTSC. NTSC users get PAL (or fake NTSC-upgraded-to-PAL) for + all PAL-designed programs (Except perhaps very old ones like English + Software titles that NTSC users might remember.) PAL users get NTSC + video only for artifacting programs. + + +Clean up +-------- + +* make port-specific features available in other ports - now many features + work only in SDL, Mac OS X or Win PLus + +* clean up the "util" directory - remove obsolete files, write one-file + documentation for all utils + +* make documentation consistent across systems (HTML?) + +* further clean up in the directory structure - port specific files should + be hidden in their subfolders (falcon, amiga, ...) + + +Speed optimizations +------------------- + +* use a boolean variable to disable 6502 history tracking and breakpoints + (even with MONITOR_BREAKPOINTS and MONITOR_TRACE it should be + faster than currently with just the default MONITOR_BREAK) + +* use function pointer table for hardware registers (like PAGED_ATTRIB does) + +* 6502 emulation optimizations: limit number of CPU_GO() calls (call ANTIC/GTIA + routines from 6502 and not vice-versa), use ints instead of UWORD and UBYTE, + merge N and Z flags into one variable, put 6502 flags into local variables + so they can be stored in registers; + see http://asap.sourceforge.net for a 6502 emulator which includes these + optimizations + +* use patches for common routines such as OS interrupt handlers + +* make some hardware registers directly available in memory[] + +* write versions of draw_antic_* functions for the common case when there are + no sprites in the current scanline + +* update color lookup tables only when color registers change + +* automatic framedrop + +* fast bank switching (without memcpy) + +* implement Dirty Spans (see HOWTO-DIRTYSPAN) + +* an option to detect popular lengthy Atari decompression routines + and run equivalent C routines instead + + +R: device +--------- + +* clean up and comment the code + +* improve portability + +* documentation + +* automatic test (similar to hdevtest.lst for H:) + +* identify security problems + +* TCP port should be configurable (currently hardwired to 9000). The switch + between real serial port and TCP port should be put there. Something + along the following lines: + R_SERIAL = 1 + R_SERPORT = /dev/ttyS0 + R_NETPORT = 9000 diff --git a/DOC/USAGE b/DOC/USAGE new file mode 100644 index 0000000..1e2b98d --- /dev/null +++ b/DOC/USAGE @@ -0,0 +1,596 @@ +Up-to-date list of command line parameters and key mappings +=========================================================== + +Usage: +atari800 [options] [filenames] + +where: +"filenames" are names of files supported by the emulator. +The following file types are currently supported: +- disk images: ATR, XFD, ATR.GZ/ATZ, XFD.GZ/XFZ, DCM, PRO, ATX +- programs: COM/EXE/XEX, BAS, LST +- cartridge images: CAR/CART, ROM (raw) +- tape images: CAS, raw bootable programs +- Atari800 state files: compressed and not compressed +Disk images are mounted in order, i.e. the first file is mounted +to the drive 1, next one to the drive 2, etc. + +Cassette operation +================== +There is support for loading and saving from/to CAS tape images. It is also +possible to select raw files (DOS binaries, bootable programs, BASIC programs +etc.) as tape images, but only for loading. Upon attaching a tape image, the +emulator acts as if the tape recorder's "Play" button was permanently pressed, +so that a tape rolls automatically when an Atari program turns the tape motor +on. + +Turning the SIO patch on speeds up the tape load and save operations. Note +that toggling the SIO patch during any tape operation will cause it to fail. + +A tape image can be rewound to a specific part (block), to allow loading +from tape images which contain multiple programs one-after-another. After +rewinding the "Record" option is automatically turned off. Rewinding will +cause any tape operation being in progress to fail. + +When a tape image is attached to Atari800, only loading from it is possible. +Before saving data on the tape, a user has to manually switch the "Record" +option to "yes", in the same way as one would manually press/release the +"Record" button on a physical tape recorder. Remember to disable the "Record" +option before loading from tape. Note that switching the "Record" option +on/off during any tape operation will cause it to fail and may cause random +data to be saved to a tape image. + +With the SIO patch active, the emulator automatically recognises whether +a load or save operation is requested. and it is not necessary to touch the +"Record" option. This can lead to unwanted changes in a tape file. To avoid +the problem, a user can mark the attached cassette image as read-only to +disallow any write operations. + +Saving to tape always casues the new blocks to be appended at the end of the +tape image, regardless of the tape's current position. It is not possible +to overwrite existing data on the tape. + +A user can create a new empty CAS tape image with the "Make blank tape" +option. The user then provides the image's filename and its description +(stored in the CAS image's header; may be left empty). The created image is +automatically attached to Atari800 with the "Record" option turned on, which +allows to go straight to saving the data. Creating an image with the filename +pointing to an existing file will cause that file to be cleared. + +Only standard blocks can be loaded or saved. Any copy protection that relies +on non-standard signals is not supported. Additionally, saving is only +supported with the standard speed of 600 baud. + +Saving the emulator's state during a tape loading/saving is not supported. The +current tape operation is not stored in the savestate and it will not be +restored properly when that savestate is later loaded. + +MIO and Black Box +================== +You need ROM images (not provided.) +Make a blank SCSI disk image (using dd for instance.) +Set MIO_SCSI_DISK or BB_SCSI_DISK to the disk image name. +Use 256 byte sectors for the Black Box. +Don't use SASI. +Use ALT-Backslash for the Black Box menu. +Don't use the OS patches, use -nopatchall. The patches conflict with D1xx + +1400XL/1450XLD +================== +You need ROM images (not provided.) +Don't use the OS patches, use -nopatchall. The patches conflict with D1xx +The Self test can talk. +You can use the V: device to talk. +If you set the drives to empty, then a message appears on the 1450XLD screen +asking you to insert a disk. +If you press select when booting, the behavior of the 1450XLD disks is changed. +I believe it slows down for compability. + +Command line options +==================== + +-help Display list of options and terminate +-v Display version number and terminate +-verbose Display framerate when exiting + +-config Use specified configuration file instead of default +-autosave-config Automatically save the current configuration on emulator + exit +-no-autosave-config Don't save the current configuration on emulator exit + (the default) + +-osa_rom Use specified OS/A ROM image +-osb_rom Use specified OS/B ROM image +-xlxe_rom Use specified XL/XE OS ROM image +-5200_rom Use specified 5200 OS ROM image +-basic_rom Use specified Atari BASIC ROM image + +-800-rev auto|a-ntsc|a-pal|b-ntsc|custom + Select OS revision for Atari 400/800 +-xl-rev auto|10|11|1|2|3a|3b|5|3|4|59|59a|custom + Select OS revision for Atari XL/XE +-5200-rev auto|orig|a|custom + Select OS revision for Atari 5200 +-basic-rev auto|a|b|c|custom + Select BASIC revision +-xegame-rev auto|orig|custom + Select XEGS builtin game version + +-atari Emulate Atari 800 +-1200 Emulate Atari 1200XL +-xl Emulate Atari 800XL +-xe Emulate Atari 130XE +-320xe Emulate Atari 320XE (Compy Shop) +-rambo Emulate Atari 320XE (Rambo) +-xegs Emulate Atari XEGS +-5200 Emulate Atari 5200 + +-emuos Use EmuOS +-c Enable RAM between 0xc000 and 0xcfff in Atari 800 + +-axlon Use Atari 800 Axlon memory expansion: k total RAM +-axlon0f Use Axlon shadow at 0x0fc0-0x0fff +-mosaic Use 400/800 Mosaic memory expansion: k total RAM +-mapram Enable MapRAM enhancement for Atari XL/XE +-no-mapram Disable MapRAM + + +-pal Emulate PAL TV mode +-ntsc Emulate NTSC TV mode + +-nobasic Turn off Atari BASIC ROM +-basic Turn on Atari BASIC ROM + +-cart Insert cartridge (CART or raw format) +-cart-type <0..67> Select type of cartridge inserted with -cart. 0 means + no cartridge, and other values indicate a specific + cartridge type as in cart.txt. +-cart2 Insert second cartridge (CART or raw format) + Only if first cartridge is SpartaDOS X (64 or 128) +-cart2-type <0..67> Similar to -cart-type. Select type of cartridge inserted + with -cart2. +-cart-autoreboot Automatically reboot after cartridge inserting/removing + (doesn't affect the piggyback cartridge) +-no-cart-autoreboot Don't reboot after cartridge inserting/removing + +-run Run Atari program (EXE, COM, XEX, BAS, LST) + +-state Load saved-state file + +-tape Attach cassette image (CAS format or raw file) +-boottape Attach cassette image and boot it +-tape-readonly Set the attached cassette image as read-only + +-1400 Emulate the Atari 1400XL +-xld Emulate the Atari 1450XLD +-bb Emulate the CSS Black Box +-mio Emulate the ICD MIO board + +-voicebox Emulate the Alien Group Voice Box I +-voiceboxii Emulate the Alien Group Voice Box II + +-nopatch Don't patch SIO routine in OS +-nopatchall Don't patch OS at all, H:, P: and R: devices won't work +-H1 Set path for H1: device +-H2 Set path for H2: device +-H3 Set path for H3: device +-H4 Set path for H4: device +-hreadonly Enable read-only mode for H: device +-hreadwrite Disable read-only mode for H: device +-devbug Put debugging messages for H: and P: devices in log file + +-rtime Enable R-Time 8 emulation +-nortime Disable R-Time 8 emulation + +-rdevice [] Enable R: device ( can be host serial device name) + +-mouse off Do not use mouse +-mouse pad Emulate paddles +-mouse touch Emulate Atari Touch Tablet +-mouse koala Emulate Koala Pad +-mouse pen Emulate Light Pen +-mouse gun Emulate Light Gun +-mouse amiga Emulate Amiga mouse +-mouse st Emulate Atari ST mouse +-mouse trak Emulate Atari Trak-Ball +-mouse joy Emulate joystick using mouse +-mouseport Set mouse port 1-4 (default 1) +-mousespeed Set mouse speed 1-9 (default 3) +-multijoy Emulate MultiJoy4 interface +-directmouse Use mouse's absolute position +-cx85 Emulate CX85 numeric keypad on port +-grabmouse SDL only, prevent mouse pointer from leaving the window + +-record Record input to +-playback Playback input from + +-refresh Set screen refresh rate +-ntsc-artif none|ntsc-old|ntsc-new|ntsc-full + Set video artifacting emulation mode for NTSC. +-pal-artif none|pal-simple|pal-blend + Set video artifacting emulation mode for PAL. + +-artif Set artifacting mode 0-4 (0 = disable) - only for + ntsc-old and ntsc-new + +-colors-preset standard|deep-black|vibrant + Use one of predefined color adjustments +-saturation Set screen color saturation (like TV Colour control) +-contrast Set screen contrast (also called white level) +-brightness Set screen brightness (also called black level) +-gamma Set screen gamma correction +-tint Set tint -1..1 +-ntsc-saturation Set saturation only for NTSC +-ntsc-contrast Set contrast only for NTSC +-ntsc-brightness Set brightness only for NTSC +-ntsc-gamma Set gamma adjustment only for NTSC +-ntsc-tint Set tint only for NTSC +-ntsc-colordelay Set GTIA color delay for NTSC (emulates the potentiometer at the + bottom of Atari computers, that adjusts colors) +-pal-saturation Set saturation only for PAL +-pal-contrast Set contrast only for PAL +-pal-brightness Set brightness only for PAL +-pal-gamma Set gamma adjustment only for PAL +-pal-tint Set tint only for PAL +-pal-colordelay Set GTIA color delay for PAL + +-paletten Read Atari NTSC colors from ACT file +-paletten-adjust Apply the colour adjustments to the loaded NTSC palette +-palettep Read Atari PAL colors from ACT file +-palettep-adjust Apply the colour adjustments to the loaded PAL palette + +-screenshots Set filename pattern for screenshots +-showspeed Show percentage of actual speed +-turbo Run at max speed (Turbo mode) + +-sound Enable sound +-nosound Disable sound +-dsprate Set sound output frequency in Hz +-audio16 Set sound output format to 16-bit +-audio8 Set sound output format to 8-bit +-snd-fragsize Set size of the hardware sound buffer (fragment size) +-snddelay Define the device for LPTjoy +-joy1 --""-- only when LPTjoy support compiled in + +The following 7 items are only for -ntsc-artif set to ntsc-full: +-ntsc-filter-preset composite|svideo|rgb|monochrome + Use one of predefined NTSC filter adjustments +-ntsc-sharpness Set sharpness +-ntsc-resolution Set resolution +-ntsc-artifacts Set artifacts +-ntsc-fringing Set fringing +-ntsc-bleed Set bleed +-ntsc-burstphase Set burst phase. This changes colors of artifacts. + The best values are 0, 0.5, 1, 1.5 +-scanlines Set visibility of scanlines (0-100) +-scanlinesint Enable scanlines interpolation +-no-scanlinesint Disable scanlines interpolation +-video-accel Use OpenGL hardware acceleration +-no-video-accel Don't use OpenGL hardware acceleration +-pixel-format bgr16|rgb16|bgra32|argb32 + Choose OpenGL texture format +-pbo With OpenGL, use Pixel Buffer Objects for performance +-no-pbo Disable usage of Pixel Buffer Objects +-bilinear-filter Enable OpenGL bilinear filtering +-no-bilinear-filter Disable OpenGL bilinear filtering +-opengl-lib Use a custom OpenGL shared library +-proto80 Emulate a prototype 80 column board for the 1090 +-xep80 Emulate the XEP80 +-xep80port Use XEP80 on joystick port +-af80 Emulate the Austin Franklin 80 column board + + +X11 options +----------- + +-small Single size window +-large Double size window +-huge Triple size window +-clip_x Left offset for clipping +-clip_y Top offset for clipping +-clip_width Width of the clipping area +-clip_height Height of the clipping area +-private_cmap Use private colormap + +-sio Show SIO monitor +-x11bug Enable debug code in atari_x11.c + +-keypad Keypad mode + + +Keyboard, joystick and other controllers +======================================== + +Unlike PC Xformer, I have not tried to emulate the exact keyboard layout, +instead, I have tried to make your native keyboard work as normal. + +F1 Built in user interface +F2 Option key +F3 Select key +F4 Start key +F5 Reset key ("warm reset") +Shift+F5 Reboot ("cold reset") +F6 Help key (XL/XE only) +F7 Break key +F8 Enter monitor +F9 Exit emulator +F10 Save screenshot +Shift+F10 Save interlaced screenshot +F12 Turbo mode +Alt+R Run Atari program +Alt+D Disk management +Alt+C Cartridge management +Alt+T Tape management +Alt+Y Select system +Alt+O Sound settings +Alt+W Sound recording start/stop +Alt+S Save state file +Alt+L Load state file +Alt+A About the emulator +Insert Insert line (Atari Shift+'>') +Ctrl+Insert Insert character (Atari Ctrl+'>') +Shift+Ctrl+Insert Shift+Ctrl+'>' +Delete Delete line (Atari Shift+Backspace) +Shift+Backspace Delete line (Atari Shift+Backspace) +Ctrl+Delete Delete character (Atari Ctrl+Backspace) +Ctrl+Backspace Delete character (Atari Ctrl+Backspace) +Shift+Ctrl+Delete Shift+Ctrl+Backspace +Shift+Ctrl+Backspace Shift+Ctrl+Backspace +Home Clear (Atari Shift+'<') +Ctrl+Home Ctrl+'<' (also clears screen) +Shift+Ctrl+Home Shift+Ctrl+'<' +~ Inverse video +Up Up (Atari Ctrl+'-') +Down Down (Atari Ctrl+'=') +Left Left (Atari ctrl+'+') +Right Right (Atari ctrl+'*') +Ctrl+Up - +Ctrl+Down = +Ctrl+Left + +Ctrl+Right * +Shift+Up _ (Atari Shift+'-') +Shift+Down | (Atari Shift+'=') +Shift+Left \ (Atari Shift+'+') +Shift+Right ^ (Atari Shift+'*') +Shift+Ctrl+Up Shift+Ctrl+- +Shift+Ctrl+Down Shift+Ctrl+= +Ctrl+'\' Ctrl+Esc (Workaround for Windows) +Shift+Ctrl+'\' Shift+Ctrl+Esc (Workaround for Windows) + +CX85 Keypad (if enabled): +host keypad 0123456789-. 0123456789-. +host keypad / NO +host keypad Ctrl+/ ESCAPE +host keypad * DELETE +host keypad + YES +host keypad Enter +ENTER + +Paddles, Atari touch tablet, Koala pad, light pen, light gun, +ST/Amiga mouse, Atari trak-ball, joystick and Atari 5200 analog +controller are emulated using mouse on ports that support it. +See the options above for how to enable mouse. + + +Amiga keyboard, joystick and other controllers +---------------------------------------------- + +Please look into the supplied Atari800.guide. + + +BASIC keyboard, joystick and other controllers +---------------------------------------------- + +No function keys or Alt+letter shortcuts. +Use Ctrl+C to enter the monitor. +Controllers not supported in this version. + + +Curses keyboard, joystick and other controllers +----------------------------------------------- + +F10 (Save screenshot) does not work in the default CURSES_BASIC build. +Shift+F5 and Shift+F10 don't work at all. +Avoid Ctrl + C, H, J, M, Q, S and Z. The remaining control characters +can be typed. Control characters are displayed on the screen +with the associated upper case character in bold. +Controllers not supported in this version. + + +DOS VGA keyboard, joystick and other controllers +------------------------------------------------ + +F7 Switch between Emulated joysticks mode and Normal keyboard +` Atari/Inverse key + +Joysticks can be either real one connected to game port, or old 8-bit +digital CX-40 joysticks connected to parallel port or keyboard joysticks +(try out JOYCFG.EXE). + + +Falcon keyboard, joystick and other controllers +----------------------------------------------- + +Help Help key (XL/XE) + +Joystick 0 is operated by the numeric keypad (make sure that the numeric +keypad has been enabled). + + 7 8 9 + \|/ + 4 5 6 + /|\ + 1 2 3 + + And 0 is the fire key. + +Mouse not supported in this version. + + +SDL keyboard, joystick and other controllers +-------------------------------------------- +` Atari/Inverse key +LSUPER Atari/Inverse key (unusable under Windows) +RSUPER CapsToggle (+Shift = CapsLock) + +LAlt+F Switch fullscreen +LAlt+G Switch visible horizontal area. See -horiz-area. +LAlt+J Swap joysticks 0 and 1 +LAlt+M Grab mouse (prevents mouse pointer from leaving the window) + +LAlt+LShift+1 Decrease tint (also called hue) +LAlt+1 Increase tint +LAlt+LShift+2 Decrease saturation (like TV Colour control) +LAlt+2 Increase saturation +LAlt+LShift+3 Decrease contrast (also called white level) +LAlt+3 Increase contrast +LAlt+LShift+4 Decrease brightness (also called black level) +LAlt+4 Increase brightness +LAlt+LShift+5 Decrease gamma adjustment +LAlt+5 Increase gamma adjustment +LAlt+LShift+6 Decrease color delay (Atari color adjustment potentiometer) +LAlt+6 Increase color delay + +The following keys work only when the NTSC filter is enabled (-ntsc-artif set +to ntsc-full): +LAlt+LShift+7 Decrease sharpness +LAlt+7 Increase sharpness +LAlt+LShift+8 Decrease resolution +LAlt+8 Increase resolution +LAlt+LShift+9 Decrease artifacts +LAlt+9 Increase artifacts +LAlt+LShift+0 Decrease fringing +LAlt+0 Increase fringing +LAlt+LShift+- Decrease bleed +LAlt+- Increase bleed +LAlt+LShift+= Decrease burst phase (use this to change artifacting colours) +LAlt+= Increase burst phase +LAlt+LShift+[ Decrease scanlines percentage +LAlt+[ Increase scanlines percentage +LAlt+] Toggle NTSC composite/S-Video/RGB/monochrome settings + +LAlt+Shift+X Enable/disable 80 column screen (for -xep80/-af80/-proto80) + +Apart from standard joysticks (handled by the SDL) up to two keyboard joysticks +are supported. The keys used for joystick directions and the trigger can be +freely defined in the config UI (Controller Config -> Define layout). +Keyboard joystick emulation can be enabled/disabled in the Controller Config. +By default, joy 0 is enabled and joy 1 is disabled (to not steal normal +AWDS keys in the emulator). + + +X11 keyboard, joystick and other controllers +-------------------------------------------- + +Alt Atari/Inverse key (either Alt key will work) + +Joystick 0 is operated by the mouse position relative to the center of the +screen. The mouse button acts as the trigger. On Linux, standard joysticks +are also supported. + diff --git a/DOC/cart.txt b/DOC/cart.txt new file mode 100644 index 0000000..e853d58 --- /dev/null +++ b/DOC/cart.txt @@ -0,0 +1,998 @@ +This file describes types of cartridge images supported by the Atari800 +emulator. + +There are: +- raw images - files that contain only dump of cartridge memory +- CART files - images with additional 16-byte header, which contains type + of the cartridge + +For raw images you usually have to select the cartridge type each time +you insert an image. To make it easier, you only select from types of same +image size. If there's only one supported type that matches file's length +(currently only for 2 KB cartridges), that type is selected automatically. + +The advantage of using CART files is that you don't have to select +the cartridge type, because it is stored inside the file. + +The CART format has been introduced in Atari800 0.8.0, when there were +only 4 supported cartridge types. The format has not changed, only new types +have been added. + +The format is: + first 4 bytes containing 'C' 'A' 'R' 'T'. + next 4 bytes containing cartridge type in MSB format (see the table below). + next 4 bytes containing cartridge checksum in MSB format (ROM only). + next 4 bytes are currently unused (zero). + followed immediately with the ROM data: 2, 4, 8, 16, 32, 40, etc. kilobytes. + +The recommended file name extension for CART files is CAR. + +Currently supported cartridge types: + ++----+-----------+------+-----------------------------------------------+---+ +| Id | Machine | Size | Name | E | +|----+-----------+------+-----------------------------------------------+---+ +| 1 | 800/XL/XE | 8 | Standard 8 KB cartridge | | +| 2 | 800/XL/XE | 16 | Standard 16 KB cartridge | | +| 3 | 800/XL/XE | 16 | OSS two chip 16 KB cartridge (034M) | | +| 4 | 5200 | 32 | Standard 32 KB 5200 cartridge | | +| 5 | 800/XL/XE | 32 | DB 32 KB cartridge | | +| 6 | 5200 | 16 | Two chip 16 KB 5200 cartridge | | +| 7 | 5200 | 40 | Bounty Bob Strikes Back 40 KB 5200 cartridge | | +| 8 | 800/XL/XE | 64 | 64 KB Williams cartridge | | +| 9 | 800/XL/XE | 64 | Express 64 KB cartridge | | +| 10 | 800/XL/XE | 64 | Diamond 64 KB cartridge | | +| 11 | 800/XL/XE | 64 | SpartaDOS X 64 KB cartridge | | +| 12 | 800/XL/XE | 32 | XEGS 32 KB cartridge | | +| 13 | 800/XL/XE | 64 | XEGS 64 KB cartridge (banks 0-7) | | +| 14 | 800/XL/XE | 128 | XEGS 128 KB cartridge | | +| 15 | 800/XL/XE | 16 | OSS one chip 16 KB cartridge | | +| 16 | 5200 | 16 | One chip 16 KB 5200 cartridge | | +| 17 | 800/XL/XE | 128 | Atrax 128 KB cartridge | | +| 18 | 800/XL/XE | 40 | Bounty Bob Strikes Back 40 KB cartridge | | +| 19 | 5200 | 8 | Standard 8 KB 5200 cartridge | | +| 20 | 5200 | 4 | Standard 4 KB 5200 cartridge | | +| 21 | 800 | 8 | Right slot 8 KB cartridge | | +| 22 | 800/XL/XE | 32 | 32 KB Williams cartridge | | +| 23 | 800/XL/XE | 256 | XEGS 256 KB cartridge | | +| 24 | 800/XL/XE | 512 | XEGS 512 KB cartridge | | +| 25 | 800/XL/XE | 1024 | XEGS 1 MB cartridge | | +| 26 | 800/XL/XE | 16 | MegaCart 16 KB cartridge | | +| 27 | 800/XL/XE | 32 | MegaCart 32 KB cartridge | | +| 28 | 800/XL/XE | 64 | MegaCart 64 KB cartridge | | +| 29 | 800/XL/XE | 128 | MegaCart 128 KB cartridge | | +| 30 | 800/XL/XE | 256 | MegaCart 256 KB cartridge | | +| 31 | 800/XL/XE | 512 | MegaCart 512 KB cartridge | | +| 32 | 800/XL/XE | 1024 | MegaCart 1 MB cartridge | | +| 33 | 800/XL/XE | 32 | Switchable XEGS 32 KB cartridge | | +| 34 | 800/XL/XE | 64 | Switchable XEGS 64 KB cartridge | | +| 35 | 800/XL/XE | 128 | Switchable XEGS 128 KB cartridge | | +| 36 | 800/XL/XE | 256 | Switchable XEGS 256 KB cartridge | | +| 37 | 800/XL/XE | 512 | Switchable XEGS 512 KB cartridge | | +| 38 | 800/XL/XE | 1024 | Switchable XEGS 1 MB cartridge | | +| 39 | 800/XL/XE | 8 | Phoenix 8 KB cartridge | | +| 40 | 800/XL/XE | 16 | Blizzard 16 KB cartridge | | +| 41 | 800/XL/XE | 128 | Atarimax 128 KB Flash cartridge | p | +| 42 | 800/XL/XE | 1024 | Atarimax 1 MB Flash cartridge | p | +| 43 | 800/XL/XE | 128 | SpartaDOS X 128 KB cartridge | | +| 44 | 800/XL/XE | 8 | OSS 8 KB cartridge | | +| 45 | 800/XL/XE | 16 | OSS two chip 16 KB cartridge (043M) | | +| 46 | 800/XL/XE | 4 | Blizzard 4 KB cartridge | | +| 47 | 800/XL/XE | 32 | AST 32 KB cartridge | | +| 48 | 800/XL/XE | 64 | Atrax SDX 64 KB cartridge | | +| 49 | 800/XL/XE | 128 | Atrax SDX 128 KB cartridge | | +| 50 | 800/XL/XE | 64 | Turbosoft 64 KB cartridge | | +| 51 | 800/XL/XE | 128 | Turbosoft 128 KB cartridge | | +| 52 | 800/XL/XE | 32 | Ultracart 32 KB cartridge | | +| 53 | 800/XL/XE | 8 | Low bank 8 KB cartridge | | +| 54 | 800/XL/XE | 128 | SIC! 128 KB cartridge | p | +| 55 | 800/XL/XE | 256 | SIC! 256 KB cartridge | p | +| 56 | 800/XL/XE | 512 | SIC! 512 KB cartridge | p | +| 57 | 800/XL/XE | 2 | Standard 2 KB cartridge | | +| 58 | 800/XL/XE | 4 | Standard 4 KB cartridge | | +| 59 | 800 | 4 | Right slot 4 KB cartridge | | +| 60 | 800/XL/XE | 32 | Blizzard 32 KB cartridge | | +| 61 | 800/XL/XE | 2048 | MegaMax 2 MB cartridge | | +| 62 | 800/XL/XE | 128M | The!Cart 128 MB cartridge | p | +| 63 | 800/XL/XE | 4096 | Flash MegaCart 4 MB cartridge | p | +| 64 | 800/XL/XE | 2048 | MegaCart 2 MB cartridge | | +| 65 | 800/XL/XE | 32M | The!Cart 32 MB cartridge | p | +| 66 | 800/XL/XE | 64M | The!Cart 64 MB cartridge | p | +| 67 | 800/XL/XE | 64 | XEGS 64 KB cartridge (banks 8-15) | | ++----+-----------+------+-----------------------------------------------+---+ + +Id is the cartridge type code stored in the CART file. + +Machine indicates if the cartridge is for Atari 8-bit Home Computers +(400/800 and XL/XE) or the Atari 5200 Game System. + +Size is length of image in kilobytes, unless the value ends with "M", which +means it is in megabytes. + +E (for Emulation) describes state of emulation support of the cartridge in +Atari800. "p" means the cartridge is emulated partially (some features +missing), no value means emulation of all features. + +Below are descriptions of all types. For bank-switched cartridges banks +are numbered in the order they appear in the image file, starting with 0. + ++---------------------------------------------------------------------------+ +| Type 1: Standard 8 KB cartridge | ++---------------------------------------------------------------------------+ + + Standard 8 KB cartridge, that occupies 8 KB of address space between $A000 + and $BFFF. + ++---------------------------------------------------------------------------+ +| Type 2: Standard 16 KB cartridge | ++---------------------------------------------------------------------------+ + + Standard 16 KB cartridge, that occupies 16 KB of address space between + $8000 and $BFFF. + ++---------------------------------------------------------------------------+ +| Type 3: OSS two chip 16 KB cartridge (034M) | ++---------------------------------------------------------------------------+ + + NOTE: This cartridge image format has been obsoleted by Type 45 because its + order of banks is incorrect (i.e. the order in a physical cartridge's ROM + chips is different). This format is still supported by the CART file format + for backward compatibility. + + The cartridge occupies 8 KB of address space between $A000 and $BFFF. Its + memory is divided into 4 banks, 4 KB each. Bank number 3 (the last one) is + always mapped to $B000-$BFFF. Bank in $A000-$AFFF is selected by an access to + $D500-$D5FF. Only 4 lowest bits of address are significant: + - $D5x0 selects bank 0. + - $D5x1 is not useful - it selects banks 0 and 1 (the bytes are binary AND of + the corresponding bytes from banks 0 and 1). + - $D5x3 or $D5x7 selects bank 1. + - $D5x4 selects bank 2. + - $D5x5 is not useful - it selects banks 1 and 2 (the bytes are binary AND of + the corresponding bytes from banks 1 and 2). + - $D5x2 or $D5x6 is not useful. It disables ROM (there are $FF bytes in + $A000-$AFFF). + - $D5x8-$D5xF disables whole cartridge (enables computer's memory in address + space between $A000 and $BFFF). + ++---------------------------------------------------------------------------+ +| Type 4: Standard 32 KB 5200 cartridge | ++---------------------------------------------------------------------------+ + + Standard 32 KB cartridge for Atari 5200, that occupies 32 KB of address + space between $4000 and $BFFF. + ++---------------------------------------------------------------------------+ +| Type 5: DB 32 KB cartridge | ++---------------------------------------------------------------------------+ + + A 32 KB bank-switched cartridge. There are 4 banks. Bank 3 is mapped to + $A000-$BFFF. Bank in $8000-$9FFF is selected by an access to $D500-$D5FF. + Two lowest bits of address select bank 0, 1, 2 or 3. + ++---------------------------------------------------------------------------+ +| Type 6: Two chip 16 KB 5200 cartridge | ++---------------------------------------------------------------------------+ + + In Atari 5200 there's 32 KB of address space reserved for the cartridge + ($4000-$BFFF). A two chip 16 KB cartridge is mapped that way: + - First 8 KB are mapped into lower 16 KB. Since an address line is not + connected, $4000-$5FFF and $6000-$7FFF contain same data, which is first + half of the cartridge image. + - Similarly, second 8 KB are mapped into upper 16 KB. + ++---------------------------------------------------------------------------+ +| Type 7: Bounty Bob Strikes Back 40 KB 5200 cartridge | ++---------------------------------------------------------------------------+ + + The cartridge with "Bounty Bob Strikes Back" game uses very strange + bank switching method: + - Four 4 KB banks (0,1,2,3) are mapped into $4000-$4FFF. An access to $4FF6 + selects bank 0, $4FF7 - bank 1, $4FF8 - bank 2, $4FF9 - bank 3. + - Four 4 KB banks (4,5,6,7) are mapped into $5000-$5FFF. An access to $5FF6 + selects bank 4, $5FF7 - bank 5, $5FF8 - bank 6, $5FF9 - bank 7. + - The remaining 8 KB is mapped to upper 16 KB of cartridge address space + in Atari 5200. That is, $8000-$9FFF and $A000-$BFFF contain same data. + ++---------------------------------------------------------------------------+ +| Type 8: 64 KB Williams cartridge | ++---------------------------------------------------------------------------+ + + The cartridge has 8 banks mapped to $A000-$BFFF. An access to $D500 selects + bank 0, $D501 - bank 1, etc. An access to $D508-$D50F disables + the cartridge. + ++---------------------------------------------------------------------------+ +| Type 9: Express 64 KB cartridge | ++---------------------------------------------------------------------------+ + + The cartridge has 8 banks mapped to $A000-$BFFF. An access to $D577 selects + bank 0, $D576 - bank 1, etc. An access to $D578-$D57F disables + the cartridge. + ++---------------------------------------------------------------------------+ +| Type 10: Diamond 64 KB cartridge | ++---------------------------------------------------------------------------+ + + The cartridge has 8 banks mapped to $A000-$BFFF. An access to $D5D7 selects + bank 0, $D5D6 - bank 1, etc. An access to $D5D8-$D5DF disables + the cartridge. + ++---------------------------------------------------------------------------+ +| Type 11: SpartaDOS X 64 KB cartridge | ++---------------------------------------------------------------------------+ + + The cartridge has 8 banks mapped to $A000-$BFFF. It also contains an + additional cartridge slot which allows to plug a second cartridge in. + An access to $D5E7 selects bank 0, $D5E6 - bank 1, etc. down to $D5E0. An + access to $D5E8-$D5EB disables the SDX cartridge and enables the second + cartridge. An access to $D5EC-$D5EF disables both cartridges. + Accesses to all addresses on page D5 always reaches the second cartridge, + even if it is disabled by SpartaDOS or if the SpartaDOS cartridge itself is + enabled. + ++---------------------------------------------------------------------------+ +| Type 12: XEGS 32 KB cartridge | ++---------------------------------------------------------------------------+ + + This bank-switched cartridge occupies 16 KB of address space between $8000 + and $BFFF. The cartridge memory is divided into 4 banks, 8 KB each. + Bank 3 (the last one) is always mapped to $A000-$BFFF. Two lowest bits of + a byte written to $D500-$D5FF select the bank mapped to $8000-$9FFF. + The initially selected bank is random, although it seems that 0 gets chosen + the most often. Atari800 always selects bank 0 initially. + + Reference: + http://www.atarimax.com/jindroush.atari.org/acarts.html#xegs + ++---------------------------------------------------------------------------+ +| Type 13: XEGS 64 KB cartridge (banks 0-7) | ++---------------------------------------------------------------------------+ + + One of the two variants of the 64 KB XEGS cartridge, that's built on either + a C100649 board with the W1 solder point not connected, or a C026449 board + with pin 9 of the 74LS374 chip unconnected. + This bank-switched cartridge occupies 16 KB of address space between $8000 + and $BFFF. The cartridge memory is divided into 8 banks, 8 KB each. + Bank 7 (the last one) is always mapped to $A000-$BFFF. Three lowest bits of + a byte written to $D500-$D5FF select the bank mapped to $8000-$9FFF. + The initially selected bank is random, although it seems that 0 gets chosen + the most often. Atari800 always selects bank 0 initially. + + Reference: + http://www.atarimax.com/jindroush.atari.org/acarts.html#xegs + ++---------------------------------------------------------------------------+ +| Type 14: XEGS 128 KB cartridge | ++---------------------------------------------------------------------------+ + + Built on either a C100649 board with the W1 solder point connected, or a + C026449 board. + This bank-switched cartridge occupies 16 KB of address space between $8000 + and $BFFF. The cartridge memory is divided into 16 banks, 8 KB each. + Bank 15 (the last one) is always mapped to $A000-$BFFF. Four lowest bits of + a byte written to $D500-$D5FF select the bank mapped to $8000-$9FFF. + The initially selected bank is random, although it seems that 0 gets chosen + the most often. Atari800 always selects bank 0 initially. + + Reference: + http://www.atarimax.com/jindroush.atari.org/acarts.html#xegs + ++---------------------------------------------------------------------------+ +| Type 15: OSS one chip 16 KB cartridge | ++---------------------------------------------------------------------------+ + + There are two types of OSS 16KB cartridges; this is the later, simpler one. + Used by BASIC XL 1.03, Action! 3.6, MAC/65 1.1 and BASIC XE 4.1 (and possibly + also by later versions of the above software). + It consists of one 16 KB ROM chip. + The cartridge occupies 8 KB of address space between $A000 and $BFFF. Its + memory is divided into 4 banks, 4 KB each. Bank number 0 (the first one) is + always mapped to $B000-$BFFF. Bank in $A000-$AFFF is selected by an access to + $D500-$D5FF. Only bits 0 and 3 of address are significant: + - A3=0, A0=0 - selects bank 1 + - A3=0, A0=1 - selects bank 3 + - A3=1, A0=0 - disables cartridge (enables computer's memory in address space + between $A000 and $BFFF) + - A3=1, A0=1 - selects bank 2 + ++---------------------------------------------------------------------------+ +| Type 16: One chip 16 KB 5200 cartridge | ++---------------------------------------------------------------------------+ + + 16 KB cartridge for Atari 5200, that occupies 16 KB of address space + between $8000 and $BFFF. + ++---------------------------------------------------------------------------+ +| Type 17: Atrax 128 KB cartridge | ++---------------------------------------------------------------------------+ + + This bank-switched cartridge occupies 8 KB of address space between $A000 + and $BFFF. The cartridge memory is divided into 16 banks, 8 KB each. + If a byte written to $D500-$D5FF has highest bit set, the cartridge is + disabled. Otherwise four lowest bits select the bank mapped to $A000-$BFFF. + ++---------------------------------------------------------------------------+ +| Type 18: Bounty Bob Strikes Back 40 KB cartridge | ++---------------------------------------------------------------------------+ + + The cartridge with "Bounty Bob Strikes Back" game uses very strange + bank switching method: + - Four 4 KB banks (0,1,2,3) are mapped into $8000-$8FFF. An access to $8FF6 + selects bank 0, $8FF7 - bank 1, $8FF8 - bank 2, $8FF9 - bank 3. + - Four 4 KB banks (4,5,6,7) are mapped into $9000-$9FFF. An access to $9FF6 + selects bank 4, $9FF7 - bank 5, $9FF8 - bank 6, $9FF9 - bank 7. + - The remaining 8 KB is mapped to $A000-$BFFF. + ++---------------------------------------------------------------------------+ +| Type 19: Standard 8 KB 5200 cartridge | ++---------------------------------------------------------------------------+ + + Standard 8 KB cartridge for Atari 5200, mapped into $8000-$9FFF + and $A000-$BFFF. + ++---------------------------------------------------------------------------+ +| Type 20: Standard 4 KB 5200 cartridge | ++---------------------------------------------------------------------------+ + + Standard 4 KB cartridge for Atari 5200, mapped into $8000-$8FFF, + $9000-$9FFF, $A000-$AFFF and $B000-$BFFF. + ++---------------------------------------------------------------------------+ +| Type 21: Right slot 8 KB cartridge | ++---------------------------------------------------------------------------+ + + 8 KB cartridge for Atari 800, mapped into $8000-$9FFF. Atari 800 was + the only 8-bit Atari with a Right Cartridge slot, in addition + to the Left Cartridge slot as present on all 8-bit Ataris. + ++---------------------------------------------------------------------------+ +| Type 22: 32 KB Williams cartridge | ++---------------------------------------------------------------------------+ + + The cartridge has 4 banks mapped to $A000-$BFFF. An access to $D500 selects + bank 0, $D501 - bank 1, etc. An access to $D508-$D50F disables + the cartridge. + ++---------------------------------------------------------------------------+ +| Type 23: XEGS 256 KB cartridge | ++---------------------------------------------------------------------------+ + + An extension to the standard XEGS cartridge, apparently sold by Nir Dary + in the 1990s/2000s. + This bank-switched cartridge occupies 16 KB of address space between $8000 + and $BFFF. The cartridge memory is divided into 32 banks, 8 KB each. + The last bank is always mapped to $A000-BFFF. Five lowest bits of + a byte written to $D500-$D5FF select the bank mapped to $8000-$9FFF. + The initially selected bank is currently not known, although it's probable + that it's the same as in standard XEGS cartridges, ie. random. Atari800 + always selects bank 0 initially. + ++---------------------------------------------------------------------------+ +| Type 24: XEGS 512 KB cartridge | ++---------------------------------------------------------------------------+ + + An extension to the standard XEGS cartridge, apparently sold by Nir Dary + in the 1990s/2000s. + This bank-switched cartridge occupies 16 KB of address space between $8000 + and $BFFF. The cartridge memory is divided into 64 banks, 8 KB each. + The last bank is always mapped to $A000-$BFFF. Six lowest bits of + a byte written to $D500-$D5FF select the bank mapped to $8000-$9FFF. + The initially selected bank is currently not known, although it's probable + that it's the same as in standard XEGS cartridges, ie. random. Atari800 + always selects bank 0 initially. + ++---------------------------------------------------------------------------+ +| Type 25: XEGS 1 MB cartridge | ++---------------------------------------------------------------------------+ + + An extension to the standard XEGS cartridge, apparently sold by Nir Dary + in the 1990s/2000s. + This bank-switched cartridge occupies 16 KB of address space between $8000 + and $BFFF. The cartridge memory is divided into 128 banks, 8 KB each. + The last bank is always mapped to $A000-$BFFF. Seven lowest bits of + a byte written to $D500-$D5FF select the bank mapped to $8000-$9FFF. + The initially selected bank is currently not known, although it's probable + that it's the same as in standard XEGS cartridges, ie. random. Atari800 + always selects bank 0 initially. + ++---------------------------------------------------------------------------+ +| Type 26: MegaCart 16 KB cartridge | ++---------------------------------------------------------------------------+ + + A 16 KB cartridge, that occupies 16 KB of address space between $8000 + and $BFFF, and can be disabled by writing a byte with bit 7 set to + $D500-$D5FF. + ++---------------------------------------------------------------------------+ +| Type 27: MegaCart 32 KB cartridge | ++---------------------------------------------------------------------------+ + + A bank-switched cartridge that occupies 16 KB of address space between + $8000 and $BFFF. It is controlled by a byte written to $D500-$D5FF. Bit 0 + selects one of two available banks, bit 7 disables the cartridge. + ++---------------------------------------------------------------------------+ +| Type 28: MegaCart 64 KB cartridge | ++---------------------------------------------------------------------------+ + + A bank-switched cartridge that occupies 16 KB of address space between + $8000 and $BFFF. It is controlled by a byte written to $D500-$D5FF. Bits 0-1 + select one of four available banks, bit 7 disables the cartridge. + ++---------------------------------------------------------------------------+ +| Type 29: MegaCart 128 KB cartridge | ++---------------------------------------------------------------------------+ + + A bank-switched cartridge that occupies 16 KB of address space between + $8000 and $BFFF. It is controlled by a byte written to $D500-$D5FF. Bits 0-2 + select one of 8 available banks, bit 7 disables the cartridge. + ++---------------------------------------------------------------------------+ +| Type 30: MegaCart 256 KB cartridge | ++---------------------------------------------------------------------------+ + + A bank-switched cartridge that occupies 16 KB of address space between + $8000 and $BFFF. It is controlled by a byte written to $D500-$D5FF. Bits 0-3 + select one of 16 available banks, bit 7 disables the cartridge. + ++---------------------------------------------------------------------------+ +| Type 31: MegaCart 512 KB cartridge | ++---------------------------------------------------------------------------+ + + A bank-switched cartridge that occupies 16 KB of address space between + $8000 and $BFFF. It is controlled by a byte written to $D500-$D5FF. Bits 0-4 + select one of 32 available banks, bit 7 disables the cartridge. + ++---------------------------------------------------------------------------+ +| Type 32: MegaCart 1 MB cartridge | ++---------------------------------------------------------------------------+ + + A bank-switched cartridge that occupies 16 KB of address space between + $8000 and $BFFF. It is controlled by a byte written to $D500-$D5FF. Bits 0-5 + select one of 64 available banks, bit 7 disables the cartridge. + ++---------------------------------------------------------------------------+ +| Type 33: Switchable XEGS 32 KB cartridge | ++---------------------------------------------------------------------------+ + + An extension to the standard XEGS cartridge, apparently sold by Nir Dary + in the 1990s/2000s. + This bank-switched cartridge occupies 16 KB of address space between $8000 + and $BFFF. The cartridge memory is divided into 4 banks, 8 KB each. + Bank 3 (the last one) is always mapped to $A000-$BFFF. Two lowest bits of + a byte written to $D500-$D5FF select the bank mapped to $8000-$9FFF, + bit 7 disables the cartridge. + The initially selected bank is currently not known, although it's probable + that it's the same as in standard XEGS cartridges, ie. random. Atari800 + always selects bank 0 initially. + ++---------------------------------------------------------------------------+ +| Type 34: Switchable XEGS 64 KB cartridge | ++---------------------------------------------------------------------------+ + + An extension to the standard XEGS cartridge, apparently sold by Nir Dary + in the 1990s/2000s. + This bank-switched cartridge occupies 16 KB of address space between $8000 + and $BFFF. The cartridge memory is divided into 8 banks, 8 KB each. + Bank 7 (the last one) is always mapped to $A000-$BFFF. Three lowest bits of + a byte written to $D500-$D5FF select the bank mapped to $8000-$9FFF, + bit 7 disables the cartridge. + The initially selected bank is currently not known, although it's probable + that it's the same as in standard XEGS cartridges, ie. random. Atari800 + always selects bank 0 initially. + ++---------------------------------------------------------------------------+ +| Type 35: Switchable XEGS 128 KB cartridge | ++---------------------------------------------------------------------------+ + + An extension to the standard XEGS cartridge, apparently sold by Nir Dary + in the 1990s/2000s. + This bank-switched cartridge occupies 16 KB of address space between $8000 + and $BFFF. The cartridge memory is divided into 16 banks, 8 KB each. + Bank 15 (the last one) is always mapped to $A000-$BFFF. Four lowest bits of + a byte written to $D500-$D5FF select the bank mapped to $8000-$9FFF, + bit 7 disables the cartridge. + The initially selected bank is currently not known, although it's probable + that it's the same as in standard XEGS cartridges, ie. random. Atari800 + always selects bank 0 initially. + ++---------------------------------------------------------------------------+ +| Type 36: Switchable XEGS 256 KB cartridge | ++---------------------------------------------------------------------------+ + + An extension to the standard XEGS cartridge, apparently sold by Nir Dary + in the 1990s/2000s. + This bank-switched cartridge occupies 16 KB of address space between $8000 + and $BFFF. The cartridge memory is divided into 32 banks, 8 KB each. + The last bank is always mapped to $A000-$BFFF. Five lowest bits of + a byte written to $D500-$D5FF select the bank mapped to $8000-$9FFF, + bit 7 disables the cartridge. + The initially selected bank is currently not known, although it's probable + that it's the same as in standard XEGS cartridges, ie. random. Atari800 + always selects bank 0 initially. + ++---------------------------------------------------------------------------+ +| Type 37: Switchable XEGS 512 KB cartridge | ++---------------------------------------------------------------------------+ + + An extension to the standard XEGS cartridge, apparently sold by Nir Dary + in the 1990s/2000s. + This bank-switched cartridge occupies 16 KB of address space between $8000 + and $BFFF. The cartridge memory is divided into 64 banks, 8 KB each. + The last bank is always mapped to $A000-$BFFF. Six lowest bits of + a byte written to $D500-$D5FF select the bank mapped to $8000-$9FFF, + bit 7 disables the cartridge. + The initially selected bank is currently not known, although it's probable + that it's the same as in standard XEGS cartridges, ie. random. Atari800 + always selects bank 0 initially. + ++---------------------------------------------------------------------------+ +| Type 38: Switchable XEGS 1 MB cartridge | ++---------------------------------------------------------------------------+ + + An extension to the standard XEGS cartridge, apparently sold by Nir Dary + in the 1990s/2000s. + This bank-switched cartridge occupies 16 KB of address space between $8000 + and $BFFF. The cartridge memory is divided into 128 banks, 8 KB each. + The last bank is always mapped to $A000-$BFFF. Seven lowest bits of + a byte written to $D500-$D5FF select the bank mapped to $8000-$9FFF, + bit 7 disables the cartridge. + The initially selected bank is currently not known, although it's probable + that it's the same as in standard XEGS cartridges, ie. random. Atari800 + always selects bank 0 initially. + ++---------------------------------------------------------------------------+ +| Type 39: Phoenix 8 KB cartridge | ++---------------------------------------------------------------------------+ + + A 8 KB cartridge, that occupies 8 KB of address space between $A000 + and $BFFF. It starts in enabled state and can be disabled by an access to + $D500-$D5FF. Re-enabling is possible only by turning the computer off and on. + Some units contain a RESET button that allows to enable the cartridge without + touching the power button. + ++---------------------------------------------------------------------------+ +| Type 40: Blizzard 16 KB cartridge | ++---------------------------------------------------------------------------+ + + A 16 KB cartridge, that occupies 16 KB of address space between $8000 + and $BFFF. It starts in enabled state and can be disabled by an access to + $D500-$D5FF. Re-enabling is possible only by turning the computer off and on. + Some units contain a RESET button that allows to enable the cartridge without + touching the power button. + ++---------------------------------------------------------------------------+ +| Type 41: Atarimax 128 KB Flash cartridge | ++---------------------------------------------------------------------------+ + + This bank-switched cartridge occupies 8 KB of address space between $A000 + and $BFFF. The cartridge memory is divided into 16 banks, 8 KB each. + The 4 lowest bits of the address written to $D500-$D50F select the bank + mapped to $A000-$BFFF. Writing to $D510-$D51F disables the cartridge + and any write to $D520-$D5FF is ignored. + + The cartridge also supports programming of the Flash ROM - this feature is + currently not emulated. + ++---------------------------------------------------------------------------+ +| Type 42: Atarimax 1 MB Flash cartridge | ++---------------------------------------------------------------------------+ + + This bank-switched cartridge occupies 8 KB of address space between $A000 + and $BFFF. The cartridge memory is divided into 128 banks, 8 KB each. + The seven lowest bits of the address written to $D500-$D57F select the bank + mapped to $A000-$BFFF, bit 7 disables the cartridge. + + The cartridge also supports programming of the Flash ROM - this feature is + currently not emulated. + ++---------------------------------------------------------------------------+ +| Type 43: SpartaDOS X 128 KB cartridge | ++---------------------------------------------------------------------------+ + + The cartridge has 16 banks mapped to $A000-$BFFF. It also contains an + additional cartridge slot which allows to plug a second cartridge in. First + 8 banks are selected by an access to $D5F7-$D5F0, the other 8 banks by an + access to $D5E7-$D5E0. An access to $D5E8-$D5EB or $D5F8-$D5FB disables the + SDX cartridge and enables the second cartridge. An access to $D5EC-$D5EF or + $D5FC-$D5FF disables both cartriges. + Accesses to all addresses on page D5 always reaches the second cartridge, + even if it is disabled by SpartaDOS or if the SpartaDOS cartridge itself is + enabled. + ++---------------------------------------------------------------------------+ +| Type 44: OSS 8 KB cartridge | ++---------------------------------------------------------------------------+ + + Used in The Writer's Tool cartridge, it is actually an OSS one chip cartridge + board (see Type 15) with an 8 KB ROM chip instead of a normal 16 KB one. + The cartridge occupies 8 KB of address space between $A000 and $BFFF. Its + memory is divided into 2 banks, 4 KB each. Bank number 0 (the first one) is + always mapped to $B000-$BFFF. Bank in $A000-$AFFF is selected by an access to + $D500-$D5FF. Only bits 0 and 3 of address are significant: + - A3=0, A0=0 or 1 - selects bank 1 + - A3=1, A0=0 - disables cartridge (enables computer's memory in address space + between $A000 and $BFFF) + - A3=1, A0=1 - selects bank 0 + +Reference: http://www.retrobits.net/atari/osshack.shtml + ++---------------------------------------------------------------------------+ +| Type 45: OSS two chip 16 KB cartridge (043M) | ++---------------------------------------------------------------------------+ + + There are two types of OSS 16KB cartridges; this is the earlier, more + complicated one. Used by BASIC XL 1.02 and earlier, Action! 3.5 and earlier, + and MAC/65 1.0. It consists of two 8 KB ROM chips. + The cartridge occupies 8 KB of address space between $A000 and $BFFF. Its + memory is divided into 4 banks, 4 KB each. Bank number 3 (the last one) is + always mapped to $B000-$BFFF. Bank in $A000-$AFFF is selected by an access to + $D500-$D5FF. Only 4 lowest bits of address are significant: + - $D5x0 selects bank 0. + - $D5x1 is not useful - it selects banks 0 and 2 (the bytes are binary AND of + the corresponding bytes from banks 0 and 2). + - $D5x3 or $D5x7 selects bank 2. + - $D5x4 selects bank 1. + - $D5x5 is not useful - it selects banks 1 and 2 (the bytes are binary AND of + the corresponding bytes from banks 1 and 2). + - $D5x2 or $D5x6 is not useful. It disables ROM (there are $FF bytes in + $A000-$AFFF). + - $D5x8-$D5xF disables whole cartridge (enables computer's memory in address + space between $A000 and $BFFF). + + Reference: http://www.retrobits.net/atari/osscarts.shtml + ++---------------------------------------------------------------------------+ +| Type 46: Blizzard 4 KB cartridge | ++---------------------------------------------------------------------------+ + + A 4 KB cartridge, that occupies 8 KB of address space between $A000 + and $BFFF. Line A12 is unconnected, so the cartridge's memory is duplicated + in $A000-$AFFF and $B000-$BFFF. The cartridge starts in enabled state and can + be disabled by an access to $D500-$D5FF. Re-enabling is possible only by + turning the computer off and on. Some units contain a RESET button that + allows to enable the cartridge without touching the power button. + + Reference: http://www.serious-dial.atari.pl/Serious/S13/A18.html + ++---------------------------------------------------------------------------+ +| Type 47: AST 32 KB cartridge | ++---------------------------------------------------------------------------+ + + This cartridge occupies 8 KB of address space between $A000 and $BFFF. The + cartridge memory is divided into 128 banks, 256 B each. On power on, bank 0 + is visible in $A000-$BFFF (repeated 32 times) and also in $D500-$D5FF. A + write operation to $D500-$D5FF disables the cartridge (freeing the + $A000-$BFFF area) and selects the next 256-byte bank visible at $D500-$D5FF. + After bank 31 the write operation selects bank 0 again. + + Reference: http://www.atari.org.pl/forum/viewtopic.php?pid=134014#p134014 + ++---------------------------------------------------------------------------+ +| Type 48: Atrax SDX 64 KB cartridge | ++---------------------------------------------------------------------------+ + + A variant of Type 11: SpartaDOS X 64 KB cartridge. The banking scheme is + identical, but the address and data lines between the cartridge port and the + ROM chip are interleaved as follows: + (Left - cartridge port + bank select lines, right - EPROM pins) + A0 - A6 + A1 - A7 + A2 - A12 + A3 - A15 + A4 - A14 + A5 - A13 + A6 - A8 + A7 - A5 + A8 - A4 + A9 - A3 + A10 - A0 + A11 - A1 + A12 - A2 + A13 - A9 \ + A14 - A11 > bank select + A15 - A10 / + D0 - Q4 + D1 - Q0 + D2 - Q5 + D3 - Q1 + D4 - Q7 + D5 - Q6 + D6 - Q3 + D7 - Q2 + By deinterleaving a ROM image, one would get a normal image of type 11. + See Type 11 for details on the banking scheme. + + Reference: http://www.dereatari.republika.pl/atarisch/sparta.zip + ++---------------------------------------------------------------------------+ +| Type 49: Atrax SDX 128 KB cartridge | ++---------------------------------------------------------------------------+ + + A variant of Type 43: SpartaDOS X 128 KB cartridge. The banking scheme is + identical, but the address and data lines between the cartridge port and the + ROM chip are interleaved. The interleaving is similar to that of Type 48, + but with added A16 line, so it looks as follows: + (Left - cartridge port + bank select lines, right - EPROM pins) + A0 - A6 + A1 - A7 + A2 - A12 + A3 - A15 + A4 - A14 + A5 - A13 + A6 - A8 + A7 - A5 + A8 - A4 + A9 - A3 + A10 - A0 + A11 - A1 + A12 - A2 + A13 - A9 \ + A14 - A11 > bank select + A15 - A10 / + A16 - A16 / + D0 - Q4 + D1 - Q0 + D2 - Q5 + D3 - Q1 + D4 - Q7 + D5 - Q6 + D6 - Q3 + D7 - Q2 + By deinterleaving a ROM image, one would get a normal image of type 43. + See Type 43 for details on the banking scheme. + + Reference: http://www.dereatari.republika.pl/atarisch/sparta.zip + http://trub.atari8.info/index.php?ref=atrax_128 + ++---------------------------------------------------------------------------+ +| Type 50: Turbosoft 64 KB cartridge | ++---------------------------------------------------------------------------+ + + This bank-switched cartridge occupies 8 KB of address space between $A000 + and $BFFF. The cartridge memory is divided into 8 banks, 8 KB each. Banks + are selected by an access to an address at $D500-$D5FF. Bits 0-2 of the + address select the bank mapped to $A000-$BFFF. Bit 4 disables the cartridge + and enables RAM. Bits 3 and 5-7 are ignored. The cartridge starts with bank 0 + enabled. + + Reference: http://www.retrogames.cl/turbosoft.html + ++---------------------------------------------------------------------------+ +| Type 51: Turbosoft 128 KB cartridge | ++---------------------------------------------------------------------------+ + + This bank-switched cartridge occupies 8 KB of address space between $A000 + and $BFFF. The cartridge memory is divided into 16 banks, 8 KB each. Banks + are selected by an access to an address at $D500-D5FF. Bits 0-3 of the + address select the bank mapped to $A000-$BFFF. Bit 4 disables the cartridge + and enables RAM. Bits 5-7 are ignored. The cartridge starts with bank 0 + enabled. + + Reference: http://www.retrogames.cl/turbosoft.html + ++---------------------------------------------------------------------------+ +| Type 52: Ultracart 32 KB cartridge | ++---------------------------------------------------------------------------+ + + This bank-switched cartridge occupies 8 KB of address space between $A000 + and $BFFF. The cartridge memory is divided into 4 banks, 8 KB each. On power + on, bank 0 is visible. Each access to $D500-$D5FF switches another bank in + the sequence as follows: 0->1->2->3->cartridge disabled->0 etc. + + Reference: Altirra source code, ver. 2.10-test20 + http://www.atarimania.com/utility-atari-400-800-xl-xe-microcalc_28241.html + ++---------------------------------------------------------------------------+ +| Type 53: Low bank 8 KB cartridge | ++---------------------------------------------------------------------------+ + + This cartridge, destined for the left cartridge slot, occupies 8 KB of + address space between $8000 and $9FFF. It achieves that by asserting the RD4 + line and not asserting the RD5 line. + + Reference: http://www.atariage.com/forums/topic/161828-hooked-on-8-bit-carts/page__view__findpost__p__2338297 + ++---------------------------------------------------------------------------+ +| Type 54: SIC! 128 KB cartridge | ++---------------------------------------------------------------------------+ + + Cartridge memory is divided into 8 banks, each 16KB long and consisting of + two 8KB subbanks. Each subbank can be mapped to Atari memory or switched + off. The lower subbank always maps to $8000-$9FFF, while the upper one always + maps to $A000-$BFFF. + Control register address is $D500-$D51F mirrored, read/write (written value + can be read at any time). + Bit 7 = 0 - flash write-protection is on + Bit 6 = 0 - odd 8k block (upper subbank) present in $A000-$BFFF + Bit 5 = 0 - even 8k block (lower subbank) not present in $8000-$9FFF + Bits 4..3 - unused + Bits 2..0 - 16KB bank number (0..7) + Default value = 0 which means 0 bank upper subbank in address $A000-$BFFF + To switch cart off - poke $40 info $D500-$D51F + The cartridge also supports programming of the Flash ROM - this feature is + currently not emulated. + + Reference: http://sic.pigwa.net/files/specyfikacja_pl_eng.zip + ++---------------------------------------------------------------------------+ +| Type 55: SIC! 256 KB cartridge | ++---------------------------------------------------------------------------+ + + Same as Type 54, but with cartridge memory being divided into 16 banks. + Bit 4 is unused + Bits 3..0 - 16KB bank number (0..15) + ++---------------------------------------------------------------------------+ +| Type 56: SIC! 512 KB cartridge | ++---------------------------------------------------------------------------+ + + Same as Type 54, but with cartridge memory being divided into 32 banks. + Bits 4..0 - 16KB bank number (0..31) + ++---------------------------------------------------------------------------+ +| Type 57: Standard 2 KB cartridge | ++---------------------------------------------------------------------------+ + + A 2 KB cartridge, that occupies 8 KB of address space between $A000 and + $BFFF. The ROM chip is active only when lines A11 and A12 are high. In + effect, the cartridge's memory appears at $B800-$BFFF while the $A000-B7FF + area is unavailable and returns $FF when read. + ++---------------------------------------------------------------------------+ +| Type 58: Standard 4 KB cartridge | ++---------------------------------------------------------------------------+ + + A 4 KB cartridge, that occupies 8 KB of address space between $A000 and + $BFFF. The ROM chip is active only when line A12 is high. In effect, the + cartridge's memory appears at $B000-$BFFF while the $A000-AFFF area is + unavailable and returns $FF when read. + ++---------------------------------------------------------------------------+ +| Type 59: Right slot 4 KB cartridge | ++---------------------------------------------------------------------------+ + + A 4 KB cartridge for Atari 800, mapped into $8000-$9FFF. The ROM chip is + active only when line A12 is high. In effect, the cartridge's memory appears + at $9000-$9FFF while the $8000-8FFF area is unavailable and returns $FF when + read. + ++---------------------------------------------------------------------------+ +| Type 60: Blizzard 32 KB cartridge | ++---------------------------------------------------------------------------+ + + This bank-switched cartridge occupies 8 KB of address space between $A000 + and $BFFF. The cartridge memory is divided into 4 banks, 8 KB each. On power + on, bank 0 is visible. Each access to $D500-$D5FF switches another bank in + the sequence as follows: 0->1->2->3->cartridge disabled. Re-enabling is + possible only by turning the computer off and on. Some units contain a RESET + button that allows to enable the cartridge without touching the power button. + + Reference: + http://www.atari.org.pl/forum/viewtopic.php?id=7292 + ++---------------------------------------------------------------------------+ +| Type 61: MegaMax 2 MB cartridge | ++---------------------------------------------------------------------------+ + + A variant of the MegaMax cartridge with 2MB ROM. The cartridge has a switch + to toggle between the 1 MB Atarimax-compatible mode and the 2MB mode; + this type describes the latter one. + + A bank-switched cartridge that occupies 16 KB of address space between + $8000 and $BFFF. It is controlled by access to an address at $D500-$D5FF. + Bits 0-6 of the address select one of 128 available banks, bit 7 disables the + cartridge. The cartridge starts with bank 0 enabled. + + Reference: + http://www.mega-hz.de/Angebote/MEGAMAX/en/MegaMAX%20Cart%20en%20V1.htm + ++---------------------------------------------------------------------------+ +| Type 62: The!Cart 128 MB cartridge | ++---------------------------------------------------------------------------+ + + Only a small subset, as described below, of this cartridge's features is + currently emulated. + + The cartridge occupies 8 KB of address space between $A000 and $BFFF, and + consists of 16384 banks. Byte written to $D5A2 turns the cartridge on/off: + bit 0 = 1 enables the cartridge, 0 disables it and enables RAM. The enabled + bank is controlled by bytes written to $D5A0 (LSB) and $D5A1 (MSB, only 6 + lowest bytes matter). Any write do $D5A0-$D5A1 also automatically enables the + cartridge. + + The cartridge starts with bank 0 enabled. + + The $D5A0-$D5A2 registers are read/write; one can read the cartridge's current + state from them. Unused bits are always read as 0. + + Reference: + http://www.mega-hz.de/Angebote/THE!CART/THE!CART_EN.htm + ++---------------------------------------------------------------------------+ +| Type 63: Flash MegaCart 4 MB cartridge | ++---------------------------------------------------------------------------+ + + A bank-switched cartridge that occupies 16 KB of address space between + $8000 and $BFFF. It is controlled by a byte written to $D500-$D51F. Values + 0-254 select one of the first 255 banks, and the value 255 disables the + cartridge. Bank 255 is not available. The cartridge starts with bank 254 + enabled. + + A read from $D500-$D51F returns the last value written (initially 254). + + The cartridge also has ROM flashing functionality, which is currently not + emulated. + + Reference: + http://herale.org/4MB_FLASH_MEGACART + ++---------------------------------------------------------------------------+ +| Type 64: MegaCart 2 MB cartridge | ++---------------------------------------------------------------------------+ + + A bank-switched cartridge that occupies 16 KB of address space between + $8000 and $BFFF. It is controlled by a byte written to $D500-$D5FF. Bits 0-6 + select one of 128 available banks, bit 7 disables the cartridge. + ++---------------------------------------------------------------------------+ +| Type 65: The!Cart 32 MB cartridge | ++---------------------------------------------------------------------------+ + + Only a small subset, as described below, of this cartridge's features is + currently emulated. + + The cartridge occupies 8 KB of address space between $A000 and $BFFF, and + consists of 4096 banks. Byte written to $D5A2 turns the cartridge on/off: + bit 0 = 1 enables the cartridge, 0 disables it and enables RAM. The enabled + bank is controlled by bytes written to $D5A0 (LSB) and $D5A1 (MSB, only 6 + lowest bytes are stored in the internal register, and only 4 lowest bytes + matter in choosing the enabled bank). Any write do $D5A0-$D5A1 also + automatically enables the cartridge. + + The cartridge starts with bank 0 enabled. + + The $D5A0-$D5A2 registers are read/write; one can read the cartridge's current + state from them. Unused bits are always read as 0. + ++---------------------------------------------------------------------------+ +| Type 66: The!Cart 64 MB cartridge | ++---------------------------------------------------------------------------+ + + Only a small subset, as described below, of this cartridge's features is + currently emulated. + + The cartridge occupies 8 KB of address space between $A000 and $BFFF, and + consists of 8192 banks. Byte written to $D5A2 turns the cartridge on/off: + bit 0 = 1 enables the cartridge, 0 disables it and enables RAM. The enabled + bank is controlled by bytes written to $D5A0 (LSB) and $D5A1 (MSB, only 6 + lowest bytes are stored in the internal register, and only 5 lowest bytes + matter in choosing the enabled bank). Any write do $D5A0-$D5A1 also + automatically enables the cartridge. + + The cartridge starts with bank 0 enabled. + + The $D5A0-$D5A2 registers are read/write; one can read the cartridge's current + state from them. Unused bits are always read as 0. + ++---------------------------------------------------------------------------+ +| Type 67: XEGS 64 KB cartridge (banks 8-15) | ++---------------------------------------------------------------------------+ + + One of the two variants of the 64 KB XEGS cartridge, built on a C026449 board + with all pins of the 74LS374 chip connected. All software designed for this + cartridge type also works with the other variant; see Type 13. + This bank-switched cartridge occupies 16 KB of address space between $8000 + and $BFFF. The cartridge memory is divided into 8 banks, 8 KB each. + Bank 7 (the last one) is always mapped to $A000-$BFFF. Four lowest bits of + a byte written to $D500-$D5FF select the bank mapped to $8000-$9FFF. + Unsetting bit 3 unmaps the $8000-$9FFFF area and leaves it unconnected + (floating or all $FFs); otherwise a bank selected by the three lowest bits is + mapped. + The initially selected bank is random, although it seems that the value of 0 + (ie. no bank mapped) gets chosen the most often. Atari800 always selects 0 + initially. + + Reference: + http://www.atarimax.com/jindroush.atari.org/acarts.html#xegs diff --git a/DOC/directx.txt b/DOC/directx.txt new file mode 100644 index 0000000..22ecb0d --- /dev/null +++ b/DOC/directx.txt @@ -0,0 +1,229 @@ +This file documents new options that I have personally +added to the Windows DX port of the emulator since 2.1. +The major goal of these enhancements is to allow the +emulator to perform better on modern display and game +controller technology, including widescreen monitors, +TVs, gamepads, and HTPC/kiosk setups. A secondary +goal is to make usability improvements to the emulator +shell including main menu and internal mouse support. + + +Windows DX: Windows Display Options +=================================== +Note: Defaults are shown in [brackets]. +Note: All settings (except -console) can be saved in the UI. + +Display Rendering +----------------- +[GDI] Software pixel scaling. Fast. +GDI+ Software pixel scaling. Moderate. +GDI+/Bilinear Software bilinear scaling. Slow. +GDI+/Bilinear (HQ) Software HQ bilinear scaling. Very slow. +GDI+/Bicubic (HQ) Software HQ bicubic scaling. Slow +Direct3D Hardware pixel scaling. Fast. +Direct3D/Bilinear Hardware bilinear scaling. Fast. + +Note: Emulator must be restarted to activate a rendering + mode change. + +Hint: For softer pixels and resolution-independent aliasing + control, choose Direct3D/Bilinear mode. + +Fullscreen Resolution +--------------------- +[Desktop] Use the current desktop resolution. +VGA 640x480. 2x native pixel resolution. +SXGA 1280x960. 4x native pixel resolution. +UXGA 1600x1200. 5x native pixel resolution. + +Hint: Use -fsres command line to use a custom resolution that + does not appear in this list. + +Scaling Method +-------------- +Off Stretch unconstrained to window boundary +[Normal] Scale dynamically while enforcing aspect. +Simple Scale to exact multiple of native screen. +Adaptive Compensate for widescreen stretching. + +Note: Adaptive mode is "experimental" and not fully compatible + with all combinations of settings. + +Aspect Mode +----------- +[Auto] 7:5 or 4:3 crop depending on screen metrics. +Wide Display 336x240 pixel matrix in 7:5 aspect. +Cropped Display 320x240 pixel matrix in 4:3 aspect. +Compressed Display 336x240 pixel matrix in 4:3 aspect. + +Note: Scaling method must be set to "Normal" or "Simple" for these + settings to be effective. + + +Custom Crop Options +------------------- +Horizontal crop Symmetrically crop width by # of pixels. [0] +Vertical crop Symmetrically crop height by # of pixels. [0] +Lock aspect mode Force current aspect mode ratio on crop.[No] + +Hint: Cropping can be used to effectively zoom or stretch. To zoom + without distortion while using a 4:3 resolution in fullscreen, + set horizontal and vertical crop to equal values. To zoom + when using a widescreen display and resolution in fullscreen, + you typically only need to set a vertical crop value. + +Note: Be aware that using vertical crop will clip the notification + area of the screen sometimes used to display frame rates or + disk activity. + + +Other Settings +-------------- +Screen mode Switch between Fullscreen and [Windowed] modes. +Window scale Set size of window as percent of native. [200] +Scanline mode Three resolutions of simulated scanlines. [Off] +Horizontal offset Shift screen horizontally <-24..24>. [0] +Vertical offset Shift screen vertically <-50..50>. [0] +Always hide cursor Hide mouse cursor in fullscreen UI. [No] +Show menu Show or hide the Windows main menu. [Yes] + + +Windows DX: Display Settings +============================ + +Color preset +------------------------- +[Standard] Standard color adjustments as seen on a real TV or + monitor. Accurately represents full spectrum of colors. +Deep black Adjusted to allow producing pure black color (unlike the + Standard preset). May look more pleasant, although is + less accurate when representing the darkest colors. +Vibrant Arcade-like vibrant colors. Enhanced color saturation + and black-level. + +Hint: Changing video settings (i.e. brightness, contrast, etc.) from + one of the base profile settings will cause the profile name + to read "Custom". + + +Windows DX: Controller Configuration +==================================== + +Keyboard Joystick Modes +----------------------- +Keypad Keypad is joystick. 0 key is trigger. +Keypad+ Keypad is joystick. 5=down. 0, left ctrl=trigger. +[Arrows] Use cursor block as joystick. Left ctrl=trigger. + +Alternate Joystick Modes +------------------------ +[Normal] Normal joystick functions. +Dual Double-map player 2 stick to Z/Z-Rotation axis. +Shared Double-map player 2 stick to player 1 stick. + +Hint: Use "Dual" on two-stick gamepads for two joystick games like + Robotron and Space Dungeon. Use "Shared" to share a single + joystick between two players on games that normally require + two joysticks. + +Custom Button Options +--------------------- +Use "Enable custom buttons" to turn on custom joystickbutton feature. +Use "Assign custom buttons" to assign keystrokes to joystick buttons. + +The following buttons may be mapped. + + * All numbers. + * All alphabet keys in upper & lower case. + * Atari Option, Select, and Start (press F2, F3, or F4). + * Space + * Return + + +Windows DX Menu Operation +========================= +Configuration options may be accessed through either the +main menu or by pressing F1. The main menu is only available +when the emulator is run in a window. + +Mouse Operations +---------------- +Inside the configuration menus, mouse ops are as follows. + +Click: Selects item +Double click: Activates item (Enter) +Right click: Back (Esc) +Wheel up: Up +Wheel down: Down +Wheel left: Left +Wheel right: Right + + +Windows DX keyboard hot-keys +============================ +Alt+Enter Toggles between windowed and fullscreen modes +Alt+PageUp Increases the size of the window +Alt+PageDown Decreases the size of the window +Alt+I Advances to the next scanline (interleave) mode +Alt+M Toggles Windows main menu on or off. +Alt+Shift+Z 3D "tilt screen". (Direct3D modes only) +Alt+Z 3D "screensaver". (Direct3D modes only) + +Hint: Use of Alt-T & Alt-Z may require running the "DirectX 9 Updater" +from microsoft.com. Google or Bing the quoted text to find it. + + +Windows DX: Command Line Options +================================ +-help Show all help options (including these) + +-console Send debug output to a console instead of + atari800.txt. Required for debug monitor. + +-keyjoy Keyboard joystick mode. + , , +-altjoy Alternate joystick mode. + , , +-mapjoy1buttons Use custom button mappings for joystick 1. +-mapjoy2buttons Use custom button mappings for joystick 2. + +-render Rendering engine to use. + , , , +-filter Scaling filter. + , , , +-scaling Scaling method. + , , , +-aspect Aspect mode. + , , , +-winscale Window size as a percent of native Atari screen. + <100>, <200>, <250>, etc. +-fullscreen Force fullscreen mode at startup. +-windowed Force windowed mode at startup. +-fsres Custom fullscreen resolution. + i.e. <640x480>, <800x600>, <1024x768>, etc. +-scanlines Scanline mode. + , , +-hcrop Crop the screen horizontally. + +-vcrop Crop the screen vertically. + +-crop Crop the screen horizonally & vertically. + +-lockaspect Lock current aspect mode when trimming. +-hoffset Shift screen horizontally. + +-voffset Shift screen vertically. + +-hidecursor Hide mouse cursor in fullscreen UI mode. +-hidemenu Hide the Windows main menu. + +-colors-preset Use one of predefined color adjustments. + , , + +-width Set display mode width (ddraw only). +-blt Use blitting to draw graphics (ddraw only). + + + +David Dahlstrom +2010-04-29 diff --git a/DOC/emuos.txt b/DOC/emuos.txt new file mode 100644 index 0000000..ec6b6cf --- /dev/null +++ b/DOC/emuos.txt @@ -0,0 +1,7 @@ +Working program under emulated OS +--------------------------------- + +1. Montezummas Revenge +2. Defender +3. Star Raider +4. Fast Eddie diff --git a/DOC/pokeysnd.txt b/DOC/pokeysnd.txt new file mode 100644 index 0000000..81b7d93 --- /dev/null +++ b/DOC/pokeysnd.txt @@ -0,0 +1,352 @@ + Atari POKEY Chip Emulator V2.3 + ============================== + by Ron Fries + 19 Jan 98 + +The PokeySound Chip Emulator is designed to emulate the functionality of the +Atari POKEY Chip Hardware through 'C' Sourcecode. The emulator is able to +produce sounds which are essentially identical to the original POKEY chip, +including the exact distortions and pitches. + +The emulator is designed to run in a 32-bit environment. Though it can be +compiled and run in a 16-bit environment, it is slow. + +I would like to give special thanks to Neil Bradley. He provided excellent +testing support and was also the driving force behind the multiple POKEY +emulation. + +New Features: +------------- + +Version 2.3: + +1) Added configurable support for signed/unsigned samples. Default is + unsigned, define SIGNED_SAMPLES if necessary. + +2) Included SBDRV1.2 which adds DJGPP support and corrects the AUTO-INIT + detection problem. + + +Version 2.2: + +1) Changed to signed 8-bit samples. + +2) Increased gain range by a factor of 16. Divide gain from previous version + by sixteen to produce the same results. + +3) Removed DOS dependent routines to provide cross-platform support. + +4) Added conditional defines for TRUE and FALSE + +5) Added support for big/little endian machines. Defaults to little endian. + Define BIG_ENDIAN if necessary. + + +Version 2.0: + +1) Support for multiple POKEY chips. The maximum supported is configured + at compile time. + +2) An adjustable gain. The previous releases had a built-in gain of 64. + +3) A clipping option. Depending on the number of chips emulated and the + configured gain, it is possible for the output to exceed 8-bits. + Clipping can be enabled to prevent this, though it does increase the + processing time. + + +Standard Features: +------------------ + +The 'PokeySound' emulator supports the following functions: + +1) All polynomial sound generators: + a) 4-bit poly - actual bit pattern determined from sampled sound + b) 5-bit poly - actual bit pattern determined from sampled sound + c) 17-bit poly - simulated random bit pattern + d) 9-bit poly - derived from simulated 17-bit poly + +2) Full support of all 'Divide by N' counter clocks: + a) 1.79 MHz (high limited to playback sample rate) + b) 64 KHz (high limited to playback sample rate) + c) 15 KHz + +3) Full support of all 'Divide by N' resolutions: + a) 8-bit - single channel + b) 16-bit - double channel + +4) Full support of all distortions + a) 5-bit poly, then 17-bit poly + b) 5-bit poly only + c) 5-bit poly, then 4-bit poly + d) 17-bit poly only + e) no poly counters (pure tone) + f) 5-bit poly only + +5) Full support of volume control + +6) Full support of all pitches - distortions will vary exactly as the + original Atari based on different pitches + +7) Accurate pitch generation + +8) Support of any playback sample rate (e.g. 22050) + + +The 'PokeySound' emulator does not currently support the following functions: + +1) High pass filters + + +Though I don't believe adding support for the High-Pass filters is very +complicated, I decided not to add support right now because I don't +believe this feature is used much. I'm also not sure how much impact it +would have on performance. Let me know if you find an application that +uses it. + +In the 2.0 release, I've removed the non-optimized version. It was only +left in for reference. If you would still like to see the non-optimized +version, it's available in the 1.2 release. + +One of the unique features of the emulator is that the processing time varies +based on the frequency. Since the routine only calculates new output values +when a change is sensed, the lower frequencies (which change less frequently) +will require less processing time. + + +Differences Between the Emulator and the Actual POKEY Chip: +----------------------------------------------------------- + +The biggest difference between the emulator and the original hardware is +that the emulator emulates an 'ideal' POKEY chip. All output from the +emulator is a based on a precise square wave, whereas the output from the +original chip has decay. Though the output is slightly different, I +don't believe this difference is easily discernible. + +Another slight difference is the 17-bit/9-bit poly. Since the polynomial +is large (2^17 bits), I choose to create the sample using a random number +generator rather than a table. I don't believe this difference is +significant. + +There are also a few differences which are introduced by aliasing. This is +a direct result of using an output sampling rate which is not identical to +the original sound rate. It is most evident with high frequencies. + +A final difference is the lack of support for the High-Pass Filter +functionality. I plan to add this in a future release if necessary. + + +Sample/Test Application: +------------------------ + +The test program I've distributed is a 16-bit DOS application created with +the Borland 'C' compiler. The only reason I used 16-bit was because I +already had a set of working SB drivers in 16-bit. Since the test system +is dedicated to generating sounds, the performance in 16-bit is more than +adequate. + + +POKEY.C +======= + +The POKEY.C file is the heart of the PokeySound Emulation program. +Although the routines in the file must work together, no other files are +modules are required for operation. A header file, 'POKEY.H', has +been included for use in other modules, and provides the necessary +function prototypes. I've attempted to make the routines as portable as +possible, so the file should compile on almost any compiler with little +or no modification. + +I have made some attempts at optimizing the routines, though I am sure +more optimization can be done. They are currently only available in 'C'. +I'll be happy to convert them to assembly language if desired. Please feel +free to send me e-mail at rfries@tcmail.frco.com. + +The routines are easy to use. Detailed descriptions on the function calls +are listed below. + +The POKEY.C module can be compiled in a 32-bit or 16-bit environment. +Since these routines are optimized for 32-bit use, the code will default +to 32-bit. To compile in 16-bits, use a command line option to define +the variable COMP16. + + +GENERAL OVERVIEW +---------------- + +On start-up of the system, a single call should be made to Pokey_sound_init. +This routine will prepare the structures for sound output. This routine +can be called again if necessary during warm-start or other reset. + +Once in the main loop, there are two other functions that will be used. +Whenever the system needs to write to either the AUDC or AUDF values, +a call should be made to the Update_pokey_sound routine. This routine will +take care of updating the internal registers. It will pre-calculate several +values to help with optimization. + +The only other routine that is called is the Pokey_process function. This +function will fill a audio buffer with a specified number of bytes. This +function should be called whenever a new audio buffer is required. + +For best results, I recommend using at least two output buffers. Using this +scheme, the sound card can be playing one buffer while the system is filling +the other. + + +DETAILED FUNCTION DESCRIPTIONS +------------------------------ + +Pokey_sound_init(uint32 freq17, uint16 playback_freq, uint8 num_pokeys) +----------------------------------------------------------------------- + +This function initializes the structures used by the PokeySound routines. +This function takes three parameters: the main clock frequency, the +playback frequency and the number of POKEY chips to emulate. + +The maximum number of POKEY chips emulated is configured at compile time. +Though the maximum number of chips can be configured as one, the PokeySound +1.2 routines are recommended if only a single chip is to be emulated since +they have will provide better performance. + +NOTE: The following information on the 1.79MHz clock applies only to the + Atari 800 line of home computers. Many Arcade games also use the + POKEY chip, but most use a different frequency for the POKEY clock. + Refer to the schematics for more details. + +The main clock frequency is the frequency of the 1.79MHz source clock. +To provide exact results, freq17 should be set equal to 1789790 Hz. As an +alternative, freq17 can be set to an approximate frequency of 1787520 Hz. +Using this approximate frequency will reduce aliasing and thus produce a +clearer output signal. + +A constant has been defined for both of these values for your convenience. +The names are FREQ_17_EXACT and FREQ_17_APPROX. + +The playback frequency is the frequency of the sound playback (the frequency +used by the sound card). For best results, the playback frequency should +be an even division of the main clock frequency. Since most of the sounds +will be generated using the 64kHz clock, I also recommend making the +playback frequency an even division of the 64kHz clock. + +The 64kHz clock is exactly equal to the main clock divided by 28. For +the playback frequency, I recommend one of the following values: + +1) FREQ_17_APPROX / (28*1), which is equal to 63840. Of course, most sound + cards can't reproduce this frequency. + +2) FREQ_17_APPROX / (28*2), which is equal to 31920. All of the newer cards + will support this frequency. + +3) FREQ_17_APPROX / (28*3), which is equal to 21280. All of the SB + compatibles should support this frequency. + +4) FREQ_17_APPROX / (28*4), which is equal to 15960. This may be the + best choice, as it offers good sound reproduction with good performance. + +Of course, these options also assume you are using the approximate +frequency for the main clock as well. Any of these choices will offer the +best results when the main 64kHz clock is used, reasonable results when the +15kHz clock is selected, and marginal results when the 1.79MHz clock is +selected (the only way to produce good results in all cases is to set the +playback frequency to 1.79MHz!) + +Feel free to experiment to find other alternatives as well. + +This function has no return value (void). + + +Update_pokey_sound (uint16 addr, uint8 val, uint8 chip, uint8 gain) +------------------------------------------------------------------- + +This function should be called each time an AUDC, AUDF or AUDCTL value +changes. This function takes four parameters: the address to change, +the new value, the chip to be updated, and the gain to be used. +The lower four bits of the address should be one of the following values: + + Addr Description + ------ ----------- + 0x00 AUDF1 + 0x01 AUDC1 + 0x02 AUDF2 + 0x03 AUDC2 + 0x04 AUDF3 + 0x05 AUDC3 + 0x06 AUDF4 + 0x07 AUDC4 + 0x08 AUDCTL + +In order to support multiple POKEY chips, only the lower four bits of +the address are used. Note that this routine can no longer be called with +any address as it will affect the operation of the specified chip. + +The routine pre-calculates several values that are needed by the +processing function. This is done to optimize performance. + +The output will be amplified (multiplied) by the gain (note that POKEY 2.0 +used gain/16). If the output exceeds the maximum value after then gain and +clipping is enabled, the output will be limited to reduce distortion. + +The best value for the gain depends on the number of POKEYs emulated and +the maximum volume used. The maximum possible output for each channel is 15, +making the maximum possible output for a single chip to be 60. Assuming all +four channels on the chip are used at full volume, a gain of 4 can be used +without distortion. If 4 POKEY chips are emulated and all 16 channels are +used at full volume, the gain must be no more than one to prevent distortion. +Of course, if only a few of the 16 channels are used or not all channels are +used at full volume, a larger gain can be used. + +To enable clipping, define the logical CLIP before compiling. The default +mode of operation is no clipping as this provides the best performance. If +necessary (only required if the gain is too large), remove the comments from +around the CLIP definition in the POKEY.H file. + +To enable signed output, define the logical SIGNED_SAMPLES before compiling. +The default is unsigned 8-bit centered around 128. If unsigned samples are +necessary, remove the comments from around the SIGNED_SAMPLES definition in +POKEY.H. + +This function has no return value (void). + + +Pokey_process (uint8 *buffer, uint16 n) +--------------------------------------- + +This function calculates and fills a buffer with signed or unsigned 8-bit +mono audio. This function takes two parameters: a pointer to the buffer to +fill and the size of the buffer (limited to 65535). This function fills the +buffer based on the requested size and returns. It automatically +updates the pointers for the next call, so subsequent calls to this function +will provide a continuous stream of data. + +The size of the buffer that is needed depends on the playback frequency. +It is best to keep the buffer as small as possible to maximize response time +to changes in the sound. Of course, the minimum size is dependent on +system and emulator performance. + +Selecting the correct buffer size is a careful balance. Selecting a buffer +size that is too small will produce noticeable clicks in the output, though +selecting a size that is too large will cause a poor response time and +possible delays in the system when the new buffer is filled. + +This function has no return value (void). + + +License Information and Copyright Notice +======================================== + +PokeySound is Copyright(c) 1996-1998 by Ron Fries + +This library is free software; you can redistribute it and/or modify it under +the terms of version 2 of the GNU Library General Public License as published +by the Free Software Foundation. + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more +details. + +To obtain a copy of the GNU Library General Public License, write to the Free +Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +Any permitted reproduction of these routines, in whole or in part, must bear +this legend. diff --git a/DOC/r_device.txt b/DOC/r_device.txt new file mode 100644 index 0000000..5436eb2 --- /dev/null +++ b/DOC/r_device.txt @@ -0,0 +1,119 @@ +---- about the R: device in Atari800 emulator ---- + +From: Chris Martin + +I have some code that I have integrated into my personal +download of atari800 v1.3.0 for allowing talking to the +Atari800 emulator via R: and network sockets. I have taken +some code released by Tom Hunt and made some bug fixes and a +few minor updates. + +I have tested this both under Solaris and Linux. I have +plans to update the code to allow connections to the host +machine serial ports for talking to a real Modem as well. + +I have tested this with Bobterm and Ice-T. If you need the ATR files for +these programs, let me know. + +Once in Bobterm or Ice-T you can type 'ATDI localhost 23', to telnet. + +I would like to add options for allowing to compile this or not, and +command line args for the connect string and the port number (it accepts +connections on port 9000 now for in coming calls...) + +Best regards, +Chris + +=== + +The basic use of the R: emulation is that it emulates an Atari 850. If +you use the bobterm.atr or the icet.atr disk image to run these terminal +programs, you can telnet to any telnetable Atari BBS in the terminal +screen by typing: + +ATDL +ATDI
+ + +So, basically these two commands have been added on top of the 850 +emulation. The ATDL toggles Line feeds on/off. the ATDI allow you to +telnet out to an atari machine. + +For example, to telnet to my atari BBS to this in Bobterm: + +ATDL +ATDI jybolac.homelinux.com 800 + +You could also to the following, if you are running on your linux/unix box +and want to telnet from atari800: + +ATDL +ATDI localhost + +(Of course, be sure to turn on ASCII translation in the terminal program). + +You can also telnet to atari800 by doing the following at any linux +prompt: + +telnet 9000 + +Also, everything that can be done in the 850 manual as far as XIO commands +are concerned can be done as well. + + + + +To sum up, the R: emulation can be used with terminal programs like +Bobterm and Ice-T, as well as BBS programs like carina and bbs express. + +I have tested it with bobterm, Ice-T and Carina, but not Express, yet. + + + + +Again, feel free to email with any questions, until I can write a full +document/web-page on it. + +Cheers, +Chris + +=== + +> > The basic use of the R: emulation is that it emulates an Atari 850. +> +> What is it? A printer? I never heard about it. + +The 850 interface is an RS232 device, for connecting non-Atari-specific +modems (unlike the SX212, which had an SIO port, so didn't need an 850), +and other 'serial port' devices. (Think COM1, COM2, etc. under MSDOS, +or /dev/ttyS0, /dev/ttyS1, etc. under Linux) + +-bill! + +=== + +It was called an "Interface module". It provided 4 RS-232 serial ports, +one was fully functionaly, the others were stripped down. It also +provided a parallel port. + +> Do you think this can be misused by hackers? Again not joking. We need +> to keep an eye on this. +> + +Anything can be exploited by hackers! :^) However, port 9000 only is +enabled if you run a terminal program, so normal game operation wouldn't +be a problem. Also, I put this at port 9000 so that normally it would be +found, but there are always port sniffers. I would think it would be a +problem only if there was a bug in a buffer overflow and you were running +atari800 as root. But, I know of no problem currently....not saying that +there is no problem. + +So, yes, it could be misused, but only if you are running a terminal +program or a bbs program. ( I cannot say that my code is foolproof :) + +However, the R: device it is normally not on, and can only be turned on +(thus, enabling port 9000), after run a program that calls the XIO +commands for the R: device or you write a basic program that reads/writes +to the R: device. So, normally I would say that it is safe. + +--Chris diff --git a/DOC/rdevice_faq.txt b/DOC/rdevice_faq.txt new file mode 100644 index 0000000..e6df3fa --- /dev/null +++ b/DOC/rdevice_faq.txt @@ -0,0 +1,518 @@ +Atari800 R: Emulation Frequently Asked Questions +------------------------------------------------ + +Chris Martin + + + +1. General Information + +1.1 Q: What is an R: Device? + A: The R: device is typically a handler for an RS-232 serial port. + This serial port can be on an Atari 850, an MIO, Black Box or + P:R:Connection from ICD. Most handlers are the same with + subtle differences. + +1.2 Q: What is the Atari 850? + A: The Atari 850 is a computer peripheral for the Atari 8-bit line + of computers that was released in 1980. + It was called an "Interface module" that connected to the SIO port. + It provided 4 RS-232 serial ports: + one was fully functional (R1:) + and 3 that did not provide all the RS-232 signals (R2:-R4:). + It also provided one parallel port (P1:). + +1.3 Q: What features of the 850 are supported by Atari800? + A: Atari800 support several features of both the 850 hardware and the + R: handler. There are two modes of operation for the R: device + emulation: network sockets or serial port. I will talk more about + this below, but you can either use the host serial ports + (/dev/ttyS* under Linux) or network sockets (ports 9000-9003). + + XIO calls (The following are the BASIC examples): + ------------------------------------------------- + + In each of the XIO calls below, 'channel' specifies the IOCB or + channel number (1-7) and "Rn" specifies the RS-232-C port, + where n = {1-4}. + + - XIO 32 - + + XIO 32, #channel, Aux1, Aux2, "Rn:" + + (Not Implemented) + + - XIO 34 - + + XIO 34, #channel, Aux1, Aux2, "Rn:" + + Aux1 bits do the following: + + Aux1[7] = DTR control enable (active high) + Aux1[6] = Force DTR value + Aux1[5] = RTS control enable (active high) + Aux1[4] = Force RTS value + Aux1[3] = not used + Aux1[2] = not used + Aux1[1] = XMT control enable (active high) + Aux1[0] = Force XMT to SPACE (0) or MARK (1) * Not implemented + + To force DTR off: Aux1 = 128 + To force DTR on: Aux1 = 192 + + Aux2 is unused. + + XIO 34 is really only used if using the serial port on the host, + if you are using network sockets, then changing DTR is the only + operation that you may perform. Turning DTR off, in this case, + will disconnect. + + - XIO 36 - + + XIO 36, #channel, Aux1, Aux2, "Rn:" + + Aux1 select the Baud rate, the Word size and the stop bits. + Add the values listed below to obtain the BASIC number. + + Aux1[3:0] = Baud rate where: + 0 = 300 bps + 1 = 57600 bps (was 45.5 bps in 850 spec) + 2 = 50 bps + 3 = 115200 bps (was 56.875 bps in 850 spec) + 4 = 75 bps + 5 = 110 bps + 6 = 134.5 bps + 7 = 150 bps + 8 = 300 bps + 9 = 600 bps + 10 = 1200 bps + 11 = 1800 bps + 12 = 2400 bps + 13 = 4800 bps + 14 = 9600 bps + 15 = 19200 bps + + Aux1[5:4] = Word size where: + 0 = 8 bits + 1 = 7 bits + 2 = 6 bits + 3 = 5 bits + + Aux1[6] = Select 230400 bps (feature added to Atari800) + + Aux1[7] = Stop bits + 0 = 1 stop bit + 1 = 2 stop bits + + Aux2 specifies whether or not the Interface Module should check + Data Set Ready (DSR), Clear to Send (CTS) and/or Carrier Detect (CD). + This function is currently not supported. + + - XIO 38 - + + XIO 38, #channel, Aux1, Aux2, "Rn:" + + Aux1 Specifies te translation mode, input/output parity modes and + the append Line Feed option. + + Aux1[1:0] = Output Parity (* Not Implemented) + 0 = Do not change parity bit + 1 = Set output parity odd + 2 = Set output parity even + 3 = Set output parity bit to 1 + + Aux1[3:2] = Input Parity + 0 = Ignore and do not change Parity bit (NO PARITY) + 1 = Set Parity to ODD + 2 = Set Parity to EVEN + 3 = Do not use Parity (NO PARITY) + + Aux1[4] = Heavy Translation * Not Implemented + 0 = Light Translation + 1 = Heavy Translation + + Aux1[5] = Translation + 0 = Translation ON + 1 = Translation off + + Aux1[6] = Line Feeds + 0 = Do not append LF + 1 = Append LF after Carriage Return + + Aux1[7] = Not Used + + Aux2 is the numeric representation of the "won't translate" character + for heavy translation. (Not currently supported.) + + - XIO 40 - + + XIO 40, #channel, Aux1, Aux2, "Rn:" + + XIO 40 starts concurrent I/O Mode. + + Both Aux1 and Aux2 are used to specify an output buffer, but using + the specified input buffer is not currently supported. The default + 256 byte internal buffer is use when both Aux1 and Aux2 = 0. + + However, since using a different buffer is not supported, the + setting Aux1 or Aux2 to any value will not affect how this works. + + Other BASIC commands: + --------------------- + OPEN #Channel, Aux1, Aux2, "Rn:" + + Aux1 specifies the direction of the port. + Aux1[7:4] = NOT USED. + Aux1[3] = Specifies Output when high. + Aux1[2] = Specifies Input when high. + Aux1[1] = NOT USED. + Aux1[0] = Specifies Concurrent I/O mode. + + Aux2 is not used. + + CLOSE #Channel + + Closes the Serial port or the network connection. + + GET, INPUT, PUT and PRINT - Use as normal + + STATUS #Channel, AVAR + + The STATUS command will update the memory locations 746-749. + Please read the meaning of these locations below. + + AVAR is a variable that receives the status returned for the STATUS + call itself. This number will be the same as the ERROR code. + + Atari Memory Address Locations: + ------------------------------- + + The following locations will be updated after a STATUS call (after + the STATUS function/routine runs). + + 0x2ea (746) - Error flags (* Not Implemented) + bit[7] = Received Data Framing Error + bit[6] = Received Data Byte Overrun Error + bit[5] = Received Data Parity Error + bit[4] = Received Data Buffer Overflow error + bit[3] = Illegal Option Combination Attempted + bit[2] = External Device Not Fully Ready Flag + bit[1] = Error On Block Data Transfer Out + bit[0] = Error On Command To Interface Module + + 0x2eb (747) - Concurrent I/O Mode: + Number of Characters in Input buffer (Low Byte) + + Non-Concurrent I/O Mode: (* Not Implemented) + bit[7] = Data Set Ready (DSR) status during current + STATUS command. 0=DSR is low; 1=DSR is hi. + bit[6] = DSR status during last STATUS command. + bit[5] = Clear to Send (CTS) status during current + STATUS command. 0=CTS is low; 1=CTS is hi. + bit[4] = CTS status during last STATUS command. + bit[3] = CARRIER DETECT (CD) status during current + STATUS command. 0=CD is low; 1=CD is high. + bit[2] = CD status during last STATUS command. + bit[1] = NOT USED. + bit[0] = Data Receive (RCV) current status. + 1 = MARK (1) + 0 = SPACE (0) + + 0x2ec (748) - Concurrent I/O Mode: + Number of Characters in Input buffer (High Byte) + This is always zero in Atari800 since the input + buffer is only 256 bytes. + + Non-Concurrent I/O Mode: + Always zero. + + 0x2ed (749) - Concurrent I/O Mode: + Number of Character in Output Buffer. + This is always zero in Atari800 since we always + output the character, so a write of more than + one character will not work. + + Non-Concurrent I/O Mode: + Always Zero. + +1.4 Q: What features of the 850 are not currently supported by Atari800? + A: + + 1. Cannot set RTS or XMT in XIO 34. + 2. Cannot select 45.5 bps or 56.875 bps in XIO 36. + 3. Cannot monitor DSR, CTS or CD in XIO 36. + 4. Heavy ASCII/ATASCII translation. + 5. Early force of short I/O block (XIO 32). This forces the output + buffer to be sent, but it is not currently implement as we now + always send after a write. + 6. Cannot set output parity with XIO 38. The Output parity is set the + same as the input parity. + 7. Using a different input buffer, as specified by XIO 40 is not supported. + I am not sure anyone ever used this anyway... + 8. Not all functions return an error code if something fails. + Most of the functions should return an error to regY. + 9. Error bits at location 746 are not implemented. + 10. Although you can access each serial port or talk to the network to + a different socket, you cannot have more than one R: device + open at a time. For example, you cannot open R1: and R2: and expect + things to behave sanely. The reason for this is that currently + there is only one buffer for ALL serial ports. + 11. Error reporting to address 747 during non-concurrent mode has + not been implemented. In fact non-concurrent mode has not been + tested! I invite you to test it and let me know!!! + + +1.5 Q: Is there a version of the 850 Operator's Manual On-line? + A: I am currently working on scanning the original Document. See below + in the links section. + +1.6 Q: Do you have some example code? + A: Yes. Below are several BASIC programs taken from the 850 Operator's + Manual. Also included is a C program written by Christian Groessler + using the rs232 library for cc65 (www.cc65.org). + +------------------------------------------------ +RECEIVE PROGRAM +------------------------------------------------ + +110 DIM INLINE$(255) +200 REM +201 REM ========== +202 REM +210 LET TRANSLATE=32:REM [Full ATASCII] +220 XIO 38,#1,TRANSLATE,0,"R1:" +230 REM +240 PRINT "Receive file's full name"; +250 INPUT INLINE$ +260 OPEN #2,8.0,INLINE$ +270 REM +280 OPEN #1,13,0,"R1:" +290 XIO 40,#1,0,0,"R1:":REM [Start I/0] +500 REM +501 REM ========== +502 REM +510 FOR ETERNITY=1 TO 2 STEP 0 +520 REM +530 INPUT #1;INLINE$:REM [Get line] +540 CLOSE #1:REM [Stop I/O] +550 REM +560 IF INLINE$="EOF EOF EOF" THEN 900 +570 REM +580 PRINT #2; INLINE$:REM [Save line] +590 PRINT INLINE$:REM [Echo onscreen] +600 REM +610 OPEN #1,13,0,"R1:" +620 XIO 40,#1,0,0,"R1:":REM [Start I/O] +630 PRINT #1:REM [Send reply] +640 REM +650 NEXT ETERNITY +900 REM +901 REM ========== +902 REM +910 CLOSE #2:REM [EOF received] +999 END + +------------------------------------------------ +SEND PROGRAM +------------------------------------------------ + +110 DIM OUTLINE$(255) +200 REM +201 REM ========== +202 REM +210 LET TRANSLATE=32:REM [Full ATASCII] +220 XIO 38,#2,TRANSLATE,0,"Rl:" +230 REM +240 PRINT "Send file's full name"; +250 INPUT OUTLINE$ +260 OPEN #1,4,0,OUTLINE$ +500 REM +501 REM ========== +502 REM +510 FOR ETERNITY=1 TO 2 STEP 0 +520 REM +530 TRAP 900:REM [Trap end file #1] +540 INPUT #1, OUTLINE$:REM [Get line] +550 PRINT OUTLINE$:REM [Echo onscreen] +560 REM +570 OPEN #2,13,0,"Rl:" +580 XIO 40,#2,0,0,"Rl":REM [Start I/O] +590 PRINT #2;OUTLINE$:REM [Send line] +600 INPUT #2;OUTLINE$:REM [Get reply] +610 CLOSE #2:REM [Stop I/O] +620 REM +630 NEXT ETERNITY +900 REM +901 REM ========== +902 REM +910 OPEN #2,8,0,"Rl:":REM [Send EOF] +920 PRINT #2;"EOF EOF EOF" +930 CLOSE #2:CLOSE #1:REM [All done] +999 END + + +------------------------------------------------ +rs232t.c +------------------------------------------------ + +/* $Id: rdevice_faq.txt,v 1.1 2003/09/16 21:58:08 joy Exp $ + * + * RS232 library test + * (c) by Christian Groessler, chris@groessler.org + */ + +#include +#include +#include +#include <6502.h> +#include +#include +#include + +void main(void) +{ + char err; + unsigned char c, baud, t; + + do { + printf("\n"); + printf("0 = 300baud\n"); + printf("1 = 1200baud\n"); + printf("2 = 2400baud\n"); + printf("3 = 4800baud\n"); + printf("4 = 9600baud\n"); + printf("Enter type (0-4): "); + c = cgetc(); + printf("%c\n",c); + } while (c < '0' || c > '4'); + t = c - '0'; + switch (t) { + case 0: baud = RS_BAUD_300; break; + case 1: baud = RS_BAUD_1200; break; + case 2: baud = RS_BAUD_2400; break; + case 3: baud = RS_BAUD_4800; break; + case 4: baud = RS_BAUD_9600; break; + } + + err = rs232_init(0); + printf("rs232_init: %d\n", err); + err = rs232_params(baud | RS_BITS_8 | RS_STOP_1, RS_PAR_NONE); + printf("rs232_params: %d\n", err); + + printf("waiting for stuff to arrive...\n"); + + /* display all received chars, + * send all typed chars to the other end, + * type ESC to exit + */ + while(1) { + if (kbhit()) { + c = cgetc(); + if (c == CH_ESC) break; + else rs232_put(c); + } + if (rs232_get(&c) != RS_ERR_NO_DATA) cputc(c); + } + + rs232_done(); +} + +------------------------------------------------ +1.7 Q: What Atari programs use the R: device? + A: + Terminal programs: Bobterm, Ice-T, etc. + BBS programs: Express, Carina, etc. + Some Games: I know I saw a Modem Chess game back in the day. + I will have to find the ATR image of this. + + +1.8 Q: How does the Serial Port Version work? + A: Basically, in this mode, when you open R1: under Atari800, you will + open the first serial port on the host computer. Under Linux, this + will be /dev/ttyS0. Opening R2: will open /dev/ttyS1 and so on. + When you control the baud rate, parity, stop bits (with XIO 36), you + will control the host serial port. The same will all the other + configuration options, this will set those options on the host + serial port. This mode can be used to connect to a real MODEM, or + to use a null-modem cable to connect to you Linux host. The + null-modem could be used to run SLIP(Linux) and Contiki on Atari800. + + The R: device emulation will take care of adding Line Feeds and + Light ASCII translation. + +1.9 Q: How does the Network Sockets version work? + A: This mode works similarly to the Serial Port Version, except that + instead of connecting to the host serial ports you will connect + to a network socket. All configuration such as baud rate, parity + et cetera will be ignored, since these mean nothing in this mode. + + Opening an R: device will open a network socket and allow other users + to "telnet" into Atari800. For example, if you open R1:, port 9000 + will accept connections from other hosts (or the local host). R2: will + accept connections on 9001, and so on. Only one of these can + currently be opened at one time. (I may add support for + multiple R: devices later.) Allow others to connect to your + emulated Atari can be used to run an emulated BBS or to potentially + run a web server from Atari800. + + Also included with the Network Sockets version of the R: Device + emulation is a somewhat handicapped Modem emulation. There are + only two commands that are implemented: + + ATDL - Translates carrage returns into line feeds. + This may not be needed if the "add line feeds" in XIO 38 + is used. But I found that it is not always used by terminal + programs, and thus some telnet and ftp servers expect + a line feed, causing you to not be able to do anything + once connected. + + Typing 'ATDL' in a terminal program such as Bobterm or Ice-T + will toggle CR translation on/off. + + ATDI
+ + This command allows you to "dial" out to an external host. + For example you can connect to my BBS by typing the following: + 'ATDI jybolac.homelinux.com 800' + + This connects Atari800 to the external host + 'jybolac.homelinux.com' at port 800. + + These commands were chosen to somewhat look like modem 'AT' commands. + + The R: device emulation will take care of adding Line Feeds and + Light ASCII translation, same as in the Serial Port Version. + + +1.10 Q: Who wrote the R: Device Emulation? + A: Tom Hunt wrote the original network sockets version. I, Chris Martin, + updated that code, added the simple modem emulation and added code + to access the serial ports on the host computer via the R: device. I + also added ASCII/ATASCII translation. + +1.11 Q: Do you have any URLs for more information? + A: Sure! + + I am working on scanning and placing the Atari 850 Operator's Manual + online here: + http://jybolac.virtualave.net/atari/850man/ + + The MIO documentation has some great info that still applies to + the 850: + http://www.1000bit.net/support/manuali/atari/pdf/icd_mio.pdf + + The Black-Box Documentation has some great info on the 850 as well: + http://nleaudio.com/css/products/BB_Docs.htm + + Some Atari Magazine Articles: + http://www.atarimagazines.com/creative/v9n6/177_A_letter_quality_alternat.php + + The JL-BASIC Manual: + http://www.jeff-jackson.com/Atari/JLS_Manual.html + + Mapping the Atari will show some information about some R:-related + addresses (746-747) and IOCB: + http://www.atariarchives.org/mapping/memorymap.php + + + diff --git a/DOC/readme.html.in b/DOC/readme.html.in new file mode 100644 index 0000000..302c476 --- /dev/null +++ b/DOC/readme.html.in @@ -0,0 +1,143 @@ + + + +Atari800 emulator readme + + + + +

+Atari800 emulator version $A800VERSION +

+ +

Table Of Contents:

+ + +
  • INTRODUCTION +
  • INSTALLATION +
  • KEYS +
  • RUNNING ATARI800 +
  • REPORTING BUGS +
  • COPYRIGHT +
  • CONTACT +
  • + + + +

    INTRODUCTION

    +This is the version $A800VERSION of Atari800 for MS Windows. +Atari800 is a free (you don't pay for it, you can get source code and you are +welcome to develop it) and portable (can run on many weird machines +and different operating systems) emulator of Atari 8-bit computer systems and +the 5200 console, developed by
    many people under the GPL. More information you find +in the README file. + + +

    INSTALLATION

    +To install this Atari800 package you will need the following: +
    +
  • Windows 9x
    +
  • DirectX
    +
  • Atari 800 ROM files (see INSTALL file for more info)
    +
  • Seperate folder to put the emulator and ROM files in
    +
  • + +Extract Atari800 zip file to destination folder and copy ROM files to the same +folder. +Run atari800 and you will be prompted for several config values, if you don't +know the correct value just press Enter. + + +

    KEYS

    + +
  • F1 Menu (built in User Interface) +
  • F2 Option +
  • F3 Select +
  • F4 Start +
  • F5 Warm Reset +
  • Shft+F5 Cold Reset +
  • F8 Monitor +
  • F9 Exit Emulator +
  • F10 Screenshot +
  • F11 Change autofire mode +
  • + +Joystick 0 is operated by the numeric keypad:
    + +
  • 7 - forward/left +
  • 8 - forward +
  • 9 - forward/right +
  • 4 - left +
  • 6 - right +
  • 1 - back/left +
  • 2 - back +
  • 3 - back/right +
  • 0 - fire key +
  • + +
    +

    RUNNING ATARI800

    +You can use some command line parameters to atari800. +To add command line parameter create a shortcut to atari800 and append them +to Properties/Shortcut/Target window.
    +If you need '-mouse pad' option you should have something like:
    +"C:\Program Files\Atari800\Atari800.exe -mouse pad"
    + +Available command line options are: (see
    USAGE for more) + + +$HELPMENU + + + + +

    REPORTING BUGS

    +If you have a problem running this emulator please read
    FAQ first.
    +Look at BUGS first to not report same bug hundred times, please.
    +If the problem persists you can contact Atari800 developers at + +atari800-users mailing list +or you can use +sourceforge.net interface. + + +

    COPYRIGHT

    +
    + Copyright © 1995 + David Firth.
    + Copyright © 2002 + + Atari800 development team +
    +
    + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. +
    +
    + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. +
    +
    + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +
    + +See COPYING file for details.

    +All trademarks are the property of their respective companies. + + +

    CONTACT

    +Atari800 Windows port maintainer: +
    Krzysztof Nikiel
    +You can find more info at +Atari800 home page.
    +
    +
    Page by Krzysztof Nikiel
    + + + diff --git a/DOC/trainer.txt b/DOC/trainer.txt new file mode 100644 index 0000000..6f9dbb7 --- /dev/null +++ b/DOC/trainer.txt @@ -0,0 +1,18 @@ +Trainer searcher +================ +The trainer searcher is a set of four commands (TSS, TSC, TSN and TSP) to find interesting ram addresses. + +You have two options of either a conventional trainer or of a deep trainer, but in either case you will have to put the game into a state first where the lifes are being displayed (means: starting a trainer search for lifes in the title screen yields an unreliable result). + +In both trainers, TSS serves to break an old search and initialize a new one by copying the currently active Atari800 memory to a shadow buffer and setting a flag for each storage cell to "could be a desired location". +When giving a number as argument to TSS, then for all memory locations which do not match the number the flag will be set to "is not a desired location". In the process also the other commands TSC and TSN will sort out memory adresses whose values do not satisfy the requirements of the commands. + +In a normal trainer, just create with the current number of your lifes as parameter the command TSS , then change your lives and use then with the changed value TSC (TSN does here the same). Print the possible addresses with TSP and look if there are few enough. TSP defaults to a list of the first 64 adresses to print, but may be adapted to your needs by an argument of the maximum count of addresses to print. If there are still more possible life-addresses left than you want to scan manually, repeat losing or gaining a life and executing the TSC afterwards. E.g. Jet Set Willy fits in this category. + +In a deep trainer you have no clue what the trainer value might be, although it has one commonality - the effect uses one memory location. +So start the trainer with TSS (without any number as you dont know it), run around a bit, and lets say you have still all lifes. So you should choose TSN now, return to the game, then lose a life and use TSC, and so on. Alternating use of TSC and TSN yields the best results. Like in the normal trainer, TSP prints a maximum number of possible candidates. Save a state of the game, change one candidate and look what happens. If it has not been the life counter you hoped for load the saved state and change the value of the next address. E.g. the life counter address of Domain of the Undead can only be found by a deep trainer search. + +The search goes through the currently active memory layout of the Atari800. It does not switch ram banks on its own. So if you presume that a trainer address lies not in the currently active memory layout you must switch the memory banks by their respective control adresses before using the trainer searcher commands (and of course, before continuing the game, switch back to the memory banks the running program expects!). + +It is on purpose that the trainer searcher state is not influenced by resets as there are some very changelling searches which require resets (like e.g. the search for the treasure finding ability of Alternate Reality). + diff --git a/README.1ST b/README.1ST new file mode 100644 index 0000000..91fc9d3 --- /dev/null +++ b/README.1ST @@ -0,0 +1,34 @@ +Atari800 emulator version 3.1.0 +------------------------------- + +This is free and portable Atari 8-bit computer and 5200 console emulator, +originally written by David Firth and now developed by the Atari800 +Development Team (please see DOC/CREDITS). This program is copyrighted and +released under the GPL (see COPYING). + +Please read DOC/README, DOC/INSTALL and DOC/USAGE. + +For news in this release please do read DOC/NEWS. + +If you have a problem running this emulator please read DOC/FAQ first. +If the problem persists then please ask in newsgroup comp.sys.atari.8bit +or in the atari800-users mailing list (see below). + +Look at DOC/BUGS before reporting something you consider a bug. + +If you want to help developing Atari800 emulator you can subscribe to our +mailing list (http://lists.sourceforge.net/lists/listinfo/atari800-users). +DOC/TODO might point you in the right direction. + +This version, and all versions back to 0.8.2 have been released by me (Petr +Stehlik) and are now available at Sourceforge.net (URL below). Thanks +go to David Firth and all the people that helped making this release. + +EnJoy! + +Petr Stehlik +April 12, 2014 + +E-mail: pstehlik@sophics.cz + +Project homepage: http://atari800.sourceforge.net/ diff --git a/act/Real.act b/act/Real.act new file mode 100644 index 0000000000000000000000000000000000000000..e36ffd72948787642103dd4e0883b5057d42aa32 GIT binary patch literal 768 zcmV+b1ONOoF)}|sKTS+cTU%RdX=-_Rd5DLImzS5JprNm?ufD#%&dtu-+uQ5v>-zfo z|NsACE&yyh0D4LQh*$uWXAGrw8?uBd!IV16okQBKQ|P;5_{(zt*nj`%kN@|d|NpLR zBmj3X0E9pTl1>qxT_Ue+F}!<0%!*LelUwAYY4Wjo|H6s?&zJw-rvL4=|NX>u78rpe zB#$vPoj^mXPEfdBV8(54)qQ{7hllNzmi(lp|FpIL!o>g4)BoV%|L^c(4smW9e0wU2 ziaD5;N2R4#wXFSsF`K$v< zNV=O?$Ej!4xOe5kfbGzb{NJDd?yvv+z5oBr|NqZWpFKpaOH;a8VaI51)pvg4 zhmP`)m-?2b|E{(Fzr_E|(*N4y|LXDo`u_h9HG~{NjVw@`I$o+sY`0i@#b=7rcA4UU zqU(>c`JTZ4ti_=)KX4ICc_CSdFKCuNb)-#$vRsnEY@yP0tJ#CP z=ab3yqS*hj=KsL;|Iq*c-v9pqSr`CiCJ%Bo9f3qFj!-+DU`niSS-XB?#D{XzmV)A? zlJT{l{==^S(!T%V&j0ZTTmTek03vk&GJ^m=kqb|t8(yv|ZoNBq#zcqJQ z|NoUsJOEfp0A*JIbY%d6bO4Zp2cMA^uAwHksxHU6KGnxf<=0*EHL{^Q$?OJz7aBw$HsQZPP_0B*c zWlzRqE>a;gss59d!b;Uj5w$j}p*tu%Xq;lBN=aV(UqdF@9LV z_mBGoy*Y&R6|oeFypUC;NUge74c$6!ZLo8J6=~;8cgWsrkA8o9j$ShRXbE!`l{~=$ zHU9<*4{L2$;NXEnD27WDur}gd NA_gSKT+%`<JmA+Z7x|jl4xFPlZ)M{<2r6!#dcJha9+aHc{`z6 zVWD&?9isAh%X6m)daG3bhs0L<{Pa2(4? zKncOef|SVEQpsdI;#l|cY^P$ak;Xu-9ZL3~frTy~bP3QMhxeJ7t|s_XNf#}Rn&{MC z8;fx}n%bSU5*)TF6hah_OBa!!kBXa6)T5;hJ%a=?ImX>IF2Oc2XLqjL*?`B; zsPE_RydMjZi)(RMll(>IAKdthJ0Lia#GV_{1;zy;W_Z0i#|)Lx4ob0)GVjRnEuQKDU)>&suCsWPgtta)?1oI`dx3a_EG1oGQ>*np=`(eXlyzAK#0x!| z#}M@(cLYVFC?7}TG+xeXIeF=_gLS=y>$wsWkLx!6m3vPp+#}k;gi2BDq$F`MJ!K^? z6UAk?TaU*C11`lV)L?Urk!h;2xy-~uZboaNGWslRRNH;09pmRclYbwT;$#^lO(-Lf zxEskKoAl0X(N8j?WKlPiTW)Nm`@OQtP}%0sGE0|t)~s@$;A9`-$B;(Qbu-pKxYf{~ z<`~HcI%h4AGNWYM_D_9t{iWgmK`O!1QkQQ<7BMM#98(3)syTY+^CV~G aRnA0__gq!ray@_bNd!8h(4ByODd8VozmCNNyrBba{0|+oCkrpJ$f#kSrJ@D6i9AVm=Xw{SL^rqPJeO1txrs$RK6b$8I zsuT+~SZiLaZ&UycKqoK=Ou$=%9kPcTYh0UV(U$MfSLQxi z=ReaPvDlxuI+l%(#rR%@wI-k&7y_nXyOZZ?An-jT3bU2OyUH?r6@_6cUi^k21ENAm zc#sL85J4ruh73@^(11rdB%s=gXs!~vuZ$685wHA$~5J;Xb+vp(dGemPP4~ z6$Ks*<$;~`QG*@H69c((<0ZdltFhFA_1;bItw}<3x5t|7O|v|Z?|8J#<3wGccY9Pw ze{$?tZraC^{O{FeYb|x?ZO3pwrpZ~NeUa#2C1y9ZtncVKKQ#4vVio+%DdweT>f0dp zr)chvl-hrJZ7A(S%_v%R&Jd#jVjfBCl89Rl@q3^h{#ZYu*(|fiy6BB_#e1)YFTtHF zF@s2*0DBHxiZh{l5n3>z#}Gy;VY0WdxH~wt`}l1Kg?-1wqbH>^=j4l*l&ja&xCPvG wu_Qi@B-De%1(NhAQjn}&o~vJ9V%AY@J<#Gj-s?3x9K19gv;H*|f7k%`KT?#pnE(I) literal 0 HcmV?d00001 diff --git a/atari800.spec b/atari800.spec new file mode 100644 index 0000000..c9355a7 --- /dev/null +++ b/atari800.spec @@ -0,0 +1,254 @@ +# generic defines used by all distributions. +# +%define ver 3.1.0 +# When adding a target, add an $options_ variable to the %build +# section, and add %{_bindir}/%{name}- to the files list in the +# %files section. +%define targets sdl +%define maintarget sdl + +%define myrelease 1 +%define mybuild 1 +%define _rel %{myrelease}.%{mybuild} + +# define the package groups. If they all followed the same naming convention, +# these would be the same. They don't, and so they aren't :( +# +%define suse_group System/Emulators/Other +%define mandriva_group Console/Emulators +%define fedora_group Console/Emulators + +# defaults +# +%define group Console/Emulators +%define rel %{_rel} + +%define my_suse 0 +%define my_mandriva 0 +%define my_fedora 0 +%define my_centos 0 + + +%if 0%{?suse_version:1}%{?sles_version:1} +%define my_suse 1 +%endif + +# if present, use %distversion to find out which Mandriva version is being built +# +%if 0%{?distversion:1} +%if 0%{?!mandriva_version:1} +%define mandriva_version %(echo $[%{distversion}/10]) +%endif + +%endif + +%if 0%{?mandriva_version:1} +%define my_mandriva 1 +%define my_vendor mandriva +%endif + +# if present, decode %dist to find out which OS package is being built on +# +%if 0%{?dist:1} + +# Centos or Fedora +# +%define my_which_os %(i=%{dist} ; if [ "${i::3}" == ".fc" ] ; then echo "1" ; else echo "0" ; fi ) + +%if %{my_which_os} + +%if 0%{?!fedora_version:1} +%define fedora_version %(i=%{dist} ; echo "${i:3}" ) +%endif + +%else + +%if 0%{?!centos_version:1} +%define centos_version %(i=%{dist} ; echo "${i:3}00" ) +%endif + +%endif + +%endif + +%if 0%{?fedora_version:1} +%define my_fedora 1 +%define my_vendor fedora +%endif + +%if 0%{?centos_version:1} +%define my_centos 1 +%define my_vendor centos +%endif + + +%if %{my_suse} + +%if %{suse_version} +%define rel %{myrelease}.suse%(echo $[%suse_version/10]).%{mybuild} +%else +%define rel %{myrelease}.sles%{sles_version}.%{mybuild} +%endif + +%define group %{suse_group} + +%endif + + +# building on a Mandriva/Mandrake Linux system. +# +# this should create a release that conforms to the Mandriva naming conventions. +# +%if %{my_mandriva} + +%define rel %{myrelease}.mdv%{mandriva_version}.%{mybuild} + +%define group %{mandriva_group} + +%endif + + +# building on a Fedora Core Linux system. +# +# this should create a release that conforms to the Fedora naming conventions. +# +%if %{my_fedora} + +%if 0%{?!fedora_version:1} +%define fedora_version %(i="%dist" ; echo "${i:3}") +%endif + +%if 0%{?!dist:1} +%define dist .fc%{fedora_version} +%endif + +%define rel %{myrelease}%{dist}.%{mybuild} +%define group %{fedora_group} + +%endif + + +# building on a Centos Linux system. +# +# this should create a release that conforms to the Centos naming conventions. +# +%if %{my_centos} + +%if 0%{?!centos_version:1} +%define centos_version %(i="%dist" ; echo "${i:3}") +%endif + +%if 0%{?!dist:1} +%define dist .el%{centos_version} +%endif + +%define rel %{myrelease}%{dist}.%{mybuild} +%define group %{fedora_group} + +%endif + + +%if %{my_suse} +Requires: SDL >= 1.2.10 +BuildRequires: SDL-devel >= 1.2.10 +%endif + +%if %{my_mandriva} +Requires: libSDL >= 1.2.10 +BuildRequires: libSDL-devel >= 1.2.10 +%endif + +%if %{my_fedora} +Requires: SDL >= 1.2.10 +BuildRequires: SDL-devel >= 1.2.10 +%endif + + +# Now for the meat of the spec file +# +Name: atari800 +Version: %{ver} +Summary: An emulator of 8-bit Atari personal computers +License: GPLv2 +URL: http://atari800.sourceforge.net/ +Source: http://prdownloads.sourceforge.net/atari800/%{name}-%{version}.tar.gz +Group: %{group} +Release: %{rel} +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot +BuildRequires: zlib-devel +BuildRequires: libpng-devel +BuildRequires: readline-devel + + +%description +Atari800 is an emulator for Atari 8-bit computer systems including the 400, +800, 1200XL, 600XL, 800XL, 65XE, 130XE, 800XE and the XE Game System, and also +for the Atari 5200 SuperSystem console. It can be used on console, FrameBuffer +or X11. It features excellent compatibility, HIFI sound support, artifacting +emulation, precise cycle-exact ANTIC/GTIA emulation and more. + +Authors: +David Firth +and Atari800 Development Team (see CREDITS for a full list) + + +%prep +%setup -q -n %{name}-%{version} + + +%build +options_sdl="--with-video=sdl --with-sound=sdl" +#options_ncurses="--with-video=ncurses --with-sound=oss" +#options_x11="--target=x11 --with-sound=oss" + +cd src +for target in %{targets} +do + %configure `eval echo \\\$options_${target}` + %{__make} %{?jobs:-j%jobs} + mv atari800 atari800-${target} + %{__make} clean +done +touch atari800 + + +%install +cd src +mkdir -p %{buildroot}/%{_bindir} +mkdir -p %{buildroot}/%{_mandir}/man1 +for target in %{targets} +do + install -m 755 atari800-$target %{buildroot}/%{_bindir} +done +( + cd %{buildroot}/%{_bindir} + ln -sf %{name}-%{maintarget} %{name} +) + +mv %{name}.man %{name}.1 + +install -m 644 %{name}.1 %{buildroot}/%{_mandir}/man1/ + + +%files +%defattr(-,root,root) +%{_bindir}/%{name} +%{_bindir}/%{name}-%{maintarget} +%{_mandir}/man1/%{name}.1.* +%doc COPYING +%doc README.1ST +%doc DOC/BUGS +%doc DOC/ChangeLog +%doc DOC/CREDITS +%doc DOC/FAQ +%doc DOC/INSTALL +%doc DOC/NEWS +%doc DOC/PORTING +%doc DOC/README +%doc DOC/TODO +%doc DOC/USAGE + + +%clean +%{__rm} -rf %{buildroot} +%{__rm} -rf %{_builddir}/%{name}-%{version}-%{release}-buildroot diff --git a/data/atari2.png b/data/atari2.png new file mode 100644 index 0000000000000000000000000000000000000000..5c46e7339fe1adfc54e5f53dd5af765dccd49968 GIT binary patch literal 8267 zcmXwe2RK{r`~C@15pBhYQEGG$t7h#PYSpU7-V~+wrbZgE)hKH3O;OZVbSSMFr5c-3 zqExl^NacS%-~aVHS5D5AGv4dX`#jHm-_L#G4fQoI!LPsp0Jx;BrEUZsvH$I`3*h%V zCHrCUK;?(l#=yWW4E7)n{7vJnW$p*wPxx<#piz0j;7KKTB?WBIasTid})c}|O#+YTcUNmc}11K?dQwrF=l-_Y= zx_*7x0Run*vP{a6aItXg?TP;`Z2_sB+Prw`bC%5{Z#w($X$@l_B|vU4Asl^>JQ7WZj<#u~iUPn>W^}hC6>TRxc4MLy~jdXZkpm?Y%z@=Dk9yx$?5 zv)hNM{ZS@Q#4hOY13#qvQY_=IRsn^?nYy|jB!5u_#l}Ptq+s9RlLs!?k-if=!-xXyXGR~tO(ItUEFx9OJ`>WiU(gI zAF_{H8^gCJoD1K`G_5jW5v8yo_B%KMavlVRKQx|5R=Wdr$-8er(TKT-hLN>`gE zGyGOpHDL?5_U`rrakhuKmG8+J6FlcExXZ~$3I-<;FrLx#e`mJlR#xs=!)teRe!9ST zlqp}<0rrMXK>nUhy~!SwL6R`z&YUEMK#zO2YkuxdlEeV>ao1M*Ss#s!j97R4JDk&Q zGPAmYpBJ{42S_?==1G+D`Vfo|0PtlOjjj1cbUc4g_C;-U-Lj~E&VYn%K5W$(hDhqw zjg5`j%J}|>%N$-~hVk$zjIsMDQBODPt|Z?FfWM6_z=!N%)+mp;^Srr-k`B?F7oqG= zV|-Dpf3QlfL*KF9*N5&bbRR9ud3M*AZJqL&eruo-D)I%t845%6~&G* zpmCX>WJga3kg(Sl^}Pw_7c$9V>z{MBTno$k|F^&hCBX6GNf>96nD^+tMuH|vE32&VT-N1%exA+Z$N_(&hDRNR z!r%9dU6roL(UXb!`FR$|ueoImwa~Dfo%!?CuHR$3Ct>ME3Fwk#c?)}z$o2G($7s_M ziX1W{T)o6Kw=oQ@UHT#6#0i1!2|qjh7v|&R<1|*N7)!%L8`W5nA5+Xe8Y1t$DC*ux zk*^%7)ZNy0C=1+8Y7+4t9Wl>AvbqJHxLZi%;b;21<~x4SYcK;=L0cR1 zCPzZ7;9ehxs=7IS$P-jD{K5D5zZnyY;8dgE#nMR+ukBJ)><9nxGg{=9sq($%I*eQf zY5DY>LsJKsppRe1Za4?OR$tHD3%l#79 zE6p=6IwF*rnEaqbW)j_gSzLLw3Ue2_zCSLKL8Ugj+@l4s_qLWct()S^EhzX`M@fA- z-^$jOB~Mr_?c;;g;e&-Z&-TR3%uH^s%O2aGh4TP=uIvkFCb&%#M{KrnE>*dUx z#3D@^YdlUHdaXH%wWkV}SZtFTm-n86>dQk(IZ&#U^tA{LN3vViGdEZ#HWb)_0EIf{ zD7dljE+zjTlt5{C)G#0gypbK8ot<@SGW(G+!5`97>8eKJ(uA(eItd^mB|ZrNy>~h~ z!-4Ah^^?XXQ39?kZ^ZeSJL+?=X>8Ty zPs1W&qh2>95WXg88B@RHom7|yRp+p?)BP*is$GS zipAJ8W|=wj691($sPFFJE|=o-=BN!zuwhDGl6iW4Z+S0*to?k->;0FX{zkDl_GR(` zxDg`$Cfd#io$RhnKYG+YXKnxX9sX8^hzF)$Hifar@D%g3!BdBJ{GsIR32DRGcCPK8 zzXt=7O6|?TL4ebFRxM768?T@V3%St0C(`rhEdj=J#6MrgJntj4=uZf6OfyRST5WBxrHk5mh79WRKZFUk1 z?_w4qlClEc9DF7l+V@naj}dPYixzsA{;Y{a=3G?_^_Q$*R_U}F)iW@N@=FFM)Yl__ zQJ|z)g_TS<(M`@m?0#0+5LpUZ3NK*{F02|1`95*m2~7Jwc1@^*D*wmt>1T-d$8hOJ z3J&=|-Jh3gr`#_6^?u78i`x#A7h}qhj?=;XiNud{g>LXvNHt~{Rcxgs+)ziM@;f@J zRjj%ZUBnQz_4|UUET*{v4#MpO`wba= zDS~!Mal_Wj?ek;-LcqPcseaiV$T2N2Msd8VQ{fvTL1=V?=uS%hp!iaL=~}6r>a_%KLBO-%&Ghti@SEtwG0IeD32p5jA#t_J%QTG z?p2c|QIRRIyTK>5814?`1hSftTJ3WY%UU4D9(4xXbGkR<{;lx~n7z&8PNXfJid_=# zt=mijJVHF>#E?RIrX(2jjweq%dF@3pF{J5lq+KCKe1QQPeEPF0rK6!+Qd&A_)+fKH zp`pPUgiC8*o~nxs9d~7|=iFLL@t6CT#)`5%7hz1o*eKO5OFRw-$B{$?@2A2sZ8;zJ zv@Sc;{(~^y$F{hPEe^0+uH+Y8@Qx)@-@YUvA+elKZk}>`-O}9b`+2X2?W841OrUW- z-dh+RV}D$-T--W5-KPH$6tP_m@^8N&Y1Qwcze;*&ZK&Gv2>B-=x)cKE!T?`TEl^)T z+m>cTNdC5`N3RPH=h6x8++uk#%_~hnq>%EHB}VGuCwu5E-JrQBEhK%Z!_% zR51BL3E$1Q3uLYtQ`T5L{{G$FW+{1jOUO%g*vYku{p$%i;%sVb3r{sx>ov;KXj@jm z%r$`WVW4^sg6b2Xc1Z^~$BXY+SIBmSDm`CTme8s|E9NEU(nX-=@++NsfH+n(_RXzz z3GxzL#v>?jU%TiY_CLPlXHI;Sqw5Tb+Vw`q2nIc?R>9*IJcH!JfvnVs`r_cn-3y)$ z#;HR4uP}%qq;4|B^QhXI_w}qFO384uG@{llwjPhzL<}vg*Lrb!V0E{>D}+7D_JI2E4^18@^CJzX)VO7nIgO^AtlUz33Z61YKTL4jN#{iT9{B|9_e6F1)i|_f5Bcp1TH%gz3@ca#7 zi}~I<=TV`A2S~GTWvK7jATMe_c}yPo8o$Y{s5Q7DD*zmM6TBs=Cv9%bl2tO!%@7?@Q-6;Zh9TW{5X zj9%tVF2}rFm6=;%@R^vr^%bYNcRW}4(mHwTgm{bu}~KxwKD_~&$(`}ca% zROyFXON!`r`*irT^Wh-h6lrw_AZb&F*Q%>se)-EeZmV(l$Z323`Vj^g(_)`6^2R=b zBy;{#!IF&wp&w;~Ts>`SFubLJ05g~k{%_lIXop7ltO5GlU>S{FNT!Z}P=) z4CXu(FmoksZo0|W{!yEh1ck)yqkAN-a-4GuTb*H7!}YA;ie22K$`m!=2`fN6(}J>l zD9LtI+C6*d%T#Q^s0m|Rp?N0?VyMXejdPYf8EgcNGAW_UEteoo4w z{@e7itv&+sg`^Bq~~LB%JheYFR)EGQqGo4P6q-&cJ$9#yj3 zZ=^p;ZP*I5TGX>M3%m0&Vd~*4`I=P%_gCWi3Q=ykhu!&mH-X3?^7+5_KKWU0trksS z7r}PO_C;0QLPGnOnh>qx3lo(XcjQ}rj!ynCAY?Jye;YPYiM#$*x8icnz2M!Cd`A?= z*DCzu#SSf-XSlN0VlUkE@Vb5FX=1Czb_X#eLQh?(NLsEy-#t`%J5BOU^7R#>{i@i< zH9O<~VlNKQ>;_^^Y;Q7Qw4ha$*s7w4Q_#ez`qJngiU5pZN0(>X!iU@W!5N>J$iH`*kTBOXInCAK*7K*z`Ji$<+LY1bVMQR_T# zv9zIg?VZc%{%hzAbTU7+^DV|v=uU=#j?j7my2LxN(zR%4%~w6cy+*R=*&bOyb7Dw7 zd0>pvv3-e}8~;$ny(^F^Pa8`8_H*v>;K?4*9P9(N`4vZGmG$@)Up^_FdfE3+qtoiV z)nm>txAJP6$64|6M){=n9Tdv<8pyy8mH2x|=WGzT_(w`3vRt3wwGHrEsiKS; zyO#noolkjcnYrW118(L<{AOmTX?LmXL{5btXEZ#Kxxr~P-1vPEW1=0JrX}_KR0#*G zD}VUM_8d~mDLwPmRJ4?l9H#sH$>sEDU53!NvQ%?LG*qG)Vzj%FR{X42^LP18p;a`{ zMw{1N-+e{VT9a+trU?V3j;tT9R=P%9OLb0Od)Rq1Je54a>a!${tlsB&E}zVMBaXKU z5U4Q}YecU#q}ZXdnUL?JajqkZ6|YQCOc7wOA*na{8*EXI2BKf?l2*E+ml!mm*IqIH zjWj}`T%b>WB$usdUHOn*n*@|&fYJ^LXE!$;gWCBVjB#oLh3JO{=EMQ%-IJaHR{6r= zHKk1Fy_)$jftr(7VRAX2$tuCF1dWvPG`P+qttZ-M*u_tubT&F()!4~0xl3NrF;-0y zv+7ltr3N`A5p*DhL3@zZF$m-t-|Kk>)`WxW$<@-?m>O0YfUvup{tst3rBg(iIwFc7MZZkT5E|O1%<1{B~ z_Ia3<4g79ga&-5-ipHS&CG}$c3Wv&k1!QWN6!Zk9n_noldF;%@d8J7PnZan)X*JX( z@cRaQPZ{KhVR-nn{7XDHiWAlS%H(_QImuEBY`&_0NS zbCV)q75ff0WxrTHjCqnIR%GTRV5kipW>=RsN4~1*lxBGQ369i+mePqKM##IwHNQ9} z6X@%inVJ8}s|l2K!T0a~Tl*_nQmjL2G(+~3bWXY}UCNW^XUaHHZg97{3^i`SF(Atu z;yAm(qHfQ^bPA$Xk$%El+m+AYg_wbR^YixW7KQRZ{e5%DcZ?ClvRDloSe*)th7&V$ zl`S9JWC<|%I^5A(Yj|d--ckAK%j#tbV9FE!q!1XN;y3y^{bEiq+~_t z>yohwwigbN<{6=!++3Z3vh->0t}h8?l78~ZQ6N#%nKoFxq2>z1>Q~*D3E2F)g-7&l z7sx!*$KzTpgh%7qS0XbfwV`CXTmub1v#7?JRV_4HDAg>l1c0g69vFh^-@uB>Ia z&0k3KDaRQT^%i>UZYzKA=K4TGY6G!G(o?u?vM0OLl3N&puB8_V>QUO-F zO=h1j_|byU7)<{bt$NaRXHVO%<0RwwpWb)Mp~tHezWe2qtrPQ&9Sx5;`z11U)~2S} zyL`fR*1Z4gV#%Q2KEB%_fCS=%5Nu&&_R$mB%*SbBfwW)?oTOcWn|$?@4xiIw(@6dt zu&@IOZZoPO^_8E&o=mj(S_eJI|7Gdly)bQqbn%E{^j{4b!juaSh@~Dzf=_u54PPaqW(j=o}%EJ*s#@S!2ge#NQz@sgZaGu zCMQFTe0pwq{<-FU)nfMh0}rN8@Z!+lUQK4NtO$C)h*cIys&dPQ0jh31jl%iyswsp7 z!77{C*qmR)dX+6bME4wWVzb6sPFuiCSaW!^*J8%N2B&pdMyr02DSHl{^fU6|9iT9#=ULTs1ih=VdFPq zF3^O{*{=aUeIE@?u;r@`RB!Q}Y2cG7Pq+N#7`KoldwerRH7AQ2|4o%sjQ6bLYTN1b zG@W1uQsv-f94HfTPUfGUGXKDM=Z}MM&@z)$hKny?`SbrDV+I@gEA~iLl~c#niG1!` zVTmSnt#tsuXdtZ$g$opXNu#V`Dl4V`o_vjIUZrta*j)YOrQI)PECMY&ybDeDch9ee zKM(qS!}#|HJkF-VXl56hS&$@|sH)>wRaKRky!sxlIMUSg#!&PLdFg)V2kUukGe!AB zh8dhbTJcwA)E zn`dqnMj>|&I0MBJnk+$MsfaP2Ez{9)&01BAq>O=Bg1CTzbSK_RTA=WkyK0aj9;^DF zi~9IACn#o_$aKd2CIXpyrv1Min81uqUgc)JRSAQ}3fKu|elioZ3ld9+KLLDE)1K|C z)pnQqkHo66^%w!hI_$y#YC?#*uXyXU5Blc}I8=X{S6JA_UjdqsK4`Am|L*GknCC&E zJ!gIPJ(la+(asY2&i-(*(y%PoO7#6I{eKCF-L%w{%f|h`dEGrPmzw}=ODCg2N}pKI zczJ$oISlDkG;bqccC!vtGO5^wgqZIs?9gURcoiswh=V2$ oXL!jH=6{#XnCw{OS;$s0FrXU-T(jq literal 0 HcmV?d00001 diff --git a/data/atari2.svg b/data/atari2.svg new file mode 100644 index 0000000..1e2c553 --- /dev/null +++ b/data/atari2.svg @@ -0,0 +1,356 @@ + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/atari800.ico b/data/atari800.ico new file mode 100644 index 0000000000000000000000000000000000000000..64decd2655802c7f84964faab578f8b20e7b7261 GIT binary patch literal 3262 zcmcgvYfRHu6z{(8^Rka7zF0=UxNgXn8U$smL!>C3fCWTo%d-y(Ev+rBZJ`DFqAjJo zY#ptLzzS{-kO9H588S&+rf!HRiZOgKnCNE0w(j@mYF7&x#1FgNUe5j9bAIQZbI-j6 z8tpCoY}-b|_%5yIZ5r(z8jTi(4;n+?WgM&FAH$SusmE%1l@PK(FNYi( z9}mHBB0=k@gI~K|*euC&R2;Fi)q$$iqz3KT?gnVueU4H6QN)|Cl-T3~1D{=+m3XF& ziio2!LN3+H!AAJuS71;=MguMQ&8LzPDPl3?9RxpHSBIsOYDtJ6fsZ(O@LSR`0A(%b zkW|Ve*{D5{Y%F3jWQsLDYX9N<01+3Ml_pIn7NQCMAq|V{A4r2)im7b&du#wM5DT#d z8(bhFf~@DKXA9J)n1}*hEy_Vegr8Sj143J$gG>(<7LDtU^vTn}k9-mkBMuk&hl?76 z3Rzvx51l-vjPR2^R1Eag^|iU}60il_0^eo7d8nIyG}Gxd0_l?H;#faq>_?rDE^c$+ z2viM99KnYCP(Cf=5(VrZ>B1(_!G;i~8ZvPZCk<-QVp`Ni)ibwNN-~3;Q#~s&O=keU zAwLzS$qHsTIyE#XXtkmvgiyymWnL=bMOUxIevlDgQX@6~+bgX)mhI*3NNQ+=ZH9L! zMpzAfG?qqBSLsQ05oG=N9`i8t(IKo~4Ix-fQt44w(G`kVnHe}kScUN;2Jhn}%>nw% zr|$cqOBAxA)N(i&_wGxhXT7Y$@YNKdcyDXq{TQnLNy8&R1Zl^lzTv!H-%R-70{ye9 z`G|cMyTT5iLTP&lOx9c>%8XBZb^HQS5@f7Wi-{WU6yAg;xmjj-p&4Jm zIaYb^2qpJk8uC3vjn{D-3g{tzM*UTylXoVxr(^pcDAy;ew^us)q2%0%Z7$q1aYVIib7OZPQJJ1 z(G!p_{7vzb)O9=vhF_>Haz?13j8S-63FmnGOlbe$M=S80k5GPtDIQFZgnICKT~2lF z6qsA*7f2xF#drhGa1)fGSN#QCh}&IuaTcnvV&pNrOuq<*tG%&|O?veCenp1J=eVq;@NCOdcT%+AiPuCAtM9tS^Yt2~Y#IcxZ=vGHPW zyC_ZLeC?GB8Ab?PF4yPt-MV$_>C>l6OG_@73kq>@akI0t%gf6ECnqP{8&$}UsMCJ; z&fK$S&lVRKFI~FSgwvAJ$r06+w}A_lgR|w*VotI z-)}8D((>EAyK}ek<=8yn1=9LeV9jWgfzRiAy@B&6_uoA_!Ki_1w90(b3V6dwYAq9}^QJ zkw}b2BM`_yfJ5H26&Dwq&F1vDl?DO< xvZYP=ktCH$)zs7kTZEsGkU&gOR|EvUd-rYvmX?+h5T~{&Gf{~Af8hU~{{xcaSd{<( literal 0 HcmV?d00001 diff --git a/data/atari_xe.ico b/data/atari_xe.ico new file mode 100644 index 0000000000000000000000000000000000000000..c6c1e03b17bfff7e52680a5d7b18b071f13961d4 GIT binary patch literal 766 zcmaKqF>Zx042FM7rLfVdD~!DbJ<{8fPS6RqjJ*z3FY=@=9n%R0^wQr6fmD_1V8^k) zI7%>3aJ20M?LEHkfJXpN)Ry{8mH7WM0Q@ivaiXP*d7e2-!iNvui$~>N${gMOKVzkZxtF6)}!1UrSC%|;y*D3+kY8Hx1fYl@OeZK?MGEO;QwJ|xc z=dk5vODE*AWla^-bsU5Z9x}E`b1xm*jT>)&=8&yDVD7dj?0mVYKTG4!O=r+Sc LN@=}U>WBXU(w^;7 literal 0 HcmV?d00001 diff --git a/debian/README.Debian b/debian/README.Debian new file mode 100644 index 0000000..ae4e6ed --- /dev/null +++ b/debian/README.Debian @@ -0,0 +1,58 @@ +Getting Atari ROMs +------------------ + +The Atari ROMs can be downloaded from: + + http://prdownloads.sf.net/atari800/xf25.zip + +Note that if you don't own an Atari, getting the ROMs via ftp may not be +legal. You must have the ROMs to use this emulator. The system admin should +install the ROMS in /usr/local/lib/atari/ROMS/ or anywhere else if you +adapt the configuration file (see the provided atari800.cfg). + +Getting Atari Software +---------------------- + +To add other software, you'll have to find your own disk images (some are +in the xf25.zip I mentioned above), and install them either in +/usr/local/lib/atari/DISKS or somewhere else. + +Running the Emulator +-------------------- + +In the past, 3 versions of the Atari emulator were needed to support both +an X version and either vga or curses version for the console. + +With the incorporation of the SDL interface, the same code can run in both +the console and an X window. + +Luck, + +-- Dale Scheetz + +From the new maintainer: +------------------------ + +1st takeover +------------ + + I took over this package from Dale after using it for some years, thanks Dwarf! + + Future packages should be build with either + - diskleds (temporarily visible disk activity indicators) or + - siosound (the atari makes some noise for every disk sector transferred). + Please vote! + + Join the A-Team to comaintain this and possibly other (Atari-)Emulators and + build some common foundation and knowledgebase for emulation within Debian GNU. + + Have a nice day, Martin Albert + +2nd takeover +------------ + + I took over this package from Martin, thanks for excelent work. I am in close + cooperation with Petr Stehlik, who maintains the sources, he is doing + excelent job as a release manager. + + Enjoy the package, Antonin Kral diff --git a/debian/atari800.cfg b/debian/atari800.cfg new file mode 100644 index 0000000..4af4088 --- /dev/null +++ b/debian/atari800.cfg @@ -0,0 +1,91 @@ +Atari 800 Emulator, Version 2.2.0 +OS/A_ROM=/usr/local/lib/atari/ROMS/ATARIOSA.ROM +OS/B_ROM=/usr/local/lib/atari/ROMS/ATARIOSB.ROM +XL/XE_ROM=/usr/local/lib/atari/ROMS/ATARIXL.ROM +BASIC_ROM=/usr/local/lib/atari/ROMS/ATARIBAS.ROM +5200_ROM=/usr/local/lib/atari/ROMS/5200.ROM +H1_DIR= +H2_DIR= +H3_DIR= +H4_DIR= +HD_READ_ONLY=1 +PRINT_COMMAND=lpr %s +SCREEN_REFRESH_RATIO=1 +MACHINE_TYPE=Atari XL/XE +RAM_SIZE=64 +DEFAULT_TV_MODE=PAL +DISABLE_BASIC=1 +ENABLE_SIO_PATCH=1 +ENABLE_H_PATCH=1 +ENABLE_P_PATCH=1 +STEREO_POKEY=0 +SPEAKER_SOUND=1 +MIO_ROM= +BLACK_BOX_ROM= +XLD_D_ROM= +XLD_V_ROM= +PROTO80_ROM= +AF80_ROM= +AF80_CHARSET= +COLOURS_NTSC_SATURATION=0 +COLOURS_NTSC_CONTRAST=0 +COLOURS_NTSC_BRIGHTNESS=0 +COLOURS_NTSC_GAMMA=0.3 +COLOURS_NTSC_HUE=0 +COLOURS_NTSC_DELAY=21 +COLOURS_NTSC_EXTERNAL_PALETTE= +COLOURS_NTSC_EXTERNAL_PALETTE_LOADED=0 +COLOURS_NTSC_ADJUST_EXTERNAL_PALETTE=0 +COLOURS_PAL_SATURATION=0 +COLOURS_PAL_CONTRAST=0 +COLOURS_PAL_BRIGHTNESS=0 +COLOURS_PAL_GAMMA=0.3 +COLOURS_PAL_EXTERNAL_PALETTE= +COLOURS_PAL_EXTERNAL_PALETTE_LOADED=0 +COLOURS_PAL_ADJUST_EXTERNAL_PALETTE=0 +SCREEN_SHOW_SPEED=0 +SCREEN_SHOW_IO_ACTIVITY=1 +SCREEN_SHOW_IO_COUNTER=0 +FILTER_NTSC_SHARPNESS=-0.5 +FILTER_NTSC_RESOLUTION=-0.1 +FILTER_NTSC_ARTIFACTS=0 +FILTER_NTSC_FRINGING=0 +FILTER_NTSC_BLEED=0 +FILTER_NTSC_BURST_PHASE=0 +VIDEOMODE_WINDOW_WIDTH=336 +VIDEOMODE_WINDOW_HEIGHT=240 +VIDEOMODE_FULLSCREEN_WIDTH=336 +VIDEOMODE_FULLSCREEN_HEIGHT=240 +VIDEOMODE_WINDOWED=1 +VIDEOMODE_HORIZONTAL_AREA=TV +VIDEOMODE_VERTICAL_AREA=TV +VIDEOMODE_HORIZONTAL_SHIFT=0 +VIDEOMODE_VERTICAL_SHIFT=0 +VIDEOMODE_STRETCH=INTEGRAL +VIDEOMODE_FIT=BOTH +VIDEOMODE_IMAGE_ASPECT=SQUARE-PIXELS +VIDEOMODE_ROTATE90=0 +VIDEOMODE_HOST_ASPECT_RATIO=0:0 +VIDEOMODE_NTSC_FILTER=0 +VIDEOMODE_80_COLUMN=1 +SCANLINES_PERCENTAGE=5 +INTERPOLATE_SCANLINES=1 +VIDEO_VSYNC=0 +VIDEO_ACCEL=0 +PIXEL_FORMAT=BGR16 +BILINEAR_FILTERING=0 +OPENGL_PBO=1 +VIDEO_BPP=0 +SDL_JOY_0_ENABLED=1 +SDL_JOY_0_LEFT=260 +SDL_JOY_0_RIGHT=262 +SDL_JOY_0_UP=264 +SDL_JOY_0_DOWN=261 +SDL_JOY_0_TRIGGER=305 +SDL_JOY_1_ENABLED=0 +SDL_JOY_1_LEFT=97 +SDL_JOY_1_RIGHT=100 +SDL_JOY_1_UP=119 +SDL_JOY_1_DOWN=115 +SDL_JOY_1_TRIGGER=306 + diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 0000000..beacc01 --- /dev/null +++ b/debian/changelog @@ -0,0 +1,256 @@ +atari800 (3.0.0-1) unstable; urgency=low + + * New upstream release. + + -- Petr Stehlik Sun, 03 Mar 2013 03:03:03 +0200 + +atari800 (2.2.1-2) unstable; urgency=low + + * depend on libpng-dev not libpng12-dev (Closes: #662272) + + -- Antonin Kral Mon, 05 Mar 2012 09:29:03 +0100 + +atari800 (2.2.1-1) unstable; urgency=low + + * new upstream release fixes kFreeBSD and other things + Closes: #621100 + + -- Antonin Kral Thu, 28 Apr 2011 18:45:09 +0200 + +atari800 (2.2.0-1) unstable; urgency=low + + * New upstream release. + * Upstream dropped support for X and ncurses versions + + -- Antonin Kral Wed, 06 Apr 2011 13:11:07 +0200 + +atari800 (2.1.0-2) unstable; urgency=low + + * Link against libreadline(6) (Closes: #553728) + * fixes stale autoconf files + + -- Antonin Kral Tue, 22 Dec 2009 21:45:05 +0100 + +atari800 (2.1.0-1) unstable; urgency=low + + * New upstream release. + * Updated atari800.cfg example config file. + * Added dependency to libreadline5-dev. + * added libpng12-dev to build depends + * hopefully fixed problem with gpg key in keyring + + -- Antonin Kral Tue, 05 May 2009 19:05:33 +0000 + +atari800 (2.0.3-1) unstable; urgency=low + + * New upstream release. + * added calls to strip to get rid of .comment section (linda complained) + + -- Antonin Kral Wed, 11 Jul 2007 18:49:38 +0000 + +atari800 (2.0.2-1) unstable; urgency=low + + * New upstream source. Closes: #288543 + * Updated atari800.cfg example config file. + * Package addopted, Closes: #379022 + + -- Antonin Kral Sun, 01 Oct 2006 13:59:59 +0200 + +atari800 (1.3.2-1) unstable; urgency=low + + * New upstream source and new maintainer (closes: #226787). + * Debian/control: remove debhelper and sharutils from Build-Depends. + * Debian/rules: handle DEB_BUILD_OPTIONS=noopt, + clean: removes src/Makefile and src/config.{h,log,status}. + * Update config.{guess,sub} from autotools-dev-20040105.1. + * Patch src/rdevice.c::581,583 to use '/dev/ttyS0' on all archs. + * Add some notes of new maintainer to README.Debian - thanks Dale. + + -- Martin Albert Thu, 19 Feb 2004 20:09:49 +0100 + +atari800 (1.3.1-2) unstable; urgency=low + + * Fixed broken syntax in last changelog entry. Closes: #203707 + * Changed dependency from xlib6g-dev to xlibs-dev. Closes: #209203 + * Repaired bad patch. Now deliver upstream changelog and NEWS + * Updated /etc/atari800.cfg example in /usr/share/doc/atari800 + * provided by upstream author. + * Fixed several Lintian Warnings/Errors: + * Removed /usr/share/doc/atari800/INSTALL.gz + * Removed postinst usr-doc-link code + * Added copyright reference to /usr/share/common-licenses + + -- Dale Scheetz (Dwarf #1) Wed, 8 Oct 2003 17:26:37 -0400 + +atari800 (1.3.1-1) unstable; urgency=low + + * new upstream source + * updated configure files. Closes: #193397 + * removed svgalib version, security fix installed upstream. Closes 203707 + + -- Dale Scheetz (Dwarf #1) Sat, 6 Sep 2003 17:14:56 -0400 + +atari800 (1.3.0-2) unstable; urgency=low + + * changed build depends from xlib6g-dev to xlibs-dev and libncurses-dev + * to libncurses5-dev. Closes: #188777 + * new system wide config file example in /usr/share/doc/atari800/atari800.cfg + * for details see /usr/share/doc/atari800/README.Debian + + -- Dale Scheetz (Dwarf #1) Tue, 13 May 2003 19:00:50 -0400 + +atari800 (1.3.0-1) unstable; urgency=low + + * new upstream source. (error in last entry ;-) + * modified config and added sdl target to the build + + -- Dale Scheetz (Dwarf #1) Sat, 12 Apr 2003 14:56:16 -0400 + +atari800 (1.2.2-1) unstable; urgency=low + + * new upstream source. Finally catching up... + + -- Dale Scheetz (Dwarf #1) Sat, 16 Mar 2002 20:32:22 -0500 + +atari800 (1.0.7-3) unstable; urgency=low + + * Compiled against libncurses5-dev. Closes: #132589 + + -- Dale Scheetz (Dwarf #1) Sat, 9 Feb 2002 14:32:05 -0500 + +atari800 (1.0.7-2) unstable; urgency=low + + * Fixed rules file so svgalib version is only built/installed + * on i386 architectures. Closes: #122282, #122779 + * Added patch to wrap LED_lastline in SET_LED #ifdef to allow reasonable + * feature selection. Thanks Stephen! + * Fixed USAGE docs for curses mode keyboard controls to declare + * the F8 function key starts basic mode operations. + + -- Dale Scheetz (Dwarf #1) Fri, 7 Dec 2001 11:47:05 -0500 + +atari800 (1.0.7-1) unstable; urgency=low + + * New upstream source. Closes: #81032 + * Changed Maintainer to match signature. Closes: #104829 + * Compiled with sound enabled. Closes: #70940 + + -- Dale Scheetz (Dwarf #1) Sat, 3 Nov 2001 17:25:15 -0500 + +atari800 (0.9.9f-3) unstable; urgency=low + + * Added sharutils to build-depends. Closes: #104829 + + -- Dale Scheetz (Dwarf #1) Tue, 25 Sep 2001 12:46:15 -0400 + +atari800 (0.9.9f-2) unstable; urgency=low + + * new maintainer... + + -- Dale Scheetz Sat, 26 Aug 2000 08:11:23 -0400 + +atari800 (0.9.9f-1) unstable; urgency=low + + * Hm, seems this is the package time forgot. I missed checking this into + cvs when I converted, and then forgot about it. + * New upstream version which fixes X. Closes: #57435 + * Several changes like build-depends and FHS. + + -- Joey Hess Mon, 1 May 2000 15:35:26 -0700 + +atari800 (0.9.8a-2) unstable; urgency=low + + * Updated config file. + + -- Joey Hess Fri, 9 Oct 1998 12:34:44 -0700 + +atari800 (0.9.8a-1) unstable; urgency=low + + * New upstream release. + * No pristine source since upstream source is now a .zip file. + * Corrected several apparent dos-isms in the source. Ugh. + + -- Joey Hess Tue, 6 Oct 1998 21:16:02 -0700 + +atari800 (0.8.6-3) unstable; urgency=low + + * Don't use icon=none in menu file. + + -- Joey Hess Wed, 5 Aug 1998 14:31:25 -0700 + +atari800 (0.8.6-2) unstable; urgency=low + + * Rebuilt with a newer svgalib. + * Hacked debian/rules so it still depends on | svgalib-dummyg1. + + -- Joey Hess Sat, 14 Mar 1998 17:44:03 -0800 + +atari800 (0.8.6-1) unstable; urgency=low + + * New upstream release + + -- Joey Hess Sun, 8 Mar 1998 13:15:06 -0800 + +atari800 (0.8.4-1) unstable; urgency=low + + * New upstream release. + + -- Joey Hess Sat, 21 Feb 1998 12:35:57 -0800 + +atari800 (0.8.2-2) unstable; urgency=low + + * Updated fsf address. + + -- Joey Hess Mon, 9 Feb 1998 13:05:46 -0800 + +atari800 (0.8.2-1) unstable; urgency=low + + * New upstream release. + * Use debhelper. + + -- Joey Hess Fri, 16 Jan 1998 14:34:10 -0500 + +atari800 (0.8.1-1) unstable; urgency=low + + * New upstream release + * Libc6. + * Moved to contrib: depends on non-free roms. + + -- Joey Hess Mon, 8 Sep 1997 18:43:42 -0400 + +atari800 (0.8.0-1) unstable; urgency=low + + * New upstream release + - Now has sound support! + * Changed debian menu file to 1.0 format. + * The X version no longer uses xview. This interface has been obsoleted by + the menu system that appears if you hit F1. + + -- Joey Hess Sun, 20 Apr 1997 22:06:04 -0400 + +atari800 (0.7.0-1) unstable; urgency=low + + * New upstream release + + -- Joey Hess Wed, 2 Apr 1997 18:58:37 -0500 + +atari800 (0.6.2-1) unstable; urgency=low + + * New upstream release. + * Added an atari800 game: Alien Encounter, with permission of + author. + * Added /etc/atari800.cfg file. + * Added svgalib version to debian menu. + + -- Joey Hess Sun, 23 Mar 1997 13:50:54 -0500 + +atari800 (0.6.1-1) unstable; urgency=low + + * First release. + + -- Joey Hess Wed, 5 Mar 1997 22:08:42 -0500 + + +Local variables: +mode: debian-changelog +End: diff --git a/debian/control b/debian/control new file mode 100644 index 0000000..e352577 --- /dev/null +++ b/debian/control @@ -0,0 +1,20 @@ +Source: atari800 +Section: contrib/otherosfs +Priority: optional +Maintainer: Antonin Kral +Build-Depends: libsdl1.2-dev, zlib1g-dev, libreadline-dev, libgl1-mesa-dev, libpng-dev, autotools-dev +Standards-Version: 3.9.3 +Vcs-Git: git://github.com/bobek/aranym800-debian.git +Vcs-Browser: https://github.com/bobek/aranym800-debian + +Package: atari800 +Architecture: any +Depends: ${shlibs:Depends} +Description: Atari800 emulator for SDL + This is an emulator of Atari 8-bit computer systems including the 400, 800, + 1200XL, 600XL, 800XL, 65XE, 130XE, 800XE and the XE Game System, + and also of the Atari 5200 SuperSystem console. + . + The Atari Operating System ROMs are not available with this package, due to + copyright. You'll have to either make copies of them from an old Atari + computer, or see README.Debian for other ways to obtain them. diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 0000000..c6bc8ed --- /dev/null +++ b/debian/copyright @@ -0,0 +1,11 @@ +This is a Debian prepackaged version of the atari800 emulator. + +This package was put together by Dale Scheetz , using +sources from: + http://atari800.sourceforge.net/ + + +Copyright: + +Copyright (C) 2011, Atari800 development team. Release under +GPLv2 (see /usr/share/common-licenses/GPL-2) diff --git a/debian/menu b/debian/menu new file mode 100644 index 0000000..c080330 --- /dev/null +++ b/debian/menu @@ -0,0 +1,2 @@ +?package(atari800):needs="x11" section="Applications/Emulators" \ + title="Atari Emulator" command="atari800" diff --git a/debian/postinst b/debian/postinst new file mode 100644 index 0000000..386225b --- /dev/null +++ b/debian/postinst @@ -0,0 +1,4 @@ +#!/bin/sh +set -e + +if [ "$1" = "configure" -a -x /usr/bin/update-menus ]; then update-menus ; fi diff --git a/debian/postrm b/debian/postrm new file mode 100644 index 0000000..3a0be8c --- /dev/null +++ b/debian/postrm @@ -0,0 +1,5 @@ +#!/bin/sh + +set -e + +if [ -x /usr/bin/update-menus ]; then update-menus ; fi diff --git a/debian/prerm b/debian/prerm new file mode 100644 index 0000000..a64ad6f --- /dev/null +++ b/debian/prerm @@ -0,0 +1,7 @@ +#!/bin/sh + +set -e + +if [ \( "$1" = "upgrade" -o "$1" = "remove" \) -a -L /usr/doc/atari800 ]; then + rm -f /usr/doc/atari800 +fi diff --git a/debian/rules b/debian/rules new file mode 100644 index 0000000..8b148e7 --- /dev/null +++ b/debian/rules @@ -0,0 +1,149 @@ +#!/usr/bin/make -f +# +# This is a debian/rules make file. It supports the targets: +# build, clean, binary-indep, binary-arch, and binary +# +# Package name variables +# +P=atari800 + +ARCH := $(shell dpkg-architecture -qDEB_BUILD_ARCH) + +# Special Debian build options - nostrip yet un-handled +export CFLAGS +CFLAGS += -g -Wall +ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) +CFLAGS += -O0 +else +CFLAGS += -O3 +endif + + +# Build the binary components and assemble the libraries +# ===================================================================== +build: build-arch build-indep +build-arch: build-stamp +build-indep: build-stamp +build-stamp: + $(checkdir) + debian/rules bld-sdl + touch build-stamp + +bld-sdl: + cd src ; if [ -e Makefile ]; then $(MAKE) clean; fi + cd src ; ./configure \ + --with-video=sdl --with-sound=sdl + cd src ; $(MAKE) + +# Clean up after a build and before building a source package +#====================================================================== +clean: + $(checkdir) + -rm -f build-stamp + cd src ; if [ -e Makefile ]; then $(MAKE) clean; fi; \ + rm -f config.log config.status config.h Makefile + mv ./atari800.spec ./tmp ; rm -f atari800 ; rm -f atari800.* ; mv ./tmp ./atari800.spec + -rm -rf debian/tmp debian/*~ *~ *.orig *.log \ + debian/files* debian/substvars* + +binary: binary-arch + +# No binary independent components to this package +#====================================================================== +binary-indep: +# +# No independent components +# + echo "No independent binary components." + +# Install package components into debian/tmp to be built into packages +#====================================================================== +binary-arch: checkroot build + +# Clean out old tmp directory +# + -rm -rf debian/tmp + install -d debian/tmp + +# Install installation scripts +# + install -d debian/tmp/DEBIAN + install -m 755 debian/postinst debian/tmp/DEBIAN/. + install -m 755 debian/postrm debian/tmp/DEBIAN/. + install -m 755 debian/prerm debian/tmp/DEBIAN/. + +# Install docs in proper directory and gzip them +# + install -d debian/tmp/usr/share/doc/$(P) + cp debian/changelog debian/tmp/usr/share/doc/$(P)/changelog.Debian + cp DOC/ChangeLog debian/tmp/usr/share/doc/$(P)/changelog + cp DOC/NEWS debian/tmp/usr/share/doc/$(P)/NEWS + cp DOC/CREDITS debian/tmp/usr/share/doc/$(P)/CREDITS + cp DOC/README debian/tmp/usr/share/doc/$(P)/README + cp DOC/USAGE debian/tmp/usr/share/doc/$(P)/USAGE + gzip -9v debian/tmp/usr/share/doc/$(P)/* + +# These are too small to gzip +# + cp DOC/FAQ debian/tmp/usr/share/doc/$(P)/FAQ + cp DOC/BUGS debian/tmp/usr/share/doc/$(P)/BUGS + cp DOC/TODO debian/tmp/usr/share/doc/$(P)/TODO + cp debian/README.Debian debian/tmp/usr/share/doc/$(P)/README.Debian + cp debian/atari800.cfg debian/tmp/usr/share/doc/$(P)/atari800.cfg + + +# and don't gzip the copyright statement +# + cp debian/copyright debian/tmp/usr/share/doc/$(P)/copyright + +# install and gzip man page +# + install -d debian/tmp/usr/share/man/man1 + install -m 644 src/$(P).man debian/tmp/usr/share/man/man1/$(P).1 + gzip -9 debian/tmp/usr/share/man/man1/$(P).1 + +# install menu file +# + install -d debian/tmp/usr/share/menu + install -m 644 debian/menu debian/tmp/usr/share/menu/$(P) + +# install binaries +# + install -d debian/tmp/usr/bin + install -s src/$(P) debian/tmp/usr/bin/$(P) + + strip -R .comment -R .note -R .note.ABI-tag debian/tmp/usr/bin/$(P) + +# (if [ "$(ARCH)" = "i386" ]; then install debian/$(P) debian/tmp/usr/bin; \ +# else install debian/$(P).alt debian/tmp/usr/bin/$(P); fi) + +# Create dependency information +# + dpkg-shlibdeps src/$(P) + +# Generate control file for the package +# + dpkg-gencontrol -p$(P) -isp + +# Clean up file ownership +# + chown -R root.root debian/tmp + +# and permissions +# + chmod -R g-ws debian/tmp + +# and build the package +# + dpkg --build debian/tmp .. + +define checkdir + test -f ./atari800.spec +endef + +# Below here is fairly generic really +checkroot: + $(checkdir) + test root = "`whoami`" + +.PHONY: binary binary-arch binary-indep clean checkroot diff --git a/src/.cvsignore b/src/.cvsignore new file mode 100644 index 0000000..1c7b8db --- /dev/null +++ b/src/.cvsignore @@ -0,0 +1,12 @@ +atari800.cfg +autom4te.cache +config.h +config.h.in +config.log +config.status +config.cache +configure +Makefile +SDL_win32_main.c +emuos.img +atari800 diff --git a/src/Makefile.in b/src/Makefile.in new file mode 100644 index 0000000..ad4b16d --- /dev/null +++ b/src/Makefile.in @@ -0,0 +1,158 @@ +CC = @CC@ +RC = windres + +DEFS = @DEFS@ +LIBS = @LIBS@ +TARGET_BASE_NAME = atari800 +TARGET = $(TARGET_BASE_NAME)@EXEEXT@ +CONFIGURE_TARGET = @CONFIGURE_TARGET@ +CONFIGURE_HOST = @CONFIGURE_HOST@ +ifeq (@CONFIGURE_HOST@, javanvm) + FINALTARGET = $(TARGET_BASE_NAME).jar + JAVAFLAGS = @JAVAFLAGS@ + JAVA = java + JAVACFLAGS = @JAVACFLAGS@ + JAVAC = javac +else + ifeq (@CONFIGURE_TARGET@,android) + FINALTARGET = android + else + FINALTARGET = $(TARGET) + endif +endif + +CFLAGS = @CFLAGS@ @CPPFLAGS@ +LDFLAGS = @LDFLAGS@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ -s +INSTALL_DATA = @INSTALL_DATA@ + +BIN_DIR = @prefix@/bin +MAN_DIR = @prefix@/share/man/man1 +DOC_DIR = @prefix@/share/doc/atari800 + +DESTDIR = + +OBJS = \ + afile.o \ + antic.o \ + atari.o \ + binload.o \ + cartridge.o \ + cassette.o \ + compfile.o \ + cfg.o \ + cpu.o \ + crc32.o \ + devices.o \ + emuos.o \ + esc.o \ + gtia.o \ + img_tape.o \ + log.o \ + memory.o \ + monitor.o \ + pbi.o \ + pia.o \ + pokey.o \ + rtime.o \ + sio.o \ + sysrom.o \ + util.o \ + @OBJS@ + + + +all: $(FINALTARGET) + +# A special rule for SDL_win32_main.c to suppress warnings since this file is +# from SDL and should not have to be modified +SDL_win32_main.o: SDL_win32_main.c + $(CC) -c -o $@ $(DEFS) -I. $(CFLAGS) -Wno-missing-declarations -Wno-missing-prototypes $< + +# A special rule for win32 to not compile with -ansi -pedantic +win32/%.o: win32/%.c + $(CC) -c -o $@ $(DEFS) -I. $(patsubst -pedantic,,$(patsubst -ansi,,$(CFLAGS))) $< + +ide.o: ide.c ide.h ide_internal.h + $(CC) -c -o $@ $(DEFS) -I. $(CFLAGS:-ansi=) $< + +%.o: %.c + $(CC) -c -o $@ $(DEFS) -I. $(CFLAGS) $< + +%.ro: %.rc + $(RC) --define WIN32 --define __MINGW32__ --include-dir . $< $@ + +%.o: %.cpp + $(CC) -c -o $@ $(DEFS) -I. $(CFLAGS) $< + +%.o: %.S + $(CC) -c -o $@ $(DEFS) -I. $(CFLAGS) $< + +ifeq ($(CONFIGURE_HOST),javanvm) +$(TARGET_BASE_NAME).class: javanvm/$(TARGET_BASE_NAME).java | $(TARGET_BASE_NAME)_runtime.class + $(JAVAC) -d . $(JAVACFLAGS) javanvm/$(TARGET_BASE_NAME).java +RUNTIME = _runtime +else +RUNTIME = +endif + +$(TARGET_BASE_NAME)$(RUNTIME).class: $(TARGET) +#To compile using java bytecode directly: +# $(JAVA) $(JAVAFLAGS) org.ibex.nestedvm.Compiler -o UnixRuntime -outfile $@ $(TARGET_BASE_NAME)$(RUNTIME) $(TARGET) + $(JAVA) $(JAVAFLAGS) org.ibex.nestedvm.Compiler -o UnixRuntime -outformat javasource -outfile $(TARGET_BASE_NAME)$(RUNTIME).java $(TARGET_BASE_NAME)$(RUNTIME) $(TARGET) + $(JAVAC) -d . $(JAVACFLAGS) -J-Xmx256m $(TARGET_BASE_NAME)$(RUNTIME).java +##Also, -o UnixRuntime fixes directory browsing but requires /c:/-style paths + +$(TARGET_BASE_NAME).jar: $(TARGET_BASE_NAME).class $(TARGET_BASE_NAME)$(RUNTIME).class + printf "Manifest-Version: 1.0\nMain-Class: $(TARGET_BASE_NAME)\nClass-Path: unix_runtime.jar\n" > .manifest + jar cfm $(TARGET_BASE_NAME).jar .manifest *.class + +# Allow parallel execution in sub-make with '+' +android: + + ndk-build -C android + ant -f android/build.xml debug +.PHONY: android + +$(TARGET): $(OBJS) + $(CC) -o $@ $(LDFLAGS) $(OBJS) $(LIBS) + +dep: + @if ! makedepend -Y $(DEFS) -I. ${OBJS:.o=.c} 2>/dev/null; \ + then echo warning: makedepend failed; fi + +clean: + rm -f *.o *.class .manifest $(TARGET) $(TARGET_BASE_NAME).jar $(TARGET_BASE_NAME)_runtime.java core *.bak *~ + rm -f dos/*.o dos/*.bak dos/*~ + rm -f falcon/*.o falcon/*.bak falcon/*~ + rm -f sdl/*.o sdl/*.bak sdl/*~ + rm -f win32/*.o win32/*.ro win32/*.bak win32/*~ + rm -f javanvm/*.o javanvm/*.bak javanvm/*~ + rm -f atari_ntsc/*.o atari_ntsc/*.bak atari_ntsc/*~ + rm -rf android/libs android/obj android/bin android/gen + + +distclean: clean + -rm -f Makefile configure config.log config.status config.h android/jni/Android.mk + -rm -rf autom4te.cache + +install: $(TARGET) installdirs + $(INSTALL_PROGRAM) $(TARGET) ${DESTDIR}${BIN_DIR}/$(TARGET) + $(INSTALL_DATA) atari800.man ${DESTDIR}${MAN_DIR}/atari800.1 +# install also the documentation + $(INSTALL_DATA) ../COPYING ${DESTDIR}${DOC_DIR}/COPYING + $(INSTALL_DATA) ../README.1ST ${DESTDIR}${DOC_DIR}/README.1ST + $(INSTALL_DATA) ../DOC/README ${DESTDIR}${DOC_DIR}/README + $(INSTALL_DATA) ../DOC/INSTALL ${DESTDIR}${DOC_DIR}/INSTALL + $(INSTALL_DATA) ../DOC/USAGE ${DESTDIR}${DOC_DIR}/USAGE + $(INSTALL_DATA) ../DOC/NEWS ${DESTDIR}${DOC_DIR}/NEWS + +readme.html: $(TARGET) + ./$(TARGET) -help $@ + +doc: readme.html + +installdirs: + mkdir -p $(DESTDIR)$(BIN_DIR) $(DESTDIR)$(MAN_DIR) $(DESTDIR)$(DOC_DIR) diff --git a/src/aclocal.m4 b/src/aclocal.m4 new file mode 100644 index 0000000..689085c --- /dev/null +++ b/src/aclocal.m4 @@ -0,0 +1,187 @@ +############################################## +## The following part is copied from sdl.m4 ## +############################################## + +# Configure paths for SDL +# Sam Lantinga 9/21/99 +# stolen from Manish Singh +# stolen back from Frank Belew +# stolen from Manish Singh +# Shamelessly stolen from Owen Taylor + +dnl AM_PATH_SDL([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) +dnl Test for SDL, and define SDL_CFLAGS and SDL_LIBS +dnl +AC_DEFUN([AM_PATH_SDL], +[dnl +dnl Get the cflags and libraries from the sdl-config script +dnl +AC_ARG_WITH(sdl-prefix,[ --with-sdl-prefix=PFX Prefix where SDL is installed (optional)], + sdl_prefix="$withval", sdl_prefix="") +AC_ARG_WITH(sdl-exec-prefix,[ --with-sdl-exec-prefix=PFX Exec prefix where SDL is installed (optional)], + sdl_exec_prefix="$withval", sdl_exec_prefix="") +AC_ARG_ENABLE(sdltest, [ --disable-sdltest Do not try to compile and run a test SDL program], + , enable_sdltest=yes) + + if test x$sdl_exec_prefix != x ; then + sdl_config_args="$sdl_config_args --exec-prefix=$sdl_exec_prefix" + if test x${SDL_CONFIG+set} != xset ; then + SDL_CONFIG=$sdl_exec_prefix/bin/sdl-config + fi + fi + if test x$sdl_prefix != x ; then + sdl_config_args="$sdl_config_args --prefix=$sdl_prefix" + if test x${SDL_CONFIG+set} != xset ; then + SDL_CONFIG=$sdl_prefix/bin/sdl-config + fi + fi + + as_save_PATH="$PATH" + if test "x$prefix" != xNONE; then + PATH="$prefix/bin:$prefix/usr/bin:$PATH" + fi + AC_PATH_PROG(SDL_CONFIG, sdl-config, no, [$PATH]) + PATH="$as_save_PATH" + min_sdl_version=ifelse([$1], ,0.11.0,$1) + AC_MSG_CHECKING(for SDL - version >= $min_sdl_version) + no_sdl="" + if test "$SDL_CONFIG" = "no" ; then + no_sdl=yes + else + SDL_CFLAGS=`$SDL_CONFIG $sdl_config_args --cflags` + SDL_LIBS=`$SDL_CONFIG $sdl_config_args --libs` + + sdl_major_version=`$SDL_CONFIG $sdl_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + sdl_minor_version=`$SDL_CONFIG $sdl_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + sdl_micro_version=`$SDL_CONFIG $sdl_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + if test "x$enable_sdltest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_CXXFLAGS="$CXXFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $SDL_CFLAGS" + CXXFLAGS="$CXXFLAGS $SDL_CFLAGS" + LIBS="$LIBS $SDL_LIBS" +dnl +dnl Now check if the installed SDL is sufficiently new. (Also sanity +dnl checks the results of sdl-config to some extent +dnl + rm -f conf.sdltest + AC_TRY_RUN([ +#include +#include +#include +#include "SDL.h" + +char* +my_strdup (char *str) +{ + char *new_str; + + if (str) + { + new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); + strcpy (new_str, str); + } + else + new_str = NULL; + + return new_str; +} + +int main (int argc, char *argv[]) +{ + int major, minor, micro; + char *tmp_version; + + /* This hangs on some systems (?) + system ("touch conf.sdltest"); + */ + { FILE *fp = fopen("conf.sdltest", "a"); if ( fp ) fclose(fp); } + + /* HP/UX 9 (%@#!) writes to sscanf strings */ + tmp_version = my_strdup("$min_sdl_version"); + if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_sdl_version"); + exit(1); + } + + if (($sdl_major_version > major) || + (($sdl_major_version == major) && ($sdl_minor_version > minor)) || + (($sdl_major_version == major) && ($sdl_minor_version == minor) && ($sdl_micro_version >= micro))) + { + return 0; + } + else + { + printf("\n*** 'sdl-config --version' returned %d.%d.%d, but the minimum version\n", $sdl_major_version, $sdl_minor_version, $sdl_micro_version); + printf("*** of SDL required is %d.%d.%d. If sdl-config is correct, then it is\n", major, minor, micro); + printf("*** best to upgrade to the required version.\n"); + printf("*** If sdl-config was wrong, set the environment variable SDL_CONFIG\n"); + printf("*** to point to the correct copy of sdl-config, and remove the file\n"); + printf("*** config.cache before re-running configure\n"); + return 1; + } +} + +],, no_sdl=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + CFLAGS="$ac_save_CFLAGS" + CXXFLAGS="$ac_save_CXXFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + if test "x$no_sdl" = x ; then + AC_MSG_RESULT(yes) + ifelse([$2], , :, [$2]) + else + AC_MSG_RESULT(no) + if test "$SDL_CONFIG" = "no" ; then + echo "*** The sdl-config script installed by SDL could not be found" + echo "*** If SDL was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the SDL_CONFIG environment variable to the" + echo "*** full path to sdl-config." + else + if test -f conf.sdltest ; then + : + else + echo "*** Could not run SDL test program, checking why..." + CFLAGS="$CFLAGS $SDL_CFLAGS" + CXXFLAGS="$CXXFLAGS $SDL_CFLAGS" + LIBS="$LIBS $SDL_LIBS" + AC_TRY_LINK([ +#include +#include "SDL.h" + +int main(int argc, char *argv[]) +{ return 0; } +#undef main +#define main K_and_R_C_main +], [ return 0; ], + [ echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding SDL or finding the wrong" + echo "*** version of SDL. If it is not finding SDL, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], + [ echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means SDL was incorrectly installed" + echo "*** or that you have moved SDL since it was installed. In the latter case, you" + echo "*** may want to edit the sdl-config script: $SDL_CONFIG" ]) + CFLAGS="$ac_save_CFLAGS" + CXXFLAGS="$ac_save_CXXFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + SDL_CFLAGS="" + SDL_LIBS="" + ifelse([$3], , :, [$3]) + fi + AC_SUBST(SDL_CFLAGS) + AC_SUBST(SDL_LIBS) + rm -f conf.sdltest +]) diff --git a/src/af80.c b/src/af80.c new file mode 100644 index 0000000..9947e90 --- /dev/null +++ b/src/af80.c @@ -0,0 +1,390 @@ +/* + * af80.c - Emulation of the Austin Franklin 80 column card. + * + * Copyright (C) 2009 Perry McFarlane + * Copyright (C) 2009 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "af80.h" +#include "atari.h" +#include "util.h" +#include "log.h" +#include "memory.h" +#include "cpu.h" +#include + +static UBYTE *af80_rom = NULL; +static char af80_rom_filename[FILENAME_MAX]; +static UBYTE *af80_charset = NULL; +static char af80_charset_filename[FILENAME_MAX]; + +static UBYTE *af80_screen = NULL; +static UBYTE *af80_attrib = NULL; + +int AF80_enabled = FALSE; + +/* Austin Franklin information from forum posts by warerat at Atariage */ +static int rom_bank_select; /* bits 0-3 of d5f7, $0-$f 16 banks */ +static int not_rom_output_enable; /* bit 4 of d5f7 0 = Enable ROM 1 = Disable ROM */ +static int not_right_cartridge_rd4_control; /* 0=$8000-$9fff cart ROM, 1= $8000-$9fff system RAM */ +static int not_enable_2k_character_ram; +static int not_enable_2k_attribute_ram; +static int not_enable_crtc_registers; +static int not_enable_80_column_output; +static int video_bank_select; /* bits 0-3 of d5f6, $0-$f 16 banks */ +static int crtreg[0x40]; +static int const rgbi_palette[16] = { + 0x000000, /* black */ + 0x0000AA, /* blue */ + 0x00AA00, /* green */ + 0x00AAAA, /* cyan */ + 0xAA0000, /* red */ + 0xAA00AA, /* magenta */ + 0xAA5500, /* brown */ + 0xAAAAAA, /* white */ + 0x555555, /* grey */ + 0x5555FF, /* light blue */ + 0x55FF55, /* light green */ + 0x55FFFF, /* light cyan */ + 0xFF5555, /* light red */ + 0xFF55FF, /* light magenta */ + 0xFFFF55, /* yellow */ + 0xFFFFFF /* white (high intensity) */ +}; +int AF80_palette[16]; + +#ifdef AF80_DEBUG +#define D(a) a +#else +#define D(a) do{}while(0) +#endif + +static void update_d6(void) +{ + if (!not_enable_2k_character_ram) { + memcpy(MEMORY_mem + 0xd600, af80_screen + (video_bank_select<<7), 0x80); + memcpy(MEMORY_mem + 0xd680, af80_screen + (video_bank_select<<7), 0x80); + } + else if (!not_enable_2k_attribute_ram) { + memcpy(MEMORY_mem + 0xd600, af80_attrib + (video_bank_select<<7), 0x80); + memcpy(MEMORY_mem + 0xd680, af80_attrib + (video_bank_select<<7), 0x80); + } + else if (not_enable_crtc_registers) { + memset(MEMORY_mem + 0xd600, 0xff, 0x100); + } +} + +static void update_d5(void) +{ + if (not_rom_output_enable) { + memset(MEMORY_mem + 0xd500, 0xff, 0x100); + } + else { + memcpy(MEMORY_mem + 0xd500, af80_rom + (rom_bank_select<<8), 0x100); + } +} + +static void update_8000_9fff(void) +{ + if (not_right_cartridge_rd4_control) return; + if (not_rom_output_enable) { + memset(MEMORY_mem + 0x8000, 0xff, 0x2000); + } + else { + int i; + for (i=0; i<32; i++) { + memcpy(MEMORY_mem + 0x8000 + (i<<8), af80_rom + (rom_bank_select<<8), 0x100); + } + } +} + +int AF80_Initialise(int *argc, char *argv[]) +{ + int i, j; + int help_only = FALSE; + for (i = j = 1; i < *argc; i++) { + if (strcmp(argv[i], "-af80") == 0) { + AF80_enabled = TRUE; + } + else { + if (strcmp(argv[i], "-help") == 0) { + help_only = TRUE; + Log_print("\t-af80 Emulate the Austin Franklin 80 column board"); + } + argv[j++] = argv[i]; + } + } + *argc = j; + + if (help_only) + return TRUE; + + if (AF80_enabled) { + Log_print("Austin Franklin 80 enabled"); + af80_rom = (UBYTE *)Util_malloc(0x1000); + if (!Atari800_LoadImage(af80_rom_filename, af80_rom, 0x1000)) { + free(af80_rom); + af80_rom = NULL; + AF80_enabled = FALSE; + Log_print("Couldn't load Austin Franklin ROM image"); + return FALSE; + } + else { + Log_print("loaded Austin Franklin rom image"); + } + af80_charset = (UBYTE *)Util_malloc(0x1000); + if (!Atari800_LoadImage(af80_charset_filename, af80_charset, 0x1000)) { + free(af80_charset); + free(af80_rom); + af80_charset = af80_rom = NULL; + AF80_enabled = FALSE; + Log_print("Couldn't load Austin Franklin charset image"); + return FALSE; + } + else { + Log_print("loaded Austin Franklin charset image"); + } + af80_screen = (UBYTE *)Util_malloc(0x800); + af80_attrib = (UBYTE *)Util_malloc(0x800); + AF80_Reset(); + + /* swap palette */ + for (i=0; i<16; i++ ) { + j=i; + j = (j&0x0a) + ((j&0x01) << 2) + ((j&0x04) >> 2); + AF80_palette[i] = rgbi_palette[j]; + } + } + + return TRUE; +} + +void AF80_Exit(void) +{ + free(af80_screen); + free(af80_attrib); + free(af80_charset); + free(af80_rom); + af80_screen = af80_attrib = af80_charset = af80_rom = NULL; +} + +void AF80_InsertRightCartridge(void) +{ + MEMORY_Cart809fEnable(); + update_d5(); + update_8000_9fff(); +} + +int AF80_ReadConfig(char *string, char *ptr) +{ + if (strcmp(string, "AF80_ROM") == 0) + Util_strlcpy(af80_rom_filename, ptr, sizeof(af80_rom_filename)); + else if (strcmp(string, "AF80_CHARSET") == 0) + Util_strlcpy(af80_charset_filename, ptr, sizeof(af80_charset_filename)); + else return FALSE; /* no match */ + return TRUE; /* matched something */ +} + +void AF80_WriteConfig(FILE *fp) +{ + fprintf(fp, "AF80_ROM=%s\n", af80_rom_filename); + fprintf(fp, "AF80_CHARSET=%s\n", af80_charset_filename); +} + +int AF80_D6GetByte(UWORD addr, int no_side_effects) +{ + int result = 0xff; + if (!not_enable_2k_character_ram) { + result = MEMORY_dGetByte(addr); + } + else if (!not_enable_2k_attribute_ram) { + result = MEMORY_dGetByte(addr); + } + else if (!not_enable_crtc_registers) { + if (video_bank_select == 0 ) { + if ((addr&0xff)<0x40) { + result = crtreg[addr&0xff]; + if ((addr&0xff) == 0x3a) { + result = 0x01; + } + } + D(printf("AF80 Read addr:%4x cpu:%4x\n", addr, CPU_remember_PC[(CPU_remember_PC_curpos-1)%CPU_REMEMBER_PC_STEPS])); + } + } + return result; +} + +void AF80_D6PutByte(UWORD addr, UBYTE byte) +{ + if (!not_enable_2k_character_ram) { + MEMORY_dPutByte((addr&0xff7f),byte); + MEMORY_dPutByte((addr&0xff7f)+0x80,byte); + af80_screen[(addr&0x7f) + (video_bank_select<<7)] = byte; + } + else if (!not_enable_2k_attribute_ram) { + MEMORY_dPutByte((addr&0xff7f),byte); + MEMORY_dPutByte((addr&0xff7f)+0x80,byte); + af80_attrib[(addr&0x7f) + (video_bank_select<<7)] = byte; + D(printf("AF80 Write, attribute, addr:%4x byte:%2x, cpu:%4x\n", addr, byte,CPU_remember_PC[(CPU_remember_PC_curpos-1)%CPU_REMEMBER_PC_STEPS])); + } + else if (!not_enable_crtc_registers) { + if (video_bank_select == 0 ) { + if ((addr&0xff)<0x40) { + crtreg[addr&0xff] = byte; + } + D(if (1 || (addr!=0xd618 && addr!=0xd619)) printf("AF80 Write addr:%4x byte:%2x, cpu:%4x\n", addr, byte,CPU_remember_PC[(CPU_remember_PC_curpos-1)%CPU_REMEMBER_PC_STEPS])); + } + else { + D(printf("AF80 Write, video_bank_select!=0, addr:%4x byte:%2x, cpu:%4x\n", addr, byte,CPU_remember_PC[(CPU_remember_PC_curpos-1)%CPU_REMEMBER_PC_STEPS])); + } + } +} + +int AF80_D5GetByte(UWORD addr, int no_side_effects) +{ + int result = MEMORY_dGetByte(addr); + return result; +} + +void AF80_D5PutByte(UWORD addr, UBYTE byte) +{ + if (addr == 0xd5f6) { + int need_update_d6 = FALSE; + if ((byte&0x10) != not_enable_2k_character_ram) { + not_enable_2k_character_ram = (byte & 0x10); + need_update_d6 = TRUE; + } + if ((byte&0x20) != not_enable_2k_attribute_ram) { + not_enable_2k_attribute_ram = (byte & 0x20); + need_update_d6 = TRUE; + } + if ((byte&0x40) != not_enable_crtc_registers) { + not_enable_crtc_registers = (byte & 0x40); + need_update_d6 = TRUE; + } + if ((byte&0x80) != not_enable_80_column_output) { + not_enable_80_column_output = (byte & 0x80); + } + if ((byte&0x0f) != video_bank_select) { + video_bank_select = (byte & 0x0f); + need_update_d6 = TRUE; + } + if (need_update_d6) { + update_d6(); + } + } + else if (addr == 0xd5f7) { + int need_update_d5 = FALSE; + int need_update_8000_9fff = FALSE; + if ((byte&0x10) != not_rom_output_enable) { + not_rom_output_enable = (byte & 0x10); + need_update_d5 = TRUE; + if (byte&0x20) { + need_update_8000_9fff = TRUE; + } + } + if ((byte&0x20) != not_right_cartridge_rd4_control) { + not_right_cartridge_rd4_control = (byte & 0x20); + if (not_right_cartridge_rd4_control) { + MEMORY_Cart809fDisable(); + } + else { + MEMORY_Cart809fEnable(); + need_update_8000_9fff = TRUE; + } + } + if ((byte&0x0f) != rom_bank_select) { + rom_bank_select = (byte & 0x0f); + if (!not_rom_output_enable) { + need_update_d5 = TRUE; + if (!not_right_cartridge_rd4_control) { + need_update_8000_9fff = TRUE; + } + } + } + if (need_update_d5) { + update_d5(); + } + if (need_update_8000_9fff) { + update_8000_9fff(); + } + } + D(if (addr!=0xd5f7 && addr!=0xd5f6) printf("AF80 Write addr:%4x byte:%2x, cpu:%4x\n", addr, byte,CPU_remember_PC[(CPU_remember_PC_curpos-1)%CPU_REMEMBER_PC_STEPS])); +} + +UBYTE AF80_GetPixels(int scanline, int column, int *colour, int blink) +{ +#define AF80_ROWS 25 +#define AF80_CELL_HEIGHT 10 + UBYTE character; + int attrib; + UBYTE font_data; + int table_start = crtreg[0x0c] + ((crtreg[0x0d]&0x3f)<<8); + int row = scanline / AF80_CELL_HEIGHT; + int line = scanline % AF80_CELL_HEIGHT; + int screen_pos; + if (row >= AF80_ROWS) { + return 0; + } + + if (row >= crtreg[0x10]) { + screen_pos = (row-crtreg[0x10])*80 + column + crtreg[0x0e] + ((crtreg[0x0f]&0x3f)<<8); + } + else { + screen_pos = row*80+column + table_start; + } + screen_pos &= 0x7ff; + character = af80_screen[screen_pos]; + attrib = af80_attrib[screen_pos]; + font_data = af80_charset[character*16 + line]; + if (attrib & 0x01) { + font_data ^= 0xff; /* invert */ + } + if ((attrib & 0x02) && blink) { + font_data = 0x00; /* blink */ + } + if (line+1 == AF80_CELL_HEIGHT && (attrib & 0x04)) { + font_data = 0xff; /* underline */ + } + if (row == crtreg[0x18] && column == crtreg[0x19] && !blink) { + font_data = 0xff; /* cursor */ + } + *colour = attrib>>4; /* set number of palette entry */ + return font_data; +} + +void AF80_Reset(void) +{ + memset(af80_screen, 0, 0x800); + memset(af80_attrib, 0, 0x800); + rom_bank_select = 0; + not_rom_output_enable = 0; + not_right_cartridge_rd4_control = 0; + not_enable_2k_character_ram = 0; + not_enable_2k_attribute_ram = 0; + not_enable_crtc_registers = 0; + not_enable_80_column_output = 0; + video_bank_select = 0; + memset(crtreg, 0, 0x40); +} + +/* +vim:ts=4:sw=4: +*/ diff --git a/src/af80.h b/src/af80.h new file mode 100644 index 0000000..1295024 --- /dev/null +++ b/src/af80.h @@ -0,0 +1,21 @@ +#ifndef AF80_H_ +#define AF80_H_ + +#include "atari.h" +#include + +extern int AF80_palette[16]; +int AF80_Initialise(int *argc, char *argv[]); +void AF80_Exit(void); +void AF80_InsertRightCartridge(void); +int AF80_ReadConfig(char *string, char *ptr); +void AF80_WriteConfig(FILE *fp); +int AF80_D5GetByte(UWORD addr, int no_side_effects); +void AF80_D5PutByte(UWORD addr, UBYTE byte); +int AF80_D6GetByte(UWORD addr, int no_side_effects); +void AF80_D6PutByte(UWORD addr, UBYTE byte); +UBYTE AF80_GetPixels(int scanline, int column, int *colour, int blink); +extern int AF80_enabled; +void AF80_Reset(void); + +#endif /* AF80_H_ */ diff --git a/src/afile.c b/src/afile.c new file mode 100644 index 0000000..a1c84a6 --- /dev/null +++ b/src/afile.c @@ -0,0 +1,245 @@ +/* + * afile.c - Detection and opening of different Atari file types. + * + * Copyright (c) 1998-2008 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ +#include "config.h" +#include "atari.h" +#include "afile.h" +#include "binload.h" +#include "cartridge.h" +#include "cassette.h" +#include "gtia.h" +#include "img_tape.h" +#include "log.h" +#include "sio.h" +#include "statesav.h" +#include "util.h" +#ifndef BASIC +#include "ui.h" +#endif /* BASIC */ +#ifdef HAVE_LIBZ +#include +#endif +#include + + +int AFILE_DetectFileType(const char *filename) +{ + UBYTE header[4]; + int file_length; + FILE *fp = fopen(filename, "rb"); + if (fp == NULL) + return AFILE_ERROR; + if (fread(header, 1, 4, fp) != 4) { + fclose(fp); + return AFILE_ERROR; + } + switch (header[0]) { + case 0: + if (header[1] == 0 && (header[2] != 0 || header[3] != 0) /* && file_length < 37 * 1024 */) { + fclose(fp); + return AFILE_BAS; + } + break; + case 0x1f: + if (header[1] == 0x8b) { +#ifndef HAVE_LIBZ + fclose(fp); + Log_print("\"%s\" is a compressed file.", filename); + Log_print("This executable does not support compressed files. You can uncompress this file"); + Log_print("with an external program that supports gzip (*.gz) files (e.g. gunzip)"); + Log_print("and then load into this emulator."); + return AFILE_ERROR; +#else /* HAVE_LIBZ */ + gzFile gzf; + fclose(fp); + gzf = gzopen(filename, "rb"); + if (gzf == NULL) + return AFILE_ERROR; + if (gzread(gzf, header, 4) != 4) { + gzclose(gzf); + return AFILE_ERROR; + } + gzclose(gzf); + if (header[0] == 0x96 && header[1] == 0x02) + return AFILE_ATR_GZ; + if (header[0] == 'A' && header[1] == 'T' && header[2] == 'A' && header[3] == 'R') + return AFILE_STATE_GZ; + return AFILE_XFD_GZ; +#endif /* HAVE_LIBZ */ + } + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if ((header[1] >= '0' && header[1] <= '9') || header[1] == ' ') { + fclose(fp); + return AFILE_LST; + } + break; + case 'A': + if (header[1] == 'T' && header[2] == 'A' && header[3] == 'R') { + fclose(fp); + return AFILE_STATE; + } + if (header[1] == 'T' && header[2] == '8' && header[3] == 'X') { + fclose(fp); + return AFILE_ATX; + } + break; + case 'C': + if (header[1] == 'A' && header[2] == 'R' && header[3] == 'T') { + fclose(fp); + return AFILE_CART; + } + break; + case 0x96: + if (header[1] == 0x02) { + fclose(fp); + return AFILE_ATR; + } + break; + case 0xf9: + case 0xfa: + fclose(fp); + return AFILE_DCM; + case 0xff: + if (header[1] == 0xff && (header[2] != 0xff || header[3] != 0xff)) { + fclose(fp); + return AFILE_XEX; + } + break; + default: + break; + } + file_length = Util_flen(fp); + fclose(fp); + /* Detect .pro images */ + /* # of sectors is in header */ + if ((file_length-16)%(128+12) == 0 && + header[0]*256 + header[1] == (file_length-16)/(128+12) && + header[2] == 'P') { +#ifdef DEBUG_PRO + Log_print(".pro file detected"); +#endif + return AFILE_PRO; + } + /* 40K or a-power-of-two between 4K and CARTRIDGE_MAX_SIZE */ + if (file_length >= 4 * 1024 && file_length <= CARTRIDGE_MAX_SIZE + && ((file_length & (file_length - 1)) == 0 || file_length == 40 * 1024)) + return AFILE_ROM; + /* BOOT_TAPE is a raw file containing a program booted from a tape */ + if ((header[1] << 7) == file_length) + return AFILE_BOOT_TAPE; + if ((file_length & 0x7f) == 0) + return AFILE_XFD; + if (IMG_TAPE_FileSupported(header)) + return AFILE_CAS; + return AFILE_ERROR; +} + +int AFILE_OpenFile(const char *filename, int reboot, int diskno, int readonly) +{ + int type = AFILE_DetectFileType(filename); + switch (type) { + case AFILE_ATR: + case AFILE_ATX: + case AFILE_XFD: + case AFILE_ATR_GZ: + case AFILE_XFD_GZ: + case AFILE_DCM: + case AFILE_PRO: + if (!SIO_Mount(diskno, filename, readonly)) + return AFILE_ERROR; + if (reboot) + Atari800_Coldstart(); + break; + case AFILE_XEX: + case AFILE_BAS: + case AFILE_LST: + if (!BINLOAD_Loader(filename)) + return AFILE_ERROR; + break; + case AFILE_CART: + case AFILE_ROM: + { + int r; + if (reboot) + r = CARTRIDGE_InsertAutoReboot(filename); + else + r = CARTRIDGE_Insert(filename); + switch (r) { + case CARTRIDGE_CANT_OPEN: + case CARTRIDGE_BAD_FORMAT: + return AFILE_ERROR; + case CARTRIDGE_BAD_CHECKSUM: + case 0: + /* ok */ + break; + default: +#ifdef BASIC + Log_print("Raw cartridge images are not supported in BASIC version."); + return AFILE_ERROR; +#else /* BASIC */ + /* r > 0 */ +#ifndef ANDROID + CARTRIDGE_SetTypeAutoReboot(&CARTRIDGE_main, UI_SelectCartType(r)); +#else + return (r << 8) | AFILE_ROM; +#endif /* ANDROID */ + break; +#endif /* BASIC */ + } + } + break; + case AFILE_CAS: + case AFILE_BOOT_TAPE: + if (!CASSETTE_Insert(filename)) + return AFILE_ERROR; + if (reboot) { + CASSETTE_hold_start = TRUE; + Atari800_Coldstart(); + } + break; + case AFILE_STATE: + case AFILE_STATE_GZ: +#ifdef BASIC + Log_print("State files are not supported in BASIC version"); + return AFILE_ERROR; +#else + if (!StateSav_ReadAtariState(filename, "rb")) + return AFILE_ERROR; + /* Don't press Start nor Option */ + GTIA_consol_override = 0; + break; +#endif + default: + break; + } + return type; +} diff --git a/src/afile.h b/src/afile.h new file mode 100644 index 0000000..032cafe --- /dev/null +++ b/src/afile.h @@ -0,0 +1,50 @@ +#ifndef AFILE_H_ +#define AFILE_H_ + +/* File types returned by AFILE_DetectFileType() and AFILE_OpenFile(). */ +#define AFILE_ERROR 0 +#define AFILE_ATR 1 +#define AFILE_XFD 2 +#define AFILE_ATR_GZ 3 +#define AFILE_XFD_GZ 4 +#define AFILE_DCM 5 +#define AFILE_XEX 6 +#define AFILE_BAS 7 +#define AFILE_LST 8 +#define AFILE_CART 9 +#define AFILE_ROM 10 +#define AFILE_CAS 11 +#define AFILE_BOOT_TAPE 12 +#define AFILE_STATE 13 +#define AFILE_STATE_GZ 14 +#define AFILE_PRO 15 +#define AFILE_ATX 16 + +/* ATR format header */ +struct AFILE_ATR_Header { + unsigned char magic1; + unsigned char magic2; + unsigned char seccountlo; + unsigned char seccounthi; + unsigned char secsizelo; + unsigned char secsizehi; + unsigned char hiseccountlo; + unsigned char hiseccounthi; + unsigned char gash[7]; + unsigned char writeprotect; +}; + +/* First two bytes of an ATR file. */ +#define AFILE_ATR_MAGIC1 0x96 +#define AFILE_ATR_MAGIC2 0x02 + +/* Auto-detects file type and returns one of AFILE_* values. */ +int AFILE_DetectFileType(const char *filename); + +/* Auto-detects file type and mounts the file in the emulator. + reboot: Atari800_Coldstart() for disks, cartridges and tapes + diskno: drive number for disks (1-8) + readonly: mount disks as read-only */ +int AFILE_OpenFile(const char *filename, int reboot, int diskno, int readonly); + +#endif /* AFILE_H_ */ diff --git a/src/akey.h b/src/akey.h new file mode 100644 index 0000000..07e9b3d --- /dev/null +++ b/src/akey.h @@ -0,0 +1,255 @@ +#ifndef AKEY_H_ +#define AKEY_H_ +/* akey.h: Atari key codes */ + +/* INPUT_key_code values */ +#define AKEY_NONE -1 + +/* Special key codes. */ +#define AKEY_WARMSTART -2 +#define AKEY_COLDSTART -3 +#define AKEY_EXIT -4 +#define AKEY_BREAK -5 +#define AKEY_UI -7 +#define AKEY_SCREENSHOT -8 +#define AKEY_SCREENSHOT_INTERLACE -9 +#define AKEY_START -10 +#define AKEY_SELECT -11 +#define AKEY_OPTION -12 +#define AKEY_PBI_BB_MENU -13 +#define AKEY_CX85_1 -14 +#define AKEY_CX85_2 -15 +#define AKEY_CX85_3 -16 +#define AKEY_CX85_4 -17 +#define AKEY_CX85_5 -18 +#define AKEY_CX85_6 -19 +#define AKEY_CX85_7 -20 +#define AKEY_CX85_8 -21 +#define AKEY_CX85_9 -22 +#define AKEY_CX85_0 -23 +#define AKEY_CX85_PERIOD -24 +#define AKEY_CX85_MINUS -25 +#define AKEY_CX85_PLUS_ENTER -26 +#define AKEY_CX85_ESCAPE -27 +#define AKEY_CX85_NO -28 +#define AKEY_CX85_DELETE -29 +#define AKEY_CX85_YES -30 +#define AKEY_TURBO -31 +#ifdef USE_UI_BASIC_ONSCREEN_KEYBOARD +#define AKEY_KEYB -32 +#endif +#ifdef DIRECTX + /* special menu directives */ + #define AKEY32_MENU_SAVE_CONFIG -107 + #define AKEY32_UI_MOUSE_CLICK -108 +#endif + +#define AKEY_SHFT 0x40 +#define AKEY_CTRL 0x80 +#define AKEY_SHFTCTRL 0xc0 + +#define AKEY_0 0x32 +#define AKEY_1 0x1f +#define AKEY_2 0x1e +#define AKEY_3 0x1a +#define AKEY_4 0x18 +#define AKEY_5 0x1d +#define AKEY_6 0x1b +#define AKEY_7 0x33 +#define AKEY_8 0x35 +#define AKEY_9 0x30 + +#define AKEY_CTRL_0 (AKEY_CTRL | AKEY_0) +#define AKEY_CTRL_1 (AKEY_CTRL | AKEY_1) +#define AKEY_CTRL_2 (AKEY_CTRL | AKEY_2) +#define AKEY_CTRL_3 (AKEY_CTRL | AKEY_3) +#define AKEY_CTRL_4 (AKEY_CTRL | AKEY_4) +#define AKEY_CTRL_5 (AKEY_CTRL | AKEY_5) +#define AKEY_CTRL_6 (AKEY_CTRL | AKEY_6) +#define AKEY_CTRL_7 (AKEY_CTRL | AKEY_7) +#define AKEY_CTRL_8 (AKEY_CTRL | AKEY_8) +#define AKEY_CTRL_9 (AKEY_CTRL | AKEY_9) + +#define AKEY_a 0x3f +#define AKEY_b 0x15 +#define AKEY_c 0x12 +#define AKEY_d 0x3a +#define AKEY_e 0x2a +#define AKEY_f 0x38 +#define AKEY_g 0x3d +#define AKEY_h 0x39 +#define AKEY_i 0x0d +#define AKEY_j 0x01 +#define AKEY_k 0x05 +#define AKEY_l 0x00 +#define AKEY_m 0x25 +#define AKEY_n 0x23 +#define AKEY_o 0x08 +#define AKEY_p 0x0a +#define AKEY_q 0x2f +#define AKEY_r 0x28 +#define AKEY_s 0x3e +#define AKEY_t 0x2d +#define AKEY_u 0x0b +#define AKEY_v 0x10 +#define AKEY_w 0x2e +#define AKEY_x 0x16 +#define AKEY_y 0x2b +#define AKEY_z 0x17 + +#define AKEY_A (AKEY_SHFT | AKEY_a) +#define AKEY_B (AKEY_SHFT | AKEY_b) +#define AKEY_C (AKEY_SHFT | AKEY_c) +#define AKEY_D (AKEY_SHFT | AKEY_d) +#define AKEY_E (AKEY_SHFT | AKEY_e) +#define AKEY_F (AKEY_SHFT | AKEY_f) +#define AKEY_G (AKEY_SHFT | AKEY_g) +#define AKEY_H (AKEY_SHFT | AKEY_h) +#define AKEY_I (AKEY_SHFT | AKEY_i) +#define AKEY_J (AKEY_SHFT | AKEY_j) +#define AKEY_K (AKEY_SHFT | AKEY_k) +#define AKEY_L (AKEY_SHFT | AKEY_l) +#define AKEY_M (AKEY_SHFT | AKEY_m) +#define AKEY_N (AKEY_SHFT | AKEY_n) +#define AKEY_O (AKEY_SHFT | AKEY_o) +#define AKEY_P (AKEY_SHFT | AKEY_p) +#define AKEY_Q (AKEY_SHFT | AKEY_q) +#define AKEY_R (AKEY_SHFT | AKEY_r) +#define AKEY_S (AKEY_SHFT | AKEY_s) +#define AKEY_T (AKEY_SHFT | AKEY_t) +#define AKEY_U (AKEY_SHFT | AKEY_u) +#define AKEY_V (AKEY_SHFT | AKEY_v) +#define AKEY_W (AKEY_SHFT | AKEY_w) +#define AKEY_X (AKEY_SHFT | AKEY_x) +#define AKEY_Y (AKEY_SHFT | AKEY_y) +#define AKEY_Z (AKEY_SHFT | AKEY_z) + +#define AKEY_CTRL_a (AKEY_CTRL | AKEY_a) +#define AKEY_CTRL_b (AKEY_CTRL | AKEY_b) +#define AKEY_CTRL_c (AKEY_CTRL | AKEY_c) +#define AKEY_CTRL_d (AKEY_CTRL | AKEY_d) +#define AKEY_CTRL_e (AKEY_CTRL | AKEY_e) +#define AKEY_CTRL_f (AKEY_CTRL | AKEY_f) +#define AKEY_CTRL_g (AKEY_CTRL | AKEY_g) +#define AKEY_CTRL_h (AKEY_CTRL | AKEY_h) +#define AKEY_CTRL_i (AKEY_CTRL | AKEY_i) +#define AKEY_CTRL_j (AKEY_CTRL | AKEY_j) +#define AKEY_CTRL_k (AKEY_CTRL | AKEY_k) +#define AKEY_CTRL_l (AKEY_CTRL | AKEY_l) +#define AKEY_CTRL_m (AKEY_CTRL | AKEY_m) +#define AKEY_CTRL_n (AKEY_CTRL | AKEY_n) +#define AKEY_CTRL_o (AKEY_CTRL | AKEY_o) +#define AKEY_CTRL_p (AKEY_CTRL | AKEY_p) +#define AKEY_CTRL_q (AKEY_CTRL | AKEY_q) +#define AKEY_CTRL_r (AKEY_CTRL | AKEY_r) +#define AKEY_CTRL_s (AKEY_CTRL | AKEY_s) +#define AKEY_CTRL_t (AKEY_CTRL | AKEY_t) +#define AKEY_CTRL_u (AKEY_CTRL | AKEY_u) +#define AKEY_CTRL_v (AKEY_CTRL | AKEY_v) +#define AKEY_CTRL_w (AKEY_CTRL | AKEY_w) +#define AKEY_CTRL_x (AKEY_CTRL | AKEY_x) +#define AKEY_CTRL_y (AKEY_CTRL | AKEY_y) +#define AKEY_CTRL_z (AKEY_CTRL | AKEY_z) + +#define AKEY_CTRL_A (AKEY_CTRL | AKEY_A) +#define AKEY_CTRL_B (AKEY_CTRL | AKEY_B) +#define AKEY_CTRL_C (AKEY_CTRL | AKEY_C) +#define AKEY_CTRL_D (AKEY_CTRL | AKEY_D) +#define AKEY_CTRL_E (AKEY_CTRL | AKEY_E) +#define AKEY_CTRL_F (AKEY_CTRL | AKEY_F) +#define AKEY_CTRL_G (AKEY_CTRL | AKEY_G) +#define AKEY_CTRL_H (AKEY_CTRL | AKEY_H) +#define AKEY_CTRL_I (AKEY_CTRL | AKEY_I) +#define AKEY_CTRL_J (AKEY_CTRL | AKEY_J) +#define AKEY_CTRL_K (AKEY_CTRL | AKEY_K) +#define AKEY_CTRL_L (AKEY_CTRL | AKEY_L) +#define AKEY_CTRL_M (AKEY_CTRL | AKEY_M) +#define AKEY_CTRL_N (AKEY_CTRL | AKEY_N) +#define AKEY_CTRL_O (AKEY_CTRL | AKEY_O) +#define AKEY_CTRL_P (AKEY_CTRL | AKEY_P) +#define AKEY_CTRL_Q (AKEY_CTRL | AKEY_Q) +#define AKEY_CTRL_R (AKEY_CTRL | AKEY_R) +#define AKEY_CTRL_S (AKEY_CTRL | AKEY_S) +#define AKEY_CTRL_T (AKEY_CTRL | AKEY_T) +#define AKEY_CTRL_U (AKEY_CTRL | AKEY_U) +#define AKEY_CTRL_V (AKEY_CTRL | AKEY_V) +#define AKEY_CTRL_W (AKEY_CTRL | AKEY_W) +#define AKEY_CTRL_X (AKEY_CTRL | AKEY_X) +#define AKEY_CTRL_Y (AKEY_CTRL | AKEY_Y) +#define AKEY_CTRL_Z (AKEY_CTRL | AKEY_Z) + +#define AKEY_HELP 0x11 +#define AKEY_DOWN 0x8f +#define AKEY_LEFT 0x86 +#define AKEY_RIGHT 0x87 +#define AKEY_UP 0x8e +#define AKEY_BACKSPACE 0x34 +#define AKEY_DELETE_CHAR 0xb4 +#define AKEY_DELETE_LINE 0x74 +#define AKEY_INSERT_CHAR 0xb7 +#define AKEY_INSERT_LINE 0x77 +#define AKEY_ESCAPE 0x1c +#define AKEY_ATARI 0x27 +#define AKEY_CAPSLOCK 0x7c +#define AKEY_CAPSTOGGLE 0x3c +#define AKEY_TAB 0x2c +#define AKEY_SETTAB 0x6c +#define AKEY_CLRTAB 0xac +#define AKEY_RETURN 0x0c +#define AKEY_SPACE 0x21 +#define AKEY_EXCLAMATION 0x5f +#define AKEY_DBLQUOTE 0x5e +#define AKEY_HASH 0x5a +#define AKEY_DOLLAR 0x58 +#define AKEY_PERCENT 0x5d +#define AKEY_AMPERSAND 0x5b +#define AKEY_QUOTE 0x73 +#define AKEY_AT 0x75 +#define AKEY_PARENLEFT 0x70 +#define AKEY_PARENRIGHT 0x72 +#define AKEY_LESS 0x36 +#define AKEY_GREATER 0x37 +#define AKEY_EQUAL 0x0f +#define AKEY_QUESTION 0x66 +#define AKEY_MINUS 0x0e +#define AKEY_PLUS 0x06 +#define AKEY_ASTERISK 0x07 +#define AKEY_SLASH 0x26 +#define AKEY_COLON 0x42 +#define AKEY_SEMICOLON 0x02 +#define AKEY_COMMA 0x20 +#define AKEY_FULLSTOP 0x22 +#define AKEY_UNDERSCORE 0x4e +#define AKEY_BRACKETLEFT 0x60 +#define AKEY_BRACKETRIGHT 0x62 +#define AKEY_CIRCUMFLEX 0x47 +#define AKEY_BACKSLASH 0x46 +#define AKEY_BAR 0x4f +#define AKEY_CLEAR (AKEY_SHFT | AKEY_LESS) +#define AKEY_CARET (AKEY_SHFT | AKEY_ASTERISK) +#define AKEY_F1 0x03 +#define AKEY_F2 0x04 +#define AKEY_F3 0x13 +#define AKEY_F4 0x14 + +/* Following keys cannot be read with both shift and control pressed: + J K L ; + * Z X C V B F1 F2 F3 F4 HELP */ + +/* 5200 key codes */ +#define AKEY_5200_START 0x39 +#define AKEY_5200_PAUSE 0x31 +#define AKEY_5200_RESET 0x29 +#define AKEY_5200_0 0x25 +#define AKEY_5200_1 0x3f +#define AKEY_5200_2 0x3d +#define AKEY_5200_3 0x3b +#define AKEY_5200_4 0x37 +#define AKEY_5200_5 0x35 +#define AKEY_5200_6 0x33 +#define AKEY_5200_7 0x2f +#define AKEY_5200_8 0x2d +#define AKEY_5200_9 0x2b +#define AKEY_5200_HASH 0x23 +#define AKEY_5200_ASTERISK 0x27 + +#endif /* AKEY_H_ */ diff --git a/src/amiga/.cvsignore b/src/amiga/.cvsignore new file mode 100644 index 0000000..8e67355 --- /dev/null +++ b/src/amiga/.cvsignore @@ -0,0 +1,3 @@ +ppc-amigaos-objs +Atari800 +Atari800.debug diff --git a/src/amiga/Atari800.guide b/src/amiga/Atari800.guide new file mode 100644 index 0000000..3c98684 --- /dev/null +++ b/src/amiga/Atari800.guide @@ -0,0 +1,109 @@ +@DATABASE "Atari800.guide" +@$VER: Atari800.guide 1.0 (23.03.00) +@AUTHOR Sebastian Bauer +@(C) ©2000 + +@NODE MAIN "Atari800 - Guide" +@SMARTWRAP +@{b}Atari800 1.0 @{AMIGAGUIDE}@{ub} + + +Note that the @{" guide author's " link CONTACTING} native language is German. So please +forgive any spelling and gramer mistakes. Or better correct them and send them +to @{" me " link CONTACTING}. + +@{b}Attention!@{ub} This guide is designed for use with version 40 of the +amigaguide.datatype which is supplied with AmigaOS 3.1. Under other versions +this guide may look @{b}"less than optimal"@{ub}. Note further that if you +are presently running Kickstart 3.0, you may @{b}still@{ub} use Workbench +3.1 with it, including the newer amigaguide.datatype. +@{CODE} + +@{" Copyright " link COPYRIGHT} Copyright and disclaimer +@{" Introduction " link INTRO} What does it do ? +@{" Requirements " link REQUIRE} What does it need ? +@{" Installation " link INSTALL} How to install (and remove) ? + +@{" Usage " link USAGE} How to use it? + +@{" Contacting " link CONTACTING } Where to send bug reports ? + +@ENDNODE + + +@NODE COPYRIGHT "Atari800 - Copyright and disclamer" +@SMARTWRAP +@{b}Copyright@{ub} + +Copyright (C) 1995 David Firth. E-Mail: david@signus.demon.co.uk + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + + +@{" GNU General Public License " link COPYING/main} + +@ENDNODE + +@NODE INTRO "Atari800 - Introduction" +@SMARTWRAP +@{b}Introduction@{ub} + +@ENDNODE + +@NODE REQUIRE "Atari800 - Requirements" +@SMARTWRAP +@{b}Requirements@{ub} + + +The Amiga port of the Emulator requires a 68020 processor, OS3.0 and +MUI3.8. For sound support AHI is needed. + + +It also requires the Atari ROMs. + +@ENDNODE + +@NODE INSTALL "Atari800 - Installation" +@SMARTWRAP +@{b}How to install Atari800@{ub} + + +To install Atari800 simply copy the whole Atari800 drawer to the destination of your +choice. The ROM files must be in the copied in the same directory (but this can +be also changed). + +@ENDNODE + + +@NODE USAGE "Atari800 - Usage" +@SMARTWRAP +@{b}Usage@{ub} + + +Sorry, but not written yet. + +@ENDNODE + +@NODE CONTACTING "Atari800 - Contacting" +@SMARTWRAP +@{b}Contacting@{ub} + + +The Amiga port of the Atari800 emulator was created by Sebastian Bauer. + +Any comments which are related to the Amiga version should be sent to@{LINE} +@{" sebauer@t-online.de " system "YAM:YAM MAILTO sebauer@t-online.de NOCHECK"} or @{" Sebastian.Bauer@in.stud.tu-ilmenau.de " system "YAM:YAM MAILTO Sebastian.Bauer@in.stud.tu-ilmenau.de NOCHECK"}@{LINE} + +The latest version of the emulator can be obtained from my homepage:@{LINE} +@{" http://home.t-online.de/home/sebauer/english.html " system "C:OpenURL http://home.t-online.de/home/sebauer/english.html"} + + +Also look on the official Atari800 Emulator support page at: + +@{" http://cas3.zlin.vutbr.cz/~stehlik/a800.htm " system "C:OpenURL http://cas3.zlin.vutbr.cz/~stehlik/a800.htm"} + +@ENDNODE + diff --git a/src/amiga/Atari800_rev.h b/src/amiga/Atari800_rev.h new file mode 100644 index 0000000..aaee845 --- /dev/null +++ b/src/amiga/Atari800_rev.h @@ -0,0 +1,6 @@ +#define VERSION 2 +#define REVISION 1 +#define DATE "30.03.2009" +#define VERS "Atari800 2.1.0" +#define VSTRING "Atari800 2.1.0 (30.03.2009)\r\n" +#define VERSTAG "\0$VER: Atari800 2.1.0 (30.03.2009)" diff --git a/src/amiga/Atari800_rev.i b/src/amiga/Atari800_rev.i new file mode 100644 index 0000000..1c975f1 --- /dev/null +++ b/src/amiga/Atari800_rev.i @@ -0,0 +1,18 @@ +VERSION EQU 2 +REVISION EQU 4 + +DATE MACRO + dc.b '31.03.2009' + ENDM + +VERS MACRO + dc.b 'Atari800 2.1' + ENDM + +VSTRING MACRO + dc.b 'Atari800 2.1 (31.03.2009)',13,10,0 + ENDM + +VERSTAG MACRO + dc.b 0,'$VER: Atari800 2.1 (31.03.2009)',0 + ENDM diff --git a/src/amiga/Atari800_rev.rev b/src/amiga/Atari800_rev.rev new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/src/amiga/Atari800_rev.rev @@ -0,0 +1 @@ +1 diff --git a/src/amiga/Atari800_rev.s b/src/amiga/Atari800_rev.s new file mode 100644 index 0000000..58db122 --- /dev/null +++ b/src/amiga/Atari800_rev.s @@ -0,0 +1,21 @@ +VERSION = 2 +REVISION = 1 + +.macro DATE +.ascii "31.03.2009" +.endm + +.macro VERS +.ascii "Atari800 2.1" +.endm + +.macro VSTRING +.ascii "Atari800 2.1 (31.03.2009)" +.byte 13,10,0 +.endm + +.macro VERSTAG +.byte 0 +.ascii "$VER: Atari800 2.1 (31.03.2009)" +.byte 0 +.endm diff --git a/src/amiga/ReadMe b/src/amiga/ReadMe new file mode 100644 index 0000000..50cde34 --- /dev/null +++ b/src/amiga/ReadMe @@ -0,0 +1,79 @@ +Short: V2.4 of the Atari 8-bit emulator +Uploader: mail@sebastianbauer.info (Sebastian Bauer) +Author: mail@sebastianbauer.info (Sebastian Bauer), Atari800 Emulator Development Team +Type: misc/emu +Kurz: V2.4 des Atari 8-bit Emulator +Requires: OS4 +Version: 2.4 + +This is the Amiga port of the Atari800 Emulator. It requires at +least OS4 (e.g. the prerelease CD). + +Install +~~~~~~~ +Extract the archive and copy the resulting Atari800 drawer +anywhere you like. Later, copy the ROM Files into the ROMs +directory. Those ROMs can be extracted from an old XFormer +Archive. See http://atari800.sourceforge.net for details. +From there you find also the information how to obtain the +source code which is released under the GPL. + +History +~~~~~~~ +Version 2.4 (16.3.2005) + - matches version 1.3.6 of original sources + +Version 2.3 (29.12.2004) + - matches version 1.3.4 of original sources + +Version 2.2 (8.10.2004) + - the workbench window is now an appwindow. Drop in a file to + boot/run its contents + - tries to start a given workbench argument + - added an iconify option (menu entry and title gadget) + +Version 2.1 (24.09.2004) + - major changes within the Amiga front end, including + o) ported to OS4, requires PPC processor + o) dropped MUI GUI, GUI is now menu driven + o) dropped overlay support for now + o) Atari joystick can be mapped to the keyboard + o) sound fixes + - matches 1.3.3 of original sources + +Version 1.2 (15.10.2000) + - compiled the latest source + - a special 68060 version has been added + +Version 1.1 (12.06.2000) + - console keys and sound should work better now + +Version 1.0 (31.05.2000) + - initial public release + +How can you reach me? +~~~~~~~~~~~~~~~~~~~~~ +My e-mail address is: + mail@sebastianbauer.info + +Address: + Sebastian Bauer + Neustädter Str. 50 + 07768 Kahla + Germany + +Visit my homepage at + http://www.sebastianbauer.info/ + +Here you can find the latest version of the Atari800 emulator for +Amiga but also other things for Amiga, for example SimpleFind3, +SimpleHTML, SimplePac and the Freeciv Port. + +Also look at the offical Atari800 Emulator homepage at + http://atari800.sourceforce.net/ + __ + / / + __ / / Only Amiga makes it possible... + \ \/ / + \__/ + diff --git a/src/amiga/amiga.c b/src/amiga/amiga.c new file mode 100644 index 0000000..f729ffc --- /dev/null +++ b/src/amiga/amiga.c @@ -0,0 +1,2204 @@ +/* + * amiga.c - Amiga specific port code + * + * Copyright (c) 2000 Sebastian Bauer + * Copyright (c) 2000-2014 Atari800 development team (see DOC/CREDITS) + * Newest changes by Ventzislav Tzvetkov - http://drhirudo.hit.bg + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "atari.h" +#include "ui.h" +#include "screen.h" +#include "input.h" + +#undef FILENAME_SIZE +#undef UBYTE +#undef UWORD +#undef ULONG + +#define __USE_INLINE__ +#define DoMethod IDoMethod + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "config.h" + +#include "binload.h" +#include "colours.h" +#include "input.h" +#include "monitor.h" +#include "pokeysnd.h" +#include "screen.h" +#include "sio.h" +#include "statesav.h" + +#include "amiga.h" +#include "support.h" +#include "afile.h" +#include "cfg.h" +#include "akey.h" + +/******************************/ + +#include "Atari800_rev.h" + + +/* joystick emulation + keys are loaded from config file + Here the defaults if there is no keymap in the config file... */ + +/* a runtime switch for the kbd_joy_X_enabled vars is in the UI */ +int PLATFORM_kbd_joy_0_enabled = TRUE; /* enabled by default, doesn't hurt */ +int PLATFORM_kbd_joy_1_enabled = FALSE; /* disabled, would steal normal keys */ + +/* real joysticks */ + +static int fd_joystick0 = -1; +static int fd_joystick1 = -1; + +#define minjoy 10000 /* real joystick tolerancy */ + + +static char __attribute__((used)) verstag[] = VERSTAG; + +/******************************/ + +#define PORT_SOURCE_UNASSIGNED 0 +#define PORT_SOURCE_GAMEPORT 1 +#define PORT_SOURCE_NUMERIC 2 +#define PORT_SOURCE_CURSOR 3 + +static char *port_source_text[] = +{ + "UNASSIGNED","GAMEPORT","NUMERICPAD","CURSOR",NULL +}; + +/******************************/ + +#define DISPLAY_WINDOW 0 +#define DISPLAY_SCALABLEWINDOW 1 +#define DISPLAY_CUSTOMSCREEN 2 + +static char *display_text[] = +{ + "WINDOW","SCALBALEWINDOW","CUSTOMSCREEN",NULL +}; + +/*******************************/ + +struct timezone; + +double fps; + +/******************************/ + +#define ICONIFY_GID 1 + +/*******************************/ + +struct Library *IntuitionBase; +struct Library *GfxBase; +struct Library *LayersBase; +struct Library *AslBase; +struct Device *TimerBase; +struct Library *AHIBase; +struct Library *GadToolsBase; +struct Library *CyberGfxBase; +struct Library *KeymapBase; +struct Library *UtilityBase; +struct Library *WorkbenchBase; +struct Library *IconBase; +struct Library *LowLevelBase; + +struct IntuitionIFace *IIntuition; +struct GraphicsIFace *IGraphics; +struct LayersIFace *ILayers; +struct TimerIFace *ITimer; +struct AslIFace *IAsl; +struct GadToolsIFace *IGadTools; +struct CyberGfxIFace *ICyberGfx; +struct KeymapIFace *IKeymap; +struct UtilityIFace *IUtility; +struct WorkbenchIFace *IWorkbench; +struct IconIFace *IIcon; +struct LowLevelIFace *ILowLevel; + +/* Timer */ +static struct MsgPort *timer_msg_port; +static struct TimeRequest *timer_request; +static BOOL timer_error; + +/* Sound */ +static struct MsgPort *ahi_msg_port; +static struct AHIRequest *ahi_request; +static struct AHIRequest *ahi_soundreq[2]; +static BOOL ahi_current; + +static UWORD ahi_fps; /* frames per second */ +static UWORD ahi_rupf; /* real updates per frame */ +static UBYTE *ahi_streambuf[2]; +static ULONG ahi_streamfreq = 48000; /* playing frequence */ +static ULONG ahi_streamlen; + +/* App Window */ +static struct MsgPort *app_port; /* initialized within Atari_Initialise() */ +static struct AppWindow *app_window; /* initialized during SetupDisplay() */ + +/* Emulation */ +static int menu_consol; +static int keyboard_consol; +static int trig[2]; +static int stick[2]; + +/* Settings */ +static LONG DisplayType; +static LONG UseBestID = TRUE; +static LONG SoundEnabled = TRUE; +static LONG ShowFPS; +static ULONG DisplayID = INVALID_ID; +static ULONG PortSource[2]; + +/* Emulator GUI */ +static LONG ScreenIsCustom; +static struct Screen *ScreenMain; +static ULONG ScreenDepth; +static APTR VisualInfoMain; +static struct Window *WindowMain = NULL; +static struct Menu *MenuMain; +static Object *IconifyImage; +static Object *IconifyGadget; +static BOOL SizeVerify; /* SizeVerify State (don't draw anything) */ + +static UBYTE pentable[256]; +static BOOL pensallocated; +static UBYTE *tempscreendata; +static struct RastPort lineRastPort; +static struct BitMap *lineBitMap; + +struct FileRequester *DiskFileReq; +struct FileRequester *CartFileReq; +struct FileRequester *StateFileReq; +struct FileRequester *BinFileReq; + +static int PaddlePos; + +char atari_disk_dirs[UI_MAX_DIRECTORIES][FILENAME_MAX]; +char atari_rom_dir[FILENAME_MAX]; +char atari_h1_dir[FILENAME_MAX]; +char atari_h2_dir[FILENAME_MAX]; +char atari_h3_dir[FILENAME_MAX]; +char atari_h4_dir[FILENAME_MAX]; +char atari_exe_dir[FILENAME_MAX]; +char atari_state_dir[FILENAME_MAX]; +int disk_directories; + +/************************************************************************** + Returns the Programm's Diskobject +**************************************************************************/ +struct DiskObject *GetProgramObject(void) +{ + struct DiskObject *obj; + extern char program_name[]; /* from startup.c */ + BPTR odir; + + odir = CurrentDir(GetProgramDir()); + + obj = GetIconTags(program_name, + ICONGETA_FailIfUnavailable, FALSE, + ICONGETA_GenerateImageMasks, FALSE, + TAG_DONE); + + if(!obj) + obj = GetIconTags(NULL, + ICONGETA_GetDefaultType, WBTOOL, + TAG_DONE); + + CurrentDir(odir); + + return obj; +} + + +/************************************************************************** + Load any file. Returns TRUE on success. +**************************************************************************/ +int Atari_LoadAnyFile(STRPTR name) +{ + return AFILE_OpenFile(name, TRUE, 1, FALSE) != AFILE_ERROR; +} + +/************************************************************************** + This is the menu when the emulator is running +**************************************************************************/ +static struct NewMenu MenuEntries[] = +{ + {NM_TITLE, "Project", NULL, 0, 0L, (APTR)MEN_PROJECT}, + {NM_ITEM, "About...", "?", 0, 0L, (APTR)MEN_PROJECT_ABOUT}, + {NM_ITEM, NM_BARLABEL, NULL, 0, 0L, NULL}, + {NM_ITEM, "Boot Disk...", "B", 0, 0L, (APTR)MEN_SYSTEM_BOOT}, + {NM_ITEM, "Insert Disk", NULL, 0, 0L, (APTR)MEN_SYSTEM_ID}, + {NM_SUB, "Drive 1...", NULL, 0, 0L, (APTR)MEN_SYSTEM_ID1}, + {NM_SUB, "Drive 2...", NULL, 0, 0L, (APTR)MEN_SYSTEM_ID2}, + {NM_SUB, "Drive 3...", NULL, 0, 0L, (APTR)MEN_SYSTEM_ID3}, + {NM_SUB, "Drive 4...", NULL, 0, 0L, (APTR)MEN_SYSTEM_ID4}, + {NM_SUB, "Drive 5...", NULL, 0, 0L, (APTR)MEN_SYSTEM_ID5}, + {NM_SUB, "Drive 6...", NULL, 0, 0L, (APTR)MEN_SYSTEM_ID6}, + {NM_SUB, "Drive 7...", NULL, 0, 0L, (APTR)MEN_SYSTEM_ID7}, + {NM_SUB, "Drive 8...", NULL, 0, 0L, (APTR)MEN_SYSTEM_ID8}, + {NM_ITEM, "Eject Disk", NULL, 0, 0L, (APTR)MEN_SYSTEM_ED}, + {NM_SUB, "Drive 1", NULL, 0, 0L, (APTR)MEN_SYSTEM_ED1}, + {NM_SUB, "Drive 2", NULL, 0, 0L, (APTR)MEN_SYSTEM_ED2}, + {NM_SUB, "Drive 3", NULL, 0, 0L, (APTR)MEN_SYSTEM_ED3}, + {NM_SUB, "Drive 4", NULL, 0, 0L, (APTR)MEN_SYSTEM_ED4}, + {NM_SUB, "Drive 5", NULL, 0, 0L, (APTR)MEN_SYSTEM_ED5}, + {NM_SUB, "Drive 6", NULL, 0, 0L, (APTR)MEN_SYSTEM_ED6}, + {NM_SUB, "Drive 7", NULL, 0, 0L, (APTR)MEN_SYSTEM_ED7}, + {NM_SUB, "Drive 8", NULL, 0, 0L, (APTR)MEN_SYSTEM_ED8}, + {NM_ITEM, NM_BARLABEL, NULL, 0, 0L, NULL}, + {NM_ITEM, "Load State...", "L", 0, 0L, (APTR)MEN_PROJECT_LOADSTATE}, + {NM_ITEM, "Save State...", "S", 0, 0L, (APTR)MEN_PROJECT_SAVESTATE}, + {NM_ITEM, NM_BARLABEL, NULL, 0, 0L, NULL}, + {NM_ITEM, "Load BIN...", NULL, 0, 0L, (APTR)MEN_PROJECT_LOADBIN}, + {NM_ITEM, NM_BARLABEL, NULL, 0, 0L, NULL}, + {NM_ITEM, "Internal User Interface", "I", 0, 0L, (APTR)MEN_SYSTEM_UI}, + {NM_ITEM, NM_BARLABEL, NULL, 0, 0L, NULL}, + {NM_ITEM, "Iconify", NULL, 0, 0L, (APTR)MEN_PROJECT_ICONIFY}, + {NM_ITEM, NM_BARLABEL, NULL, 0, 0L, NULL}, + {NM_ITEM, "Quit...", "Q", 0, 0L, (APTR)MEN_PROJECT_QUIT}, + {NM_TITLE, "Console", NULL, 0, 0L, (APTR)MEN_CONSOLE}, + {NM_ITEM, "Option", "F2", NM_COMMANDSTRING, 0L, (APTR)MEN_CONSOLE_OPTION}, + {NM_ITEM, "Select", "F3", NM_COMMANDSTRING, 0L, (APTR)MEN_CONSOLE_SELECT}, + {NM_ITEM, "Start", "F4", NM_COMMANDSTRING, 0L, (APTR)MEN_CONSOLE_START}, + {NM_ITEM, "Help", "Help", NM_COMMANDSTRING, 0L, (APTR)MEN_CONSOLE_HELP}, + {NM_ITEM, NM_BARLABEL, NULL, 0, 0L, NULL}, + {NM_ITEM, "Break", "F7", NM_COMMANDSTRING, 0L, (APTR)MEN_CONSOLE_BREAK}, + {NM_ITEM, NM_BARLABEL, NULL, 0, 0L, NULL}, + {NM_ITEM, "Reset", "F5", NM_COMMANDSTRING, 0L, (APTR)MEN_CONSOLE_RESET}, + {NM_ITEM, "Coldstart", "Shift F5", NM_COMMANDSTRING, 0L, (APTR)MEN_CONSOLE_COLDSTART}, + {NM_TITLE, "Settings", NULL, 0, 0L, (APTR)MEN_SETTINGS}, + {NM_ITEM, "Show Framerate?", NULL, MENUTOGGLE|CHECKIT, 0L, (APTR)MEN_SETTINGS_FRAMERATE}, + {NM_ITEM, NM_BARLABEL, NULL, 0, 0L, NULL}, + {NM_ITEM, "Display in", NULL, 0, 0L, NULL}, + {NM_SUB, "Window?", NULL, CHECKIT, 2+4, (APTR)MEN_SETTINGS_WINDOW}, + {NM_SUB, "Scalable Window?", NULL, CHECKIT, 1+4, (APTR)MEN_SETTINGS_SCALABLEWINDOW}, + {NM_SUB, "Custom Screen?", NULL, CHECKIT, 1+2, (APTR)MEN_SETTINGS_CUSTOMSCREEN}, + {NM_ITEM, "Atari Gameport 0", NULL, 0, 0L, NULL}, + {NM_SUB, "Gameport 0", NULL, CHECKIT, 2+4+8, (APTR)MEN_SETTINGS_PORT0_GAMEPORT}, + {NM_SUB, "Numeric Pad", NULL, CHECKIT, 1+4+8, (APTR)MEN_SETTINGS_PORT0_NUMERICPAD}, + {NM_SUB, "Cursor Keys", NULL, CHECKIT, 1+2+8, (APTR)MEN_SETTINGS_PORT0_CURSORKEYS}, + {NM_SUB, "Unassigned", NULL, CHECKIT, 1+2+4, (APTR)MEN_SETTINGS_PORT0_UNASSIGNED}, + {NM_ITEM, "Atari Gameport 1", NULL, 0, 0L, NULL}, + {NM_SUB, "Gameport 1", NULL, CHECKIT, 2+4+8, (APTR)MEN_SETTINGS_PORT1_GAMEPORT}, + {NM_SUB, "Numeric Pad", NULL, CHECKIT, 1+4+8, (APTR)MEN_SETTINGS_PORT1_NUMERICPAD}, + {NM_SUB, "Cursor Keys", NULL, CHECKIT, 1+2+8, (APTR)MEN_SETTINGS_PORT1_CURSORKEYS}, + {NM_SUB, "Unassigned", NULL, CHECKIT, 1+2+4, (APTR)MEN_SETTINGS_PORT1_UNASSIGNED}, + {NM_ITEM, NM_BARLABEL, NULL, 0, 0L, NULL}, + {NM_ITEM, "Save Settings", NULL, 0, 0L, (APTR)MEN_SETTINGS_SAVE}, + {NM_END, NULL, NULL, 0, 0L, NULL} +}; + +/************************************************************************** + Close all previously opened libraries +**************************************************************************/ +VOID CloseLibraries(void) +{ + if (LowLevelBase) CloseLibraryInterface(LowLevelBase, ILowLevel); + if (IconBase) CloseLibraryInterface(IconBase, IIcon); + if (WorkbenchBase) CloseLibraryInterface(WorkbenchBase, IWorkbench); + if (CyberGfxBase) CloseLibraryInterface(CyberGfxBase, ICyberGfx); + if (KeymapBase) CloseLibraryInterface(KeymapBase,IKeymap); + if (GadToolsBase) CloseLibraryInterface(GadToolsBase,IGadTools); + if (AslBase) CloseLibraryInterface(AslBase,IAsl); + if (LayersBase) CloseLibraryInterface(LayersBase,ILayers); + if (GfxBase) CloseLibraryInterface(GfxBase,IGraphics); + if (UtilityBase) CloseLibraryInterface(UtilityBase, IUtility); + if (IntuitionBase) CloseLibraryInterface(IntuitionBase,IIntuition); +} + +/************************************************************************** + Open all necessary and optional libraries. Returns TRUE if succeeded +**************************************************************************/ +BOOL OpenLibraries(void) +{ + if ((IntuitionBase = OpenLibraryInterface ("intuition.library", 39, &IIntuition))) + { + if ((UtilityBase = OpenLibraryInterface ("utility.library", 50, &IUtility))) + { + if ((GfxBase = OpenLibraryInterface ("graphics.library", 39, &IGraphics))) + { + if ((LayersBase = OpenLibraryInterface ("layers.library", 39, &ILayers))) + { + if ((AslBase = OpenLibraryInterface ("asl.library", 39, &IAsl))) + { + if ((GadToolsBase = OpenLibraryInterface("gadtools.library",39, &IGadTools))) + { + if ((KeymapBase = OpenLibraryInterface("keymap.library",36, &IKeymap))) + { + if ((CyberGfxBase = OpenLibraryInterface("cybergraphics.library",41, &ICyberGfx))) + { + + if ((WorkbenchBase = OpenLibraryInterface("workbench.library",36, &IWorkbench))) + { + if ((IconBase = OpenLibraryInterface("icon.library",50,&IIcon))) + { + if ((LowLevelBase = OpenLibraryInterface("lowlevel.library",44,&ILowLevel))) + return TRUE; + } + } + } + } + } + } + } + } + } + } + return FALSE; +} + +/************************************************************************** + Free sound stuff +**************************************************************************/ +VOID FreeSound(void) +{ + if(ahi_soundreq[0]) + { + if(!CheckIO((struct IORequest*)ahi_soundreq[0])) + { + AbortIO((struct IORequest*)ahi_soundreq[0]); + WaitIO((struct IORequest*)ahi_soundreq[0]); + } + } + + if(ahi_soundreq[1]) + { + if(!CheckIO((struct IORequest*)ahi_soundreq[1])) + { + AbortIO((struct IORequest*)ahi_soundreq[1]); + WaitIO((struct IORequest*)ahi_soundreq[1]); + } + } + + if(ahi_request ) + { + if(AHIBase) + { + if(!CheckIO((struct IORequest*)ahi_request)) + { + AbortIO((struct IORequest*)ahi_request); + WaitIO((struct IORequest*)ahi_request); + } + CloseDevice((struct IORequest*)ahi_request); + } + DeleteIORequest((struct IORequest*)ahi_request); + } + + if(ahi_msg_port) DeleteMsgPort(ahi_msg_port); + + if(ahi_streambuf[0]) FreeVec(ahi_streambuf[0]); + if(ahi_streambuf[1]) FreeVec(ahi_streambuf[1]); +} + +/************************************************************************** + Allocate Soundstuff +**************************************************************************/ +BOOL SetupSound(void) +{ + if(Atari800_tv_mode== Atari800_TV_PAL) + { + ahi_fps = 50; + ahi_rupf = 312; + } else + { + ahi_fps = 60; + ahi_rupf = 262; + } + + if(!SoundEnabled) return TRUE; + + if((ahi_msg_port = CreateMsgPort())) + { + if((ahi_request = (struct AHIRequest *) CreateIORequest( + ahi_msg_port, sizeof(struct AHIRequest)))) + { + ahi_request->ahir_Version = 4; /* Open at least version 4. */ + + if (!OpenDevice(AHINAME, AHI_DEFAULT_UNIT, (struct IORequest *) ahi_request, 0)) + { + AHIBase = (struct Library *) ahi_request->ahir_Std.io_Device; + + +#ifdef STEREO_SOUND + ahi_streamlen = (ahi_streamfreq/ahi_fps) * 2; + POKEYSND_Init(POKEYSND_FREQ_17_EXACT, ahi_streamfreq, 2, 0); +#else + ahi_streamlen = ahi_streamfreq/ahi_fps; + POKEYSND_Init(POKEYSND_FREQ_17_EXACT, ahi_streamfreq, 1, 0); +#endif + if((ahi_streambuf[0] = AllocVec(ahi_streamlen*3, MEMF_PUBLIC|MEMF_CLEAR))) + { + if((ahi_streambuf[1] = AllocVec(ahi_streamlen*3, MEMF_PUBLIC|MEMF_CLEAR))) + { + ahi_request->ahir_Std.io_Message.mn_Node.ln_Pri = -50; + ahi_request->ahir_Std.io_Command = CMD_WRITE; + ahi_request->ahir_Std.io_Data = NULL; + ahi_request->ahir_Std.io_Length = ahi_streamlen; + ahi_request->ahir_Std.io_Offset = 0; + ahi_request->ahir_Frequency = ahi_streamfreq; + +#ifdef STEREO_SOUND + ahi_request->ahir_Type = AHIST_S8S; +#else + ahi_request->ahir_Type = AHIST_M8S; +#endif + ahi_request->ahir_Volume = 0x10000; /* Full volume */ + ahi_request->ahir_Position = 0x8000; /* Centered */ + ahi_request->ahir_Link = NULL; + + if((ahi_soundreq[0] = (struct AHIRequest*)AllocVec(sizeof(struct AHIRequest),MEMF_PUBLIC))) + { + if((ahi_soundreq[1] = (struct AHIRequest*)AllocVec(sizeof(struct AHIRequest),MEMF_PUBLIC))) + { + return TRUE; + } + FreeVec(ahi_soundreq[0]); + ahi_soundreq[0] = NULL; + } + FreeVec(ahi_streambuf[1]); + ahi_streambuf[1] = NULL; + } + FreeVec(ahi_streambuf[0]); + ahi_streambuf[0] = NULL; + } + CloseDevice((struct IORequest*)ahi_request); + } + DeleteIORequest((struct IORequest*)ahi_request); + ahi_request = NULL; + } + DeleteMsgPort(ahi_msg_port); + ahi_msg_port = NULL; + } + SoundEnabled = FALSE; + return FALSE; +} + +/************************************************************************** + Free everything which is assoicated with the Atari Screen while + Emulating +**************************************************************************/ +VOID FreeDisplay(void) +{ + int i; + + if (MenuMain) + { + if (WindowMain) ClearMenuStrip(WindowMain); + FreeMenus(MenuMain); + MenuMain = NULL; + } + + if (WindowMain) + { + if (app_window) + { + RemoveAppWindow(app_window); + } + + CloseWindow( WindowMain ); + WindowMain = NULL; + } + + if (IconifyImage) + { + DisposeObject(IconifyImage); + IconifyImage = NULL; + } + + if (IconifyGadget) + { + DisposeObject(IconifyGadget); + IconifyGadget = NULL; + } + + if (VisualInfoMain) + { + FreeVisualInfo( VisualInfoMain ); + VisualInfoMain = NULL; + } + + if (lineBitMap) + { + FreeBitMap(lineBitMap); + lineBitMap = NULL; + } + + if (tempscreendata) + { + FreeVec(tempscreendata); + tempscreendata=NULL; + } + + if (ScreenMain) + { + if (ScreenIsCustom) CloseScreen(ScreenMain); + else + { + if (pensallocated) + { + for(i=0;i<256;i++) ReleasePen(ScreenMain->ViewPort.ColorMap,pentable[i]); + pensallocated = 0; + } + UnlockPubScreen(NULL,ScreenMain); + } + ScreenMain = NULL; + } +} + +/************************************************************************** + Ensures that the scaledscreendata is big enough +**************************************************************************/ +LONG EnsureScaledDisplay(LONG Width) +{ + ULONG depth; + + if (lineBitMap) + { + if (GetBitMapAttr(lineBitMap, BMA_WIDTH) >= Width) + return 1; + FreeBitMap(lineBitMap); + } + + depth = GetBitMapAttr(ScreenMain->RastPort.BitMap, BMA_DEPTH); + lineBitMap = AllocBitMap(Width,1,depth,BMF_MINPLANES|BMF_DISPLAYABLE,ScreenMain->RastPort.BitMap); + InitRastPort(&lineRastPort); + lineRastPort.BitMap = lineBitMap; + return !!lineBitMap; +} + +/************************************************************************** + Allocate everything which is assoicated with the Atari Screen while + Emulating +**************************************************************************/ +LONG SetupDisplay(void) +{ + UWORD ScreenWidth = 0, ScreenHeight = 0; + struct MenuItem *mi; + int i; + + STATIC WORD ScreenPens[NUMDRIPENS+1]; + + ScreenPens[DETAILPEN] = 0; + ScreenPens[BLOCKPEN] = 15; + ScreenPens[TEXTPEN] = 0; + ScreenPens[SHINEPEN] = 15; + ScreenPens[SHADOWPEN] = 0; + ScreenPens[FILLPEN] = 120; + ScreenPens[FILLTEXTPEN] = 0; + ScreenPens[BACKGROUNDPEN] = 9; + ScreenPens[HIGHLIGHTTEXTPEN] = 15; + ScreenPens[BARDETAILPEN] = 0; + ScreenPens[BARBLOCKPEN] = 15; + ScreenPens[BARTRIMPEN] = 0; + ScreenPens[NUMDRIPENS] = -1; + +#if DRI_VERSION > 2 + ScreenPens[MENUBACKGROUNDPEN] = 13; + ScreenPens[SELECTPEN] = 120; +#endif + + if (DisplayType == DISPLAY_CUSTOMSCREEN) + { + ULONG ScreenDisplayID; + static ULONG colors32[3*256+2]; + + ScreenIsCustom = TRUE; + ScreenWidth = Screen_WIDTH - 64; + ScreenHeight = Screen_HEIGHT; + ScreenDepth = 8; + + ScreenDisplayID = DisplayID; + if (UseBestID) ScreenDisplayID = GetBestID(ScreenWidth,ScreenHeight,ScreenDepth); + + colors32[0] = 256 << 16; + for (i=0;i<256;i++) + { + int rgb = Colours_table[i]; + int red,green,blue; + + red = rgb & 0x00ff0000; + green = rgb & 0x0000ff00; + blue = rgb & 0x000000ff; + + colors32[1+i*3] = red | (red << 8) | (red << 16) | (red << 24); + colors32[2+i*3] = green | (green << 8) | (green << 16) | (green << 24); + colors32[3+i*3] = blue | (blue << 8) | (blue << 16) | (blue << 24); + } + + ScreenMain = OpenScreenTags( NULL, + SA_Left, 0, + SA_Top, 0, + SA_Width, ScreenWidth, + SA_Height, ScreenHeight, + SA_Depth, ScreenDepth, + SA_Pens, ScreenPens, + SA_Quiet, TRUE, + SA_Type, CUSTOMSCREEN, + SA_AutoScroll, TRUE, + SA_DisplayID, ScreenDisplayID, + SA_Colors32, colors32, + SA_Exclusive, TRUE, + SA_OffScreenDragging, TRUE, + TAG_DONE); + } else + { + if ((ScreenMain = LockPubScreen(NULL))) + { + ScreenIsCustom = FALSE; + ScreenWidth = Screen_WIDTH - 56; + ScreenHeight = Screen_HEIGHT; + ScreenDepth = GetBitMapAttr(ScreenMain->RastPort.BitMap,BMA_DEPTH); + + if (ScreenDepth <= 8 || !CyberGfxBase) + { + int i; + + for(i=0;i<256;i++) + { + ULONG rgb = Colours_table[i]; + ULONG red = (rgb & 0x00ff0000) >> 16; + ULONG green = (rgb & 0x0000ff00) >> 8; + ULONG blue = (rgb & 0x000000ff); + + red |= (red<<24)|(red<<16)|(red<<8); + green |= (green<<24)|(green<<16)|(green<<8); + blue |= (blue<<24)|(blue<<16)|(blue<<8); + + pentable[i] = ObtainBestPenA(ScreenMain->ViewPort.ColorMap,red,green,blue,NULL); + } + pensallocated = 1; + } + + /* Iconfiy Gadget is optional */ + if (IntuitionBase->lib_Version >= 50) + { + struct DrawInfo *dri; + + if ((dri = GetScreenDrawInfo(ScreenMain))) + { + if ((IconifyImage = NewObject( NULL, "sysiclass", + SYSIA_DrawInfo, dri, + SYSIA_Which, ICONIFYIMAGE, + TAG_DONE ))) + { + IconifyGadget = NewObject( NULL, "buttongclass", + GA_Image, IconifyImage, + GA_Titlebar, TRUE, /* Implies GA_TopBorder, TRUE */ + GA_RelRight, 0, /* Just to set GFLG_RELRIGHT */ + GA_ID, ICONIFY_GID, + GA_RelVerify, TRUE, + TAG_DONE ); + } + + FreeScreenDrawInfo(ScreenMain,dri); + } + } + + + if (!(tempscreendata = (UBYTE*)AllocVec(Screen_WIDTH*(Screen_HEIGHT+16),MEMF_CLEAR))) + { + UnlockPubScreen(NULL,ScreenMain); + ScreenMain = NULL; + } + } + } + + if (ScreenMain) + { + if ((VisualInfoMain = GetVisualInfoA( ScreenMain, NULL ))) + { + if ((MenuMain = CreateMenus(MenuEntries, GTMN_NewLookMenus, TRUE, TAG_DONE))) + { + LayoutMenus( MenuMain, VisualInfoMain, GTMN_NewLookMenus, TRUE, TAG_DONE); + + if ((WindowMain = OpenWindowTags( NULL, + WA_Activate, TRUE, + WA_NewLookMenus, TRUE, + WA_MenuHelp, TRUE, + WA_InnerWidth, ScreenWidth, + WA_InnerHeight, ScreenHeight, + WA_IDCMP, IDCMP_MOUSEBUTTONS | IDCMP_MOUSEMOVE | IDCMP_MENUPICK | IDCMP_CLOSEWINDOW | + IDCMP_RAWKEY | IDCMP_NEWSIZE | IDCMP_SIZEVERIFY | IDCMP_GADGETUP, + WA_ReportMouse, TRUE, + WA_CustomScreen, ScreenMain, + WA_Borderless, ScreenIsCustom, + WA_CloseGadget, !ScreenIsCustom, + WA_DragBar, !ScreenIsCustom, + WA_DepthGadget, !ScreenIsCustom, + ScreenIsCustom?TAG_IGNORE:WA_Title, "Atari 800", + ScreenIsCustom?TAG_IGNORE:WA_ScreenTitle, VERS, + WA_SizeGadget, DisplayType == DISPLAY_SCALABLEWINDOW, + WA_SmartRefresh, TRUE, + DisplayType == DISPLAY_SCALABLEWINDOW?WA_SizeBBottom:TAG_IGNORE, TRUE, + DisplayType == DISPLAY_SCALABLEWINDOW?WA_MaxWidth:TAG_IGNORE,-1, + DisplayType == DISPLAY_SCALABLEWINDOW?WA_MaxHeight:TAG_IGNORE,-1, + TAG_DONE))) + { + if (IconifyGadget) + { + AddGList( WindowMain, (struct Gadget*)IconifyGadget, (UWORD)0, 1, NULL ); + RefreshGList( (struct Gadget*)IconifyGadget, WindowMain, NULL, 1 ); + } + + if ((mi = FindUserData(MenuMain,(APTR)MEN_SETTINGS_FRAMERATE))) + mi->Flags |= ShowFPS?CHECKED:0; + + switch (DisplayType) + { + case DISPLAY_SCALABLEWINDOW: mi = FindUserData(MenuMain,(APTR)MEN_SETTINGS_SCALABLEWINDOW); break; + case DISPLAY_CUSTOMSCREEN: mi = FindUserData(MenuMain,(APTR)MEN_SETTINGS_CUSTOMSCREEN); break; + default: mi = FindUserData(MenuMain,(APTR)MEN_SETTINGS_WINDOW); break; + } + if (mi) mi->Flags |= CHECKED; + + switch (PortSource[0]) + { + case PORT_SOURCE_GAMEPORT:mi = FindUserData(MenuMain,(APTR)MEN_SETTINGS_PORT0_GAMEPORT);break; + case PORT_SOURCE_NUMERIC:mi = FindUserData(MenuMain,(APTR)MEN_SETTINGS_PORT0_NUMERICPAD);break; + case PORT_SOURCE_CURSOR:mi = FindUserData(MenuMain,(APTR)MEN_SETTINGS_PORT0_CURSORKEYS);break; + default: mi = FindUserData(MenuMain,(APTR)MEN_SETTINGS_PORT0_UNASSIGNED);break; + } + if (mi) mi->Flags |= CHECKED; + + switch (PortSource[1]) + { + case PORT_SOURCE_GAMEPORT:mi = FindUserData(MenuMain,(APTR)MEN_SETTINGS_PORT1_GAMEPORT);break; + case PORT_SOURCE_NUMERIC:mi = FindUserData(MenuMain,(APTR)MEN_SETTINGS_PORT1_NUMERICPAD);break; + case PORT_SOURCE_CURSOR:mi = FindUserData(MenuMain,(APTR)MEN_SETTINGS_PORT1_CURSORKEYS);break; + default: mi = FindUserData(MenuMain,(APTR)MEN_SETTINGS_PORT1_UNASSIGNED);break; + } + if (mi) mi->Flags |= CHECKED; + + mi = FindUserData(MenuMain, (APTR)MEN_SETTINGS_PORT0_GAMEPORT); + if (mi) + { + + if (SetJoyPortAttrs(0,SJA_Type, SJA_TYPE_GAMECTLR, NULL )) mi->Flags |= ITEMENABLED; + else mi->Flags &= ~ITEMENABLED; + } + + mi = FindUserData(MenuMain, (APTR)MEN_SETTINGS_PORT1_GAMEPORT); + if (mi) + { + if (SetJoyPortAttrs(1,SJA_Type, SJA_TYPE_GAMECTLR, NULL )) mi->Flags |= ITEMENABLED; + else mi->Flags &= ~ITEMENABLED; + } + + SetMenuStrip(WindowMain, MenuMain); + + /* An AppWindow is not required */ + app_window = AddAppWindowA(1 /* id */, 0, WindowMain, app_port, NULL);; + + return 1; + } + } + } + } + FreeDisplay(); + return 0; +} + +/************************************************************************** + Free timer stuff +**************************************************************************/ +VOID FreeTimer(void) +{ + if (timer_request) + { + if (ITimer) DropInterface((struct Interface*)ITimer); + if (!timer_error) CloseDevice((struct IORequest *)timer_request); + + DeleteIORequest((struct IORequest*)timer_request); + timer_request = NULL; + } + if (timer_msg_port) + { + DeleteMsgPort(timer_msg_port); + timer_msg_port = NULL; + } +} + +/************************************************************************** + Setup Timer +**************************************************************************/ +BOOL SetupTimer(void) +{ + if((timer_msg_port = CreateMsgPort())) + { + timer_request = (struct TimeRequest*)CreateIORequest( timer_msg_port, sizeof( struct TimeRequest )); + if( timer_request ) + { + timer_error = OpenDevice( TIMERNAME, UNIT_MICROHZ, (struct IORequest*)timer_request, 0); + if( !timer_error ) + { + TimerBase = timer_request->Request.io_Device; + if ((ITimer = (struct TimerIFace*)GetInterface((struct Library*)TimerBase,"main",1,NULL))) + return TRUE; + } + } + } + return FALSE; +} + + +/************************************************************************** + Iconify the atari emu by closing the display and placing an icon + on the wb. +**************************************************************************/ +VOID Iconify(void) +{ + struct DiskObject *dobj = GetProgramObject(); + struct AppIcon *app_icon; + extern char program_name[]; + + if (!dobj) return; + + if ((app_icon = AddAppIcon(2,0L,program_name,app_port,ZERO,dobj, + TAG_DONE))) + { + int ready = 0; + + FreeDisplay(); + + while (!ready) + { + struct AppMessage *amsg; + WaitPort(app_port); + + while ((amsg = (struct AppMessage *)GetMsg(app_port))) + { + if (amsg->am_Type == AMTYPE_APPICON && amsg->am_ID == 2) + ready = 1; + ReplyMsg((struct Message*)amsg); + } + } + + RemoveAppIcon(app_icon); + + if (!SetupDisplay()) + Atari800_ErrExit(); + } + + FreeDiskObject(dobj); +} + +/************************************************************************** + Handle the menu +**************************************************************************/ +int HandleMenu(UWORD code) +{ + int keycode = -1; + + while( code != MENUNULL ) + { + struct MenuItem *mi = ItemAddress( MenuMain, code ); + if( mi ) + { + LONG udata = (LONG)GTMENUITEM_USERDATA( mi ); + switch(udata) + { + case MEN_PROJECT_ABOUT: + { + struct EasyStruct easy; + easy.es_StructSize = sizeof(struct EasyStruct); + easy.es_Flags = 0; + easy.es_Title = "Atari800"; + easy.es_TextFormat = "Atari800 version %ld.%ld\n\nBased upon " Atari800_TITLE "\nCopyright (C) 2000-2009\nAtari800 development team\nAmiga port done by Sebastian Bauer\nand Ventzislav Tzvetkov"; + easy.es_GadgetFormat = "Ok"; + + EasyRequest( WindowMain, &easy, NULL, VERSION, REVISION); + } + break; + + case MEN_PROJECT_LOADSTATE: + if(AslRequestTags(StateFileReq, + ASLFR_DoSaveMode, FALSE, + ASLFR_Screen, ScreenMain, + TAG_DONE)) + { + BPTR cd = Lock(StateFileReq->fr_Drawer, ACCESS_READ); + if(cd) + { + BPTR odir = CurrentDir(cd); + StateSav_ReadAtariState(StateFileReq->fr_File,"rb"); + CurrentDir(odir); + UnLock(cd); + } + } + break; + + case MEN_PROJECT_SAVESTATE: + if(AslRequestTags(StateFileReq, + ASLFR_DoSaveMode, TRUE, + ASLFR_Screen, ScreenMain, + TAG_DONE)) + { + BPTR cd = Lock(StateFileReq->fr_Drawer, ACCESS_READ); + if (cd) + { + BPTR odir = CurrentDir(cd); + STRPTR fileName = AddSuffix(StateFileReq->fr_File,".sav"); + if(fileName) + { + StateSav_SaveAtariState(fileName,"wb",TRUE); + FreeVec(fileName); + } + CurrentDir(odir); + UnLock(cd); + } + } + break; + + case MEN_PROJECT_LOADBIN: + if(AslRequestTags(BinFileReq, + ASLFR_DoSaveMode, FALSE, + ASLFR_Screen, ScreenMain, + TAG_DONE)) + { + BPTR cd = Lock(BinFileReq->fr_Drawer, ACCESS_READ); + if(cd) + { + BPTR odir = CurrentDir(cd); + BINLOAD_Loader(BinFileReq->fr_File); + CurrentDir(odir); + UnLock(cd); + } + } + break; + + case MEN_PROJECT_ICONIFY: keycode = -2; break; + case MEN_PROJECT_QUIT: keycode = AKEY_EXIT; break; + + case MEN_SYSTEM_BOOT: + if(InsertDisk (1)) + { + menu_consol = 7; + keycode = AKEY_COLDSTART; + } + break; + + case MEN_SYSTEM_ID1: InsertDisk(1); break; + case MEN_SYSTEM_ID2: InsertDisk(2); break; + case MEN_SYSTEM_ID3: InsertDisk(3); break; + case MEN_SYSTEM_ID4: InsertDisk(4); break; + case MEN_SYSTEM_ID5: InsertDisk(5); break; + case MEN_SYSTEM_ID6: InsertDisk(6); break; + case MEN_SYSTEM_ID7: InsertDisk(7); break; + case MEN_SYSTEM_ID8: InsertDisk(8); break; + case MEN_SYSTEM_ED1: SIO_Dismount(1); break; + case MEN_SYSTEM_ED2: SIO_Dismount(2); break; + case MEN_SYSTEM_ED3: SIO_Dismount(3); break; + case MEN_SYSTEM_ED4: SIO_Dismount(4); break; + case MEN_SYSTEM_ED5: SIO_Dismount(5); break; + case MEN_SYSTEM_ED6: SIO_Dismount(6); break; + case MEN_SYSTEM_ED7: SIO_Dismount(7); break; + case MEN_SYSTEM_ED8: SIO_Dismount(8); break; + + case MEN_SYSTEM_UI: + keycode = AKEY_UI; + break; + + case MEN_CONSOLE_RESET: + Atari800_Warmstart(); + menu_consol = 7; + break; + + case MEN_CONSOLE_OPTION: + menu_consol &= 0x03; + keycode = AKEY_NONE; + break; + + case MEN_CONSOLE_SELECT: + menu_consol &= 0x05; + keycode = AKEY_NONE; + break; + + case MEN_CONSOLE_START: + menu_consol &= 0x06; + keycode = AKEY_NONE; + break; + + case MEN_CONSOLE_HELP: + keycode = AKEY_HELP; + break; + + case MEN_CONSOLE_BREAK: + keycode = AKEY_BREAK; + break; + + case MEN_CONSOLE_COLDSTART: + Atari800_Coldstart(); + menu_consol = 7; + break; + + case MEN_SETTINGS_FRAMERATE: + ShowFPS = !!(mi->Flags & CHECKED); + break; + + case MEN_SETTINGS_PORT0_GAMEPORT: PortSource[0] = PORT_SOURCE_GAMEPORT; break; + case MEN_SETTINGS_PORT0_NUMERICPAD: PortSource[0] = PORT_SOURCE_NUMERIC; break; + case MEN_SETTINGS_PORT0_CURSORKEYS: PortSource[0] = PORT_SOURCE_CURSOR; break; + case MEN_SETTINGS_PORT0_UNASSIGNED: PortSource[0] = PORT_SOURCE_UNASSIGNED; break; + + case MEN_SETTINGS_PORT1_GAMEPORT: PortSource[1] = PORT_SOURCE_GAMEPORT; break; + case MEN_SETTINGS_PORT1_NUMERICPAD: PortSource[1] = PORT_SOURCE_NUMERIC; break; + case MEN_SETTINGS_PORT1_CURSORKEYS: PortSource[1] = PORT_SOURCE_CURSOR; break; + case MEN_SETTINGS_PORT1_UNASSIGNED: PortSource[1] = PORT_SOURCE_UNASSIGNED; break; + + case MEN_SETTINGS_WINDOW: DisplayType = DISPLAY_WINDOW; break; + case MEN_SETTINGS_SCALABLEWINDOW: DisplayType = DISPLAY_SCALABLEWINDOW; break; + case MEN_SETTINGS_CUSTOMSCREEN: DisplayType = DISPLAY_CUSTOMSCREEN; break; + + case MEN_SETTINGS_SAVE: + CFG_WriteConfig(); + break; + } + +/* if (key_buf[0x3c]) // F2 + consol &= 0x03; // OPTION key ON + else + consol |= 0x04; // OPTION key OFF + if (key_buf[0x3d]) // F3 + consol &= 0x05; // SELECT key ON + else + consol |= 0x02; // SELECT key OFF + if (key_buf[0x3e]) // F4 + consol &= 0x06; // START key ON + else + consol |= 0x01; // START key OFF +*/ + + code = mi->NextSelect; + } else code = MENUNULL; + } + + return keycode; +} + +/************************************************************************** + Handle the Vanillakeys +**************************************************************************/ +int HandleVanillakey(int code) +{ + int keycode; + + switch (code) + { + case 0x01: keycode = AKEY_CTRL_a; break; + case 0x02: keycode = AKEY_CTRL_b; break; + case 0x03: keycode = AKEY_CTRL_c; break; + case 0x04: keycode = AKEY_CTRL_d; break; + case 0x05: keycode = AKEY_CTRL_E; break; + case 0x06: keycode = AKEY_CTRL_F; break; + case 0x07: keycode = AKEY_CTRL_G; break; + + /* + case 0x08 : + keycode = AKEY_CTRL_H; + break; + */ + /* TAB - see case '\t' : + case 0x09 : + keycode = AKEY_CTRL_I; + break; + */ + case 0x0a: keycode = AKEY_CTRL_J; break; + case 0x0b: keycode = AKEY_CTRL_K; break; + case 0x0c: keycode = AKEY_CTRL_L; break; + + /* + case 0x0d : + keycode = AKEY_CTRL_M; + break; + */ + case 0x0e: keycode = AKEY_CTRL_N; break; + case 0x0f: keycode = AKEY_CTRL_O; break; + case 0x10: keycode = AKEY_CTRL_P; break; + case 0x11: keycode = AKEY_CTRL_Q; break; + case 0x12: keycode = AKEY_CTRL_R; break; + case 0x13: keycode = AKEY_CTRL_S; break; + case 0x14: keycode = AKEY_CTRL_T; break; + case 0x15: keycode = AKEY_CTRL_U; break; + case 0x16: keycode = AKEY_CTRL_V; break; + case 0x17: keycode = AKEY_CTRL_W; break; + case 0x18: keycode = AKEY_CTRL_X; break; + case 0x19: keycode = AKEY_CTRL_Y; break; + case 0x1a: keycode = AKEY_CTRL_Z; break; + case 8: keycode = AKEY_BACKSPACE; break; + case 13: keycode = AKEY_RETURN; break; + case 0x1b: keycode = AKEY_ESCAPE; break; + case '0': keycode = AKEY_0; break; + case '1': keycode = AKEY_1; break; + case '2': keycode = AKEY_2; break; + case '3': keycode = AKEY_3; break; + case '4': keycode = AKEY_4; break; + case '5': keycode = AKEY_5; break; + case '6': keycode = AKEY_6; break; + case '7': keycode = AKEY_7; break; + case '8': keycode = AKEY_8; break; + case '9': keycode = AKEY_9; break; + case 'A': case 'a': keycode = AKEY_a; break; + case 'B' : case 'b' : keycode = AKEY_b; break; + case 'C' : case 'c' : keycode = AKEY_c; break; + case 'D' : case 'd' : keycode = AKEY_d; break; + case 'E' : case 'e' : keycode = AKEY_e; break; + case 'F' : case 'f' : keycode = AKEY_f; break; + case 'G' : case 'g' : keycode = AKEY_g; break; + case 'H' : case 'h' : keycode = AKEY_h; break; + case 'I' : case 'i' : keycode = AKEY_i; break; + case 'J' : case 'j' : keycode = AKEY_j; break; + case 'K' : case 'k' : keycode = AKEY_k; break; + case 'L' : case 'l' : keycode = AKEY_l; break; + case 'M' : case 'm' : keycode = AKEY_m; break; + case 'N' : case 'n' : keycode = AKEY_n; break; + case 'O' : case 'o' : keycode = AKEY_o; break; + case 'P' : case 'p' : keycode = AKEY_p; break; + case 'Q' : case 'q' : keycode = AKEY_q; break; + case 'R' : case 'r' : keycode = AKEY_r; break; + case 'S' : case 's' : keycode = AKEY_s; break; + case 'T' : case 't' : keycode = AKEY_t; break; + case 'U' : case 'u' : keycode = AKEY_u; break; + case 'V' : case 'v' : keycode = AKEY_v; break; + case 'W' : case 'w' : keycode = AKEY_w; break; + case 'X' : case 'x' : keycode = AKEY_x; break; + case 'Y' : case 'y' : keycode = AKEY_y; break; + case 'Z' : case 'z' : keycode = AKEY_z; break; + case ' ' : keycode = AKEY_SPACE; break; + case '\t' : keycode = AKEY_TAB; break; + case '!' : keycode = AKEY_EXCLAMATION; break; + case '"' : keycode = AKEY_DBLQUOTE; break; + case '#' : keycode = AKEY_HASH; break; + case '$' : keycode = AKEY_DOLLAR; break; + case '%' : keycode = AKEY_PERCENT; break; + case '&' : keycode = AKEY_AMPERSAND; break; + case '\'' : keycode = AKEY_QUOTE; break; + case '@' : keycode = AKEY_AT; break; + case '(' : keycode = AKEY_PARENLEFT; break; + case ')' : keycode = AKEY_PARENRIGHT; break; + case '<' : keycode = AKEY_LESS; break; + case '>' : keycode = AKEY_GREATER; break; + case '=' : keycode = AKEY_EQUAL; break; + case '?' : keycode = AKEY_QUESTION; break; + case '-' : keycode = AKEY_MINUS; break; + case '+' : keycode = AKEY_PLUS; break; + case '*' : keycode = AKEY_ASTERISK; break; + case '/' : keycode = AKEY_SLASH; break; + case ':' : keycode = AKEY_COLON; break; + case ';' : keycode = AKEY_SEMICOLON; break; + case ',' : keycode = AKEY_COMMA; break; + case '.' : keycode = AKEY_FULLSTOP; break; + case '_' : keycode = AKEY_UNDERSCORE; break; + case '[' : keycode = AKEY_BRACKETLEFT; break; + case ']' : keycode = AKEY_BRACKETRIGHT; break; + case '^' : keycode = AKEY_CIRCUMFLEX; break; + case '\\' : keycode = AKEY_BACKSLASH; break; + case '|' : keycode = AKEY_BAR; break; + default : keycode = AKEY_NONE; break; + } + + return keycode; +} + +/************************************************************************** + Handle the Rawkey events +**************************************************************************/ +int HandleRawkey( UWORD code, UWORD qual, APTR iaddress ) +{ + int keycode = -1; + + if ((qual & IEQUALIFIER_NUMERICPAD) && (PortSource[0] == PORT_SOURCE_NUMERIC || PortSource[1] == PORT_SOURCE_NUMERIC)) + { + /* TODO: This needs to be improved when pressing multiple keys */ + static int matrix[8]; + + int i, before_pressed = 0, pressed = 0; + int local_stick = -1; + + before_pressed = 0; + for (i=0;i<8;i++) + if (matrix[i]) before_pressed = 1; + + /* key pressed */ + if (!(code & 0x80)) + { + switch (code) + { + case 29: matrix[0] = 1; local_stick = 9; break; + case 30: matrix[1] = 1; local_stick = 13; break; + case 31: matrix[2] = 1; local_stick = 5; break; + case 45: matrix[3] = 1; local_stick = 11; break; + case 47: matrix[4] = 1; local_stick = 7; break; + case 61: matrix[5] = 1; local_stick = 10; break; + case 62: matrix[6] = 1; local_stick = 14; break; + case 63: matrix[7] = 1; local_stick = 6; break; + + case 46: /* 5 in the middle */ + if (PortSource[0] == PORT_SOURCE_NUMERIC) trig[0] = 0; + if (PortSource[1] == PORT_SOURCE_NUMERIC) trig[1] = 0; + return -1; + } + } else + { + switch (code&0x7f) + { + case 29: matrix[0] = 0; break; + case 30: matrix[1] = 0; break; + case 31: matrix[2] = 0; break; + case 45: matrix[3] = 0; break; + case 47: matrix[4] = 0; break; + case 61: matrix[5] = 0; break; + case 62: matrix[6] = 0; break; + case 63: matrix[7] = 0; break; + case 46: /* 5 in the middle */ + if (PortSource[0] == PORT_SOURCE_NUMERIC) trig[0] = 1; + if (PortSource[1] == PORT_SOURCE_NUMERIC) trig[1] = 1; + return -1; + } + } + + pressed = 0; + for (i=0;i<8;i++) + if (matrix[i]) pressed = 1; + + if (local_stick != -1 || (before_pressed && !pressed)) + { + if (!pressed) local_stick = 15; + if (PortSource[0] == PORT_SOURCE_NUMERIC) stick[0] = local_stick; + if (PortSource[1] == PORT_SOURCE_NUMERIC) stick[1] = local_stick; + return -1; + } + } + + switch (code) + { + case 0x51: keyboard_consol &= 0x03; keycode = AKEY_NONE; break; /* F2 pressed */ + case 0xd1: keyboard_consol |= 0x04; keycode = AKEY_NONE; break; /* F2 released */ + case 0x52: keyboard_consol &= 0x05; keycode = AKEY_NONE; break; /* F3 pressed */ + case 0xd2: keyboard_consol |= 0x02; keycode = AKEY_NONE; break; /* F3 released */ + case 0x53: keyboard_consol &= 0x06; keycode = AKEY_NONE; break; /* F4 pressed */ + case 0xd3: keyboard_consol |= 0x01; keycode = AKEY_NONE; break; /* F4 released */ + case 0x56: keycode = AKEY_BREAK; break; /* F7 */ + case 0x59: keycode = AKEY_NONE; break; + case 0x5f: keycode = AKEY_HELP; break; + + case 0x54: /* F5 */ + if (qual & (IEQUALIFIER_RSHIFT | IEQUALIFIER_RSHIFT)) keycode = AKEY_COLDSTART; + else keycode = AKEY_WARMSTART; + keyboard_consol = 7; + break; + + case CURSORLEFT: /* Cursor Left */ + if (qual & IEQUALIFIER_CONTROL || + (PortSource[0] != PORT_SOURCE_CURSOR && PortSource[1] != PORT_SOURCE_CURSOR)) + { + keycode = AKEY_LEFT; + } else + { + if (PortSource[0] == PORT_SOURCE_CURSOR) stick[0] &= ~4; + if (PortSource[1] == PORT_SOURCE_CURSOR) stick[1] &= ~4; + } + break; + case CURSORLEFT|0x80: + if (PortSource[0] == PORT_SOURCE_CURSOR) stick[0] |= 4; + if (PortSource[1] == PORT_SOURCE_CURSOR) stick[1] |= 4; + break; + + case CURSORRIGHT: /* Cursor Right */ + if (qual & IEQUALIFIER_CONTROL || + (PortSource[0] != PORT_SOURCE_CURSOR && PortSource[1] != PORT_SOURCE_CURSOR)) + { + keycode = AKEY_RIGHT; + } else + { + if (PortSource[0] == PORT_SOURCE_CURSOR) stick[0] &= ~8; + if (PortSource[1] == PORT_SOURCE_CURSOR) stick[1] &= ~8; + } + break; + case CURSORRIGHT|0x80: + if (PortSource[0] == PORT_SOURCE_CURSOR) stick[0] |= 8; + if (PortSource[1] == PORT_SOURCE_CURSOR) stick[1] |= 8; + break; + + case CURSORUP: /* Cursor Up */ + if (qual & IEQUALIFIER_CONTROL || + (PortSource[0] != PORT_SOURCE_CURSOR && PortSource[1] != PORT_SOURCE_CURSOR)) + { + keycode = AKEY_UP; + } else + { + if (PortSource[0] == PORT_SOURCE_CURSOR) stick[0] &= ~1; + if (PortSource[1] == PORT_SOURCE_CURSOR) stick[1] &= ~1; + } + break; + case CURSORUP|0x80: + if (PortSource[0] == PORT_SOURCE_CURSOR) stick[0] |= 1; + if (PortSource[1] == PORT_SOURCE_CURSOR) stick[1] |= 1; + break; + + case CURSORDOWN: /* Cursor Down */ + if (qual & IEQUALIFIER_CONTROL || + (PortSource[0] != PORT_SOURCE_CURSOR && PortSource[1] != PORT_SOURCE_CURSOR)) + { + keycode = AKEY_DOWN; + } else + { + if (PortSource[0] == PORT_SOURCE_CURSOR) stick[0] &= ~2; + if (PortSource[1] == PORT_SOURCE_CURSOR) stick[1] &= ~2; + } + break; + case CURSORDOWN|0x80: + if (PortSource[0] == PORT_SOURCE_CURSOR) stick[0] |= 2; + if (PortSource[1] == PORT_SOURCE_CURSOR) stick[1] |= 2; + break; + + case 101: /* R ALT */ + if (PortSource[0] == PORT_SOURCE_CURSOR) trig[0] = 0; + if (PortSource[1] == PORT_SOURCE_CURSOR) trig[1] = 0; + break; + + case 101|0x80: /* R ALT - released */ + if (PortSource[0] == PORT_SOURCE_CURSOR) trig[0] = 1; + if (PortSource[1] == PORT_SOURCE_CURSOR) trig[1] = 1; + break; + + default: + { + struct InputEvent ev; + char key; + + ev.ie_Class = IECLASS_RAWKEY; + ev.ie_SubClass = 0; + ev.ie_Code = code; + ev.ie_Qualifier = qual; + ev.ie_EventAddress = (APTR) *((ULONG *) iaddress); + ev.ie_NextEvent = NULL; + + if (MapRawKey( &ev, &key, 1, NULL )) + { + keycode = HandleVanillakey(key); + } + } + break; + } + return keycode; +} + +/************************************************************************** + Play the sound. Called by the emulator. +**************************************************************************/ +void Sound_Update(void) +{ + static int sent[2] = {0,0}; + + if (SoundEnabled) + { + if (sent[ahi_current]) + WaitIO(((struct IORequest*)ahi_soundreq[ahi_current])); + + POKEYSND_Process(ahi_streambuf[ahi_current], ahi_streamlen); + + *ahi_soundreq[ahi_current] = *ahi_request; + ahi_soundreq[ahi_current]->ahir_Std.io_Data = ahi_streambuf[ahi_current]; + ahi_soundreq[ahi_current]->ahir_Std.io_Length = ahi_streamlen; + ahi_soundreq[ahi_current]->ahir_Std.io_Offset = 0; + + if (ahi_current && sent[0]) + ahi_soundreq[1]->ahir_Link = ahi_soundreq[0]; + else if (!ahi_current && sent[1]) + ahi_soundreq[0]->ahir_Link = ahi_soundreq[1]; + + SendIO((struct IORequest*)ahi_soundreq[ahi_current]); + sent[ahi_current] = 1; + ahi_current = !ahi_current; + } +} + + +/************************************************************************** + Initialize the Atari Prefs to sensible values +**************************************************************************/ +void Atari_ConfigInit(void) +{ + int i; + + strcpy(CFG_osa_filename, "PROGDIR:ROMs/atariosa.rom"); + strcpy(CFG_osb_filename, "PROGDIR:ROMs/atariosb.rom"); + strcpy(CFG_xlxe_filename, "PROGDIR:ROMs/atarixl.rom"); + strcpy(CFG_basic_filename, "PROGDIR:ROMs/ataribas.rom"); + CFG_5200_filename[0] = '\0'; + + for (i=0;i destwidth) || srcheight > destheight || destwidth > (sizeof(lineBuffer)/sizeof(lineBuffer[0]))) + return; + + w = (srcwidth) << 16; + h = (srcheight) << 16; + dx = w / destwidth; + dy = h / destheight; + ss = src; + y = (0) << 16; + i = destheight; + + while (i > 0) + { + int lines, j; + + ss = src + srcmod * (y >> 16); + dest32 = (ULONG*)lineBuffer; + + count = (destwidth + 3) / 4; + x = 0 << 16; + while (count > 0) + { + quad = (ss[x >> 16] << 24); + x = x + dx; + quad += (ss[x >> 16] << 16); + x = x + dx; + quad += (ss[x >> 16] << 8); + x = x + dx; + quad += (ss[x >> 16] << 0); + x = x + dx; + + *dest32++ = quad; + count--; + } + + lines = (0x1ffff - (y & 0xffff))/dy; + +#if 1 + WriteLUTPixelArray(lineBuffer, 0, 0, destwidth, WindowMain->RPort, Colours_table, destx, desty + destheight-i, destwidth, 1, CTABFMT_XRGB8); + for (j=1;jRPort, destx, desty + destheight - i, WindowMain->RPort, destx, desty + destheight - i + j, destwidth, 1, 0xc0); + } + +#else + if (lines == 1) + { + WriteLUTPixelArray(lineBuffer, 0, 0, destwidth, WindowMain->RPort, Colours_table, destx, desty + destheight-i, destwidth, 1, CTABFMT_XRGB8); + } else + { + int j; + + WriteLUTPixelArray(lineBuffer, 0, 0, destwidth, &lineRastPort, Colours_table, 0, 0, destwidth, 1, CTABFMT_XRGB8); + for (j=0;jRPort, destx, desty + destheight - i + j, destwidth, 1, 0xc0); + } + } +#endif + + y = y + dy * lines; + i -= lines; + } +} + +/************************************************************************** + Do the graphical output. +**************************************************************************/ +void PLATFORM_DisplayScreen(void) +{ + UBYTE *screen = (UBYTE *) Screen_atari; + static char fpsbuf[32]; + int fgpen = 15,bgpen = 0; + + if (DisplayType == DISPLAY_CUSTOMSCREEN) + { + WriteChunkyPixels(WindowMain->RPort, 0, 0, Screen_WIDTH - 1 - 64, Screen_HEIGHT - 1, + screen + 32, Screen_WIDTH); + } else + { + LONG atariWidth = Screen_WIDTH - 56; + LONG atariHeight = Screen_HEIGHT; + LONG atariX = 28; + LONG atariY = 0; + LONG offx = WindowMain->BorderLeft; + LONG offy = WindowMain->BorderTop; + + if (InnerWidth(WindowMain) != atariWidth || InnerHeight(WindowMain) != atariHeight) + { + if (pensallocated) + { + ScreenData28bit(screen, tempscreendata, pentable, Screen_WIDTH, Screen_HEIGHT); + ScalePixelArray( tempscreendata + atariX, atariWidth, atariHeight, Screen_WIDTH, WindowMain->RPort, offx, offy, + InnerWidth(WindowMain), InnerHeight(WindowMain), RECTFMT_LUT8); + fgpen = pentable[fgpen]; + bgpen = pentable[bgpen]; + } else + { + if (EnsureScaledDisplay(InnerWidth(WindowMain))) + { + Scale8Bit(screen + atariX, atariWidth, atariHeight, Screen_WIDTH, + WindowMain->RPort, offx, offy, InnerWidth(WindowMain), InnerHeight(WindowMain)); + } + } + } else + { + if (pensallocated) + { + ScreenData28bit(screen, tempscreendata, pentable, Screen_WIDTH, Screen_HEIGHT); + WriteChunkyPixels(WindowMain->RPort, offx, offy, offx + atariWidth - 1, offy + atariHeight - 1, + tempscreendata + atariX, Screen_WIDTH); + + fgpen = pentable[fgpen]; + bgpen = pentable[bgpen]; + } else + { + WriteLUTPixelArray(screen, atariX, atariY, Screen_WIDTH, WindowMain->RPort, Colours_table, offx, offy, atariWidth, atariHeight, CTABFMT_XRGB8); + } + } + } + + if (ShowFPS) + { + LONG len; + + extern double fps; + double fpsv; + double fpsn = modf(fps, &fpsv); + + snprintf(fpsbuf,sizeof(fpsbuf),"%d.%d/%d (%d%%)",(int)fpsv,(int)(fpsn*10),ahi_fps,(int)(100*fps/ahi_fps)); + + SetABPenDrMd(WindowMain->RPort,fgpen,bgpen,JAM2); + len = TextLength(WindowMain->RPort,fpsbuf,strlen(fpsbuf)); + Move(WindowMain->RPort, WindowMain->Width - 4 - len - WindowMain->BorderRight, 4 + WindowMain->RPort->TxBaseline + WindowMain->BorderTop); + Text(WindowMain->RPort, fpsbuf,strlen(fpsbuf)); + } + +} + +/************************************************************************** + Handle Keyboard +**************************************************************************/ +int PLATFORM_Keyboard (void) +{ + static int old_keycode = -1; + + int keycode = -1; + int iconify = 0; + + struct IntuiMessage *imsg; + + while ((imsg = (struct IntuiMessage*) GetMsg (WindowMain->UserPort))) + { + ULONG cl = imsg->Class; + UWORD code = imsg->Code; + UWORD qual = imsg->Qualifier; + APTR iaddress = imsg->IAddress; +// WORD mx = imsg->MouseX; + /*WORD my = imsg->MouseY;*/ + + if (cl == IDCMP_MENUVERIFY) + { + ReplyMsg((struct Message*)imsg); + continue; + } + + if (cl == IDCMP_SIZEVERIFY) + { + SizeVerify = TRUE; + ReplyMsg((struct Message*)imsg); + continue; + } + + ReplyMsg((struct Message*)imsg); + + switch (cl) + { + case IDCMP_NEWSIZE: SizeVerify = FALSE; break; + case IDCMP_RAWKEY: keycode = HandleRawkey(code,qual,iaddress); break; + case IDCMP_CLOSEWINDOW: keycode = AKEY_EXIT; break; + case IDCMP_MENUPICK: + keycode = HandleMenu(code); + if (keycode == -2) + { + iconify = 1; + keycode = -1; + } + break; + case IDCMP_GADGETUP: iconify = 1; break; + + case IDCMP_MOUSEBUTTONS : +#if 0 + if (Controller == controller_Paddle) + { + switch (code) + { + case SELECTDOWN : stick0 = 251; break; + case SELECTUP : stick0 = 255; break; + default: break; + } + } +#endif + break; + + case IDCMP_MOUSEMOVE : +#if 0 + if (Controller == controller_Paddle) + { + if (mx > 57) + { + if (mx < 287) PaddlePos = 228 - (mx - 58); + else PaddlePos = 0; + } + else + { + PaddlePos = 228; + } + } +#endif + break; + + default: break; + } + + old_keycode = keycode; + } + + if (keycode == -1) keycode = old_keycode; + + if (menu_consol != 7) + { + INPUT_key_consol = menu_consol; + menu_consol = 7; + } else INPUT_key_consol = keyboard_consol; + + if (app_window) + { + /* handle application messages (e.g. icons drops on window */ + struct AppMessage *amsg; + + while ((amsg = (struct AppMessage *)GetMsg(app_port))) + { + if (amsg->am_Type == AMTYPE_APPWINDOW && amsg->am_ID == 1 && amsg->am_NumArgs > 0) + { + BPTR olddir; + + olddir = CurrentDir(amsg->am_ArgList[0].wa_Lock); + + if (Atari_LoadAnyFile(amsg->am_ArgList[0].wa_Name)) + { + ActivateWindow(WindowMain); + } + CurrentDir(olddir); + } + ReplyMsg((struct Message*)amsg); + } + } + + if (iconify) + { + Iconify(); + keycode = -1; + } + + return keycode; +} + +/************************************************************************** + Handle Joystick Port (direction) +**************************************************************************/ +int PLATFORM_PORT (ULONG num) +{ + + ULONG JoyStickState; + + if (PortSource[num] == PORT_SOURCE_GAMEPORT) + { + JoyStickState = ReadJoyPort(num);//==0? 1 : 0); // Swap Joystick Ports + + if (JoyStickState & JPF_JOY_LEFT) { + if (JoyStickState & JPF_JOY_UP) return INPUT_STICK_UL; + else if (JoyStickState & JPF_JOY_DOWN) return INPUT_STICK_LL; + else return INPUT_STICK_LEFT;} + + if (JoyStickState & JPF_JOY_RIGHT) { + if (JoyStickState & JPF_JOY_UP) return INPUT_STICK_UR; + else if (JoyStickState & JPF_JOY_DOWN) return INPUT_STICK_LR; + else return INPUT_STICK_RIGHT;} + + if (JoyStickState & JPF_JOY_UP) return INPUT_STICK_FORWARD; + if (JoyStickState & JPF_JOY_DOWN) return INPUT_STICK_BACK; + } + return stick[num]; + +} + + + +/************************************************************************** + Handle Joystick Triggers +**************************************************************************/ + + +static void get_platform_TRIG(UBYTE *t0, UBYTE *t1) +{ + + ULONG JoyStickState; + + int trig0, trig1; + trig0 = trig1 = 1; + + if (fd_joystick0 != -1) { +#ifdef LPTJOY + int status; + ioctl(fd_joystick0, LPGETSTATUS, &status); + if (status & 8) + *t0 = 1; + else + *t0 = 0; +#endif /* LPTJOY */ + } + else {JoyStickState = ReadJoyPort(0); + if (JoyStickState != 0) { + trig0 = 1; + + if (JoyStickState & JPF_BUTTON_RED) trig0 = 0; + } + *t0 = trig0; + } + + if (fd_joystick1 != -1) { +#ifdef LPTJOY + int status; + ioctl(fd_joystick1, LPGETSTATUS, &status); + if (status & 8) + *t1 = 1; + else + *t1 = 0; +#endif /* LPTJOY */ + } + else { + JoyStickState = ReadJoyPort(1); + if (JoyStickState != 0) { + trig1 = 1; + + if (JoyStickState & JPF_BUTTON_RED) trig1 = 0; + } + *t1 = trig1; + } +} + + + +int PLATFORM_TRIG(int num) +{ + +#ifndef DONT_DISPLAY + UBYTE a, b; + get_platform_TRIG(&a, &b); + switch (num) { // Swapped ports on the Amiga + case 0: + return a; + case 1: + return b; + default: + break; + } +#endif + return 1; +} + +/************************************************************************** + ... +**************************************************************************/ +void Sound_Pause(void) +{ + if (SoundEnabled) + { + SoundEnabled=0; + } +} + +/************************************************************************** + ... +**************************************************************************/ +void Sound_Continue(void) +{ + if (!SoundEnabled) + { + SoundEnabled=1; + } +} + +/************************************************************************** + Insert a disk into the drive +**************************************************************************/ +LONG InsertDisk( LONG Drive ) +{ + char Filename[256]; + int Success = FALSE; + + if (AslRequestTags( DiskFileReq, + ASLFR_Screen, ScreenMain, + TAG_DONE)) + { + SIO_Dismount( Drive ); + + strcpy( Filename, DiskFileReq->fr_Drawer ); + if (AddPart( Filename, DiskFileReq->fr_File,255) != DOSFALSE ) + { + if (SIO_Mount (Drive, Filename, 0)) /* last parameter is read only */ + { + Success = TRUE; + } + } + } + + return Success; +} + +/************************************************************************** + Insert a ROM (not improved yet) +**************************************************************************/ +LONG InsertROM(LONG CartType) +{ + struct FileRequester *FileRequester = NULL; + char Filename[256]; + int Success = FALSE; + + if ((FileRequester = (struct FileRequester*) AllocAslRequestTags (ASL_FileRequest, TAG_DONE))) + { + if (AslRequestTags (FileRequester, + ASLFR_Screen, ScreenMain, + TAG_DONE)) + { + if (FileRequester->fr_Drawer) Strlcpy(Filename, FileRequester->fr_Drawer, sizeof(Filename)); + else Filename[0] = 0; + AddPart(Filename, FileRequester->fr_File, sizeof(Filename)); + + if (CartType == 0) + { +/* Remove_ROM (); + if (Insert_8K_ROM(Filename)) + { + Atari800_Coldstart (); + }*/ + } + else if (CartType == 1) + { +/* Remove_ROM (); + if (Insert_16K_ROM(Filename)) + { + Atari800_Coldstart (); + }*/ + } + else if (CartType == 2) + { +/* Remove_ROM (); + if (Insert_OSS_ROM(Filename)) + { + Atari800_Coldstart (); + }*/ + } + } + else + { + /* + * Cancelled + */ + } + } + else + { + printf ("Unable to create requester\n"); + } + + return Success; +} + +char program_name[256]; + +/************************************************************************** + main +**************************************************************************/ +int main(int argc, char **argv) +{ + struct WBStartup *wbs = NULL; + + if (!argc) + { + /* started from workbench */ + if ((wbs = (struct WBStartup*)argv)) + { + strncpy(program_name, wbs->sm_ArgList->wa_Name, sizeof(program_name)-1); + program_name[sizeof(program_name)-1]= 0; + } + } else + { + /* started from shell */ + strncpy(program_name,argv[0],sizeof(program_name)-1); + program_name[sizeof(program_name)-1]=0; + } + + /* initialise Atari800 core */ + if (!Atari800_Initialise(&argc, argv)) + return 20; + + if (wbs && wbs->sm_NumArgs > 1) + { + BPTR odir = CurrentDir(wbs->sm_ArgList[1].wa_Lock); + Atari_LoadAnyFile(wbs->sm_ArgList[1].wa_Name); + CurrentDir(odir); + } + + for (;;) + { + LONG LastDisplayType = DisplayType; + + INPUT_key_code = PLATFORM_Keyboard(); + + if (LastDisplayType != DisplayType) + { + FreeDisplay(); + if (!(SetupDisplay())) { + Atari800_ErrExit(); + break; + } + } + + Atari800_Frame(); + + if (Atari800_display_screen && !SizeVerify) + PLATFORM_DisplayScreen(); + } + + return 0; +} diff --git a/src/amiga/amiga.h b/src/amiga/amiga.h new file mode 100644 index 0000000..2e14ede --- /dev/null +++ b/src/amiga/amiga.h @@ -0,0 +1,70 @@ +#ifndef _ATARI_AMIGA_H_ +#define _ATARI_AMIGA_H_ + +LONG InsertROM(LONG CartType); +LONG InsertDisk( LONG Drive ); + +VOID FreeDisplay(void); +LONG SetupDisplay(void); +VOID Iconify(void); + +enum{ + MEN_PROJECT=1, + MEN_PROJECT_ABOUT, + MEN_PROJECT_LOADSTATE, + MEN_PROJECT_SAVESTATE, + MEN_PROJECT_LOADBIN, + MEN_PROJECT_ICONIFY, + MEN_PROJECT_QUIT, + + MEN_SYSTEM, + MEN_SYSTEM_BOOT, + MEN_SYSTEM_ID, + MEN_SYSTEM_ID1, + MEN_SYSTEM_ID2, + MEN_SYSTEM_ID3, + MEN_SYSTEM_ID4, + MEN_SYSTEM_ID5, + MEN_SYSTEM_ID6, + MEN_SYSTEM_ID7, + MEN_SYSTEM_ID8, + MEN_SYSTEM_ED, + MEN_SYSTEM_ED1, + MEN_SYSTEM_ED2, + MEN_SYSTEM_ED3, + MEN_SYSTEM_ED4, + MEN_SYSTEM_ED5, + MEN_SYSTEM_ED6, + MEN_SYSTEM_ED7, + MEN_SYSTEM_ED8, + + MEN_SYSTEM_UI, + + MEN_CONSOLE, + MEN_CONSOLE_OPTION, + MEN_CONSOLE_SELECT, + MEN_CONSOLE_START, + MEN_CONSOLE_HELP, + MEN_CONSOLE_BREAK, + MEN_CONSOLE_RESET, + MEN_CONSOLE_COLDSTART, + + MEN_SETTINGS, + MEN_SETTINGS_FRAMERATE, + MEN_SETTINGS_CUSTOMSCREEN, + MEN_SETTINGS_WINDOW, + MEN_SETTINGS_SCALABLEWINDOW, + MEN_SETTINGS_SAVE, + + MEN_SETTINGS_PORT0_GAMEPORT, + MEN_SETTINGS_PORT0_NUMERICPAD, + MEN_SETTINGS_PORT0_CURSORKEYS, + MEN_SETTINGS_PORT0_UNASSIGNED, + + MEN_SETTINGS_PORT1_GAMEPORT, + MEN_SETTINGS_PORT1_NUMERICPAD, + MEN_SETTINGS_PORT1_CURSORKEYS, + MEN_SETTINGS_PORT1_UNASSIGNED, +}; + +#endif /* _ATARI_AMIGA_H_ */ diff --git a/src/amiga/amiga_asm.asm b/src/amiga/amiga_asm.asm new file mode 100644 index 0000000..5395717 --- /dev/null +++ b/src/amiga/amiga_asm.asm @@ -0,0 +1,133 @@ +; atari_asm.asm - Amiga specific port code +; +; Copyright (c) 2000 Sebastian Bauer +; Copyright (C) 2000-2003 Atari800 development team (see DOC/CREDITS) +; +; This file is part of the Atari800 emulator project which emulates +; the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. +; +; Atari800 is free software; you can redistribute it and/or modify +; it under the terms of the GNU General Public License as published by +; the Free Software Foundation; either version 2 of the License, or +; (at your option) any later version. +; +; Atari800 is distributed in the hope that it will be useful, +; but WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +; GNU General Public License for more details. +; +; You should have received a copy of the GNU General Public License +; along with Atari800; if not, write to the Free Software +; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + MC68020 + + XDEF _ScreenData28bit + +; a0 - UBYTE *screen +; a1 - UBYTE *destscreendata +; a2 - UBYTE *colortable8 +; d0 - UWORD width +; d1 - UWORD height + +_ScreenData28bit: + movem.l d2/d7,-(a7) + lsr.w #2,d0 + subq.l #1,d1 + subq.l #1,d0 + + moveq #0,d2 +; moveq #0,d3 +; moveq #0,d4 +; moveq #0,d5 + +.heightloop: move.l d0,d7 + +.widthloop: +; move.b (a0)+,d2 +; move.b (a0)+,d3 +; move.b (a0)+,d4 +; move.b (a0)+,d5 + +; move.b (a2,d2),(a1)+ +; move.b (a2,d3),(a1)+ +; move.b (a2,d4),(a1)+ +; move.b (a2,d5),(a1)+ + + move.b (a0)+,d2 + move.b (a2,d2),(a1)+ + + move.b (a0)+,d2 + move.b (a2,d2),(a1)+ + + move.b (a0)+,d2 + move.b (a2,d2),(a1)+ + + move.b (a0)+,d2 + move.b (a2,d2),(a1)+ + +; moveq #0,d3 +; moveq #0,d5 + +; move.b (a0)+,d2 +; move.b (a2,d2),d3 + +; move.b (a0)+,d2 +; lsl.w #8,d3 +; move.b (a2,d2),d4 + +; move.b (a0)+,d2 +; or.w d4,d3 +; move.b (a2,d2),d5 +; swap d3 + +; move.b (a0)+,d2 +; lsl.w #8,d5 +; move.b (a2,d2),d3 + +; or.w d5,d3 +; move.l d3,(a1)+ + + dbra d7,.widthloop + dbra d1,.heightloop + + movem.l (a7)+,d2/d7 + rts + + + XDEF _ScreenData215bit + +; a0 - UBYTE *screen +; a1 - UWORD *destscreendata +; a2 - UWORD *colortable15 +; d0 - UWORD width +; d1 - UWORD height + + +_ScreenData215bit: + movem.l d2/d3/d7,-(a7) + lsr.l #1,d0 + subq.l #1,d1 + subq.l #1,d0 + + moveq #0,d2 + +.heightloop: move.l d0,d7 + +.widthloop: + move.b (a0)+,d2 + move.w (a2,d2*2),d3 + + move.b (a0)+,d2 + swap d3 + move.w (a2,d2*2),d3 + + move.l d3,(a1)+ + + dbra d7,.widthloop + dbra d1,.heightloop + + movem.l (a7)+,d2/d3/d7 + rts + + end diff --git a/src/amiga/amiga_asm.h b/src/amiga/amiga_asm.h new file mode 100644 index 0000000..8f49060 --- /dev/null +++ b/src/amiga/amiga_asm.h @@ -0,0 +1,17 @@ +#ifndef _AMIGA_ASM_H_ +#define _AMIGA_ASM_H_ + +ASM void ScreenData28bit( register __a0 UBYTE *screen, + register __a1 UBYTE *tempscreendata, + register __a2 UBYTE *colortable8, + register __d0 ULONG width, + register __d1 ULONG height); + +ASM void ScreenData215bit( register __a0 UBYTE *screen, + register __a1 UWORD *, + register __a2 UWORD *colortable15, + register __d0 ULONG width, + register __d1 ULONG height); + +#endif /* _AMIGA_ASM_H_ */ + diff --git a/src/amiga/async.c b/src/amiga/async.c new file mode 100644 index 0000000..73323eb --- /dev/null +++ b/src/amiga/async.c @@ -0,0 +1,579 @@ +/* + * async.c - async I/O code + * + * Copyright (c) 2000 Sebastian Bauer + * Copyright (c) 2000-2003 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "async.h" + +//------------------------------------- +// AS_OpenAsnycFH + + +#ifdef ASIO_NOEXTERNALS +AsyncFile* +AS_OpenAsyncFH( + BPTR handle, + OpenModes mode, + LONG bufferSize, + BOOL closeIt, + struct ExecBase *SysBase, + struct DosLibrary *DOSBase ) +#else +AsyncFile * +AS_OpenAsyncFH( BPTR handle, OpenModes mode, LONG bufferSize, BOOL closeIt ) +#endif +{ + struct FileHandle *fh; + AsyncFile *file = NULL; + BPTR lock = NULL; + LONG blockSize, blockSize2; + D_S( struct InfoData, infoData ); + + if( mode == MODE_READ ) + { + if( handle ) + { + lock = DupLockFromFH( handle ); + } + } + else + { + if( mode == MODE_APPEND ) + { + /* in append mode, we open for writing, and then seek to the + * end of the file. That way, the initial write will happen at + * the end of the file, thus extending it + */ + + if( handle ) + { + if( Seek( handle, 0, OFFSET_END ) < 0 ) + { + if( closeIt ) + { + Close( handle ); + } + + handle = NULL; + } + } + } + + /* we want a lock on the same device as where the file is. We can't + * use DupLockFromFH() for a write-mode file though. So we get sneaky + * and get a lock on the parent of the file + */ + if( handle ) + { + lock = ParentOfFH( handle ); + } + } + + if( handle ) + { + /* if it was possible to obtain a lock on the same device as the + * file we're working on, get the block size of that device and + * round up our buffer size to be a multiple of the block size. + * This maximizes DMA efficiency. + */ + + blockSize = 512; + blockSize2 = 1024; + + if( lock ) + { + if( Info( lock, infoData ) ) + { + blockSize = infoData->id_BytesPerBlock; + blockSize2 = blockSize * 2; + bufferSize = ( ( bufferSize + blockSize2 - 1 ) / blockSize2 ) * blockSize2; + } + + UnLock(lock); + } + + /* now allocate the ASyncFile structure, as well as the read buffers. + * Add 15 bytes to the total size in order to allow for later + * quad-longword alignement of the buffers + */ + + for( ;; ) + { + if(( file = AllocVec( sizeof( AsyncFile ) + bufferSize + 15, MEMF_PUBLIC | MEMF_ANY ) )) + { + break; + } + else + { + if( bufferSize > blockSize2 ) + { + bufferSize -= blockSize2; + } + else + { + break; + } + } + } + + if( file ) + { + file->af_File = handle; + file->af_ReadMode = ( mode == MODE_READ ); + file->af_BlockSize = blockSize; + file->af_CloseFH = closeIt; + + /* initialize the ASyncFile structure. We do as much as we can here, + * in order to avoid doing it in more critical sections + * + * Note how the two buffers used are quad-longword aligned. This + * helps performance on 68040 systems with copyback cache. Aligning + * the data avoids a nasty side-effect of the 040 caches on DMA. + * Not aligning the data causes the device driver to have to do + * some magic to avoid the cache problem. This magic will generally + * involve flushing the CPU caches. This is very costly on an 040. + * Aligning things avoids the need for magic, at the cost of at + * most 15 bytes of ram. + */ + + fh = BADDR( file->af_File ); + file->af_Handler = fh->fh_Type; + file->af_BufferSize = ( ULONG ) bufferSize / 2; + file->af_Buffers[ 0 ] = ( APTR ) ( ( ( ULONG ) file + sizeof( AsyncFile ) + 15 ) & 0xfffffff0 ); + file->af_Buffers[ 1 ] = file->af_Buffers[ 0 ] + file->af_BufferSize; + file->af_CurrentBuf = 0; + file->af_SeekOffset = 0; + file->af_PacketPending = FALSE; + file->af_SeekPastEOF = FALSE; +#ifdef ASIO_NOEXTERNALS + file->af_SysBase = SysBase; + file->af_DOSBase = DOSBase; +#endif + + /* this is the port used to get the packets we send out back. + * It is initialized to PA_IGNORE, which means that no signal is + * generated when a message comes in to the port. The signal bit + * number is initialized to SIGB_SINGLE, which is the special bit + * that can be used for one-shot signalling. The signal will never + * be set, since the port is of type PA_IGNORE. We'll change the + * type of the port later on to PA_SIGNAL whenever we need to wait + * for a message to come in. + * + * The trick used here avoids the need to allocate an extra signal + * bit for the port. It is quite efficient. + */ + + file->af_PacketPort.mp_MsgList.lh_Head = ( struct Node * ) &file->af_PacketPort.mp_MsgList.lh_Tail; + file->af_PacketPort.mp_MsgList.lh_Tail = NULL; + file->af_PacketPort.mp_MsgList.lh_TailPred = ( struct Node * ) &file->af_PacketPort.mp_MsgList.lh_Head; + file->af_PacketPort.mp_Node.ln_Type = NT_MSGPORT; + /* MH: Avoid problems with SnoopDos */ + file->af_PacketPort.mp_Node.ln_Name = NULL; + file->af_PacketPort.mp_Flags = PA_IGNORE; + file->af_PacketPort.mp_SigBit = SIGB_SINGLE; + file->af_PacketPort.mp_SigTask = FindTask( NULL ); + + file->af_Packet.sp_Pkt.dp_Link = &file->af_Packet.sp_Msg; + file->af_Packet.sp_Pkt.dp_Arg1 = fh->fh_Arg1; + file->af_Packet.sp_Pkt.dp_Arg3 = file->af_BufferSize; + file->af_Packet.sp_Pkt.dp_Res1 = 0; + file->af_Packet.sp_Pkt.dp_Res2 = 0; + file->af_Packet.sp_Msg.mn_Node.ln_Name = ( STRPTR ) &file->af_Packet.sp_Pkt; + file->af_Packet.sp_Msg.mn_Node.ln_Type = NT_MESSAGE; + file->af_Packet.sp_Msg.mn_Length = sizeof( struct StandardPacket ); + + if( mode == MODE_READ ) + { + /* if we are in read mode, send out the first read packet to + * the file system. While the application is getting ready to + * read data, the file system will happily fill in this buffer + * with DMA transfers, so that by the time the application + * needs the data, it will be in the buffer waiting + */ + + file->af_Packet.sp_Pkt.dp_Type = ACTION_READ; + file->af_BytesLeft = 0; + + /* MH: We set the offset to the buffer not being filled, in + * order to avoid special case code in SeekAsync. ReadAsync + * isn't affected by this, since af_BytesLeft == 0. + */ + file->af_Offset = file->af_Buffers[ 1 ]; + + if( file->af_Handler ) + { + AS_SendPacket( file, file->af_Buffers[ 0 ] ); + } + } + else + { + file->af_Packet.sp_Pkt.dp_Type = ACTION_WRITE; + file->af_BytesLeft = file->af_BufferSize; + file->af_Offset = file->af_Buffers[ 0 ]; + } + } + else + { + if( closeIt ) + { + Close( handle ); + } + } + } + + return( file ); +} +//------------------------------------- +// AS_SendPacket +/* send out an async packet to the file system. */ +VOID +AS_SendPacket( struct AsyncFile *file, APTR arg2 ) +{ +#ifdef ASIO_NOEXTERNALS + struct ExecBase *SysBase; + + SysBase = file->af_SysBase; +#endif + + file->af_Packet.sp_Pkt.dp_Port = &file->af_PacketPort; + file->af_Packet.sp_Pkt.dp_Arg2 = ( LONG ) arg2; + PutMsg( file->af_Handler, &file->af_Packet.sp_Msg ); + file->af_PacketPending = TRUE; +} +//------------------------------------- +// AS_WaitPacket +/* this function waits for a packet to come back from the file system. If no + * packet is pending, state from the previous packet is returned. This ensures + * that once an error occurs, it state is maintained for the rest of the life + * of the file handle. + * + * This function also deals with IO errors, bringing up the needed DOS + * requesters to let the user retry an operation or cancel it. + */ +LONG +AS_WaitPacket( AsyncFile *file ) +{ +#ifdef ASIO_NOEXTERNALS + struct ExecBase *SysBase = file->af_SysBase; + struct DosLibrary *DOSBase = file->af_DOSBase; +#endif + LONG bytes; + + if( file->af_PacketPending ) + { + while( TRUE ) + { + /* This enables signalling when a packet comes back to the port */ + file->af_PacketPort.mp_Flags = PA_SIGNAL; + + /* Wait for the packet to come back, and remove it from the message + * list. Since we know no other packets can come in to the port, we can + * safely use Remove() instead of GetMsg(). If other packets could come in, + * we would have to use GetMsg(), which correctly arbitrates access in such + * a case + */ + Remove( ( struct Node * ) WaitPort( &file->af_PacketPort ) ); + + /* set the port type back to PA_IGNORE so we won't be bothered with + * spurious signals + */ + file->af_PacketPort.mp_Flags = PA_IGNORE; + + /* mark packet as no longer pending since we removed it */ + file->af_PacketPending = FALSE; + + bytes = file->af_Packet.sp_Pkt.dp_Res1; + + if( bytes >= 0 ) + { + /* packet didn't report an error, so bye... */ + return( bytes ); + } + + /* see if the user wants to try again... */ + if( ErrorReport( file->af_Packet.sp_Pkt.dp_Res2, REPORT_STREAM, file->af_File, NULL ) ) + { + return( -1 ); + } + + /* user wants to try again, resend the packet */ + AS_SendPacket( file, + file->af_Buffers[ file->af_ReadMode ? + file->af_CurrentBuf : + 1 - file->af_CurrentBuf ] ); + } + } + + /* last packet's error code, or 0 if packet was never sent */ + SetIoErr( file->af_Packet.sp_Pkt.dp_Res2 ); + + return( file->af_Packet.sp_Pkt.dp_Res1 ); +} +//------------------------------------- +// AS_RequeuePacket( AsyncFile *file ) +/* this function puts the packet back on the message list of our + * message port. + */ +VOID +AS_RequeuePacket( AsyncFile *file ) +{ +#ifdef ASIO_NOEXTERNALS + struct ExecBase *SysBase = file->af_SysBase; +#endif + + AddHead( &file->af_PacketPort.mp_MsgList, &file->af_Packet.sp_Msg.mn_Node ); + file->af_PacketPending = TRUE; +} +//------------------------------------- + +//------------------------------------- +// AsyncFile *OpenAsync() + +#ifdef ASIO_NOEXTERNALS +_LIBCALL AsyncFile * +OpenAsync( + _REG( a0 ) const STRPTR fileName, + _REG( d0 ) OpenModes mode, + _REG( d1 ) LONG bufferSize, + _REG( a1 ) struct ExecBase *SysBase, + _REG( a2 ) struct DosLibrary *DOSBase ) +#else +_LIBCALL AsyncFile * +OpenAsync( + _REG( a0 ) const STRPTR fileName, + _REG( d0 ) OpenModes mode, + _REG( d1 ) LONG bufferSize ) +#endif +{ + static const WORD PrivateOpenModes[] = + { + MODE_OLDFILE, MODE_NEWFILE, MODE_READWRITE + }; + BPTR handle; + AsyncFile *file = NULL; + + if(( handle = Open( fileName, PrivateOpenModes[ mode ] ) )) + { +#ifdef ASIO_NOEXTERNALS + file = AS_OpenAsyncFH( handle, mode, bufferSize, TRUE, SysBase, DOSBase ); +#else + file = AS_OpenAsyncFH( handle, mode, bufferSize, TRUE ); +#endif + + if( !file ) + { + Close( handle ); + } + } + + return( file ); +} +//------------------------------------- +// LONG CloseAsync(AsyncFile *file ) +_LIBCALL LONG +CloseAsync( _REG( a0 ) AsyncFile *file ) +{ + LONG result; + + if( file ) + { +#ifdef ASIO_NOEXTERNALS + struct ExecBase *SysBase = file->af_SysBase; + struct DosLibrary *DOSBase = file->af_DOSBase; +#endif + result = AS_WaitPacket( file ); + + if( result >= 0 ) + { + if( !file->af_ReadMode ) + { + /* this will flush out any pending data in the write buffer */ + if( file->af_BufferSize > file->af_BytesLeft ) + { + result = Write( + file->af_File, + file->af_Buffers[ file->af_CurrentBuf ], + file->af_BufferSize - file->af_BytesLeft ); + } + } + } + + if( file->af_CloseFH ) + { + Close( file->af_File ); + } + + FreeVec(file); + } + else + { +#ifndef ASIO_NOEXTERNALS + SetIoErr( ERROR_INVALID_LOCK ); +#endif + result = -1; + } + + return( result ); +} +//------------------------------------- +// LONG WriteAsync( AsyncFile *file, APTR buffer, LONG numBytes ) + +_LIBCALL LONG +WriteAsync( _REG( a0 ) AsyncFile *file, _REG( a1 ) APTR buffer, _REG( d0 ) LONG numBytes ) +{ +#ifdef ASIO_NOEXTERNALS + struct ExecBase *SysBase = file->af_SysBase; +#endif + LONG totalBytes = 0; + + /* this takes care of NIL: */ + if( !file->af_Handler ) + { + file->af_Offset = file->af_Buffers[ 0 ]; + file->af_BytesLeft = file->af_BufferSize; + return( numBytes ); + } + + while( numBytes > file->af_BytesLeft ) + { + if( file->af_BytesLeft ) + { + CopyMem( buffer, file->af_Offset, file->af_BytesLeft ); + + numBytes -= file->af_BytesLeft; + buffer = ( APTR ) ( ( ULONG ) buffer + file->af_BytesLeft ); + totalBytes += file->af_BytesLeft; + } + + if( AS_WaitPacket( file ) < 0 ) + { + return( -1 ); + } + + /* send the current buffer out to disk */ + AS_SendPacket( file, file->af_Buffers[ file->af_CurrentBuf ] ); + + file->af_CurrentBuf = 1 - file->af_CurrentBuf; + file->af_Offset = file->af_Buffers[ file->af_CurrentBuf ]; + file->af_BytesLeft = file->af_BufferSize; + } + + CopyMem( buffer, file->af_Offset, numBytes ); + file->af_BytesLeft -= numBytes; + file->af_Offset += numBytes; + + return ( totalBytes + numBytes ); +} +//------------------------------------- +// LONG WriteCharAsync( AsyncFile *file, UBYTE ch ) +_CALL LONG +WriteCharAsync( _REG( a0 ) AsyncFile *file, _REG( d0 ) UBYTE ch ) +{ + if( file->af_BytesLeft ) + { + /* if there's any room left in the current buffer, directly write + * the byte into it, updating counters and stuff. + */ + + *file->af_Offset = ch; + --file->af_BytesLeft; + ++file->af_Offset; + + /* one byte written */ + return( 1 ); + } + + /* there was no room in the current buffer, so call the main write + * routine. This will effectively send the current buffer out to disk, + * wait for the other buffer to come back, and then put the byte into + * it. + */ + + { + TEXT c; + + c = ch; /* SAS/C workaround... */ + + return( WriteAsync( file, &c, 1 ) ); + } +} +//------------------------------------- +// LONG ReadAsync( AsyncFile *file, APTR buffer, LONG numBytes ) +_LIBCALL LONG +ReadAsync( _REG( a0 ) AsyncFile *file, _REG( a1 ) APTR buffer, _REG( d0 ) LONG numBytes ) +{ +#ifdef ASIO_NOEXTERNALS + struct ExecBase *SysBase = file->af_SysBase; +#endif + LONG totalBytes = 0; + LONG bytesArrived; + + /* if we need more bytes than there are in the current buffer, enter the + * read loop + */ + + while( numBytes > file->af_BytesLeft ) + { + /* drain buffer */ + CopyMem( file->af_Offset, buffer, file->af_BytesLeft ); + + numBytes -= file->af_BytesLeft; + buffer = ( APTR ) ( ( ULONG ) buffer + file->af_BytesLeft ); + totalBytes += file->af_BytesLeft; + file->af_BytesLeft = 0; + + bytesArrived = AS_WaitPacket( file ); + + if( bytesArrived <= 0 ) + { + if( bytesArrived == 0 ) + { + return( totalBytes ); + } + + return( -1 ); + } + + /* ask that the buffer be filled */ + AS_SendPacket( file, file->af_Buffers[ 1 - file->af_CurrentBuf ] ); + + /* in case we tried to seek past EOF */ + if( file->af_SeekOffset > bytesArrived ) + { + file->af_SeekOffset = bytesArrived; + } + + file->af_Offset = file->af_Buffers[ file->af_CurrentBuf ] + file->af_SeekOffset; + file->af_CurrentBuf = 1 - file->af_CurrentBuf; + file->af_BytesLeft = bytesArrived - file->af_SeekOffset; + file->af_SeekOffset = 0; + } + + CopyMem( file->af_Offset, buffer, numBytes ); + file->af_BytesLeft -= numBytes; + file->af_Offset += numBytes; + + return( totalBytes + numBytes ); +} +//------------------------------------- + + diff --git a/src/amiga/async.h b/src/amiga/async.h new file mode 100644 index 0000000..52f370c --- /dev/null +++ b/src/amiga/async.h @@ -0,0 +1,87 @@ +#ifndef _ASYNC_H_ +#define _ASYNC_H_ + +#include +#include +#include +#include + +#include + +#include +#include + +#include + + +/*****************************************************************************/ + + +#ifdef _DCC + #ifdef ASIO_SHARED_LIB + #define _LIBCALL __geta4 _ASM _ARGS + #else + #define _LIBCALL _ASM _ARGS + #endif +#else + #ifdef __GNUC__ + #define _LIBCALL + #else + #ifdef __MAXON__ + #define _LIBCALL + #else /* __SASC__ */ + #ifdef ASIO_SHARED_LIB + #define _LIBCALL __saveds _ASM _ARGS + #else + #define _LIBCALL _ASM _ARGS + #endif + #endif + #endif /* _ GNUC_ */ +#endif /* _DCC */ + +#define _CALL _ASM _ARGS + + +/*****************************************************************************/ + + +#ifndef ASIO_NOEXTERNALS +extern struct DosLibrary *DOSBase; +extern struct ExecBase *SysBase; +#endif + +#ifdef ASIO_SHARED_LIB +extern struct ExecBase *SysBase; +extern struct Library *UtilityBase; +extern struct DosLibrary *DOSBase; +#endif + + +/*****************************************************************************/ + + +/* this macro lets us long-align structures on the stack */ +#define D_S(type,name) char a_##name[ sizeof( type ) + 3 ]; \ + type *name = ( type * ) ( ( LONG ) ( a_##name + 3 ) & ~3 ); + +#ifndef MIN +#define MIN(a,b) ( ( a ) < ( b ) ? ( a ) : ( b ) ) +#endif + + +/*****************************************************************************/ + + +#ifdef ASIO_NOEXTERNALS +AsyncFile * +AS_OpenAsyncFH( BPTR handle, OpenModes mode, LONG bufferSize, BOOL closeIt, struct ExecBase *SysBase, struct DosLibrary *DOSBase ); +#else +AsyncFile * +AS_OpenAsyncFH( BPTR handle, OpenModes mode, LONG bufferSize, BOOL closeIt ); +#endif +VOID AS_SendPacket( AsyncFile *file, APTR arg2 ); +LONG AS_WaitPacket( AsyncFile *file ); +VOID AS_RequeuePacket( AsyncFile *file ); +VOID AS_RecordSyncFailure( AsyncFile *file ); + +#endif /* _ASYNC_H_ */ diff --git a/src/amiga/config.h b/src/amiga/config.h new file mode 100644 index 0000000..6dc01e0 --- /dev/null +++ b/src/amiga/config.h @@ -0,0 +1,428 @@ +#ifndef CONFIG_H +#define CONFIG_H + +/* Define to use back slash as directory separator. */ +#undef BACK_SLASH + +/* Target: standard I/O. */ +#undef BASIC + +/* Define to use buffered debug output. */ +#undef BUFFERED_LOG + +/* Define to allow sound clipping. */ +#undef CLIP_SOUND + +/* Define to 1 if the `closedir' function returns void instead of `int'. */ +#undef CLOSEDIR_VOID + +/* Define to allow console sound (keyboard clicks). */ +#define CONSOLE_SOUND 1 + +/* Define to activate crash menu after CIM instruction. */ +#define CRASH_MENU 1 + +/* Define to disable bitmap graphics emulation in CURSES target. */ +#undef CURSES_BASIC + +/* Alternate config filename due to 8+3 fs limit. */ +#define DEFAULT_CFG_NAME "PROGDIR:Atari800.cfg" + +/* Target: Windows with DirectX. */ +#undef DIRECTX + +/* Target: DOS VGA. */ +#undef DOSVGA + +/* Define to enable DOS style drives support. */ +#undef DOS_DRIVES + +/* Target: Atari Falcon system. */ +#undef FALCON + +/* Define to use m68k assembler CPU core for Falcon target. */ +#undef FALCON_CPUASM + +/* Define to 1 if you have the header file. */ +#undef HAVE_ARPA_INET_H + +/* Define to 1 if you have the `atexit' function. */ +#define HAVE_ATEXIT 1 + +/* Define to 1 if you have the `chmod' function. */ +#define HAVE_CHMOD 1 + +/* Define to 1 if you have the `clock' function. */ +#define HAVE_CLOCK 1 + +/* Define to 1 if you have the header file. */ +#undef HAVE_DIRECT_H + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#define HAVE_DIRENT_H 1 + +/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ +#undef HAVE_DOPRNT + +/* Define to 1 if you have the header file. */ +#define HAVE_ERRNO_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_FCNTL_H 1 + +/* Define to 1 if you have the `fdopen' function. */ +#define HAVE_FDOPEN 1 + +/* Define to 1 if you have the `fflush' function. */ +#define HAVE_FFLUSH 1 + +/* Define to 1 if you have the header file. */ +#undef HAVE_FILE_H + +/* Define to 1 if you have the `floor' function. */ +#define HAVE_FLOOR 1 + +/* Define to 1 if you have the `fstat' function. */ +#define HAVE_FSTAT 1 + +/* Define to 1 if you have the `getcwd' function. */ +#define HAVE_GETCWD 1 + +/* Define to 1 if you have the `gethostbyaddr' function. */ +#undef HAVE_GETHOSTBYADDR + +/* Define to 1 if you have the `gethostbyname' function. */ +#undef HAVE_GETHOSTBYNAME + +/* Define to 1 if you have the `gettimeofday' function. */ +#define HAVE_GETTIMEOFDAY 1 + +/* Define to 1 if you have the `inet_ntoa' function. */ +#undef HAVE_INET_NTOA + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the `png' library (-lpng). */ +/*#define HAVE_LIBPNG 1*/ + +/* Define to 1 if you have the `z' library (-lz). */ +/*#define HAVE_LIBZ 1*/ + +/* Define to 1 if you have the `localtime' function. */ +#define HAVE_LOCALTIME 1 + +/* Define to 1 if you have the `memmove' function. */ +#define HAVE_MEMMOVE 1 + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `memset' function. */ +#define HAVE_MEMSET 1 + +/* Define to 1 if you have the `mkdir' function. */ +#define HAVE_MKDIR 1 + +/* Define to 1 if you have the `mkstemp' function. */ +#define HAVE_MKSTEMP 1 + +/* Define to 1 if you have the `mktemp' function. */ +#define HAVE_MKTEMP 1 + +/* Define to 1 if you have the `modf' function. */ +#define HAVE_MODF 1 + +/* Define to 1 if you have the `nanosleep' function. */ +#undef HAVE_NANOSLEEP + +/* Define to 1 if you have the header file, and it defines `DIR'. */ +#undef HAVE_NDIR_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_NETDB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_NETINET_IN_H + +/* Define to 1 if you have the `opendir' function. */ +#define HAVE_OPENDIR 1 + +/* Define to 1 if you have the `rename' function. */ +#define HAVE_RENAME 1 + +/* Define to 1 if you have the `rewind' function. */ +#define HAVE_REWIND 1 + +/* Define to 1 if you have the `rmdir' function. */ +#define HAVE_RMDIR 1 + +/* Define to 1 if you have the `select' function. */ +#undef HAVE_SELECT + +/* Define to 1 if you have the `signal' function. */ +#define HAVE_SIGNAL 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SIGNAL_H 1 + +/* Define to 1 if you have the `snprintf' function. */ +#define HAVE_SNPRINTF 1 + +/* Define to 1 if you have the `socket' function. */ +#undef HAVE_SOCKET + +/* Define to 1 if you have the `stat' function. */ +#define HAVE_STAT 1 + +/* Define to 1 if `stat' has the bug that it succeeds when given the + zero-length file name argument. */ +#undef HAVE_STAT_EMPTY_STRING_BUG + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the `strcasecmp' function. */ +#define HAVE_STRCASECMP 1 + +/* Define to 1 if you have the `strchr' function. */ +#define HAVE_STRCHR 1 + +/* Define to 1 if you have the `strdup' function. */ +#define HAVE_STRDUP 1 + +/* Define to 1 if you have the `strerror' function. */ +#define HAVE_STRERROR 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the `strrchr' function. */ +#define HAVE_STRRCHR 1 + +/* Define to 1 if you have the `strstr' function. */ +#define HAVE_STRSTR 1 + +/* Define to 1 if you have the `strtol' function. */ +#define HAVE_STRTOL 1 + +/* Define to 1 if you have the `system' function. */ +//#define HAVE_SYSTEM 1 + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#undef HAVE_SYS_DIR_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_IOCTL_H + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#undef HAVE_SYS_NDIR_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SELECT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SOCKET_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SOUNDCARD_H + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TIME_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_TERMIOS_H 1 + +/* Define to 1 if you have the `time' function. */ +#define HAVE_TIME 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_TIME_H 1 + +/* Define to 1 if you have the `tmpfile' function. */ +#define HAVE_TMPFILE 1 + +/* Define to 1 if you have the `tmpnam' function. */ +#define HAVE_TMPNAM 1 + +/* Define to 1 if you have the `uclock' function. */ +#define HAVE_UCLOCK 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNIXIO_H + +/* Define to 1 if you have the `unlink' function. */ +#define HAVE_UNLINK 1 + +/* Define to 1 if you have the `usleep' function. */ +#define HAVE_USLEEP 1 + +/* Define to 1 if you have the `vprintf' function. */ +#define HAVE_VPRINTF 1 + +/* Define to 1 if you have the `vsnprintf' function. */ +#define HAVE_VSNPRINTF 1 + +/* define to enable sound interpolation */ +#define INTERPOLATE_SOUND 1 + +/* Define to use LINUX joystick. */ +#undef LINUX_JOYSTICK + +/* Define to 1 if `lstat' dereferences a symlink specified with a trailing + slash. */ +#undef LSTAT_FOLLOWS_SLASHED_SYMLINK + +/* Define to activate assembler in monitor. */ +#define MONITOR_ASSEMBLER 1 + +/* Define to activate BREAK command in monitor. */ +#undef MONITOR_BREAK + +/* Define to activate user-defined breakpoints. */ +#undef MONITOR_BREAKPOINTS + +/* Define to activate hints in disassembler. */ +#define MONITOR_HINTS 1 + +/* Target: X11 with Motif. */ +#undef MOTIF + +/* Define to allow color changes inside a scanline. */ +#define NEW_CYCLE_EXACT 1 + +/* Define to use page-based attribute array. */ +#undef PAGED_ATTRIB + +/* Target: Sony PlayStation 2. */ +#undef PS2 + +/* Define as the return type of signal handlers (`int' or `void'). */ +#define RETSIGTYPE void + +/* Define to use R: device. */ +#undef R_IO_DEVICE + +/* Target: SDL library. */ +#undef SDL + +/* Define to the type of arg 1 for `select'. */ +#undef SELECT_TYPE_ARG1 + +/* Define to the type of args 2, 3 and 4 for `select'. */ +#undef SELECT_TYPE_ARG234 + +/* Define to the type of arg 5 for `select'. */ +#undef SELECT_TYPE_ARG5 + +/* Define to allow serial in/out sound. */ +#define SERIO_SOUND 1 + +/* Target: X11 with shared memory extensions. */ +#undef SHM + +/* Define to activate sound support. */ +#define SOUND 1 +#define SOUND_GAIN 2 + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define to allow stereo sound. */ +#define STEREO 1 +#define STEREO_SOUND 1 + +/* Save additional config file options. */ +#define SUPPORTS_ATARI_CONFIGSAVE 1 + +/* Additional config file options. */ +#define SUPPORTS_ATARI_CONFIGURE 1 + +/* Target: Linux with SVGALib. */ +#undef SVGALIB + +/* Define to use Toshiba Joystick Mouse support. */ +#undef SVGA_JOYMOUSE + +/* Define for drawing every 1/50 sec only 1/refresh of screen. */ +#undef SVGA_SPEEDUP + +/* Alternate system-wide config file for non-Unix OS. */ +#undef SYSTEM_WIDE_CFG_FILE + +/* Define to 1 if you can safely include both and . */ +#define TIME_WITH_SYS_TIME 1 + +/* Define to 1 if your declares `struct tm'. */ +#undef TM_IN_SYS_TIME + +/* Define to use clock() instead of gettimeofday(). */ +#undef USE_CLOCK + +/* Target: Curses-compatible library. */ +#undef USE_CURSES + +/* Define for using cursor/ctrl keys for keyboard joystick. */ +#undef USE_CURSORBLOCK + +/* Target: Ncurses library. */ +#undef USE_NCURSES + +/* Define to use very slow computer support (faster -refresh). */ +#undef VERY_SLOW + +/* Define to allow volume only sound. */ +#undef VOL_ONLY_SOUND + +/* Define to 1 if your processor stores words with the most significant byte + first (like Motorola and SPARC, unlike Intel and VAX). */ +#define WORDS_BIGENDIAN 1 + +/* Define if unaligned word access is ok. */ +#undef WORDS_UNALIGNED_OK + +/* Target: Standard X11. */ +#undef X11 + +/* Target: X11 with XView. */ +#undef XVIEW + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const + +/* Define as `__inline' if that's what the C compiler calls it, or to nothing + if it is not supported. */ +#undef inline + +/* Define to `unsigned' if does not define. */ +#undef size_t + +/* Define to empty if the keyword `volatile' does not work. Warning: valid + code using `volatile' can become incorrect without. Disable with care. */ +#undef volatile + +#endif + +/* Use Signed Samples in POKEY emulation */ +#define SIGNED_SAMPLES 1 + +/* Define two screen arrays used for switching */ +#define BITPL_SCR 1 diff --git a/src/amiga/gui.c b/src/amiga/gui.c new file mode 100644 index 0000000..29f2a4a --- /dev/null +++ b/src/amiga/gui.c @@ -0,0 +1,322 @@ +/* + * amiga.c - Amiga specific port code + * + * Copyright (c) 2000 Sebastian Bauer + * Copyright (c) 2000-2003 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include +#include + +#include + +#define ALL_REACTION_CLASSES +#include +#include + +#include +#include +#include + +#include "gui.h" +#include "support.h" + +struct Library *WindowBase; +struct Library *LayoutBase; +struct Library *ButtonBase; +struct Library *ListBrowserBase; +struct Library *TextEditorBase; +struct Library *LabelBase; +struct Library *StringBase; +struct Library *ScrollerBase; +struct Library *GetFileBase; +struct Library *ChooserBase; +struct Library *ClickTabBase; +struct Library *CheckBoxBase; +struct Library *GetScreenModeBase; + +struct WindowIFace *IWindow; +struct LayoutIFace *ILayout; +struct ButtonIFace *IButton; +struct ListBrowserIFace *IListBrowser; +struct TextEditorIFace *ITextEditor; +struct LabelIFace *ILabel; +struct StringIFace *IString; +struct ScrollerIFace *IScroller; +struct GetFileIFace *IGetFile; +struct ChooserIFace *IChooser; +struct ClickTabIFace *IClickTab; +struct CheckBoxIFace *ICheckBox; +struct GetScreenModeIFace *IGetScreenMode; + +#define LIBENTRY(name,version,base,iface) {name,version,(struct Library**)base,(struct Interface**) iface} +static struct +{ + STRPTR Name; + ULONG Version; + struct Library **Base; + struct Interface **IFace; +} libraries[] = +{ + LIBENTRY("window.class",44,&WindowBase,&IWindow), + LIBENTRY("gadgets/getfile.gadget",44,&GetFileBase, &IGetFile), + LIBENTRY("gadgets/layout.gadget",44,&LayoutBase, &ILayout), + LIBENTRY("gadgets/chooser.gadget",45,&ChooserBase, &IChooser), + LIBENTRY("gadgets/clicktab.gadget",44,&ClickTabBase, &IClickTab), + LIBENTRY("gadgets/button.gadget",44,&ButtonBase,&IButton), + LIBENTRY("gadgets/listbrowser.gadget",44,&ListBrowserBase,&IListBrowser), + LIBENTRY("gadgets/texteditor.gadget",50,&TextEditorBase,&ITextEditor), + LIBENTRY("gadgets/string.gadget",44,&StringBase,&IString), + LIBENTRY("gadgets/scroller.gadget",44,&ScrollerBase,&IScroller), + LIBENTRY("gadgets/checkbox.gadget",44,&CheckBoxBase, &ICheckBox), + LIBENTRY("gadgets/getscreenmode.gadget",44,&GetScreenModeBase, &IGetScreenMode), + LIBENTRY("images/label.image",44,&LabelBase,&ILabel), +}; + +/**************************************** + Close libraries +*****************************************/ +static void CloseGUILibs(void) +{ + int i; + + for (i=0;iGetAttr(attribute, obj, (ULONG*)&x); + return (x); +} + +/********************************************************************** + Set attributes of a given object. + Difference to RefreshSetGadgetAttrs() is that the parameters are all + Objects. +***********************************************************************/ +void RefreshSetObjectAttrsA(Object *o, Object *wo, struct TagItem *tags) +{ + struct Gadget *g = (struct Gadget*)o; + struct Window *w = (struct Window*)xget(wo,WINDOW_Window); + + if (!o) return; + + IIntuition->RefreshSetGadgetAttrsA(g,w,NULL,tags); +} + +void VARARGS68K RefreshSetObjectAttrs(Object *o, Object *wo, ...) +{ + ULONG *tags; + va_list args; + + va_startlinear(args,wo); + + tags = va_getlinearva(args,ULONG*); + RefreshSetObjectAttrsA(o,wo,(struct TagItem *)tags); + va_end(args); +} + +/****** GUI ********/ +static Object *main_wnd; +static Object *displaytype_chooser; +static Object *screenmode_getscreenmode; +//static Object *bestscreenmode_checkbox; + +static int quitting; + +enum +{ + GID_QUIT = 1, + GID_SAVE, + GID_USE +}; + +/********************************************************************** + Handle +***********************************************************************/ +static int Handle(struct AtariConfig *config) +{ + int rc = 0; + ULONG result; + UWORD code; + + while ((result = RA_HandleInput(main_wnd, &code) ) != WMHI_LASTMSG ) + { + switch (result & WMHI_CLASSMASK) + { + case WMHI_CLOSEWINDOW: + rc = 1; + break; + + case WMHI_GADGETUP: + switch (result & WMHI_GADGETMASK) + { + case GID_QUIT: rc = 1; quitting = 1; break; + case GID_SAVE: rc = 1; break; + case GID_USE: rc = 1; break; + } + } + } + return rc; +} + +/******************************* + Eventlloop +********************************/ +static void Loop(struct AtariConfig *config) +{ + int ready = 0; + ULONG mainMask; + + while (!ready) + { + ULONG mask; + + IIntuition->GetAttr(WINDOW_SigMask, main_wnd, &mainMask); + + mask = IExec->Wait(SIGBREAKF_CTRL_C | mainMask); + + if (mask & mainMask) + ready = Handle(config); + + if (mask & SIGBREAKF_CTRL_C) ready = 1; + } +} + +/********************************************************************** + Configure atari +***********************************************************************/ +BOOL Configure(struct AtariConfig *config) +{ + static char * const tabLabels[] = {"General","Graphics","Sound","Paths",NULL}; + static char * const screenTypeLabels[] = {"Custom","Window", "Sizeable Window", NULL}; + + if (!OpenGUILibs()) goto out; + + main_wnd = (Object*)WindowObject, + WA_Title, "Atari800", + WA_Activate, TRUE, + WA_DepthGadget, TRUE, + WA_DragBar, TRUE, + WA_CloseGadget, TRUE, + WA_SizeGadget, TRUE, + WA_IDCMP, IDCMP_INTUITICKS, +// WINDOW_IDCMPHook, &idcmpHook, + WINDOW_IDCMPHookBits, IDCMP_IDCMPUPDATE, + WINDOW_Position, WPOS_CENTERSCREEN, + WINDOW_ParentGroup, VGroupObject, + LAYOUT_SpaceOuter, TRUE, + LAYOUT_DeferLayout, TRUE, + + LAYOUT_AddChild, ClickTabObject, + GA_Text, &tabLabels, + CLICKTAB_PageGroup, PageObject, + PAGE_Add, VGroupObject, + EndGroup, + + PAGE_Add, VGroupObject, /* Graphics */ + LAYOUT_AddChild, displaytype_chooser = ChooserObject, + CHOOSER_LabelArray, screenTypeLabels, + CHOOSER_Selected, 0, + End, + MemberLabel("Displaytype"), + + LAYOUT_AddChild, screenmode_getscreenmode = GetScreenModeObject, + End, + MemberLabel("Screenmode"), + CHILD_WeightedHeight, 0, + + LAYOUT_AddChild, CheckBoxObject, + CHECKBOX_Checked, config->UseBestID, + End, + MemberLabel("Use best screen mode"), + EndGroup, + CHILD_WeightedHeight, 0, + + PAGE_Add, VGroupObject, + LAYOUT_AddChild, CheckBoxObject, + End, + MemberLabel("Enable Sound"), + EndGroup, + + + PAGE_Add, VGroupObject, /* Sound */ + EndGroup, + End, /* Page */ + End, /* Clicktab */ + LAYOUT_AddChild, HGroupObject, + LAYOUT_AddChild, Button("Start & Save",GID_SAVE), + LAYOUT_AddChild, Button("Start & Use",GID_USE), + LAYOUT_AddChild, Button("Quit",GID_QUIT), + EndGroup, + CHILD_WeightedHeight, 0, + EndGroup, + EndWindow; + + if (!main_wnd) goto out; + + RA_OpenWindow(main_wnd); + + Loop(config); + + IIntuition->DisposeObject(main_wnd); + CloseGUILibs(); + return quitting?FALSE:TRUE; + +out: + IIntuition->DisposeObject(main_wnd); + CloseGUILibs(); + return FALSE; +} + + diff --git a/src/amiga/gui.h b/src/amiga/gui.h new file mode 100644 index 0000000..91a724e --- /dev/null +++ b/src/amiga/gui.h @@ -0,0 +1,19 @@ +#ifndef _GUI_H +#define _GUI_H + +#ifndef EXEC_TYPES_H +#include +#endif + +struct AtariConfig +{ + + /* Amiga */ + ULONG DisplayType; + ULONG DisplayID; + BOOL UseBestID; +}; + +BOOL Configure(struct AtariConfig *config); + +#endif diff --git a/src/amiga/makefile b/src/amiga/makefile new file mode 100644 index 0000000..dfaa320 --- /dev/null +++ b/src/amiga/makefile @@ -0,0 +1,107 @@ +# If Kickstart isn't defined, we don't run on AmigaOS +ifndef Kickstart +CROSS_COMPILE = ppc-amigaos- +RM = rm -R +MKDIR = mkdir -p +else +RM = delete all +MKDIR = makedir +endif + +CC = $(CROSS_COMPILE)gcc +AR = $(CROSS_COMPILE)ar +RANLIB = $(CROSS_COMPILE)ranlib +STRIP = $(CROSS_COMPILE)strip + +# ------------------------------------------------------------- + +TARGET = Atari800 +VERSION = 2 +#CFLAGS = -O3 -I$(AHI_INCLUDE) -I. -I.. -Wall -use-dynld -DSUPPORTS_PLATFORM_CONFIGURE -DSUPPORTS_PLATFORM_CONFIGSAVE +CFLAGS = -O3 -I$(AHI_INCLUDE) -I. -I.. -Wall -DSUPPORTS_PLATFORM_CONFIGURE -DSUPPORTS_PLATFORM_CONFIGSAVE +#LIBS = -lm -lz -lpng -lAuto +LIBS = -lm -lauto + +AMIGASRCS=\ + amiga.c \ + gui.c \ + support.c + +EMUSRCS= \ + afile.c \ + antic.c \ + artifact.c \ + atari.c \ + binload.c \ + cartridge.c \ + cassette.c \ + compfile.c \ + cfg.c \ + colours.c \ + colours_external.c \ + colours_pal.c \ + colours_ntsc.c \ + cpu.c \ + devices.c \ + esc.c \ + gtia.c \ + log.c \ + memory.c \ + monitor.c \ + pia.c \ + pokey.c \ + rtime.c \ + sio.c \ + util.c \ + pbi_proto80.c \ + input.c \ + statesav.c \ + ui_basic.c \ + ui.c \ + screen.c \ + cycle_map.c \ + pbi_mio.c \ + pbi_bb.c \ + pbi_scsi.c \ + pokeysnd.c \ + mzpokeysnd.c \ + remez.c \ + sndsave.c \ + pbi_xld.c \ + votrax.c \ + votraxsnd.c \ + xep80.c \ + xep80_fonts.c \ + pbi.c + + +SRCS = $(AMIGASRCS) $(addprefix ../,$(EMUSRCS)) + +# ------------------------------------------------------------- + +OBJS = $(SRCS:%.c=ppc-amigaos-objs/amiga/%.o) +AOBJS = $(ASRCS:%.S=ppc-amigaos-objs/amiga/%.o) + +all: dirs $(TARGET) + +dirs: + -$(MKDIR) ppc-amigaos-objs ppc-amigaos-objs/amiga + +# Rules for building +$(TARGET): $(OBJS) $(AOBJS) + $(CC) $(LINK) -o $@.debug $(OBJS) $(AOBJS) $(LIBS) + $(STRIP) -R.comment -o $@ $@.debug + +ppc-amigaos-objs/amiga/%.o: %.S + $(CC) -Wa,-mregnames $(AFLAGS) -I$/home/sba/amigaos4/include -c $< -o $@ + +ppc-amigaos-objs/amiga/%.o: %.c + $(CC) $(CFLAGS) -c $< -o $@ + +.PHONY: clean +clean: + $(RM) $(TARGET) $(OBJS) ppc-amigaos-objs + +.PHONY: revision +revision: + bumprev $(VERSION) $(TARGET) diff --git a/src/amiga/support.c b/src/amiga/support.c new file mode 100644 index 0000000..d2195dc --- /dev/null +++ b/src/amiga/support.c @@ -0,0 +1,258 @@ +/* + * support.c - user interface support code + * + * Copyright (c) 2000 Sebastian Bauer + * Copyright (c) 2000-2003 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#define __USE_INLINE__ +#define DoSuperMethod IDoSuperMethod +#define DoSuperMethodA IDoSuperMethodA +#define DoMethod IDoMethod +#define DoMethodA IDoMethodA + +#include + +#include +#include + +#include + +#include +#include +#include +#include +#include + +/************************************************************************** + Some general supports +**************************************************************************/ +LONG StrLen( const STRPTR str) +{ + if(str) return (LONG)strlen(str); + return 0; +} + +STRPTR StrCopy( const STRPTR str ) +{ + STRPTR dst; + if( !str ) return NULL; + if( !*str) return NULL; + + dst = (STRPTR)AllocVec(strlen(str)+1,0); + if(dst) strcpy(dst,str); + return dst; +} + +STRPTR GetFullPath( STRPTR drw, STRPTR file) +{ + WORD dl = StrLen(drw); + WORD fl = StrLen( file ); + LONG length = dl + fl + 6; + STRPTR fp = (STRPTR)AllocVec( length+1, 0 ); + + if( fp ) + { + strcpy( fp, drw ); + + if( AddPart( fp, file, length )) return fp; + else FreeVec( fp ); + } + return NULL; +} + +STRPTR AddSuffix(const STRPTR name, const STRPTR suf) +{ + STRPTR str; + if(!strstr(name,suf)) + { + LONG len = StrLen(name)+StrLen(suf)+2; + str = (STRPTR)AllocVec(len,0); + if(str) + { + strcpy(str,name); + strcat(str,suf); + } + } else str = StrCopy(name); + return str; +} + +ULONG GetBestID( ULONG width, ULONG height, ULONG depth ) +{ + struct Screen *defscr; + ULONG displayID; + + if ((defscr = LockPubScreen(NULL))) + { + struct ViewPort *vp; + + vp = &defscr->ViewPort; + + displayID = BestModeID( BIDTAG_Depth,depth, + BIDTAG_NominalWidth, width, + BIDTAG_NominalHeight, height, + BIDTAG_MonitorID, GetVPModeID( vp ) & MONITOR_ID_MASK, + TAG_DONE); + + if (CyberGfxBase) + { + if (IsCyberModeID(displayID)) + { + struct DimensionInfo dims; + + /* Get the normal dimensions of the returned displayID */ + if (GetDisplayInfoData(NULL,&dims,sizeof(dims),DTAG_DIMS,displayID) > 0) + { + ULONG modeWidth = dims.Nominal.MaxX - dims.Nominal.MinX + 1; + ULONG modeHeight = dims.Nominal.MaxY - dims.Nominal.MinY + 1; + + /* If dimensions differ to "much", try to get a better one via cybergfx calls */ + if (modeWidth > width * 4 / 3 || modeHeight > height * 4 / 3) + { + displayID = BestCModeIDTags( + CYBRBIDTG_Depth, depth, + CYBRBIDTG_NominalWidth, width, + CYBRBIDTG_NominalHeight, height, + CYBRBIDTG_MonitorID, GetVPModeID( vp ) & MONITOR_ID_MASK, + TAG_DONE); + } + } + } + } + + UnlockPubScreen( NULL, defscr ); + } else displayID = INVALID_ID; + + if (displayID == INVALID_ID) + { + displayID = BestModeID( BIDTAG_Depth,depth, + BIDTAG_NominalWidth, width, + BIDTAG_NominalHeight, height, + TAG_DONE); + } + + return displayID; +} + +STRPTR GetDisplayName(ULONG displayid) +{ + STATIC struct NameInfo DisplayNameInfo; + STATIC char DisplayNameBuffer[256]; + + LONG i, v; + + i = 0; + v = GetDisplayInfoData(NULL, (UBYTE *) &DisplayNameInfo, sizeof(DisplayNameInfo), + DTAG_NAME, displayid); + + if(v > sizeof(struct QueryHeader)) + { + for(; (i < sizeof(DisplayNameBuffer) - 1) && DisplayNameInfo.Name[i]; i++) + DisplayNameBuffer[i] = DisplayNameInfo.Name[i]; + } + + if(displayid == INVALID_ID) + strcpy(DisplayNameBuffer, "InvalidID"/*GetMessage(MSG_INVALID)*/); + else + { + if(i < sizeof(DisplayNameBuffer) - sizeof(" (0x00000000)")) + { + DisplayNameBuffer[i++] = ' '; + DisplayNameBuffer[i++] = '('; + DisplayNameBuffer[i++] = '0'; + DisplayNameBuffer[i++] = 'x'; + + for(v = 28; (v >= 0) && (!((displayid >> v) & 0xf)); v -= 4); + + if(v < 0) + DisplayNameBuffer[i++] = '0'; + + for(; (v >= 0); v -= 4) + { + if(((displayid >> v) & 0xf) > 9) + DisplayNameBuffer[i++] = ((displayid >> v) & 0xf) + 'a' - 10; + else + DisplayNameBuffer[i++] = ((displayid >> v) & 0xf) + '0'; + } + DisplayNameBuffer[i++] = ')'; + } + + DisplayNameBuffer[i++] = 0; + } + + return DisplayNameBuffer; +} + +APTR FindUserData( struct Menu *menu, APTR userdata) +{ + while(menu) + { + struct MenuItem *mi; + + if(GTMENU_USERDATA( menu ) == userdata) return menu; + + mi = menu->FirstItem; + while(mi) + { + struct MenuItem *smi; + + if(GTMENUITEM_USERDATA( mi ) == userdata) return mi; + + smi = mi->SubItem; + while(smi) + { + if(GTMENUITEM_USERDATA( smi ) == userdata) return smi; + smi = smi->NextItem; + } + mi = mi->NextItem; + } + menu = menu->NextMenu; + } + return NULL; +} + + +/************************************************************************** + ... +**************************************************************************/ +struct Library *OpenLibraryInterface(STRPTR name, int version, void *interface_ptr) +{ + struct Library *lib = OpenLibrary(name,version); + struct Interface *iface; + if (!lib) return NULL; + + iface = GetInterface(lib,"main",1,NULL); + if (!iface) + { + CloseLibrary(lib); + return NULL; + } + *((struct Interface**)interface_ptr) = iface; + return lib; +} + +/************************************************************************** + ... +**************************************************************************/ +void CloseLibraryInterface(struct Library *lib, void *interface) +{ + DropInterface(interface); + CloseLibrary(lib); +} diff --git a/src/amiga/support.h b/src/amiga/support.h new file mode 100644 index 0000000..8682f12 --- /dev/null +++ b/src/amiga/support.h @@ -0,0 +1,41 @@ +#ifndef _SUPPORT_H_ +#define _SUPPORT_H_ + +#define InnerWidth(w) (w->Width - w->BorderLeft - w->BorderRight) +#define InnerHeight(w) (w->Height - w->BorderTop - w->BorderBottom) + +/* Some MUI Support Functions */ +#if 0 +LONG xget(Object *obj,ULONG attribute); +char *getstr(Object *obj); +BOOL getbool(Object *obj); + +Object *MakeLabel(STRPTR str); +Object *MakeLabel1(STRPTR str); +Object *MakeLabel2(STRPTR str); +Object *MakeLLabel(STRPTR str); +Object *MakeLLabel1(STRPTR str); +Object *MakeCheck(BOOL check); +Object *MakeButton(STRPTR str); +Object *MakeCycle(STRPTR *array); +Object *MakeString(STRPTR def, LONG maxlen); +Object *MakeImageButton(ULONG image); +Object *MakeLV(APTR pool); + +ULONG DoSuperNew(struct IClass *cl,Object *obj,ULONG tag1,...); + +#define nnsetstring(obj,s) nnset(obj,MUIA_String_Contents,s) +#endif + +LONG StrLen( const STRPTR str); +STRPTR StrCopy( const STRPTR str ); +STRPTR GetFullPath( STRPTR drw, STRPTR file); +STRPTR AddSuffix(const STRPTR name, const STRPTR suf); +ULONG GetBestID( ULONG width, ULONG height, ULONG depth ); +STRPTR GetDisplayName(ULONG displayid); +APTR FindUserData( struct Menu *menu, APTR userdata); + +struct Library *OpenLibraryInterface(STRPTR name, int version, void *interface_ptr); +void CloseLibraryInterface(struct Library *lib, void *interface); + +#endif /* _SUPPORT_H_ */ diff --git a/src/amiga/unixfunc.c b/src/amiga/unixfunc.c new file mode 100644 index 0000000..13e39f9 --- /dev/null +++ b/src/amiga/unixfunc.c @@ -0,0 +1,129 @@ +/* + * unixfunc.c - only required for the Maxon compiler + * + * Copyright (c) 2000 Sebastian Bauer + * Copyright (c) 2000-2003 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifdef __MAXON__ + +#include +#include +#include + +#include +#include + +int __open(const char *name, int mode,...) +{ + BPTR fh; + + if( mode & O_RDONLY ) + { + fh = Open((STRPTR)name,MODE_OLDFILE); + } else + { + if(mode & O_WRONLY) + { + fh = Open((STRPTR)name,MODE_NEWFILE); + } else fh = Open((STRPTR)name, MODE_OLDFILE); + } + + if(!fh) fh = (BPTR)-1; + + return (int)fh; +} + +int __close(int fh) +{ + if(fh && fh != -1 ) Close((BPTR)fh); + return 0; +} + +int __write(int fh, const void *buffer, unsigned int length) +{ + return Write((BPTR)fh,(APTR)buffer,length); +} + +int __read(int fh, void *buffer, unsigned int length) +{ + int count; + + if (fh == -1) return 0; + + count = Read((BPTR)fh,buffer,length); +/* if(!count) count = - 1;*/ + return count; +} + +int unlink(const char *name) +{ + DeleteFile((STRPTR)name); + return 0; +} + +long lseek(int fh, long rpos, int mode) +{ + long origin = mode; + Seek((BPTR)fh,rpos,origin); + + return Seek((BPTR)fh,0,OFFSET_CURRENT); +} + +char *strdup(const char *s) +{ + char *p = malloc(strlen(s)+1); + if(p) + { + strcpy(p,s); + } + return p; +} + +char *getcwd(char *b, int size) +{ + struct Process *p = (struct Process*)FindTask(NULL); + NameFromLock(p->pr_CurrentDir, b, size); + return b; +} + +int stat() +{ + return -1; +} + +int readdir() +{ + return -1; +} + +int closedir() +{ + return -1; +} + +int opendir() +{ + return -1; +} + + +#endif + diff --git a/src/android/AndroidManifest.xml b/src/android/AndroidManifest.xml new file mode 100644 index 0000000..dc07dc2 --- /dev/null +++ b/src/android/AndroidManifest.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + diff --git a/src/android/build.xml b/src/android/build.xml new file mode 100644 index 0000000..bcb7bab --- /dev/null +++ b/src/android/build.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/android/jni/Android.mk.in b/src/android/jni/Android.mk.in new file mode 100644 index 0000000..5ee157d --- /dev/null +++ b/src/android/jni/Android.mk.in @@ -0,0 +1,47 @@ +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) + +LOCAL_MODULE := atari800 + +A800_CORE_OBJS := \ + afile.o \ + antic.o \ + atari.o \ + binload.o \ + cartridge.o \ + cassette.o \ + compfile.o \ + cfg.o \ + cpu.o \ + crc32.o \ + devices.o \ + emuos.o \ + esc.o \ + gtia.o \ + img_tape.o \ + log.o \ + memory.o \ + monitor.o \ + pbi.o \ + pia.o \ + pokey.o \ + rtime.o \ + sio.o \ + sysrom.o \ + util.o \ + @OBJS@ +A800_CORE_LIBS := @LIBS@ + +ANDROID_SRCS := platform.c \ + sound.c \ + graphics.c \ + jni.c \ + androidinput.c +ANDROID_LIBS := -llog -lGLESv1_CM + +LOCAL_C_INCLUDES := $(LOCAL_PATH)/../.. +LOCAL_SRC_FILES := $(A800_CORE_OBJS:%.o=../../%.c) $(ANDROID_SRCS) +LOCAL_LDLIBS := $(A800_CORE_LIBS) $(ANDROID_LIBS) + +include $(BUILD_SHARED_LIBRARY) diff --git a/src/android/jni/Application.mk b/src/android/jni/Application.mk new file mode 100644 index 0000000..202d187 --- /dev/null +++ b/src/android/jni/Application.mk @@ -0,0 +1 @@ +APP_PLATFORM := android-4 diff --git a/src/android/jni/androidinput.c b/src/android/jni/androidinput.c new file mode 100644 index 0000000..2493567 --- /dev/null +++ b/src/android/jni/androidinput.c @@ -0,0 +1,547 @@ +/* + * androidinput.c - handle touch & keyboard events from android + * + * Copyright (C) 2010 Kostas Nakos + * Copyright (C) 2010 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include +#include + +#include "input.h" +#include "akey.h" +#include "pokey.h" + +#include "graphics.h" +#include "androidinput.h" +#include "keys.inc" + +#define HIT_OPACITY 0.6f +#define POTLIMIT 228 + +#define KBD_MAXKEYS (1 << 4) +#define KBD_MASK (KBD_MAXKEYS - 1) + +struct touchstate +{ + int x; + int y; + int s; +}; +enum +{ + PTRSTL = -1, + PTRJOY = 0, + PTRTRG, + MAXPOINTERS +}; +/* always: pointer 0 is joystick pointer, 1 is fire pointer */ +static struct touchstate prevtc[MAXPOINTERS]; +static int prevconptr; + +int Android_Joyleft = TRUE; +float Android_Splitpct = 0.5f; +int Android_Split; + +int Android_Paddle = FALSE; +SWORD Android_POTX = 0; +SWORD Android_POTY = 0; +int Android_PlanetaryDefense = FALSE; +UBYTE Android_ReversePddle = 0; + +struct joy_overlay_state AndroidInput_JoyOvl; +struct consolekey_overlay_state AndroidInput_ConOvl; + +UWORD Android_PortStatus; +UBYTE Android_TrigStatus; +static int Android_Keyboard[KBD_MAXKEYS]; +static int key_head = 0, key_tail = 0; +static int Android_key_control; +static pthread_mutex_t key_mutex = PTHREAD_MUTEX_INITIALIZER; +static key_last = AKEY_NONE; + +static const int derot_lut[2][4] = +{ + { KEY_RIGHT, KEY_LEFT, KEY_UP, KEY_DOWN }, /* derot left */ + { KEY_LEFT, KEY_RIGHT, KEY_DOWN, KEY_UP } /* derot right */ +}; +UBYTE softjoymap[SOFTJOY_MAXKEYS + SOFTJOY_MAXACTIONS][2] = +{ + { KEY_LEFT, INPUT_STICK_LEFT }, + { KEY_RIGHT, INPUT_STICK_RIGHT }, + { KEY_UP, INPUT_STICK_FORWARD }, + { KEY_DOWN, INPUT_STICK_BACK }, + { '2', 0 }, + { ACTION_NONE, AKEY_NONE }, + { ACTION_NONE, AKEY_NONE }, + { ACTION_NONE, AKEY_NONE } +}; +int Android_SoftjoyEnable = TRUE; +int Android_DerotateKeys = 0; + +int Android_TouchEvent(int x1, int y1, int s1, int x2, int y2, int s2) +{ + int joyptr; /* will point to joystick touch of input set */ + int tmpfire; /* flag: both pointers on fire side */ + int dx, dy, dx2, dy2; + struct touchstate newtc[MAXPOINTERS]; + UBYTE newjoy, newtrig; + struct joy_overlay_state *jovl; + struct consolekey_overlay_state *covl; + int conptr; /* will point to stolen ptr, PTRSTL otherwise */ + int i; + float a, potx, poty; + int ret = 0; + + jovl = &AndroidInput_JoyOvl; + covl = &AndroidInput_ConOvl; + prevtc[PTRJOY].x = jovl->joyarea.l + ((jovl->joyarea.r - jovl->joyarea.l) >> 1); + prevtc[PTRJOY].y = jovl->joyarea.t + ((jovl->joyarea.b - jovl->joyarea.t) >> 1); + + /* establish joy ptr & fire ptr for new input */ + /* note: looks complicated & uses boolean magick but gets rid of a labyrinth of ifs :-) */ + if ((x1 >= Android_Split) ^ (x2 >= Android_Split)) { /* pointers on opposite sides */ + joyptr = (x1 < Android_Split) ^ Android_Joyleft; + } else { /* both pointers either on joystick or on fire side */ + tmpfire = (x1 >= Android_Split) ^ (!Android_Joyleft); /* both pointers on fire side */ + dx = (x1 - prevtc[tmpfire].x); /* figure out which is closer to previous */ + dx2 = (x2 - prevtc[tmpfire].x); + dy = (y1 - prevtc[tmpfire].y); + dy2 = (y2 - prevtc[tmpfire].y); + joyptr = ((dx2*dx2 + dy2*dy2) > (dx*dx + dy*dy)) ^ !tmpfire; + s1 &= joyptr ^ (!tmpfire); /* unpress unrelated touch */ + s2 &= !(joyptr ^ (!tmpfire)); + } + if (joyptr) { + newtc[PTRTRG].x = x1; newtc[PTRTRG].y = y1; newtc[PTRTRG].s = s1; + newtc[PTRJOY].x = x2; newtc[PTRJOY].y = y2; newtc[PTRJOY].s = s2; + } else { + newtc[PTRJOY].x = x1; newtc[PTRJOY].y = y1; newtc[PTRJOY].s = s1; + newtc[PTRTRG].x = x2; newtc[PTRTRG].y = y2; newtc[PTRTRG].s = s2; + } + + if (newtc[PTRJOY].s || newtc[PTRTRG].s) + ret = 1; + + /* console keys */ + conptr = PTRSTL; + covl->hitkey = CONK_NOKEY; + if (covl->ovl_visible >= COVL_READY) { /* first a quick bounding box check */ + if (newtc[PTRJOY].s && + newtc[PTRJOY].x >= covl->bbox.l && + newtc[PTRJOY].x < covl->bbox.r && + newtc[PTRJOY].y >= covl->bbox.t && + newtc[PTRJOY].y < covl->bbox.b) + conptr = PTRJOY; /* implicit: mask fire by joy pointer */ + else if (newtc[PTRTRG].s && + newtc[PTRTRG].x >= covl->bbox.l && + newtc[PTRTRG].x < covl->bbox.r && + newtc[PTRTRG].y >= covl->bbox.t && + newtc[PTRTRG].y < covl->bbox.b) + conptr = PTRTRG; + if (conptr != PTRSTL) { /* if bb is exact on top & bottom => check only horiz/lly */ + dy = covl->keycoo[i + 1] - newtc[conptr].y; + for (i = 0; i < CONK_VERT_MAX; i += 8) { + a = ((float) covl->keycoo[i + 6] - covl->keycoo[i ]) / + ((float) covl->keycoo[i + 1] - covl->keycoo[i + 7]); + dx = covl->keycoo[i] + a * dy; + if (newtc[conptr].x < dx) continue; /* off left edge */ + a = ((float) covl->keycoo[i + 4] - covl->keycoo[i + 2]) / + ((float) covl->keycoo[i + 3] - covl->keycoo[i + 5]); + dx = covl->keycoo[i + 2] + a * dy; + if (newtc[conptr].x > dx) continue; /* off right edge */ + covl->hitkey = i / 8; /* hit inside */ + break; + } + if (covl->hitkey != CONK_NOKEY) { + covl->opacity = COVL_MAX_OPACITY; + covl->statecnt = COVL_HOLD_TIME; + covl->ovl_visible = COVL_READY; + switch (covl->hitkey) { + case CONK_START: + INPUT_key_consol = INPUT_CONSOL_NONE ^ INPUT_CONSOL_START; + break; + case CONK_SELECT: + INPUT_key_consol = INPUT_CONSOL_NONE ^ INPUT_CONSOL_SELECT; + break; + case CONK_OPTION: + INPUT_key_consol = INPUT_CONSOL_NONE ^ INPUT_CONSOL_OPTION; + break; + case CONK_HELP: + Keyboard_Enqueue(AKEY_HELP); + break; + /* RESET is handled at the overlay update */ + } + } else { + conptr = PTRSTL; /* didn't hit - let others handle it */ + } + } + if (prevconptr != PTRSTL && conptr == PTRSTL) { /* unpressed overlay key */ + if (Keyboard_Peek() == AKEY_HELP) + Keyboard_Enqueue(AKEY_NONE); + INPUT_key_consol = INPUT_CONSOL_NONE; + covl->resetcnt = 0; + } + } else if (newtc[PTRJOY].s && newtc[PTRJOY].x > Android_ScreenW - covl->hotlen + && newtc[PTRJOY].y < covl->hotlen) { + covl->ovl_visible = COVL_FADEIN; /* touched overlay hotspot */ + conptr = PTRJOY; + } else if (newtc[PTRTRG].s && newtc[PTRTRG].x > Android_ScreenW - covl->hotlen + && newtc[PTRTRG].y < covl->hotlen) { + covl->ovl_visible = COVL_FADEIN; + conptr = PTRTRG; + } + if (conptr == PTRSTL) + if (newtc[PTRJOY].s && + ( (!prevtc[PTRJOY].s && newtc[PTRJOY].y < covl->hotlen) || /* menu area */ + prevconptr != PTRSTL) && /* still held */ + !(covl->ovl_visible != COVL_HIDDEN && + newtc[PTRJOY].x >= covl->bbox.l - COVL_SHADOW_OFF && /* outside bbox */ + newtc[PTRJOY].y <= covl->bbox.b + COVL_SHADOW_OFF) ) { + conptr = PTRJOY; /* touched menu area */ + ret = 2; + } else if (newtc[PTRTRG].s && + ( (!prevtc[PTRTRG].s && newtc[PTRTRG].y < covl->hotlen) || + prevconptr != PTRSTL) && + !(covl->ovl_visible != COVL_HIDDEN && + newtc[PTRTRG].x >= covl->bbox.l - COVL_SHADOW_OFF && + newtc[PTRTRG].y <= covl->bbox.b + COVL_SHADOW_OFF) ) { + conptr = PTRTRG; + ret = 2; + } + + /* joystick */ + newjoy = INPUT_STICK_CENTRE; + if (newtc[PTRJOY].s && conptr != PTRJOY) { + if (!Android_Paddle) { + dx2 = (jovl->joyarea.r - jovl->joyarea.l) >> 1; + dy2 = (jovl->joyarea.b - jovl->joyarea.t) >> 1; + dx = dx2 - dx2 * jovl->deadarea; + dy = dy2 - dy2 * jovl->deadarea; + dx2 = (jovl->joyarea.r - jovl->joyarea.l) * jovl->gracearea; + } + if (Android_Paddle) { + potx = ((float) (newtc[PTRJOY].x - jovl->joyarea.l)) / + ((float) (jovl->joyarea.r - jovl->joyarea.l)); + poty = (float) newtc[PTRJOY].y / (float) Android_ScreenH; + Android_POTX = POTLIMIT - (UBYTE) (potx * ((float) POTLIMIT) + 0.5f); + Android_POTY = POTLIMIT - (UBYTE) (poty * ((float) POTLIMIT) + 0.5f); + if (Android_ReversePddle & 1) + Android_POTX = POTLIMIT - Android_POTX; + if (Android_ReversePddle & 2) + Android_POTY = POTLIMIT - Android_POTY; + if (Android_POTX < 0) Android_POTX = 0; + if (Android_POTY < 0) Android_POTY = 0; + if (Android_POTX > POTLIMIT) Android_POTX = POTLIMIT; + if (Android_POTY > POTLIMIT) Android_POTY = POTLIMIT; + + jovl->joystick.x = newtc[PTRJOY].x; + jovl->joystick.y = newtc[PTRJOY].y; + jovl->stickopacity = HIT_OPACITY; + if (!jovl->anchor) { + dy = (jovl->joyarea.b - jovl->joyarea.t) >> 1; + if (newtc[PTRJOY].y - dy < 0) newtc[PTRJOY].y -= newtc[PTRJOY].y - dy; + if (newtc[PTRJOY].y + dy > Android_ScreenH) + newtc[PTRJOY].y -= newtc[PTRJOY].y + dy - Android_ScreenH; + jovl->joyarea.t = newtc[PTRJOY].y - dy; + jovl->joyarea.b = newtc[PTRJOY].y + dy; + jovl->areaopacitycur = jovl->areaopacityset; + jovl->areaopacityfrm = 0; + } + } else if ( (newtc[PTRJOY].x >= jovl->joyarea.l - dx2 && + newtc[PTRJOY].x <= jovl->joyarea.r + dx2 && + newtc[PTRJOY].y >= jovl->joyarea.t - dx2 && + newtc[PTRJOY].y <= jovl->joyarea.b + dx2) || + jovl->anchor ) { + + if (newtc[PTRJOY].x <= jovl->joyarea.l + dx) { + newjoy &= INPUT_STICK_LEFT; + } else if (newtc[PTRJOY].x >= jovl->joyarea.r - dx) { + newjoy &= INPUT_STICK_RIGHT; + } + if (newtc[PTRJOY].y <= jovl->joyarea.t + dy) { + newjoy &= INPUT_STICK_FORWARD; + } else if (newtc[PTRJOY].y >= jovl->joyarea.b - dy) { + newjoy &= INPUT_STICK_BACK; + } + + if (!jovl->anchor) { + if (newtc[PTRJOY].x > jovl->joyarea.r) { /* grace area */ + dx = newtc[PTRJOY].x - jovl->joyarea.r; + jovl->joyarea.l += dx; + jovl->joyarea.r += dx; + } else if (newtc[PTRJOY].x < jovl->joyarea.l) { + dx = jovl->joyarea.l - newtc[PTRJOY].x; + jovl->joyarea.r -= dx; + jovl->joyarea.l -= dx; + } + if (newtc[PTRJOY].y > jovl->joyarea.b) { + dy = newtc[PTRJOY].y - jovl->joyarea.b; + jovl->joyarea.t += dy; + jovl->joyarea.b += dy; + } else if (newtc[PTRJOY].y < jovl->joyarea.t) { + dy = jovl->joyarea.t - newtc[PTRJOY].y; + jovl->joyarea.b -= dy; + jovl->joyarea.t -= dy; + } + } + + jovl->joystick.x = newtc[PTRJOY].x; + jovl->joystick.y = newtc[PTRJOY].y; + jovl->stickopacity = HIT_OPACITY; + jovl->areaopacitycur = jovl->areaopacityset; + jovl->areaopacityfrm = 0; + } else { + if (prevtc[PTRJOY].s) { /* drag area along */ + if (newtc[PTRJOY].x > jovl->joyarea.r) { + dx = newtc[PTRJOY].x - jovl->joyarea.r; + jovl->joyarea.l += dx; + jovl->joyarea.r += dx; + newjoy &= INPUT_STICK_RIGHT; + } else if (newtc[PTRJOY].x < jovl->joyarea.l) { + dx = jovl->joyarea.l - newtc[PTRJOY].x; + jovl->joyarea.r -= dx; + jovl->joyarea.l -= dx; + newjoy &= INPUT_STICK_LEFT; + } else if (newtc[PTRJOY].x <= jovl->joyarea.l + dx) { + newjoy &= INPUT_STICK_LEFT; + } else if (newtc[PTRJOY].x >= jovl->joyarea.r - dx) { + newjoy &= INPUT_STICK_RIGHT; + } + if (newtc[PTRJOY].y > jovl->joyarea.b) { + dy = newtc[PTRJOY].y - jovl->joyarea.b; + jovl->joyarea.t += dy; + jovl->joyarea.b += dy; + newjoy &= INPUT_STICK_BACK; + } else if (newtc[PTRJOY].y < jovl->joyarea.t) { + dy = jovl->joyarea.t - newtc[PTRJOY].y; + jovl->joyarea.b -= dy; + jovl->joyarea.t -= dy; + newjoy &= INPUT_STICK_FORWARD; + } else if (newtc[PTRJOY].y <= jovl->joyarea.t + dy) { + newjoy &= INPUT_STICK_FORWARD; + } else if (newtc[PTRJOY].y >= jovl->joyarea.b - dy) { + newjoy &= INPUT_STICK_BACK; + } + + jovl->joystick.x = newtc[PTRJOY].x; + jovl->joystick.y = newtc[PTRJOY].y; + jovl->stickopacity = HIT_OPACITY; + } else { /* recenter area */ + dx = (jovl->joyarea.r - jovl->joyarea.l) >> 1; + dy = (jovl->joyarea.b - jovl->joyarea.t) >> 1; + if (Android_Joyleft) { + if (newtc[PTRJOY].x + dx > Android_Split) + newtc[PTRJOY].x = Android_Split - dx; + } else { + if (newtc[PTRJOY].x - dx < Android_Split) + newtc[PTRJOY].x = Android_Split + dx; + } + if (newtc[PTRJOY].x - dx < 0) newtc[PTRJOY].x -= newtc[PTRJOY].x - dx; + if (newtc[PTRJOY].y - dy < 0) newtc[PTRJOY].y -= newtc[PTRJOY].y - dy; + if (newtc[PTRJOY].y + dy > Android_ScreenH) + newtc[PTRJOY].y -= newtc[PTRJOY].y + dy - Android_ScreenH; + jovl->joyarea.l = newtc[PTRJOY].x - dx; + jovl->joyarea.r = newtc[PTRJOY].x + dx; + jovl->joyarea.t = newtc[PTRJOY].y - dy; + jovl->joyarea.b = newtc[PTRJOY].y + dy; + } + jovl->areaopacitycur = jovl->areaopacityset; + jovl->areaopacityfrm = 0; + } + } + + /* trigger */ + newtrig = 1; + if ( (newtc[PTRTRG].s && conptr != PTRTRG) || /* normal trigger */ + (newtc[PTRJOY].s && conptr != PTRJOY && Android_PlanetaryDefense) ) { + newtrig = 0; + jovl->fire.x = newtc[PTRTRG].x; + jovl->fire.y = newtc[PTRTRG].y; + jovl->fireopacity = HIT_OPACITY; + } + + /* thread unsafe => "no" problem */ + if (!Android_Paddle){ + Android_PortStatus = 0xFFF0 | newjoy; + Android_TrigStatus = 0xE | newtrig; + } else { + POKEY_POT_input[INPUT_mouse_port << 1] = Android_POTX; + POKEY_POT_input[(INPUT_mouse_port << 1) + 1] = Android_POTY; + INPUT_mouse_buttons = !newtrig; + } + + memcpy(prevtc, newtc, sizeof(struct touchstate) * MAXPOINTERS); + prevconptr = conptr; + + return ret; +} + +void Android_KeyEvent(int k, int s) +{ + int i, shft; + + if (Android_SoftjoyEnable) { + for (i = 0; i < 4; i++) + if (softjoymap[i][0] == k) { + if (s) + Android_PortStatus &= softjoymap[i][1]; + else + Android_PortStatus |= ~softjoymap[i][1]; + return; + } + if (softjoymap[SOFTJOY_FIRE][0] == k) { + Android_TrigStatus = Android_TrigStatus & (~(s != 0)) | (s == 0); + return; + } + for (i = SOFTJOY_ACTIONBASE; i < SOFTJOY_MAXKEYS + SOFTJOY_MAXACTIONS; i++) + if (softjoymap[i][0] == k && softjoymap[i][1] != AKEY_NONE) { + k = softjoymap[i][1]; + break; + } + } + + if (Android_DerotateKeys && k <= KEY_UP && k >= KEY_RIGHT) + k = derot_lut[Android_DerotateKeys - 1][KEY_UP - k]; + + switch (k) { + case KEY_SHIFT: + INPUT_key_shift = (s) ? AKEY_SHFT : 0; + break; + case KEY_CONTROL: + Android_key_control = (s) ? AKEY_CTRL : 0; + break; + case KEY_FIRE: + Android_TrigStatus = Android_TrigStatus & (~(s != 0)) | (s == 0); + break; + default: + if (k >= STATIC_MAXKEYS) + Log_print("Unmappable key %d", k); + else { + if (k == '+' || k == '<' || k == '>' || k == '*') + shft = 0; + else + shft == INPUT_key_shift; + Keyboard_Enqueue( (s) ? (skeyxlat[k] | Android_key_control | shft) : AKEY_NONE ); + } + } +} + +void Input_Initialize(void) +{ + int i; + + memset(prevtc, 0, 2 * sizeof(struct touchstate)); + prevconptr = PTRSTL; + + memset(&AndroidInput_JoyOvl, 0, sizeof(struct joy_overlay_state)); + AndroidInput_JoyOvl.ovl_visible = 1; + AndroidInput_JoyOvl.areaopacitycur = AndroidInput_JoyOvl.areaopacityset = 0.25f; + AndroidInput_JoyOvl.deadarea = 0.3f; + AndroidInput_JoyOvl.gracearea = 0.3f; + AndroidInput_JoyOvl.joyarea.t = AndroidInput_JoyOvl.joyarea.l = 10; + AndroidInput_JoyOvl.joyarea.b = AndroidInput_JoyOvl.joyarea.r = 74; + AndroidInput_JoyOvl.anchor = 0; + + memset(&AndroidInput_ConOvl, 0, sizeof(struct consolekey_overlay_state)); + AndroidInput_ConOvl.hitkey = CONK_NOKEY; + AndroidInput_ConOvl.opacity = COVL_MAX_OPACITY; + AndroidInput_ConOvl.ovl_visible = COVL_READY; + AndroidInput_ConOvl.statecnt = COVL_HOLD_TIME >> 1; + + Android_PortStatus = 0xFFFF; + Android_TrigStatus = 0xF; + + for (i = 0; i < KBD_MAXKEYS; Android_Keyboard[i] = AKEY_NONE, i++); + INPUT_key_consol = INPUT_CONSOL_NONE; + INPUT_key_shift = FALSE; + Android_key_control = 0; +} + +void Joy_Reposition(void) +{ + int dx = 0, dy = 0; + + if (Android_ScreenW == 0) return; /* we're going to get called again @ initgraphics() */ + if (Android_Joyleft) { + if (AndroidInput_JoyOvl.joyarea.r > Android_Split) + dx = -(AndroidInput_JoyOvl.joyarea.r - Android_Split); + } else { + if (AndroidInput_JoyOvl.joyarea.l < Android_Split) + dx = Android_Split - AndroidInput_JoyOvl.joyarea.l; + } + if (AndroidInput_JoyOvl.joyarea.l < 0) + dx = -AndroidInput_JoyOvl.joyarea.l; + else if (AndroidInput_JoyOvl.joyarea.r > Android_ScreenW) + dx = -(AndroidInput_JoyOvl.joyarea.r - Android_ScreenW); + if (AndroidInput_JoyOvl.joyarea.t < 0) + dy = -AndroidInput_JoyOvl.joyarea.t; + else if (AndroidInput_JoyOvl.joyarea.b > Android_ScreenH) + dy = -(AndroidInput_JoyOvl.joyarea.b - Android_ScreenH); + + AndroidInput_JoyOvl.joyarea.l += dx; + AndroidInput_JoyOvl.joyarea.r += dx; + AndroidInput_JoyOvl.joyarea.t += dy; + AndroidInput_JoyOvl.joyarea.b += dy; +} + +void Android_SplitCalc(void) +{ + if (Android_Joyleft) + Android_Split = Android_Splitpct * Android_ScreenW; + else + Android_Split = (1.0f - Android_Splitpct) * Android_ScreenW; +} + +void Keyboard_Enqueue(int key) +{ + pthread_mutex_lock(&key_mutex); + + if ((key_head + 1) & KBD_MASK == key_tail) + key_head = key_tail; /* on overflow, discard previous keys */ + Android_Keyboard[key_head++] = key; + key_head &= KBD_MASK; + + pthread_mutex_unlock(&key_mutex); +} + +int Keyboard_Dequeue(void) +{ + pthread_mutex_lock(&key_mutex); + + if (key_head != key_tail) { + key_last = Android_Keyboard[key_tail++]; + key_tail &= KBD_MASK; + } + + pthread_mutex_unlock(&key_mutex); + + return key_last; +} + +int Keyboard_Peek(void) +{ + int tmp_key; + + tmp_key = key_last; + if (key_head != key_tail) + tmp_key = Android_Keyboard[key_tail]; + return tmp_key; +} diff --git a/src/android/jni/androidinput.h b/src/android/jni/androidinput.h new file mode 100644 index 0000000..fd2e7b8 --- /dev/null +++ b/src/android/jni/androidinput.h @@ -0,0 +1,111 @@ +#include "atari.h" + +struct RECT +{ + int l; + int t; + union { + int r; + int w; + }; + union { + int b; + int h; + }; +}; +struct POINT +{ + int x; + int y; +}; +struct joy_overlay_state +{ + int ovl_visible; + + struct RECT joyarea; + float areaopacitycur; + float areaopacityset; + int areaopacityfrm; + int anchor; + float deadarea; + float gracearea; + + struct POINT joystick; + float stickopacity; + + struct POINT fire; + float fireopacity; + int firewid; +}; + +enum con_vst { + COVL_HIDDEN = 0, + COVL_FADEIN, + COVL_READY, + COVL_FADEOUT +}; +enum con_key { + CONK_NOKEY = -1, + CONK_HELP = 0, + CONK_START, + CONK_SELECT, + CONK_OPTION, + CONK_RESET +}; +struct consolekey_overlay_state +{ + enum con_vst ovl_visible; + + UWORD *keycoo; + struct RECT bbox; + float opacity; + enum con_key hitkey; + int statecnt; + int resetcnt; + int hotlen; + + #define COVL_MAX_OPACITY 0.5f + #define COVL_HOLD_TIME 150 + + #define RESET_SOFT 30 + #define RESET_HARD 60 +}; + +extern struct joy_overlay_state AndroidInput_JoyOvl; +extern struct consolekey_overlay_state AndroidInput_ConOvl; + +extern UWORD Android_PortStatus; +extern UBYTE Android_TrigStatus; + +enum +{ + SOFTJOY_LEFT = 0, + SOFTJOY_RIGHT, + SOFTJOY_UP, + SOFTJOY_DOWN, + SOFTJOY_FIRE, + SOFTJOY_MAXKEYS +}; +#define SOFTJOY_MAXACTIONS 3 +#define SOFTJOY_ACTIONBASE SOFTJOY_MAXKEYS +#define ACTION_NONE 0xFF +extern UBYTE softjoymap[SOFTJOY_MAXKEYS + SOFTJOY_MAXACTIONS][2]; + +extern int Android_SoftjoyEnable; +extern int Android_Joyleft; +extern float Android_Splitpct; +extern int Android_Split; +extern int Android_DerotateKeys; +extern int Android_Paddle; +extern int Android_PlanetaryDefense; +extern SWORD Android_POTX; +extern SWORD Android_POTY; +extern UBYTE Android_ReversePddle; + +int Android_TouchEvent(int x1, int y1, int s1, int x2, int y2, int s2); +void Android_KeyEvent(int k, int s); +void Input_Initialize(void); +void Keyboard_Enqueue(int key); +int Keyboard_Dequeue(void); +int Keyboard_Peek(void); +void Android_SplitCalc(void); diff --git a/src/android/jni/graphics.c b/src/android/jni/graphics.c new file mode 100644 index 0000000..bdcee3a --- /dev/null +++ b/src/android/jni/graphics.c @@ -0,0 +1,480 @@ +/* + * graphics.c - android drawing + * + * Copyright (C) 2010 Kostas Nakos + * Copyright (C) 2010 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include +#include +#include +#include + +#include "atari.h" +#include "screen.h" +#include "colours.h" +#include "akey.h" +#include "cpu.h" + +#include "androidinput.h" +#include "graphics.h" + +#define TEXTURE_WIDTH 512 +#define TEXTURE_HEIGHT 256 + +#define OPACITY_CUTOFF 0.05f +#define OPACITY_STEP 0.02f +#define OPACITY_FRMSTR 75 + +#define BORDER_PCT 0.05f + +int Android_ScreenW = 0; +int Android_ScreenH = 0; +int Android_Aspect; +int Android_CropScreen[] = {0, SCREEN_HEIGHT, SCANLINE_LEN, -SCREEN_HEIGHT}; +static struct RECT screenrect; +static int screenclear; +int Android_Bilinear; +float Android_Joyscale = 0.15f; + +extern int *ovl_texpix; +extern int ovl_texw; +extern int ovl_texh; + +/* graphics conversion */ +static UWORD *palette = NULL; +static UWORD *hicolor_screen = NULL; + +/* standard gl textures */ +enum { + TEX_SCREEN = 0, + TEX_OVL, + TEX_MAXNAMES +}; +static GLuint texture[TEX_MAXNAMES]; +static UWORD conkey_vrt[CONK_VERT_MAX]; +static int conkey_lbl[CONK_VERT_MAX >> 2]; +static UWORD conkey_shadow[2 * 4]; + +void Android_PaletteUpdate(void) +{ + int i; + + if (!palette) { + if ( !(palette = malloc(256 * sizeof(UWORD))) ) { + Log_print("Cannot allocate memory for palette conversion."); + return; + } + } + memset(palette, 0, 256 * sizeof(UWORD)); + + for (i = 0; i < 256; i++) + palette[i] = ( (Colours_GetR(i) & 0xf8) << 8 ) | + ( (Colours_GetG(i) & 0xfc) << 3 ) | + ( (Colours_GetB(i) & 0xf8) >> 3 ); + /* force full redraw */ + Screen_EntireDirty(); +} + +int Android_InitGraphics(void) +{ + const UWORD poly[] = { 0,16, 24,16, 32,0, 8,0 }; + int i, tmp, w, h; + float tmp2, tmp3; + struct RECT *r; + + /* Allocate stuff */ + if (!hicolor_screen) { + if ( !(hicolor_screen = malloc(TEXTURE_WIDTH * TEXTURE_HEIGHT * sizeof(UWORD))) ) { + Log_print("Cannot allocate memory for hicolor screen."); + return FALSE; + } + } + memset(hicolor_screen, 0, TEXTURE_WIDTH * TEXTURE_HEIGHT * sizeof(UWORD)); + + /* Setup GL */ + glEnable(GL_TEXTURE_2D); + glDisable(GL_DEPTH_TEST); + glGenTextures(TEX_MAXNAMES, texture); + glPixelStorei(GL_PACK_ALIGNMENT, 8); + + /* overlays texture */ + glBindTexture(GL_TEXTURE_2D, texture[TEX_OVL]); + glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, ovl_texw, ovl_texh, 0, GL_RGBA, + GL_UNSIGNED_BYTE, ovl_texpix); + + /* playfield texture */ + glBindTexture(GL_TEXTURE_2D, texture[TEX_SCREEN]); + glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, + Android_Bilinear ? GL_LINEAR : GL_NEAREST); + glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, + Android_Bilinear ? GL_LINEAR : GL_NEAREST); + glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, Android_CropScreen); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, TEXTURE_WIDTH, TEXTURE_HEIGHT, 0, GL_RGB, + GL_UNSIGNED_SHORT_5_6_5, hicolor_screen); + + /* Setup view for console key polygons */ + glLoadIdentity(); + glOrthof(0, Android_ScreenW, Android_ScreenH, 0, 0, 1); + glEnableClientState(GL_VERTEX_ARRAY); + + glClear(GL_COLOR_BUFFER_BIT); + /* Finsh GL init with an error check */ + if (glGetError() != GL_NO_ERROR) { + Log_print("Cannot initialize OpenGL"); + return FALSE; + } + + /* Console keys' polygons */ + tmp2 = ((float) (Android_ScreenW >> 1)) / ((float) 4.5f * poly[4]); + tmp3 = ((float) Android_ScreenH) / ((float) 14 * poly[1]); + if (tmp2 > tmp3) + tmp2 = tmp3; + if (tmp2 < 2.0f) + tmp2 = 2.0f; + for (i = 0; i < CONK_VERT_MAX; i += 2) { + /* generate & scale */ + conkey_vrt[i ] = poly[i % 8] * tmp2 + + ((i > 7) ? (conkey_vrt[(i / 8 - 1) * 8 + 2] + 4) : 0); + conkey_vrt[i + 1] = poly[(i + 1) % 8] * tmp2; + } + tmp = Android_ScreenW - conkey_vrt[CONK_VERT_MAX - 4]; + for (i = 0; i < CONK_VERT_MAX; i += 2) { + /* translate */ + conkey_vrt[i ] += tmp; + conkey_vrt[i + 1] += 4; + } + for (i = 0; i < CONK_VERT_MAX; i += 8) { + conkey_lbl[i >> 2] = conkey_vrt[i] + 6; + conkey_lbl[(i >> 2) + 1] = Android_ScreenH - (conkey_vrt[i + 1] - 1); + } + AndroidInput_ConOvl.keycoo = conkey_vrt; + AndroidInput_ConOvl.bbox.l = conkey_vrt[0]; + AndroidInput_ConOvl.bbox.b = conkey_vrt[1]; + AndroidInput_ConOvl.bbox.r = conkey_vrt[CONK_VERT_MAX - 4]; + AndroidInput_ConOvl.bbox.t = conkey_vrt[CONK_VERT_MAX - 3]; + AndroidInput_ConOvl.hotlen = 0.1f * + (Android_ScreenW < Android_ScreenH ? Android_ScreenW : Android_ScreenH); + r = &(AndroidInput_ConOvl.bbox); + conkey_shadow[0] = r->l - COVL_SHADOW_OFF; + conkey_shadow[1] = r->b + COVL_SHADOW_OFF; + conkey_shadow[2] = r->r; + conkey_shadow[3] = r->b + COVL_SHADOW_OFF; + conkey_shadow[4] = r->r; + conkey_shadow[5] = r->t - COVL_SHADOW_OFF; + conkey_shadow[6] = r->l - COVL_SHADOW_OFF; + conkey_shadow[7] = r->t - COVL_SHADOW_OFF; + + /* Scale joystick overlays */ + Joyovl_Scale(); + Joy_Reposition(); + + /* Aspect correct scaling */ + memset(&screenrect, 0, sizeof(struct RECT)); + if ( ((Android_ScreenW > Android_ScreenH) + 1) & Android_Aspect) { + w = Android_CropScreen[2]; + h = -Android_CropScreen[3]; + /* fit horizontally */ + tmp2 = ((float) Android_ScreenW) / ((float) w); + screenrect.h = tmp2 * h; + if (screenrect.h > Android_ScreenH) { + /* fit vertically */ + tmp2 = ((float) Android_ScreenH) / ((float) h); + screenrect.h = Android_ScreenH; + } + screenrect.w = tmp2 * w; + /* center */ + tmp = (Android_ScreenW - screenrect.r + 1) / 2; + screenrect.l += tmp; + h = Android_ScreenH; + if (Android_ScreenH > Android_ScreenW) + h >>= 1; /* assume keyboard takes up half the height in portrait */ + tmp = (h - screenrect.b + 1) / 2; + if (tmp < 0) + tmp = 0; + tmp = (Android_ScreenH - h) + tmp; + screenrect.t += tmp; + screenclear = TRUE; + } else { + screenrect.t = screenrect.l = 0; + screenrect.w = Android_ScreenW; + screenrect.h = Android_ScreenH; + screenclear = FALSE; + } + + /* Initialize palette */ + Android_PaletteUpdate(); + + return TRUE; +} + +void Joyovl_Scale(void) +{ + int tmp; + + tmp = ( (Android_ScreenW > Android_ScreenH) ? + Android_ScreenW : Android_ScreenH ) * Android_Joyscale; + if (!Android_Paddle) { + AndroidInput_JoyOvl.joyarea.r = AndroidInput_JoyOvl.joyarea.l + tmp; + AndroidInput_JoyOvl.joyarea.b = AndroidInput_JoyOvl.joyarea.t + tmp; + } else { + if (!Android_PlanetaryDefense) { + AndroidInput_JoyOvl.joyarea.l = Android_Joyleft ? BORDER_PCT * Android_ScreenW : Android_Split; + AndroidInput_JoyOvl.joyarea.r = Android_Joyleft ? Android_Split : (1.0f - BORDER_PCT) * Android_ScreenW; + AndroidInput_JoyOvl.joyarea.b = AndroidInput_JoyOvl.joyarea.t + 8 + (tmp >> 3); + } else { + AndroidInput_JoyOvl.joyarea.l = AndroidInput_JoyOvl.joyarea.t = 0; + AndroidInput_JoyOvl.joyarea.r = Android_ScreenW; + AndroidInput_JoyOvl.joyarea.b = Android_ScreenH; + } + } + AndroidInput_JoyOvl.firewid = tmp >> 3; +} + +void Android_ConvertScreen(void) +{ + int x, y; + UBYTE *src, *src_line; + UWORD *dst, *dst_line; +#ifdef DIRTYRECT + UBYTE *dirty, *dirty_line; +#endif + +#ifdef DIRTYRECT + dirty_line = Screen_dirty + SCANLINE_START / 8; +#endif + src_line = ((UBYTE *) Screen_atari) + SCANLINE_START; + dst_line = hicolor_screen; + + for (y = 0; y < SCREEN_HEIGHT; y++) { +#ifdef DIRTYRECT + dirty = dirty_line; +#else + src = src_line; + dst = dst_line; +#endif + for (x = 0; x < SCANLINE_LEN; x += 8) { +#ifdef DIRTYRECT + if (*dirty) { + src = src_line + x; + dst = dst_line + x; + do { +#endif + *dst++ = palette[*src++]; *dst++ = palette[*src++]; + *dst++ = palette[*src++]; *dst++ = palette[*src++]; + *dst++ = palette[*src++]; *dst++ = palette[*src++]; + *dst++ = palette[*src++]; *dst++ = palette[*src++]; +#ifdef DIRTYRECT + *dirty++ = 0; + x += 8; + } while (*dirty && x < SCANLINE_LEN); + } + dirty++; +#endif + } +#ifdef DIRTYRECT + dirty_line += SCREEN_WIDTH / 8; +#endif + src_line += SCREEN_WIDTH; + dst_line += SCANLINE_LEN; + } +} + +void Android_Render(void) +{ + const static int crop_joy[] = {0, 0, 64, 64}; + const static int crop_fire[] = {65, 0, 16, 15}; + const static int crop_lbl[][4] = { {65, 64, 40, -9}, + {65, 24, 40, -9}, + {65, 34, 40, -9}, + {65, 44, 40, -9}, + {65, 54, 40, -9} }; + const static int crop_all[] = {0, 64, 128, -64}; + const struct RECT *r; + const struct POINT *p; + int i; + + if (screenclear) + glClear(GL_COLOR_BUFFER_BIT); + + /* --------------------- playfield --------------------- */ + glBindTexture(GL_TEXTURE_2D, texture[TEX_SCREEN]); + glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, SCANLINE_LEN, SCREEN_HEIGHT, GL_RGB, + GL_UNSIGNED_SHORT_5_6_5, hicolor_screen); + r = &screenrect; + glDrawTexiOES(r->l, r->t, 0, r->w, r->h); + if (glGetError() != GL_NO_ERROR) Log_print("OpenGL error at playfield"); + + /* --------------------- overlays --------------------- */ + glEnable(GL_BLEND); /* enable blending */ + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND); + glBindTexture(GL_TEXTURE_2D, texture[TEX_OVL]); + + if (!AndroidInput_JoyOvl.ovl_visible) goto ck; /*!*/ + + /* joystick area */ + glColor4f(1.0f, 1.0f, 1.0f, AndroidInput_JoyOvl.areaopacitycur); + glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop_joy); + r = &AndroidInput_JoyOvl.joyarea; + glDrawTexiOES(r->l, Android_ScreenH - r->b, 0, r->r - r->l, r->b - r->t); + if (glGetError() != GL_NO_ERROR) Log_print("OpenGL error at joy area"); + + /* stick */ + if (AndroidInput_JoyOvl.stickopacity >= OPACITY_CUTOFF) { + glColor4f(1.0f, 1.0f, 1.0f, AndroidInput_JoyOvl.stickopacity); + glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop_fire); + p = &AndroidInput_JoyOvl.joystick; + i = AndroidInput_JoyOvl.firewid; + glDrawTexiOES(p->x - i, Android_ScreenH - (p->y + i), 0, i << 1, i << 1); + if (glGetError() != GL_NO_ERROR) Log_print("OpenGL error at stick"); + } + + /* fire */ + if (AndroidInput_JoyOvl.fireopacity >= OPACITY_CUTOFF) { + glColor4f(1.0f, 1.0f, 1.0f, AndroidInput_JoyOvl.fireopacity); + glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop_fire); + p = &AndroidInput_JoyOvl.fire; + i = AndroidInput_JoyOvl.firewid; + glDrawTexiOES(p->x - i, Android_ScreenH - (p->y + i), 0, i << 1, i << 1); + if (glGetError() != GL_NO_ERROR) Log_print("OpenGL error at fire"); + } +/* glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop_all); + glDrawTexiOES(0, 0, 0, 128, 64); +*/ + + /* console keys */ +ck: if (AndroidInput_ConOvl.ovl_visible) { + glDisable(GL_TEXTURE_2D); /* disable texturing */ + + glColor4f(0.0f, 0.0f, 0.0f, AndroidInput_ConOvl.opacity * 0.7); + glVertexPointer(2, GL_SHORT, 0, conkey_shadow); + glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + + glColor4f(0.5f, 0.9f, 1.0f, AndroidInput_ConOvl.opacity); + glVertexPointer(2, GL_SHORT, 0, conkey_vrt); + for (i = 0; i < (CONK_VERT_MAX >> 1); i += 4) + glDrawArrays(GL_LINE_LOOP, i, 4); + if (AndroidInput_ConOvl.hitkey >= 0) { + glColor4f(0.34f, 0.67f, 1.0f, AndroidInput_ConOvl.opacity); + glDrawArrays(GL_TRIANGLE_FAN, AndroidInput_ConOvl.hitkey << 2, 4); + } + glEnable(GL_TEXTURE_2D); /* enable texturing */ + + glColor4f(1.0f, 1.0f, 1.0f, AndroidInput_ConOvl.opacity); + for (i = 0; i < CONK_VERT_MAX >> 2; i += 2) { + glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop_lbl[i >> 1]); + glDrawTexiOES(conkey_lbl[i], conkey_lbl[i + 1], 0, 40, 9); + } + if (glGetError() != GL_NO_ERROR) Log_print("OpenGL error at console overlay"); + } + + glDisable(GL_BLEND); /* disable blending */ +} + +void Update_Overlays(void) +{ + struct joy_overlay_state *s; + struct consolekey_overlay_state *c; + + s = &AndroidInput_JoyOvl; + c = &AndroidInput_ConOvl; + + /* joy et co. */ + if (s->fireopacity > OPACITY_CUTOFF) + s->fireopacity -= 0.05f; + else + s->fireopacity = 0.0f; + if (s->stickopacity > OPACITY_CUTOFF) { + s->stickopacity -= 0.05f; + s->areaopacityfrm = 0; + s->areaopacitycur = s->areaopacityset; + } else { + s->stickopacity = 0.0f; + s->areaopacityfrm++; + if (s->areaopacityfrm > OPACITY_FRMSTR) { + if (s->areaopacitycur > OPACITY_CUTOFF) + s->areaopacitycur -= OPACITY_STEP; + else { + s->areaopacitycur = OPACITY_CUTOFF; + s->areaopacityfrm--; + } + } + } + + /* console keys */ + switch (c->ovl_visible) { + case COVL_READY: + if (c->hitkey == CONK_NOKEY) + if (!c->statecnt--) + c->ovl_visible = COVL_FADEOUT; + break; + case COVL_FADEOUT: + if (c->opacity > OPACITY_CUTOFF) + c->opacity -= 2 * OPACITY_STEP; + else { + c->ovl_visible = COVL_HIDDEN; + c->opacity = 0.0f; + } + break; + case COVL_FADEIN: + if (c->opacity < COVL_MAX_OPACITY) + c->opacity += 4 * OPACITY_STEP; + else { + c->ovl_visible = COVL_READY; + c->opacity = COVL_MAX_OPACITY; + c->statecnt = COVL_HOLD_TIME; + } + break; + } + if (c->hitkey == CONK_RESET) { + if (c->resetcnt >= RESET_HARD) { + Atari800_Coldstart(); + } else if (c->resetcnt >= RESET_SOFT) { + Atari800_Warmstart(); + CPU_cim_encountered = FALSE; + } + c->resetcnt++; + } else { + c->resetcnt = 0; + } +} + +void Android_ExitGraphics(void) +{ + if (hicolor_screen) + free(hicolor_screen); + hicolor_screen = NULL; + + if (palette) + free(palette); + palette = NULL; + + glDeleteTextures(TEX_MAXNAMES, texture); +} diff --git a/src/android/jni/graphics.h b/src/android/jni/graphics.h new file mode 100644 index 0000000..3540f22 --- /dev/null +++ b/src/android/jni/graphics.h @@ -0,0 +1,25 @@ +#define CONK_VERT_MAX (2 * 4 * 5) +#define COVL_SHADOW_OFF 10 + +#define SCREEN_WIDTH 384 +#define SCREEN_HEIGHT 240 +#define DEAD_WIDTH 48 +#define SCANLINE_START (DEAD_WIDTH / 2) +#define SCANLINE_END (SCREEN_WIDTH - DEAD_WIDTH / 2) +#define SCANLINE_LEN (SCREEN_WIDTH - DEAD_WIDTH) + +extern int Android_ScreenW; +extern int Android_ScreenH; +extern int Android_Aspect; +extern int Android_Bilinear; +extern int Android_CropScreen[]; +extern float Android_Joyscale; + +int Android_InitGraphics(void); +void Android_ExitGraphics(void); + +void Android_ConvertScreen(void); +void Android_PaletteUpdate(void); +void Android_Render(void); +void Update_Overlays(void); +void Joyovl_Scale(void); diff --git a/src/android/jni/jni.c b/src/android/jni/jni.c new file mode 100644 index 0000000..8a7a6e4 --- /dev/null +++ b/src/android/jni/jni.c @@ -0,0 +1,658 @@ +/* + * jni.c - native functions exported to java + * + * Copyright (C) 2010 Kostas Nakos + * Copyright (C) 2010 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include +#include +#include +#include + +#include "log.h" +#include "atari.h" +#include "input.h" +#include "afile.h" +#include "screen.h" +#include "cpu.h" +#include "antic.h" +#include "../../memory.h" /* override system header */ +#include "sio.h" +#include "sysrom.h" +#include "akey.h" +#include "devices.h" +#include "cartridge.h" + +#include "graphics.h" +#include "androidinput.h" + +/* exports/imports */ +int *ovl_texpix; +int ovl_texw; +int ovl_texh; +extern void SoundThread_Update(void *buf, int offs, int len); +extern void Android_SoundInit(int rate, int bit16, int hq); + +struct audiothread { + UBYTE *sndbuf; + jbyteArray sndarray; +}; +static pthread_key_t audiothread_data; + +static char devb_url[512]; + +static void JNICALL NativeGetOverlays(JNIEnv *env, jobject this) +{ + jclass cls; + jfieldID fid; + jintArray arr; + jboolean cp; + + cls = (*env)->GetObjectClass(env, this); + + fid = (*env)->GetFieldID(env, cls, "OVL_TEXW", "I"); + ovl_texw = (*env)->GetIntField(env, this, fid); + + fid = (*env)->GetFieldID(env, cls, "OVL_TEXH", "I"); + ovl_texh = (*env)->GetIntField(env, this, fid); + + ovl_texpix = malloc(ovl_texw * ovl_texh * sizeof(int)); + if (ovl_texpix == NULL) Log_print("Cannot allocate memory for overlays"); + + fid = (*env)->GetFieldID(env, cls, "_pix", "[I"); + arr = (*env)->GetObjectField(env, this, fid); + (*env)->GetIntArrayRegion(env, arr, 0, ovl_texw * ovl_texh, ovl_texpix); + + Log_print("Overlays texture initialized: %dx%d", ovl_texw, ovl_texh); +} + +static void JNICALL NativeResize(JNIEnv *env, jobject this, jint w, jint h) +{ + Log_print("Screen resize: %dx%d", w, h); + Android_ScreenW = w; + Android_ScreenH = h; + Android_SplitCalc(); + Android_InitGraphics(); +} + +static void JNICALL NativeClearDevB(JNIEnv *env, jobject this) +{ + dev_b_status.ready = FALSE; + memset(devb_url, 0, sizeof(devb_url)); +} + +static jstring JNICALL NativeInit(JNIEnv *env, jobject this) +{ + int ac = 1; + char av = '\0'; + char *avp = &av; + + pthread_key_create(&audiothread_data, NULL); + pthread_setspecific(audiothread_data, NULL); + + NativeClearDevB(env, this); + + Atari800_Initialise(&ac, &avp); + + return (*env)->NewStringUTF(env, Atari800_TITLE); +} + +static jobjectArray JNICALL NativeGetDrvFnames(JNIEnv *env, jobject this) +{ + jobjectArray arr; + int i; + char tmp[FILENAME_MAX + 3], fname[FILENAME_MAX]; + jstring str; + + arr = (*env)->NewObjectArray(env, 4, (*env)->FindClass(env, "java/lang/String"), NULL); + for (i = 0; i < 4; i++) { + Util_splitpath(SIO_filename[i], NULL, fname); + sprintf(tmp, "D%d:%s", i + 1, fname); + str = (*env)->NewStringUTF(env, tmp); + (*env)->SetObjectArrayElement(env, arr, i, str); + (*env)->DeleteLocalRef(env, str); + } + + return arr; +} + +static void JNICALL NativeUnmountAll(JNIEnv *env, jobject this) +{ + int i; + + for (i = 1; i <= 4; i++) + SIO_DisableDrive(i); +} + +static jboolean JNICALL NativeIsDisk(JNIEnv *env, jobject this, jstring img) +{ + const jbyte *img_utf = NULL; + int type; + + img_utf = (*env)->GetStringUTFChars(env, img, NULL); + type = AFILE_DetectFileType(img_utf); + (*env)->ReleaseStringUTFChars(env, img, img_utf); + switch (type) { + case AFILE_ATR: + case AFILE_ATX: + case AFILE_XFD: + case AFILE_ATR_GZ: + case AFILE_XFD_GZ: + case AFILE_DCM: + case AFILE_PRO: + return JNI_TRUE; + default: + return JNI_FALSE; + } +} + +static jboolean JNICALL NativeSaveState(JNIEnv *env, jobject this, jstring fname) +{ + const jbyte *fname_utf = NULL; + int ret; + + fname_utf = (*env)->GetStringUTFChars(env, fname, NULL); + ret = StateSav_SaveAtariState(fname_utf, "wb", TRUE); + Log_print("Saved state %s with return %d", fname_utf, ret); + (*env)->ReleaseStringUTFChars(env, fname, fname_utf); + return ret; +} + +static jint JNICALL NativeRunAtariProgram(JNIEnv *env, jobject this, + jstring img, jint drv, jint reboot) +{ + static char const * const cart_descriptions[CARTRIDGE_LAST_SUPPORTED + 1] = { + NULL, + CARTRIDGE_STD_8_DESC, + CARTRIDGE_STD_16_DESC, + CARTRIDGE_OSS_034M_16_DESC, + CARTRIDGE_5200_32_DESC, + CARTRIDGE_DB_32_DESC, + CARTRIDGE_5200_EE_16_DESC, + CARTRIDGE_5200_40_DESC, + CARTRIDGE_WILL_64_DESC, + CARTRIDGE_EXP_64_DESC, + CARTRIDGE_DIAMOND_64_DESC, + CARTRIDGE_SDX_64_DESC, + CARTRIDGE_XEGS_32_DESC, + CARTRIDGE_XEGS_07_64_DESC, + CARTRIDGE_XEGS_128_DESC, + CARTRIDGE_OSS_M091_16_DESC, + CARTRIDGE_5200_NS_16_DESC, + CARTRIDGE_ATRAX_128_DESC, + CARTRIDGE_BBSB_40_DESC, + CARTRIDGE_5200_8_DESC, + CARTRIDGE_5200_4_DESC, + CARTRIDGE_RIGHT_8_DESC, + CARTRIDGE_WILL_32_DESC, + CARTRIDGE_XEGS_256_DESC, + CARTRIDGE_XEGS_512_DESC, + CARTRIDGE_XEGS_1024_DESC, + CARTRIDGE_MEGA_16_DESC, + CARTRIDGE_MEGA_32_DESC, + CARTRIDGE_MEGA_64_DESC, + CARTRIDGE_MEGA_128_DESC, + CARTRIDGE_MEGA_256_DESC, + CARTRIDGE_MEGA_512_DESC, + CARTRIDGE_MEGA_1024_DESC, + CARTRIDGE_SWXEGS_32_DESC, + CARTRIDGE_SWXEGS_64_DESC, + CARTRIDGE_SWXEGS_128_DESC, + CARTRIDGE_SWXEGS_256_DESC, + CARTRIDGE_SWXEGS_512_DESC, + CARTRIDGE_SWXEGS_1024_DESC, + CARTRIDGE_PHOENIX_8_DESC, + CARTRIDGE_BLIZZARD_16_DESC, + CARTRIDGE_ATMAX_128_DESC, + CARTRIDGE_ATMAX_1024_DESC, + CARTRIDGE_SDX_128_DESC, + CARTRIDGE_OSS_8_DESC, + CARTRIDGE_OSS_043M_16_DESC, + CARTRIDGE_BLIZZARD_4_DESC, + CARTRIDGE_AST_32_DESC, + CARTRIDGE_ATRAX_SDX_64_DESC, + CARTRIDGE_ATRAX_SDX_128_DESC, + CARTRIDGE_TURBOSOFT_64_DESC, + CARTRIDGE_TURBOSOFT_128_DESC, + CARTRIDGE_ULTRACART_32_DESC, + CARTRIDGE_LOW_BANK_8_DESC, + CARTRIDGE_SIC_128_DESC, + CARTRIDGE_SIC_256_DESC, + CARTRIDGE_SIC_512_DESC, + CARTRIDGE_STD_2_DESC, + CARTRIDGE_STD_4_DESC, + CARTRIDGE_RIGHT_4_DESC, + CARTRIDGE_BLIZZARD_32_DESC, + CARTRIDGE_MEGAMAX_2048_DESC, + CARTRIDGE_THECART_128M_DESC, + CARTRIDGE_MEGA_4096_DESC, + CARTRIDGE_MEGA_2048_DESC, + CARTRIDGE_THECART_32M_DESC, + CARTRIDGE_THECART_64M_DESC, + CARTRIDGE_XEGS_8F_64_DESC + }; + + const jbyte *img_utf = NULL; + int ret = 0, r, kb, i, cnt = 0; + jclass cls, scls; + jfieldID fid; + jobjectArray arr, xarr; + jstring str; + char tmp[128]; + + if (reboot) { + NativeUnmountAll(env, this); + CARTRIDGE_Remove(); + } + + img_utf = (*env)->GetStringUTFChars(env, img, NULL); + r = AFILE_OpenFile(img_utf, reboot, drv, FALSE); + if ((r & 0xFF) == AFILE_ROM && (r >> 8) != 0) { + kb = r >> 8; + scls = (*env)->FindClass(env, "java/lang/String"); + cls = (*env)->GetObjectClass(env, this); + fid = (*env)->GetFieldID(env, cls, "_cartTypes", "[[Ljava/lang/String;"); + for (i = 1; i <= CARTRIDGE_LAST_SUPPORTED; i++) + if (CARTRIDGE_kb[i] == kb) cnt++; + xarr = (*env)->NewObjectArray(env, 2, scls, NULL); + arr = (*env)->NewObjectArray(env, cnt, (*env)->GetObjectClass(env, xarr), NULL); + for (cnt = 0, i = 1; i <= CARTRIDGE_LAST_SUPPORTED; i++) + if (CARTRIDGE_kb[i] == kb) { + sprintf(tmp, "%d", i); + str = (*env)->NewStringUTF(env, tmp); + (*env)->SetObjectArrayElement(env, xarr, 0, str); + (*env)->DeleteLocalRef(env, str); + str = (*env)->NewStringUTF(env, cart_descriptions[i]); + (*env)->SetObjectArrayElement(env, xarr, 1, str); + (*env)->DeleteLocalRef(env, str); + (*env)->SetObjectArrayElement(env, arr, cnt++, xarr); + (*env)->DeleteLocalRef(env, xarr); + xarr = (*env)->NewObjectArray(env, 2, scls, NULL); + } + (*env)->SetObjectField(env, this, fid, arr); + ret = -2; + } else if (r == 0) { + Log_print("Cannot start image: %s", img_utf); + ret = -1; + } else + CPU_cim_encountered = FALSE; + + (*env)->ReleaseStringUTFChars(env, img, img_utf); + return ret; +} + +static void JNICALL NativeBootCartType(JNIEnv *env, jobject this, jint kb) +{ + CARTRIDGE_SetTypeAutoReboot(&CARTRIDGE_main, kb); + Atari800_Coldstart(); +} + +static void JNICALL NativeExit(JNIEnv *env, jobject this) +{ + Atari800_Exit(FALSE); +} + +static jint JNICALL NativeRunFrame(JNIEnv *env, jobject this) +{ + static int old_cim = FALSE; + int ret = 0; + + do { + INPUT_key_code = PLATFORM_Keyboard(); + + if (!CPU_cim_encountered) + Atari800_Frame(); + else + Atari800_display_screen = TRUE; + + if (Atari800_display_screen || CPU_cim_encountered) + PLATFORM_DisplayScreen(); + + if (!old_cim && CPU_cim_encountered) + ret = 1; + + old_cim = CPU_cim_encountered; + } while (!Atari800_display_screen); + + if (dev_b_status.ready && devb_url[0] == '\0') + if (strlen(dev_b_status.url)) { + strncpy(devb_url, dev_b_status.url, sizeof(devb_url)); + Log_print("Received b: device URL: %s", devb_url); + ret |= 2; + } else + Log_print("Device b: signalled with zero-length url"); + + return ret; +} + +static void JNICALL NativeSoundInit(JNIEnv *env, jobject this, jint size) +{ + jclass cls; + jfieldID fid; + jintArray arr; + struct audiothread *at; + + Log_print("Audio init with buffer size %d", size); + + if (pthread_getspecific(audiothread_data)) + Log_print("Audiothread data already allocated for current thread"); + at = (struct audiothread *) malloc(sizeof(struct audiothread)); + + cls = (*env)->GetObjectClass(env, this); + fid = (*env)->GetFieldID(env, cls, "_buffer", "[B"); + arr = (*env)->GetObjectField(env, this, fid); + at->sndarray = (*env)->NewGlobalRef(env, arr); + + at->sndbuf = malloc(size); + if (!at->sndbuf) Log_print("Cannot allocate memory for sound buffer"); + + pthread_setspecific(audiothread_data, at); +} + +static void JNICALL NativeSoundUpdate(JNIEnv *env, jobject this, jint offset, jint length) +{ + struct audiothread *at; + + if ( !(at = (struct audiothread *) pthread_getspecific(audiothread_data)) ) + return; + SoundThread_Update(at->sndbuf, offset, length); + (*env)->SetByteArrayRegion(env, at->sndarray, offset, length, at->sndbuf + offset); +} + +static void JNICALL NativeSoundExit(JNIEnv *env, jobject this) +{ + struct audiothread *at; + + Log_print("Audio exit"); + + if ( !(at = (struct audiothread *) pthread_getspecific(audiothread_data)) ) + return; + + (*env)->DeleteGlobalRef(env, at->sndarray); + if (at->sndbuf) + free(at->sndbuf); + + free(at); + pthread_setspecific(audiothread_data, NULL); +} + +static void JNICALL NativeKey(JNIEnv *env, jobject this, int k, int s) +{ + Android_KeyEvent(k, s); +} + +static int JNICALL NativeTouch(JNIEnv *env, jobject this, int x1, int y1, int s1, + int x2, int y2, int s2) +{ + return Android_TouchEvent(x1, y1, s1, x2, y2, s2); +} + + +static void JNICALL NativePrefGfx(JNIEnv *env, jobject this, int aspect, jboolean bilinear, + int artifact, int frameskip, jboolean collisions, int crophoriz, + int cropvert) +{ + Android_Aspect = aspect; + Android_Bilinear = bilinear; + ANTIC_artif_mode = artifact; + ANTIC_UpdateArtifacting(); + if (frameskip == 0) { + Atari800_refresh_rate = 1; + Atari800_auto_frameskip = TRUE; + } else { + Atari800_auto_frameskip = FALSE; + Atari800_refresh_rate = frameskip; + } + Atari800_collisions_in_skipped_frames = collisions; + Android_CropScreen[0] = (SCANLINE_LEN - crophoriz) / 2; + Android_CropScreen[2] = crophoriz; + Android_CropScreen[1] = SCREEN_HEIGHT - (SCREEN_HEIGHT - cropvert) / 2; + Android_CropScreen[3] = -cropvert; + Screen_visible_x1 = SCANLINE_START + Android_CropScreen[0]; + Screen_visible_x2 = Screen_visible_x1 + crophoriz; + Screen_visible_y1 = SCREEN_HEIGHT - Android_CropScreen[1]; + Screen_visible_y2 = Screen_visible_y1 + cropvert; +} + +static jboolean JNICALL NativePrefMachine(JNIEnv *env, jobject this, int nummac, jboolean ntsc) +{ + struct tSysConfig { + int type; + int ram; + }; + static const struct tSysConfig machine[] = { + { Atari800_MACHINE_800, 16 }, + { Atari800_MACHINE_800, 48 }, + { Atari800_MACHINE_800, 52 }, + { Atari800_MACHINE_800, 16 }, + { Atari800_MACHINE_800, 48 }, + { Atari800_MACHINE_800, 52 }, + { Atari800_MACHINE_XLXE, 16 }, + { Atari800_MACHINE_XLXE, 64 }, + { Atari800_MACHINE_XLXE, 128 }, + { Atari800_MACHINE_XLXE, 192 }, + { Atari800_MACHINE_XLXE, MEMORY_RAM_320_RAMBO }, + { Atari800_MACHINE_XLXE, MEMORY_RAM_320_COMPY_SHOP }, + { Atari800_MACHINE_XLXE, 576 }, + { Atari800_MACHINE_XLXE, 1088 }, + { Atari800_MACHINE_5200, 16 } + }; + + Atari800_SetMachineType(machine[nummac].type); + MEMORY_ram_size = machine[nummac].ram; + /* Temporary hack to allow choosing OS rev. A/B and XL/XE features. + Delete after adding proper support for choosing system settings. */ + if (nummac < 3) + SYSROM_os_versions[Atari800_MACHINE_800] = ntsc ? SYSROM_A_NTSC : SYSROM_A_PAL; + else if (nummac >= 3 && nummac < 6) + /* If no OSB NTSC ROM present, try the "custom" 400/800 ROM. */ + SYSROM_os_versions[Atari800_MACHINE_800] = + SYSROM_roms[SYSROM_B_NTSC].filename[0] == '\0' ? + SYSROM_800_CUSTOM : + SYSROM_B_NTSC; + else if (Atari800_machine_type == Atari800_MACHINE_XLXE) { + Atari800_builtin_basic = TRUE; + Atari800_keyboard_leds = FALSE; + Atari800_f_keys = FALSE; + Atari800_jumper = FALSE; + Atari800_builtin_game = FALSE; + Atari800_keyboard_detached = FALSE; + } + /* End of hack */ + + Atari800_SetTVMode(ntsc ? Atari800_TV_NTSC : Atari800_TV_PAL); + CPU_cim_encountered = FALSE; + return Atari800_InitialiseMachine(); +} + +static void JNICALL NativePrefEmulation(JNIEnv *env, jobject this, jboolean basic, jboolean speed, + jboolean disk, jboolean sector, jboolean browser) +{ + Atari800_disable_basic = basic; + Screen_show_atari_speed = speed; + Screen_show_disk_led = disk; + Screen_show_sector_counter = sector; + Devices_enable_b_patch = browser; + Devices_UpdatePatches(); +} + +static void JNICALL NativePrefSoftjoy(JNIEnv *env, jobject this, jboolean softjoy, int up, int down, + int left, int right, int fire, int derotkeys, jobjectArray actions) +{ + int i; + jobject obj; + const char *str; + char *sep; + UBYTE act, akey; + + Android_SoftjoyEnable = softjoy; + softjoymap[SOFTJOY_UP][0] = up; + softjoymap[SOFTJOY_DOWN][0] = down; + softjoymap[SOFTJOY_LEFT][0] = left; + softjoymap[SOFTJOY_RIGHT][0] = right; + softjoymap[SOFTJOY_FIRE][0] = fire; + Android_DerotateKeys = derotkeys; + + for (i = 0; i < SOFTJOY_MAXACTIONS; i++) { + obj = (*env)->GetObjectArrayElement(env, actions, i); + str = (*env)->GetStringUTFChars(env, obj, NULL); + sep = strchr(str, ','); + act = ACTION_NONE; + akey = AKEY_NONE; + if (sep) { + act = atoi(str); + akey = atoi(sep + 1); + } + softjoymap[SOFTJOY_ACTIONBASE + i][0] = act; + softjoymap[SOFTJOY_ACTIONBASE + i][1] = akey; + (*env)->ReleaseStringUTFChars(env, obj, str); + (*env)->DeleteLocalRef(env, obj); + } +} + +static void JNICALL NativePrefJoy(JNIEnv *env, jobject this, jboolean visible, int size, int opacity, + jboolean righth, int deadband, jboolean midx, int anchor, int anchorx, + int anchory, int grace, jboolean paddle, jboolean plandef) +{ + AndroidInput_JoyOvl.ovl_visible = visible; + AndroidInput_JoyOvl.areaopacityset = 0.01f * opacity; + Android_Joyscale = 0.01f * size; + Android_Joyleft = !righth; + Android_Splitpct = 0.01f * midx; + AndroidInput_JoyOvl.deadarea = 0.01f * deadband; + AndroidInput_JoyOvl.gracearea = 0.02f * grace; + AndroidInput_JoyOvl.anchor = anchor; + if (anchor) { + AndroidInput_JoyOvl.joyarea.l = anchorx; + AndroidInput_JoyOvl.joyarea.t = anchory; + } + Android_Paddle = paddle; + INPUT_mouse_mode = paddle ? INPUT_MOUSE_PAD : INPUT_MOUSE_OFF; + Android_PlanetaryDefense = FALSE; + Android_ReversePddle = 0; + if (plandef) { + INPUT_mouse_mode = INPUT_MOUSE_PAD; + Android_Splitpct = 1.0f; + AndroidInput_JoyOvl.ovl_visible = FALSE; + Android_PlanetaryDefense = TRUE; + Android_Paddle = TRUE; + Android_ReversePddle = 3; + } + + Android_SplitCalc(); + Joyovl_Scale(); + Joy_Reposition(); +} + +static void JNICALL NativePrefSound(JNIEnv *env, jobject this, int mixrate, jboolean sound16bit, + jboolean hqpokey) +{ + Android_SoundInit(mixrate, sound16bit, hqpokey); +} + +static jboolean JNICALL NativeSetROMPath(JNIEnv *env, jobject this, jstring path) +{ + const jbyte *utf = NULL; + jboolean ret = JNI_FALSE; + + utf = (*env)->GetStringUTFChars(env, path, NULL); + SYSROM_FindInDir(utf, FALSE); + ret |= chdir(utf); + ret |= Atari800_InitialiseMachine(); + (*env)->ReleaseStringUTFChars(env, path, utf); + + return ret; +} + +static jstring JNICALL NativeGetJoypos(JNIEnv *env, jobject this) +{ + char tmp[16]; + sprintf(tmp, "%d %d", AndroidInput_JoyOvl.joyarea.l, AndroidInput_JoyOvl.joyarea.t); + return (*env)->NewStringUTF(env, tmp); +} + +static jstring JNICALL NativeGetURL(JNIEnv *env, jobject this) +{ + return (*env)->NewStringUTF(env, dev_b_status.url); +} + +jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) +{ + JNINativeMethod main_methods[] = { + { "NativeExit", "()V", NativeExit }, + { "NativeRunAtariProgram", "(Ljava/lang/String;II)I", NativeRunAtariProgram }, + { "NativePrefGfx", "(IZIIZII)V", NativePrefGfx }, + { "NativePrefMachine", "(IZ)Z", NativePrefMachine }, + { "NativePrefEmulation", "(ZZZZZ)V", NativePrefEmulation }, + { "NativePrefSoftjoy", "(ZIIIIII[Ljava/lang/String;)V", NativePrefSoftjoy }, + { "NativePrefJoy", "(ZIIZIIZIIIZZ)V", NativePrefJoy }, + { "NativePrefSound", "(IZZ)V", NativePrefSound }, + { "NativeSetROMPath", "(Ljava/lang/String;)Z", NativeSetROMPath }, + { "NativeGetJoypos", "()Ljava/lang/String;", NativeGetJoypos }, + { "NativeInit", "()Ljava/lang/String;", NativeInit }, + { "NativeGetURL", "()Ljava/lang/String;", NativeGetURL }, + { "NativeClearDevB", "()V", NativeClearDevB }, + { "NativeBootCartType", "(I)V", NativeBootCartType }, + }; + JNINativeMethod view_methods[] = { + { "NativeTouch", "(IIIIII)I", NativeTouch }, + { "NativeKey", "(II)V", NativeKey }, + }; + JNINativeMethod snd_methods[] = { + { "NativeSoundInit", "(I)V", NativeSoundInit }, + { "NativeSoundUpdate", "(II)V", NativeSoundUpdate }, + { "NativeSoundExit", "()V", NativeSoundExit }, + }; + JNINativeMethod render_methods[] = { + { "NativeRunFrame", "()I", NativeRunFrame }, + { "NativeGetOverlays", "()V", NativeGetOverlays }, + { "NativeResize", "(II)V", NativeResize }, + }; + JNINativeMethod fsel_methods[] = { + { "NativeIsDisk", "(Ljava/lang/String;)Z", NativeIsDisk }, + { "NativeRunAtariProgram", "(Ljava/lang/String;II)I", NativeRunAtariProgram }, + { "NativeGetDrvFnames", "()[Ljava/lang/String;", NativeGetDrvFnames }, + { "NativeUnmountAll", "()V", NativeUnmountAll }, + }; + JNINativeMethod pref_methods[] = { + { "NativeSaveState", "(Ljava/lang/String;)Z", NativeSaveState }, + }; + JNIEnv *env; + jclass cls; + + if ((*jvm)->GetEnv(jvm, (void **) &env, JNI_VERSION_1_2)) + return JNI_ERR; + + cls = (*env)->FindClass(env, "name/nick/jubanka/colleen/MainActivity"); + (*env)->RegisterNatives(env, cls, main_methods, sizeof(main_methods)/sizeof(JNINativeMethod)); + cls = (*env)->FindClass(env, "name/nick/jubanka/colleen/A800view"); + (*env)->RegisterNatives(env, cls, view_methods, sizeof(view_methods)/sizeof(JNINativeMethod)); + cls = (*env)->FindClass(env, "name/nick/jubanka/colleen/AudioThread"); + (*env)->RegisterNatives(env, cls, snd_methods, sizeof(snd_methods)/sizeof(JNINativeMethod)); + cls = (*env)->FindClass(env, "name/nick/jubanka/colleen/A800Renderer"); + (*env)->RegisterNatives(env, cls, render_methods, sizeof(render_methods)/sizeof(JNINativeMethod)); + cls = (*env)->FindClass(env, "name/nick/jubanka/colleen/FileSelector"); + (*env)->RegisterNatives(env, cls, fsel_methods, sizeof(fsel_methods)/sizeof(JNINativeMethod)); + cls = (*env)->FindClass(env, "name/nick/jubanka/colleen/Preferences"); + (*env)->RegisterNatives(env, cls, pref_methods, sizeof(pref_methods)/sizeof(JNINativeMethod)); + + return JNI_VERSION_1_2; +} diff --git a/src/android/jni/keys.inc b/src/android/jni/keys.inc new file mode 100644 index 0000000..0c314d8 --- /dev/null +++ b/src/android/jni/keys.inc @@ -0,0 +1,140 @@ +#define STATIC_MAXKEYS 256 + +#define KEY_SHIFT 256 +#define KEY_CONTROL 257 +#define KEY_BACKSPACE 255 +#define KEY_UP 254 +#define KEY_DOWN 253 +#define KEY_LEFT 252 +#define KEY_RIGHT 251 +#define KEY_FIRE 250 +#define KEY_ENTER 249 +#define KEY_ESCAPE 248 +#define KEY_BREAK 242 + +static const SWORD skeyxlat[STATIC_MAXKEYS] = { + [0 ... (STATIC_MAXKEYS - 1)] = AKEY_NONE, + + ['0'] = AKEY_0, + ['1'] = AKEY_1, + ['2'] = AKEY_2, + ['3'] = AKEY_3, + ['4'] = AKEY_4, + ['5'] = AKEY_5, + ['6'] = AKEY_6, + ['7'] = AKEY_7, + ['8'] = AKEY_8, + ['9'] = AKEY_9, + + ['a'] = AKEY_a, + ['b'] = AKEY_b, + ['c'] = AKEY_c, + ['d'] = AKEY_d, + ['e'] = AKEY_e, + ['f'] = AKEY_f, + ['g'] = AKEY_g, + ['h'] = AKEY_h, + ['i'] = AKEY_i, + ['j'] = AKEY_j, + ['k'] = AKEY_k, + ['l'] = AKEY_l, + ['m'] = AKEY_m, + ['n'] = AKEY_n, + ['o'] = AKEY_o, + ['p'] = AKEY_p, + ['q'] = AKEY_q, + ['r'] = AKEY_r, + ['s'] = AKEY_s, + ['t'] = AKEY_t, + ['u'] = AKEY_u, + ['v'] = AKEY_v, + ['w'] = AKEY_w, + ['x'] = AKEY_x, + ['y'] = AKEY_y, + ['z'] = AKEY_z, + + ['A'] = AKEY_A, + ['B'] = AKEY_B, + ['C'] = AKEY_C, + ['D'] = AKEY_D, + ['E'] = AKEY_E, + ['F'] = AKEY_F, + ['G'] = AKEY_G, + ['H'] = AKEY_H, + ['I'] = AKEY_I, + ['J'] = AKEY_J, + ['K'] = AKEY_K, + ['L'] = AKEY_L, + ['M'] = AKEY_M, + ['N'] = AKEY_N, + ['O'] = AKEY_O, + ['P'] = AKEY_P, + ['Q'] = AKEY_Q, + ['R'] = AKEY_R, + ['S'] = AKEY_S, + ['T'] = AKEY_T, + ['U'] = AKEY_U, + ['V'] = AKEY_V, + ['W'] = AKEY_W, + ['X'] = AKEY_X, + ['Y'] = AKEY_Y, + ['Z'] = AKEY_Z, + + ['\e'] = AKEY_ESCAPE, + ['~'] = AKEY_ESCAPE, + ['\t'] = AKEY_TAB, + ['\n'] = AKEY_RETURN, + [' '] = AKEY_SPACE, + ['!'] = AKEY_EXCLAMATION, + ['\"'] = AKEY_DBLQUOTE, + ['#'] = AKEY_HASH, + ['$'] = AKEY_DOLLAR, + ['%'] = AKEY_PERCENT, + ['&'] = AKEY_AMPERSAND, + ['\''] = AKEY_QUOTE, + ['@'] = AKEY_AT, + ['('] = AKEY_PARENLEFT, + [')'] = AKEY_PARENRIGHT, + ['<'] = AKEY_LESS, + ['>'] = AKEY_GREATER, + ['='] = AKEY_EQUAL, + ['?'] = AKEY_QUESTION, + ['-'] = AKEY_MINUS, + ['+'] = AKEY_PLUS, + ['*'] = AKEY_ASTERISK, + ['/'] = AKEY_SLASH, + [':'] = AKEY_COLON, + [';'] = AKEY_SEMICOLON, + [','] = AKEY_COMMA, + ['.'] = AKEY_FULLSTOP, + ['_'] = AKEY_UNDERSCORE, + ['['] = AKEY_BRACKETLEFT, + [']'] = AKEY_BRACKETRIGHT, + ['^'] = AKEY_CIRCUMFLEX, + ['\\'] = AKEY_BACKSLASH, + ['|'] = AKEY_BAR, + + [KEY_BACKSPACE] = AKEY_BACKSPACE, + [KEY_UP ] = AKEY_UP, + [KEY_DOWN ] = AKEY_DOWN, + [KEY_LEFT ] = AKEY_LEFT, + [KEY_RIGHT ] = AKEY_RIGHT, + [KEY_ENTER ] = AKEY_RETURN, + [KEY_ESCAPE ] = AKEY_ESCAPE, + [KEY_BREAK ] = AKEY_BREAK, + + + +/* unmapped codes +#define AKEY_HELP 0x11 +#define AKEY_DELETE_CHAR 0xb4 +#define AKEY_DELETE_LINE 0x74 +#define AKEY_INSERT_CHAR 0xb7 +#define AKEY_INSERT_LINE 0x77 +#define AKEY_ATARI 0x27 +#define AKEY_CAPSLOCK 0x7c +#define AKEY_CAPSTOGGLE 0x3c +#define AKEY_SETTAB 0x6c +#define AKEY_CLRTAB 0xac +*/ +}; diff --git a/src/android/jni/platform.c b/src/android/jni/platform.c new file mode 100644 index 0000000..ed38edb --- /dev/null +++ b/src/android/jni/platform.c @@ -0,0 +1,86 @@ +/* + * platform.c - platform interface implementation for android + * + * Copyright (C) 2010 Kostas Nakos + * Copyright (C) 2010 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "atari.h" +#include "cpu.h" +#include "input.h" +#include "devices.h" + +#include "graphics.h" +#include "androidinput.h" + +int PLATFORM_Initialise(int *argc, char *argv[]) +{ + /* Android_InitGraphics() is deferred until GL surface is created */ + /* Sound_Initialise() not needed */ + Log_print("Core init"); + + Input_Initialize(); + + Devices_enable_h_patch = FALSE; + INPUT_direct_mouse = TRUE; + + return TRUE; +} + +int PLATFORM_Exit(int run_monitor) +{ + if (CPU_cim_encountered) { + Log_print("CIM encountered"); + return TRUE; + } + + Log_print("Core_exit"); + + Android_ExitGraphics(); + + return FALSE; +} + +int PLATFORM_Keyboard(void) +{ + return Keyboard_Dequeue(); +} + +void PLATFORM_DisplayScreen(void) +{ + Android_ConvertScreen(); + Android_Render(); + Update_Overlays(); +} + +void PLATFORM_PaletteUpdate(void) +{ + Android_PaletteUpdate(); +} + +int PLATFORM_PORT(int num) +{ + return (Android_PortStatus >> (num << 3)) & 0xFF; +} + +int PLATFORM_TRIG(int num) +{ + return (Android_TrigStatus >> num) & 0x1; +} diff --git a/src/android/jni/sound.c b/src/android/jni/sound.c new file mode 100644 index 0000000..719fd75 --- /dev/null +++ b/src/android/jni/sound.c @@ -0,0 +1,62 @@ +/* + * sound.c - android sound + * + * Copyright (C) 2010 Kostas Nakos + * Copyright (C) 2010 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "pokeysnd.h" +#include "log.h" + +static int sixteenbit = 0; + +int Sound_Initialise(int *argc, char *argv[]) +{ + return 1; +} + +void Android_SoundInit(int rate, int bit16, int hq) +{ + POKEYSND_bienias_fix = 0; + POKEYSND_enable_new_pokey = hq; + sixteenbit = bit16; + POKEYSND_Init(POKEYSND_FREQ_17_EXACT, rate, 1, bit16 ? POKEYSND_BIT16 : 0); +} + +void Sound_Exit(void) +{ +} + +void Sound_Update(void) +{ +} + +void Sound_Pause(void) +{ +} + +void Sound_Continue(void) +{ +} + +void SoundThread_Update(void *buf, int offs, int len) +{ + POKEYSND_Process(buf + offs, len >> sixteenbit); +} diff --git a/src/android/project.properties b/src/android/project.properties new file mode 100644 index 0000000..9b84a6b --- /dev/null +++ b/src/android/project.properties @@ -0,0 +1,14 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system edit +# "ant.properties", and override values to adapt the script to your +# project structure. +# +# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): +#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt + +# Project target. +target=android-16 diff --git a/src/android/res/drawable-hdpi/icon.png b/src/android/res/drawable-hdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f0538d44cf0030ee245a45e18f1c793ef0e18ad0 GIT binary patch literal 3456 zcmV-`4S({9P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2igf5 z5gHKvyJMRG01W_1L_t(&-ql)NY#i5h{?5HKb7z*TU9Q9*fs)ujq-r{lWCRfs)rCcq z1`ITXTFEGkJOvGG#SaCHqIuAZ1Q;;THzR*e3_l)-0z-qzVn^$E@6jUOG`_i1#psx zK3HF0zxd>nPsVrRJ@iQdyl~-yTwPtgAHX9-bPB+ytdFk)cqz~GuRrm`6Cd2QfG=FQ z;I-TBhX9-caLO1n(eF7aWjHl8_3q5fOrn(f>VX3Xe!N|4aPBn7mtJ~lB#z@hA)?c* zR_jjz)CYiU@7uTU-RbFRs#dEUOT@jsRX>UfvDhB!JU#96wA%LBHob z&s&+An!2=i@7}=o{UeU!+}{NWB0`?$&|3d)M*}{0?%bhPtF=_ERwsoJb40yWqm=sf z-o1M-kByCudY*UKb=?OX#{m(+7=tX!Af*J~lTx}n8ZZ(0tE;Q?tE;QyxhQ&Uv0U#elj|EI>*rK}5*13_=Ke_~D0#mY0`Lck8|e;00sMH_n_n z^Q#>}TIbK7KO%&9$G-RAgAcwnIy!oc!Dy{N-fhQ$>$a+5CX5g_8QjL z*UPWTg%GbCJ$m$Sj~zSqqffeqE9D!$?~f!&0wRLvdEh$LS|dr44InwX<;@U6LM;CUW|5CDKQO(BGU=Xph1=Xnky zTD#|-doE2+Pdk-LPvn&G< z^^lp}syNj--LGD~dVG0#`M&`i?Uqrrw6yfEMD+E?9((L{A~JUj@QW|LcqGsB)5e&S zNs@fO*=+7ll4PbEVGjVJD1wx-04anhfZNg4S|d%at`Gv9PUoR=b_pTAxNqOS z!`H4|`!4{0xov=rF|@qA{COfe4d9VH&u6=R7)mKjPEJB={cgM6UQLqZknj6&oR41@ zMNv<5Ifa?b_#S`_jLp$C#vqPkCdznvditHYxw)v(XdHGN=RP7D-?l#d%rnpYRlQ#S zYXGx@cxum{J@1c=jpdHx%;b6A$g&KM|KfNsxZnxWC?sPg6wOZ{5)oOKuh~|iBeSCcUXS;Xr zmQu>uEXzKVrYZ6~hf=CYSB|byswcWhlJt$P&Dfmo#u!K`(P%Vgq?9vV?kGO*ZV+uJ zX?a@fTC>?a(QGy`Gc)tO+1c6SX__9hg@lw6#u$WQ2mlCzpdhX+%aCOmT-PlC8Dk0| z!adp+B6h@Ct#LMV%dE%-`}1ultu#&DG);Za^9pi_qNu26-}ga8h~pS(nnEcBdtiv; zxM)>GgfI+o>Cz>vtgLh%e)!?4O=cWj{yx8tWhny}LbSFMa8IwTR4OEdKp2Kay86Cf z5L9;*ESQ+1>o`skaUy!}%9SgtmoH!b<5uhAweH%rtCM9}m0Oiv&*fIdY2B5e&|3FR zX|Y9yR^?kvNUrN548sCw5CjN<09lqHiXx>tVmIPu+W-@hvUfBH0#Qz325yW&nx@~*vg}^~d}m={ zp?QHLMXMTSE&xd?PwIoxsEXxWqBcfuevRjp{z$~5ZYzgr5&p$sVrTjAhj~HVf zA|k(DucKbC|2~f6|7Z+brBA zt)4n_UDtj#+iFUGyr(gE(z1;K9xlp^&GkH>42NTBA%uydh{`gNQ<&2@P1By?pt~W- zCIro{Qd@%Sx=7P>!&KF8X0}I1Aw)hj;IeBWrEDvuYJ*bPHsCnAJTNGwvaP0ck|dg= zS@y8GE!okvd$ciT_&!WTere~yEX)q0JvCF~AvcrKL8%`W1{_D%o_SePmRnVKU{HKE+-kKJiRg5@-9AM`69e8I zH5!fI-+S-9s#>kiagSvWn}M^3U2av}i-iz3Zil5Q2!ahPTy`|rinZ%pYps@-m;b5N zYJCB~XunelB5K#`^>@d|$CXm*(?W>P*&enH(snt^t%@hA?j}`+25gLROPY2qNs{6v z46>i2QC3^+cKaxRqkVMpjnUE3_s7S_Yf{R4jWPH0hIZ%WB8B_eyEd8G#z6OY21Jx> zCc>4H;sHAvgJxbUg$uQ1i2(jTziu=dm&eA&CW+_}fCpH#aH%lquv+tdznGR7c)!}U z`*F9cT)(aHkacUBg$K1Nu5+#R%H-ta`+N56*-u0VjWJVwjDa39WJhz5ht1I~AGg}Z zfDj_s3}B~J!=WAB5)1dFaJg00>-90M_57esvKgN@sT^I_(tO;?!0lF5HU^}W?ai?C zh)phzid2XNnSipK~WSTj^pCwu+!<_t+(F7)vH&3$Ywp441eENSG@V`S$89BHq(|y zO73CKM<(oO*aHKrty{IKep8j_d8kw>*NEu5Z@&5FmsVF-3kT!i!Go0N`34W0f%83P zXZyI-7!z(erIk{GJ>fwqJg8L-nyNg{`-q5M?Q}YSzqq*gle1^fR)Zk;Qd#iW<6u9K zwh$?uKSi4%EoqaM5F)p0*FIqwwpDd&?`OuC??h4b4+{$m@7eD>d-m*x@`~d)3&XGw zB3!3~S``uHLWnnn5EqqFZ*C^S)e>oC%)&QIVI~qgg_TktX|2DJB*{O{&(D9jnRz$} z0*^CfP^%I`#6pPwkW#*!W!bmyyYIf=-u6!(JkOJST*4r4#=>@;19)+9aq;OP!0jsQ z>@-dDBuNT#v!c5ug!p$M#KkmCUpapK_|Qh7GmN)nj7eDjl?Mjj_X{#(f+~4iLv8By z>(_tRXf*zYh`s_~j(;lQx-Qn&*CB+sE`<0uA;iTfioUzBun=v@7#zl1Qc6iFPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2igf5 z5gr-f3m!WF00h@bL_t(Y$F)|^Z&Xzj{?5JcIWzq+^E$q9NF`H*0zuk{K_m<$w240w zLKMP|g~-DG0q%$kaA86WMi)jGO<*O9(Nt4iw7bSd2{BOuF+yW0j-pjb1Cw@sy?gI* z;oQk}Ivq-=H+i`)@5lYl_nmXTdkK#*E?v45D5Z`P(J^NJ-SfQh)2C10SkJ%os9@vc z<5>W&6VV9(BLJR=$K!wIa=BZ%TrQPNCSOaZ)5V9acsyS0 z@9)2|Y15{s5{bl4DP`98eK51xP{!xZo%;m98(X$)`F3b%Xov6n+kD@L=XsD)Hs_g{ znaOIkdI-Q&S6A1^Cr_Td@>q-kfSJ4F@pvDAZN?ZFW1zJL5rLUuj6p0GJFtEG_FDr3 z14D^K;sXHr#{y>NRAW}g7ziPnV9eYMAfL~Np66wxlmKwGP$(oSl}h^5sZ)2|^~8EW zFJ8R(Y!C#Bh{^z!^P0>ZHDbfV!#@lT4)*r+^c?j(ZwA1% zj=-f-=}5U;elwfR{DXl=;-KgEwT0hfbaViX6|ckFim@@Kmx$o|ewmq*j#ah>p`9&qFA*Ix#vG~DYBNOC z)uxhN>F>8|C(%w?W`+;~TK|hzE|;GkA0Pjah>imo0HA{)xRJ?ZV%^={12)fgEjNIM zf4A>rBGPL~OGH>+UOpp)s0KmsV-N(3zVGiKqCM^oMMRKNHr>rWQ%bD{7DDtk45I>| z&joW82*a=#hT)S^%Dr|$>t?N0?Ydm!U1zCV*}CmSL^-<&*kD>az}-abZr12$TC=L9 zl-j$QNb`_vqJbgj~zmxU0MzVE+PDwQ&` zv$KUeckUpHqPn{`Teezjj-u$AG3J+c?IbObE3IW~E0u`OL{aq7=;&zGzCU~RY-?Xb z2%(iyvqUr@gqYa1Yge)3(T9k*lVJ!UzH>nv|9r~K#`C=Alv2|GzA(m29z1yPuk{>n zdjP=myw*jV3N%_owK;(n0lf1l2S?!=y#-pUs+k#5$_Lnh(N=1=RV-s7`lDX2Pt@!6 z;)VhnV|*e)B9Vw3rnl?$`sYH3uSP~juG;)>D6kOXJpfmuD0(G|qDd*`mxm7@zJdQ~ Z`~yF(TBgh4ANBwM002ovPDHLkV1lefkHi1~ literal 0 HcmV?d00001 diff --git a/src/android/res/drawable-mdpi/icon.png b/src/android/res/drawable-mdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1a37dcad7ef9b9eae8b31762b607326631807df3 GIT binary patch literal 1898 zcmV-w2bK7VP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2igf5 z5gZRD>B;B-00!zwL_t(o!^K!%Y*bYm|Gw{>b32`xJ2RarZ7uBLKtnr(*ociRZVU-% zc2TjQQXhOOMu~6oM4}i4jah;~y}fv|*qy zGwn?8z2_VsoYS0MW~M`>c#@krch1c{zwh^b-|zd*MOcQB&*$4qrP8BX>s^R=5fR_o zvuDqxrMwI86sQv?P9&<;>JtF46966qfS6fxUH7|zfr0$s;NYuw72wgMN4ta&PXfSG z0I&@J9J7{4B)-mOvy)w2U4IZltR(`&ZapOiIlgWI%VZ#Q;b=~!j zx@zgwAO%#VCLp`W@e^eYds18D^jV{y3Lz6?;9Q-KDI0jN-15UUu~jpU<;mvG@RE?A+++X!VY`IGs+fV2o7&0E7^8Hd8?mfKmz!XnRdc zIq!C*6ch@Dp<=N(2>_o;DStYC{P-KEPMzvo5`$x7V-FzW&YGmGcU`wQH#axI7z?D7 zx46^>WkP^4wqUJXF5g>|q#tv++{J7*`Zfk3+a?aN<#?1QP9LIU7 zWd?&FSWzexb`nvkr>Ez1E|*(@h&d_cgN8NZGDKV;FJ{eV(Zrxq3OMJz;b)0x_I6`1 zQhT8r1VI-f-Uk4}Y-Ezd#Fuev?UGloUWJK?3Ak|K!sp>wv=hpbC4b3T%sHR4LDeia z(gTb!0D!9FIRBMWzJ2=i=~$^$dJ_O3l}gQqSvL2E-5OxLT?QR%u8q|T3OZs@2=Pv} zT78Cdp4qr@F#`bLIL`N}RO(VHm0E>} zea3QQEn{r932RZCEmI0j+}ePHATTmjZU_(&Q-wm|5h9vfwQALe{r&wpt@T;}SZgK0 zk_P8|LA|zu8tk|>>^4dgsy)<(hzTj>AMJRvGuR4l-Ab)DOxcoRvftKAt+n3}AQ8FN z97Aghth45&M(DKGG5dJ~Dh$+SQA&BUC7EH2DNCDfVUaOrVzDlR$;##yYCa>H6=H>6>}L6{O7K&t{>v@cp4G=l~NBG)=fx+U2Bd9R^nkpfJB7m z1w>Rgw!$p7wY5#HT)Fbwcs$+>0DW5PUIUnjAP9n64p8B)$7HjqIL#PLSZ$UJ%ZlxO zbMLxtx7NDbHXt0Q;n=g?Y_HYcTWTqbg%GTPtkkWUjpWd7#msx^Nse*3QcAW2&?vth zlXilI<)_|#5CoOU$w@eS_AFE?l`o8u;oi{(*|b^ES|{yI!tM%JlX{Yah~IP0-}5~0 z?K5Z2yrPtPyvCFcchBZ{5ORB|)piT(xvK%FbB^PD;CbGOEnBvHX=$TvJlbktpP`AU z?EC(EjIonSsjpg<8LB5MHp4^&p69)|ZQHi7#hL}i7`M9@M7-vC-amy9C*$$>f3n$Z zbo*BJaqTg=W=1j{(WGJ_TfU9U;CSoD40|43{7-CYA1aVS+WJg()APK40l>-G+1U?w?AS32cX8Yz#{2f|YfmPVPY(_b_9YUD kPm;;xM?*tHKKxGO7hfK#Wi4Aeo&W#<07*qoM6N<$f`)E{DgXcg literal 0 HcmV?d00001 diff --git a/src/android/res/drawable/actionbar_bg.xml b/src/android/res/drawable/actionbar_bg.xml new file mode 100644 index 0000000..ec2c22f --- /dev/null +++ b/src/android/res/drawable/actionbar_bg.xml @@ -0,0 +1,4 @@ + + + + diff --git a/src/android/res/drawable/folder.png b/src/android/res/drawable/folder.png new file mode 100644 index 0000000000000000000000000000000000000000..89e4b2b041383a926a6dd86279600ae54a6fd08b GIT binary patch literal 3000 zcmV;p3rF;cP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01m?d01m?e$8V@)00007bV*G`2igk* z4k#<(YjO4f01G%tL_t(&-tAjmtX;)*{??kAz0W>B_vf7ZDsE}3=waRlIKz(WY5Fw&I@lX^cc_6Wxsv$i%q8=_UX-0k{dk zO#p5Ja3hnw?v{hBUcr}--a{Ze1j_C}JpWYyW-y$aYr*Y*5oXscc(~IIBRVrPi(|)*;l&qU z#52!4gX!sM96fpz_Mg5shJXHtzXuVpsAsUWv=adE7k~aG0K$MBh1vI4y>C4rOK0LD zxONzD=QW0A=AUW3c4-o4U-$-~9sr@)7X1779|BK|ro>E4q&y_QK&j{e&G9FR~~ntca4+L?WJS8QM0la3ykWECD947`@?vKS;XdlZz`A-)SX zC4ejanl8J^XEipy0q{i&P5{x7(0pr;pB2HQ?Sv^;cTl@NtiUg2=ZNp^~3j)4M(uE~X1j_Z$Jo6Z! z2e7o9)g3Gq0f`oYY|1 z4H2#&&(mcHSV6e8}_IF z@k@O5D|;dtn;Y7>2vU%o-4Ipfg9iZTpmh?!U^fA9I!{z+nW4|donxPX{g?0k1b_3F z-+{(5R9aO)M7tZXiyi|P3zOeu1UZ=ixIi$&0z1+70?Ysn*_RDjGOyc3aBVCU!O0Zs{kA!I4!+8i04Tx;}{bLfCc08tJy8>}K} z9h?jSNdkYS^X4>Q4;?xLkW~DTeadv9xj_&nNAKMWL}1BD&{8UUmiOk%9)fhHZq^S=TWXF-J= zWHB{01wM4>5QN5oSQm7jz6x2a!%nn%PIMVTH=qSrnTM?jR4+l^o`ux&=YQQrwOZ}X zaR2^00Qnz)ih!9k0NRlGp`HQkKnGL;Q~}~X5Oyb^)B;Qway9M5{tWm@RmXgfV4fxt%kqkFt9`x z00EpSsE`20f~+3<%4aY=J-xk;I6yw0_Zo| z6BklYqJZ?b&)t9mplek?z)1>N3nbL;DAMxA1tVn&GC4#9lxZ&y7zS7cLf?K7K+c0w z0ullY6dvVrc@=m?vc2E*MPl;nW%D&7GOgM6M`B?s9;1mr5f^CHfxnz(P@$5!3oGA*@$Qh|lF{sV&C zuF?gz$dPXGnl0{S_4mf3F3Xwo(a->1GOapO&|gtpH8*BCTt62 z4D{T&bGYrc+g1T!Ha)A!Bgba1%udycXr)Mo0A)f1kwTRq$`EB(4j|HZ9e{38txD@Y z=xQImx~+C}*7B@vzg(xFK5vhmxVM){q!3~0w!-3UtFW_JDUGSxT*cAI$cO?PPKnLU zU8Tmt?0CX&-!AI@vEA_>TWIiDv+0YCX4iH*OOm=)Cvnk+z-gmtY&Ta5Q2`aG3PgMN z)+mTXiDcy%7_)*Q8if!dNR%K-Btm2iU`W+)zcuxWWxyDyD8ol4z!1R1%&>;w93)E- z3t4PilBR-}1m)Da>QI(ts1D^9)6899wEwjm_q|aWp1AVz%fIRD-@hNbcI{ek1Ip!! zwi{=!c-`@G@czL(%8+Qc8&%sxAx!Sry}MK@-!IXBDn=xGAI66r=dy~}WtZBW|ZnyRH>C-rT_%Jp} z008897Z)#_L+&GWyIpRzJ7~AtTCLW2babQ`W84!$*b!q)W0Y2mvE{vw-shUqR`-MefN<>B#C>D!r^N!l-bh<<&F~-Qu%FG}lW~P*x$ruagT<)Ax=Nvib z;GBcCCS|6C36ThO5zN%*ug&`)S}J8!%u=$>k+DV=7dv|4!Uf!O&poKsYFh&U01FEX z`1;qsh6f+~CPE0PR;w5vABVM;LkK2>;QAAdd7f*Y=jy#jp641uKnOu&jOYWv7}GPTt1nu$^m(2m%Q8?;#1TS(h#-Uj=iG+8UXQ2K z>8$XC5LS4J2-aGJ5HK?{gVE7Z3=gkApDZGnnVCVcSj1MxX6fDjHrHr0FgMrRF0a*U uEB9+@S(GZ3%3v-QZ~kxa2B#Yyfd2#XhiDD#^+sR-0000`6pHRCwC#S>EU5HO5hL&7%XpV*!5}StB>BVvHg(m$M3MHE!3Wc0{XfHkWl8|29Lklsu zhb;-L3<-GYww0WfSA8>j($2~neb~u{P>npy+mUAUe(!r^EeHa5m0Jy7@m2w-08{`f z057-cig}H|=``j6<;i4>-KTNe&pD1W z-~Fch-rAM5pU9ko63mau^n5bO@ks#8u?7R%w1JOk9^f(;EWFU9z|f7*Z2WMZH_NwR zP#?hF-rk$tuex&xaD-hj!SM2gLew;}eR$)u8$ToU4}l*Q5kOWH3MGuq#Y->?A@c$R z2c=KuIn5Y@-s9e8uh#?Db7Sp@5%THv57+yhw>xVapKjbIEgT*fKxo@|F_?ge9hMma zTm+EOWu3F2eXb4O-=S1FP;&5ieHtB&gQtUe=ZW(<-nvMZZ~_4Skth@T0!rCznA`Ys zJIR1BG5*^$rT`ai3&2hA0I5^N!JHJ)QX^ZY2E-N-kcMEs-+rUL)p@J4OZKTf=cpLv zlP2Y%L-K_KResS6$0`J3+qPi-))%){G2*=QqGG#nY%l)#SF6>!d-Kbichj_xX+mNn zKX&FHmd`KmZf$ODI!~R|$PZ#?l*f}aKlCa7$3ry_2E9Lf7x?=nE#w1`na2dh?fO@` zb;&+!gY}vf-jf_XqSNMz(rImf$n&D`i&{A!pe)NTlbL;bS<|*`;mjfuNeo9!#B)BI zfGk1-OBI3$Afdl$#mi~gfytb(KAIOVWNZq$EXk=ky(FD7^7}{+Rb@u4kV7GW%kN*_ z#sp=HGJ+%*-HS#UEZ1DLJ_4qsNy}+#$**=PA_e6V8E$0aHSh-$=KP6@W#*Hh#4~<& z`7lK*)=D{PTuKA+2B9N!3BbcY9xe)dl{ZgnE1|jMUa9k0Yq?+=Y+F^}WUL;>AhgjKmpR4&ut#!8bsJstIo1+Sa2Cz(C#Gq8%5A>90l4k@zd%Zhy zVddSGN2(KAEieA>yZhXfhEaWQ>gH6boLM&e1?c<$FqEW!j6^o@VCVOp#p|D3|A^N_ zLV8qAap{P&z{rh%3qT{H<#`nyJrC3K@j0Y!D3e$*6T&C3`V`Dt4QnF#1oIInV}x^c zHy-2XR5XDQ&%^XQ)WiK$(l3^YO_QI%Qj=GjDajIzHI+qY?8TpBO?47enNT1W=rC2{ z%4gtGQAb5*`GPc$nvXtN21Nnz1#g6i zK2_=p{O-zym1}7G-{HxtIrC4>6L8?5F7Kz${xpQupX1 z*MaI2i>CNDYc274U4z-TvGj3E8HKd!|HKu53P1&*0`R{E@Sgw!0E4eF`dICuasU7T M07*qoM6N<$g28)?i~s-t literal 0 HcmV?d00001 diff --git a/src/android/res/drawable/ic_menu_close_clear_cancel.png b/src/android/res/drawable/ic_menu_close_clear_cancel.png new file mode 100644 index 0000000000000000000000000000000000000000..78222ea8eb2fcfedbc27b892156b1efab00534e9 GIT binary patch literal 5306 zcmV;r6h-TaP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000T)NklhTM|?g6+5;0IpHU0SD3 z-VM?z^|8+YU{T&T<$WXe+0P1~UK*_cSO*{>UmN5d2XI5)*8wcZS6_a1^QQ(-7c-gw ztS=9j(_f5#vCH+`HfG)^e9;{L2P&yE1iGp>>J!`Aww)X(aS4QDIdazkgvP4?^q2qm@=Nw*`>?91ur^sBjX+AR@v5Q*o>o)< zh~5id1V8Wr*K=WiX@i-ON~Mk+{oB#k0k{CfYC)_9K-_qv`-Sd4$8$Q&Msr24#|;+{ zP<<6b5m2$h=MaDo*z-2#ugrspM*3dw>jvPg7Q|`*#EtKFJg38IvS4g5mW*HSaU}?! zh$4I$J~IA8`iMXPaIXcY0m4Y%>wPaS198Uy>Hz#ohRq@SvVGXvY{A@Mg0#Ru71E=m zMu1468K^j~LiL~k!WS9@wzJR8%nW7*7?JVe8m{ZYp0=T<^kYX~J=!b7=|8tSh5rR0 z0U%jAQF?Ur+-TWMnJ_m6#uJu2Y-k3cplWU~2lbRblu2i1B{klR)r)oZtev*6*qyHH z?uCz}<2g$^`N65o&(FiQZRB#f;(=!md<38>*=fxH>SgHM_uTKED}&IQu`*G@hGAf6 z28d|J%2x=`#W zc0j?1N@|Vq0AQE~NTJrAzxQ-W+HP2@mWbqJy8C6lEb=ha=q=R&V<2buz z!Bk?hWYqxHRfa2RFj{q8k33I)6#Lc8mQ1%SK6RxNrH4k(jSf1l(>*#q`d;Zo=@9_; z0l2SpqV&kv_}F{$yTQ`&(nE3&FO$i13tvy})TOCil1v)bBIfD=tYeScLY@yV0)d&a zZOgVHnXro&FI?=jnyjQ@1hv6143JI956*t@CVarqjAY76!5{;sVZ!y?Y-`*0p?%rj zPejQu8BNQC!A4SupbAGdLL;QKRMl)UKMd(H*Pfdl8y}ltpPN@8@{O@RV@)~G0H7I) z^m^!(z`*k{s=Qu&viNy+Yj!^oRY{{r$dN`cl9B)jAR?%wR$I2T>@Vypd>&teeLl~A z%=>Z;u^^h4^%koJP)8uBsv0Ru_BoUUUaY%X0PtP@vHV2K=9YuZTn$wxeAFaA`&_j) zSqF2!$xSSi&o=>h>~SPJ*k^zMHKAfzcejR~I2K@Gaz%@;aM|-VrY}q{X`fiqGZ^-l zHs~5K*#nu5z;XwcZ`^HC)%-EJzG& zZ02BQOXeUERl|CslMZu(S$(4L#E{&7edTPWGwdOjkp*;JpID}BR|VjPtdeKMf~bv4 zpFujoop<+^hszHDNaT0sXLH+gU3#NlH8-0ubfemGf6M;t*6gR*t=Ugo?r+&o8dc4v z;JZvV)0Jz_%>qc2hszJxU)g(AQiIc#`-JRerL8lPt!}I}2d?LL=4aJ}IvFX@P%Wwk zKuDe*I^73A1F)Fing7h%Z0#kYzEo4{sa$*RV=0Bd$+hP`wwkP`NTa?~Q)+L%J^z{9 zLwom~cl(GanbK1=`682dGXGdUESQUH?FSM7e%*h(|9RJQ{~9HhTwDkNd)9_Z>d0IF zdh4)kJi$)A8%^8qRA?E{15NbxF@uz*y>^m;i?!sE@ zzzqQW;`1+_B2euq$YeH~Ob8Yodw#oTq&!^SBBgU(Z0$shD#LB&{J;gmEuIqMK zDGSh++Dag(*sSp6zGwEGij7(Byrry+R34qaG+hP&haISpqY_zo?8`P>&#js%bFi?p zFjVX;uGmtRhsx>7*-Gc!S95!bC}}pDAU$BL(EH(pBl}>snBSTIK`muXQ(t4%CDSu^@t1IdyZcIYGltm@zf;JO~~D2o@T9yxsNOW>N@xqYgt~nrcLY0ab;r z=`eKT*uH1>-Ib=kW~@>=QR;Wu?O-n$6-LLNkUnC-WfzX?fW0LugaYWA4pmd5wv?1W z;DzU`DuMB&(a3>k58Sn}$}NMf(%Ypz_PE3KTnHg<{k4x8Efk+PgvvI2A7?evC^Y`A z54LU@EtZGMFFCGr*md1#a2rVnrB*(~XQMR|LkWn0h(J2Q)XihX&f+d&J(ZrjGPjGF+ZenNK9;wKGo;W} zBAPHanP;+Fvp>rNj{mzyOm%nZN&V0Ekgx9Ee>J!V;2wZq_VwQZ05_G%zpY$r>Hq)$ M07*qoM6N<$f*^ZKJ=t5o?>LiAH+wgst>nOP&d!;g`M>}F{>#iU!r`#^KVQZufKdRW z0MY_rpjptY^3F*@vI*I5mE(8?(E{3gHHW$Qwr$(Y`~Lm=jmUS}J?dpkLtv}?UxsW} zIVK>Rko}qR9fj{h>p|<+02=aLP!rOSb6X|Y$oFXhP?OrxveB~meEj(FR~s7}Kj`f2 ze8n&fk(rr!=h(4h+xdsBTeoiVdcAAa1Qv_skAnvfzFkmI&>!3P-(J(*-Mtj^o<#FwKEEc9@p}_-Yy{(QIK-GSV`xFgfddCB{eJ(_qM{-pt!mNMk6P5LI6g-x8A&YGatZaa~=YfN-`s%jE07aTpR;SyHB4!{hAC4 zMk*HI;0*BAdGFr6^`wp4?Kb&NI&g7Cm)_o9^AGGNFoI%VPfw4jc?FCNYi@3y!ZDnO z?_@x5z`@nJ4))P+XjLj}U|?XfRCH7Tu`Iy;jN01TGMLj%PLlVaPY9a%Y08u-n?R>k zpiGa_9tB#wcyZbC<;xdh%y$GmdGcgIt``;-woIEg?IFg837*0|cDskx{jidqR6BX{GD>X`uK@bYsDZ`$gr73_F)_4p>{DSfC z(Whuxgx`MvP!UY}$XzJoSD7GF0>H%Lhrsm!u^bD1j%RA3OGX2841IvU!002Xq)H0^ zmMvQbRD@zT$^-)HnKNh3H*n^+;OIHzI(g1H^o#yP5b(SGctX7sF zK@rDUV_HB`p-WEUk0{2J)`b=ZW4_z4VMAEX(N$hvex{_PXL%{6IG(Al+)3olo4qGgCv#-CmD+% z;kn6o3jge{rti38C9UDGfT~Ve>)TOc3~H9y7eZvpcQ%yPLjXpU3>FBR8)-pArd++G z7;XS&z24N+RJeEV-f~2e47E6(#i>)L-a&SqBufNqA^;H9ty7VA(8(RIba-A05x|&T zyLSDI1!u^L(p;DoWJ^oSm)Eaf{}@jA2AviCfp|MS%#laxXcXi2TMK3NLco;QIFN#7BDu>c?g zyYz$?nIA?RK&KwJX4<|_J;^D)G!t3=8?st7YpSXSdb}Yw#ZVQ+v z4yc6&LDJBhgYs#8ICoNs)4Rtxw84tp+jAmxBuL^bDNc8%dKR1xG5CG zUe<>y^mmy4Wu83nXhaE5r$l`B78e&k<=7a}$lMn@oz6ClpMaXkbK$~;Z@C}lQOfk` z(|Iz{o@g_lHUOSbtXQ#PRcmYOM$q7OR+Jhoyx12UlBXDfICJzaTD0g3M4TftXU_DH zGE{^Fe7C5mXsi6V5ghJsWct^dEbTLreiYLuTcDz%Vu%K7YikX8vX?EJU2|G>4B0E2 zKcO$B@sUq`FVmZd_|O+5|6@5LKv*Kaxf$9VLG2hPG~5<=VLr2t0vHAGq5$|yfB^u# Wx+&S-3)D^k00008iR~bKcZnNt&roNC# zb_i3AmV(2EaNSCHywHq2%p*uk*rX;Bs9ROkHQNJCfzePZAflQ;+n_5V#SE>=`miY- zbn_m7c2Y+?t!s=xEL&R0wq&s%3N|?1y=xqs-*@~S=h}6g#3?G3>ged&*T?t%e&6@| z{+x5;C=?3fdVV>@b^f|R;99@5t8^U)8-qpz9~~8Q3Ow={3w%`Pt{DLZdL2fiZDeP&z!rC5G(Yw8r|wK768&b*47qSh_vpgo@d(3Z zl$poMS;9=4B9%!=A7H*PJjTh$w#XBadm|H=GKcXYdq{b;fq~ES`TSZ4D68K@z@tZ_ z;dnegD1qxP;rIH5?$)J0bWN9|@@0{sbH(?Wiy1LBJta)b6h5zSxUakKNbvK)874v0 zn+Co)u-!0>clUp9|L^hn113@z0R^6{zG3LV(2h6Xd2=6tyCrag0W)~=1SCX~DIRk; zYQ>|FnlVd6AUR0{ugP#Y{OE%_9!!w+`ycB6NqR2bMe|0U9cjh6G)t|n7*OCn{g3n? zN@vo&z80S_e1`Doo^s$CgVV&~QCqy5BxIZCZSzXWO`M}1(|WZ;nj37)J@;B{S>Ls{Gon$8h1c_j80&k^M$q*t1S2;Lqf5^jM1 zCC%yB*dg?rb>*psDrtE|1RTu1dGNsC1IbLX2>uhWyjHZl9S~j3Xf6`N`z*XNS<=5{ zg*?I|tT~I`%OIA)%%teIfj~ftBx7ZYafIv8+_j`pVy+`aerD>z)IJ1T(ekW!X;}u2 z^hoEkh==1K`Mm#D|KHgk1@>ZN;*G>TX+7PUnagzPmM+OC0(LKYnmy%#Unc=4Ti+c! z8GDQZ*5~srW*ED^@ew*6?g(@o^?JSUSIO%#2_Wwu!*LYGIFgu1JW2IJ&QzYT#Y$Nm z)!7TtcRJ;HN|h9BQW|<$VWQ7jZ;SU}=eEut0sIA={ujo7FfMWGGx>Ol&u8GBx4OH! zd(Am>vJ7CZJk>4-zLp0ZTu7P{e@*n0u91(6Qc(=p`d*LsrvU#e0>(LfVTr0)uopt4 z$?pT~ra*h3C_nrWcy)dI`+7VegEw{})($I#JT0EZ!o*f0>*L&T=Utt@X7H9x^Gjy4 z`04n^`@Yt99NDZ3Iyog|d8Q zlcx-nSM5RcSoCp_4|&==MX%bg%U)1{E6LO;A$c=oi7nDXwqhjR3acQfU-WPE&$8tg zD%$Est{shhZl32jgIj|$vUcdMl7&@DRe%+dD)L(u0S!5L6E$ZFw6uy=bTKl{b5&$h zDtd$89qgH!nffZebsH_l9}fTQ@DU2=J-hdOXX>4)$I%M~)7kWG_`VfjKP58~=1Sn! zqLk7(>L5xPZB+!E__me0N&;OLP&qLh-V**tl?&7L*6)01=Ye!8y<282YGN*?L(u(~ zMxGhD7az0m+?3cTrtv<;a#cRoP%FNWw$isCceR1UX598Y&SVR#t^-OwdQLBq;L4a} z%P&;)?^^uTxYx{>yQ%0=@VnNbK+T)fw1tL#Jk+)S(f!Xdpn@$~YBgOt#}nh9g=C6r0uFvk1VjYCz0DTb3spclY=oRP{pVLJp(`q4 zDX11xT(#z^0C~KZOeTxqZC9uE0P!@v%<{3Yl%?yb#CfuGDS&f}E334b_SxKQCz6YF zMa~;H8>hK9lE0U|O|zK2BYek6mPDb7xJL>+I(5xMl^t4U&EE)oI`BR(<_nc6o7WpnyvAO)(k&mY27w$1 zOu~Y#_98=8rQ_I{vHJk@Z`|kPZSJ=K^j(adoKhVO+OlPnLPf*49s#};*LLpRxA!kR z&$QK#d_5kRhmPMUHCMJl@<3MkGE!bETdbkN3v}~;WBe22BDWfsD$=fl4cI*N!=cDn zeC*{@XHLD;cYogtl&x_7V?r)pJTp zK<@qk7d%|8siHJV`F`TU#NNSg4U*nJ$}VqQVh!tL;4b!B3##*zv^t~f$o>emf(A8t zXjKH_Xm&Y+)J&tKnBMKZe}sk3skWfZ3n*5|Hg1qOi1uMH@mk_mCPDz$vz1kLq0bvg z+oR8ohI+btV(5puXm^9!>auh~)gSlk@OS)zrMP4eFSjowgADD#W(3&_w7f*0B7Gw( zD+wHJLMD?D$(bb8h%BUVJaSj$`R@C=uUHd9Zug*(>%{ynx-w~A)(f`2+8p2-a&FJV zd%8Ihm`jmZj(~#$bVKy%=q}v&2eL!Vrb|7JI@0;n#gsr3r&^9IrD0XgX;(s-gsd*R zT+IfaucbBzkfOKo#=u;yWz9-<=A3F%D|$5g7=ZLbw}P@$X>F`_6jYzYTO+h>D3h07 zTt5>y*&8u%dnJ;Vck47K3+;a$%hWT}xmGEBb!{zbB@)M?hpdd%OI;~>V#y{@*p`R3 zo~pDowE;KRnQA{tfq&HoK3`KJ_3Vv~o*3N$sqBN5-EwcoEZ>zYYddl^YCf&(+%CC2 z2}w;NeSRC@|Flx@YucSYb^25|HIo`dP>0|VVP&ndP1~A#JDMozoeCJz=y34%;1Otk znp=|LW!p$OU=*BDlcK;Ko_?6EG@+-D# zozID{ctVr-bD}*tos2+M@(B&4+$z7DL=3zQ%fB871YUwKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000Q?Nklo5~yu|sWXQ3zH?)hN`}Mc?Ix*e*>f~ zI)DZpE|&X&`|X{--}$qAA%B-CCh4{`k`%-cFhC4Jp%4TB6)2Qa{COaQU!;*Yx>Tc6qbJ2NobQ>`iN78@}H5vc~Di3tYy_?Ur-j~~7W z!c!UjXcSdalk0xC?$N%x`wjx*8btZa01(CeRY2Ru`#1gxXiulpVaOO3dZRIoaN!~n zg$zn5K!d@=4}1t<^rKOV#p2|;JJxOLySwjIeG+FcC9#cpcHac9-ulGWZGPalcdY2Z zvaIT^n_?m&(HJpJ)5T!YpYT_yK((uqN{AA?z^l%bS&_kY-NfLlgHL5L88>r7M%B=5 zT>->_=3US2y50T6y(_&u-1%tnb}~#@$8q+iThlM5T2serb}|kmbMNKu&7aIaXe&FR zl)?{uOvA)!b10UI?fd??@1ZB3dh+Kr30=9^f;4C1=5o0QY|F-Ov9ZLe?mPyQU7cMI zXM3{SQ?02(z~6yWdi(?Uxa+2_-`;%d&G%q%A__Mj9}ywlmc~2n{m4D;UZ+pGv7S<* z5m#hX3XJJRpIewJIwXAHGi#Z3 zEZvs=l^^)CCb4ZB&-2y-NgZ~vdI2y1@jS275-a3)Lm`IXE1%4Y%!_)5&zy(H%R0V` z*;}#)l~O077Yc=yv;f+52-OupBhZARo#yZh2{c6-jAU-e9J_!b6oHr!k++mms6Zh> zNC>8Ba$x^~9=&OG0}ulmF-X{=*oH{rEw)>yPaHy0_{ME+!cl>{>Dgax6yv-_x? zp>6;I;H-$aDhOj0wAxfEv2(}HdjU%unTGRth$djk&>KT5-BWH4$(k8L5M!y<)R?B? zx&rXisq{OMD2pbvk`}pK?m_psy8^hnri#YqsODDz*X-K8>roL2J%dhST~iL%n4G!+ zm;wC04SlbOA!CuwkBX0oB(^`ZeaGnW(Urh8dXc7Ha8r$IYXRCeJ-q3c-niG}EOUrL zQjCz6J2D+F>FOQSJBfY3bCx^1XPrwZ-~ig6{>9UO*!A45eqcH94Gks*Tnk(`^v2LF z8}Hw^!!5XLoRovuHKY*A@59-i?E5u~zbG1=%MUaHOMteWJ9h5JpgrR7$Zffc_S;__-&&zV}=GF}7hJT|16@mytZ4`03KOH(Q z6=+XvgkfUF%_?0+emTmgd_Ipi?nUlxvVVR5PX;y&ysll^nT3LA+_r7od=<0|Ogq;) zg;*svS~^p@(P%L2pd6s4R261C7AGE$V=giY76q7blXzpiYW8JuI07TUm@)_mXl`z% zWl0ONL{L+zY2>|;+u{xJW0{qie`;1*kja@3K&_UUa;|kgZLwPpl~k!IZp7QgkS3#S zgs0G;&#Me^BMuE9i-lw|Nz2j}?38`@#&6!Z+xy(>R%O)`1VNa(jbJV^NiIn;Gd0un z_Iq!yi4*_uLO{e8*j}$zRKO|}3fCPSJ$g^ESX_&uJ<5w(4J9IDmRN`FHv6TnRbB4` z=7Etwydm>_@S)ULQ!{mJ%?%UkAzS_B%H=GvggvvE4RHag>f2C5XkAWS4nR_?a zQ`=fhFHaw}mRVzZ@`&e`jD9j|`x8E<8Fng6%rJ*^_afDr0!X~D_k~|8)aHTp1Lp-1 zyNC;pSWQzmu7`0>Z#2*$FkQp*N%y$Ba?jp9e-V+;=ui7$qECY#*DaW7pTemEUeTNE zU*G@Oz=na>=IbGyF9+s3k!X=o6ZcHb@b&kz8oKsUdn&#te(dzv>Dw@9ip|9Er+tEW zfH`gAmqS1zLMbRUjSP>hnVFh7()pdvlXKOGOT8b6m}=&ncKW&UxS|(O%=Tno?_S;g zm>4oyZ5B*_(aH0teJ~)MN+U^048A_NMJr(Aa$j&%jefQ#JJ_A=-Yg=MwrzjWhKyR2 zIy=+L(@0V}=d+yu>l>OG9b)6z?`98nukPL~hD_Scc2#frghkPeo7l}ZnH8B=_34$b zlq;q$K=fn}R!<@V5t*H&AW1pVe|P_O-D?W!#X|LZ8ucyDvZ2F6y~FPeKdY2VD5a33 zU?r^+ciwU5L#fu(Q7!iV>nX%8^F46{V(HM~q3^jT-7P3OF&OE+wfE6fYwAP2__K3` zQ0xl0=x)^ZG^ve{p?7;icmB@K*TRWiAvg66R5fg*s;XM3Tn{aD#Xeu()PD`&{~f@8 Z1^|1O+t!kG2OaPx#24YJ`L;!dIcmQ}b-O!f+000SaNLh0L01ejw01ejxLMWSf00007bV*G`2ipM) z3LYyfCabgn011#uL_t(&-tAdUY#YZF{$^&myWAydQkE!+Qe@hS!?<%Xfzsl`0(N1XJ%$Tt=H=?4C8wbAGr7d_La=N-2hhh9HU}1VMmp z+k1sVVa+s6>$vF9g;W7pZJ&vZu?fH5A5atp&iT1qZp82RL)Ufax(>^-4)=fq4^b5R z2qEzKd|-?L0G5`P{+vi8zA_BMHcivHjmArh>4XSlV`IM!hr^$bjEpoP>-YQ5DvA=2 zWw|JdViQJ3LI?m61fi+CuInh5%U|vjY}g?c=X`7bHiq|qzP0~1;@UEM#AiLOa|@A3 zr01pHLh{a-y zi9}*D8ja$WS6<>PU2121w zmN8ZqMe&=r-+mj6v5sdSCiJ+>*q+8WH#f1kxEQc)yDyW;e5Pp{e)!=BB$G+SFpO9# zl|rdh!qn8%)oeB^>$)DFpPvWk95-&<7~k95lPi_V2lwvX!?S14Fg-mzP^;Dag+k$z zR4Ua1**5Q+opd}FLhf6zZ5y#z46-aEnM@*`PNP&R;mVaOux%Ub>+4urT7qR+c;}sW zu)Dj9TrP+C`FVIe9>n8uXqtv{xs27-RrL4wRXq1OSA&iWSEUvGwPYwPgkWmzqCkxK{5{n@b)YA3O?GMNlQp->4x zPEnNa$HvA`sZ`+i`)i!@N8xZ7vMd9@j3h}qfV-okquAQof}$v^9*;*Sgv^eQk7HwF z1HoW0O9&|og7D3iD_5GNZ9m(APY)5MJ%H^!emdnQ*Zl@IRRxr0KXfa&S! zfoiqt&*$@>B$LS&1KPdcDf0`*mA36Xh{a;?dc8;_5=f`hC>D!|$K$Xp3u|j@SXx?w zVHhnOxPALJ1VO;%%a@^P8Y-0vR#sLJ4u=to#hM(@G!3JpqX$Cw{F-*I)J-lV`JFf z-iE5GM{;0dVxk#FkLtp@GN63}=lS8ohgeux2w0ZY!h!Ymbp=3ddwUyxzaPuX%UAdI z_GHd^Jef=)8jWIpetx`Kt;)4p?Stjz<>aba4)ZIvFH%V}Kh%=g*&q*Xu_JCu+g9i_A`}XaRCnhHF z^yyP-9P;%Yq;X z@Or(lZCerqp_xNE+!g~MxD-oEk_3;(GeRkKrX8Xz%Rg~9?)zsO&jlgQIqLQLzr9}X z&z;RErI2O$>#?!1ubpnGu!Fm%DT7v?!%;ZoShA27?F&gG~?Y?(VKymSwe%R62Tqa}GiX78e&+ z`}+DGJbn7~!tn4g2q8Fo_AGjOdSF==oU-?&Pn%r^0zkQ3ez3N-_JzC6bcfkPA!Jz= zR#sLFH^1>NM9cVK#K=5P=YaMx*g~adGjlhG7&MjRtgGhiRHEXR@O< zsaC7V=ktGLj7@URgN!kSQcAi>FfTCR<&8#TC!f#%Yj$?_m-&4DX02AU%H=Yu)hcvd zZ}9**%m6|N7-NuS8LFzn=kp;H3JI#JUZ#}Flv3|WK*%r*tzNHh+P1BmrfKQAj!LBh z#{h?u%}K>kt|Wv&5Clk)1X-5h^?D(SBHZ(tlX|&fSr!b#K%>z>tyV+5UOzA^>gxS~ z;|W0!nln;2$zHY*?PDCnFkl!)OW^3*fc9aMqxk=0yxwWB)+uO^=ZOrRZu}%Xa9C^m mLNEDFQt57uIh9j60r?-K@g@`v{uRUk0000 + + + + + + diff --git a/src/android/res/layout/file_selector_footer.xml b/src/android/res/layout/file_selector_footer.xml new file mode 100644 index 0000000..101e2dd --- /dev/null +++ b/src/android/res/layout/file_selector_footer.xml @@ -0,0 +1,33 @@ + + + + +