From 1205c909aa9905092a195168fa6dedaa3ae17b4e Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Sat, 9 Apr 2016 20:04:05 +0300 Subject: [PATCH] 3300b10 --- autoconf.cpp | 90 +++++++- cfgfile.cpp | 14 +- drawing.cpp | 20 +- expansion.cpp | 7 +- filesys.asm | 205 +++++++++++++---- filesys.cpp | 9 + filesys_bootrom.cpp | 346 +++++++++++++++------------- ide.cpp | 2 +- include/autoconf.h | 3 + include/keyboard.h | 5 +- include/uae/ppc.h | 1 + main.cpp | 17 +- od-win32/picasso96_win.cpp | 8 +- od-win32/resources/resource.h | 1 + od-win32/resources/winuae.rc | 1 + od-win32/win32.h | 4 +- od-win32/win32_scaler.cpp | 4 +- od-win32/win32gfx.cpp | 68 ++++-- od-win32/win32gui.cpp | 50 +++- od-win32/winuaechangelog.txt | 16 ++ ppc/ppc.cpp | 38 +++- traps.cpp | 416 +++++++++++++++++----------------- 22 files changed, 853 insertions(+), 472 deletions(-) diff --git a/autoconf.cpp b/autoconf.cpp index 2f89e292..c5a507b4 100644 --- a/autoconf.cpp +++ b/autoconf.cpp @@ -24,6 +24,7 @@ #include "threaddep/thread.h" #include "native2amiga.h" #include "inputdevice.h" +#include "uae/ppc.h" /* Commonly used autoconfig strings */ @@ -38,6 +39,7 @@ uae_sem_t hardware_trap_event[RTAREA_TRAP_DATA_SIZE / RTAREA_TRAP_DATA_SLOT_SIZE uae_sem_t hardware_trap_event2[RTAREA_TRAP_DATA_SIZE / RTAREA_TRAP_DATA_SLOT_SIZE]; static uaecptr rt_trampoline_ptr, trap_entry; +static bool rtarea_write_enabled; extern volatile uae_atomic hwtrap_waiting; extern volatile int trap_mode; @@ -181,6 +183,8 @@ static uae_u32 REGPARAM2 rtarea_bget (uaecptr addr) static bool rtarea_write(uaecptr addr) { + if (rtarea_write_enabled) + return true; if (addr >= RTAREA_WRITEOFFSET) return true; if (addr >= RTAREA_SYSBASE && addr < RTAREA_SYSBASE + 4) @@ -268,6 +272,7 @@ static void REGPARAM2 rtarea_wput (uaecptr addr, uae_u32 value) } } } + static void REGPARAM2 rtarea_lput (uaecptr addr, uae_u32 value) { addr &= 0xffff; @@ -374,17 +379,96 @@ uae_u32 ds_bstr_ansi (const uae_char *str) return addr (rt_straddr) >> 2; } +#define MAX_ABSOLUTE_ROM_ADDRESS 1024 + +static int absolute_rom_address; +static uaecptr absolute_rom_addresses[MAX_ABSOLUTE_ROM_ADDRESS]; +static uaecptr rombase_new; + +void save_rom_absolute(uaecptr addr) +{ + if (rombase_new) + return; + if (absolute_rom_address >= MAX_ABSOLUTE_ROM_ADDRESS) { + write_log(_T("MAX_ABSOLUTE_ROM_ADDRESS is too low!")); + abort(); + } + for (int i = 0; i < absolute_rom_address; i++) { + if (absolute_rom_addresses[i] == addr) { + write_log(_T("Address %08x already added\n"), addr); + return; + } + } + absolute_rom_addresses[absolute_rom_address++] = addr; +} + +void add_rom_absolute(uaecptr addr) +{ + uaecptr h = here(); + dl(addr); + save_rom_absolute(h); +} + +uae_u32 boot_rom_copy(TrapContext *ctx, uaecptr rombase, int mode) +{ + uaecptr reloc = 0; + if (currprefs.uaeboard < 3) + return 0; + if (!mode) { + rtarea_write_enabled = true; + protect_roms(false); + rombase_new = rombase; + int size = 4 + 2 + 4; + for (int i = 0; i < absolute_rom_address; i++) { + uae_u32 a = absolute_rom_addresses[i]; + if (a >= rtarea_base && a < rtarea_base + 0x10000) { + size += 2; + } else { + size += 4; + } + } + reloc = uaeboard_alloc_ram(size); + uae_u8 *p = uaeboard_map_ram(reloc); + put_long_host(p, rtarea_base); + p += 4; + for (int i = 0; i < absolute_rom_address; i++) { + uae_u32 a = absolute_rom_addresses[i]; + if (a >= rtarea_base && a < rtarea_base + 0x10000) { + put_word_host(p, a & 0xffff); + p += 2; + } + } + put_word_host(p, 0); + p += 2; + for (int i = 0; i < absolute_rom_address; i++) { + uae_u32 a = absolute_rom_addresses[i]; + if (a < rtarea_base || a >= rtarea_base + 0x10000) { + put_long_host(p, a); + p += 4; + } + } + put_long_host(p, 0); + write_log(_T("ROMBASE %08x RAMBASE %08x RELOC %08x (%d)\n"), rtarea_base, rombase, reloc, absolute_rom_address); + } else { + rtarea_write_enabled = false; + protect_roms(true); + write_log(_T("ROMBASE changed.\n"), absolute_rom_address); + reloc = 1; + } + return reloc; +} + void calltrap (uae_u32 n) { if (currprefs.uaeboard > 2) { dw(0x4eb9); // JSR rt_trampoline_ptr - dl(rt_trampoline_ptr); + add_rom_absolute(rt_trampoline_ptr); uaecptr a = here(); org(rt_trampoline_ptr); dw(0x3f3c); // MOVE.W #n,-(SP) dw(n); dw(0x4ef9); // JMP rt_trampoline_entry - dl(trap_entry); + add_rom_absolute(trap_entry); org(a); rt_trampoline_ptr += 3 * 2 + 1 * 4; } else { @@ -462,6 +546,8 @@ void rtarea_init(void) rt_trampoline_ptr = rtarea_base + RTAREA_TRAMPOLINE; trap_entry = 0; + absolute_rom_address = 0; + rombase_new = 0; init_traps (); diff --git a/cfgfile.cpp b/cfgfile.cpp index b26d7ce0..9a22e2d2 100644 --- a/cfgfile.cpp +++ b/cfgfile.cpp @@ -196,7 +196,7 @@ static const TCHAR *joyportmodes[] = { _T(""), _T("mouse"), _T("mousenowheel"), static const TCHAR *joyaf[] = { _T("none"), _T("normal"), _T("toggle"), _T("always"), 0 }; static const TCHAR *epsonprinter[] = { _T("none"), _T("ascii"), _T("epson_matrix_9pin"), _T("epson_matrix_24pin"), _T("epson_matrix_48pin"), 0 }; static const TCHAR *aspects[] = { _T("none"), _T("vga"), _T("tv"), 0 }; -static const TCHAR *vsyncmodes[] = { _T("false"), _T("true"), _T("autoswitch"), 0 }; +static const TCHAR *vsyncmodes[] = { _T("adaptive"), _T("false"), _T("true"), _T("autoswitch"), 0 }; static const TCHAR *vsyncmodes2[] = { _T("normal"), _T("busywait"), 0 }; static const TCHAR *filterapi[] = { _T("directdraw"), _T("direct3d"), 0 }; static const TCHAR *dongles[] = @@ -1571,9 +1571,9 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type) cfgfile_write (f, _T("gfx_backbuffers_rtg"), _T("%d"), p->gfx_apmode[1].gfx_backbuffers); if (p->gfx_apmode[APMODE_NATIVE].gfx_interlaced) cfgfile_write_bool (f, _T("gfx_interlace"), p->gfx_apmode[APMODE_NATIVE].gfx_interlaced); - cfgfile_write_str (f, _T("gfx_vsync"), vsyncmodes[p->gfx_apmode[0].gfx_vsync]); + cfgfile_write_str (f, _T("gfx_vsync"), vsyncmodes[p->gfx_apmode[0].gfx_vsync + 1]); cfgfile_write_str (f, _T("gfx_vsyncmode"), vsyncmodes2[p->gfx_apmode[0].gfx_vsyncmode]); - cfgfile_write_str (f, _T("gfx_vsync_picasso"), vsyncmodes[p->gfx_apmode[1].gfx_vsync]); + cfgfile_write_str (f, _T("gfx_vsync_picasso"), vsyncmodes[p->gfx_apmode[1].gfx_vsync + 1]); cfgfile_write_str (f, _T("gfx_vsyncmode_picasso"), vsyncmodes2[p->gfx_apmode[1].gfx_vsyncmode]); cfgfile_write_bool (f, _T("gfx_lores"), p->gfx_resolution == 0); cfgfile_write_str (f, _T("gfx_resolution"), lorestype1[p->gfx_resolution]); @@ -2813,13 +2813,17 @@ static int cfgfile_parse_host (struct uae_prefs *p, TCHAR *option, TCHAR *value) return 1; } if (_tcscmp (option, _T("gfx_vsync")) == 0) { - if (cfgfile_strval (option, value, _T("gfx_vsync"), &p->gfx_apmode[APMODE_NATIVE].gfx_vsync, vsyncmodes, 0) >= 0) + if (cfgfile_strval (option, value, _T("gfx_vsync"), &p->gfx_apmode[APMODE_NATIVE].gfx_vsync, vsyncmodes, 0) >= 0) { + p->gfx_apmode[APMODE_NATIVE].gfx_vsync--; return 1; + } return cfgfile_yesno (option, value, _T("gfx_vsync"), &p->gfx_apmode[APMODE_NATIVE].gfx_vsync); } if (_tcscmp (option, _T("gfx_vsync_picasso")) == 0) { - if (cfgfile_strval (option, value, _T("gfx_vsync_picasso"), &p->gfx_apmode[APMODE_RTG].gfx_vsync, vsyncmodes, 0) >= 0) + if (cfgfile_strval (option, value, _T("gfx_vsync_picasso"), &p->gfx_apmode[APMODE_RTG].gfx_vsync, vsyncmodes, 0) >= 0) { + p->gfx_apmode[APMODE_RTG].gfx_vsync--; return 1; + } return cfgfile_yesno (option, value, _T("gfx_vsync_picasso"), &p->gfx_apmode[APMODE_RTG].gfx_vsync); } if (cfgfile_strval (option, value, _T("gfx_vsyncmode"), &p->gfx_apmode[APMODE_NATIVE].gfx_vsyncmode, vsyncmodes2, 0)) diff --git a/drawing.cpp b/drawing.cpp index 5a78aaef..001ce471 100644 --- a/drawing.cpp +++ b/drawing.cpp @@ -1743,7 +1743,7 @@ static void pfield_set_linetoscr (void) switch (gfxvidinfo.drawbuffer.pixbytes) { case 2: pfield_do_linetoscr_normal = need_genlock_data ? linetoscr_16_stretch2_aga_genlock : linetoscr_16_stretch2_aga; - pfield_do_linetoscr_sprite = need_genlock_data ? linetoscr_16_stretch2_aga_spr_genlock : linetoscr_16_stretch2_aga_spr_genlock; + pfield_do_linetoscr_sprite = need_genlock_data ? linetoscr_16_stretch2_aga_spr_genlock : linetoscr_16_stretch2_aga_spr; pfield_do_linetoscr_spriteonly = linetoscr_16_stretch2_aga_spronly; break; case 4: @@ -2012,12 +2012,13 @@ static void init_ham_decoding (void) } else { /* AGA mode HAM6 */ while (unpainted_amiga-- > 0) { int pv = pixdata.apixels[ham_decode_pixel++] ^ bplxor; + uae_u32 pc = ((pv & 0xf) << 0) | ((pv & 0xf) << 4); switch (pv & 0x30) { case 0x00: ham_lastcolor = colors_for_drawing.color_regs_aga[pv] & 0xffffff; break; - case 0x10: ham_lastcolor &= 0xFFFF00; ham_lastcolor |= (pv & 0xF) << 4; break; - case 0x20: ham_lastcolor &= 0x00FFFF; ham_lastcolor |= (pv & 0xF) << 20; break; - case 0x30: ham_lastcolor &= 0xFF00FF; ham_lastcolor |= (pv & 0xF) << 12; break; + case 0x10: ham_lastcolor &= 0xFFFF00; ham_lastcolor |= pc << 0; break; + case 0x20: ham_lastcolor &= 0x00FFFF; ham_lastcolor |= pc << 16; break; + case 0x30: ham_lastcolor &= 0xFF00FF; ham_lastcolor |= pc << 8; break; } } } @@ -2071,12 +2072,13 @@ static void decode_ham (int pix, int stoppos, bool blank) } else { /* AGA mode HAM6 */ while (todraw_amiga-- > 0) { int pv = pixdata.apixels[ham_decode_pixel] ^ bplxor; + uae_u32 pc = ((pv & 0xf) << 0) | ((pv & 0xf) << 4); switch (pv & 0x30) { case 0x00: ham_lastcolor = colors_for_drawing.color_regs_aga[pv] & 0xffffff; break; - case 0x10: ham_lastcolor &= 0xFFFF00; ham_lastcolor |= (pv & 0xF) << 4; break; - case 0x20: ham_lastcolor &= 0x00FFFF; ham_lastcolor |= (pv & 0xF) << 20; break; - case 0x30: ham_lastcolor &= 0xFF00FF; ham_lastcolor |= (pv & 0xF) << 12; break; + case 0x10: ham_lastcolor &= 0xFFFF00; ham_lastcolor |= pc << 0; break; + case 0x20: ham_lastcolor &= 0x00FFFF; ham_lastcolor |= pc << 16; break; + case 0x30: ham_lastcolor &= 0xFF00FF; ham_lastcolor |= pc << 8; break; } ham_linebuf[ham_decode_pixel++] = ham_lastcolor; } @@ -4162,7 +4164,7 @@ void drawing_init (void) int isvsync_chipset (void) { - if (picasso_on || !currprefs.gfx_apmode[0].gfx_vsync || (currprefs.gfx_apmode[0].gfx_vsync == 0 && !currprefs.gfx_apmode[0].gfx_fullscreen)) + if (picasso_on || currprefs.gfx_apmode[0].gfx_vsync <= 0 || (currprefs.gfx_apmode[0].gfx_vsync <= 0 && !currprefs.gfx_apmode[0].gfx_fullscreen)) return 0; if (currprefs.gfx_apmode[0].gfx_vsyncmode == 0) return 1; @@ -4173,7 +4175,7 @@ int isvsync_chipset (void) int isvsync_rtg (void) { - if (!picasso_on || !currprefs.gfx_apmode[1].gfx_vsync || (currprefs.gfx_apmode[1].gfx_vsync == 0 && !currprefs.gfx_apmode[1].gfx_fullscreen)) + if (!picasso_on || currprefs.gfx_apmode[1].gfx_vsync <= 0 || (currprefs.gfx_apmode[1].gfx_vsync <= 0 && !currprefs.gfx_apmode[1].gfx_fullscreen)) return 0; if (currprefs.gfx_apmode[1].gfx_vsyncmode == 0) return 1; diff --git a/expansion.cpp b/expansion.cpp index 9de97a21..d38204f9 100644 --- a/expansion.cpp +++ b/expansion.cpp @@ -1221,9 +1221,12 @@ static addrbank *expamem_map_uaeboard(void) { uaeboard_base = expamem_z2_pointer; uaeboard_ram_start = UAEBOARD_WRITEOFFSET; + uaeboard_bank.start = uaeboard_base; map_banks_z2(&uaeboard_bank, uaeboard_base >> 16, 1); - if (currprefs.uaeboard > 1) + if (currprefs.uaeboard > 1) { + rtarea_bank.start = uaeboard_base + 65536; map_banks_z2(&rtarea_bank, (uaeboard_base + 65536) >> 16, 1); + } return &uaeboard_bank; } @@ -1244,7 +1247,7 @@ static addrbank* expamem_init_uaeboard(int devnum) expamem_write(0x18, 0x00); /* ser.no. Byte 0 */ expamem_write(0x1c, 0x00); /* ser.no. Byte 1 */ - expamem_write(0x20, 0x00); /* ser.no. Byte 2 */ + expamem_write(0x20, currprefs.uaeboard); /* ser.no. Byte 2 */ expamem_write(0x24, 0x02); /* ser.no. Byte 3 */ uae_u8 *p = uaeboard_bank.baseaddr; diff --git a/filesys.asm b/filesys.asm index 06bd5168..ca078134 100644 --- a/filesys.asm +++ b/filesys.asm @@ -93,7 +93,7 @@ startjmp: bra.w filesys_mainloop ;1 16 dc.l make_dev-start ;2 20 dc.l filesys_init-start ;3 24 - dc.l 0 ;4 28 + dc.l moverom-start ;4 28 dc.l bootcode-start ;5 32 dc.l setup_exter-start ;6 36 dc.l bcplwrapper-start ;7 40 @@ -432,7 +432,7 @@ mountproc dc.l 0 moveq #2,d1 move.w #$FF48,d0 ; get new unit number - bsr.w getrtbase + bsr.w getrtbaselocal jsr (a0) move.l d0,d1 bmi.s .out @@ -498,7 +498,7 @@ exter_task_wait moveq #10,d7 EXTT_loop move.w #$FF50,d0 ; exter_int_helper - bsr.w getrtbase + bsr.w getrtbaselocal move.l d7,d0 jsr (a0) tst.l d0 @@ -554,7 +554,7 @@ EXTT_shellexec bsr.w createproc move.l d0,d1 move.w #$FF50,d0 ; exter_int_helper - bsr.w getrtbase + bsr.w getrtbaselocal moveq #20,d0 jsr (a0) bra.w EXTT_loop @@ -596,7 +596,7 @@ shellexecproc: .seproc1 move.w #$FF50,d0 ; exter_int_helper - bsr.w getrtbase + bsr.w getrtbaselocal moveq #21,d0 jsr (a0) ; a0 = command @@ -665,7 +665,7 @@ shellexecproc: move.l a4,sp move.w #$FF50,d0 ; exter_int_helper - bsr.w getrtbase + bsr.w getrtbaselocal moveq #22,d0 jsr (a0) @@ -679,7 +679,7 @@ heartbeatvblank: move.w #$FF38,d0 moveq #18,d1 - bsr.w getrtbase + bsr.w getrtbaselocal move.l d2,d0 move.l d3,d2 jsr (a0) @@ -790,7 +790,7 @@ setup_exter: move.w #$FF38,d0 moveq #4,d1 - bsr.w getrtbase + bsr.w getrtbaselocal jsr (a0) tst.l d0 beq.s .nomh @@ -1314,7 +1314,7 @@ make_dev: ; IN: A0 param_packet, D6: unit_no bsr.w getrtbase move.l (a0),a5 move.w #$FF28,d0 ; fill in unit-dependent info (filesys_dev_storeinfo) - bsr.w getrtbase + bsr.w getrtbaselocal move.l a0,a1 move.l (sp)+,a0 clr.l PP_FSSIZE(a0) ; filesystem size @@ -1352,7 +1352,7 @@ mountalways ; do not mount but we might need to load possible custom filesystem(s) move.l a0,a1 move.w #$FF20,d0 ; record in ui.startup (filesys_dev_remember) - bsr.w getrtbase + bsr.w getrtbaselocal jsr (a0) bra.s dont_mount @@ -1364,7 +1364,7 @@ do_mount: move.l a0,a1 move.l d0,a3 ; devicenode move.w #$FF20,d0 ; record in ui.startup (filesys_dev_remember) - bsr.w getrtbase + bsr.w getrtbaselocal jsr (a0) moveq #0,d0 move.l d0,8(a3) ; dn_Task @@ -1406,7 +1406,7 @@ nordbfs2: move.l d0,d1 move.w #$FF18,d0 ; update dn_SegList if needed (filesys_dev_bootfilesys) - bsr.w getrtbase + bsr.w getrtbaselocal jsr (a0) move.l d3,d0 @@ -1557,7 +1557,7 @@ addfsonthefly ; d1 = fs index clockreset: move.w #$ff58,d0 ; fsmisc_helper - bsr.w getrtbase + bsr.w getrtbaselocal moveq #3,d0 ; get time jsr (a0) move.l 168(a3),a1 @@ -1603,7 +1603,7 @@ filesys_mainloop_bcpl: move.l #12+20+(44+20+60+1)+3+4+4+4+(1+3)+4+4+4,d1 move.w #$FF40,d0 ; startup_handler - bsr.w getrtbase + bsr.w getrtbaselocal moveq #1,d0 jsr (a0) ; if d0 != 0, it becomes our memory space @@ -1653,7 +1653,7 @@ filesys_mainloop_bcpl: .got_bcpl move.w #$FF40,d0 ; startup_handler - bsr.w getrtbase + bsr.w getrtbaselocal moveq #0,d0 jsr (a0) move.l d0,d2 @@ -1710,7 +1710,7 @@ FSML_loop: beq.s .nodc ; call filesys_media_change_reply (pre) move.w #$ff58,d0 ; fsmisc_helper - bsr.w getrtbase + bsr.w getrtbaselocal moveq #1,d0 ; filesys_media_change_reply jsr (a0) tst.l d0 @@ -1720,7 +1720,7 @@ FSML_loop: clr.b 172(a3) ; call filesys_media_change_reply (post) move.w #$ff58,d0 ; fsmisc_helper - bsr.w getrtbase + bsr.w getrtbaselocal moveq #2,d0 ; filesys_media_change_reply jsr (a0) .nodc @@ -1761,7 +1761,7 @@ nonnotif ; It's a dummy packet indicating that some queued command finished. move.w #$FF50,d0 ; exter_int_helper - bsr.w getrtbase + bsr.w getrtbaselocal moveq #1,d0 jsr (a0) FSML_check_queue_other: @@ -1804,7 +1804,7 @@ FSML_FromDOS: FSML_DoCommand: bsr.b LockCheck ; Make sure there are enough locks for the C code to grab. move.w #$FF30,d0 ; filesys_handler - bsr.w getrtbase + bsr.w getrtbaselocal jsr (a0) tst.l d0 beq.b FSML_Reply @@ -1834,7 +1834,7 @@ FSML_ReplyOne2: bne.s FSML_ReplyOne3 ; Arghh.. we need more entries. (some buggy programs fail if eac_Entries = 0 with continue enabled) move.w #$ff58,d0 ; fsmisc_helper - bsr.w getrtbase + bsr.w getrtbaselocal moveq #0,d0 ; exall jsr (a0) bra.s .exaretry @@ -2213,7 +2213,7 @@ getgfxlimits: move.w MH_FOO_MOFFSET(a5),d2 move.w #$FF38,d0 moveq #1,d1 - bsr.w getrtbase + bsr.w getrtbaselocal jsr (a0) .nosend @@ -2259,7 +2259,7 @@ mousehack_task: ; send data structure address move.w #$FF38,d0 moveq #5,d1 - bsr.w getrtbase + bsr.w getrtbaselocal move.l a4,d0 jsr (a0) @@ -2274,7 +2274,7 @@ mousehack_task: moveq #5,d0 ;INTB_VERTB jsr -$00a8(a6) -mhloop +mhloop: move.l d6,d0 jsr -$013e(a6) ;Wait @@ -2356,7 +2356,7 @@ mhloop ;tell native side that mousehack is now active move.w #$FF38,d0 moveq #0,d1 - bsr.w getrtbase + bsr.w getrtbaselocal jsr (a0) bra.w mhloop .yestim @@ -2547,7 +2547,7 @@ mhloop jsr -$2a(a6) ;PeekQualifier move.l (sp)+,a6 and.w #$7fff,d0 - move.w d0,8(a2) ;ie_Qualifier + or.w d0,8(a2) ;ie_Qualifier .mhvpre36 bsr.w mhdoio @@ -2626,7 +2626,7 @@ clipboard_init: move.w #$FF38,d0 moveq #17,d1 - bsr.w getrtbase + bsr.w getrtbaselocal jsr (a0) btst #0,d0 beq.s .noclip @@ -2642,7 +2642,7 @@ clipboard_init: move.w #$FF38,d0 moveq #14,d1 - bsr.w getrtbase + bsr.w getrtbaselocal move.l a5,d0 jsr (a0) @@ -2660,7 +2660,7 @@ clipboard_init: clipkill move.w #$FF38,d0 moveq #10,d1 - bsr.w getrtbase + bsr.w getrtbaselocal jsr (a0) rts @@ -2718,7 +2718,7 @@ prefsread: bne.s .pr4 move.w #$FF38,d0 moveq #16,d1 - bsr.w getrtbase + bsr.w getrtbaselocal jsr (a0) .pr1 move.l d4,d1 @@ -2760,7 +2760,7 @@ clipboard_proc: move.w #$FF38,d0 moveq #13,d1 - bsr.w getrtbase + bsr.w getrtbaselocal jsr (a0) tst.l d0 beq.w clipdie @@ -2848,7 +2848,7 @@ cfversion move.w #$FF38,d0 moveq #15,d1 - bsr.w getrtbase + bsr.w getrtbaselocal jsr (a0) tst.l CLIP_WRITE_SIZE(a5) bne.s clipsignal @@ -2875,7 +2875,7 @@ clipsignal ;and notify host-side move.w #$FF38,d0 moveq #12,d1 - bsr.w getrtbase + bsr.w getrtbaselocal jsr (a0) tst.l d0 beq.s .nowrite @@ -2945,7 +2945,7 @@ clipread: jsr -$01c8(a6) ;DoIO move.w #$FF38,d0 moveq #11,d1 - bsr.w getrtbase + bsr.w getrtbaselocal move.l 32(a4),d0 jsr (a0) move.l a2,a1 @@ -2987,7 +2987,7 @@ consolehook: moveq #-1,d2 move.w #$FF38,d0 moveq #17,d1 - bsr.w getrtbase + bsr.w getrtbaselocal jsr (a0) btst #1,d0 beq.s .ch2 @@ -3006,7 +3006,7 @@ consolehook: move.l a0,a1 move.w #$FF38,d0 moveq #101,d1 - bsr.w getrtbase + bsr.w getrtbaselocal jsr (a0) moveq #1,d2 .ch1 @@ -3020,7 +3020,7 @@ chook: movem.l d0-d1/a0,-(sp) move.w #$FF38,d0 moveq #102,d1 - bsr.w getrtbase + bsr.w getrtbaselocal jsr (a0) movem.l (sp)+,d0-d1/a0 rts @@ -3043,7 +3043,7 @@ debuggerproc jsr -$0228(a6) ; OpenLibrary moveq #2,d1 move.w #$FF78,d0 - bsr.w getrtbase + bsr.w getrtbaselocal move.l a0,a2 moveq #1,d1 jsr (a0) ; debugger init @@ -3198,7 +3198,7 @@ bcplwrapper_start: move.l d2,d1 lea wb13ffspatches(pc),a1 move.w #$FF68,d0 - bsr.w getrtbase + bsr.w getrtbaselocal jsr (a0) jmp (a0) ;CopyMem() patches @@ -3643,11 +3643,140 @@ hw_multi: rts + ; this is called from external executable + +moverom: + ; a0 = ram copy + + move.l a0,a5 ; ram copy + + moveq #20,d7 + move.l 4.w,a6 + + jsr -$0084(a6) ;Forbid + + move.w #$FF38,d0 + bsr.w getrtbase + move.l a5,d2 + moveq #19,d1 + jsr (a0) + ;ROM is now write-enabled + ;d0 = temp space + tst.l d0 + beq.w .mov1 + move.l d0,a3 + move.l (a3)+,a4 ; ROM + + ; Copy ROM to RAM + move.l a4,a0 + move.l a5,a1 + move.w #65536/4-1,d0 +.mov5 + move.l (a0)+,(a1)+ + dbf d0,.mov5 + + move.l a5,d1 + sub.l a4,d1 + + ; Handle relocations from UAE side + + ; Relative + move.l a3,a0 +.mov7 + moveq #0,d0 + move.w (a0)+,d0 + beq.s .mov6 + lea 0(a4,d0.l),a1 + add.l d1,(a1) + lea 0(a5,d0.l),a1 + add.l d1,(a1) + bra.s .mov7 +.mov6 + + ; Absolute +.mov9 + moveq #0,d0 + move.l (a0)+,d0 + beq.s .mov8 + move.l d0,a1 + add.l d1,(a1) + bra.s .mov9 +.mov8 + + moveq #0,d0 + bsr.w getrtbase + lea getrtbase(pc),a1 + sub.l a0,a1 + + add.l a5,a1 + ; replace RAM copy relative getrtbase + ; fetch with absolute lea rombase,a0 + move.w #$41f9,(a1)+ + move.l a4,(a1)+ + ; and.l #$ffff,d0 + move.w #$0280,(a1)+ + move.l #$0000ffff,(a1)+ + ; add.l d0,a0; rts + move.l #$d1c04e75,(a1) + + ; redirect some commonly used + ; functions to RAM code + lea moveromreloc(pc),a0 +.mov3 + moveq #0,d0 + move.w (a0)+,d0 + beq.s .mov2 + add.w #8+4,d0 + lea 0(a4,d0.l),a1 + ; JMP xxxxxxxx + move.w #$4ef9,(a1)+ + lea 0(a5,d0.l),a2 + move.l a2,(a1) + bra.s .mov3 +.mov2 + + cmp.w #36,20(a6) + bcs.s .mov4 + jsr -$27c(a6) ; CacheClearU +.mov4 + + ; Tell UAE that all is done + ; Re-enables write protection + move.w #$FF38,d0 + bsr.w getrtbase + move.l a5,d2 + moveq #20,d1 + jsr (a0) + moveq #0,d7 + +.mov1 + jsr -$008a(a6) + + move.l d7,d0 + rts + +moveromreloc: + dc.w FSML_loop-start + dc.w mhloop-start + dc.w kaint-start + dc.w trap_task_wait-start + dc.w exter_task_wait-start + dc.w 0 + + cnop 0,4 +getrtbaselocal: + lea start-8-4(pc),a0 + and.l #$FFFF,d0 + add.l d0,a0 + rts + cnop 0,4 getrtbase: lea start-8-4(pc),a0 and.l #$FFFF,d0 add.l d0,a0 rts + nop + nop inp_dev: dc.b 'input.device',0 tim_dev: dc.b 'timer.device',0 diff --git a/filesys.cpp b/filesys.cpp index f3387d90..80b29f84 100644 --- a/filesys.cpp +++ b/filesys.cpp @@ -8674,12 +8674,21 @@ static uae_u32 REGPARAM2 mousehack_done (TrapContext *ctx) v |= 1; if (consolehook_activate()) v |= 2; + if (currprefs.uaeboard > 2) + v |= 4; trap_dos_active(); return v; } else if (mode == 18) { put_long_host(rtarea_bank.baseaddr + RTAREA_EXTERTASK, trap_get_dreg(ctx, 0)); put_long_host(rtarea_bank.baseaddr + RTAREA_TRAPTASK, trap_get_dreg(ctx, 2)); return rtarea_base + RTAREA_HEARTBEAT; + } else if (mode == 19) { + // boot rom copy + // d2 = ram address + return boot_rom_copy(ctx, trap_get_dreg(ctx, 2), 0); + } else if (mode == 20) { + // boot rom copy done + return boot_rom_copy(ctx, trap_get_dreg(ctx, 2), 1); } else if (mode == 101) { consolehook_ret(ctx, trap_get_areg(ctx, 1), trap_get_areg(ctx, 2)); } else if (mode == 102) { diff --git a/filesys_bootrom.cpp b/filesys_bootrom.cpp index 5dedb8ba..4607524d 100644 --- a/filesys_bootrom.cpp +++ b/filesys_bootrom.cpp @@ -1,10 +1,10 @@ db(0x00); db(0x00); db(0x00); db(0x10); db(0x00); db(0x00); db(0x00); db(0x00); db(0x60); db(0x02); db(0x00); db(0x0b); db(0x60); db(0x00); db(0x0d); db(0xc6); db(0x00); db(0x00); db(0x0b); db(0x2c); db(0x00); db(0x00); db(0x00); db(0xa8); - db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x2c); + db(0x00); db(0x00); db(0x20); db(0x86); db(0x00); db(0x00); db(0x00); db(0x2c); db(0x00); db(0x00); db(0x05); db(0x86); db(0x00); db(0x00); db(0x1c); db(0x8c); db(0x00); db(0x00); db(0x00); db(0x64); db(0x00); db(0x00); db(0x1c); db(0xe8); - db(0x00); db(0x00); db(0x1d); db(0x3a); db(0x43); db(0xfa); db(0x21); db(0x79); + db(0x00); db(0x00); db(0x1d); db(0x3a); db(0x43); db(0xfa); db(0x22); db(0x57); db(0x4e); db(0xae); db(0xff); db(0xa0); db(0x20); db(0x40); db(0x20); db(0x28); db(0x00); db(0x16); db(0x20); db(0x40); db(0x4e); db(0x90); db(0x4e); db(0x75); db(0x00); db(0x00); db(0x00); db(0x07); db(0x00); db(0x00); db(0x00); db(0x00); @@ -12,21 +12,21 @@ db(0x60); db(0x00); db(0x0d); db(0x7c); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x01); db(0x00); db(0x00); db(0x00); db(0x04); db(0x00); db(0x00); db(0x00); db(0x02); db(0x48); db(0xe7); db(0x3f); db(0x3e); - db(0x2c); db(0x78); db(0x00); db(0x04); db(0x43); db(0xfa); db(0x21); db(0x57); + db(0x2c); db(0x78); db(0x00); db(0x04); db(0x43); db(0xfa); db(0x22); db(0x35); db(0x70); db(0x00); db(0x4e); db(0xae); db(0xfd); db(0xd8); db(0x22); db(0x00); - db(0x30); db(0x3c); db(0x3f); db(0xf8); db(0x61); db(0x00); db(0x20); db(0x08); - db(0x20); db(0x81); db(0x43); db(0xfa); db(0x21); db(0x2f); db(0x70); db(0x00); + db(0x30); db(0x3c); db(0x3f); db(0xf8); db(0x61); db(0x00); db(0x20); db(0xe2); + db(0x20); db(0x81); db(0x43); db(0xfa); db(0x22); db(0x0d); db(0x70); db(0x00); db(0x4e); db(0xae); db(0xfd); db(0xd8); db(0x22); db(0x00); db(0x30); db(0x3c); - db(0x3f); db(0xf4); db(0x61); db(0x00); db(0x1f); db(0xf2); db(0x20); db(0x81); + db(0x3f); db(0xf4); db(0x61); db(0x00); db(0x20); db(0xcc); db(0x20); db(0x81); db(0x61); db(0x00); db(0x16); db(0x58); db(0x61); db(0x00); db(0x1a); db(0x20); db(0x4c); db(0xdf); db(0x7c); db(0xfc); db(0x70); db(0x00); db(0x4e); db(0x75); db(0x48); db(0xe7); db(0xff); db(0xfe); db(0x2c); db(0x78); db(0x00); db(0x04); - db(0x30); db(0x3c); db(0xff); db(0xec); db(0x61); db(0x00); db(0x1f); db(0xd0); + db(0x30); db(0x3c); db(0xff); db(0xec); db(0x61); db(0x00); db(0x20); db(0xaa); db(0x2a); db(0x50); db(0x7a); db(0x00); db(0x70); db(0x00); db(0x0c); db(0x6e); db(0x00); db(0x21); db(0x00); db(0x14); db(0x65); db(0x1c); db(0x43); db(0xfa); - db(0x21); db(0x0e); db(0x70); db(0x24); db(0x7a); db(0x01); db(0x4e); db(0xae); + db(0x21); db(0xec); db(0x70); db(0x24); db(0x7a); db(0x01); db(0x4e); db(0xae); db(0xfd); db(0xd8); db(0x4a); db(0x80); db(0x66); db(0x0c); db(0x43); db(0xfa); - db(0x20); db(0xfe); db(0x70); db(0x00); db(0x7a); db(0x00); db(0x4e); db(0xae); + db(0x21); db(0xdc); db(0x70); db(0x00); db(0x7a); db(0x00); db(0x4e); db(0xae); db(0xfd); db(0xd8); db(0x28); db(0x40); db(0xc9); db(0x4e); db(0x20); db(0x0e); db(0x67); db(0x3c); db(0x08); db(0x2d); db(0x00); db(0x04); db(0x01); db(0x13); db(0x66); db(0x34); db(0x4e); db(0xae); db(0xff); db(0xd0); db(0x4a); db(0x80); @@ -54,21 +54,21 @@ db(0x00); db(0x22); db(0x00); db(0x14); db(0x65); db(0x6e); db(0x78); db(0x03); db(0x0c); db(0x6e); db(0x00); db(0x24); db(0x00); db(0x14); db(0x65); db(0x04); db(0x00); db(0x44); db(0x01); db(0x00); db(0x30); db(0x3c); db(0xff); db(0x80); - db(0x61); db(0x00); db(0x1e); db(0xcc); db(0x4e); db(0x90); db(0x2a); db(0x00); + db(0x61); db(0x00); db(0x1f); db(0xa6); db(0x4e); db(0x90); db(0x2a); db(0x00); db(0x20); db(0x49); db(0x20); db(0x01); db(0x67); db(0x0c); db(0x22); db(0x04); - db(0x74); db(0xfb); db(0x43); db(0xfa); db(0x20); db(0x30); db(0x4e); db(0xae); + db(0x74); db(0xfb); db(0x43); db(0xfa); db(0x21); db(0x0e); db(0x4e); db(0xae); db(0xfd); db(0x96); db(0x43); db(0xf9); db(0x00); db(0x21); db(0x00); db(0x00); db(0x4e); db(0xae); db(0xfd); db(0xea); db(0x4a); db(0x80); db(0x66); db(0x18); db(0x22); db(0x04); db(0x74); db(0xf6); db(0x20); db(0x7c); db(0x00); db(0x20); db(0x00); db(0x00); db(0x20); db(0x05); db(0x90); db(0x88); db(0x65); db(0x08); db(0x67); db(0x06); db(0x93); db(0xc9); db(0x4e); db(0xae); db(0xfd); db(0x96); - db(0x41); db(0xfa); db(0x1f); db(0x56); db(0x43); db(0xfa); db(0x00); db(0x5a); + db(0x41); db(0xfa); db(0x20); db(0x34); db(0x43); db(0xfa); db(0x00); db(0x5a); db(0x70); db(0x0a); db(0x61); db(0x00); db(0x0f); db(0x3c); db(0x22); db(0x40); db(0x72); db(0x01); db(0x30); db(0x3c); db(0xff); db(0x48); db(0x61); db(0x00); - db(0x1e); db(0x76); db(0x4e); db(0x90); db(0x4c); db(0xdf); db(0x7f); db(0xff); + db(0x1f); db(0x50); db(0x4e); db(0x90); db(0x4c); db(0xdf); db(0x7f); db(0xff); db(0x4e); db(0x75); db(0x48); db(0xe7); db(0x3c); db(0x22); db(0x7a); db(0x00); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x24); db(0x00); db(0x28); db(0x01); - db(0x26); db(0x09); db(0x24); db(0x48); db(0x43); db(0xfa); db(0x1f); db(0x79); + db(0x26); db(0x09); db(0x24); db(0x48); db(0x43); db(0xfa); db(0x20); db(0x57); db(0x70); db(0x00); db(0x4e); db(0xae); db(0xfd); db(0xd8); db(0x4a); db(0x80); db(0x67); db(0x16); db(0x2c); db(0x40); db(0x22); db(0x0a); db(0xe4); db(0x8b); db(0x4e); db(0xae); db(0xff); db(0x76); db(0x2a); db(0x00); db(0x22); db(0x4e); @@ -76,18 +76,18 @@ db(0x20); db(0x05); db(0x4c); db(0xdf); db(0x44); db(0x3c); db(0x4e); db(0x75); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x70); db(0x00); db(0x08); db(0xc0); db(0x00); db(0x0d); db(0x4e); db(0xae); db(0xfe); db(0xc2); db(0x41); db(0xfa); - db(0x1f); db(0x19); db(0x43); db(0xfa); db(0x00); db(0x14); db(0x70); db(0x0f); + db(0x1f); db(0xf7); db(0x43); db(0xfa); db(0x00); db(0x14); db(0x70); db(0x0f); db(0x22); db(0x3c); db(0x00); db(0x00); db(0x1f); db(0x40); db(0x61); db(0x00); db(0xff); db(0xa2); db(0x60); db(0xdc); db(0x00); db(0x00); db(0x00); db(0x10); db(0x00); db(0x00); db(0x00); db(0x00); db(0x72); db(0x02); db(0x30); db(0x3c); - db(0xff); db(0x48); db(0x61); db(0x00); db(0x1d); db(0xfa); db(0x4e); db(0x90); + db(0xff); db(0x48); db(0x61); db(0x00); db(0x1e); db(0xc4); db(0x4e); db(0x90); db(0x22); db(0x00); db(0x6b); db(0x04); db(0x61); db(0x00); db(0x0a); db(0x90); db(0x70); db(0x00); db(0x4e); db(0x75); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x20); db(0x3c); db(0x00); db(0x00); db(0x01); db(0x00); db(0x4e); db(0xae); db(0xfe); db(0xc2); db(0x7e); db(0x00); db(0x20); db(0x3c); db(0x00); db(0x00); - db(0xf0); db(0x00); db(0x61); db(0x00); db(0x1d); db(0xd2); db(0x22); db(0x48); + db(0xf0); db(0x00); db(0x61); db(0x00); db(0x1e); db(0xac); db(0x22); db(0x48); db(0x20); db(0x3c); db(0x00); db(0x00); db(0x40); db(0x00); db(0x61); db(0x00); - db(0x1d); db(0xc6); db(0x7c); db(0x03); db(0x4a); db(0x29); db(0x00); db(0x03); + db(0x1e); db(0xa0); db(0x7c); db(0x03); db(0x4a); db(0x29); db(0x00); db(0x03); db(0x67); db(0x42); db(0x0c); db(0x29); db(0x00); db(0xfd); db(0x00); db(0x07); db(0x66); db(0x3a); db(0x52); db(0x87); db(0x49); db(0xe8); db(0x00); db(0x54); db(0x4b); db(0xe9); db(0x00); db(0x04); db(0x48); db(0xe7); db(0x03); db(0xce); @@ -102,7 +102,7 @@ db(0xff); db(0x8a); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x20); db(0x3c); db(0x00); db(0x00); db(0x01); db(0x00); db(0x4e); db(0xae); db(0xfe); db(0xc2); db(0x7e); db(0x0a); db(0x30); db(0x3c); db(0xff); db(0x50); db(0x61); db(0x00); - db(0x1d); db(0x4e); db(0x20); db(0x07); db(0x4e); db(0x90); db(0x4a); db(0x80); + db(0x1e); db(0x18); db(0x20); db(0x07); db(0x4e); db(0x90); db(0x4a); db(0x80); db(0x67); db(0x00); db(0xff); db(0xe4); db(0x7e); db(0x0b); db(0x0c); db(0x40); db(0x00); db(0x01); db(0x6d); db(0x00); db(0xff); db(0xe6); db(0x6e); db(0x06); db(0x4e); db(0xae); db(0xfe); db(0x92); db(0x60); db(0xdc); db(0x0c); db(0x40); @@ -121,30 +121,30 @@ db(0x00); db(0x1a); db(0x20); db(0x69); db(0x00); db(0x10); db(0x22); db(0x4a); db(0x4e); db(0xae); db(0xfe); db(0x92); db(0x60); db(0x00); db(0xff); db(0x6c); db(0x0c); db(0x40); db(0x00); db(0x06); db(0x6e); db(0x00); db(0xff); db(0x64); - db(0x41); db(0xfa); db(0x1e); db(0x46); db(0x43); db(0xfa); db(0x00); db(0x42); + db(0x41); db(0xfa); db(0x1f); db(0x24); db(0x43); db(0xfa); db(0x00); db(0x42); db(0x70); db(0x01); db(0x22); db(0x3c); db(0x00); db(0x00); db(0x27); db(0x10); db(0x61); db(0x00); db(0xfe); db(0x38); db(0x22); db(0x00); db(0x30); db(0x3c); - db(0xff); db(0x50); db(0x61); db(0x00); db(0x1c); db(0x9a); db(0x70); db(0x14); + db(0xff); db(0x50); db(0x61); db(0x00); db(0x1d); db(0x64); db(0x70); db(0x14); db(0x4e); db(0x90); db(0x60); db(0x00); db(0xff); db(0x3e); db(0x70); db(0x00); db(0x20); db(0x59); db(0x4a); db(0x10); db(0x67); db(0x10); db(0x2c); db(0x59); db(0x22); db(0x51); db(0x20); db(0x3c); db(0x00); db(0x00); db(0x01); db(0x00); db(0x4e); db(0xae); db(0xfe); db(0xbc); db(0x70); db(0x01); db(0x4a); db(0x40); db(0x4e); db(0x75); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x10); db(0x00); db(0x00); db(0x00); db(0x00); db(0x2c); db(0x78); db(0x00); db(0x04); - db(0x43); db(0xfa); db(0x1d); db(0x85); db(0x70); db(0x00); db(0x4e); db(0xae); + db(0x43); db(0xfa); db(0x1e); db(0x63); db(0x70); db(0x00); db(0x4e); db(0xae); db(0xfd); db(0xd8); db(0x2a); db(0x40); db(0xcb); db(0x4e); db(0x60); db(0x0e); db(0xcb); db(0x4e); db(0x70); db(0x00); db(0x08); db(0xc0); db(0x00); db(0x0d); db(0x4e); db(0xae); db(0xfe); db(0xc2); db(0xcb); db(0x4e); db(0x30); db(0x3c); - db(0xff); db(0x50); db(0x61); db(0x00); db(0x1c); db(0x42); db(0x70); db(0x15); + db(0xff); db(0x50); db(0x61); db(0x00); db(0x1d); db(0x0c); db(0x70); db(0x15); db(0x4e); db(0x90); db(0x2e); db(0x08); db(0x67); db(0xe2); db(0x28); db(0x4f); db(0x4f); db(0xef); db(0xfd); db(0xd8); db(0x2c); db(0x0f); db(0x24); db(0x46); db(0x47); db(0xea); db(0x00); db(0x28); db(0x22); db(0x4b); db(0x20); db(0x47); db(0x12); db(0xd8); db(0x66); db(0xfc); db(0x20); db(0x47); db(0x42); db(0x10); db(0x24); db(0xfc); db(0x80); db(0x00); db(0x00); db(0x21); db(0x41); db(0xfa); - db(0x1c); db(0x73); db(0x22); db(0x08); db(0x24); db(0x3c); db(0x00); db(0x00); + db(0x1d); db(0x51); db(0x22); db(0x08); db(0x24); db(0x3c); db(0x00); db(0x00); db(0x03); db(0xed); db(0x4e); db(0xae); db(0xff); db(0xe2); db(0x24); db(0xc0); db(0x24); db(0xfc); db(0x80); db(0x00); db(0x00); db(0x22); db(0x41); db(0xfa); - db(0x1c); db(0x5b); db(0x22); db(0x08); db(0x4e); db(0xae); db(0xff); db(0xe2); + db(0x1d); db(0x39); db(0x22); db(0x08); db(0x4e); db(0xae); db(0xff); db(0xe2); db(0x24); db(0xc0); db(0x24); db(0xfc); db(0x80); db(0x00); db(0x00); db(0x23); db(0x70); db(0xff); db(0x24); db(0xc0); db(0x42); db(0x9a); db(0x42); db(0x92); db(0x0c); db(0x6e); db(0x00); db(0x24); db(0x00); db(0x14); db(0x64); db(0x20); @@ -154,19 +154,19 @@ db(0x00); db(0x0c); db(0x4e); db(0xae); db(0xff); db(0xdc); db(0x60); db(0x08); db(0x22); db(0x0b); db(0x24); db(0x06); db(0x4e); db(0xae); db(0xfd); db(0xa2); db(0x2e); db(0x4c); db(0x30); db(0x3c); db(0xff); db(0x50); db(0x61); db(0x00); - db(0x1b); db(0xae); db(0x70); db(0x16); db(0x4e); db(0x90); db(0x60); db(0x00); + db(0x1c); db(0x78); db(0x70); db(0x16); db(0x4e); db(0x90); db(0x60); db(0x00); db(0xff); db(0x50); db(0x48); db(0xe7); db(0xf0); db(0xf8); db(0x24); db(0x00); db(0x26); db(0x01); db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x12); - db(0x61); db(0x00); db(0x1b); db(0x94); db(0x20); db(0x02); db(0x24); db(0x03); + db(0x61); db(0x00); db(0x1c); db(0x5e); db(0x20); db(0x02); db(0x24); db(0x03); db(0x4e); db(0x90); db(0x24); db(0x40); db(0x70); db(0x2a); db(0x22); db(0x3c); db(0x00); db(0x01); db(0x00); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x28); db(0x40); db(0x47); db(0xec); db(0x00); db(0x16); db(0x22); db(0x4b); db(0x22); db(0xca); db(0x22); db(0xc2); db(0x22); db(0xc3); db(0x30); db(0x3c); - db(0x3f); db(0xf4); db(0x61); db(0x00); db(0x1b); db(0x6a); db(0x22); db(0xc8); - db(0x30); db(0x3c); db(0x3f); db(0xf0); db(0x61); db(0x00); db(0x1b); db(0x60); + db(0x3f); db(0xf4); db(0x61); db(0x00); db(0x1c); db(0x44); db(0x22); db(0xc8); + db(0x30); db(0x3c); db(0x3f); db(0xf0); db(0x61); db(0x00); db(0x1c); db(0x3a); db(0x22); db(0xc8); db(0x29); db(0x4b); db(0x00); db(0x0e); db(0x19); db(0x7c); db(0x00); db(0x02); db(0x00); db(0x08); db(0x19); db(0x7c); db(0x00); db(0xf6); - db(0x00); db(0x09); db(0x41); db(0xfa); db(0x1b); db(0xfe); db(0x29); db(0x48); + db(0x00); db(0x09); db(0x41); db(0xfa); db(0x1c); db(0xdc); db(0x29); db(0x48); db(0x00); db(0x0a); db(0x41); db(0xfa); db(0x00); db(0x14); db(0x29); db(0x48); db(0x00); db(0x12); db(0x22); db(0x4c); db(0x70); db(0x05); db(0x4e); db(0xae); db(0xff); db(0x58); db(0x4c); db(0xdf); db(0x1f); db(0x0f); db(0x4e); db(0x75); @@ -177,23 +177,23 @@ db(0x67); db(0x08); db(0x22); db(0x69); db(0x00); db(0x10); db(0x22); db(0xa8); db(0x00); db(0x44); db(0x70); db(0x00); db(0x4e); db(0x75); db(0x48); db(0xe7); db(0xf1); db(0xe0); db(0x2e); db(0x00); db(0x20); db(0x3c); db(0x00); db(0x00); - db(0xff); db(0xfc); db(0x61); db(0x00); db(0x1a); db(0xf2); db(0x24); db(0x48); + db(0xff); db(0xfc); db(0x61); db(0x00); db(0x1b); db(0xcc); db(0x24); db(0x48); db(0x74); db(0x00); db(0x08); db(0x07); db(0x00); db(0x00); db(0x67); db(0x10); - db(0x41); db(0xfa); db(0x1b); db(0xc1); db(0x43); db(0xfa); db(0xfd); db(0x7c); + db(0x41); db(0xfa); db(0x1c); db(0x9f); db(0x43); db(0xfa); db(0xfd); db(0x7c); db(0x70); db(0x14); db(0x61); db(0x00); db(0x0b); db(0x94); db(0x24); db(0x00); db(0x76); db(0x00); db(0x08); db(0x07); db(0x00); db(0x01); db(0x67); db(0x10); - db(0x41); db(0xfa); db(0x1b); db(0xb7); db(0x43); db(0xfa); db(0xfc); db(0xde); + db(0x41); db(0xfa); db(0x1c); db(0x95); db(0x43); db(0xfa); db(0xfc); db(0xde); db(0x70); db(0x19); db(0x61); db(0x00); db(0x0b); db(0x7c); db(0x26); db(0x00); db(0x70); db(0x2a); db(0x22); db(0x3c); db(0x00); db(0x01); db(0x00); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x22); db(0x40); db(0x41); db(0xe9); db(0x00); db(0x1a); db(0x20); db(0xca); db(0x20); db(0xce); db(0x20); db(0xc2); - db(0x20); db(0x83); db(0x41); db(0xfa); db(0x1b); db(0x65); db(0x23); db(0x48); + db(0x20); db(0x83); db(0x41); db(0xfa); db(0x1c); db(0x43); db(0x23); db(0x48); db(0x00); db(0x0a); db(0x45); db(0xe9); db(0x00); db(0x1a); db(0x23); db(0x4a); db(0x00); db(0x0e); db(0x41); db(0xfa); db(0xfe); db(0x02); db(0x23); db(0x48); db(0x00); db(0x12); db(0x33); db(0x7c); db(0x02); db(0x14); db(0x00); db(0x08); db(0x70); db(0x03); db(0x4e); db(0xae); db(0xff); db(0x58); db(0x20); db(0x02); db(0x22); db(0x03); db(0x61); db(0x00); db(0xfe); db(0xd6); db(0x30); db(0x3c); - db(0xff); db(0x38); db(0x72); db(0x04); db(0x61); db(0x00); db(0x1a); db(0x70); + db(0xff); db(0x38); db(0x72); db(0x04); db(0x61); db(0x00); db(0x1b); db(0x3a); db(0x4e); db(0x90); db(0x4a); db(0x80); db(0x67); db(0x04); db(0x61); db(0x00); db(0x0b); db(0x7c); db(0x4c); db(0xdf); db(0x07); db(0x8f); db(0x4e); db(0x75); db(0x48); db(0xe7); db(0xc0); db(0xf2); db(0x2c); db(0x78); db(0x00); db(0x04); @@ -203,7 +203,7 @@ db(0x43); db(0xeb); db(0x01); db(0xac); db(0x11); db(0xb1); db(0x00); db(0x00); db(0x00); db(0x0e); db(0x52); db(0x40); db(0x0c); db(0x40); db(0x00); db(0x8c); db(0x66); db(0xf2); db(0x20); db(0x0a); db(0xe4); db(0x88); db(0x21); db(0x40); - db(0x00); db(0x36); db(0x22); db(0x48); db(0x41); db(0xfa); db(0x1a); db(0xe3); + db(0x00); db(0x36); db(0x22); db(0x48); db(0x41); db(0xfa); db(0x1b); db(0xc1); db(0x23); db(0x48); db(0x00); db(0x0a); db(0x20); db(0x6b); db(0x01); db(0x9c); db(0x41); db(0xe8); db(0x00); db(0x12); db(0x4e); db(0xae); db(0xff); db(0x10); db(0x4c); db(0xdf); db(0x4f); db(0x03); db(0x4e); db(0x75); db(0x48); db(0xe7); @@ -241,13 +241,13 @@ db(0x60); db(0xf2); db(0x48); db(0xe7); db(0x40); db(0xf2); db(0x26); db(0x48); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x41); db(0xee); db(0x01); db(0x50); db(0x20); db(0x50); db(0x4a); db(0x90); db(0x67); db(0x1a); db(0x22); db(0x68); - db(0x00); db(0x0a); db(0x45); db(0xfa); db(0x1a); db(0x54); db(0x10); db(0x19); + db(0x00); db(0x0a); db(0x45); db(0xfa); db(0x1b); db(0x32); db(0x10); db(0x19); db(0x12); db(0x1a); db(0xb0); db(0x01); db(0x66); db(0x06); db(0x4a); db(0x00); db(0x67); db(0x46); db(0x60); db(0xf2); db(0x20); db(0x50); db(0x60); db(0xe2); db(0x70); db(0x20); db(0x22); db(0x3c); db(0x00); db(0x01); db(0x00); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x24); db(0x40); db(0x15); db(0x7c); - db(0x00); db(0x08); db(0x00); db(0x08); db(0x41); db(0xfa); db(0x1a); db(0x2a); - db(0x25); db(0x48); db(0x00); db(0x0a); db(0x41); db(0xfa); db(0x19); db(0x83); + db(0x00); db(0x08); db(0x00); db(0x08); db(0x41); db(0xfa); db(0x1b); db(0x08); + db(0x25); db(0x48); db(0x00); db(0x0a); db(0x41); db(0xfa); db(0x1a); db(0x61); db(0x25); db(0x48); db(0x00); db(0x0e); db(0x41); db(0xea); db(0x00); db(0x12); db(0x20); db(0x88); db(0x58); db(0x90); db(0x21); db(0x48); db(0x00); db(0x08); db(0x41); db(0xee); db(0x01); db(0x50); db(0x22); db(0x4a); db(0x4e); db(0xae); @@ -358,8 +358,8 @@ db(0x4c); db(0xdf); db(0x7c); db(0xfc); db(0x20); db(0x6c); db(0x00); db(0x24); db(0x4a); db(0x90); db(0x4e); db(0x75); db(0x61); db(0x00); db(0xfc); db(0x4c); db(0x21); db(0x40); db(0x01); db(0x9c); db(0x2f); db(0x08); db(0x30); db(0x3c); - db(0xff); db(0xec); db(0x61); db(0x00); db(0x15); db(0x4a); db(0x2a); db(0x50); - db(0x30); db(0x3c); db(0xff); db(0x28); db(0x61); db(0x00); db(0x15); db(0x40); + db(0xff); db(0xec); db(0x61); db(0x00); db(0x16); db(0x24); db(0x2a); db(0x50); + db(0x30); db(0x3c); db(0xff); db(0x28); db(0x61); db(0x00); db(0x16); db(0x0a); db(0x22); db(0x48); db(0x20); db(0x5f); db(0x42); db(0xa8); db(0x01); db(0x90); db(0x42); db(0xa8); db(0x01); db(0x94); db(0x4e); db(0x91); db(0x26); db(0x00); db(0x0c); db(0x43); db(0xff); db(0xfe); db(0x67); db(0x00); db(0xf6); db(0xba); @@ -367,11 +367,11 @@ db(0x2f); db(0x08); db(0x72); db(0x01); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x20); db(0x5f); db(0x21); db(0x40); db(0x01); db(0x94); db(0x4a); db(0x83); db(0x6a); db(0x0e); db(0x22); db(0x48); - db(0x30); db(0x3c); db(0xff); db(0x20); db(0x61); db(0x00); db(0x15); db(0x00); + db(0x30); db(0x3c); db(0xff); db(0x20); db(0x61); db(0x00); db(0x15); db(0xca); db(0x4e); db(0x90); db(0x60); db(0x26); db(0x2c); db(0x4c); db(0x2f); db(0x08); db(0x61); db(0x00); db(0x0f); db(0xf6); db(0x20); db(0x5f); db(0x22); db(0x48); db(0x26); db(0x40); db(0x30); db(0x3c); db(0xff); db(0x20); db(0x61); db(0x00); - db(0x14); db(0xe6); db(0x4e); db(0x90); db(0x70); db(0x00); db(0x27); db(0x40); + db(0x15); db(0xb0); db(0x4e); db(0x90); db(0x70); db(0x00); db(0x27); db(0x40); db(0x00); db(0x08); db(0x27); db(0x40); db(0x00); db(0x10); db(0x27); db(0x40); db(0x00); db(0x20); db(0x20); db(0x69); db(0x01); db(0x94); db(0x4a); db(0xa9); db(0x01); db(0x90); db(0x67); db(0x2c); db(0x20); db(0x08); db(0x67); db(0x32); @@ -383,9 +383,9 @@ db(0x4a); db(0xa9); db(0x01); db(0x98); db(0x67); db(0x04); db(0x61); db(0x00); db(0xfa); db(0x38); db(0x4a); db(0x83); db(0x6b); db(0x00); db(0xf6); db(0x22); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x2f); db(0x09); db(0x43); db(0xfa); - db(0x16); db(0x0c); db(0x4e); db(0xae); db(0xfe); db(0xda); db(0x22); db(0x5f); + db(0x16); db(0xea); db(0x4e); db(0xae); db(0xfe); db(0xda); db(0x22); db(0x5f); db(0x22); db(0x00); db(0x30); db(0x3c); db(0xff); db(0x18); db(0x61); db(0x00); - db(0x14); db(0x76); db(0x4e); db(0x90); db(0x20); db(0x03); db(0x16); db(0x29); + db(0x15); db(0x40); db(0x4e); db(0x90); db(0x20); db(0x03); db(0x16); db(0x29); db(0x00); db(0x4f); db(0x4a); db(0x80); db(0x66); db(0x24); db(0x27); db(0x7c); db(0x00); db(0x00); db(0x17); db(0x70); db(0x00); db(0x14); db(0x41); db(0xfa); db(0xf3); db(0xd4); db(0x70); db(0xff); db(0x22); db(0x0c); db(0x66); db(0x06); @@ -413,7 +413,7 @@ db(0xff); db(0x3a); db(0x4a); db(0x80); db(0x67); db(0x42); db(0x20); db(0x52); db(0x24); db(0x40); db(0x22); db(0x4a); db(0x12); db(0xd8); db(0x66); db(0xfc); db(0x13); db(0x7c); db(0x00); db(0x3a); db(0xff); db(0xff); db(0x42); db(0x11); - db(0x2c); db(0x78); db(0x00); db(0x04); db(0x43); db(0xfa); db(0x14); db(0xb1); + db(0x2c); db(0x78); db(0x00); db(0x04); db(0x43); db(0xfa); db(0x15); db(0x8f); db(0x4e); db(0xae); db(0xfe); db(0x68); db(0x2c); db(0x40); db(0x22); db(0x0a); db(0x26); db(0x0f); db(0x4f); db(0xea); db(0x10); db(0x04); db(0x4e); db(0xae); db(0xff); db(0x52); db(0x2e); db(0x43); db(0x26); db(0x01); db(0x22); db(0x4e); @@ -421,9 +421,9 @@ db(0x22); db(0x4a); db(0x20); db(0x02); db(0x4e); db(0xae); db(0xff); db(0x2e); db(0x22); db(0x03); db(0x70); db(0x00); db(0x4e); db(0x75); db(0x48); db(0xe7); db(0x3f); db(0x3e); db(0x2c); db(0x01); db(0x7e); db(0x06); db(0x2c); db(0x78); - db(0x00); db(0x04); db(0x43); db(0xfa); db(0x14); db(0xa2); db(0x70); db(0x24); + db(0x00); db(0x04); db(0x43); db(0xfa); db(0x15); db(0x80); db(0x70); db(0x24); db(0x4e); db(0xae); db(0xfd); db(0xd8); db(0x4a); db(0x80); db(0x66); db(0x0e); - db(0x08); db(0x87); db(0x00); db(0x02); db(0x43); db(0xfa); db(0x14); db(0x90); + db(0x08); db(0x87); db(0x00); db(0x02); db(0x43); db(0xfa); db(0x15); db(0x6e); db(0x70); db(0x00); db(0x4e); db(0xae); db(0xfd); db(0xd8); db(0x28); db(0x40); db(0x20); db(0x3c); db(0x00); db(0x00); db(0x02); db(0x38); db(0x22); db(0x3c); db(0x00); db(0x01); db(0x00); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x3a); @@ -435,7 +435,7 @@ db(0x20); db(0x3c); db(0x00); db(0x00); db(0x02); db(0x38); db(0x4e); db(0xae); db(0xff); db(0x2e); db(0x22); db(0x4c); db(0x4e); db(0xae); db(0xfe); db(0x62); db(0x4c); db(0xdf); db(0x7c); db(0xfc); db(0x4e); db(0x75); db(0x30); db(0x3c); - db(0xff); db(0x58); db(0x61); db(0x00); db(0x12); db(0xe2); db(0x70); db(0x03); + db(0xff); db(0x58); db(0x61); db(0x00); db(0x13); db(0xac); db(0x70); db(0x03); db(0x4e); db(0x90); db(0x22); db(0x6b); db(0x00); db(0xa8); db(0x23); db(0x40); db(0x00); db(0x20); db(0x67); db(0x16); db(0x70); db(0x00); db(0x23); db(0x40); db(0x00); db(0x24); db(0x33); db(0x7c); db(0x00); db(0x0b); db(0x00); db(0x1c); @@ -443,9 +443,9 @@ db(0xfe); db(0x38); db(0x4e); db(0x75); db(0x7e); db(0x00); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x93); db(0xc9); db(0x4e); db(0xae); db(0xfe); db(0xda); db(0x20); db(0x40); db(0x4b); db(0xe8); db(0x00); db(0x5c); db(0x43); db(0xfa); - db(0x13); db(0xc7); db(0x4e); db(0xae); db(0xfe); db(0x68); db(0x24); db(0x40); + db(0x14); db(0xa5); db(0x4e); db(0xae); db(0xfe); db(0x68); db(0x24); db(0x40); db(0x22); db(0x3c); db(0x00); db(0x00); db(0x00); db(0xbc); db(0x30); db(0x3c); - db(0xff); db(0x40); db(0x61); db(0x00); db(0x12); db(0x92); db(0x70); db(0x01); + db(0xff); db(0x40); db(0x61); db(0x00); db(0x13); db(0x5c); db(0x70); db(0x01); db(0x4e); db(0x90); db(0x4a); db(0x80); db(0x66); db(0x0c); db(0x20); db(0x01); db(0x22); db(0x3c); db(0x00); db(0x01); db(0x00); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x26); db(0x40); db(0x7c); db(0x00); db(0x26); db(0x86); @@ -453,14 +453,14 @@ db(0x27); db(0x4a); db(0x00); db(0xa0); db(0x50); db(0xeb); db(0x00); db(0x9e); db(0x70); db(0xff); db(0x27); db(0x40); db(0x00); db(0xb8); db(0x93); db(0xc9); db(0x4e); db(0xae); db(0xfe); db(0xda); db(0x27); db(0x40); db(0x00); db(0xb0); - db(0x41); db(0xfa); db(0x12); db(0x62); db(0x70); db(0x00); db(0x72); db(0x00); + db(0x41); db(0xfa); db(0x13); db(0x40); db(0x70); db(0x00); db(0x72); db(0x00); db(0x61); db(0x00); db(0x02); db(0xcc); db(0x27); db(0x40); db(0x00); db(0xa4); - db(0x41); db(0xfa); db(0x12); db(0x5f); db(0x70); db(0x00); db(0x72); db(0x00); + db(0x41); db(0xfa); db(0x13); db(0x3d); db(0x70); db(0x00); db(0x72); db(0x00); db(0x61); db(0x00); db(0x02); db(0xbc); db(0x27); db(0x40); db(0x00); db(0xa8); db(0x7a); db(0x00); db(0x26); db(0x07); db(0x66); db(0x12); db(0x20); db(0x4d); db(0x4e); db(0xae); db(0xfe); db(0x80); db(0x20); db(0x4d); db(0x4e); db(0xae); db(0xfe); db(0x8c); db(0x28); db(0x40); db(0x26); db(0x2c); db(0x00); db(0x0a); - db(0x30); db(0x3c); db(0xff); db(0x40); db(0x61); db(0x00); db(0x12); db(0x18); + db(0x30); db(0x3c); db(0xff); db(0x40); db(0x61); db(0x00); db(0x12); db(0xe2); db(0x70); db(0x00); db(0x4e); db(0x90); db(0x24); db(0x00); db(0x61); db(0x00); db(0xfb); db(0xc2); db(0x70); db(0x01); db(0x61); db(0x00); db(0xf9); db(0x72); db(0x08); db(0x02); db(0x00); db(0x01); db(0x67); db(0x06); db(0x70); db(0x01); @@ -474,10 +474,10 @@ db(0x00); db(0x01); db(0x00); db(0xad); db(0x67); db(0x0a); db(0x61); db(0x00); db(0x0c); db(0x62); db(0x08); db(0xab); db(0x00); db(0x01); db(0x00); db(0xad); db(0x4a); db(0x2b); db(0x00); db(0xac); db(0x67); db(0x24); db(0x30); db(0x3c); - db(0xff); db(0x58); db(0x61); db(0x00); db(0x11); db(0xaa); db(0x70); db(0x01); + db(0xff); db(0x58); db(0x61); db(0x00); db(0x12); db(0x74); db(0x70); db(0x01); db(0x4e); db(0x90); db(0x4a); db(0x80); db(0x67); db(0x04); db(0x61); db(0x00); db(0xfb); db(0x78); db(0x42); db(0x2b); db(0x00); db(0xac); db(0x30); db(0x3c); - db(0xff); db(0x58); db(0x61); db(0x00); db(0x11); db(0x92); db(0x70); db(0x02); + db(0xff); db(0x58); db(0x61); db(0x00); db(0x12); db(0x5c); db(0x70); db(0x02); db(0x4e); db(0x90); db(0x20); db(0x0c); db(0x67); db(0x56); db(0x0c); db(0x6c); db(0x00); db(0x26); db(0x00); db(0x12); db(0x66); db(0x4e); db(0x0c); db(0xac); db(0x40); db(0x00); db(0x00); db(0x00); db(0x00); db(0x14); db(0x66); db(0x44); @@ -492,7 +492,7 @@ db(0x60); db(0x00); db(0xff); db(0x3e); db(0x74); db(0xfe); db(0x20); db(0x0c); db(0x67); db(0x14); db(0x26); db(0x2c); db(0x00); db(0x0a); db(0x66); db(0x42); db(0x74); db(0xff); db(0x30); db(0x3c); db(0xff); db(0x50); db(0x61); db(0x00); - db(0x11); db(0x1e); db(0x70); db(0x01); db(0x4e); db(0x90); db(0x45); db(0xeb); + db(0x11); db(0xe8); db(0x70); db(0x01); db(0x4e); db(0x90); db(0x45); db(0xeb); db(0x00); db(0x04); db(0x20); db(0x52); db(0x20); db(0x08); db(0x67); db(0x00); db(0xff); db(0x18); db(0x22); db(0x50); db(0x20); db(0x40); db(0x20); db(0x28); db(0x00); db(0x04); db(0xb4); db(0x80); db(0x66); db(0x16); db(0x48); db(0xe7); @@ -502,7 +502,7 @@ db(0x60); db(0xd2); db(0x0c); db(0x85); db(0x00); db(0x00); db(0x00); db(0x14); db(0x65); db(0x00); db(0x00); db(0x0a); db(0x70); db(0x01); db(0x29); db(0x40); db(0x00); db(0x04); db(0x60); db(0x12); db(0x61); db(0x5e); db(0x30); db(0x3c); - db(0xff); db(0x30); db(0x61); db(0x00); db(0x10); db(0xca); db(0x4e); db(0x90); + db(0xff); db(0x30); db(0x61); db(0x00); db(0x11); db(0x94); db(0x4e); db(0x90); db(0x4a); db(0x80); db(0x67); db(0x0e); db(0x52); db(0x85); db(0x28); db(0xab); db(0x00); db(0x04); db(0x27); db(0x4c); db(0x00); db(0x04); db(0x60); db(0x00); db(0xfe); db(0xc0); db(0x28); db(0x43); db(0x61); db(0x04); db(0x60); db(0x00); @@ -510,7 +510,7 @@ db(0x00); db(0x08); db(0x66); db(0x04); db(0x61); db(0x00); db(0xfa); db(0x3a); db(0x0c); db(0xac); db(0x00); db(0x00); db(0x04); db(0x09); db(0x00); db(0x08); db(0x66); db(0x14); db(0x61); db(0x00); db(0xfa); db(0x92); db(0x66); db(0x0e); - db(0x30); db(0x3c); db(0xff); db(0x58); db(0x61); db(0x00); db(0x10); db(0x88); + db(0x30); db(0x3c); db(0xff); db(0x58); db(0x61); db(0x00); db(0x11); db(0x52); db(0x70); db(0x00); db(0x4e); db(0x90); db(0x60); db(0xec); db(0x22); db(0x54); db(0x20); db(0x6c); db(0x00); db(0x04); db(0x29); db(0x4d); db(0x00); db(0x04); db(0x4e); db(0xee); db(0xfe); db(0x92); db(0x2f); db(0x05); db(0x7a); db(0xfc); @@ -562,7 +562,7 @@ db(0x25); db(0x4b); db(0x00); db(0x3e); db(0x25); db(0x4b); db(0x00); db(0x36); db(0x22); db(0x4a); db(0x24); db(0x43); db(0x97); db(0xcb); db(0x24); db(0x09); db(0x4e); db(0xae); db(0xfe); db(0xe6); db(0x20); db(0x02); db(0x4c); db(0xdf); - db(0x4c); db(0x1c); db(0x4e); db(0x75); db(0x41); db(0xfa); db(0x0f); db(0x8b); + db(0x4c); db(0x1c); db(0x4e); db(0x75); db(0x41); db(0xfa); db(0x10); db(0x69); db(0x43); db(0xfa); db(0x01); db(0x50); db(0x70); db(0x13); db(0x61); db(0x00); db(0xff); db(0x98); db(0x4e); db(0x75); db(0x9e); db(0xfc); db(0x00); db(0x18); db(0x42); db(0x92); db(0x42); db(0xaa); db(0x00); db(0x0e); db(0x42); db(0xaa); @@ -604,7 +604,7 @@ db(0x4e); db(0xae); db(0xfd); db(0x0c); db(0x4a); db(0x80); db(0x6b); db(0x04); db(0x47); db(0xed); db(0x00); db(0x90); db(0x34); db(0x2d); db(0x00); db(0x2c); db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x01); db(0x61); db(0x00); - db(0x0d); db(0x9e); db(0x4e); db(0x90); db(0x4c); db(0xdf); db(0x7f); db(0x1f); + db(0x0e); db(0x68); db(0x4e); db(0x90); db(0x4c); db(0xdf); db(0x7f); db(0x1f); db(0x4e); db(0x75); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x3e); db(0x2e); db(0x00); db(0x14); db(0x70); db(0xff); db(0x4e); db(0xae); db(0xfe); db(0xb6); db(0x7c); db(0x00); db(0x01); db(0xc6); db(0x93); db(0xc9); db(0x4e); db(0xae); @@ -612,47 +612,47 @@ db(0x4e); db(0xae); db(0xfe); db(0xd4); db(0x70); db(0x00); db(0x30); db(0x3c); db(0x02); db(0x14); db(0x22); db(0x3c); db(0x00); db(0x01); db(0x00); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x2a); db(0x40); db(0x30); db(0x3c); - db(0x3e); db(0x00); db(0x61); db(0x00); db(0x0d); db(0x5a); db(0x2b); db(0x48); + db(0x3e); db(0x00); db(0x61); db(0x00); db(0x0e); db(0x34); db(0x2b); db(0x48); db(0x02); db(0x10); db(0x28); db(0x48); db(0x47); db(0xed); db(0x00); db(0x16); db(0x27); db(0x4e); db(0x00); db(0x10); db(0x27); db(0x4a); db(0x00); db(0x08); db(0x27); db(0x46); db(0x00); db(0x0c); db(0x70); db(0xff); db(0x37); db(0x40); db(0x00); db(0x00); db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x05); - db(0x61); db(0x00); db(0x0d); db(0x34); db(0x20); db(0x0c); db(0x4e); db(0x90); + db(0x61); db(0x00); db(0x0d); db(0xfe); db(0x20); db(0x0c); db(0x4e); db(0x90); db(0x43); db(0xed); db(0x00); db(0x00); db(0x13); db(0x7c); db(0x00); db(0x02); db(0x00); db(0x08); db(0x13); db(0x7c); db(0x00); db(0x05); db(0x00); db(0x09); - db(0x41); db(0xfa); db(0x0d); db(0xbf); db(0x23); db(0x48); db(0x00); db(0x0a); + db(0x41); db(0xfa); db(0x0e); db(0x9d); db(0x23); db(0x48); db(0x00); db(0x0a); db(0x41); db(0xfa); db(0x03); db(0x2e); db(0x23); db(0x48); db(0x00); db(0x12); db(0x23); db(0x4d); db(0x00); db(0x0e); db(0x70); db(0x05); db(0x4e); db(0xae); db(0xff); db(0x58); db(0x20); db(0x06); db(0x4e); db(0xae); db(0xfe); db(0xc2); db(0x70); db(0x00); db(0x53); db(0xab); db(0x00); db(0x1c); db(0x6a); db(0x06); db(0x70); db(0x0a); db(0x27); db(0x40); db(0x00); db(0x1c); db(0x4a); db(0xab); db(0x00); db(0x14); db(0x66); db(0x22); db(0x4a); db(0xab); db(0x00); db(0x1c); - db(0x66); db(0xe0); db(0x43); db(0xfa); db(0x0e); db(0x0f); db(0x70); db(0x00); + db(0x66); db(0xe0); db(0x43); db(0xfa); db(0x0e); db(0xed); db(0x70); db(0x00); db(0x4e); db(0xae); db(0xfd); db(0xd8); db(0x27); db(0x40); db(0x00); db(0x14); db(0x67); db(0xd0); db(0x22); db(0x00); db(0x30); db(0x3c); db(0x3f); db(0xf4); - db(0x61); db(0x00); db(0x0c); db(0xcc); db(0x20); db(0x81); db(0x4a); db(0xab); + db(0x61); db(0x00); db(0x0d); db(0xa6); db(0x20); db(0x81); db(0x4a); db(0xab); db(0x00); db(0x18); db(0x66); db(0x24); db(0x4a); db(0xab); db(0x00); db(0x1c); - db(0x66); db(0xb8); db(0x43); db(0xfa); db(0x0d); db(0xf9); db(0x70); db(0x00); + db(0x66); db(0xb8); db(0x43); db(0xfa); db(0x0e); db(0xd7); db(0x70); db(0x00); db(0x4e); db(0xae); db(0xfd); db(0xd8); db(0x27); db(0x40); db(0x00); db(0x18); db(0x67); db(0x00); db(0xff); db(0xa8); db(0x22); db(0x00); db(0x30); db(0x3c); - db(0x3f); db(0xf8); db(0x61); db(0x00); db(0x0c); db(0xa2); db(0x20); db(0x81); + db(0x3f); db(0xf8); db(0x61); db(0x00); db(0x0d); db(0x7c); db(0x20); db(0x81); db(0x4a); db(0xad); db(0x02); db(0x08); db(0x66); db(0x3a); db(0x4a); db(0xab); db(0x00); db(0x1c); db(0x66); db(0x8e); db(0x4e); db(0xae); db(0xff); db(0x7c); - db(0x41); db(0xee); db(0x01); db(0x5e); db(0x43); db(0xfa); db(0x0c); db(0x96); + db(0x41); db(0xee); db(0x01); db(0x5e); db(0x43); db(0xfa); db(0x0d); db(0x74); db(0x4e); db(0xae); db(0xfe); db(0xec); db(0x24); db(0x00); db(0x4e); db(0xae); db(0xff); db(0x76); db(0x4a); db(0x82); db(0x67); db(0x00); db(0xff); db(0x74); - db(0x41); db(0xfa); db(0x0c); db(0x82); db(0x70); db(0x00); db(0x72); db(0x00); + db(0x41); db(0xfa); db(0x0d); db(0x60); db(0x70); db(0x00); db(0x72); db(0x00); db(0x61); db(0x00); db(0xfc); db(0xec); db(0x2b); db(0x40); db(0x02); db(0x08); db(0x67); db(0x00); db(0x02); db(0x52); db(0x60); db(0x00); db(0xff); db(0x5c); db(0x4a); db(0xad); db(0x02); db(0x0c); db(0x66); db(0x48); db(0x4a); db(0xab); db(0x00); db(0x1c); db(0x66); db(0x00); db(0xff); db(0x4e); db(0x4e); db(0xae); db(0xff); db(0x7c); db(0x41); db(0xee); db(0x01); db(0x5e); db(0x43); db(0xfa); - db(0x0c); db(0x61); db(0x4e); db(0xae); db(0xfe); db(0xec); db(0x24); db(0x00); + db(0x0d); db(0x3f); db(0x4e); db(0xae); db(0xfe); db(0xec); db(0x24); db(0x00); db(0x4e); db(0xae); db(0xff); db(0x76); db(0x4a); db(0x82); db(0x67); db(0x00); - db(0xff); db(0x32); db(0x41); db(0xfa); db(0x0c); db(0x4d); db(0x70); db(0x00); + db(0xff); db(0x32); db(0x41); db(0xfa); db(0x0d); db(0x2b); db(0x70); db(0x00); db(0x72); db(0x00); db(0x61); db(0x00); db(0xfc); db(0xaa); db(0x2b); db(0x40); db(0x02); db(0x0c); db(0x67); db(0x00); db(0x02); db(0x10); db(0x30); db(0x3c); - db(0xff); db(0x38); db(0x72); db(0x00); db(0x61); db(0x00); db(0x0c); db(0x18); + db(0xff); db(0x38); db(0x72); db(0x00); db(0x61); db(0x00); db(0x0c); db(0xe2); db(0x4e); db(0x90); db(0x60); db(0x00); db(0xff); db(0x0e); db(0x0c); db(0x47); db(0x00); db(0x24); db(0x65); db(0x18); db(0x0c); db(0x47); db(0x00); db(0x32); db(0x64); db(0x12); db(0x53); db(0xab); db(0x00); db(0x34); db(0x6a); db(0x0c); @@ -716,7 +716,7 @@ db(0x00); db(0x14); db(0x65); db(0x18); db(0x2f); db(0x0e); db(0x2c); db(0x6d); db(0x02); db(0x08); db(0x2c); db(0x6e); db(0x00); db(0x14); db(0x4e); db(0xae); db(0xff); db(0xd6); db(0x2c); db(0x5f); db(0x02); db(0x40); db(0x7f); db(0xff); - db(0x35); db(0x40); db(0x00); db(0x08); db(0x61); db(0x00); db(0xfb); db(0x3e); + db(0x81); db(0x6a); db(0x00); db(0x08); db(0x61); db(0x00); db(0xfb); db(0x3e); db(0x60); db(0x00); db(0xfd); db(0x10); db(0x4e); db(0x75); db(0x22); db(0x2c); db(0x00); db(0x22); db(0x70); db(0x00); db(0x08); db(0x01); db(0x00); db(0x00); db(0x67); db(0x04); db(0x08); db(0xc0); db(0x00); db(0x0e); db(0x08); db(0x01); @@ -731,29 +731,29 @@ db(0x22); db(0x69); db(0x00); db(0x1e); db(0x4e); db(0xae); db(0xfe); db(0xbc); db(0x22); db(0x5f); db(0x53); db(0x69); db(0x00); db(0x46); db(0x6a); db(0x10); db(0x33); db(0x7c); db(0x00); db(0x32); db(0x00); db(0x46); db(0x30); db(0x3c); - db(0xff); db(0xff); db(0x61); db(0x00); db(0x09); db(0xa2); db(0x50); db(0xd0); + db(0xff); db(0xff); db(0x61); db(0x00); db(0x0a); db(0x7c); db(0x50); db(0xd0); db(0x41); db(0xf9); db(0x00); db(0xdf); db(0xf0); db(0x00); db(0x70); db(0x00); db(0x4e); db(0x75); db(0x48); db(0xe7); db(0x00); db(0x06); db(0x30); db(0x3c); - db(0xff); db(0x38); db(0x72); db(0x11); db(0x61); db(0x00); db(0x09); db(0x88); + db(0xff); db(0x38); db(0x72); db(0x11); db(0x61); db(0x00); db(0x0a); db(0x52); db(0x4e); db(0x90); db(0x08); db(0x00); db(0x00); db(0x00); db(0x67); db(0x42); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x20); db(0x3c); db(0x00); db(0x00); db(0x00); db(0x88); db(0x22); db(0x3c); db(0x00); db(0x01); db(0x00); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x4a); db(0x80); db(0x67); db(0x00); db(0x00); db(0x40); db(0x2a); db(0x40); db(0x2b); db(0x4e); db(0x00); db(0x14); db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x0e); db(0x61); db(0x00); - db(0x09); db(0x56); db(0x20); db(0x0d); db(0x4e); db(0x90); db(0x41); db(0xfa); - db(0x09); db(0xdb); db(0x43); db(0xfa); db(0x01); db(0x14); db(0x70); db(0xf6); + db(0x0a); db(0x20); db(0x20); db(0x0d); db(0x4e); db(0x90); db(0x41); db(0xfa); + db(0x0a); db(0xb9); db(0x43); db(0xfa); db(0x01); db(0x14); db(0x70); db(0xf6); db(0x22); db(0x3c); db(0x00); db(0x00); db(0x27); db(0x10); db(0x61); db(0x00); db(0xea); db(0xd2); db(0x70); db(0x00); db(0x4c); db(0xdf); db(0x60); db(0x00); db(0x4e); db(0x75); db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x0a); - db(0x61); db(0x00); db(0x09); db(0x2c); db(0x4e); db(0x90); db(0x4e); db(0x75); + db(0x61); db(0x00); db(0x09); db(0xf6); db(0x4e); db(0x90); db(0x4e); db(0x75); db(0x61); db(0xf0); db(0x20); db(0x0d); db(0x67); db(0x1c); db(0x2c); db(0x6d); db(0x00); db(0x14); db(0x20); db(0x2d); db(0x00); db(0x18); db(0x67); db(0x06); db(0x22); db(0x40); db(0x4e); db(0xae); db(0xfe); db(0x62); db(0x22); db(0x4d); db(0x20); db(0x3c); db(0x00); db(0x00); db(0x00); db(0x88); db(0x4e); db(0xae); db(0xff); db(0x2e); db(0x70); db(0x00); db(0x4e); db(0x75); db(0x48); db(0xe7); db(0x38); db(0x3e); db(0x2c); db(0x6d); db(0x00); db(0x18); db(0x41); db(0xfa); - db(0x09); db(0x69); db(0x22); db(0x08); db(0x24); db(0x3c); db(0x00); db(0x00); + db(0x0a); db(0x47); db(0x22); db(0x08); db(0x24); db(0x3c); db(0x00); db(0x00); db(0x03); db(0xed); db(0x4e); db(0xae); db(0xff); db(0xe2); db(0x28); db(0x00); db(0x67); db(0x4c); db(0x45); db(0xed); db(0x00); db(0x68); db(0x42); db(0x92); db(0x34); db(0xaa); db(0x00); db(0x02); db(0x24); db(0x0a); db(0x54); db(0x82); @@ -764,31 +764,31 @@ db(0x76); db(0x20); db(0x22); db(0x04); db(0x4e); db(0xae); db(0xff); db(0xd6); db(0xb6); db(0x80); db(0x66); db(0x12); db(0x4a); db(0x6a); db(0x00); db(0x10); db(0x66); db(0xc4); db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x10); - db(0x61); db(0x00); db(0x08); db(0x9c); db(0x4e); db(0x90); db(0x22); db(0x04); + db(0x61); db(0x00); db(0x09); db(0x66); db(0x4e); db(0x90); db(0x22); db(0x04); db(0x67); db(0x04); db(0x4e); db(0xae); db(0xff); db(0xdc); db(0x4c); db(0xdf); db(0x7c); db(0x1c); db(0x4e); db(0x75); db(0x2c); db(0x6d); db(0x00); db(0x18); - db(0x41); db(0xfa); db(0x08); db(0xdc); db(0x22); db(0x08); db(0x74); db(0xfe); + db(0x41); db(0xfa); db(0x09); db(0xba); db(0x22); db(0x08); db(0x74); db(0xfe); db(0x4e); db(0xae); db(0xff); db(0xac); db(0x22); db(0x00); db(0x67); db(0x34); db(0x4e); db(0xae); db(0xff); db(0xa6); db(0x2c); db(0x6d); db(0x00); db(0x14); db(0x45); db(0xed); db(0x00); db(0x38); db(0x70); db(0xff); db(0x4e); db(0xae); db(0xfe); db(0xb6); db(0x15); db(0x40); db(0x00); db(0x14); db(0x41); db(0xfa); - db(0x08); db(0xd1); db(0x24); db(0x88); db(0x25); db(0x7c); db(0x00); db(0x00); + db(0x09); db(0xaf); db(0x24); db(0x88); db(0x25); db(0x7c); db(0x00); db(0x00); db(0x00); db(0x12); db(0x00); db(0x0c); db(0x25); db(0x6d); db(0x00); db(0x08); db(0x00); db(0x10); db(0x2c); db(0x6d); db(0x00); db(0x18); db(0x22); db(0x0a); db(0x4e); db(0xae); db(0xfc); db(0x88); db(0x2c); db(0x6d); db(0x00); db(0x14); db(0x4e); db(0x75); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x10); db(0x00); db(0x00); db(0x00); db(0x00); db(0x30); db(0x3c); db(0xff); db(0x38); - db(0x72); db(0x0d); db(0x61); db(0x00); db(0x08); db(0x2a); db(0x4e); db(0x90); + db(0x72); db(0x0d); db(0x61); db(0x00); db(0x08); db(0xf4); db(0x4e); db(0x90); db(0x4a); db(0x80); db(0x67); db(0x00); db(0xfe); db(0xfc); db(0x2a); db(0x40); db(0x2c); db(0x6d); db(0x00); db(0x14); db(0x93); db(0xc9); db(0x4e); db(0xae); db(0xfe); db(0xda); db(0x2b); db(0x40); db(0x00); db(0x08); db(0x43); db(0xfa); - db(0x09); db(0x2f); db(0x70); db(0x00); db(0x4e); db(0xae); db(0xfd); db(0xd8); + db(0x0a); db(0x0d); db(0x70); db(0x00); db(0x4e); db(0xae); db(0xfd); db(0xd8); db(0x2b); db(0x40); db(0x00); db(0x18); db(0x67); db(0x00); db(0xfe); db(0xda); db(0x2c); db(0x40); db(0x72); db(0x32); db(0x4e); db(0xae); db(0xff); db(0x3a); - db(0x41); db(0xfa); db(0x08); db(0x30); db(0x22); db(0x08); db(0x74); db(0xfe); + db(0x41); db(0xfa); db(0x09); db(0x0e); db(0x22); db(0x08); db(0x74); db(0xfe); db(0x4e); db(0xae); db(0xff); db(0xac); db(0x4a); db(0x80); db(0x67); db(0xea); db(0x22); db(0x00); db(0x4e); db(0xae); db(0xff); db(0xa6); db(0x72); db(0x32); - db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x41); db(0xfa); db(0x08); db(0x1a); + db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x41); db(0xfa); db(0x08); db(0xf8); db(0x22); db(0x08); db(0x74); db(0xfe); db(0x4e); db(0xae); db(0xff); db(0xac); db(0x4a); db(0x80); db(0x67); db(0x00); db(0xfe); db(0xa4); db(0x22); db(0x00); db(0x4e); db(0xae); db(0xff); db(0xa6); db(0x2c); db(0x6d); db(0x00); db(0x14); @@ -797,7 +797,7 @@ db(0x4a); db(0x80); db(0x67); db(0x00); db(0xfe); db(0x84); db(0x70); db(0x00); db(0x08); db(0xc0); db(0x00); db(0x0d); db(0x4e); db(0xae); db(0xfe); db(0xc2); db(0x72); db(0x00); db(0x20); db(0x2d); db(0x00); db(0x0c); db(0x41); db(0xfa); - db(0x07); db(0xf8); db(0x22); db(0x4c); db(0x4e); db(0xae); db(0xfe); db(0x44); + db(0x08); db(0xd6); db(0x22); db(0x4c); db(0x4e); db(0xae); db(0xfe); db(0x44); db(0x4a); db(0x80); db(0x66); db(0xe2); db(0x20); db(0x6c); db(0x00); db(0x14); db(0x0c); db(0x68); db(0x00); db(0x25); db(0x00); db(0x14); db(0x64); db(0x0c); db(0x61); db(0x00); db(0xfe); db(0x48); db(0x70); db(0x00); db(0x4e); db(0xae); @@ -807,7 +807,7 @@ db(0x00); db(0x0c); db(0x00); db(0x1c); db(0x2b); db(0x4d); db(0x00); db(0x2c); db(0x41); db(0xfa); db(0x01); db(0x60); db(0x2b); db(0x48); db(0x00); db(0x24); db(0x22); db(0x4c); db(0x4e); db(0xae); db(0xfe); db(0x38); db(0x30); db(0x3c); - db(0xff); db(0x38); db(0x72); db(0x0f); db(0x61); db(0x00); db(0x07); db(0x40); + db(0xff); db(0x38); db(0x72); db(0x0f); db(0x61); db(0x00); db(0x08); db(0x0a); db(0x4e); db(0x90); db(0x4a); db(0xad); db(0x00); db(0x00); db(0x66); db(0x1c); db(0x70); db(0x00); db(0x74); db(0x00); db(0x14); db(0x2d); db(0x00); db(0x4c); db(0x05); db(0xc0); db(0x08); db(0xc0); db(0x00); db(0x0d); db(0x4e); db(0xae); @@ -815,7 +815,7 @@ db(0xfe); db(0x1e); db(0x60); db(0xe4); db(0x20); db(0x2d); db(0x00); db(0x00); db(0x67); db(0x00); db(0x00); db(0x76); db(0x72); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x2b); db(0x40); db(0x00); db(0x04); db(0x30); db(0x3c); - db(0xff); db(0x38); db(0x72); db(0x0c); db(0x61); db(0x00); db(0x07); db(0x00); + db(0xff); db(0x38); db(0x72); db(0x0c); db(0x61); db(0x00); db(0x07); db(0xca); db(0x4e); db(0x90); db(0x4a); db(0x80); db(0x67); db(0x40); db(0x4a); db(0xad); db(0x00); db(0x04); db(0x67); db(0x3a); db(0x39); db(0x7c); db(0x00); db(0x03); db(0x00); db(0x1c); db(0x42); db(0x2c); db(0x00); db(0x1f); db(0x42); db(0xac); @@ -843,7 +843,7 @@ db(0x00); db(0x28); db(0x20); db(0x02); db(0x51); db(0x80); db(0x29); db(0x40); db(0x00); db(0x24); db(0x22); db(0x4c); db(0x4e); db(0xae); db(0xfe); db(0x38); db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x0b); db(0x61); db(0x00); - db(0x06); db(0x26); db(0x20); db(0x2c); db(0x00); db(0x20); db(0x4e); db(0x90); + db(0x06); db(0xf0); db(0x20); db(0x2c); db(0x00); db(0x20); db(0x4e); db(0x90); db(0x22); db(0x4a); db(0x20); db(0x02); db(0x4e); db(0xae); db(0xff); db(0x2e); db(0x4a); db(0xac); db(0x00); db(0x20); db(0x67); db(0x00); db(0xfe); db(0xda); db(0x41); db(0xed); db(0x00); db(0x30); db(0x29); db(0x48); db(0x00); db(0x28); @@ -856,26 +856,26 @@ db(0x08); db(0xc0); db(0x00); db(0x0d); db(0x4e); db(0xae); db(0xfe); db(0xbc); db(0x2c); db(0x5f); db(0x70); db(0x00); db(0x4e); db(0x75); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x74); db(0xff); db(0x30); db(0x3c); db(0xff); db(0x38); - db(0x72); db(0x11); db(0x61); db(0x00); db(0x05); db(0xba); db(0x4e); db(0x90); + db(0x72); db(0x11); db(0x61); db(0x00); db(0x06); db(0x84); db(0x4e); db(0x90); db(0x08); db(0x00); db(0x00); db(0x01); db(0x67); db(0x38); db(0x74); db(0x00); db(0x4e); db(0xae); db(0xff); db(0x7c); db(0x41); db(0xee); db(0x01); db(0x5e); - db(0x43); db(0xfa); db(0x05); db(0xcc); db(0x4e); db(0xae); db(0xfe); db(0xec); + db(0x43); db(0xfa); db(0x06); db(0xaa); db(0x4e); db(0xae); db(0xfe); db(0xec); db(0x4a); db(0x80); db(0x67); db(0x1e); db(0x20); db(0x40); db(0x43); db(0xfa); db(0x00); db(0x22); db(0x24); db(0x68); db(0xff); db(0xe4); db(0x21); db(0x49); db(0xff); db(0xe4); db(0x22); db(0x48); db(0x30); db(0x3c); db(0xff); db(0x38); - db(0x72); db(0x65); db(0x61); db(0x00); db(0x05); db(0x82); db(0x4e); db(0x90); + db(0x72); db(0x65); db(0x61); db(0x00); db(0x06); db(0x4c); db(0x4e); db(0x90); db(0x74); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x76); db(0x20); db(0x02); db(0x4e); db(0x75); db(0x59); db(0x8f); db(0x48); db(0xe7); db(0xc0); db(0x80); db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x66); db(0x61); db(0x00); - db(0x05); db(0x66); db(0x4e); db(0x90); db(0x4c); db(0xdf); db(0x01); db(0x03); + db(0x06); db(0x30); db(0x4e); db(0x90); db(0x4c); db(0xdf); db(0x01); db(0x03); db(0x4e); db(0x75); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x41); db(0xfa); - db(0x06); db(0x6a); db(0x43); db(0xfa); db(0x00); db(0x14); db(0x70); db(0x0f); + db(0x07); db(0x48); db(0x43); db(0xfa); db(0x00); db(0x14); db(0x70); db(0x0f); db(0x22); db(0x3c); db(0x00); db(0x00); db(0x1f); db(0x40); db(0x61); db(0x00); db(0xe6); db(0xda); db(0x4e); db(0x75); db(0x00); db(0x00); db(0x00); db(0x10); db(0x00); db(0x00); db(0x00); db(0x00); db(0x2c); db(0x78); db(0x00); db(0x04); - db(0x70); db(0x00); db(0x43); db(0xfa); db(0x06); db(0x53); db(0x4e); db(0xae); + db(0x70); db(0x00); db(0x43); db(0xfa); db(0x07); db(0x31); db(0x4e); db(0xae); db(0xfd); db(0xd8); db(0x72); db(0x02); db(0x30); db(0x3c); db(0xff); db(0x78); - db(0x61); db(0x00); db(0x05); db(0x24); db(0x24); db(0x48); db(0x72); db(0x01); + db(0x61); db(0x00); db(0x05); db(0xee); db(0x24); db(0x48); db(0x72); db(0x01); db(0x4e); db(0x90); db(0x4a); db(0x81); db(0x67); db(0x0c); db(0x26); db(0x41); db(0x4e); db(0xae); db(0xfe); db(0x08); db(0x72); db(0x02); db(0x20); db(0x4b); db(0x4e); db(0x92); db(0x22); db(0x4e); db(0x2c); db(0x78); db(0x00); db(0x04); @@ -906,7 +906,7 @@ db(0xbc); db(0xfc); db(0x00); db(0x00); db(0x67); db(0x06); db(0x4e); db(0xae); db(0xff); db(0x6a); db(0x4e); db(0x75); db(0x48); db(0xe7); db(0x38); db(0x3e); db(0x24); db(0x48); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x43); db(0xfa); - db(0x05); db(0x4f); db(0x4e); db(0xae); db(0xfe); db(0x68); db(0x2a); db(0x40); + db(0x06); db(0x2d); db(0x4e); db(0xae); db(0xfe); db(0x68); db(0x2a); db(0x40); db(0x20); db(0x6d); db(0x00); db(0x22); db(0x20); db(0x28); db(0x00); db(0x18); db(0xe5); db(0x88); db(0x26); db(0x40); db(0x24); db(0xab); db(0x00); db(0x04); db(0x20); db(0x0a); db(0xe4); db(0x88); db(0x27); db(0x40); db(0x00); db(0x04); @@ -918,7 +918,7 @@ db(0x20); db(0x40); db(0x41); db(0xe8); db(0x00); db(0x5c); db(0xe5); db(0x8a); db(0x22); db(0x42); db(0x22); db(0x51); db(0x4e); db(0xae); db(0xfe); db(0x92); db(0x22); db(0x02); db(0x43); db(0xfa); db(0x00); db(0x0e); db(0x30); db(0x3c); - db(0xff); db(0x68); db(0x61); db(0x00); db(0x03); db(0xca); db(0x4e); db(0x90); + db(0xff); db(0x68); db(0x61); db(0x00); db(0x04); db(0x94); db(0x4e); db(0x90); db(0x4e); db(0xd0); db(0x70); db(0x30); db(0x60); db(0x0a); db(0x70); db(0x28); db(0x60); db(0x06); db(0x20); db(0x06); db(0x60); db(0x02); db(0x20); db(0x06); db(0x12); db(0xd8); db(0x53); db(0x80); db(0x6e); db(0xfa); db(0x4e); db(0x75); @@ -926,18 +926,18 @@ db(0x00); db(0x00); db(0x00); db(0x04); db(0x00); db(0x00); db(0x00); db(0x02); db(0x48); db(0xe7); db(0x00); db(0x22); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x20); db(0x3c); db(0x00); db(0x00); db(0xff); db(0xfc); db(0x61); db(0x00); - db(0x03); db(0x8e); db(0x24); db(0x48); db(0x20); db(0x08); db(0x42); db(0x40); + db(0x04); db(0x68); db(0x24); db(0x48); db(0x20); db(0x08); db(0x42); db(0x40); db(0x20); db(0x40); db(0x21); db(0x4e); db(0x3f); db(0xfc); db(0x70); db(0x1a); db(0x22); db(0x3c); db(0x00); db(0x01); db(0x00); db(0x01); db(0x4e); db(0xae); - db(0xff); db(0x3a); db(0x22); db(0x40); db(0x41); db(0xfa); db(0x05); db(0x14); + db(0xff); db(0x3a); db(0x22); db(0x40); db(0x41); db(0xfa); db(0x05); db(0xf2); db(0x23); db(0x48); db(0x00); db(0x0a); db(0x23); db(0x4a); db(0x00); db(0x0e); db(0x41); db(0xfa); db(0x01); db(0x30); db(0x23); db(0x48); db(0x00); db(0x12); db(0x33); db(0x7c); db(0x02); db(0x7a); db(0x00); db(0x08); db(0x70); db(0x0d); db(0x4e); db(0xae); db(0xff); db(0x58); db(0x4c); db(0xdf); db(0x44); db(0x00); db(0x4e); db(0x75); db(0x48); db(0xe7); db(0xc0); db(0xc0); db(0x20); db(0x3c); - db(0x00); db(0x00); db(0xf0); db(0x00); db(0x61); db(0x00); db(0x03); db(0x40); + db(0x00); db(0x00); db(0xf0); db(0x00); db(0x61); db(0x00); db(0x04); db(0x1a); db(0x22); db(0x48); db(0x20); db(0x3c); db(0x00); db(0x00); db(0x40); db(0x00); - db(0x61); db(0x00); db(0x03); db(0x34); db(0x70); db(0x03); db(0x4a); db(0x69); + db(0x61); db(0x00); db(0x04); db(0x0e); db(0x70); db(0x03); db(0x4a); db(0x69); db(0x00); db(0x02); db(0x67); db(0x0e); db(0xd0); db(0xfc); db(0x20); db(0x00); db(0xd2); db(0xfc); db(0x00); db(0x08); db(0x51); db(0xc8); db(0xff); db(0xf0); db(0x60); db(0xd4); db(0x48); db(0xe8); db(0x00); db(0xfc); db(0x00); db(0x0c); @@ -999,7 +999,7 @@ db(0x0c); db(0x44); db(0x00); db(0x24); db(0x67); db(0x28); db(0x32); db(0x3c); db(0x00); db(0xb6); db(0x0c); db(0x44); db(0x00); db(0x26); db(0x67); db(0x1e); db(0x20); db(0x3c); db(0x00); db(0x00); db(0xff); db(0xf4); db(0x61); db(0x00); - db(0x01); db(0x46); db(0x20); db(0x10); db(0x67); db(0x10); db(0x22); db(0x40); + db(0x02); db(0x20); db(0x20); db(0x10); db(0x67); db(0x10); db(0x22); db(0x40); db(0x20); db(0x3c); db(0x00); db(0x00); db(0x01); db(0x00); db(0x4e); db(0xae); db(0xfe); db(0xbc); db(0x70); db(0x01); db(0x60); db(0x10); db(0xd6); db(0xc1); db(0x4c); db(0xd4); db(0x07); db(0x00); db(0x4c); db(0xd4); db(0x00); db(0x07); @@ -1039,59 +1039,87 @@ db(0x00); db(0x0f); db(0xe0); db(0x4b); db(0xc6); db(0xfc); db(0x00); db(0x14); db(0xe5); db(0x4e); db(0xd6); db(0x46); db(0x2b); db(0x80); db(0x30); db(0x04); db(0xd8); db(0xfc); db(0x00); db(0x10); db(0x53); db(0x87); db(0x66); db(0xc2); - db(0x4c); db(0xdf); db(0x7f); db(0xff); db(0x4e); db(0x75); db(0x41); db(0xfa); - db(0xdf); db(0x6c); db(0x02); db(0x80); db(0x00); db(0x00); db(0xff); db(0xff); - db(0xd1); db(0xc0); db(0x4e); db(0x75); db(0x69); db(0x6e); db(0x70); db(0x75); - db(0x74); db(0x2e); db(0x64); db(0x65); db(0x76); db(0x69); db(0x63); db(0x65); - db(0x00); db(0x74); db(0x69); db(0x6d); db(0x65); db(0x72); db(0x2e); db(0x64); - db(0x65); db(0x76); db(0x69); db(0x63); db(0x65); db(0x00); db(0x63); db(0x6f); - db(0x6e); db(0x73); db(0x6f); db(0x6c); db(0x65); db(0x2e); db(0x64); db(0x65); - db(0x76); db(0x69); db(0x63); db(0x65); db(0x00); db(0x44); db(0x45); db(0x56); - db(0x53); db(0x00); db(0x44); db(0x45); db(0x56); db(0x53); db(0x3a); db(0x00); - db(0x44); db(0x45); db(0x56); db(0x53); db(0x3a); db(0x63); db(0x6c); db(0x69); - db(0x70); db(0x62); db(0x6f); db(0x61); db(0x72); db(0x64); db(0x2e); db(0x64); - db(0x65); db(0x76); db(0x69); db(0x63); db(0x65); db(0x00); db(0x52); db(0x41); - db(0x4d); db(0x3a); db(0x00); db(0x4e); db(0x49); db(0x4c); db(0x3a); db(0x00); - db(0x63); db(0x6c); db(0x69); db(0x70); db(0x62); db(0x6f); db(0x61); db(0x72); - db(0x64); db(0x2e); db(0x64); db(0x65); db(0x76); db(0x69); db(0x63); db(0x65); - db(0x00); db(0x52); db(0x41); db(0x4d); db(0x3a); db(0x45); db(0x6e); db(0x76); - db(0x2f); db(0x53); db(0x79); db(0x73); db(0x2f); db(0x50); db(0x6f); db(0x69); - db(0x6e); db(0x74); db(0x65); db(0x72); db(0x2e); db(0x70); db(0x72); db(0x65); - db(0x66); db(0x73); db(0x00); db(0x55); db(0x41); db(0x45); db(0x20); db(0x63); - db(0x6c); db(0x69); db(0x70); db(0x62); db(0x6f); db(0x61); db(0x72); db(0x64); - db(0x20); db(0x73); db(0x68); db(0x61); db(0x72); db(0x69); db(0x6e); db(0x67); - db(0x00); db(0x55); db(0x41); db(0x45); db(0x20); db(0x6d); db(0x6f); db(0x75); - db(0x73); db(0x65); db(0x20); db(0x64); db(0x72); db(0x69); db(0x76); db(0x65); - db(0x72); db(0x00); db(0x55); db(0x41); db(0x45); db(0x20); db(0x68); db(0x65); - db(0x61); db(0x72); db(0x74); db(0x20); db(0x62); db(0x65); db(0x61); db(0x74); - db(0x00); db(0x55); db(0x41); db(0x45); db(0x20); db(0x66); db(0x73); db(0x00); - db(0x55); db(0x41); db(0x45); db(0x20); db(0x66); db(0x73); db(0x20); db(0x61); - db(0x75); db(0x74); db(0x6f); db(0x6d); db(0x6f); db(0x75); db(0x6e); db(0x74); - db(0x65); db(0x72); db(0x00); db(0x55); db(0x41); db(0x45); db(0x20); db(0x66); - db(0x73); db(0x20); db(0x77); db(0x6f); db(0x72); db(0x6b); db(0x65); db(0x72); - db(0x00); db(0x55); db(0x41); db(0x45); db(0x20); db(0x74); db(0x72); db(0x61); - db(0x70); db(0x20); db(0x77); db(0x6f); db(0x72); db(0x6b); db(0x65); db(0x72); + db(0x4c); db(0xdf); db(0x7f); db(0xff); db(0x4e); db(0x75); db(0x2a); db(0x48); + db(0x7e); db(0x14); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x4e); db(0xae); + db(0xff); db(0x7c); db(0x30); db(0x3c); db(0xff); db(0x38); db(0x61); db(0x00); + db(0x00); db(0xc8); db(0x24); db(0x0d); db(0x72); db(0x13); db(0x4e); db(0x90); + db(0x4a); db(0x80); db(0x67); db(0x00); db(0x00); db(0x98); db(0x26); db(0x40); + db(0x28); db(0x5b); db(0x20); db(0x4c); db(0x22); db(0x4d); db(0x30); db(0x3c); + db(0x3f); db(0xff); db(0x22); db(0xd8); db(0x51); db(0xc8); db(0xff); db(0xfc); + db(0x22); db(0x0d); db(0x92); db(0x8c); db(0x20); db(0x4b); db(0x70); db(0x00); + db(0x30); db(0x18); db(0x67); db(0x0e); db(0x43); db(0xf4); db(0x08); db(0x00); + db(0xd3); db(0x91); db(0x43); db(0xf5); db(0x08); db(0x00); db(0xd3); db(0x91); + db(0x60); db(0xec); db(0x70); db(0x00); db(0x20); db(0x18); db(0x67); db(0x06); + db(0x22); db(0x40); db(0xd3); db(0x91); db(0x60); db(0xf4); db(0x70); db(0x00); + db(0x61); db(0x00); db(0x00); db(0x7e); db(0x43); db(0xfa); db(0x00); db(0x7a); + db(0x93); db(0xc8); db(0xd3); db(0xcd); db(0x32); db(0xfc); db(0x41); db(0xf9); + db(0x22); db(0xcc); db(0x32); db(0xfc); db(0x02); db(0x80); db(0x22); db(0xfc); + db(0x00); db(0x00); db(0xff); db(0xff); db(0x22); db(0xbc); db(0xd1); db(0xc0); + db(0x4e); db(0x75); db(0x41); db(0xfa); db(0x00); db(0x40); db(0x70); db(0x00); + db(0x30); db(0x18); db(0x67); db(0x14); db(0x06); db(0x40); db(0x00); db(0x0c); + db(0x43); db(0xf4); db(0x08); db(0x00); db(0x32); db(0xfc); db(0x4e); db(0xf9); + db(0x45); db(0xf5); db(0x08); db(0x00); db(0x22); db(0x8a); db(0x60); db(0xe6); + db(0x0c); db(0x6e); db(0x00); db(0x24); db(0x00); db(0x14); db(0x65); db(0x04); + db(0x4e); db(0xae); db(0xfd); db(0x84); db(0x30); db(0x3c); db(0xff); db(0x38); + db(0x61); db(0x00); db(0x00); db(0x2e); db(0x24); db(0x0d); db(0x72); db(0x14); + db(0x4e); db(0x90); db(0x7e); db(0x00); db(0x4e); db(0xae); db(0xff); db(0x76); + db(0x20); db(0x07); db(0x4e); db(0x75); db(0x0e); db(0x90); db(0x13); db(0x82); + db(0x05); db(0x58); db(0x02); db(0xa0); db(0x03); db(0x26); db(0x00); db(0x00); + db(0x41); db(0xfa); db(0xde); db(0xa2); db(0x02); db(0x80); db(0x00); db(0x00); + db(0xff); db(0xff); db(0xd1); db(0xc0); db(0x4e); db(0x75); db(0x00); db(0x00); + db(0x41); db(0xfa); db(0xde); db(0x92); db(0x02); db(0x80); db(0x00); db(0x00); + db(0xff); db(0xff); db(0xd1); db(0xc0); db(0x4e); db(0x75); db(0x4e); db(0x71); + db(0x4e); db(0x71); db(0x69); db(0x6e); db(0x70); db(0x75); db(0x74); db(0x2e); + db(0x64); db(0x65); db(0x76); db(0x69); db(0x63); db(0x65); db(0x00); db(0x74); + db(0x69); db(0x6d); db(0x65); db(0x72); db(0x2e); db(0x64); db(0x65); db(0x76); + db(0x69); db(0x63); db(0x65); db(0x00); db(0x63); db(0x6f); db(0x6e); db(0x73); + db(0x6f); db(0x6c); db(0x65); db(0x2e); db(0x64); db(0x65); db(0x76); db(0x69); + db(0x63); db(0x65); db(0x00); db(0x44); db(0x45); db(0x56); db(0x53); db(0x00); + db(0x44); db(0x45); db(0x56); db(0x53); db(0x3a); db(0x00); db(0x44); db(0x45); + db(0x56); db(0x53); db(0x3a); db(0x63); db(0x6c); db(0x69); db(0x70); db(0x62); + db(0x6f); db(0x61); db(0x72); db(0x64); db(0x2e); db(0x64); db(0x65); db(0x76); + db(0x69); db(0x63); db(0x65); db(0x00); db(0x52); db(0x41); db(0x4d); db(0x3a); + db(0x00); db(0x4e); db(0x49); db(0x4c); db(0x3a); db(0x00); db(0x63); db(0x6c); + db(0x69); db(0x70); db(0x62); db(0x6f); db(0x61); db(0x72); db(0x64); db(0x2e); + db(0x64); db(0x65); db(0x76); db(0x69); db(0x63); db(0x65); db(0x00); db(0x52); + db(0x41); db(0x4d); db(0x3a); db(0x45); db(0x6e); db(0x76); db(0x2f); db(0x53); + db(0x79); db(0x73); db(0x2f); db(0x50); db(0x6f); db(0x69); db(0x6e); db(0x74); + db(0x65); db(0x72); db(0x2e); db(0x70); db(0x72); db(0x65); db(0x66); db(0x73); + db(0x00); db(0x55); db(0x41); db(0x45); db(0x20); db(0x63); db(0x6c); db(0x69); + db(0x70); db(0x62); db(0x6f); db(0x61); db(0x72); db(0x64); db(0x20); db(0x73); + db(0x68); db(0x61); db(0x72); db(0x69); db(0x6e); db(0x67); db(0x00); db(0x55); + db(0x41); db(0x45); db(0x20); db(0x6d); db(0x6f); db(0x75); db(0x73); db(0x65); + db(0x20); db(0x64); db(0x72); db(0x69); db(0x76); db(0x65); db(0x72); db(0x00); + db(0x55); db(0x41); db(0x45); db(0x20); db(0x68); db(0x65); db(0x61); db(0x72); + db(0x74); db(0x20); db(0x62); db(0x65); db(0x61); db(0x74); db(0x00); db(0x55); + db(0x41); db(0x45); db(0x20); db(0x66); db(0x73); db(0x00); db(0x55); db(0x41); + db(0x45); db(0x20); db(0x66); db(0x73); db(0x20); db(0x61); db(0x75); db(0x74); + db(0x6f); db(0x6d); db(0x6f); db(0x75); db(0x6e); db(0x74); db(0x65); db(0x72); db(0x00); db(0x55); db(0x41); db(0x45); db(0x20); db(0x66); db(0x73); db(0x20); - db(0x61); db(0x75); db(0x74); db(0x6f); db(0x6d); db(0x6f); db(0x75); db(0x6e); - db(0x74); db(0x20); db(0x70); db(0x72); db(0x6f); db(0x63); db(0x65); db(0x73); - db(0x73); db(0x00); db(0x55); db(0x41); db(0x45); db(0x20); db(0x64); db(0x65); - db(0x62); db(0x75); db(0x67); db(0x67); db(0x65); db(0x72); db(0x00); db(0x64); - db(0x6f); db(0x73); db(0x2e); db(0x6c); db(0x69); db(0x62); db(0x72); db(0x61); - db(0x72); db(0x79); db(0x00); db(0x69); db(0x6e); db(0x74); db(0x75); db(0x69); - db(0x74); db(0x69); db(0x6f); db(0x6e); db(0x2e); db(0x6c); db(0x69); db(0x62); - db(0x72); db(0x61); db(0x72); db(0x79); db(0x00); db(0x67); db(0x72); db(0x61); - db(0x70); db(0x68); db(0x69); db(0x63); db(0x73); db(0x2e); db(0x6c); db(0x69); - db(0x62); db(0x72); db(0x61); db(0x72); db(0x79); db(0x00); db(0x65); db(0x78); - db(0x70); db(0x61); db(0x6e); db(0x73); db(0x69); db(0x6f); db(0x6e); db(0x2e); - db(0x6c); db(0x69); db(0x62); db(0x72); db(0x61); db(0x72); db(0x79); db(0x00); - db(0x46); db(0x69); db(0x6c); db(0x65); db(0x53); db(0x79); db(0x73); db(0x74); - db(0x65); db(0x6d); db(0x2e); db(0x72); db(0x65); db(0x73); db(0x6f); db(0x75); - db(0x72); db(0x63); db(0x65); db(0x00); db(0x6d); db(0x65); db(0x67); db(0x61); - db(0x63); db(0x68); db(0x69); db(0x70); db(0x20); db(0x6d); db(0x65); db(0x6d); - db(0x6f); db(0x72); db(0x79); db(0x00); db(0x46); db(0x69); db(0x6c); db(0x65); - db(0x20); db(0x53); db(0x79); db(0x73); db(0x74); db(0x65); db(0x6d); db(0x00); - db(0x55); db(0x41); db(0x45); db(0x20); db(0x73); db(0x68); db(0x65); db(0x6c); - db(0x6c); db(0x20); db(0x65); db(0x78); db(0x65); db(0x63); db(0x75); db(0x74); - db(0x65); db(0x00); db(0x55); db(0x41); db(0x45); db(0x20); db(0x62); db(0x6f); - db(0x61); db(0x72); db(0x64); db(0x00); db(0x00); db(0x00); db(0x03); db(0xf2); + db(0x77); db(0x6f); db(0x72); db(0x6b); db(0x65); db(0x72); db(0x00); db(0x55); + db(0x41); db(0x45); db(0x20); db(0x74); db(0x72); db(0x61); db(0x70); db(0x20); + db(0x77); db(0x6f); db(0x72); db(0x6b); db(0x65); db(0x72); db(0x00); db(0x55); + db(0x41); db(0x45); db(0x20); db(0x66); db(0x73); db(0x20); db(0x61); db(0x75); + db(0x74); db(0x6f); db(0x6d); db(0x6f); db(0x75); db(0x6e); db(0x74); db(0x20); + db(0x70); db(0x72); db(0x6f); db(0x63); db(0x65); db(0x73); db(0x73); db(0x00); + db(0x55); db(0x41); db(0x45); db(0x20); db(0x64); db(0x65); db(0x62); db(0x75); + db(0x67); db(0x67); db(0x65); db(0x72); db(0x00); db(0x64); db(0x6f); db(0x73); + db(0x2e); db(0x6c); db(0x69); db(0x62); db(0x72); db(0x61); db(0x72); db(0x79); + db(0x00); db(0x69); db(0x6e); db(0x74); db(0x75); db(0x69); db(0x74); db(0x69); + db(0x6f); db(0x6e); db(0x2e); db(0x6c); db(0x69); db(0x62); db(0x72); db(0x61); + db(0x72); db(0x79); db(0x00); db(0x67); db(0x72); db(0x61); db(0x70); db(0x68); + db(0x69); db(0x63); db(0x73); db(0x2e); db(0x6c); db(0x69); db(0x62); db(0x72); + db(0x61); db(0x72); db(0x79); db(0x00); db(0x65); db(0x78); db(0x70); db(0x61); + db(0x6e); db(0x73); db(0x69); db(0x6f); db(0x6e); db(0x2e); db(0x6c); db(0x69); + db(0x62); db(0x72); db(0x61); db(0x72); db(0x79); db(0x00); db(0x46); db(0x69); + db(0x6c); db(0x65); db(0x53); db(0x79); db(0x73); db(0x74); db(0x65); db(0x6d); + db(0x2e); db(0x72); db(0x65); db(0x73); db(0x6f); db(0x75); db(0x72); db(0x63); + db(0x65); db(0x00); db(0x6d); db(0x65); db(0x67); db(0x61); db(0x63); db(0x68); + db(0x69); db(0x70); db(0x20); db(0x6d); db(0x65); db(0x6d); db(0x6f); db(0x72); + db(0x79); db(0x00); db(0x46); db(0x69); db(0x6c); db(0x65); db(0x20); db(0x53); + db(0x79); db(0x73); db(0x74); db(0x65); db(0x6d); db(0x00); db(0x55); db(0x41); + db(0x45); db(0x20); db(0x73); db(0x68); db(0x65); db(0x6c); db(0x6c); db(0x20); + db(0x65); db(0x78); db(0x65); db(0x63); db(0x75); db(0x74); db(0x65); db(0x00); + db(0x55); db(0x41); db(0x45); db(0x20); db(0x62); db(0x6f); db(0x61); db(0x72); + db(0x64); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x03); db(0xf2); diff --git a/ide.cpp b/ide.cpp index b8a32d76..39d1d528 100644 --- a/ide.cpp +++ b/ide.cpp @@ -6,7 +6,7 @@ * (c) 2006 - 2015 Toni Wilen */ -#define IDE_LOG 2 +#define IDE_LOG 1 #include "sysconfig.h" #include "sysdeps.h" diff --git a/include/autoconf.h b/include/autoconf.h index 3fc10fc8..b4876788 100644 --- a/include/autoconf.h +++ b/include/autoconf.h @@ -70,6 +70,9 @@ extern void calltrap (uae_u32); extern void org (uae_u32); extern uae_u32 here (void); extern uaecptr makedatatable (uaecptr resid, uaecptr resname, uae_u8 type, uae_s8 priority, uae_u16 ver, uae_u16 rev); +extern uae_u32 boot_rom_copy(TrapContext*, uaecptr, int); +extern void add_rom_absolute(uaecptr addr); +extern void save_rom_absolute(uaecptr addr); extern void align (int); diff --git a/include/keyboard.h b/include/keyboard.h index 82164fbe..2bd97225 100644 --- a/include/keyboard.h +++ b/include/keyboard.h @@ -135,7 +135,10 @@ #define KBLED_CAPSLOCKM (1 << KBLED_CAPSLOCKB) #define KBLED_SCROLLLOCKM (1 << KBLED_SCROLLLOCKB) -enum aks { AKS_ENTERGUI = 0x200, AKS_SCREENSHOT_FILE, AKS_SCREENSHOT_CLIPBOARD, AKS_FREEZEBUTTON, +enum aks { AKS_ENTERGUI = 0x200, + AKS_SCREENSHOT_FILE, + AKS_SCREENSHOT_CLIPBOARD, + AKS_FREEZEBUTTON, AKS_FLOPPY0, AKS_FLOPPY1, AKS_FLOPPY2, AKS_FLOPPY3, AKS_EFLOPPY0, AKS_EFLOPPY1, AKS_EFLOPPY2, AKS_EFLOPPY3, AKS_TOGGLEDEFAULTSCREEN, diff --git a/include/uae/ppc.h b/include/uae/ppc.h index 568b8db9..2e23b00a 100644 --- a/include/uae/ppc.h +++ b/include/uae/ppc.h @@ -42,6 +42,7 @@ void uae_ppc_free(void); void uae_ppc_hsync_handler(void); void uae_ppc_wakeup(void); void ppc_map_banks(uae_u32, uae_u32, const TCHAR*, void*, bool); +void ppc_remap_bank(uae_u32 start, uae_u32 size, const TCHAR *name, void *addr); bool uae_self_is_ppc(void); void uae_ppc_wakeup_main(void); diff --git a/main.cpp b/main.cpp index a0ccb6c8..36a8c9d4 100644 --- a/main.cpp +++ b/main.cpp @@ -160,14 +160,21 @@ void fixup_prefs_dimensions (struct uae_prefs *prefs) { fixup_prefs_dim2 (&prefs->gfx_size_fs); fixup_prefs_dim2 (&prefs->gfx_size_win); - if (prefs->gfx_apmode[1].gfx_vsync) + if (prefs->gfx_apmode[1].gfx_vsync > 0) prefs->gfx_apmode[1].gfx_vsyncmode = 1; for (int i = 0; i < 2; i++) { struct apmode *ap = &prefs->gfx_apmode[i]; ap->gfx_vflip = 0; ap->gfx_strobo = false; - if (ap->gfx_vsync) { + if (ap->gfx_vsync < 0) { + // adaptive sync + ap->gfx_vsyncmode = 0; + ap->gfx_vflip = 0; + if (ap->gfx_backbuffers >= 2) + ap->gfx_backbuffers = 1; + ap->gfx_strobo = prefs->lightboost_strobo; + } else if (ap->gfx_vsync > 0) { if (ap->gfx_vsyncmode) { // low latency vsync: no flip only if no-buffer if (ap->gfx_backbuffers >= 1) @@ -569,7 +576,7 @@ void fixup_prefs (struct uae_prefs *p, bool userconfig) } for (int i = 0; i < MAX_RTG_BOARDS; i++) { if ((p->rtgboards[i].rtgmem_size > 0 && p->rtgboards[i].rtgmem_type == GFXBOARD_UAE_Z3) && p->address_space_24) { - error_log (_T("UAEGFX RTG can't be used if address space is 24-bit.")); + error_log (_T("UAEGFX Z3 RTG can't be used if address space is 24-bit.")); p->rtgboards[i].rtgmem_size = 0; err = 1; } @@ -582,6 +589,10 @@ void fixup_prefs (struct uae_prefs *p, bool userconfig) err = 1; } #endif + if (p->socket_emu && p->uaeboard >= 3) { + write_log(_T("bsdsocket.library is not compatible with indirect UAE Boot ROM.\n")); + p->socket_emu = 0; + } if (p->nr_floppies < 0 || p->nr_floppies > 4) { error_log (_T("Invalid number of floppies. Using 2.")); diff --git a/od-win32/picasso96_win.cpp b/od-win32/picasso96_win.cpp index dd0f9f15..3172bcbe 100644 --- a/od-win32/picasso96_win.cpp +++ b/od-win32/picasso96_win.cpp @@ -4588,7 +4588,8 @@ static uae_u32 REGPARAM2 picasso_SetMemoryMode(TrapContext *ctx) #define PUTABI(func) \ if (ABI) \ - trap_put_long(ctx, ABI + func, here ()); + trap_put_long(ctx, ABI + func, here ()); \ + save_rom_absolute(ABI + func); #define RTGCALL(func,funcdef,call) \ PUTABI (func); \ @@ -4620,11 +4621,12 @@ static uae_u32 REGPARAM2 picasso_SetMemoryMode(TrapContext *ctx) #define RTGNONE(func) \ if (ABI) \ - trap_put_long(ctx, ABI + func, start); + trap_put_long(ctx, ABI + func, start); \ + save_rom_absolute(ABI + func); static void inituaegfxfuncs(TrapContext *ctx, uaecptr start, uaecptr ABI) { - if (uaegfx_old) + if (uaegfx_old || !ABI) return; org (start); diff --git a/od-win32/resources/resource.h b/od-win32/resources/resource.h index 3ff72313..045c5087 100644 --- a/od-win32/resources/resource.h +++ b/od-win32/resources/resource.h @@ -399,6 +399,7 @@ #define IDS_NUMSG_NO_PPC 404 #define IDS_NUMSG_UAEBOOTROM_PCC 405 #define IDS_AUTOSCALE_OVERSCAN_BLANK 408 +#define IDS_SCREEN_ADAPTIVE_SYNC 409 #define IDS_QS_MODELS 1000 #define IDS_QS_MODEL_A500 1001 #define IDS_QS_MODEL_A500P 1002 diff --git a/od-win32/resources/winuae.rc b/od-win32/resources/winuae.rc index 4d57387e..82b7c7bb 100644 --- a/od-win32/resources/winuae.rc +++ b/od-win32/resources/winuae.rc @@ -2036,6 +2036,7 @@ BEGIN IDS_NUMSG_UAEBOOTROM_PCC "PPC native OS booted with incompatible UAE boot ROM enabled.\nSelect ROM panel ""New UAE (128k, ROM, Indirect)"" option\nor disable all UAE expansions.\n" IDS_AUTOSCALE_OVERSCAN_BLANK "Overscan blanking" + IDS_SCREEN_ADAPTIVE_SYNC "Adaptive Sync" END #endif // English resources diff --git a/od-win32/win32.h b/od-win32/win32.h index 9882a070..9fcb47e2 100644 --- a/od-win32/win32.h +++ b/od-win32/win32.h @@ -20,12 +20,12 @@ #define LANG_DLL_FULL_VERSION_MATCH 1 #if WINUAEPUBLICBETA -#define WINUAEBETA _T("9") +#define WINUAEBETA _T("10") #else #define WINUAEBETA _T("") #endif -#define WINUAEDATE MAKEBD(2016, 3, 19) +#define WINUAEDATE MAKEBD(2016, 4, 9) //#define WINUAEEXTRA _T("AmiKit Preview") //#define WINUAEEXTRA _T("Amiga Forever Edition") diff --git a/od-win32/win32_scaler.cpp b/od-win32/win32_scaler.cpp index e9076d7f..b70f8810 100644 --- a/od-win32/win32_scaler.cpp +++ b/od-win32/win32_scaler.cpp @@ -561,9 +561,9 @@ void getfilterrect2 (RECT *sr, RECT *dr, RECT *zr, int dst_width, int dst_height OffsetRect (zr, 0, (int)(-filter_vert_offset * ahs)); diff = dr->right - dr->left; - filterxmult = diff / (dst_width * scale); + filterxmult = diff / ((float)dst_width * scale); diff = dr->bottom - dr->top; - filterymult = diff / (dst_height * scale); + filterymult = diff / ((float)dst_height * scale); goto end; } diff --git a/od-win32/win32gfx.cpp b/od-win32/win32gfx.cpp index 95c331cd..86a72372 100644 --- a/od-win32/win32gfx.cpp +++ b/od-win32/win32gfx.cpp @@ -1106,7 +1106,7 @@ bool render_screen (bool immediate) } flushymin = 0; flushymax = currentmode->amiga_height; - EnterCriticalSection (&screen_cs); + gfx_lock(); if (currentmode->flags & DM_D3D) { v = D3D_renderframe (immediate); } else if (currentmode->flags & DM_SWSCALE) { @@ -1116,7 +1116,7 @@ bool render_screen (bool immediate) v = true; } render_ok = v; - LeaveCriticalSection (&screen_cs); + gfx_unlock(); return render_ok; } @@ -1139,7 +1139,7 @@ static void doflipevent (int mode) bool show_screen_maybe (bool show) { struct apmode *ap = picasso_on ? &currprefs.gfx_apmode[1] : &currprefs.gfx_apmode[0]; - if (!ap->gfx_vflip || ap->gfx_vsyncmode == 0 || !ap->gfx_vsync) { + if (!ap->gfx_vflip || ap->gfx_vsyncmode == 0 || ap->gfx_vsync <= 0) { if (show) show_screen (0); return false; @@ -1155,30 +1155,59 @@ bool show_screen_maybe (bool show) void show_screen_special (void) { - EnterCriticalSection (&screen_cs); if (currentmode->flags & DM_D3D) { + gfx_lock(); D3D_showframe_special (1); + gfx_unlock(); } - LeaveCriticalSection (&screen_cs); +} +static frame_time_t strobo_time; + +static void CALLBACK blackinsertion_cb( + UINT uTimerID, + UINT uMsg, + DWORD_PTR dwUser, + DWORD_PTR dw1, + DWORD_PTR dw2 + ) +{ + if (!screen_is_initialized) + return; + for (;;) { + frame_time_t ct = read_processor_time(); + if ((int)strobo_time - (int)ct <= 0 || (int)strobo_time - (int)ct > vsynctimebase / 2) { + break; + } + } + if (!screen_is_initialized) + return; + show_screen_special(); } + void show_screen (int mode) { - EnterCriticalSection (&screen_cs); + gfx_lock(); if (mode == 2) { if (currentmode->flags & DM_D3D) { D3D_showframe_special (1); } - LeaveCriticalSection (&screen_cs); + gfx_unlock(); return; } if (!render_ok) { - LeaveCriticalSection (&screen_cs); + gfx_unlock(); return; } if (currentmode->flags & DM_D3D) { - D3D_showframe (); - + struct apmode *ap = picasso_on ? &currprefs.gfx_apmode[1] : &currprefs.gfx_apmode[0]; + if (isfullscreen() > 0 && isvsync() == 0 && ap->gfx_strobo && ap->gfx_refreshrate > 80) { + //if (isvsync() == 0 && ap->gfx_strobo) { + int ms = (int)((1000 / 2) / vblank_hz) - 1; + strobo_time = read_processor_time() + vsynctimebase / 2; + timeSetEvent(ms, 0, blackinsertion_cb, NULL, TIME_ONESHOT | TIME_CALLBACK_FUNCTION); + } + D3D_showframe(); #ifdef GFXFILTER } else if (currentmode->flags & DM_SWSCALE) { if (!dx_islost () && !picasso_on) @@ -1188,7 +1217,7 @@ void show_screen (int mode) if (!dx_islost () && !picasso_on) DirectDraw_Flip (1); } - LeaveCriticalSection (&screen_cs); + gfx_unlock(); render_ok = false; } @@ -1440,10 +1469,10 @@ uae_u8 *gfx_lock_picasso (bool fullupdate, bool doclear) if (rtg_locked) { return p; } - EnterCriticalSection (&screen_cs); + gfx_lock(); p = gfx_lock_picasso2 (fullupdate); if (!p) { - LeaveCriticalSection (&screen_cs); + gfx_unlock(); } else { rtg_locked = true; if (doclear) { @@ -1460,7 +1489,7 @@ uae_u8 *gfx_lock_picasso (bool fullupdate, bool doclear) void gfx_unlock_picasso (bool dorender) { if (!rtg_locked) - EnterCriticalSection (&screen_cs); + gfx_lock(); rtg_locked = false; if (currprefs.gfx_api) { if (dorender) { @@ -1472,14 +1501,14 @@ void gfx_unlock_picasso (bool dorender) D3D_unlocktexture (); if (dorender) { if (D3D_renderframe (false)) { - LeaveCriticalSection (&screen_cs); + gfx_unlock(); render_ok = true; show_screen_maybe (true); } else { - LeaveCriticalSection (&screen_cs); + gfx_unlock(); } } else { - LeaveCriticalSection (&screen_cs); + gfx_unlock(); } } else { DirectDraw_SurfaceUnlock (); @@ -1491,7 +1520,7 @@ void gfx_unlock_picasso (bool dorender) p96_double_buffer_needs_flushing = 0; } } - LeaveCriticalSection (&screen_cs); + gfx_unlock(); } } @@ -1730,6 +1759,7 @@ static int open_windows (bool mousecapture) changevblankthreadmode (VBLANKTH_IDLE); + screen_is_initialized = 0; inputdevice_unacquire (); wait_keyrelease (); reset_sound (); @@ -1737,7 +1767,9 @@ static int open_windows (bool mousecapture) updatewinfsmode (&currprefs); #ifdef D3D + gfx_lock(); D3D_free (false); + gfx_unlock(); #endif #ifdef OPENGL OGL_free (); diff --git a/od-win32/win32gui.cpp b/od-win32/win32gui.cpp index d4251c51..7e6e1b5b 100644 --- a/od-win32/win32gui.cpp +++ b/od-win32/win32gui.cpp @@ -6824,13 +6824,20 @@ static void values_to_displaydlg (HWND hDlg) SendDlgItemMessage(hDlg, IDC_SCREENMODE_NATIVE2, CB_ADDSTRING, 0, (LPARAM)buffer); WIN32GUI_LoadUIString(IDS_SCREEN_VSYNC, buffer, sizeof buffer / sizeof (TCHAR)); SendDlgItemMessage(hDlg, IDC_SCREENMODE_NATIVE2, CB_ADDSTRING, 0, (LPARAM)buffer); - WIN32GUI_LoadUIString(IDS_SCREEN_VSYNC_AUTOSWITCH, buffer, sizeof buffer / sizeof (TCHAR)); + WIN32GUI_LoadUIString(IDS_SCREEN_VSYNC_AUTOSWITCH, buffer, sizeof buffer / sizeof(TCHAR)); SendDlgItemMessage(hDlg, IDC_SCREENMODE_NATIVE2, CB_ADDSTRING, 0, (LPARAM)buffer); + WIN32GUI_LoadUIString(IDS_SCREEN_ADAPTIVE_SYNC, buffer, sizeof buffer / sizeof(TCHAR)); + SendDlgItemMessage(hDlg, IDC_SCREENMODE_NATIVE2, CB_ADDSTRING, 0, (LPARAM)buffer); SendDlgItemMessage(hDlg, IDC_SCREENMODE_NATIVE, CB_SETCURSEL, workprefs.gfx_apmode[0].gfx_fullscreen, 0); - SendDlgItemMessage(hDlg, IDC_SCREENMODE_NATIVE2, CB_SETCURSEL, - workprefs.gfx_apmode[0].gfx_vsync + (workprefs.gfx_apmode[0].gfx_vsyncmode || !workprefs.gfx_apmode[0].gfx_vsync ? 0 : 2), 0); + v = workprefs.gfx_apmode[0].gfx_vsync; + if (v < 0) + v = 5; + else if (v > 0) { + v = v + (workprefs.gfx_apmode[0].gfx_vsyncmode || !v ? 0 : 2); + } + SendDlgItemMessage(hDlg, IDC_SCREENMODE_NATIVE2, CB_SETCURSEL, v, 0); SendDlgItemMessage(hDlg, IDC_SCREENMODE_RTG, CB_RESETCONTENT, 0, 0); SendDlgItemMessage(hDlg, IDC_SCREENMODE_RTG2, CB_RESETCONTENT, 0, 0); @@ -6851,14 +6858,20 @@ static void values_to_displaydlg (HWND hDlg) #endif WIN32GUI_LoadUIString(IDS_SCREEN_VSYNC2, buffer, sizeof buffer / sizeof (TCHAR)); SendDlgItemMessage(hDlg, IDC_SCREENMODE_RTG2, CB_ADDSTRING, 0, (LPARAM)buffer); + WIN32GUI_LoadUIString(IDS_SCREEN_ADAPTIVE_SYNC, buffer, sizeof buffer / sizeof(TCHAR)); + SendDlgItemMessage(hDlg, IDC_SCREENMODE_RTG2, CB_ADDSTRING, 0, (LPARAM)buffer); #if 0 WIN32GUI_LoadUIString(IDS_SCREEN_VSYNC2_AUTOSWITCH, buffer, sizeof buffer / sizeof (TCHAR)); SendDlgItemMessage(hDlg, IDC_SCREENMODE_RTG2, CB_ADDSTRING, 0, (LPARAM)buffer); #endif SendDlgItemMessage(hDlg, IDC_SCREENMODE_RTG, CB_SETCURSEL, workprefs.gfx_apmode[1].gfx_fullscreen, 0); - SendDlgItemMessage(hDlg, IDC_SCREENMODE_RTG2, CB_SETCURSEL, - workprefs.gfx_apmode[1].gfx_vsync, 0); + v = workprefs.gfx_apmode[1].gfx_vsync; + if (v < 0) + v = 2; + else if (v > 0) + v = 1; + SendDlgItemMessage(hDlg, IDC_SCREENMODE_RTG2, CB_SETCURSEL, v, 0); SendDlgItemMessage(hDlg, IDC_LORES, CB_RESETCONTENT, 0, 0); WIN32GUI_LoadUIString(IDS_RES_LORES, buffer, sizeof buffer / sizeof (TCHAR)); @@ -7053,20 +7066,33 @@ static void values_from_displaydlg (HWND hDlg, UINT msg, WPARAM wParam, LPARAM l int oldvs = workprefs.gfx_apmode[0].gfx_vsync; workprefs.gfx_apmode[0].gfx_vsync = 0; workprefs.gfx_apmode[0].gfx_vsyncmode = 0; - if (i > 0) { - i--; - workprefs.gfx_apmode[0].gfx_vsync = (i & 1) + 1; - workprefs.gfx_apmode[0].gfx_vsyncmode = (i < 2) ? 1 : 0; + if (i == 1) { + workprefs.gfx_apmode[0].gfx_vsync = 1; + workprefs.gfx_apmode[0].gfx_vsyncmode = 1; + } else if (i == 2) { + workprefs.gfx_apmode[0].gfx_vsync = 2; + workprefs.gfx_apmode[0].gfx_vsyncmode = 1; + } else if (i == 3) { + workprefs.gfx_apmode[0].gfx_vsync = 1; + workprefs.gfx_apmode[0].gfx_vsyncmode = 0; + } else if (i == 4) { + workprefs.gfx_apmode[0].gfx_vsync = 2; + workprefs.gfx_apmode[0].gfx_vsyncmode = 0; + } else if (i == 5) { + workprefs.gfx_apmode[0].gfx_vsync = -1; + workprefs.gfx_apmode[0].gfx_vsyncmode = 0; } workprefs.gfx_apmode[1].gfx_fullscreen = SendDlgItemMessage (hDlg, IDC_SCREENMODE_RTG, CB_GETCURSEL, 0, 0); i = SendDlgItemMessage (hDlg, IDC_SCREENMODE_RTG2, CB_GETCURSEL, 0, 0); workprefs.gfx_apmode[1].gfx_vsync = 0; workprefs.gfx_apmode[1].gfx_vsyncmode = 0; - if (i > 0) { - i--; - workprefs.gfx_apmode[1].gfx_vsync = (i & 1) + 1; + if (i == 1) { + workprefs.gfx_apmode[1].gfx_vsync = 1; workprefs.gfx_apmode[1].gfx_vsyncmode = 1; + } else if (i == 2) { + workprefs.gfx_apmode[1].gfx_vsync = -1; + workprefs.gfx_apmode[1].gfx_vsyncmode = 0; } bool updaterate = false, updateslider = false; diff --git a/od-win32/winuaechangelog.txt b/od-win32/winuaechangelog.txt index f51adc08..f262f832 100644 --- a/od-win32/winuaechangelog.txt +++ b/od-win32/winuaechangelog.txt @@ -1,4 +1,20 @@ +Beta 10: + +- if uaenet.device is online and packet(s) have arrived but there is no pending CMD_READ/CMD_READORPHANs: + wait about 2s before dropping it, it is possible that multiple packets will arrive so quickly that Amiga-side + TCP/IP stack don't have time to queue more read commands before packets get dropped. +- uaenet.device stability fix. +- Loading config with unplugged joystick or mouse inserted in either port: previous device was not autoselected. +- Filter panel scaling mode active and mouse driver enabled: mouse got stuck in a corner in some situations. +- Screenshot input event set to toggle-mode in Input panel: key/button press = create screenshots continuously + every frame, following key/button press = stop automatic screenshots. +- one genlinetoscr function (16-bit 4x horizontal stretch) used genlock function in non-genlock mode. +- Adaptive Sync "vsync" mode added. Optimal setting designed for G-Sync/FreeSync monitors. Also allows 100/120Hz + black frame insertion mode. Not very stable yet. (Don't try to use without adaptive sync hardware..) +- 68040 MMU mode SR M-bit handling was missing. 68060 SR M-bit handling was not correct. +- Disable bsdsocket.library if indirect UAE Boot ROM is enabled, it is not (yet?) compatible. + Beta 9: - Fixed swapped audio channels if stereo separation was set (b1 cleanup missed code path) diff --git a/ppc/ppc.cpp b/ppc/ppc.cpp index fd32188e..fb3df8aa 100644 --- a/ppc/ppc.cpp +++ b/ppc/ppc.cpp @@ -463,21 +463,21 @@ void uae_ppc_wakeup_main(void) } } -static void ppc_map_region(PPCMemoryRegion *r) +static void ppc_map_region(PPCMemoryRegion *r, bool dolock) { - if (impl.in_cpu_thread() == false) { + if (dolock && impl.in_cpu_thread() == false) { /* map_memory will acquire the qemu global lock, so we must ensure * the PPC CPU can finish any I/O requests and release the lock. */ uae_ppc_spinlock_release(); } impl.map_memory(r, -1); - if (impl.in_cpu_thread() == false) { + if (dolock && impl.in_cpu_thread() == false) { uae_ppc_spinlock_get(); } free((void*)r->name); } -void ppc_map_banks(uae_u32 start, uae_u32 size, const TCHAR *name, void *addr, bool remove) +static void ppc_map_banks2(uae_u32 start, uae_u32 size, const TCHAR *name, void *addr, bool remove, bool direct, bool dolock) { if (ppc_state == PPC_STATE_INACTIVE || !impl.map_memory) return; @@ -489,29 +489,49 @@ void ppc_map_banks(uae_u32 start, uae_u32 size, const TCHAR *name, void *addr, b r.alias = remove ? 0xffffffff : 0; r.memory = addr; - if (r.start == rtarea_base && rtarea_base) { + if (r.start == rtarea_base && rtarea_base && direct) { // Map first half directly, it contains code only. // Second half has dynamic data, it must not be direct mapped. r.memory = rtarea_bank.baseaddr; r.size = RTAREA_DATAREGION; - ppc_map_region(&r); + ppc_map_region(&r, dolock); r.start = start + RTAREA_DATAREGION; r.size = size - RTAREA_DATAREGION; r.name = ua(name); r.alias = remove ? 0xffffffff : 0; r.memory = NULL; - } else if (r.start == uaeboard_base && uaeboard_base) { + } else if (r.start == uaeboard_base && uaeboard_base && direct) { // Opposite here, first half indirect, second half direct. r.memory = NULL; r.size = UAEBOARD_DATAREGION_START; - ppc_map_region(&r); + ppc_map_region(&r, dolock); r.start = start + UAEBOARD_DATAREGION_START; r.size = UAEBOARD_DATAREGION_SIZE; r.name = ua(name); r.alias = remove ? 0xffffffff : 0; r.memory = uaeboard_bank.baseaddr + UAEBOARD_DATAREGION_START; } - ppc_map_region(&r); + ppc_map_region(&r, dolock); +} +void ppc_map_banks(uae_u32 start, uae_u32 size, const TCHAR *name, void *addr, bool remove) +{ + ppc_map_banks2(start, size, name, addr, remove, true, true); +} + +void ppc_remap_bank(uae_u32 start, uae_u32 size, const TCHAR *name, void *addr) +{ + if (ppc_state == PPC_STATE_INACTIVE || !impl.map_memory) + return; + + if (impl.in_cpu_thread() == false) { + uae_ppc_spinlock_release(); + } + ppc_map_banks2(start, size, name, addr, true, false, false); + ppc_map_banks2(start, size, name, addr, false, true, false); + if (impl.in_cpu_thread() == false) { + uae_ppc_spinlock_get(); + } + } void uae_ppc_get_model(const TCHAR **model, uint32_t *hid1) diff --git a/traps.cpp b/traps.cpp index bc85f001..0ba66c63 100644 --- a/traps.cpp +++ b/traps.cpp @@ -306,6 +306,216 @@ static void *trap_thread (void *arg) return 0; } + +/* +* Set up extended trap context and call handler function +*/ +static void trap_HandleExtendedTrap(TrapHandler handler_func, int has_retval) +{ + struct TrapContext *context = xcalloc(TrapContext, 1); + + if (context) { + uae_sem_init(&context->switch_to_trap_sem, 0, 0); + uae_sem_init(&context->switch_to_emu_sem, 0, 0); + + context->trap_handler = handler_func; + context->trap_has_retval = has_retval; + + //context->saved_regs = regs; + copytocpucontext(&context->saved_regs); + + /* Start thread to handle new trap context. */ + uae_start_thread_fast(trap_thread, (void *)context, &context->thread); + + /* Switch to trap context to begin execution of + * trap handler function. + */ + uae_sem_post(&context->switch_to_trap_sem); + + /* Wait for trap context to switch back to us. + * + * It'll do this when the trap handler is done - or when + * the handler wants to call 68k code. */ + uae_sem_wait(&context->switch_to_emu_sem); + } +} + +/* +* Call m68k function from an extended trap handler +* +* This function is to be called from the trap context. +*/ + +static uae_u32 call_hardware_trap_back(TrapContext *ctx, uae_u16 cmd, uae_u32 p1, uae_u32 p2, uae_u32 p3, uae_u32 p4); + +static uae_u32 trap_Call68k(TrapContext *ctx, uaecptr func_addr) +{ + if (ctx->host_trap_data) { + + return call_hardware_trap_back(ctx, 10, func_addr, 0, 0, 0); + + } else { + + /* Enter critical section - only one trap at a time, please! */ + uae_sem_wait(&trap_mutex); + current_context = ctx; + + /* Don't allow an interrupt and thus potentially another + * trap to be invoked while we hold the above mutex. + * This is probably just being paranoid. */ + regs.intmask = 7; + + /* Set up function call address. */ + ctx->call68k_func_addr = func_addr; + + /* Set PC to address of 68k call trap, so that it will be + * executed when emulator context resumes. */ + m68k_setpc(m68k_call_trapaddr); + fill_prefetch(); + + /* Switch to emulator context. */ + uae_sem_post(&ctx->switch_to_emu_sem); + + /* Wait for 68k call return handler to switch back to us. */ + uae_sem_wait(&ctx->switch_to_trap_sem); + + /* End critical section. */ + uae_sem_post(&trap_mutex); + + /* Get return value from 68k function called. */ + return ctx->call68k_retval; + } +} + +/* +* Handles the emulator's side of a 68k call (from an extended trap) +*/ +static uae_u32 REGPARAM2 m68k_call_handler(TrapContext *dummy_ctx) +{ + TrapContext *context = current_context; + + uae_u32 sp; + + sp = m68k_areg(regs, 7); + + /* Push address of trap context on 68k stack. This is + * so the return trap can find this context. */ + sp -= sizeof(void *); + put_pointer(sp, context); + + /* Push addr to return handler trap on 68k stack. + * When the called m68k function does an RTS, the CPU will pull this + * address off the stack and so call the return handler. */ + sp -= 4; + put_long(sp, m68k_return_trapaddr); + + m68k_areg(regs, 7) = sp; + + /* Set PC to address of 68k function to call. */ + m68k_setpc(context->call68k_func_addr); + fill_prefetch(); + + /* End critical section: allow other traps run. */ + uae_sem_post(&trap_mutex); + + /* Restore interrupts. */ + regs.intmask = context->saved_regs.intmask; + + /* Dummy return value. */ + return 0; +} + +/* +* Handles the return from a 68k call at the emulator's side. +*/ +static uae_u32 REGPARAM2 m68k_return_handler(TrapContext *dummy_ctx) +{ + TrapContext *context; + uae_u32 sp; + + /* One trap returning at a time, please! */ + uae_sem_wait(&trap_mutex); + + /* Get trap context from 68k stack. */ + sp = m68k_areg(regs, 7); + context = (TrapContext *)get_pointer(sp); + sp += sizeof(void *); + m68k_areg(regs, 7) = sp; + + /* Get return value from the 68k call. */ + context->call68k_retval = m68k_dreg(regs, 0); + + /* Switch back to trap context. */ + uae_sem_post(&context->switch_to_trap_sem); + + /* Wait for trap context to switch back to us. + * + * It'll do this when the trap handler is done - or when + * the handler wants to call another 68k function. */ + uae_sem_wait(&context->switch_to_emu_sem); + + /* Dummy return value. */ + return 0; +} + +/* +* Handles completion of an extended trap and passes +* return value from trap function to 68k space. +*/ +static uae_u32 REGPARAM2 exit_trap_handler(TrapContext *dummy_ctx) +{ + TrapContext *context = current_context; + + /* Wait for trap context thread to exit. */ + uae_wait_thread(context->thread); + + /* Restore 68k state saved at trap entry. */ + //regs = context->saved_regs; + copyfromcpucontext(&context->saved_regs, context->saved_regs.pc); + + /* If trap is supposed to return a value, then store + * return value in D0. */ + if (context->trap_has_retval) + m68k_dreg(regs, 0) = context->trap_retval; + + uae_sem_destroy(&context->switch_to_trap_sem); + uae_sem_destroy(&context->switch_to_emu_sem); + + xfree(context); + + /* End critical section */ + uae_sem_post(&trap_mutex); + + /* Dummy return value. */ + return 0; +} + + + +/* +* Call a 68k library function from extended trap. +*/ +uae_u32 CallLib(TrapContext *ctx, uaecptr base, uae_s16 offset) +{ + uae_u32 retval; + uaecptr olda6 = trap_get_areg(ctx, 6); + + trap_set_areg(ctx, 6, base); + retval = trap_Call68k(ctx, base + offset); + trap_set_areg(ctx, 6, olda6); + + return retval; +} + +/* +* Call 68k function from extended trap. +*/ +uae_u32 CallFunc(TrapContext *ctx, uaecptr func) +{ + return trap_Call68k(ctx, func); +} + + /* UAE board traps */ #define TRAP_THREADS (RTAREA_TRAP_DATA_NUM + RTAREA_TRAP_DATA_SEND_NUM) @@ -585,212 +795,6 @@ TrapContext *alloc_host_thread_trap_context(void) } } -/* -* Set up extended trap context and call handler function -*/ -static void trap_HandleExtendedTrap (TrapHandler handler_func, int has_retval) -{ - struct TrapContext *context = xcalloc (TrapContext, 1); - - if (context) { - uae_sem_init (&context->switch_to_trap_sem, 0, 0); - uae_sem_init (&context->switch_to_emu_sem, 0, 0); - - context->trap_handler = handler_func; - context->trap_has_retval = has_retval; - - //context->saved_regs = regs; - copytocpucontext (&context->saved_regs); - - /* Start thread to handle new trap context. */ - uae_start_thread_fast (trap_thread, (void *)context, &context->thread); - - /* Switch to trap context to begin execution of - * trap handler function. - */ - uae_sem_post (&context->switch_to_trap_sem); - - /* Wait for trap context to switch back to us. - * - * It'll do this when the trap handler is done - or when - * the handler wants to call 68k code. */ - uae_sem_wait (&context->switch_to_emu_sem); - } -} - -/* -* Call m68k function from an extended trap handler -* -* This function is to be called from the trap context. -*/ -static uae_u32 trap_Call68k(TrapContext *ctx, uaecptr func_addr) -{ - if (ctx->host_trap_data) { - - return call_hardware_trap_back(ctx, 10, func_addr, 0, 0, 0); - - } else { - - /* Enter critical section - only one trap at a time, please! */ - uae_sem_wait (&trap_mutex); - current_context = ctx; - - /* Don't allow an interrupt and thus potentially another - * trap to be invoked while we hold the above mutex. - * This is probably just being paranoid. */ - regs.intmask = 7; - - /* Set up function call address. */ - ctx->call68k_func_addr = func_addr; - - /* Set PC to address of 68k call trap, so that it will be - * executed when emulator context resumes. */ - m68k_setpc (m68k_call_trapaddr); - fill_prefetch (); - - /* Switch to emulator context. */ - uae_sem_post (&ctx->switch_to_emu_sem); - - /* Wait for 68k call return handler to switch back to us. */ - uae_sem_wait (&ctx->switch_to_trap_sem); - - /* End critical section. */ - uae_sem_post (&trap_mutex); - - /* Get return value from 68k function called. */ - return ctx->call68k_retval; - } -} - -/* -* Handles the emulator's side of a 68k call (from an extended trap) -*/ -static uae_u32 REGPARAM2 m68k_call_handler (TrapContext *dummy_ctx) -{ - TrapContext *context = current_context; - - uae_u32 sp; - - sp = m68k_areg (regs, 7); - - /* Push address of trap context on 68k stack. This is - * so the return trap can find this context. */ - sp -= sizeof (void *); - put_pointer (sp, context); - - /* Push addr to return handler trap on 68k stack. - * When the called m68k function does an RTS, the CPU will pull this - * address off the stack and so call the return handler. */ - sp -= 4; - put_long (sp, m68k_return_trapaddr); - - m68k_areg (regs, 7) = sp; - - /* Set PC to address of 68k function to call. */ - m68k_setpc (context->call68k_func_addr); - fill_prefetch (); - - /* End critical section: allow other traps run. */ - uae_sem_post (&trap_mutex); - - /* Restore interrupts. */ - regs.intmask = context->saved_regs.intmask; - - /* Dummy return value. */ - return 0; -} - -/* -* Handles the return from a 68k call at the emulator's side. -*/ -static uae_u32 REGPARAM2 m68k_return_handler (TrapContext *dummy_ctx) -{ - TrapContext *context; - uae_u32 sp; - - /* One trap returning at a time, please! */ - uae_sem_wait (&trap_mutex); - - /* Get trap context from 68k stack. */ - sp = m68k_areg (regs, 7); - context = (TrapContext *)get_pointer (sp); - sp += sizeof (void *); - m68k_areg (regs, 7) = sp; - - /* Get return value from the 68k call. */ - context->call68k_retval = m68k_dreg (regs, 0); - - /* Switch back to trap context. */ - uae_sem_post (&context->switch_to_trap_sem); - - /* Wait for trap context to switch back to us. - * - * It'll do this when the trap handler is done - or when - * the handler wants to call another 68k function. */ - uae_sem_wait (&context->switch_to_emu_sem); - - /* Dummy return value. */ - return 0; -} - -/* -* Handles completion of an extended trap and passes -* return value from trap function to 68k space. -*/ -static uae_u32 REGPARAM2 exit_trap_handler (TrapContext *dummy_ctx) -{ - TrapContext *context = current_context; - - /* Wait for trap context thread to exit. */ - uae_wait_thread (context->thread); - - /* Restore 68k state saved at trap entry. */ - //regs = context->saved_regs; - copyfromcpucontext (&context->saved_regs, context->saved_regs.pc); - - /* If trap is supposed to return a value, then store - * return value in D0. */ - if (context->trap_has_retval) - m68k_dreg (regs, 0) = context->trap_retval; - - uae_sem_destroy (&context->switch_to_trap_sem); - uae_sem_destroy (&context->switch_to_emu_sem); - - xfree (context); - - /* End critical section */ - uae_sem_post (&trap_mutex); - - /* Dummy return value. */ - return 0; -} - - - -/* -* Call a 68k library function from extended trap. -*/ -uae_u32 CallLib(TrapContext *ctx, uaecptr base, uae_s16 offset) -{ - uae_u32 retval; - uaecptr olda6 = trap_get_areg(ctx, 6); - - trap_set_areg(ctx, 6, base); - retval = trap_Call68k(ctx, base + offset); - trap_set_areg(ctx, 6, olda6); - - return retval; -} - -/* -* Call 68k function from extended trap. -*/ -uae_u32 CallFunc(TrapContext *ctx, uaecptr func) -{ - return trap_Call68k(ctx, func); -} - - /* * Initialize trap mechanism. */ -- 2.47.3