diff --git a/src/M6502.H b/src/M6502.H new file mode 100644 index 0000000..39544eb --- /dev/null +++ b/src/M6502.H @@ -0,0 +1,185 @@ +/* Multi-6502 32 Bit emulator */ + +/* Copyright 1996, 1997, 1998, Neil Bradley, All rights reserved + * + * License agreement: + * + * (M6502 Refers to both the assembly code emitted by make6502.c and make6502.c + * itself) + * + * M6502 May be distributed in unmodified form to any medium. + * + * M6502 May not be sold, or sold as a part of a commercial package without + * the express written permission of Neil Bradley (neil@synthcom.com). This + * includes shareware. + * + * Modified versions of M6502 may not be publicly redistributed without author + * approval (neil@synthcom.com). This includes distributing via a publicly + * accessible LAN. You may make your own source modifications and distribute + * M6502 in source or object form, but if you make modifications to M6502 + * then it should be noted in the top as a comment in make6502.c. + * + * M6502 Licensing for commercial applications is available. Please email + * neil@synthcom.com for details. + * + * Synthcom Systems, Inc, and Neil Bradley will not be held responsible for + * any damage done by the use of M6502. It is purely "as-is". + * + * If you use M6502 in a freeware application, credit in the following text: + * + * "Multi-6502 CPU emulator by Neil Bradley (neil@synthcom.com)" + * + * must accompany the freeware application within the application itself or + * in the documentation. + * + * Legal stuff aside: + * + * If you find problems with M6502, please email the author so they can get + * resolved. If you find a bug and fix it, please also email the author so + * that those bug fixes can be propogated to the installed base of M6502 + * users. If you find performance improvements or problems with M6502, please + * email the author with your changes/suggestions and they will be rolled in + * with subsequent releases of M6502. + * + * The whole idea of this emulator is to have the fastest available 32 bit + * Multi-6502 emulator for the PC, giving maximum performance. + */ + +/* General 6502 related goodies */ + +#ifndef _M6502_H_ +#define _M6502_H_ + +#ifndef UINT32 +#define UINT32 unsigned long int +#endif + +#ifndef UINT16 +#define UINT16 unsigned short int +#endif + +#ifndef UINT8 +#define UINT8 unsigned char +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +extern UINT32 m6502nmi(void); +extern UINT32 m6502int(UINT32); +extern UINT32 m6502exec(UINT32); +extern void m6502reset(void); +extern UINT32 m6502GetElapsedTicks(UINT32); +extern void m6502ReleaseTimeslice(); + +extern UINT32 m6502zpnmi(void); +extern UINT32 m6502zpint(UINT32); +extern UINT32 m6502zpexec(UINT32); +extern void m6502zpreset(void); +extern UINT32 m6502zpGetElapsedTicks(UINT32); +extern void m6502zpReleaseTimeslice(); + +extern UINT32 m6502bsnmi(void); +extern UINT32 m6502bsint(UINT32); +extern UINT32 m6502bsexec(UINT32); +extern void m6502bsreset(void); +extern UINT32 m6502bsGetElapsedTicks(UINT32); +extern void m6502bsReleaseTimeslice(); + +extern UINT16 m6502bspc; +extern UINT16 m6502zppc; +extern UINT16 m6502pc; + +#ifndef _MEMORYREADWRITEBYTE_ +#define _MEMORYREADWRITEBYTE_ + +struct MemoryWriteByte +{ + UINT32 lowAddr; + UINT32 highAddr; + void (*memoryCall)(UINT32, UINT8, struct MemoryWriteByte *); + void *pUserArea; +}; + +struct MemoryReadByte +{ + UINT32 lowAddr; + UINT32 highAddr; + UINT8 (*memoryCall)(UINT32, struct MemoryReadByte *); + void *pUserArea; +}; + +#endif // _MEMORYREADWRITEBYTE_ + +/* WARNING: Do not use a sizeof() operator on this structure. The assembly + * code will pack other context relevant data after this space. Use the + * GetContextSize() call to obtain the specifics of the context. + */ + +struct m6502context +{ + UINT8 *m6502Base; /* 32 Bit pointer to base memory address */ + + /* 32 Bit pointers to user trap address structure array */ + + struct MemoryReadByte *m6502MemoryRead; + struct MemoryWriteByte *m6502MemoryWrite; + + /* This context's register dump */ + + UINT16 m6502af; /* A & Flags */ + UINT16 m6502pc; /* Program counter */ + UINT8 m6502x; /* X register */ + UINT8 m6502y; /* Y register */ + UINT8 m6502s; /* S register */ + UINT8 irqPending; +}; + +struct m6502bscontext +{ + UINT8 *m6502Base; /* 32 Bit pointer to base memory address */ + + /* 32 Bit pointers to user trap address structure array */ + + struct MemoryReadByte *m6502MemoryRead; + struct MemoryWriteByte *m6502MemoryWrite; + + UINT8 *pbBankSwitch[32]; /* 32 2K addresses */ + + /* This context's register dump */ + + UINT16 m6502af; /* A & Flags */ + UINT16 m6502pc; /* Program counter */ + UINT8 m6502x; /* X register */ + UINT8 m6502y; /* Y register */ + UINT8 m6502s; /* S register */ + UINT8 irqPending; +}; + +typedef struct m6502context CONTEXTM6502; +typedef struct m6502bscontext CONTEXTM6502BS; + +extern void m6502SetContext(struct m6502context *); +extern void m6502GetContext(struct m6502context *); +extern UINT32 m6502GetContextSize(void); + +extern void m6502zpSetContext(struct m6502context *); +extern void m6502zpGetContext(struct m6502context *); +extern UINT32 m6502zpGetContextSize(void); + +extern void m6502bsSetContext(struct m6502context *); +extern void m6502bsGetContext(struct m6502context *); +extern UINT32 m6502bsGetContextSize(void); + +extern void m6502init(void); +extern void m6502zpinit(void); +extern void m6502bsinit(void); + +extern UINT8 *m6502bspbBankSwitch[32]; // Bank switching registers + +#ifdef __cplusplus +}; +#endif + +#endif // _M6502_H_ diff --git a/src/M6502.asm b/src/M6502.asm new file mode 100644 index 0000000..952bb1c --- /dev/null +++ b/src/M6502.asm @@ -0,0 +1,6766 @@ +; For assembly by NASM only +bits 32 +; +; m6502zp - V1.6 - Copyright 1998, Neil Bradley (neil@synthcom.com) +; +; + +; Using stack calling conventions +; Zero page version (all zero page accesses are direct) + + + section .data + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + + global _m6502zppc + + global m6502zppbBankSwitch_, _m6502zppbBankSwitch + +_m6502zpcontextBegin: + +; DO NOT CHANGE THE ORDER OF THE FOLLOWING REGISTERS! + +_m6502zpBase dd 0 ; Base address for 6502 stuff +_m6502zpMemRead dd 0 ; Offset of memory read structure array +_m6502zpMemWrite dd 0 ; Offset of memory write structure array +_m6502zpaf dw 0 ; A register and flags +_m6502zppc: +m6502zppc dw 0 ; 6502 Program counter +_m6502zpx db 0 ; X +_m6502zpy db 0 ; Y +_m6502zps db 0 ; s +_irqPending db 0 ; Non-zero if an IRQ is pending + +_m6502zpcontextEnd: + + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +_tempAddr dd 0 ; Temporary address storage +dwElapsedTicks dd 0 ; Elapsed ticks! +cyclesRemaining dd 0 ; # Of cycles remaining +_altFlags db 0 ; Storage for I, D, and B + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +bit6502tox86: + db 00h, 01h, 40h, 41h, 02h, 03h, 42h, 43h, 00h, 01h, 40h, 41h, 02h, 03h, 42h, 43h + db 00h, 01h, 40h, 41h, 02h, 03h, 42h, 43h, 00h, 01h, 40h, 41h, 02h, 03h, 42h, 43h + db 00h, 01h, 40h, 41h, 02h, 03h, 42h, 43h, 00h, 01h, 40h, 41h, 02h, 03h, 42h, 43h + db 00h, 01h, 40h, 41h, 02h, 03h, 42h, 43h, 00h, 01h, 40h, 41h, 02h, 03h, 42h, 43h + db 10h, 11h, 50h, 51h, 12h, 13h, 52h, 53h, 10h, 11h, 50h, 51h, 12h, 13h, 52h, 53h + db 10h, 11h, 50h, 51h, 12h, 13h, 52h, 53h, 10h, 11h, 50h, 51h, 12h, 13h, 52h, 53h + db 10h, 11h, 50h, 51h, 12h, 13h, 52h, 53h, 10h, 11h, 50h, 51h, 12h, 13h, 52h, 53h + db 10h, 11h, 50h, 51h, 12h, 13h, 52h, 53h, 10h, 11h, 50h, 51h, 12h, 13h, 52h, 53h + db 80h, 81h, 0c0h, 0c1h, 82h, 83h, 0c2h, 0c3h, 80h, 81h, 0c0h, 0c1h, 82h, 83h, 0c2h, 0c3h + db 80h, 81h, 0c0h, 0c1h, 82h, 83h, 0c2h, 0c3h, 80h, 81h, 0c0h, 0c1h, 82h, 83h, 0c2h, 0c3h + db 80h, 81h, 0c0h, 0c1h, 82h, 83h, 0c2h, 0c3h, 80h, 81h, 0c0h, 0c1h, 82h, 83h, 0c2h, 0c3h + db 80h, 81h, 0c0h, 0c1h, 82h, 83h, 0c2h, 0c3h, 80h, 81h, 0c0h, 0c1h, 82h, 83h, 0c2h, 0c3h + db 90h, 91h, 0d0h, 0d1h, 92h, 93h, 0d2h, 0d3h, 90h, 91h, 0d0h, 0d1h, 92h, 93h, 0d2h, 0d3h + db 90h, 91h, 0d0h, 0d1h, 92h, 93h, 0d2h, 0d3h, 90h, 91h, 0d0h, 0d1h, 92h, 93h, 0d2h, 0d3h + db 90h, 91h, 0d0h, 0d1h, 92h, 93h, 0d2h, 0d3h, 90h, 91h, 0d0h, 0d1h, 92h, 93h, 0d2h, 0d3h + db 90h, 91h, 0d0h, 0d1h, 92h, 93h, 0d2h, 0d3h, 90h, 91h, 0d0h, 0d1h, 92h, 93h, 0d2h, 0d3h + +bitx86to6502: + db 00h, 01h, 00h, 01h, 00h, 01h, 00h, 01h, 00h, 01h, 00h, 01h, 00h, 01h, 00h, 01h + db 40h, 41h, 40h, 41h, 40h, 41h, 40h, 41h, 40h, 41h, 40h, 41h, 40h, 41h, 40h, 41h + db 00h, 01h, 00h, 01h, 00h, 01h, 00h, 01h, 00h, 01h, 00h, 01h, 00h, 01h, 00h, 01h + db 40h, 41h, 40h, 41h, 40h, 41h, 40h, 41h, 40h, 41h, 40h, 41h, 40h, 41h, 40h, 41h + db 02h, 03h, 02h, 03h, 02h, 03h, 02h, 03h, 02h, 03h, 02h, 03h, 02h, 03h, 02h, 03h + db 42h, 43h, 42h, 43h, 42h, 43h, 42h, 43h, 42h, 43h, 42h, 43h, 42h, 43h, 42h, 43h + db 02h, 03h, 02h, 03h, 02h, 03h, 02h, 03h, 02h, 03h, 02h, 03h, 02h, 03h, 02h, 03h + db 42h, 43h, 42h, 43h, 42h, 43h, 42h, 43h, 42h, 43h, 42h, 43h, 42h, 43h, 42h, 43h + db 80h, 81h, 80h, 81h, 80h, 81h, 80h, 81h, 80h, 81h, 80h, 81h, 80h, 81h, 80h, 81h + db 0c0h, 0c1h, 0c0h, 0c1h, 0c0h, 0c1h, 0c0h, 0c1h, 0c0h, 0c1h, 0c0h, 0c1h, 0c0h, 0c1h, 0c0h, 0c1h + db 80h, 81h, 80h, 81h, 80h, 81h, 80h, 81h, 80h, 81h, 80h, 81h, 80h, 81h, 80h, 81h + db 0c0h, 0c1h, 0c0h, 0c1h, 0c0h, 0c1h, 0c0h, 0c1h, 0c0h, 0c1h, 0c0h, 0c1h, 0c0h, 0c1h, 0c0h, 0c1h + db 82h, 83h, 82h, 83h, 82h, 83h, 82h, 83h, 82h, 83h, 82h, 83h, 82h, 83h, 82h, 83h + db 0c2h, 0c3h, 0c2h, 0c3h, 0c2h, 0c3h, 0c2h, 0c3h, 0c2h, 0c3h, 0c2h, 0c3h, 0c2h, 0c3h, 0c2h, 0c3h + db 82h, 83h, 82h, 83h, 82h, 83h, 82h, 83h, 82h, 83h, 82h, 83h, 82h, 83h, 82h, 83h + db 0c2h, 0c3h, 0c2h, 0c3h, 0c2h, 0c3h, 0c2h, 0c3h, 0c2h, 0c3h, 0c2h, 0c3h, 0c2h, 0c3h, 0c2h, 0c3h + +m6502zpregular: + dd RegInst00 + dd RegInst01 + dd invalidInsByte + dd invalidInsByte + dd invalidInsByte + dd RegInst05 + dd RegInst06 + dd invalidInsByte + dd RegInst08 + dd RegInst09 + dd RegInst0a + dd invalidInsByte + dd invalidInsByte + dd RegInst0d + dd RegInst0e + dd invalidInsByte + dd RegInst10 + dd RegInst11 + dd invalidInsByte + dd invalidInsByte + dd invalidInsByte + dd RegInst15 + dd RegInst16 + dd invalidInsByte + dd RegInst18 + dd RegInst19 + dd invalidInsByte + dd invalidInsByte + dd invalidInsByte + dd RegInst1d + dd RegInst1e + dd invalidInsByte + dd RegInst20 + dd RegInst21 + dd invalidInsByte + dd invalidInsByte + dd RegInst24 + dd RegInst25 + dd RegInst26 + dd invalidInsByte + dd RegInst28 + dd RegInst29 + dd RegInst2a + dd invalidInsByte + dd RegInst2c + dd RegInst2d + dd RegInst2e + dd invalidInsByte + dd RegInst30 + dd RegInst31 + dd invalidInsByte + dd invalidInsByte + dd invalidInsByte + dd RegInst35 + dd RegInst36 + dd invalidInsByte + dd RegInst38 + dd RegInst39 + dd invalidInsByte + dd invalidInsByte + dd invalidInsByte + dd RegInst3d + dd RegInst3e + dd invalidInsByte + dd RegInst40 + dd RegInst41 + dd invalidInsByte + dd invalidInsByte + dd invalidInsByte + dd RegInst45 + dd RegInst46 + dd invalidInsByte + dd RegInst48 + dd RegInst49 + dd RegInst4a + dd invalidInsByte + dd RegInst4c + dd RegInst4d + dd RegInst4e + dd invalidInsByte + dd RegInst50 + dd RegInst51 + dd invalidInsByte + dd invalidInsByte + dd invalidInsByte + dd RegInst55 + dd RegInst56 + dd invalidInsByte + dd RegInst58 + dd RegInst59 + dd invalidInsByte + dd invalidInsByte + dd invalidInsByte + dd RegInst5d + dd RegInst5e + dd invalidInsByte + dd RegInst60 + dd RegInst61 + dd invalidInsByte + dd invalidInsByte + dd invalidInsByte + dd RegInst65 + dd RegInst66 + dd invalidInsByte + dd RegInst68 + dd RegInst69 + dd RegInst6a + dd invalidInsByte + dd RegInst6c + dd RegInst6d + dd RegInst6e + dd invalidInsByte + dd RegInst70 + dd RegInst71 + dd invalidInsByte + dd invalidInsByte + dd invalidInsByte + dd RegInst75 + dd RegInst76 + dd invalidInsByte + dd RegInst78 + dd RegInst79 + dd invalidInsByte + dd invalidInsByte + dd invalidInsByte + dd RegInst7d + dd RegInst7e + dd invalidInsByte + dd invalidInsByte + dd RegInst81 + dd invalidInsByte + dd invalidInsByte + dd RegInst84 + dd RegInst85 + dd RegInst86 + dd invalidInsByte + dd RegInst88 + dd invalidInsByte + dd RegInst8a + dd invalidInsByte + dd RegInst8c + dd RegInst8d + dd RegInst8e + dd invalidInsByte + dd RegInst90 + dd RegInst91 + dd invalidInsByte + dd invalidInsByte + dd RegInst94 + dd RegInst95 + dd RegInst96 + dd invalidInsByte + dd RegInst98 + dd RegInst99 + dd RegInst9a + dd invalidInsByte + dd invalidInsByte + dd RegInst9d + dd invalidInsByte + dd invalidInsByte + dd RegInsta0 + dd RegInsta1 + dd RegInsta2 + dd invalidInsByte + dd RegInsta4 + dd RegInsta5 + dd RegInsta6 + dd invalidInsByte + dd RegInsta8 + dd RegInsta9 + dd RegInstaa + dd invalidInsByte + dd RegInstac + dd RegInstad + dd RegInstae + dd invalidInsByte + dd RegInstb0 + dd RegInstb1 + dd invalidInsByte + dd invalidInsByte + dd RegInstb4 + dd RegInstb5 + dd RegInstb6 + dd invalidInsByte + dd RegInstb8 + dd RegInstb9 + dd RegInstba + dd invalidInsByte + dd RegInstbc + dd RegInstbd + dd RegInstbe + dd invalidInsByte + dd RegInstc0 + dd RegInstc1 + dd invalidInsByte + dd invalidInsByte + dd RegInstc4 + dd RegInstc5 + dd RegInstc6 + dd invalidInsByte + dd RegInstc8 + dd RegInstc9 + dd RegInstca + dd invalidInsByte + dd RegInstcc + dd RegInstcd + dd RegInstce + dd invalidInsByte + dd RegInstd0 + dd RegInstd1 + dd invalidInsByte + dd invalidInsByte + dd invalidInsByte + dd RegInstd5 + dd RegInstd6 + dd invalidInsByte + dd RegInstd8 + dd RegInstd9 + dd invalidInsByte + dd invalidInsByte + dd invalidInsByte + dd RegInstdd + dd RegInstde + dd invalidInsByte + dd RegInste0 + dd RegInste1 + dd invalidInsByte + dd invalidInsByte + dd RegInste4 + dd RegInste5 + dd RegInste6 + dd invalidInsByte + dd RegInste8 + dd RegInste9 + dd RegInstea + dd invalidInsByte + dd RegInstec + dd RegInsted + dd RegInstee + dd invalidInsByte + dd RegInstf0 + dd RegInstf1 + dd invalidInsByte + dd invalidInsByte + dd invalidInsByte + dd RegInstf5 + dd RegInstf6 + dd invalidInsByte + dd RegInstf8 + dd RegInstf9 + dd invalidInsByte + dd invalidInsByte + dd invalidInsByte + dd RegInstfd + dd RegInstfe + dd invalidInsByte + + section .text + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +; This is a generic read memory byte handler when a foreign +; handler is to be called + +ReadMemoryByte: + mov [_m6502zpx], bl ; Save X + mov [_m6502zpy], cl ; Save Y + mov [_m6502zpaf], ax ; Save Accumulator & flags + sub esi, ebp ; Our program counter + mov [_m6502zppc], si ; Save our program counter + push edi ; Save our structure address + and edx, 0ffffh ; Only the lower 16 bits + push edx ; And our desired address + call dword [edi + 8] ; Go call our handler + add esp, 8 ; Get the junk off the stack + xor ebx, ebx ; Zero X + xor ecx, ecx ; Zero Y + xor esi, esi ; Zero it! + mov si, [_m6502zppc] ; Get our program counter back + mov ebp, [_m6502zpBase] ; Base pointer comes back + add esi, ebp ; Rebase it properly + ret + +; +; BRK +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst00: + sub dword [cyclesRemaining], byte 7 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 7 + sub esi, ebp ; Get our real program counter + inc si ; Move to the next position + or [_altFlags], byte 14h ; Indicate a break happened + xor edx, edx + mov dl, ah + mov ah, [bitx86to6502+edx] + or ah, [_altFlags] + mov dl, [_m6502zps] ; Get our stack pointer + add dx, 0ffh ; Stack area is 100-1ffh + mov [edx+ebp], si ; Store our PC + dec dx ; Back up for flag storage + mov [edx+ebp], ah ; Store our flags + dec dx ; Back up for flag storage + mov [_m6502zps], dl ; Store our new stack area + xor esi, esi ; Zero our program counter + mov si, [ebp+0fffeh] ; Get our break handler + add esi, ebp ; Add our base pointer back in + xor edx, edx + mov dl, ah + mov [_altFlags], dl + and [_altFlags], byte 3ch; + mov ah, [bit6502tox86+edx] + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; Ora +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst01: + sub dword [cyclesRemaining], byte 6 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 6 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + add dl, bl ; Add in X + mov dx, [ebp+edx] ; Get our 16 bit address + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop2: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead2 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr2 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine2 + +nextAddr2: + add edi, 10h ; Next structure! + jmp short checkLoop2 + +callRoutine2: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit2 + +memoryRead2: + mov dl, [ebp + edx] ; Get our data + +readExit2: + mov dh, ah ; Get the flags + or al, dl ; OR In our value + lahf ; Get the flag settings + and ah, 0c0h ; Only sign and zero flag + and dh, 03fh ; Clear sign & zero flags + or ah, dh ; Merge the affected flags together + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; Ora +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst05: + sub dword [cyclesRemaining], byte 3 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 3 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + mov dl, [ebp+edx] ; Get our zero page data + mov dh, ah ; Get the flags + or al, dl ; OR In our value + lahf ; Get the flag settings + and ah, 0c0h ; Only sign and zero flag + and dh, 03fh ; Clear sign & zero flags + or ah, dh ; Merge the affected flags together + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; Asl +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst06: + sub dword [cyclesRemaining], byte 5 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 5 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + mov bh, [ebp+edx] ; Get our zero page stuff + sahf ; Restore flags + mov ch, ah ; Store our original flags + shl bh, 1 ; Shift left by 1 + lahf ; Load the flags back in + and ch, 03eh ; No carry, zero, or sign + and ah, 0c1h ; Only carry, zero and sign + or ah, ch ; Or it into our flags + xor ch, ch ; Clear it! + mov [ebp+edx], bh ; Set our zero page byte + xor bh, bh ; Prevent us from being hosed later + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; PHP +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst08: + sub dword [cyclesRemaining], byte 3 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 3 + xor edx, edx + mov dl, ah + mov ah, [bitx86to6502+edx] + or ah, [_altFlags] + inc dh ; Stack page + mov dl, [_m6502zps] ; Stack pointer + mov [ebp+edx], ah + dec byte [_m6502zps] ; Decrement our stack pointer + xor edx, edx + mov dl, ah + mov [_altFlags], dl + and [_altFlags], byte 3ch; + mov ah, [bit6502tox86+edx] + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; Ora +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst09: + sub dword [cyclesRemaining], byte 2 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 2 + mov dl, [esi] ; Get our next byte + inc esi ; Increment to our next byte + mov dh, ah ; Get the flags + or al, dl ; OR In our value + lahf ; Get the flag settings + and ah, 0c0h ; Only sign and zero flag + and dh, 03fh ; Clear sign & zero flags + or ah, dh ; Merge the affected flags together + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; Asl +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst0a: + sub dword [cyclesRemaining], byte 2 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 2 + sahf ; Restore flags + mov dl, ah ; Store our original flags + shl al, 1 ; Shift left by 1 + lahf ; Load the flags back in + and dl, 03eh ; No carry, zero, or sign + and ah, 0c1h ; Only carry, zero and sign + or ah, dl ; Or it into our flags + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; Ora +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst0d: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop3: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead3 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr3 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine3 + +nextAddr3: + add edi, 10h ; Next structure! + jmp short checkLoop3 + +callRoutine3: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit3 + +memoryRead3: + mov dl, [ebp + edx] ; Get our data + +readExit3: + mov dh, ah ; Get the flags + or al, dl ; OR In our value + lahf ; Get the flag settings + and ah, 0c0h ; Only sign and zero flag + and dh, 03fh ; Clear sign & zero flags + or ah, dh ; Merge the affected flags together + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; Asl +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst0e: + sub dword [cyclesRemaining], byte 6 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 6 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + push edx ; Save our address + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop4: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead4 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr4 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine4 + +nextAddr4: + add edi, 10h ; Next structure! + jmp short checkLoop4 + +callRoutine4: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov bh, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit4 + +memoryRead4: + mov bh, [ebp + edx] ; Get our data + +readExit4: + pop edx ; Restore our address + sahf ; Restore flags + mov ch, ah ; Store our original flags + shl bh, 1 ; Shift left by 1 + lahf ; Load the flags back in + and ch, 03eh ; No carry, zero, or sign + and ah, 0c1h ; Only carry, zero and sign + or ah, ch ; Or it into our flags + xor ch, ch ; Clear it! + mov edi, [_m6502zpMemWrite] ; Point to the write array + +checkLoop5: + cmp [edi], word 0ffffh ; End of our list? + je near memoryWrite5 ; Yes - go write it! + cmp dx, [edi] ; Are we smaller? + jb nextAddr5 ; Yes... go to the next addr + cmp dx, [edi+4] ; Are we bigger? + jbe callRoutine5 ; If not, go call it! + +nextAddr5: + add edi, 10h ; Next structure, please + jmp short checkLoop5 + +callRoutine5: + mov [_m6502zpx], bl ; Save X + mov [_m6502zpy], cl ; Save Y + mov [_m6502zpaf], ax ; Save Accumulator & flags + sub esi, ebp ; Our program counter + mov [_m6502zppc], si ; Save our program counter + push edi ; Pointer to MemoryWriteByte structure + mov bl, bh ; Put a copy here + push ebx ; The byte value + and edx, 0ffffh ; Only lower 16 bits + push edx ; The address + call dword [edi + 8] ; Go call our handler + add esp, 12 ; Get rid of our stack + xor ebx, ebx ; Zero this + xor ecx, ecx ; This too! + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + xor esi, esi ; Zero it! + mov si, [_m6502zppc] ; Get our program counter back + mov ebp, [_m6502zpBase] ; Base pointer comes back + add esi, ebp ; Rebase it properly + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short writeMacroExit5 + +memoryWrite5: + mov [ebp + edx], bh ; Store the byte + +writeMacroExit5: + xor bh, bh ; Prevent us from being hosed later + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; Branch +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst10: + sub dword [cyclesRemaining], byte 3 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 3 + test ah, 80h ; Are we plus? + jz short takeJump10 ; Do it! + inc esi ; Skip past the offset + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +takeJump10: + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + movsx dx, dl + sub esi, ebp + add si, dx + add esi, ebp + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; Ora +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst11: + sub dword [cyclesRemaining], byte 5 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 5 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + mov dx, [ebp+edx] ; Get our 16 bit address + add dx, cx ; Add in Y + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop7: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead7 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr7 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine7 + +nextAddr7: + add edi, 10h ; Next structure! + jmp short checkLoop7 + +callRoutine7: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit7 + +memoryRead7: + mov dl, [ebp + edx] ; Get our data + +readExit7: + mov dh, ah ; Get the flags + or al, dl ; OR In our value + lahf ; Get the flag settings + and ah, 0c0h ; Only sign and zero flag + and dh, 03fh ; Clear sign & zero flags + or ah, dh ; Merge the affected flags together + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; Ora +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst15: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + add dl, bl ; Add X + mov dl, [ebp+edx] ; Get our zero page data + mov dh, ah ; Get the flags + or al, dl ; OR In our value + lahf ; Get the flag settings + and ah, 0c0h ; Only sign and zero flag + and dh, 03fh ; Clear sign & zero flags + or ah, dh ; Merge the affected flags together + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; Asl +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst16: + sub dword [cyclesRemaining], byte 6 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 6 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + add dl, bl ; Add X + mov bh, [ebp+edx] ; Get our zero page stuff + sahf ; Restore flags + mov ch, ah ; Store our original flags + shl bh, 1 ; Shift left by 1 + lahf ; Load the flags back in + and ch, 03eh ; No carry, zero, or sign + and ah, 0c1h ; Only carry, zero and sign + or ah, ch ; Or it into our flags + xor ch, ch ; Clear it! + mov [ebp+edx], bh ; Set our zero page byte + xor bh, bh ; Prevent us from being hosed later + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; CLC +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst18: + sub dword [cyclesRemaining], byte 2 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 2 + and ah, 0feh ; No carry + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; Ora +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst19: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + add dx, cx ; Add Y + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop8: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead8 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr8 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine8 + +nextAddr8: + add edi, 10h ; Next structure! + jmp short checkLoop8 + +callRoutine8: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit8 + +memoryRead8: + mov dl, [ebp + edx] ; Get our data + +readExit8: + mov dh, ah ; Get the flags + or al, dl ; OR In our value + lahf ; Get the flag settings + and ah, 0c0h ; Only sign and zero flag + and dh, 03fh ; Clear sign & zero flags + or ah, dh ; Merge the affected flags together + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; Ora +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst1d: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + add dx, bx ; Add X + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop9: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead9 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr9 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine9 + +nextAddr9: + add edi, 10h ; Next structure! + jmp short checkLoop9 + +callRoutine9: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit9 + +memoryRead9: + mov dl, [ebp + edx] ; Get our data + +readExit9: + mov dh, ah ; Get the flags + or al, dl ; OR In our value + lahf ; Get the flag settings + and ah, 0c0h ; Only sign and zero flag + and dh, 03fh ; Clear sign & zero flags + or ah, dh ; Merge the affected flags together + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; Asl +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst1e: + sub dword [cyclesRemaining], byte 7 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 7 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + add dx, bx ; Add X + push edx ; Save our address + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop10: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead10 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr10 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine10 + +nextAddr10: + add edi, 10h ; Next structure! + jmp short checkLoop10 + +callRoutine10: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov bh, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit10 + +memoryRead10: + mov bh, [ebp + edx] ; Get our data + +readExit10: + pop edx ; Restore our address + sahf ; Restore flags + mov ch, ah ; Store our original flags + shl bh, 1 ; Shift left by 1 + lahf ; Load the flags back in + and ch, 03eh ; No carry, zero, or sign + and ah, 0c1h ; Only carry, zero and sign + or ah, ch ; Or it into our flags + xor ch, ch ; Clear it! + mov edi, [_m6502zpMemWrite] ; Point to the write array + +checkLoop11: + cmp [edi], word 0ffffh ; End of our list? + je near memoryWrite11 ; Yes - go write it! + cmp dx, [edi] ; Are we smaller? + jb nextAddr11 ; Yes... go to the next addr + cmp dx, [edi+4] ; Are we bigger? + jbe callRoutine11 ; If not, go call it! + +nextAddr11: + add edi, 10h ; Next structure, please + jmp short checkLoop11 + +callRoutine11: + mov [_m6502zpx], bl ; Save X + mov [_m6502zpy], cl ; Save Y + mov [_m6502zpaf], ax ; Save Accumulator & flags + sub esi, ebp ; Our program counter + mov [_m6502zppc], si ; Save our program counter + push edi ; Pointer to MemoryWriteByte structure + mov bl, bh ; Put a copy here + push ebx ; The byte value + and edx, 0ffffh ; Only lower 16 bits + push edx ; The address + call dword [edi + 8] ; Go call our handler + add esp, 12 ; Get rid of our stack + xor ebx, ebx ; Zero this + xor ecx, ecx ; This too! + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + xor esi, esi ; Zero it! + mov si, [_m6502zppc] ; Get our program counter back + mov ebp, [_m6502zpBase] ; Base pointer comes back + add esi, ebp ; Rebase it properly + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short writeMacroExit11 + +memoryWrite11: + mov [ebp + edx], bh ; Store the byte + +writeMacroExit11: + xor bh, bh ; Prevent us from being hosed later + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; JSR +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst20: + sub dword [cyclesRemaining], byte 6 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 6 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + sub esi, ebp ; Get our real program counter + dec si ; Our offset to return to + sub [_m6502zps], byte 2 ; Back up 2 byte for stack push + mov di, word [_m6502zps] ; Our stack area + and edi, 0ffh ; Only the lower byte matters + add edi, 101h ; Make sure it's on the stack page + mov [edi+ebp], si ; Store our return address + add edx, ebp ; Our new address + mov esi, edx ; Put it in here for the fetch + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; AND +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst21: + sub dword [cyclesRemaining], byte 6 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 6 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + add dl, bl ; Add in X + mov dx, [ebp+edx] ; Get our 16 bit address + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop13: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead13 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr13 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine13 + +nextAddr13: + add edi, 10h ; Next structure! + jmp short checkLoop13 + +callRoutine13: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit13 + +memoryRead13: + mov dl, [ebp + edx] ; Get our data + +readExit13: + and al, dl ; And it + mov bh, ah ; Save flags for later + lahf ; Get the flags + and ah, 0c0h ; Only sign and zero flag + and bh, 03fh ; Kill sign and zero flag + or ah, bh ; Get our original (other) flags back + xor bh, bh ; Kill it so we don't screw X up for later + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; BIT +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst24: + sub dword [cyclesRemaining], byte 3 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 3 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + mov dl, [ebp+edx] ; Get our zero page byte + mov dh, dl ; Save this, too + and ah, 2fh ; Kill sign, zero, and overflow + mov bh, ah ; Put it here for later + and dl, al ; And this value with the accumulator + lahf ; Get our flags + and ah, 040h ; Only the zero matters + or ah, bh ; Get our other original flags back + mov dl, dh ; Get our value back + and dl, 80h ; Only the negative flag + or ah, dl ; OR It in with the original + and dh, 40h ; What we do with the 6th bit + shr dh, 2 ; Save this for later + or ah, dh ; OR In our "overflow" + xor bh, bh ; Zero this! + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; AND +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst25: + sub dword [cyclesRemaining], byte 3 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 3 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + and al, [ebp+edx] ; And it! + mov bh, ah ; Save flags for later + lahf ; Get the flags + and ah, 0c0h ; Only sign and zero flag + and bh, 03fh ; Kill sign and zero flag + or ah, bh ; Get our original (other) flags back + xor bh, bh ; Kill it so we don't screw X up for later + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; ROL +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst26: + sub dword [cyclesRemaining], byte 5 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 5 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + push edx ; Save our address + mov dl, [ebp+edx] ; Get our zero page byte + mov dh, ah ; Save off our original flags + and dh, 3eh ; No carry, zero, or sign + sahf ; Restore flags + rcl dl, 1 ; Through carry rotate + lahf ; Get the current flags back + mov bh, ah ; Store it here for later + and bh, 1 ; Only the carry matters + or dl, dl ; Set sign/zero + lahf ; Get the flags + and ah, 0c0h ; Only sign and zero + or ah, bh ; Or In our carry + or ah, dh ; Or in our original flags + mov bh, dl ; Get our byte to write + pop edx ; Restore the address + mov [ebp+edx], bh ; Set our zero page byte + xor bh, bh ; Zero this so we don't screw up things + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; PLP +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst28: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + inc dh ; Stack page + inc byte [_m6502zps] ; Increment our stack pointer + mov dl, [_m6502zps] ; Stack pointer + mov ah, [ebp+edx] + xor edx, edx + mov dl, ah + mov [_altFlags], dl + and [_altFlags], byte 3ch; + mov ah, [bit6502tox86+edx] + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; AND +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst29: + sub dword [cyclesRemaining], byte 2 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 2 + mov dl, [esi] ; Get our next byte + inc esi ; Increment to our next byte + and al, dl ; And it + mov bh, ah ; Save flags for later + lahf ; Get the flags + and ah, 0c0h ; Only sign and zero flag + and bh, 03fh ; Kill sign and zero flag + or ah, bh ; Get our original (other) flags back + xor bh, bh ; Kill it so we don't screw X up for later + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; ROL +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst2a: + sub dword [cyclesRemaining], byte 2 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 2 + mov dh, ah ; Save off our original flags + and dh, 3eh ; No carry, zero, or sign + sahf ; Restore flags + rcl al, 1 ; Through carry rotate + lahf ; Get the current flags back + mov bh, ah ; Store it here for later + and bh, 1 ; Only the carry matters + or al, al ; Set sign/zero + lahf ; Get the flags + and ah, 0c0h ; Only sign and zero + or ah, bh ; Or In our carry + or ah, dh ; Or in our original flags + xor bh, bh ; Zero this so we don't screw up things + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; BIT +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst2c: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop14: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead14 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr14 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine14 + +nextAddr14: + add edi, 10h ; Next structure! + jmp short checkLoop14 + +callRoutine14: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit14 + +memoryRead14: + mov dl, [ebp + edx] ; Get our data + +readExit14: + mov dh, dl ; Save this, too + and ah, 2fh ; Kill sign, zero, and overflow + mov bh, ah ; Put it here for later + and dl, al ; And this value with the accumulator + lahf ; Get our flags + and ah, 040h ; Only the zero matters + or ah, bh ; Get our other original flags back + mov dl, dh ; Get our value back + and dl, 80h ; Only the negative flag + or ah, dl ; OR It in with the original + and dh, 40h ; What we do with the 6th bit + shr dh, 2 ; Save this for later + or ah, dh ; OR In our "overflow" + xor bh, bh ; Zero this! + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; AND +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst2d: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop15: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead15 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr15 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine15 + +nextAddr15: + add edi, 10h ; Next structure! + jmp short checkLoop15 + +callRoutine15: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit15 + +memoryRead15: + mov dl, [ebp + edx] ; Get our data + +readExit15: + and al, dl ; And it + mov bh, ah ; Save flags for later + lahf ; Get the flags + and ah, 0c0h ; Only sign and zero flag + and bh, 03fh ; Kill sign and zero flag + or ah, bh ; Get our original (other) flags back + xor bh, bh ; Kill it so we don't screw X up for later + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; ROL +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst2e: + sub dword [cyclesRemaining], byte 6 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 6 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + push edx ; Save our address + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop16: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead16 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr16 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine16 + +nextAddr16: + add edi, 10h ; Next structure! + jmp short checkLoop16 + +callRoutine16: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit16 + +memoryRead16: + mov dl, [ebp + edx] ; Get our data + +readExit16: + mov dh, ah ; Save off our original flags + and dh, 3eh ; No carry, zero, or sign + sahf ; Restore flags + rcl dl, 1 ; Through carry rotate + lahf ; Get the current flags back + mov bh, ah ; Store it here for later + and bh, 1 ; Only the carry matters + or dl, dl ; Set sign/zero + lahf ; Get the flags + and ah, 0c0h ; Only sign and zero + or ah, bh ; Or In our carry + or ah, dh ; Or in our original flags + mov bh, dl ; Get our byte to write + pop edx ; Restore the address + mov edi, [_m6502zpMemWrite] ; Point to the write array + +checkLoop17: + cmp [edi], word 0ffffh ; End of our list? + je near memoryWrite17 ; Yes - go write it! + cmp dx, [edi] ; Are we smaller? + jb nextAddr17 ; Yes... go to the next addr + cmp dx, [edi+4] ; Are we bigger? + jbe callRoutine17 ; If not, go call it! + +nextAddr17: + add edi, 10h ; Next structure, please + jmp short checkLoop17 + +callRoutine17: + mov [_m6502zpx], bl ; Save X + mov [_m6502zpy], cl ; Save Y + mov [_m6502zpaf], ax ; Save Accumulator & flags + sub esi, ebp ; Our program counter + mov [_m6502zppc], si ; Save our program counter + push edi ; Pointer to MemoryWriteByte structure + mov bl, bh ; Put a copy here + push ebx ; The byte value + and edx, 0ffffh ; Only lower 16 bits + push edx ; The address + call dword [edi + 8] ; Go call our handler + add esp, 12 ; Get rid of our stack + xor ebx, ebx ; Zero this + xor ecx, ecx ; This too! + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + xor esi, esi ; Zero it! + mov si, [_m6502zppc] ; Get our program counter back + mov ebp, [_m6502zpBase] ; Base pointer comes back + add esi, ebp ; Rebase it properly + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short writeMacroExit17 + +memoryWrite17: + mov [ebp + edx], bh ; Store the byte + +writeMacroExit17: + xor bh, bh ; Zero this so we don't screw up things + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; Branch +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst30: + sub dword [cyclesRemaining], byte 3 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 3 + test ah, 80h ; Are we minus? + jnz short takeJump30 ; Do it! + inc esi ; Skip past the offset + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +takeJump30: + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + movsx dx, dl + sub esi, ebp + add si, dx + add esi, ebp + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; AND +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst31: + sub dword [cyclesRemaining], byte 5 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 5 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + mov dx, [ebp+edx] ; Get our 16 bit address + add dx, cx ; Add in Y + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop19: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead19 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr19 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine19 + +nextAddr19: + add edi, 10h ; Next structure! + jmp short checkLoop19 + +callRoutine19: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit19 + +memoryRead19: + mov dl, [ebp + edx] ; Get our data + +readExit19: + and al, dl ; And it + mov bh, ah ; Save flags for later + lahf ; Get the flags + and ah, 0c0h ; Only sign and zero flag + and bh, 03fh ; Kill sign and zero flag + or ah, bh ; Get our original (other) flags back + xor bh, bh ; Kill it so we don't screw X up for later + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; AND +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst35: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + add dl, bl ; Add X + and al, [ebp+edx] ; And it! + mov bh, ah ; Save flags for later + lahf ; Get the flags + and ah, 0c0h ; Only sign and zero flag + and bh, 03fh ; Kill sign and zero flag + or ah, bh ; Get our original (other) flags back + xor bh, bh ; Kill it so we don't screw X up for later + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; ROL +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst36: + sub dword [cyclesRemaining], byte 6 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 6 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + add dl, bl ; Add X + push edx ; Save our address + mov dl, [ebp+edx] ; Get our zero page byte + mov dh, ah ; Save off our original flags + and dh, 3eh ; No carry, zero, or sign + sahf ; Restore flags + rcl dl, 1 ; Through carry rotate + lahf ; Get the current flags back + mov bh, ah ; Store it here for later + and bh, 1 ; Only the carry matters + or dl, dl ; Set sign/zero + lahf ; Get the flags + and ah, 0c0h ; Only sign and zero + or ah, bh ; Or In our carry + or ah, dh ; Or in our original flags + mov bh, dl ; Get our byte to write + pop edx ; Restore the address + mov [ebp+edx], bh ; Set our zero page byte + xor bh, bh ; Zero this so we don't screw up things + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; SEC +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst38: + sub dword [cyclesRemaining], byte 2 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 2 + or ah, 01h ; Carry! + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; AND +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst39: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + add dx, cx ; Add Y + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop20: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead20 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr20 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine20 + +nextAddr20: + add edi, 10h ; Next structure! + jmp short checkLoop20 + +callRoutine20: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit20 + +memoryRead20: + mov dl, [ebp + edx] ; Get our data + +readExit20: + and al, dl ; And it + mov bh, ah ; Save flags for later + lahf ; Get the flags + and ah, 0c0h ; Only sign and zero flag + and bh, 03fh ; Kill sign and zero flag + or ah, bh ; Get our original (other) flags back + xor bh, bh ; Kill it so we don't screw X up for later + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; AND +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst3d: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + add dx, bx ; Add X + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop21: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead21 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr21 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine21 + +nextAddr21: + add edi, 10h ; Next structure! + jmp short checkLoop21 + +callRoutine21: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit21 + +memoryRead21: + mov dl, [ebp + edx] ; Get our data + +readExit21: + and al, dl ; And it + mov bh, ah ; Save flags for later + lahf ; Get the flags + and ah, 0c0h ; Only sign and zero flag + and bh, 03fh ; Kill sign and zero flag + or ah, bh ; Get our original (other) flags back + xor bh, bh ; Kill it so we don't screw X up for later + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; ROL +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst3e: + sub dword [cyclesRemaining], byte 7 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 7 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + add dx, bx ; Add X + push edx ; Save our address + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop22: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead22 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr22 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine22 + +nextAddr22: + add edi, 10h ; Next structure! + jmp short checkLoop22 + +callRoutine22: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit22 + +memoryRead22: + mov dl, [ebp + edx] ; Get our data + +readExit22: + mov dh, ah ; Save off our original flags + and dh, 3eh ; No carry, zero, or sign + sahf ; Restore flags + rcl dl, 1 ; Through carry rotate + lahf ; Get the current flags back + mov bh, ah ; Store it here for later + and bh, 1 ; Only the carry matters + or dl, dl ; Set sign/zero + lahf ; Get the flags + and ah, 0c0h ; Only sign and zero + or ah, bh ; Or In our carry + or ah, dh ; Or in our original flags + mov bh, dl ; Get our byte to write + pop edx ; Restore the address + mov edi, [_m6502zpMemWrite] ; Point to the write array + +checkLoop23: + cmp [edi], word 0ffffh ; End of our list? + je near memoryWrite23 ; Yes - go write it! + cmp dx, [edi] ; Are we smaller? + jb nextAddr23 ; Yes... go to the next addr + cmp dx, [edi+4] ; Are we bigger? + jbe callRoutine23 ; If not, go call it! + +nextAddr23: + add edi, 10h ; Next structure, please + jmp short checkLoop23 + +callRoutine23: + mov [_m6502zpx], bl ; Save X + mov [_m6502zpy], cl ; Save Y + mov [_m6502zpaf], ax ; Save Accumulator & flags + sub esi, ebp ; Our program counter + mov [_m6502zppc], si ; Save our program counter + push edi ; Pointer to MemoryWriteByte structure + mov bl, bh ; Put a copy here + push ebx ; The byte value + and edx, 0ffffh ; Only lower 16 bits + push edx ; The address + call dword [edi + 8] ; Go call our handler + add esp, 12 ; Get rid of our stack + xor ebx, ebx ; Zero this + xor ecx, ecx ; This too! + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + xor esi, esi ; Zero it! + mov si, [_m6502zppc] ; Get our program counter back + mov ebp, [_m6502zpBase] ; Base pointer comes back + add esi, ebp ; Rebase it properly + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short writeMacroExit23 + +memoryWrite23: + mov [ebp + edx], bh ; Store the byte + +writeMacroExit23: + xor bh, bh ; Zero this so we don't screw up things + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; RTI +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst40: + sub dword [cyclesRemaining], byte 6 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 6 + mov dl, [_m6502zps] ; Get our stack pointer + add [_m6502zps], byte 3 ; Restore our stack + inc dh ; Increment to the stack page + inc dl ; And our pointer to the flags + mov ah, [ebp+edx] ; Get our flags + inc dl ; Next address + mov si, [ebp+edx] ; Get our new address + mov [_m6502zppc], si ; Store our program counter + or ah, 20h ; This bit is always 1 + mov [_m6502zpaf + 1], ah ; Store our flags + test ah, 04h ; Interrupts reenabled? + jnz notEnabled + cmp [_irqPending], byte 0 ; IRQ pending? + je notEnabled + push eax ; Save this - we need it + call _m6502zpint ; Go do an interrupt + pop eax ; Restore this - we need it! +notEnabled: + xor esi, esi + mov si, [_m6502zppc] ; Get our program counter + add esi, ebp ; So it properly points to the code + xor edx, edx + mov dl, ah + mov [_altFlags], dl + and [_altFlags], byte 3ch; + mov ah, [bit6502tox86+edx] + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; Eor +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst41: + sub dword [cyclesRemaining], byte 6 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 6 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + add dl, bl ; Add in X + mov dx, [ebp+edx] ; Get our 16 bit address + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop25: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead25 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr25 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine25 + +nextAddr25: + add edi, 10h ; Next structure! + jmp short checkLoop25 + +callRoutine25: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit25 + +memoryRead25: + mov dl, [ebp + edx] ; Get our data + +readExit25: + mov dh, ah ; Get the flags + xor al, dl ; XOR In our value + lahf ; Get the flag settings + and ah, 0c0h ; Only sign and zero flag + and dh, 03fh ; Clear sign & zero flags + or ah, dh ; Merge the affected flags together + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; Eor +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst45: + sub dword [cyclesRemaining], byte 3 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 3 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + mov dl, [ebp+edx] ; Get our zero page data + mov dh, ah ; Get the flags + xor al, dl ; XOR In our value + lahf ; Get the flag settings + and ah, 0c0h ; Only sign and zero flag + and dh, 03fh ; Clear sign & zero flags + or ah, dh ; Merge the affected flags together + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; Lsr +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst46: + sub dword [cyclesRemaining], byte 5 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 5 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + push edx ; Save our address away + mov bh, [ebp+edx] ; Get our zero page stuff + sahf ; Restore flags + mov ch, ah ; Store our original flags + shr bh, 1 ; Shift right by 1 + lahf ; Load the flags back in + and ch, 03eh ; No carry, zero, or sign + and ah, 0c1h ; Only carry, zero and sign + or ah, ch ; Or it into our flags + xor ch, ch ; Clear it! + pop edx ; Restore our address + mov [ebp+edx], bh ; Set our zero page byte + xor bh, bh ; Zero the upper part so we don't host X! + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; PHA +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst48: + sub dword [cyclesRemaining], byte 3 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 3 + inc dh ; Stack page + mov dl, [_m6502zps] ; Stack pointer + mov [ebp+edx], al + dec byte [_m6502zps] ; Decrement our stack pointer + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; Eor +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst49: + sub dword [cyclesRemaining], byte 2 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 2 + mov dl, [esi] ; Get our next byte + inc esi ; Increment to our next byte + mov dh, ah ; Get the flags + xor al, dl ; XOR In our value + lahf ; Get the flag settings + and ah, 0c0h ; Only sign and zero flag + and dh, 03fh ; Clear sign & zero flags + or ah, dh ; Merge the affected flags together + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; Lsr +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst4a: + sub dword [cyclesRemaining], byte 2 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 2 + sahf ; Restore flags + mov dl, ah ; Store our original flags + shr al, 1 ; Shift right by 1 + lahf ; Load the flags back in + and dl, 03eh ; No carry, zero, or sign + and ah, 0c1h ; Only carry, zero and sign + or ah, dl ; Or it into our flags + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; JMP +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst4c: + sub dword [cyclesRemaining], byte 3 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 3 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + add edx, ebp ; Add in our base + mov esi, edx ; Put it here for execution + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; Eor +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst4d: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop27: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead27 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr27 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine27 + +nextAddr27: + add edi, 10h ; Next structure! + jmp short checkLoop27 + +callRoutine27: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit27 + +memoryRead27: + mov dl, [ebp + edx] ; Get our data + +readExit27: + mov dh, ah ; Get the flags + xor al, dl ; XOR In our value + lahf ; Get the flag settings + and ah, 0c0h ; Only sign and zero flag + and dh, 03fh ; Clear sign & zero flags + or ah, dh ; Merge the affected flags together + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; Lsr +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst4e: + sub dword [cyclesRemaining], byte 6 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 6 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + push edx ; Save our address away + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop28: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead28 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr28 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine28 + +nextAddr28: + add edi, 10h ; Next structure! + jmp short checkLoop28 + +callRoutine28: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov bh, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit28 + +memoryRead28: + mov bh, [ebp + edx] ; Get our data + +readExit28: + sahf ; Restore flags + mov ch, ah ; Store our original flags + shr bh, 1 ; Shift right by 1 + lahf ; Load the flags back in + and ch, 03eh ; No carry, zero, or sign + and ah, 0c1h ; Only carry, zero and sign + or ah, ch ; Or it into our flags + xor ch, ch ; Clear it! + pop edx ; Restore our address + mov edi, [_m6502zpMemWrite] ; Point to the write array + +checkLoop29: + cmp [edi], word 0ffffh ; End of our list? + je near memoryWrite29 ; Yes - go write it! + cmp dx, [edi] ; Are we smaller? + jb nextAddr29 ; Yes... go to the next addr + cmp dx, [edi+4] ; Are we bigger? + jbe callRoutine29 ; If not, go call it! + +nextAddr29: + add edi, 10h ; Next structure, please + jmp short checkLoop29 + +callRoutine29: + mov [_m6502zpx], bl ; Save X + mov [_m6502zpy], cl ; Save Y + mov [_m6502zpaf], ax ; Save Accumulator & flags + sub esi, ebp ; Our program counter + mov [_m6502zppc], si ; Save our program counter + push edi ; Pointer to MemoryWriteByte structure + mov bl, bh ; Put a copy here + push ebx ; The byte value + and edx, 0ffffh ; Only lower 16 bits + push edx ; The address + call dword [edi + 8] ; Go call our handler + add esp, 12 ; Get rid of our stack + xor ebx, ebx ; Zero this + xor ecx, ecx ; This too! + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + xor esi, esi ; Zero it! + mov si, [_m6502zppc] ; Get our program counter back + mov ebp, [_m6502zpBase] ; Base pointer comes back + add esi, ebp ; Rebase it properly + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short writeMacroExit29 + +memoryWrite29: + mov [ebp + edx], bh ; Store the byte + +writeMacroExit29: + xor bh, bh ; Zero the upper part so we don't host X! + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; Branch +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst50: + sub dword [cyclesRemaining], byte 3 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 3 + test ah, 10h ; Overflow not set? + jz short takeJump50 ; Do it! + inc esi ; Skip past the offset + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +takeJump50: + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + movsx dx, dl + sub esi, ebp + add si, dx + add esi, ebp + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; Eor +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst51: + sub dword [cyclesRemaining], byte 5 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 5 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + mov dx, [ebp+edx] ; Get our 16 bit address + add dx, cx ; Add in Y + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop31: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead31 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr31 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine31 + +nextAddr31: + add edi, 10h ; Next structure! + jmp short checkLoop31 + +callRoutine31: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit31 + +memoryRead31: + mov dl, [ebp + edx] ; Get our data + +readExit31: + mov dh, ah ; Get the flags + xor al, dl ; XOR In our value + lahf ; Get the flag settings + and ah, 0c0h ; Only sign and zero flag + and dh, 03fh ; Clear sign & zero flags + or ah, dh ; Merge the affected flags together + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; Eor +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst55: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + add dl, bl ; Add X + mov dl, [ebp+edx] ; Get our zero page data + mov dh, ah ; Get the flags + xor al, dl ; XOR In our value + lahf ; Get the flag settings + and ah, 0c0h ; Only sign and zero flag + and dh, 03fh ; Clear sign & zero flags + or ah, dh ; Merge the affected flags together + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; Lsr +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst56: + sub dword [cyclesRemaining], byte 6 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 6 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + add dl, bl ; Add X + push edx ; Save our address away + mov bh, [ebp+edx] ; Get our zero page stuff + sahf ; Restore flags + mov ch, ah ; Store our original flags + shr bh, 1 ; Shift right by 1 + lahf ; Load the flags back in + and ch, 03eh ; No carry, zero, or sign + and ah, 0c1h ; Only carry, zero and sign + or ah, ch ; Or it into our flags + xor ch, ch ; Clear it! + pop edx ; Restore our address + mov [ebp+edx], bh ; Set our zero page byte + xor bh, bh ; Zero the upper part so we don't host X! + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; CLI +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst58: + sub dword [cyclesRemaining], byte 2 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 2 + and [_altFlags], byte 0fbh ; No interrupts! + cmp [_irqPending], byte 0 ; IRQ pending? + je near notEnabledCli + sub esi, ebp ; Get our real program counter + mov [_m6502zppc], si + xor edx, edx + mov dl, ah + mov ah, [bitx86to6502+edx] + or ah, [_altFlags] + mov [_m6502zpaf], ax ; Save this + push eax ; Save this - we need it + call _m6502zpint ; Go do an interrupt + pop eax ; Restore this - we need it! + mov si, [_m6502zppc] ; Get our program counter + and esi, 0ffffh ; Only the lower 16 bits + add esi, ebp ; So it properly points to the code + mov ax, [_m6502zpaf] ; Restore this + xor edx, edx + mov dl, ah + mov [_altFlags], dl + and [_altFlags], byte 3ch; + mov ah, [bit6502tox86+edx] +notEnabledCli: + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; Eor +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst59: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + add dx, cx ; Add Y + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop32: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead32 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr32 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine32 + +nextAddr32: + add edi, 10h ; Next structure! + jmp short checkLoop32 + +callRoutine32: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit32 + +memoryRead32: + mov dl, [ebp + edx] ; Get our data + +readExit32: + mov dh, ah ; Get the flags + xor al, dl ; XOR In our value + lahf ; Get the flag settings + and ah, 0c0h ; Only sign and zero flag + and dh, 03fh ; Clear sign & zero flags + or ah, dh ; Merge the affected flags together + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; Eor +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst5d: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + add dx, bx ; Add X + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop33: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead33 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr33 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine33 + +nextAddr33: + add edi, 10h ; Next structure! + jmp short checkLoop33 + +callRoutine33: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit33 + +memoryRead33: + mov dl, [ebp + edx] ; Get our data + +readExit33: + mov dh, ah ; Get the flags + xor al, dl ; XOR In our value + lahf ; Get the flag settings + and ah, 0c0h ; Only sign and zero flag + and dh, 03fh ; Clear sign & zero flags + or ah, dh ; Merge the affected flags together + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; Lsr +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst5e: + sub dword [cyclesRemaining], byte 7 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 7 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + add dx, bx ; Add X + push edx ; Save our address away + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop34: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead34 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr34 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine34 + +nextAddr34: + add edi, 10h ; Next structure! + jmp short checkLoop34 + +callRoutine34: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov bh, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit34 + +memoryRead34: + mov bh, [ebp + edx] ; Get our data + +readExit34: + sahf ; Restore flags + mov ch, ah ; Store our original flags + shr bh, 1 ; Shift right by 1 + lahf ; Load the flags back in + and ch, 03eh ; No carry, zero, or sign + and ah, 0c1h ; Only carry, zero and sign + or ah, ch ; Or it into our flags + xor ch, ch ; Clear it! + pop edx ; Restore our address + mov edi, [_m6502zpMemWrite] ; Point to the write array + +checkLoop35: + cmp [edi], word 0ffffh ; End of our list? + je near memoryWrite35 ; Yes - go write it! + cmp dx, [edi] ; Are we smaller? + jb nextAddr35 ; Yes... go to the next addr + cmp dx, [edi+4] ; Are we bigger? + jbe callRoutine35 ; If not, go call it! + +nextAddr35: + add edi, 10h ; Next structure, please + jmp short checkLoop35 + +callRoutine35: + mov [_m6502zpx], bl ; Save X + mov [_m6502zpy], cl ; Save Y + mov [_m6502zpaf], ax ; Save Accumulator & flags + sub esi, ebp ; Our program counter + mov [_m6502zppc], si ; Save our program counter + push edi ; Pointer to MemoryWriteByte structure + mov bl, bh ; Put a copy here + push ebx ; The byte value + and edx, 0ffffh ; Only lower 16 bits + push edx ; The address + call dword [edi + 8] ; Go call our handler + add esp, 12 ; Get rid of our stack + xor ebx, ebx ; Zero this + xor ecx, ecx ; This too! + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + xor esi, esi ; Zero it! + mov si, [_m6502zppc] ; Get our program counter back + mov ebp, [_m6502zpBase] ; Base pointer comes back + add esi, ebp ; Rebase it properly + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short writeMacroExit35 + +memoryWrite35: + mov [ebp + edx], bh ; Store the byte + +writeMacroExit35: + xor bh, bh ; Zero the upper part so we don't host X! + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; RTS +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst60: + sub dword [cyclesRemaining], byte 6 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 6 + xor esi, esi ; Zero ESI for later + mov dl, [_m6502zps] ; Get our stack + add [_m6502zps], byte 2 ; Pop off a word + inc dl ; Increment our stack page + inc dh ; Our stack page + mov si, [ebp+edx] ; Get our stack area + inc si ; Increment! + add esi, ebp ; Add in our base address + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; ADC +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst61: + sub dword [cyclesRemaining], byte 6 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 6 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + add dl, bl ; Add in X + mov dx, [ebp+edx] ; Get our 16 bit address + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop37: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead37 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr37 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine37 + +nextAddr37: + add edi, 10h ; Next structure! + jmp short checkLoop37 + +callRoutine37: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit37 + +memoryRead37: + mov dl, [ebp + edx] ; Get our data + +readExit37: + sahf ; Restore our flags for the adc + adc al, dl ; Add in our value + o16 pushf ; Push our flags (and overflow) + and ah, 02eh ; No carry, overflow, zero or sign + pop dx ; Restore our flags into DX + shl dh, 1 ; Shift overflow into position + and dh, 10h ; Only the overflow + and dl, 0c1h ; Only carry, sign, and zero + or ah, dl ; OR In our new flags + or ah, dh ; OR In overflow + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; ADC +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst65: + sub dword [cyclesRemaining], byte 3 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 3 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + mov dl, [ebp+edx] ; Get our zero page data + sahf ; Restore our flags for the adc + adc al, dl ; Add in our value + o16 pushf ; Push our flags (and overflow) + and ah, 02eh ; No carry, overflow, zero or sign + pop dx ; Restore our flags into DX + shl dh, 1 ; Shift overflow into position + and dh, 10h ; Only the overflow + and dl, 0c1h ; Only carry, sign, and zero + or ah, dl ; OR In our new flags + or ah, dh ; OR In overflow + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; ROR +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst66: + sub dword [cyclesRemaining], byte 5 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 5 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + push edx ; Save our address + mov dl, [ebp+edx] ; Get our zero page byte + mov dh, ah ; Save off our original flags + and dh, 3eh ; No carry, zero, or sign + sahf ; Restore flags + rcr dl, 1 ; Through carry rotate + lahf ; Get the current flags back + mov bh, ah ; Store it here for later + and bh, 1 ; Only the carry matters + or dl, dl ; Set sign/zero + lahf ; Get the flags + and ah, 0c0h ; Only sign and zero + or ah, bh ; Or In our carry + or ah, dh ; Or in our original flags + mov bh, dl ; Get our byte to write + pop edx ; Restore the address + mov [ebp+edx], bh ; Set our zero page byte + xor bh, bh ; Zero this so we don't screw up things + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; PLA +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst68: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + inc dh ; Stack page + inc byte [_m6502zps] ; Increment our stack pointer + mov dl, [_m6502zps] ; Stack pointer + mov al, [ebp+edx] + mov dl, ah + and dl, 03fh + or al, al + lahf + and ah, 0c0h + or ah, dl + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; ADC +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst69: + sub dword [cyclesRemaining], byte 2 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 2 + mov dl, [esi] ; Get our next byte + inc esi ; Increment to our next byte + sahf ; Restore our flags for the adc + adc al, dl ; Add in our value + o16 pushf ; Push our flags (and overflow) + and ah, 02eh ; No carry, overflow, zero or sign + pop dx ; Restore our flags into DX + shl dh, 1 ; Shift overflow into position + and dh, 10h ; Only the overflow + and dl, 0c1h ; Only carry, sign, and zero + or ah, dl ; OR In our new flags + or ah, dh ; OR In overflow + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; ROR +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst6a: + sub dword [cyclesRemaining], byte 2 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 2 + mov dh, ah ; Save off our original flags + and dh, 3eh ; No carry, zero, or sign + sahf ; Restore flags + rcr al, 1 ; Through carry rotate + lahf ; Get the current flags back + mov bh, ah ; Store it here for later + and bh, 1 ; Only the carry matters + or al, al ; Set sign/zero + lahf ; Get the flags + and ah, 0c0h ; Only sign and zero + or ah, bh ; Or In our carry + or ah, dh ; Or in our original flags + xor bh, bh ; Zero this so we don't screw up things + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; JMP +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst6c: + sub dword [cyclesRemaining], byte 5 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 5 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + push edx ; Save address + mov [_m6502zpaf], ax ; Store AF + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop38: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead38 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr38 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine38 + +nextAddr38: + add edi, 10h ; Next structure! + jmp short checkLoop38 + +callRoutine38: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov ah, [_m6502zpaf + 1] ; Get our flags back + jmp short readExit38 + +memoryRead38: + mov al, [ebp + edx] ; Get our data + +readExit38: + pop edx ; Restore address + inc dx ; Next address + push eax ; Save it for later + mov ax, [_m6502zpaf] ; Restore AF because it gets used later + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop39: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead39 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr39 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine39 + +nextAddr39: + add edi, 10h ; Next structure! + jmp short checkLoop39 + +callRoutine39: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dh, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit39 + +memoryRead39: + mov dh, [ebp + edx] ; Get our data + +readExit39: + pop eax ; Restore it! + mov dl, al ; Restore our word into DX + mov ax, [_m6502zpaf] ; Restore AF + add edx, ebp ; Add in our base + mov esi, edx ; Put it here for execution + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; ADC +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst6d: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop41: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead41 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr41 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine41 + +nextAddr41: + add edi, 10h ; Next structure! + jmp short checkLoop41 + +callRoutine41: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit41 + +memoryRead41: + mov dl, [ebp + edx] ; Get our data + +readExit41: + sahf ; Restore our flags for the adc + adc al, dl ; Add in our value + o16 pushf ; Push our flags (and overflow) + and ah, 02eh ; No carry, overflow, zero or sign + pop dx ; Restore our flags into DX + shl dh, 1 ; Shift overflow into position + and dh, 10h ; Only the overflow + and dl, 0c1h ; Only carry, sign, and zero + or ah, dl ; OR In our new flags + or ah, dh ; OR In overflow + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; ROR +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst6e: + sub dword [cyclesRemaining], byte 6 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 6 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + push edx ; Save our address + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop42: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead42 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr42 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine42 + +nextAddr42: + add edi, 10h ; Next structure! + jmp short checkLoop42 + +callRoutine42: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit42 + +memoryRead42: + mov dl, [ebp + edx] ; Get our data + +readExit42: + mov dh, ah ; Save off our original flags + and dh, 3eh ; No carry, zero, or sign + sahf ; Restore flags + rcr dl, 1 ; Through carry rotate + lahf ; Get the current flags back + mov bh, ah ; Store it here for later + and bh, 1 ; Only the carry matters + or dl, dl ; Set sign/zero + lahf ; Get the flags + and ah, 0c0h ; Only sign and zero + or ah, bh ; Or In our carry + or ah, dh ; Or in our original flags + mov bh, dl ; Get our byte to write + pop edx ; Restore the address + mov edi, [_m6502zpMemWrite] ; Point to the write array + +checkLoop43: + cmp [edi], word 0ffffh ; End of our list? + je near memoryWrite43 ; Yes - go write it! + cmp dx, [edi] ; Are we smaller? + jb nextAddr43 ; Yes... go to the next addr + cmp dx, [edi+4] ; Are we bigger? + jbe callRoutine43 ; If not, go call it! + +nextAddr43: + add edi, 10h ; Next structure, please + jmp short checkLoop43 + +callRoutine43: + mov [_m6502zpx], bl ; Save X + mov [_m6502zpy], cl ; Save Y + mov [_m6502zpaf], ax ; Save Accumulator & flags + sub esi, ebp ; Our program counter + mov [_m6502zppc], si ; Save our program counter + push edi ; Pointer to MemoryWriteByte structure + mov bl, bh ; Put a copy here + push ebx ; The byte value + and edx, 0ffffh ; Only lower 16 bits + push edx ; The address + call dword [edi + 8] ; Go call our handler + add esp, 12 ; Get rid of our stack + xor ebx, ebx ; Zero this + xor ecx, ecx ; This too! + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + xor esi, esi ; Zero it! + mov si, [_m6502zppc] ; Get our program counter back + mov ebp, [_m6502zpBase] ; Base pointer comes back + add esi, ebp ; Rebase it properly + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short writeMacroExit43 + +memoryWrite43: + mov [ebp + edx], bh ; Store the byte + +writeMacroExit43: + xor bh, bh ; Zero this so we don't screw up things + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; Branch +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst70: + sub dword [cyclesRemaining], byte 3 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 3 + test ah, 10h ; Overflow set? + jnz short takeJump70 ; Do it! + inc esi ; Skip past the offset + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +takeJump70: + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + movsx dx, dl + sub esi, ebp + add si, dx + add esi, ebp + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; ADC +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst71: + sub dword [cyclesRemaining], byte 5 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 5 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + mov dx, [ebp+edx] ; Get our 16 bit address + add dx, cx ; Add in Y + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop45: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead45 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr45 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine45 + +nextAddr45: + add edi, 10h ; Next structure! + jmp short checkLoop45 + +callRoutine45: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit45 + +memoryRead45: + mov dl, [ebp + edx] ; Get our data + +readExit45: + sahf ; Restore our flags for the adc + adc al, dl ; Add in our value + o16 pushf ; Push our flags (and overflow) + and ah, 02eh ; No carry, overflow, zero or sign + pop dx ; Restore our flags into DX + shl dh, 1 ; Shift overflow into position + and dh, 10h ; Only the overflow + and dl, 0c1h ; Only carry, sign, and zero + or ah, dl ; OR In our new flags + or ah, dh ; OR In overflow + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; ADC +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst75: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + add dl, bl ; Add X + mov dl, [ebp+edx] ; Get our zero page data + sahf ; Restore our flags for the adc + adc al, dl ; Add in our value + o16 pushf ; Push our flags (and overflow) + and ah, 02eh ; No carry, overflow, zero or sign + pop dx ; Restore our flags into DX + shl dh, 1 ; Shift overflow into position + and dh, 10h ; Only the overflow + and dl, 0c1h ; Only carry, sign, and zero + or ah, dl ; OR In our new flags + or ah, dh ; OR In overflow + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; ROR +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst76: + sub dword [cyclesRemaining], byte 6 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 6 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + add dl, bl ; Add X + push edx ; Save our address + mov dl, [ebp+edx] ; Get our zero page byte + mov dh, ah ; Save off our original flags + and dh, 3eh ; No carry, zero, or sign + sahf ; Restore flags + rcr dl, 1 ; Through carry rotate + lahf ; Get the current flags back + mov bh, ah ; Store it here for later + and bh, 1 ; Only the carry matters + or dl, dl ; Set sign/zero + lahf ; Get the flags + and ah, 0c0h ; Only sign and zero + or ah, bh ; Or In our carry + or ah, dh ; Or in our original flags + mov bh, dl ; Get our byte to write + pop edx ; Restore the address + mov [ebp+edx], bh ; Set our zero page byte + xor bh, bh ; Zero this so we don't screw up things + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; SEI +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst78: + sub dword [cyclesRemaining], byte 2 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 2 + or [_altFlags], byte 04h ; Interrupts! + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; ADC +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst79: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + add dx, cx ; Add Y + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop46: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead46 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr46 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine46 + +nextAddr46: + add edi, 10h ; Next structure! + jmp short checkLoop46 + +callRoutine46: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit46 + +memoryRead46: + mov dl, [ebp + edx] ; Get our data + +readExit46: + sahf ; Restore our flags for the adc + adc al, dl ; Add in our value + o16 pushf ; Push our flags (and overflow) + and ah, 02eh ; No carry, overflow, zero or sign + pop dx ; Restore our flags into DX + shl dh, 1 ; Shift overflow into position + and dh, 10h ; Only the overflow + and dl, 0c1h ; Only carry, sign, and zero + or ah, dl ; OR In our new flags + or ah, dh ; OR In overflow + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; ADC +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst7d: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + add dx, bx ; Add X + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop47: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead47 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr47 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine47 + +nextAddr47: + add edi, 10h ; Next structure! + jmp short checkLoop47 + +callRoutine47: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit47 + +memoryRead47: + mov dl, [ebp + edx] ; Get our data + +readExit47: + sahf ; Restore our flags for the adc + adc al, dl ; Add in our value + o16 pushf ; Push our flags (and overflow) + and ah, 02eh ; No carry, overflow, zero or sign + pop dx ; Restore our flags into DX + shl dh, 1 ; Shift overflow into position + and dh, 10h ; Only the overflow + and dl, 0c1h ; Only carry, sign, and zero + or ah, dl ; OR In our new flags + or ah, dh ; OR In overflow + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; ROR +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst7e: + sub dword [cyclesRemaining], byte 7 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 7 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + add dx, bx ; Add X + push edx ; Save our address + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop48: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead48 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr48 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine48 + +nextAddr48: + add edi, 10h ; Next structure! + jmp short checkLoop48 + +callRoutine48: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit48 + +memoryRead48: + mov dl, [ebp + edx] ; Get our data + +readExit48: + mov dh, ah ; Save off our original flags + and dh, 3eh ; No carry, zero, or sign + sahf ; Restore flags + rcr dl, 1 ; Through carry rotate + lahf ; Get the current flags back + mov bh, ah ; Store it here for later + and bh, 1 ; Only the carry matters + or dl, dl ; Set sign/zero + lahf ; Get the flags + and ah, 0c0h ; Only sign and zero + or ah, bh ; Or In our carry + or ah, dh ; Or in our original flags + mov bh, dl ; Get our byte to write + pop edx ; Restore the address + mov edi, [_m6502zpMemWrite] ; Point to the write array + +checkLoop49: + cmp [edi], word 0ffffh ; End of our list? + je near memoryWrite49 ; Yes - go write it! + cmp dx, [edi] ; Are we smaller? + jb nextAddr49 ; Yes... go to the next addr + cmp dx, [edi+4] ; Are we bigger? + jbe callRoutine49 ; If not, go call it! + +nextAddr49: + add edi, 10h ; Next structure, please + jmp short checkLoop49 + +callRoutine49: + mov [_m6502zpx], bl ; Save X + mov [_m6502zpy], cl ; Save Y + mov [_m6502zpaf], ax ; Save Accumulator & flags + sub esi, ebp ; Our program counter + mov [_m6502zppc], si ; Save our program counter + push edi ; Pointer to MemoryWriteByte structure + mov bl, bh ; Put a copy here + push ebx ; The byte value + and edx, 0ffffh ; Only lower 16 bits + push edx ; The address + call dword [edi + 8] ; Go call our handler + add esp, 12 ; Get rid of our stack + xor ebx, ebx ; Zero this + xor ecx, ecx ; This too! + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + xor esi, esi ; Zero it! + mov si, [_m6502zppc] ; Get our program counter back + mov ebp, [_m6502zpBase] ; Base pointer comes back + add esi, ebp ; Rebase it properly + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short writeMacroExit49 + +memoryWrite49: + mov [ebp + edx], bh ; Store the byte + +writeMacroExit49: + xor bh, bh ; Zero this so we don't screw up things + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; STA +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst81: + sub dword [cyclesRemaining], byte 6 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 6 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + add dl, bl ; Add in X + mov dx, [ebp+edx] ; Get our 16 bit address + mov edi, [_m6502zpMemWrite] ; Point to the write array + +checkLoop50: + cmp [edi], word 0ffffh ; End of our list? + je near memoryWrite50 ; Yes - go write it! + cmp dx, [edi] ; Are we smaller? + jb nextAddr50 ; Yes... go to the next addr + cmp dx, [edi+4] ; Are we bigger? + jbe callRoutine50 ; If not, go call it! + +nextAddr50: + add edi, 10h ; Next structure, please + jmp short checkLoop50 + +callRoutine50: + mov [_m6502zpx], bl ; Save X + mov [_m6502zpy], cl ; Save Y + mov [_m6502zpaf], ax ; Save Accumulator & flags + sub esi, ebp ; Our program counter + mov [_m6502zppc], si ; Save our program counter + push edi ; Pointer to MemoryWriteByte structure + push eax ; The byte value + and edx, 0ffffh ; Only lower 16 bits + push edx ; The address + call dword [edi + 8] ; Go call our handler + add esp, 12 ; Get rid of our stack + xor ebx, ebx ; Zero this + xor ecx, ecx ; This too! + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + xor esi, esi ; Zero it! + mov si, [_m6502zppc] ; Get our program counter back + mov ebp, [_m6502zpBase] ; Base pointer comes back + add esi, ebp ; Rebase it properly + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short writeMacroExit50 + +memoryWrite50: + mov [ebp + edx], al ; Store the byte + +writeMacroExit50: + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; STY +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst84: + sub dword [cyclesRemaining], byte 3 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 3 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + mov edi, [_m6502zpMemWrite] ; Point to the write array + +checkLoop51: + cmp [edi], word 0ffffh ; End of our list? + je near memoryWrite51 ; Yes - go write it! + cmp dx, [edi] ; Are we smaller? + jb nextAddr51 ; Yes... go to the next addr + cmp dx, [edi+4] ; Are we bigger? + jbe callRoutine51 ; If not, go call it! + +nextAddr51: + add edi, 10h ; Next structure, please + jmp short checkLoop51 + +callRoutine51: + mov [_m6502zpx], bl ; Save X + mov [_m6502zpy], cl ; Save Y + mov [_m6502zpaf], ax ; Save Accumulator & flags + sub esi, ebp ; Our program counter + mov [_m6502zppc], si ; Save our program counter + push edi ; Pointer to MemoryWriteByte structure + push ecx ; The byte value + and edx, 0ffffh ; Only lower 16 bits + push edx ; The address + call dword [edi + 8] ; Go call our handler + add esp, 12 ; Get rid of our stack + xor ebx, ebx ; Zero this + xor ecx, ecx ; This too! + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + xor esi, esi ; Zero it! + mov si, [_m6502zppc] ; Get our program counter back + mov ebp, [_m6502zpBase] ; Base pointer comes back + add esi, ebp ; Rebase it properly + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short writeMacroExit51 + +memoryWrite51: + mov [ebp + edx], cl ; Store the byte + +writeMacroExit51: + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; STA +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst85: + sub dword [cyclesRemaining], byte 3 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 3 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + mov [ebp+edx], al ; Store A + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; STX +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst86: + sub dword [cyclesRemaining], byte 3 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 3 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + mov [ebp+edx], bl ; Store X + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; DEY +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst88: + sub dword [cyclesRemaining], byte 2 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 2 + mov dl, ah ; Save flags + dec cl ; Decrement + lahf ; Restore flags + and dl, 03fh ; Original value + and ah, 0c0h ; Only zero and sign + or ah, dl ; New flags with the old! + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; TXA +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst8a: + sub dword [cyclesRemaining], byte 2 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 2 + mov al, bl ; A = X + mov dl, ah ; Save flags + or al, al ; OR Our new value + lahf ; Restore flags + and dl, 03fh ; Original value + and ah, 0c0h ; Only zero and sign + or ah, dl ; New flags with the old! + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; STY +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst8c: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + mov edi, [_m6502zpMemWrite] ; Point to the write array + +checkLoop52: + cmp [edi], word 0ffffh ; End of our list? + je near memoryWrite52 ; Yes - go write it! + cmp dx, [edi] ; Are we smaller? + jb nextAddr52 ; Yes... go to the next addr + cmp dx, [edi+4] ; Are we bigger? + jbe callRoutine52 ; If not, go call it! + +nextAddr52: + add edi, 10h ; Next structure, please + jmp short checkLoop52 + +callRoutine52: + mov [_m6502zpx], bl ; Save X + mov [_m6502zpy], cl ; Save Y + mov [_m6502zpaf], ax ; Save Accumulator & flags + sub esi, ebp ; Our program counter + mov [_m6502zppc], si ; Save our program counter + push edi ; Pointer to MemoryWriteByte structure + push ecx ; The byte value + and edx, 0ffffh ; Only lower 16 bits + push edx ; The address + call dword [edi + 8] ; Go call our handler + add esp, 12 ; Get rid of our stack + xor ebx, ebx ; Zero this + xor ecx, ecx ; This too! + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + xor esi, esi ; Zero it! + mov si, [_m6502zppc] ; Get our program counter back + mov ebp, [_m6502zpBase] ; Base pointer comes back + add esi, ebp ; Rebase it properly + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short writeMacroExit52 + +memoryWrite52: + mov [ebp + edx], cl ; Store the byte + +writeMacroExit52: + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; STA +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst8d: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + mov edi, [_m6502zpMemWrite] ; Point to the write array + +checkLoop53: + cmp [edi], word 0ffffh ; End of our list? + je near memoryWrite53 ; Yes - go write it! + cmp dx, [edi] ; Are we smaller? + jb nextAddr53 ; Yes... go to the next addr + cmp dx, [edi+4] ; Are we bigger? + jbe callRoutine53 ; If not, go call it! + +nextAddr53: + add edi, 10h ; Next structure, please + jmp short checkLoop53 + +callRoutine53: + mov [_m6502zpx], bl ; Save X + mov [_m6502zpy], cl ; Save Y + mov [_m6502zpaf], ax ; Save Accumulator & flags + sub esi, ebp ; Our program counter + mov [_m6502zppc], si ; Save our program counter + push edi ; Pointer to MemoryWriteByte structure + push eax ; The byte value + and edx, 0ffffh ; Only lower 16 bits + push edx ; The address + call dword [edi + 8] ; Go call our handler + add esp, 12 ; Get rid of our stack + xor ebx, ebx ; Zero this + xor ecx, ecx ; This too! + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + xor esi, esi ; Zero it! + mov si, [_m6502zppc] ; Get our program counter back + mov ebp, [_m6502zpBase] ; Base pointer comes back + add esi, ebp ; Rebase it properly + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short writeMacroExit53 + +memoryWrite53: + mov [ebp + edx], al ; Store the byte + +writeMacroExit53: + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; STX +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst8e: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + mov edi, [_m6502zpMemWrite] ; Point to the write array + +checkLoop54: + cmp [edi], word 0ffffh ; End of our list? + je near memoryWrite54 ; Yes - go write it! + cmp dx, [edi] ; Are we smaller? + jb nextAddr54 ; Yes... go to the next addr + cmp dx, [edi+4] ; Are we bigger? + jbe callRoutine54 ; If not, go call it! + +nextAddr54: + add edi, 10h ; Next structure, please + jmp short checkLoop54 + +callRoutine54: + mov [_m6502zpx], bl ; Save X + mov [_m6502zpy], cl ; Save Y + mov [_m6502zpaf], ax ; Save Accumulator & flags + sub esi, ebp ; Our program counter + mov [_m6502zppc], si ; Save our program counter + push edi ; Pointer to MemoryWriteByte structure + push ebx ; The byte value + and edx, 0ffffh ; Only lower 16 bits + push edx ; The address + call dword [edi + 8] ; Go call our handler + add esp, 12 ; Get rid of our stack + xor ebx, ebx ; Zero this + xor ecx, ecx ; This too! + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + xor esi, esi ; Zero it! + mov si, [_m6502zppc] ; Get our program counter back + mov ebp, [_m6502zpBase] ; Base pointer comes back + add esi, ebp ; Rebase it properly + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short writeMacroExit54 + +memoryWrite54: + mov [ebp + edx], bl ; Store the byte + +writeMacroExit54: + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; Branch +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst90: + sub dword [cyclesRemaining], byte 3 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 3 + test ah, 1h ; Carry not set? + jz short takeJump90 ; Do it! + inc esi ; Skip past the offset + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +takeJump90: + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + movsx dx, dl + sub esi, ebp + add si, dx + add esi, ebp + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; STA +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst91: + sub dword [cyclesRemaining], byte 6 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 6 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + mov dx, [ebp+edx] ; Get our 16 bit address + add dx, cx ; Add in Y + mov edi, [_m6502zpMemWrite] ; Point to the write array + +checkLoop56: + cmp [edi], word 0ffffh ; End of our list? + je near memoryWrite56 ; Yes - go write it! + cmp dx, [edi] ; Are we smaller? + jb nextAddr56 ; Yes... go to the next addr + cmp dx, [edi+4] ; Are we bigger? + jbe callRoutine56 ; If not, go call it! + +nextAddr56: + add edi, 10h ; Next structure, please + jmp short checkLoop56 + +callRoutine56: + mov [_m6502zpx], bl ; Save X + mov [_m6502zpy], cl ; Save Y + mov [_m6502zpaf], ax ; Save Accumulator & flags + sub esi, ebp ; Our program counter + mov [_m6502zppc], si ; Save our program counter + push edi ; Pointer to MemoryWriteByte structure + push eax ; The byte value + and edx, 0ffffh ; Only lower 16 bits + push edx ; The address + call dword [edi + 8] ; Go call our handler + add esp, 12 ; Get rid of our stack + xor ebx, ebx ; Zero this + xor ecx, ecx ; This too! + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + xor esi, esi ; Zero it! + mov si, [_m6502zppc] ; Get our program counter back + mov ebp, [_m6502zpBase] ; Base pointer comes back + add esi, ebp ; Rebase it properly + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short writeMacroExit56 + +memoryWrite56: + mov [ebp + edx], al ; Store the byte + +writeMacroExit56: + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; STY +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst94: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + add dl, bl ; Add X + mov edi, [_m6502zpMemWrite] ; Point to the write array + +checkLoop57: + cmp [edi], word 0ffffh ; End of our list? + je near memoryWrite57 ; Yes - go write it! + cmp dx, [edi] ; Are we smaller? + jb nextAddr57 ; Yes... go to the next addr + cmp dx, [edi+4] ; Are we bigger? + jbe callRoutine57 ; If not, go call it! + +nextAddr57: + add edi, 10h ; Next structure, please + jmp short checkLoop57 + +callRoutine57: + mov [_m6502zpx], bl ; Save X + mov [_m6502zpy], cl ; Save Y + mov [_m6502zpaf], ax ; Save Accumulator & flags + sub esi, ebp ; Our program counter + mov [_m6502zppc], si ; Save our program counter + push edi ; Pointer to MemoryWriteByte structure + push ecx ; The byte value + and edx, 0ffffh ; Only lower 16 bits + push edx ; The address + call dword [edi + 8] ; Go call our handler + add esp, 12 ; Get rid of our stack + xor ebx, ebx ; Zero this + xor ecx, ecx ; This too! + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + xor esi, esi ; Zero it! + mov si, [_m6502zppc] ; Get our program counter back + mov ebp, [_m6502zpBase] ; Base pointer comes back + add esi, ebp ; Rebase it properly + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short writeMacroExit57 + +memoryWrite57: + mov [ebp + edx], cl ; Store the byte + +writeMacroExit57: + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; STA +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst95: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + add dl, bl ; Add X + mov [ebp+edx], al ; Store A + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; STX +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst96: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + add dl, cl ; Add Y + mov [ebp+edx], bl ; Store X + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; TYA +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst98: + sub dword [cyclesRemaining], byte 2 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 2 + mov al, cl ; A = Y + mov dl, ah ; Save flags + or al, al ; OR Our new value + lahf ; Restore flags + and dl, 03fh ; Original value + and ah, 0c0h ; Only zero and sign + or ah, dl ; New flags with the old! + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; STA +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst99: + sub dword [cyclesRemaining], byte 5 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 5 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + add dx, cx ; Add Y + mov edi, [_m6502zpMemWrite] ; Point to the write array + +checkLoop58: + cmp [edi], word 0ffffh ; End of our list? + je near memoryWrite58 ; Yes - go write it! + cmp dx, [edi] ; Are we smaller? + jb nextAddr58 ; Yes... go to the next addr + cmp dx, [edi+4] ; Are we bigger? + jbe callRoutine58 ; If not, go call it! + +nextAddr58: + add edi, 10h ; Next structure, please + jmp short checkLoop58 + +callRoutine58: + mov [_m6502zpx], bl ; Save X + mov [_m6502zpy], cl ; Save Y + mov [_m6502zpaf], ax ; Save Accumulator & flags + sub esi, ebp ; Our program counter + mov [_m6502zppc], si ; Save our program counter + push edi ; Pointer to MemoryWriteByte structure + push eax ; The byte value + and edx, 0ffffh ; Only lower 16 bits + push edx ; The address + call dword [edi + 8] ; Go call our handler + add esp, 12 ; Get rid of our stack + xor ebx, ebx ; Zero this + xor ecx, ecx ; This too! + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + xor esi, esi ; Zero it! + mov si, [_m6502zppc] ; Get our program counter back + mov ebp, [_m6502zpBase] ; Base pointer comes back + add esi, ebp ; Rebase it properly + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short writeMacroExit58 + +memoryWrite58: + mov [ebp + edx], al ; Store the byte + +writeMacroExit58: + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; TXS +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst9a: + sub dword [cyclesRemaining], byte 2 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 2 + mov [_m6502zps], bl ; X -> S + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; STA +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInst9d: + sub dword [cyclesRemaining], byte 5 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 5 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + add dx, bx ; Add X + mov edi, [_m6502zpMemWrite] ; Point to the write array + +checkLoop59: + cmp [edi], word 0ffffh ; End of our list? + je near memoryWrite59 ; Yes - go write it! + cmp dx, [edi] ; Are we smaller? + jb nextAddr59 ; Yes... go to the next addr + cmp dx, [edi+4] ; Are we bigger? + jbe callRoutine59 ; If not, go call it! + +nextAddr59: + add edi, 10h ; Next structure, please + jmp short checkLoop59 + +callRoutine59: + mov [_m6502zpx], bl ; Save X + mov [_m6502zpy], cl ; Save Y + mov [_m6502zpaf], ax ; Save Accumulator & flags + sub esi, ebp ; Our program counter + mov [_m6502zppc], si ; Save our program counter + push edi ; Pointer to MemoryWriteByte structure + push eax ; The byte value + and edx, 0ffffh ; Only lower 16 bits + push edx ; The address + call dword [edi + 8] ; Go call our handler + add esp, 12 ; Get rid of our stack + xor ebx, ebx ; Zero this + xor ecx, ecx ; This too! + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + xor esi, esi ; Zero it! + mov si, [_m6502zppc] ; Get our program counter back + mov ebp, [_m6502zpBase] ; Base pointer comes back + add esi, ebp ; Rebase it properly + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short writeMacroExit59 + +memoryWrite59: + mov [ebp + edx], al ; Store the byte + +writeMacroExit59: + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; LDY +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInsta0: + sub dword [cyclesRemaining], byte 2 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 2 + mov cl, [esi] ; Get our next byte + inc esi ; Increment to our next byte + mov dl, ah ; Save flags + or cl, cl ; OR Our new value + lahf ; Restore flags + and dl, 03fh ; Original value + and ah, 0c0h ; Only zero and sign + or ah, dl ; New flags with the old! + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; LDA +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInsta1: + sub dword [cyclesRemaining], byte 6 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 6 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + add dl, bl ; Add in X + mov dx, [ebp+edx] ; Get our 16 bit address + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop60: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead60 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr60 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine60 + +nextAddr60: + add edi, 10h ; Next structure! + jmp short checkLoop60 + +callRoutine60: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov ah, [_m6502zpaf + 1] ; Get our flags back + jmp short readExit60 + +memoryRead60: + mov al, [ebp + edx] ; Get our data + +readExit60: + mov dl, ah ; Save flags + or al, al ; OR Our new value + lahf ; Restore flags + and dl, 03fh ; Original value + and ah, 0c0h ; Only zero and sign + or ah, dl ; New flags with the old! + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; LDX +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInsta2: + sub dword [cyclesRemaining], byte 2 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 2 + mov bl, [esi] ; Get our next byte + inc esi ; Increment to our next byte + mov dl, ah ; Save flags + or bl, bl ; OR Our new value + lahf ; Restore flags + and dl, 03fh ; Original value + and ah, 0c0h ; Only zero and sign + or ah, dl ; New flags with the old! + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; LDY +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInsta4: + sub dword [cyclesRemaining], byte 3 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 3 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + mov cl, [ebp + edx] ; Zero page! + mov dl, ah ; Save flags + or cl, cl ; OR Our new value + lahf ; Restore flags + and dl, 03fh ; Original value + and ah, 0c0h ; Only zero and sign + or ah, dl ; New flags with the old! + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; LDA +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInsta5: + sub dword [cyclesRemaining], byte 3 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 3 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + mov al, [ebp+edx] ; Get our zero page byte + mov dl, ah ; Save flags + or al, al ; OR Our new value + lahf ; Restore flags + and dl, 03fh ; Original value + and ah, 0c0h ; Only zero and sign + or ah, dl ; New flags with the old! + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; LDX +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInsta6: + sub dword [cyclesRemaining], byte 3 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 3 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + mov bl, [ebp + edx] ; Zero page! + mov dl, ah ; Save flags + or bl, bl ; OR Our new value + lahf ; Restore flags + and dl, 03fh ; Original value + and ah, 0c0h ; Only zero and sign + or ah, dl ; New flags with the old! + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; TAY +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInsta8: + sub dword [cyclesRemaining], byte 2 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 2 + mov cl, al ; Y = A + mov dl, ah ; Save flags + or cl, cl ; OR Our new value + lahf ; Restore flags + and dl, 03fh ; Original value + and ah, 0c0h ; Only zero and sign + or ah, dl ; New flags with the old! + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; LDA +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInsta9: + sub dword [cyclesRemaining], byte 2 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 2 + mov al, [esi] ; Get our next byte + inc esi ; Increment to our next byte + mov dl, ah ; Save flags + or al, al ; OR Our new value + lahf ; Restore flags + and dl, 03fh ; Original value + and ah, 0c0h ; Only zero and sign + or ah, dl ; New flags with the old! + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; TAX +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstaa: + sub dword [cyclesRemaining], byte 2 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 2 + mov bl, al ; X = A + mov dl, ah ; Save flags + or bl, bl ; OR Our new value + lahf ; Restore flags + and dl, 03fh ; Original value + and ah, 0c0h ; Only zero and sign + or ah, dl ; New flags with the old! + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; LDY +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstac: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop61: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead61 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr61 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine61 + +nextAddr61: + add edi, 10h ; Next structure! + jmp short checkLoop61 + +callRoutine61: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit61 + +memoryRead61: + mov cl, [ebp + edx] ; Get our data + +readExit61: + mov dl, ah ; Save flags + or cl, cl ; OR Our new value + lahf ; Restore flags + and dl, 03fh ; Original value + and ah, 0c0h ; Only zero and sign + or ah, dl ; New flags with the old! + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; LDA +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstad: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop62: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead62 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr62 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine62 + +nextAddr62: + add edi, 10h ; Next structure! + jmp short checkLoop62 + +callRoutine62: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov ah, [_m6502zpaf + 1] ; Get our flags back + jmp short readExit62 + +memoryRead62: + mov al, [ebp + edx] ; Get our data + +readExit62: + mov dl, ah ; Save flags + or al, al ; OR Our new value + lahf ; Restore flags + and dl, 03fh ; Original value + and ah, 0c0h ; Only zero and sign + or ah, dl ; New flags with the old! + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; LDX +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstae: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop63: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead63 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr63 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine63 + +nextAddr63: + add edi, 10h ; Next structure! + jmp short checkLoop63 + +callRoutine63: + call ReadMemoryByte ; Standard read routine + mov cl, [_m6502zpy] ; Get Y back + mov bl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit63 + +memoryRead63: + mov bl, [ebp + edx] ; Get our data + +readExit63: + mov dl, ah ; Save flags + or bl, bl ; OR Our new value + lahf ; Restore flags + and dl, 03fh ; Original value + and ah, 0c0h ; Only zero and sign + or ah, dl ; New flags with the old! + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; Branch +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstb0: + sub dword [cyclesRemaining], byte 3 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 3 + test ah, 1h ; Is carry set? + jnz short takeJumpb0 ; Do it! + inc esi ; Skip past the offset + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +takeJumpb0: + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + movsx dx, dl + sub esi, ebp + add si, dx + add esi, ebp + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; LDA +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstb1: + sub dword [cyclesRemaining], byte 5 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 5 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + mov dx, [ebp+edx] ; Get our 16 bit address + add dx, cx ; Add in Y + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop65: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead65 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr65 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine65 + +nextAddr65: + add edi, 10h ; Next structure! + jmp short checkLoop65 + +callRoutine65: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov ah, [_m6502zpaf + 1] ; Get our flags back + jmp short readExit65 + +memoryRead65: + mov al, [ebp + edx] ; Get our data + +readExit65: + mov dl, ah ; Save flags + or al, al ; OR Our new value + lahf ; Restore flags + and dl, 03fh ; Original value + and ah, 0c0h ; Only zero and sign + or ah, dl ; New flags with the old! + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; LDY +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstb4: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + add dl, bl ; Add X + mov cl, [ebp + edx] ; Zero page! + mov dl, ah ; Save flags + or cl, cl ; OR Our new value + lahf ; Restore flags + and dl, 03fh ; Original value + and ah, 0c0h ; Only zero and sign + or ah, dl ; New flags with the old! + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; LDA +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstb5: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + add dl, bl ; Add X + mov al, [ebp+edx] ; Get our zero page byte + mov dl, ah ; Save flags + or al, al ; OR Our new value + lahf ; Restore flags + and dl, 03fh ; Original value + and ah, 0c0h ; Only zero and sign + or ah, dl ; New flags with the old! + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; LDX +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstb6: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + add dl, cl ; Add Y + mov bl, [ebp + edx] ; Zero page! + mov dl, ah ; Save flags + or bl, bl ; OR Our new value + lahf ; Restore flags + and dl, 03fh ; Original value + and ah, 0c0h ; Only zero and sign + or ah, dl ; New flags with the old! + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; CLV +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstb8: + sub dword [cyclesRemaining], byte 2 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 2 + and ah, 0efh ; Clear out overflow + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; LDA +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstb9: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + add dx, cx ; Add Y + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop66: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead66 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr66 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine66 + +nextAddr66: + add edi, 10h ; Next structure! + jmp short checkLoop66 + +callRoutine66: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov ah, [_m6502zpaf + 1] ; Get our flags back + jmp short readExit66 + +memoryRead66: + mov al, [ebp + edx] ; Get our data + +readExit66: + mov dl, ah ; Save flags + or al, al ; OR Our new value + lahf ; Restore flags + and dl, 03fh ; Original value + and ah, 0c0h ; Only zero and sign + or ah, dl ; New flags with the old! + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; TSX +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstba: + sub dword [cyclesRemaining], byte 2 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 2 + mov bl, [_m6502zps] ; S -> X + mov dl, ah ; Save flags + or bl, bl ; OR Our new value + lahf ; Restore flags + and dl, 03fh ; Original value + and ah, 0c0h ; Only zero and sign + or ah, dl ; New flags with the old! + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; LDY +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstbc: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + add dx, bx ; Add X + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop67: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead67 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr67 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine67 + +nextAddr67: + add edi, 10h ; Next structure! + jmp short checkLoop67 + +callRoutine67: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit67 + +memoryRead67: + mov cl, [ebp + edx] ; Get our data + +readExit67: + mov dl, ah ; Save flags + or cl, cl ; OR Our new value + lahf ; Restore flags + and dl, 03fh ; Original value + and ah, 0c0h ; Only zero and sign + or ah, dl ; New flags with the old! + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; LDA +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstbd: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + add dx, bx ; Add X + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop68: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead68 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr68 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine68 + +nextAddr68: + add edi, 10h ; Next structure! + jmp short checkLoop68 + +callRoutine68: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov ah, [_m6502zpaf + 1] ; Get our flags back + jmp short readExit68 + +memoryRead68: + mov al, [ebp + edx] ; Get our data + +readExit68: + mov dl, ah ; Save flags + or al, al ; OR Our new value + lahf ; Restore flags + and dl, 03fh ; Original value + and ah, 0c0h ; Only zero and sign + or ah, dl ; New flags with the old! + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; LDX +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstbe: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + add dx, cx ; Add Y + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop69: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead69 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr69 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine69 + +nextAddr69: + add edi, 10h ; Next structure! + jmp short checkLoop69 + +callRoutine69: + call ReadMemoryByte ; Standard read routine + mov cl, [_m6502zpy] ; Get Y back + mov bl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit69 + +memoryRead69: + mov bl, [ebp + edx] ; Get our data + +readExit69: + mov dl, ah ; Save flags + or bl, bl ; OR Our new value + lahf ; Restore flags + and dl, 03fh ; Original value + and ah, 0c0h ; Only zero and sign + or ah, dl ; New flags with the old! + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; CPY +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstc0: + sub dword [cyclesRemaining], byte 2 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 2 + mov dl, [esi] ; Get our next byte + inc esi ; Increment to our next byte + mov dh, ah ; Get our flags + cmp cl, dl ; Compare with Y! + cmc ; Compliment carry flag + lahf + and ah, 0c1h ; Sign, zero, and carry + and dh, 03eh ; Everything but sign, zero and carry + or ah, dh ; OR In our new flags + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; CMP +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstc1: + sub dword [cyclesRemaining], byte 6 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 6 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + add dl, bl ; Add in X + mov dx, [ebp+edx] ; Get our 16 bit address + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop70: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead70 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr70 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine70 + +nextAddr70: + add edi, 10h ; Next structure! + jmp short checkLoop70 + +callRoutine70: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit70 + +memoryRead70: + mov dl, [ebp + edx] ; Get our data + +readExit70: + mov dh, ah ; Get our flags + cmp al, dl ; Compare! + cmc ; Compliment carry flag + lahf + and ah, 0c1h ; Sign, zero, and carry + and dh, 03eh ; Everything but sign, zero and carry + or ah, dh ; OR In our new flags + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; CPY +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstc4: + sub dword [cyclesRemaining], byte 3 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 3 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + mov dl, [ebp+edx] ; Get our zero page data + mov dh, ah ; Get our flags + cmp cl, dl ; Compare with Y! + cmc ; Compliment carry flag + lahf + and ah, 0c1h ; Sign, zero, and carry + and dh, 03eh ; Everything but sign, zero and carry + or ah, dh ; OR In our new flags + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; CMP +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstc5: + sub dword [cyclesRemaining], byte 3 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 3 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + mov dl, [ebp+edx] ; Get our zero page data + mov dh, ah ; Get our flags + cmp al, dl ; Compare! + cmc ; Compliment carry flag + lahf + and ah, 0c1h ; Sign, zero, and carry + and dh, 03eh ; Everything but sign, zero and carry + or ah, dh ; OR In our new flags + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; DEC +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstc6: + sub dword [cyclesRemaining], byte 5 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 5 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + mov ch, ah ; Save flags + and ch, 03fh ; No sign or zero flags + dec byte [edx+ebp] ; Increment our zero page stuff + lahf + and ah, 0c0h ; Only sign & zero flags + or ah, ch ; Merge the two flags together + xor bh, bh ; Zero this so we don't totally screw things up + xor ch, ch ; Zero this as well + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; INY +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstc8: + sub dword [cyclesRemaining], byte 2 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 2 + mov dl, ah ; Save flags + inc cl ; Increment + lahf ; Restore flags + and dl, 03fh ; Original value + and ah, 0c0h ; Only zero and sign + or ah, dl ; New flags with the old! + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; CMP +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstc9: + sub dword [cyclesRemaining], byte 2 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 2 + mov dl, [esi] ; Get our next byte + inc esi ; Increment to our next byte + mov dh, ah ; Get our flags + cmp al, dl ; Compare! + cmc ; Compliment carry flag + lahf + and ah, 0c1h ; Sign, zero, and carry + and dh, 03eh ; Everything but sign, zero and carry + or ah, dh ; OR In our new flags + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; DEX +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstca: + sub dword [cyclesRemaining], byte 2 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 2 + mov dl, ah ; Save flags + dec bl ; Decrement + lahf ; Restore flags + and dl, 03fh ; Original value + and ah, 0c0h ; Only zero and sign + or ah, dl ; New flags with the old! + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; CPY +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstcc: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop71: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead71 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr71 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine71 + +nextAddr71: + add edi, 10h ; Next structure! + jmp short checkLoop71 + +callRoutine71: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit71 + +memoryRead71: + mov dl, [ebp + edx] ; Get our data + +readExit71: + mov dh, ah ; Get our flags + cmp cl, dl ; Compare with Y! + cmc ; Compliment carry flag + lahf + and ah, 0c1h ; Sign, zero, and carry + and dh, 03eh ; Everything but sign, zero and carry + or ah, dh ; OR In our new flags + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; CMP +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstcd: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop72: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead72 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr72 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine72 + +nextAddr72: + add edi, 10h ; Next structure! + jmp short checkLoop72 + +callRoutine72: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit72 + +memoryRead72: + mov dl, [ebp + edx] ; Get our data + +readExit72: + mov dh, ah ; Get our flags + cmp al, dl ; Compare! + cmc ; Compliment carry flag + lahf + and ah, 0c1h ; Sign, zero, and carry + and dh, 03eh ; Everything but sign, zero and carry + or ah, dh ; OR In our new flags + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; DEC +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstce: + sub dword [cyclesRemaining], byte 6 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 6 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + push edx ; Save this for later + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop73: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead73 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr73 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine73 + +nextAddr73: + add edi, 10h ; Next structure! + jmp short checkLoop73 + +callRoutine73: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit73 + +memoryRead73: + mov dl, [ebp + edx] ; Get our data + +readExit73: + mov bh, dl ; Save the data we just got + mov ch, ah ; Save flags + and ch, 03fh ; No sign or zero flags + dec bh ; Decrement! + lahf + and ah, 0c0h ; Only sign & zero flags + or ah, ch ; Merge the two flags together + pop edx ; Restore our address + mov edi, [_m6502zpMemWrite] ; Point to the write array + +checkLoop74: + cmp [edi], word 0ffffh ; End of our list? + je near memoryWrite74 ; Yes - go write it! + cmp dx, [edi] ; Are we smaller? + jb nextAddr74 ; Yes... go to the next addr + cmp dx, [edi+4] ; Are we bigger? + jbe callRoutine74 ; If not, go call it! + +nextAddr74: + add edi, 10h ; Next structure, please + jmp short checkLoop74 + +callRoutine74: + mov [_m6502zpx], bl ; Save X + mov [_m6502zpy], cl ; Save Y + mov [_m6502zpaf], ax ; Save Accumulator & flags + sub esi, ebp ; Our program counter + mov [_m6502zppc], si ; Save our program counter + push edi ; Pointer to MemoryWriteByte structure + mov bl, bh ; Put a copy here + push ebx ; The byte value + and edx, 0ffffh ; Only lower 16 bits + push edx ; The address + call dword [edi + 8] ; Go call our handler + add esp, 12 ; Get rid of our stack + xor ebx, ebx ; Zero this + xor ecx, ecx ; This too! + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + xor esi, esi ; Zero it! + mov si, [_m6502zppc] ; Get our program counter back + mov ebp, [_m6502zpBase] ; Base pointer comes back + add esi, ebp ; Rebase it properly + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short writeMacroExit74 + +memoryWrite74: + mov [ebp + edx], bh ; Store the byte + +writeMacroExit74: + xor bh, bh ; Zero this so we don't totally screw things up + xor ch, ch ; Zero this as well + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; Branch +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstd0: + sub dword [cyclesRemaining], byte 3 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 3 + test ah, 40h ; Are we non-zero? + jz short takeJumpd0 ; Do it! + inc esi ; Skip past the offset + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +takeJumpd0: + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + movsx dx, dl + sub esi, ebp + add si, dx + add esi, ebp + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; CMP +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstd1: + sub dword [cyclesRemaining], byte 5 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 5 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + mov dx, [ebp+edx] ; Get our 16 bit address + add dx, cx ; Add in Y + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop76: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead76 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr76 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine76 + +nextAddr76: + add edi, 10h ; Next structure! + jmp short checkLoop76 + +callRoutine76: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit76 + +memoryRead76: + mov dl, [ebp + edx] ; Get our data + +readExit76: + mov dh, ah ; Get our flags + cmp al, dl ; Compare! + cmc ; Compliment carry flag + lahf + and ah, 0c1h ; Sign, zero, and carry + and dh, 03eh ; Everything but sign, zero and carry + or ah, dh ; OR In our new flags + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; CMP +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstd5: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + add dl, bl ; Add X + mov dl, [ebp+edx] ; Get our zero page data + mov dh, ah ; Get our flags + cmp al, dl ; Compare! + cmc ; Compliment carry flag + lahf + and ah, 0c1h ; Sign, zero, and carry + and dh, 03eh ; Everything but sign, zero and carry + or ah, dh ; OR In our new flags + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; DEC +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstd6: + sub dword [cyclesRemaining], byte 6 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 6 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + add dl, bl ; Add X + mov ch, ah ; Save flags + and ch, 03fh ; No sign or zero flags + dec byte [edx+ebp] ; Increment our zero page stuff + lahf + and ah, 0c0h ; Only sign & zero flags + or ah, ch ; Merge the two flags together + xor bh, bh ; Zero this so we don't totally screw things up + xor ch, ch ; Zero this as well + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; CLD +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstd8: + sub dword [cyclesRemaining], byte 2 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 2 + and [_altFlags], byte 0f7h ; Binary mode + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; CMP +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstd9: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + add dx, cx ; Add Y + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop77: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead77 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr77 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine77 + +nextAddr77: + add edi, 10h ; Next structure! + jmp short checkLoop77 + +callRoutine77: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit77 + +memoryRead77: + mov dl, [ebp + edx] ; Get our data + +readExit77: + mov dh, ah ; Get our flags + cmp al, dl ; Compare! + cmc ; Compliment carry flag + lahf + and ah, 0c1h ; Sign, zero, and carry + and dh, 03eh ; Everything but sign, zero and carry + or ah, dh ; OR In our new flags + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; CMP +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstdd: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + add dx, bx ; Add X + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop78: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead78 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr78 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine78 + +nextAddr78: + add edi, 10h ; Next structure! + jmp short checkLoop78 + +callRoutine78: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit78 + +memoryRead78: + mov dl, [ebp + edx] ; Get our data + +readExit78: + mov dh, ah ; Get our flags + cmp al, dl ; Compare! + cmc ; Compliment carry flag + lahf + and ah, 0c1h ; Sign, zero, and carry + and dh, 03eh ; Everything but sign, zero and carry + or ah, dh ; OR In our new flags + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; DEC +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstde: + sub dword [cyclesRemaining], byte 7 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 7 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + add dx, bx ; Add X + push edx ; Save this for later + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop79: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead79 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr79 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine79 + +nextAddr79: + add edi, 10h ; Next structure! + jmp short checkLoop79 + +callRoutine79: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit79 + +memoryRead79: + mov dl, [ebp + edx] ; Get our data + +readExit79: + mov bh, dl ; Save the data we just got + mov ch, ah ; Save flags + and ch, 03fh ; No sign or zero flags + dec bh ; Decrement! + lahf + and ah, 0c0h ; Only sign & zero flags + or ah, ch ; Merge the two flags together + pop edx ; Restore our address + mov edi, [_m6502zpMemWrite] ; Point to the write array + +checkLoop80: + cmp [edi], word 0ffffh ; End of our list? + je near memoryWrite80 ; Yes - go write it! + cmp dx, [edi] ; Are we smaller? + jb nextAddr80 ; Yes... go to the next addr + cmp dx, [edi+4] ; Are we bigger? + jbe callRoutine80 ; If not, go call it! + +nextAddr80: + add edi, 10h ; Next structure, please + jmp short checkLoop80 + +callRoutine80: + mov [_m6502zpx], bl ; Save X + mov [_m6502zpy], cl ; Save Y + mov [_m6502zpaf], ax ; Save Accumulator & flags + sub esi, ebp ; Our program counter + mov [_m6502zppc], si ; Save our program counter + push edi ; Pointer to MemoryWriteByte structure + mov bl, bh ; Put a copy here + push ebx ; The byte value + and edx, 0ffffh ; Only lower 16 bits + push edx ; The address + call dword [edi + 8] ; Go call our handler + add esp, 12 ; Get rid of our stack + xor ebx, ebx ; Zero this + xor ecx, ecx ; This too! + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + xor esi, esi ; Zero it! + mov si, [_m6502zppc] ; Get our program counter back + mov ebp, [_m6502zpBase] ; Base pointer comes back + add esi, ebp ; Rebase it properly + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short writeMacroExit80 + +memoryWrite80: + mov [ebp + edx], bh ; Store the byte + +writeMacroExit80: + xor bh, bh ; Zero this so we don't totally screw things up + xor ch, ch ; Zero this as well + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; CPX +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInste0: + sub dword [cyclesRemaining], byte 2 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 2 + mov dl, [esi] ; Get our next byte + inc esi ; Increment to our next byte + mov dh, ah ; Get our flags + cmp bl, dl ; Compare with X! + cmc ; Compliment carry flag + lahf + and ah, 0c1h ; Sign, zero, and carry + and dh, 03eh ; Everything but sign, zero and carry + or ah, dh ; OR In our new flags + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; SBC +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInste1: + sub dword [cyclesRemaining], byte 6 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 6 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + add dl, bl ; Add in X + mov dx, [ebp+edx] ; Get our 16 bit address + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop81: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead81 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr81 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine81 + +nextAddr81: + add edi, 10h ; Next structure! + jmp short checkLoop81 + +callRoutine81: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit81 + +memoryRead81: + mov dl, [ebp + edx] ; Get our data + +readExit81: + sahf ; Restore our flags for the adc + cmc + sbb al, dl ; Subtract our value + cmc + o16 pushf ; Push our flags (and overflow) + and ah, 02eh ; No carry, overflow, zero or sign + pop dx ; Restore our flags into DX + shl dh, 1 ; Shift overflow into position + and dh, 10h ; Only the overflow + and dl, 0c1h ; Only carry, sign, and zero + or ah, dl ; OR In our new flags + or ah, dh ; OR In overflow + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; CPX +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInste4: + sub dword [cyclesRemaining], byte 3 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 3 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + mov dl, [ebp+edx] ; Get our zero page data + mov dh, ah ; Get our flags + cmp bl, dl ; Compare with X! + cmc ; Compliment carry flag + lahf + and ah, 0c1h ; Sign, zero, and carry + and dh, 03eh ; Everything but sign, zero and carry + or ah, dh ; OR In our new flags + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; SBC +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInste5: + sub dword [cyclesRemaining], byte 3 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 3 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + mov dl, [ebp+edx] ; Get our zero page data + sahf ; Restore our flags for the adc + cmc + sbb al, dl ; Subtract our value + cmc + o16 pushf ; Push our flags (and overflow) + and ah, 02eh ; No carry, overflow, zero or sign + pop dx ; Restore our flags into DX + shl dh, 1 ; Shift overflow into position + and dh, 10h ; Only the overflow + and dl, 0c1h ; Only carry, sign, and zero + or ah, dl ; OR In our new flags + or ah, dh ; OR In overflow + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; INC +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInste6: + sub dword [cyclesRemaining], byte 5 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 5 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + mov ch, ah ; Save flags + and ch, 03fh ; No sign or zero flags + inc byte [edx+ebp] ; Increment our zero page stuff + lahf + and ah, 0c0h ; Only sign & zero flags + or ah, ch ; Merge the two flags together + xor bh, bh ; Zero this so we don't totally screw things up + xor ch, ch ; Zero this as well + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; INX +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInste8: + sub dword [cyclesRemaining], byte 2 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 2 + mov dl, ah ; Save flags + inc bl ; Increment + lahf ; Restore flags + and dl, 03fh ; Original value + and ah, 0c0h ; Only zero and sign + or ah, dl ; New flags with the old! + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; SBC +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInste9: + sub dword [cyclesRemaining], byte 2 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 2 + mov dl, [esi] ; Get our next byte + inc esi ; Increment to our next byte + sahf ; Restore our flags for the adc + cmc + sbb al, dl ; Subtract our value + cmc + o16 pushf ; Push our flags (and overflow) + and ah, 02eh ; No carry, overflow, zero or sign + pop dx ; Restore our flags into DX + shl dh, 1 ; Shift overflow into position + and dh, 10h ; Only the overflow + and dl, 0c1h ; Only carry, sign, and zero + or ah, dl ; OR In our new flags + or ah, dh ; OR In overflow + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; NOP +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstea: + sub dword [cyclesRemaining], byte 2 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 2 + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; CPX +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstec: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop82: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead82 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr82 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine82 + +nextAddr82: + add edi, 10h ; Next structure! + jmp short checkLoop82 + +callRoutine82: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit82 + +memoryRead82: + mov dl, [ebp + edx] ; Get our data + +readExit82: + mov dh, ah ; Get our flags + cmp bl, dl ; Compare with X! + cmc ; Compliment carry flag + lahf + and ah, 0c1h ; Sign, zero, and carry + and dh, 03eh ; Everything but sign, zero and carry + or ah, dh ; OR In our new flags + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; SBC +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInsted: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop83: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead83 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr83 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine83 + +nextAddr83: + add edi, 10h ; Next structure! + jmp short checkLoop83 + +callRoutine83: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit83 + +memoryRead83: + mov dl, [ebp + edx] ; Get our data + +readExit83: + sahf ; Restore our flags for the adc + cmc + sbb al, dl ; Subtract our value + cmc + o16 pushf ; Push our flags (and overflow) + and ah, 02eh ; No carry, overflow, zero or sign + pop dx ; Restore our flags into DX + shl dh, 1 ; Shift overflow into position + and dh, 10h ; Only the overflow + and dl, 0c1h ; Only carry, sign, and zero + or ah, dl ; OR In our new flags + or ah, dh ; OR In overflow + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; INC +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstee: + sub dword [cyclesRemaining], byte 6 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 6 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + push edx ; Save this for later + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop84: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead84 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr84 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine84 + +nextAddr84: + add edi, 10h ; Next structure! + jmp short checkLoop84 + +callRoutine84: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit84 + +memoryRead84: + mov dl, [ebp + edx] ; Get our data + +readExit84: + mov bh, dl ; Save the data we just got + mov ch, ah ; Save flags + and ch, 03fh ; No sign or zero flags + inc bh ; Increment! + lahf + and ah, 0c0h ; Only sign & zero flags + or ah, ch ; Merge the two flags together + pop edx ; Restore our address + mov edi, [_m6502zpMemWrite] ; Point to the write array + +checkLoop85: + cmp [edi], word 0ffffh ; End of our list? + je near memoryWrite85 ; Yes - go write it! + cmp dx, [edi] ; Are we smaller? + jb nextAddr85 ; Yes... go to the next addr + cmp dx, [edi+4] ; Are we bigger? + jbe callRoutine85 ; If not, go call it! + +nextAddr85: + add edi, 10h ; Next structure, please + jmp short checkLoop85 + +callRoutine85: + mov [_m6502zpx], bl ; Save X + mov [_m6502zpy], cl ; Save Y + mov [_m6502zpaf], ax ; Save Accumulator & flags + sub esi, ebp ; Our program counter + mov [_m6502zppc], si ; Save our program counter + push edi ; Pointer to MemoryWriteByte structure + mov bl, bh ; Put a copy here + push ebx ; The byte value + and edx, 0ffffh ; Only lower 16 bits + push edx ; The address + call dword [edi + 8] ; Go call our handler + add esp, 12 ; Get rid of our stack + xor ebx, ebx ; Zero this + xor ecx, ecx ; This too! + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + xor esi, esi ; Zero it! + mov si, [_m6502zppc] ; Get our program counter back + mov ebp, [_m6502zpBase] ; Base pointer comes back + add esi, ebp ; Rebase it properly + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short writeMacroExit85 + +memoryWrite85: + mov [ebp + edx], bh ; Store the byte + +writeMacroExit85: + xor bh, bh ; Zero this so we don't totally screw things up + xor ch, ch ; Zero this as well + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; Branch +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstf0: + sub dword [cyclesRemaining], byte 3 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 3 + test ah, 40h ; Non-zero set? + jnz short takeJumpf0 ; Do it! + inc esi ; Skip past the offset + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +takeJumpf0: + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + movsx dx, dl + sub esi, ebp + add si, dx + add esi, ebp + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; SBC +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstf1: + sub dword [cyclesRemaining], byte 5 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 5 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + mov dx, [ebp+edx] ; Get our 16 bit address + add dx, cx ; Add in Y + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop87: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead87 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr87 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine87 + +nextAddr87: + add edi, 10h ; Next structure! + jmp short checkLoop87 + +callRoutine87: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit87 + +memoryRead87: + mov dl, [ebp + edx] ; Get our data + +readExit87: + sahf ; Restore our flags for the adc + cmc + sbb al, dl ; Subtract our value + cmc + o16 pushf ; Push our flags (and overflow) + and ah, 02eh ; No carry, overflow, zero or sign + pop dx ; Restore our flags into DX + shl dh, 1 ; Shift overflow into position + and dh, 10h ; Only the overflow + and dl, 0c1h ; Only carry, sign, and zero + or ah, dl ; OR In our new flags + or ah, dh ; OR In overflow + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; SBC +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstf5: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + add dl, bl ; Add X + mov dl, [ebp+edx] ; Get our zero page data + sahf ; Restore our flags for the adc + cmc + sbb al, dl ; Subtract our value + cmc + o16 pushf ; Push our flags (and overflow) + and ah, 02eh ; No carry, overflow, zero or sign + pop dx ; Restore our flags into DX + shl dh, 1 ; Shift overflow into position + and dh, 10h ; Only the overflow + and dl, 0c1h ; Only carry, sign, and zero + or ah, dl ; OR In our new flags + or ah, dh ; OR In overflow + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; INC +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstf6: + sub dword [cyclesRemaining], byte 6 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 6 + mov dl, [esi] ; Get the next instruction + inc esi ; Advance PC! + add dl, bl ; Add X + mov ch, ah ; Save flags + and ch, 03fh ; No sign or zero flags + inc byte [edx+ebp] ; Increment our zero page stuff + lahf + and ah, 0c0h ; Only sign & zero flags + or ah, ch ; Merge the two flags together + xor bh, bh ; Zero this so we don't totally screw things up + xor ch, ch ; Zero this as well + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; SED +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstf8: + sub dword [cyclesRemaining], byte 2 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 2 + or [_altFlags], byte 08h ; Decimal mode + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; SBC +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstf9: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + add dx, cx ; Add Y + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop88: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead88 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr88 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine88 + +nextAddr88: + add edi, 10h ; Next structure! + jmp short checkLoop88 + +callRoutine88: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit88 + +memoryRead88: + mov dl, [ebp + edx] ; Get our data + +readExit88: + sahf ; Restore our flags for the adc + cmc + sbb al, dl ; Subtract our value + cmc + o16 pushf ; Push our flags (and overflow) + and ah, 02eh ; No carry, overflow, zero or sign + pop dx ; Restore our flags into DX + shl dh, 1 ; Shift overflow into position + and dh, 10h ; Only the overflow + and dl, 0c1h ; Only carry, sign, and zero + or ah, dl ; OR In our new flags + or ah, dh ; OR In overflow + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; SBC +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstfd: + sub dword [cyclesRemaining], byte 4 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 4 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + add dx, bx ; Add X + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop89: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead89 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr89 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine89 + +nextAddr89: + add edi, 10h ; Next structure! + jmp short checkLoop89 + +callRoutine89: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit89 + +memoryRead89: + mov dl, [ebp + edx] ; Get our data + +readExit89: + sahf ; Restore our flags for the adc + cmc + sbb al, dl ; Subtract our value + cmc + o16 pushf ; Push our flags (and overflow) + and ah, 02eh ; No carry, overflow, zero or sign + pop dx ; Restore our flags into DX + shl dh, 1 ; Shift overflow into position + and dh, 10h ; Only the overflow + and dl, 0c1h ; Only carry, sign, and zero + or ah, dl ; OR In our new flags + or ah, dh ; OR In overflow + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +; +; INC +; + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +RegInstfe: + sub dword [cyclesRemaining], byte 7 + jc near noMoreExec ; Can't execute anymore! + add dword [dwElapsedTicks], byte 7 + mov dx, [esi] ; Get our address + add esi, 2 ; Increment past instruction + add dx, bx ; Add X + push edx ; Save this for later + mov edi, [_m6502zpMemRead] ; Point to the read array + +checkLoop90: + cmp [edi], word 0ffffh ; End of the list? + je short memoryRead90 + cmp dx, [edi] ; Are we smaller? + jb short nextAddr90 ; Yes, go to the next address + cmp dx, [edi+4] ; Are we bigger? + jbe short callRoutine90 + +nextAddr90: + add edi, 10h ; Next structure! + jmp short checkLoop90 + +callRoutine90: + call ReadMemoryByte ; Standard read routine + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + mov dl, al ; Get our value + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short readExit90 + +memoryRead90: + mov dl, [ebp + edx] ; Get our data + +readExit90: + mov bh, dl ; Save the data we just got + mov ch, ah ; Save flags + and ch, 03fh ; No sign or zero flags + inc bh ; Increment! + lahf + and ah, 0c0h ; Only sign & zero flags + or ah, ch ; Merge the two flags together + pop edx ; Restore our address + mov edi, [_m6502zpMemWrite] ; Point to the write array + +checkLoop91: + cmp [edi], word 0ffffh ; End of our list? + je near memoryWrite91 ; Yes - go write it! + cmp dx, [edi] ; Are we smaller? + jb nextAddr91 ; Yes... go to the next addr + cmp dx, [edi+4] ; Are we bigger? + jbe callRoutine91 ; If not, go call it! + +nextAddr91: + add edi, 10h ; Next structure, please + jmp short checkLoop91 + +callRoutine91: + mov [_m6502zpx], bl ; Save X + mov [_m6502zpy], cl ; Save Y + mov [_m6502zpaf], ax ; Save Accumulator & flags + sub esi, ebp ; Our program counter + mov [_m6502zppc], si ; Save our program counter + push edi ; Pointer to MemoryWriteByte structure + mov bl, bh ; Put a copy here + push ebx ; The byte value + and edx, 0ffffh ; Only lower 16 bits + push edx ; The address + call dword [edi + 8] ; Go call our handler + add esp, 12 ; Get rid of our stack + xor ebx, ebx ; Zero this + xor ecx, ecx ; This too! + mov bl, [_m6502zpx] ; Get X back + mov cl, [_m6502zpy] ; Get Y back + xor esi, esi ; Zero it! + mov si, [_m6502zppc] ; Get our program counter back + mov ebp, [_m6502zpBase] ; Base pointer comes back + add esi, ebp ; Rebase it properly + mov ax, [_m6502zpaf] ; Get our flags & stuff back + jmp short writeMacroExit91 + +memoryWrite91: + mov [ebp + edx], bh ; Store the byte + +writeMacroExit91: + xor bh, bh ; Zero this so we don't totally screw things up + xor ch, ch ; Zero this as well + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + + global _m6502zpGetContext + global m6502zpGetContext_ + global m6502zpGetContext + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +m6502zpGetContext_: +_m6502zpGetContext: + mov eax, [esp+4] ; Get our context address + push esi ; Save registers we use + push edi + push ecx + mov ecx, _m6502zpcontextEnd - _m6502zpcontextBegin + mov esi, _m6502zpcontextBegin + mov edi, eax ; Source address in ESI + rep movsb ; Move it as fast as we can! + pop ecx + pop edi + pop esi + ret ; No return code + global _m6502zpSetContext + global m6502zpSetContext_ + global m6502zpSetContext + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +m6502zpSetContext_: +_m6502zpSetContext: + mov eax, [esp+4] ; Get our context address + push esi ; Save registers we use + push edi + push ecx + mov ecx, _m6502zpcontextEnd - _m6502zpcontextBegin + mov edi, _m6502zpcontextBegin + mov esi, eax ; Source address in ESI + rep movsb ; Move it as fast as we can! + pop ecx + pop edi + pop esi + ret ; No return code + global _m6502zpGetContextSize + global m6502zpGetContextSize_ + global m6502zpGetContextSize + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +m6502zpGetContextSize_: +_m6502zpGetContextSize: + mov eax, _m6502zpcontextEnd - _m6502zpcontextBegin + ret + global _m6502zpinit + global m6502zpinit_ + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +m6502zpinit_: +_m6502zpinit: + ret + global _m6502zpGetElapsedTicks + global m6502zpGetElapsedTicks_ + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +m6502zpGetElapsedTicks_: +_m6502zpGetElapsedTicks: + mov eax, [esp+4] ; Get our context address + or eax, eax ; Should we clear it? + jz getTicks + xor eax, eax + xchg eax, [dwElapsedTicks] + ret +getTicks: + mov eax, [dwElapsedTicks] + ret + global _m6502zpReleaseTimeslice + global m6502zpReleaseTimeslice_ + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +m6502zpReleaseTimeslice_: +_m6502zpReleaseTimeslice: + mov [cyclesRemaining], dword 1 + ret + global _m6502zpreset + global m6502zpreset_ + global m6502zpreset + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +m6502zpreset_: +_m6502zpreset: + push ebp ; Save our important register + xor eax, eax + mov ebp, [_m6502zpBase] + mov [_m6502zpx], al + mov [_m6502zpy], al + mov [_irqPending], al + mov [_m6502zps], byte 0ffh + mov [_m6502zpaf], word 2200h + mov ax, [ebp + 0fffch] ; Get reset address + mov [_m6502zppc], ax + pop ebp + ret + + global _m6502zpint + global m6502zpint_ + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +m6502zpint_: +_m6502zpint: + test [_m6502zpaf + 1], byte 04h ; Are interrupts disabled? + jnz intNotTaken ; Nope! Make it pending! + mov [_irqPending], byte 00h ; No longer pending + push edi + push ebx + push ax + mov ebx, 0100h ; Point to stack page + mov edi, [_m6502zpBase] ; Get pointer to game image + mov bl, [_m6502zps] ; Get our S reg pointer + mov ax, [_m6502zppc] ; Get our PC + mov [edi + ebx], ah ; Store it! + dec bl + mov [edi + ebx], al ; Store it! + dec bl + mov al, byte [_m6502zpaf+1] ; Get our flags + mov [edi + ebx], al ; Store flags + dec bl + mov ax, [edi+0fffeh] ; Get our start vector! + mov [_m6502zps], bl ; Store S reg pointer + and [_m6502zpaf + 1], byte 0efh ; Knock out source of interrupt bit + or [_m6502zpaf + 1], byte 24h ; Turn on something + mov [_m6502zppc], ax ; Store our new PC + pop ax ; Restore used registers + pop ebx + pop edi + xor eax, eax ; Indicate we've taken the interrupt + mov [_irqPending], al ; No more IRQ pending! + ret +intNotTaken: + mov eax, 1 ; Indicate we didn't take it + mov [_irqPending], al ; Indicate we have a pending IRQ + ret + global _m6502zpnmi + global m6502zpnmi_ + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +m6502zpnmi_: +_m6502zpnmi: + push edi + push ebx + + mov ebx, 0100h ; Point to stack page + + mov edi, [_m6502zpBase] ; Get pointer to game image + mov bl, [_m6502zps] ; Get our S reg pointer + mov ax, [_m6502zppc] ; Get our PC + + mov [edi + ebx], ah ; Store it! + dec bl + mov [edi + ebx], al ; Store it! + dec bl + + mov al, byte [_m6502zpaf+1] ; Get our flags + + + mov [edi + ebx], al ; Store flags + dec bl + mov ax, [edi+0fffah] ; Get our start vector! + + mov [_m6502zps], bl ; Store S reg pointer + and [_m6502zpaf + 1], byte 0efh ; Knock out source of interrupt bit + or [_m6502zpaf + 1], byte 24h ; Turn on something + mov [_m6502zppc], ax ; Store our new PC + + pop ebx + pop edi + + xor eax, eax ; Indicate that we took the NMI + ret + global _m6502zpexec + global m6502zpexec_ + +times ($$-$) & 3 nop ; pad with NOPs to 4-byte boundary + +m6502zpexec_: +_m6502zpexec: + mov eax, [esp+4] ; Get our execution cycle count + push ebx ; Save all registers we use + push ecx + push edx + push ebp + push esi + push edi + + mov dword [cyclesRemaining], eax ; Store # of instructions to + cld ; Go forward! + + xor eax, eax ; Zero EAX 'cause we use it! + xor ebx, ebx ; Zero EBX, too + xor ecx, ecx ; Zero ECX + xor esi, esi ; Zero our source address + + mov bl, [_m6502zpx] ; Get X + mov cl, [_m6502zpy] ; Get Y + mov ax, [_m6502zpaf] ; Get our flags and accumulator + mov si, [_m6502zppc] ; Get our program counter + mov ebp, [_m6502zpBase] ; Get our base address register + add esi, ebp ; Add in our base address + xor edx, edx ; And EDX + xor edi, edi ; Zero EDI as well + xor edx, edx + mov dl, ah + mov [_altFlags], dl + and [_altFlags], byte 3ch; + mov ah, [bit6502tox86+edx] + xor edx, edx + mov dl, [esi] + inc esi + jmp dword [m6502zpregular+edx*4] + +invalidInsWord: + dec esi + +; We get to invalidInsByte if it's a single byte invalid opcode + +invalidInsByte: + dec esi ; Back up one instruction... + mov edx, esi ; Get our address in EAX + sub edx, ebp ; And subtract our base for + ; an invalid instruction + jmp short emulateEnd + +noMoreExec: + dec esi + mov edx, 80000000h ; Indicate successful exec +emulateEnd: + push edx ; Save this for the return + xor edx, edx + mov dl, ah + mov ah, [bitx86to6502+edx] + or ah, [_altFlags] + mov [_m6502zpx], bl ; Store X + mov [_m6502zpy], cl ; Store Y + mov [_m6502zpaf], ax ; Store A & flags + sub esi, ebp ; Get our PC back + mov [_m6502zppc], si ; Store PC + pop edx ; Restore EDX for later + +popReg: + mov eax, edx ; Get our result code + pop edi ; Restore registers + pop esi + pop ebp + pop edx + pop ecx + pop ebx + + ret + + end diff --git a/src/cmnlib.c b/src/cmnlib.c new file mode 100644 index 0000000..1cdb3fc --- /dev/null +++ b/src/cmnlib.c @@ -0,0 +1,117 @@ +/************************************************************************************ + + smb Utility + + File: cmnlib.c + Description: + History: + + ************************************************************************************/ +#include +#include +#include "cmnlib.h" + +TCHAR g_szTempStringBuffer[TMPSTRBUFSIZ]; +TCHAR g_szTempStringBuffer2[TMPSTRBUFSIZ]; + +BOOL IsMMXAvailable() +{ + SYSTEM_INFO si; + BOOL blReturn = FALSE; + + GetSystemInfo(&si); + + if(si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_INTEL){ + __asm{ + mov eax, 1 + cpuid + test edx, 00800000h + jz NOMMX + mov blReturn, TRUE +NOMMX: + } + } + return blReturn; +} + +BOOL IsCommonControlSupported(DWORD dwVersion) +{ + HINSTANCE hComCtl; + BOOL fRet; + DWORD dwInstalledVersion=0; + + //load the DLL + hComCtl = LoadLibrary(TEXT("comctl32.dll")); + if(hComCtl) { + HRESULT hr = S_OK; + DLLGETVERSIONPROC pDllGetVersion; + /* + You must get this function explicitly because earlier versions of the DLL + don't implement this function. That makes the lack of implementation of the + function a version marker in itself. + */ + pDllGetVersion = (DLLGETVERSIONPROC)GetProcAddress(hComCtl, TEXT("DllGetVersion")); + if(pDllGetVersion) { + DLLVERSIONINFO dvi; + ZeroMemory(&dvi, sizeof(dvi)); + dvi.cbSize = sizeof(dvi); + hr = (*pDllGetVersion)(&dvi); + if(SUCCEEDED(hr)) { + if(dvi.dwMajorVersion==4){ + switch(dvi.dwMinorVersion) + { + case 70: dwInstalledVersion=COMCTRL_V470;break; + case 71: dwInstalledVersion=COMCTRL_V471;break; + case 72: dwInstalledVersion=COMCTRL_V472;break; + } + } else{ + if(dvi.dwMajorVersion>4) + dwInstalledVersion=COMCTRL_LATER; + } + } + } + else { + /* + If GetProcAddress failed, then the DLL is a version previous to the one + shipped with IE 3.x. + */ + dwInstalledVersion=COMCTRL_V400; + } + + fRet=(dwVersion<=dwInstalledVersion)?TRUE:FALSE; + + FreeLibrary(hComCtl); + return fRet; + } + return FALSE; +} + +void MyCheckMenuItem(HWND hWnd, UINT uItemID, UINT uCheck) +{ + MENUITEMINFO mii; + + memset(&mii, 0, sizeof(MENUITEMINFO)); + mii.cbSize = sizeof(MENUITEMINFO); + mii.fMask = MIIM_STATE; + if(uCheck) + mii.fState |= MFS_CHECKED; + else + mii.fState &= ~MFS_CHECKED; + SetMenuItemInfo(GetMenu(hWnd), uItemID, FALSE, &mii); +} + +void MySetMenuItemText(HWND hWnd,UINT uItemID,LPTSTR lpText) +{ + MENUITEMINFO mii; + + memset(&mii,0,sizeof(MENUITEMINFO)); + mii.cbSize=sizeof(MENUITEMINFO); + mii.fMask=MIIM_TYPE; + mii.fType=MFT_STRING; + mii.dwTypeData=lpText; + SetMenuItemInfo(GetMenu(hWnd),uItemID,FALSE,&mii); +} + +LPTSTR GetTempStringBuffer(){ g_szTempStringBuffer[0] = 0; return g_szTempStringBuffer; } + +LPTSTR GetTempStringBuffer2(){ g_szTempStringBuffer2[0] = 0; return g_szTempStringBuffer2; } diff --git a/src/cmnlib.h b/src/cmnlib.h new file mode 100644 index 0000000..af84415 --- /dev/null +++ b/src/cmnlib.h @@ -0,0 +1,35 @@ +/************************************************************************************ + + smb Utility + + File: cmnlib.h + Description: + History: + + ************************************************************************************/ +#ifndef CMNLIB_H +#define CMNLIB_H + +#define COMCTRL_ERROR 0 +#define COMCTRL_V400 1 +#define COMCTRL_V470 2 +#define COMCTRL_V471 4 +#define COMCTRL_V472 8 +#define COMCTRL_LATER 16 + +//一時文字列バッファーのサイズ、GetTempStringBuffer()関数で確保されている +#define TMPSTRBUFSIZ 512 + +#define Malloc(S) HeapAlloc(GetProcessHeap(), HEAP_GENERATE_EXCEPTIONS, (S)) +#define Mfree(P) HeapFree(GetProcessHeap(), 0, (P)) +#define Mrealloc(P,S) HeapReAlloc(GetProcessHeap(), HEAP_GENERATE_EXCEPTIONS, (P), (S)) + +#define LONG2POINT(l, pt) ((pt).x = (SHORT)LOWORD(l), (pt).y = (SHORT)HIWORD(l)) + +BOOL IsMMXAvailable(); +void MyCheckMenuItem(HWND, UINT, UINT); +void MySetMenuItemText(HWND, UINT, LPTSTR); +LPTSTR GetTempStringBuffer(); +LPTSTR GetTempStringBuffer2(); + +#endif \ No newline at end of file diff --git a/src/common.h b/src/common.h new file mode 100644 index 0000000..2470a49 --- /dev/null +++ b/src/common.h @@ -0,0 +1,83 @@ +/************************************************************************************ + + smb Utility + + File: common.h + Description: + History: + + ************************************************************************************/ +#ifndef COMMON_H +#define COMMON_H + +/***************** + + General + +******************/ +#define SMB_NUM_PRGS 2 +#define SMB_NUM_CHARS 1 + +#define INES_HEADERSIZE 0x10 +#define INES_TRAINERSIZE 0x200 +#define INES_PRGROMBANKSIZE 0x4000 +#define INES_CHRROMBANKSIZE 0x2000 + +#define SMB_PRG_SIZE (INES_PRGROMBANKSIZE * SMB_NUM_PRGS) +#define PRG_SIZE (SMB_PRG_SIZE + 0x8000) +#define SMB_CHR_SIZE (INES_CHRROMBANKSIZE * SMB_NUM_CHARS) + +typedef struct +{ + char cType[4]; + BYTE bNum_PRGs; + BYTE bNum_CHARs; + BYTE bROM_Type; + BYTE bROM_Type2; + char Reserved[8]; +}INESHEADER; + +#define SMB_OBJECT_DATA_MAX_SIZE 3 + +#define SMB_MAX_PAGE 0x7F + +typedef union +{ + struct{ + BYTE bLower; + BYTE bUpper; + }byte; + WORD word; +}ADDRESSDATA; + +#define ADDRESSDATA_LOAD(a,p) memcpy(&(a).byte.bLower,bPRGROM+(p),2) +#define ADDRESSDATA_GET(a) (a).word + +typedef struct +{ + LPSTR Name; + BYTE bBasicDataMask; + BYTE bBasicData; + BYTE bIsSizeValid; + BYTE bSizeMask; + int iSizeDelta; + LPSTR Note; +}SMBMAPOBJECTINFO; + +typedef struct _tagSMBBADGUYSINFO +{ + LPSTR Name; + int YDelta; + BYTE bFixedYPos; + int XDelta; +}SMBBADGUYSINFO; + +extern INESHEADER Head; +extern BYTE bPRGROM[INES_PRGROMBANKSIZE*SMB_NUM_PRGS+0x8000]; +extern BYTE bCHRROM[INES_CHRROMBANKSIZE*SMB_NUM_CHARS]; +extern int iTrainer; + +extern BOOL gblIsROMLoaded; +//extern BOOL gblDataChanged; + +#endif /* COMMON_H */ \ No newline at end of file diff --git a/src/data/ram1.bin b/src/data/ram1.bin new file mode 100644 index 0000000..24fb2e7 Binary files /dev/null and b/src/data/ram1.bin differ diff --git a/src/data/ram2.bin b/src/data/ram2.bin new file mode 100644 index 0000000..ca3630d Binary files /dev/null and b/src/data/ram2.bin differ diff --git a/src/delreg/delreg.c b/src/delreg/delreg.c new file mode 100644 index 0000000..b8ba21a --- /dev/null +++ b/src/delreg/delreg.c @@ -0,0 +1,18 @@ +#include +#include "../ini.h" +#include "../strings.h" + +int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow) +{ + if(IDNO==MessageBox(NULL,STRING_DELREG_CONFIRM,STRING_DELREG_TITLE,MB_YESNO|MB_ICONQUESTION)) + return 0; + + if(DeleteRegistryEntries()){ + MessageBox(NULL,STRING_DELREG_COMPLETE,STRING_DELREG_TITLE,MB_OK|MB_ICONINFORMATION); + } + else{ + MessageBox(NULL,STRING_DELREG_ERROR_01,STRING_DELREG_TITLE,MB_OK|MB_ICONEXCLAMATION); + } + + return 0; +} \ No newline at end of file diff --git a/src/delreg/delreg.dsp b/src/delreg/delreg.dsp new file mode 100644 index 0000000..7451cfc --- /dev/null +++ b/src/delreg/delreg.dsp @@ -0,0 +1,109 @@ +# Microsoft Developer Studio Project File - Name="delreg" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** 編集しないでください ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=delreg - Win32 Debug +!MESSAGE これは有効なメイクファイルではありません。 このプロジェクトをビルドするためには NMAKE を使用してください。 +!MESSAGE [メイクファイルのエクスポート] コマンドを使用して実行してください +!MESSAGE +!MESSAGE NMAKE /f "delreg.mak". +!MESSAGE +!MESSAGE NMAKE の実行時に構成を指定できます +!MESSAGE コマンド ライン上でマクロの設定を定義します。例: +!MESSAGE +!MESSAGE NMAKE /f "delreg.mak" CFG="delreg - Win32 Debug" +!MESSAGE +!MESSAGE 選択可能なビルド モード: +!MESSAGE +!MESSAGE "delreg - Win32 Release" ("Win32 (x86) Application" 用) +!MESSAGE "delreg - Win32 Debug" ("Win32 (x86) Application" 用) +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "delreg - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x411 /d "NDEBUG" +# ADD RSC /l 0x411 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 + +!ELSEIF "$(CFG)" == "delreg - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x411 /d "_DEBUG" +# ADD RSC /l 0x411 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "delreg - Win32 Release" +# Name "delreg - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\delreg.c +# End Source File +# Begin Source File + +SOURCE=..\ini.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/src/delreg/delreg.dsw b/src/delreg/delreg.dsw new file mode 100644 index 0000000..78bedd1 --- /dev/null +++ b/src/delreg/delreg.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# 警告: このワークスペース ファイル を編集または削除しないでください! + +############################################################################### + +Project: "delreg"=".\delreg.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/src/delreg/delreg_i.dsp b/src/delreg/delreg_i.dsp new file mode 100644 index 0000000..6af2254 --- /dev/null +++ b/src/delreg/delreg_i.dsp @@ -0,0 +1,109 @@ +# Microsoft Developer Studio Project File - Name="delreg" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** 編集しないでください ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=delreg - Win32 Debug +!MESSAGE これは有効なメイクファイルではありません。 このプロジェクトをビルドするためには NMAKE を使用してください。 +!MESSAGE [メイクファイルのエクスポート] コマンドを使用して実行してください +!MESSAGE +!MESSAGE NMAKE /f "delreg_i.mak". +!MESSAGE +!MESSAGE NMAKE の実行時に構成を指定できます +!MESSAGE コマンド ライン上でマクロの設定を定義します。例: +!MESSAGE +!MESSAGE NMAKE /f "delreg_i.mak" CFG="delreg - Win32 Debug" +!MESSAGE +!MESSAGE 選択可能なビルド モード: +!MESSAGE +!MESSAGE "delreg - Win32 Release" ("Win32 (x86) Application" 用) +!MESSAGE "delreg - Win32 Debug" ("Win32 (x86) Application" 用) +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "delreg - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "INTERNATIONAL" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x411 /d "NDEBUG" +# ADD RSC /l 0x411 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 + +!ELSEIF "$(CFG)" == "delreg - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "INTERNATIONAL" /YX /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x411 /d "_DEBUG" +# ADD RSC /l 0x411 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "delreg - Win32 Release" +# Name "delreg - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\delreg.c +# End Source File +# Begin Source File + +SOURCE=..\ini.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/src/delreg/delreg_i.dsw b/src/delreg/delreg_i.dsw new file mode 100644 index 0000000..9ae4521 --- /dev/null +++ b/src/delreg/delreg_i.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# 警告: このワークスペース ファイル を編集または削除しないでください! + +############################################################################### + +Project: "delreg"=".\delreg_i.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/src/document/international.txt b/src/document/international.txt new file mode 100644 index 0000000..729c94d --- /dev/null +++ b/src/document/international.txt @@ -0,0 +1,10 @@ +------------------ +Notes on compiling +------------------ +When compiling, define a constant INTERNATIONAL. + +--------------------------------------- +Resource files of international version +--------------------------------------- +resource_i.rc +string_i.h diff --git a/src/document/todo.txt b/src/document/todo.txt new file mode 100644 index 0000000..b02791f --- /dev/null +++ b/src/document/todo.txt @@ -0,0 +1,73 @@ +・変更したファイルをタイトルバーにアスタリスクを付けるなど分かるように。(済) + ※ 無変更から一回編集して、アンドューした場合、アスタリスクは消えない。 +・マウスやキーボード編集入力時に不可能な操作をキャンセルした場合のエラーをログウィンドウに出力。 +・マウス入力によるオブジェクトの移動で、ウィンドウに表示されていないページにオブジェクトを移動 +させることができない。 +・メニューにキーボードアクセレレータの対応するキーを表示(カスタマイズで割り当てを変更できるの +で、動的に変更する必要あり)。 +・より良いレベル作成の為のレポート機能。 + ルーム内で獲得可能なコインの最大枚数。 + 地形オブジェクトが消えてしまう可能性。 +・keys.cのg_VKeyInfoの文字列をstring_?.hに定数として定義する。 + +NOTE : +-------------------------------------------------------------------------------------- +emuengine.cのExecuteCPU()関数で、カットされるスキャンラインの本数が1〜7の7本しかない。 +-------------------------------------------------------------------------------------- +・RefreshLine()関数の引数は0起算。 +・テストプレイ用のセーブデータを書き換えなければならない +・オブジェクトビュー描画用のExecuteCPUNoRefreshScreen() + +// 上側のスキャンラインを8本にしたバージョン +// NTSC +// 0 - 7 the top eight lines are cut off +// 8 - 231 visible +// 232 - 239 the bottom eight lines are cut off +// 240 - 242 an additional 3 scanlines worth of CPU cycles to enter V-Blank. +// 243 V-Blank flag, NMI +// 243 - 262 V-Blank period takes a further 20 scanlines worth before the next frame can be drawn. +static WORD ExecuteCPU() +{ + // Execute CPU + m6502zpexec(113); + + // Set hity flag, if necessary + if(wScanline == pbSPRRAM[0] + GetFirstNonTransparentLine(pbSPRRAM[1])) + bPPUStaReg|=0x40; + // + if(wScanline > 7 && wScanline < 232) { // 8 - 231 + // Update scanline + RefreshLine(wScanline); + return ++wScanline; + } + else if(wScanline == NES_SCANLINE_VBLANK) { + PostMessage(GETFRAMEWNDHANDLE(ghEmuWnd), WM_UPDATEFRAME, 0, 0); //g_fUpdate = TRUE; + // VBlank begins + g_bInVBlank = TRUE; + // Set vblank flag + bPPUStaReg |= 0x80; + // if nessesary, execute NMI. + if(bPPUCtrlReg1 & 0x80) m6502zpnmi(); + return ++wScanline; + } + else if(wScanline >= NES_SCANLINE_BOTTOM) { + // VBlank ends + g_bInVBlank = FALSE; + // Clear VBlank flag and hity flag + bPPUStaReg &= 0x30; + // Reset scanline + wScanline = 0; + return 0; // wScanline == 0 and DO NOT INCREMENT + } + + return ++wScanline; +} + +※ 他のNESエミュレータと同時に起動して、SMBの残り時間の経過を比較すると遅い。 + +マルチメディアタイマーの時間の補正を行えたら修正できるかもしれない。 +スレッド作成して、ループでやればよかった。そうでもない。 + +------------------------------------------ +全般の設定はアンドゥできないようにしてある +------------------------------------------ \ No newline at end of file diff --git a/src/emubgset.c b/src/emubgset.c new file mode 100644 index 0000000..96948ec --- /dev/null +++ b/src/emubgset.c @@ -0,0 +1,395 @@ +/************************************************************************************ + + smb Utility + + File: emubgset.c + Description:ビューで敵を表示するためにスプライトRAMにデータを書き込むルーチン + History: + + ************************************************************************************/ +#include "smbutil.h" +#include "M6502.h" +#include "emulator.h" +#include "objlib.h" +#include "roommng.h" +#include "emubgset.h" + +typedef struct +{ + int iXTiles; + int iYTiles; + int iYTileDelta; + int iXPixelDelta; + int iYPixelDelta; + BYTE bTileData[24]; + BYTE bColors; + DWORD dwXFlip; + DWORD dwYFlip; +}BADGUYSSPRITEINFO; + +BADGUYSSPRITEINFO g_sBadGuysSpriteInfo[]={ + //青いのこのこ + 2,3,1,0,0,0xA0,0xFC,0xA2,0xA1,0xA4,0xA3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1,0x0000003F,0x00000000, + //赤いのこのこ + 2,3,1,0,0,0xA0,0xFC,0xA2,0xA1,0xA4,0xA3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2,0x0000003F,0x00000000, + //メット + 2,2,2,0,0,0xAB,0xAA,0xAD,0xAC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3,0x0000000F,0x00000000, + //赤いのこのこ(往復) + 2,3,1,0,0,0xA0,0xFC,0xA2,0xA1,0xA4,0xA3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2,0x0000003F,0x00000000, + //青いのこのこ + 2,3,1,0,0,0xA0,0xFC,0xA2,0xA1,0xA4,0xA3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1,0x0000003F,0x00000000, + //ハンマーブロス + 2,3,1,0,0,0x7C,0x7D,0x88,0x89,0x8A,0x8B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1,0x0000003F,0x00000000, + //クリボー + 2,2,2,0,0,0x70,0x71,0x72,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3,0x00000000,0x00000000, + //ゲッソー + 2,3,1,0,0,0xDC,0xDC,0xDD,0xDD,0xDE,0xDE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3,0x0000002A,0x00000000, + //キラー + 2,2,2,0,0,0xE7,0xE8,0xE9,0xEA,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3,0x0000000F,0x00000000, + //青いパタパタ(停止) + 2,3,1,0,0,0xA0,0x69,0xA2,0x6A,0xA4,0xA3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1,0x0000003F,0x00000000, + //青いぷくぷく(直進) + 2,2,2,0,0,0xB3,0xB2,0xB5,0xB4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1,0x0000003F,0x00000000, + //赤いぷくぷく(直進) + 2,2,2,0,0,0xB3,0xB2,0xB5,0xB4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2,0x0000003F,0x00000000, + //バブル + 2,2,2,0,0,0xD0,0xD0,0xD7,0xD7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2,0x0000000A,0x00000000, + //パックンフラワー + 2,3,1,0,0,0xE5,0xE5,0xE6,0xE6,0xEB,0xEB,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1,0x0000002A,0x00000000, + //青いパタパタ(跳ねる) + 2,3,1,0,0,0xA0,0x69,0xA2,0x6A,0xA4,0xA3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1,0x0000003F,0x00000000, + //赤いパタパタ(上下) + 2,3,1,0,0,0xA0,0x69,0xA2,0x6A,0xA4,0xA3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2,0x0000003F,0x00000000, + //青いパタパタ(左右) + 2,3,1,0,0,0xA0,0x69,0xA2,0x6A,0xA4,0xA3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1,0x0000003F,0x00000000, + //ジュゲム + 2,3,1,0,0,0xB9,0xB8,0xBB,0xBA,0xBC,0xBC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1,0x00000020,0x00000000, + //トゲゾー + 2,2,2,0,0,0x9B,0x9A,0x9D,0x9C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2,0x0000000F,0x00000000, + //カラスみたいな赤いのこのこ + 0,0,0,0,0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0,0x00000000,0x00000000, + //赤いプクプク(連続) + 2,2,4,0,0,0xB3,0xB2,0xB5,0xB4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2,0x0000003F,0x00000000, + //クッパの炎 + 3,1,4,0,0,0x51,0x52,0x53,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2,0x00000000,0x00000000, + //暴走 + 0,0,0,0,0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0,0x00000000,0x00000000, + //キラー連続 + 2,2,4,0,0,0xE7,0xE8,0xE9,0xEA,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3,0x0000000F,0x00000000, + //無し + 0,0,0,0,0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0,0x00000000,0x00000000, + //無し + 0,0,0,0,0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0,0x00000000,0x00000000, + //無し + 0,0,0,0,0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0,0x00000000,0x00000000, + //ファイアーバー(右回転) + 1,6,0,3,3,0x65,0x65,0x65,0x65,0x65,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2,0x00000000,0x00000000, + //ファイアーバー(右高速回転) + 1,6,0,3,3,0x65,0x65,0x65,0x65,0x65,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2,0x00000000,0x00000000, + //ファイアーバー(左回転) + 1,6,0,3,3,0x65,0x65,0x65,0x65,0x65,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2,0x00000000,0x00000000, + //ファイアーバー(左高速回転) + 1,6,0,3,3,0x65,0x65,0x65,0x65,0x65,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2,0x00000000,0x00000000, + //ロングファイアーバー + 1,12,0,3,3,0x65,0x65,0x65,0x65,0x65,0x65,0x65,0x65,0x65,0x65,0x65,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2,0x00000000,0x00000000, + //ファイアーバー + 1,6,0,3,3,0x65,0x65,0x65,0x65,0x65,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2,0x00000000,0x00000000, + //ファイアーバー + 1,6,0,3,3,0x65,0x65,0x65,0x65,0x65,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2,0x00000000,0x00000000, + //ファイアーバー + 1,6,0,3,3,0x65,0x65,0x65,0x65,0x65,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2,0x00000000,0x00000000, + //無し + 0,0,0,0,0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0,0x00000000,0x00000000, + //リフト(天秤) + 6,1,0,0,0,0x5B,0x5B,0x5B,0x5B,0x5B,0x5B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2,0x00000000,0x00000000, + //リフト(上下) + 6,1,0,0,0,0x5B,0x5B,0x5B,0x5B,0x5B,0x5B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2,0x00000000,0x00000000, + //リフト(上昇) + 6,1,0,-4,0,0x5B,0x5B,0x5B,0x5B,0x5B,0x5B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2,0x00000000,0x00000000, + //リフト(下降) + 6,1,0,-4,0,0x5B,0x5B,0x5B,0x5B,0x5B,0x5B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2,0x00000000,0x00000000, + //リフト(左右) + 6,1,0,0,0,0x5B,0x5B,0x5B,0x5B,0x5B,0x5B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2,0x00000000,0x00000000, + //リフト(落下) + 6,1,0,0,0,0x5B,0x5B,0x5B,0x5B,0x5B,0x5B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2,0x00000000,0x00000000, + //リフト(前進) + 6,1,0,0,0,0x5B,0x5B,0x5B,0x5B,0x5B,0x5B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2,0x00000000,0x0000000, + //小さいリフト(上昇) + 3,1,0,-4,0,0x5B,0x5B,0x5B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2,0x00000000,0x00000000, + //小さいリフト(下降) + 3,1,0,-4,0,0x5B,0x5B,0x5B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2,0x00000000,0x00000000, + //クッパ + 4,4,0,0,0,0xBE,0xBF,0xFC,0xFC,0xC0,0xC1,0xC3,0xC4,0xFC,0xC2,0xC5,0xC6,0xFC,0xFC,0xC7,0xC8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1,0x0000FFFF,0x00000000, + //生きているきのこ + 0,0,0,0,0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0,0x00000000,0x00000000, + //きのこの出る音だけ + 0,0,0,0,0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0,0x00000000,0x00000000, + //無し + 0,0,0,0,0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0,0x00000000,0x00000000, + //無し + 0,0,0,0,0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0,0x00000000,0x00000000, + //にせジャンプ台 + 2,3,0,0,0,0xF2,0xF2,0xF3,0xF3,0xF2,0xF2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2,0x0000002A,0x00000030, + //無し + 0,0,0,0,0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0,0x00000000,0x00000000, + //ワープゾーン + 0,0,0,0,0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0,0x00000000,0x00000000, + //ピノキオ、ピーチ姫 + 2,3,3,0,0,0xCD,0xCD,0xCE,0xCE,0xCF,0xCF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2,0x0000002A,0x00000000, + //暴走 + 0,0,0,0,0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0,0x00000000,0x00000000, + //2体のクリボー + 5,2,2,0,0,0x70,0x71,0xFC,0x70,0x71,0x72,0x73,0xFC,0x72,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3,0x00000000,0x00000000, + //3体のクリボー + 8,2,2,0,0,0x70,0x71,0xFC,0x70,0x71,0xFC,0x70,0x71,0x72,0x73,0xFC,0x72,0x73,0xFC,0x72,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3,0x00000000,0x00000000, + //2体のクリボー + 5,2,2,0,0,0x70,0x71,0xFC,0x70,0x71,0x72,0x73,0xFC,0x72,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3,0x00000000,0x00000000, + //3体のクリボー + 8,2,2,0,0,0x70,0x71,0xFC,0x70,0x71,0xFC,0x70,0x71,0x72,0x73,0xFC,0x72,0x73,0xFC,0x72,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3,0x00000000,0x00000000, + //2体の青いのこのこ + 5,3,1,0,0,0xA0,0xFC,0xFC,0xA0,0xFC,0xA2,0xA1,0xFC,0xA2,0xA1,0xA4,0xA3,0xFC,0xA4,0xA3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1,0x00007FFF,0x00000000, + //3体の青いのこのこ + 8,3,1,0,0,0xA0,0xFC,0xFC,0xA0,0xFC,0xFC,0xA0,0xFC,0xA2,0xA1,0xFC,0xA2,0xA1,0xFC,0xA2,0xA1,0xA4,0xA3,0xFC,0xA4,0xA3,0xFC,0xA4,0xA3,0x1,0x00FFFFFF,0x00000000, + //2体の青いのこのこ + 5,3,1,0,0,0xA0,0xFC,0xFC,0xA0,0xFC,0xA2,0xA1,0xFC,0xA2,0xA1,0xA4,0xA3,0xFC,0xA4,0xA3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1,0x00007FFF,0x00000000, + //3体の青いのこのこ + 8,3,1,0,0,0xA0,0xFC,0xFC,0xA0,0xFC,0xFC,0xA0,0xFC,0xA2,0xA1,0xFC,0xA2,0xA1,0xFC,0xA2,0xA1,0xA4,0xA3,0xFC,0xA4,0xA3,0xFC,0xA4,0xA3,0x1,0x00FFFFFF,0x00000000, + //無し + 0,0,0,0,0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0,0x00000000,0x00000000 +}; + +extern BYTE pbSPRRAM[0x100]; +static int SetBadGuysDataToSpriteRAM(int iPosX,int iPosY,BYTE bType,int iRAMIndex,int iPageDelta) +{ + int iYTiles,iYTileDelta,iXTiles,iXPixelDelta,iYPixelDelta,n,x,y; + + if(abs(iPageDelta)>1) return iRAMIndex; + + iXTiles=g_sBadGuysSpriteInfo[bType].iXTiles; + iYTiles=g_sBadGuysSpriteInfo[bType].iYTiles; + iYTileDelta=g_sBadGuysSpriteInfo[bType].iYTileDelta; + iXPixelDelta=g_sBadGuysSpriteInfo[bType].iXPixelDelta; + iYPixelDelta=g_sBadGuysSpriteInfo[bType].iYPixelDelta; + + for(y=0,n=0;y=NES_SCREENSIZEX){ + if(!iPageDelta || iPageDelta==1) continue; + }else if(iTmpX<0){ + if(!iPageDelta || iPageDelta==-1) continue; + } + else{ + if(iPageDelta==-1 || iPageDelta==1) continue; + } + + pbSPRRAM[iRAMIndex*4+3]=(BYTE)iTmpX; + pbSPRRAM[iRAMIndex*4+0]=iPosY*16+y*8+iYTileDelta*8+iYPixelDelta; + pbSPRRAM[iRAMIndex*4+1]=g_sBadGuysSpriteInfo[bType].bTileData[n]; + pbSPRRAM[iRAMIndex*4+2]=0; + pbSPRRAM[iRAMIndex*4+2]|=(g_sBadGuysSpriteInfo[bType].bColors&0x03); + pbSPRRAM[iRAMIndex*4+2]|=(((g_sBadGuysSpriteInfo[bType].dwXFlip>>n)&0x01)<<6); + pbSPRRAM[iRAMIndex*4+2]|=(((g_sBadGuysSpriteInfo[bType].dwYFlip>>n)&0x01)<<7); + + iRAMIndex++; + + } + } + + return iRAMIndex; +} + +typedef struct +{ + int iXTiles; + int iYTiles; + int iYTileDelta; + int iPixelX; + int iPixelY; + BYTE bTileData[24]; + BYTE bColors; + DWORD dwXFlip; + DWORD dwYFlip; +}BADGUYSSPRITEINFOEX; + +static int SetMapDataToSpriteRAM(int iPosX,int iPosY,BADGUYSSPRITEINFOEX* psBGSPRInfoEx,int iRAMIndex,int iPageDelta) +{ + int iYTiles,iYTileDelta,iXTiles,iPixelX,iPixelY,n,x,y; + + if(abs(iPageDelta)>1) return iRAMIndex; + + iXTiles=psBGSPRInfoEx->iXTiles; + iYTiles=psBGSPRInfoEx->iYTiles; + iYTileDelta=psBGSPRInfoEx->iYTileDelta; + iPixelX=psBGSPRInfoEx->iPixelX; + iPixelY=psBGSPRInfoEx->iPixelY; + + for(y=0,n=0;y=NES_SCREENSIZEX){ + if(!iPageDelta || iPageDelta==1) continue; + }else if(iTmpX<0){ + if(!iPageDelta || iPageDelta==-1) continue; + } + else + { + if(iPageDelta==-1 || iPageDelta==1) continue; + } + + pbSPRRAM[iRAMIndex*4+3]=(BYTE)iTmpX; + pbSPRRAM[iRAMIndex*4+0]=(BYTE)(iPosY*16+y*8+iYTileDelta*8+iPixelY); + pbSPRRAM[iRAMIndex*4+1]=psBGSPRInfoEx->bTileData[n]; + pbSPRRAM[iRAMIndex*4+2]=0; + pbSPRRAM[iRAMIndex*4+2]|=(psBGSPRInfoEx->bColors&0x03); + pbSPRRAM[iRAMIndex*4+2]|=(((psBGSPRInfoEx->dwXFlip>>n)&0x01)<<6); + pbSPRRAM[iRAMIndex*4+2]|=(((psBGSPRInfoEx->dwYFlip>>n)&0x01)<<7); + + iRAMIndex++; + + } + } + return iRAMIndex; +} + +extern struct {LPSTR Name;int YDelta;BYTE bFixedYPos;int XDelta;} smbBudGuysInfo[]; + +static int GetBadGuysYPosPSRAM(BYTE *pbBuf) +{ + int iRet; + if((pbBuf[0]&0x0F)!=0x0E){ + if(smbBudGuysInfo[pbBuf[1]&0x3F].bFixedYPos) + iRet=smbBudGuysInfo[pbBuf[1]&0x3F].bFixedYPos+1; + else + iRet=(pbBuf[0]&0x0F); + }else{ + iRet=0x0E; + } + return iRet; +} + +void PrepareSpriteRAM(UINT uRoomID,int iPage) +{ + OBJECTSEEKINFO ObjSeek; + int iRAMIndex=0; + + memset(pbSPRRAM,0xFF,0x100); + + //敵 + if(BadGuysSeekFirst(&ObjSeek,uRoomID)) + { + for(;;) + { + if( ObjSeek.dwPage + && (ObjSeek.pbData[0]&0x0F)!=0x0F + && (ObjSeek.pbData[0]&0x0F)!=0x0E) + { + iRAMIndex=SetBadGuysDataToSpriteRAM(GetBadGuysXPos(ObjSeek.pbData),GetBadGuysYPosPSRAM(ObjSeek.pbData),(BYTE)(ObjSeek.pbData[1]&0x3F),iRAMIndex,ObjSeek.dwPage-iPage); + } + + if(!BadGuysSeekNext(&ObjSeek)) break; + } + + } + + //マップの補助オブジェクト + if(MapSeekFirst(&ObjSeek,uRoomID)) + { + BADGUYSSPRITEINFOEX sMapSprInfo[]= + { + //ジャンプ台 + 2,3,4,0,0,0xF2,0xF2,0xF3,0xF3,0xF2,0xF2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2,0x0000002A,0x00000030, + //ポールの旗 + 2,2,0,-8,0,0x7E,0x7F,0xFC,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1,0x00000000,0x00000030, + }; + int iYPos,iType; + + for(;;) + { + iYPos=GetMapYPos(ObjSeek.pbData); + iType=(ObjSeek.pbData[1]&0x7F); + // + if((0<= iYPos && iYPos <=0x0B) && iType==0x0B){ + iRAMIndex=SetMapDataToSpriteRAM(GetMapXPos(ObjSeek.pbData),iYPos,&sMapSprInfo[0],iRAMIndex,ObjSeek.dwPage-iPage); + } + // + else if((iYPos==0x0D && iType==0x41) || ((0<= iYPos && iYPos <=0x0B) && iType==0x0D) ){ + iRAMIndex=SetMapDataToSpriteRAM(GetMapXPos(ObjSeek.pbData),3,&sMapSprInfo[1],iRAMIndex,ObjSeek.dwPage-iPage); + } + + if(!MapSeekNext(&ObjSeek)) break; + } + + } +} + +void SetPrepareBadGuysSpriteInfoStruct(BYTE bRoomID,int iWorld,int iArea,PREPAREBGSPRINFO *psPreBSI) +{ + BYTE bBuf[2]; + + memset(psPreBSI,0,sizeof(PREPAREBGSPRINFO)); + + if(!psPreBSI) return; + + if(iWorld>=(GetNumWorlds()-1)) + psPreBSI->blPeach=TRUE; + + if(bPRGROM[0x903B]<=iWorld && bPRGROM[0x9044]<=iArea) + psPreBSI->blIsLiftSmall=TRUE; + + if(((bRoomID>>5)&0x03)==0x03) + psPreBSI->blIsLiftSmall=TRUE; + + GetMapHeadData(bRoomID,bBuf); + if(((bBuf[1]>>6)&0x03)==0x03) + psPreBSI->blIsLiftCloud=TRUE; +} + +void PrepareBadGuysSpriteInfo(PREPAREBGSPRINFO *psPreBSI) +{ + int n; + + if(psPreBSI->blIsLiftSmall){ + for(n=0x24;n<=0x2A;n++){ + g_sBadGuysSpriteInfo[n].iXTiles=4; + if(n==0x24)g_sBadGuysSpriteInfo[n].iXPixelDelta=8; + } + } + else{ + for(n=0x24;n<=0x2A;n++){ + g_sBadGuysSpriteInfo[n].iXTiles=6; + if(n==0x24)g_sBadGuysSpriteInfo[n].iXPixelDelta=0; + } + } + + if(psPreBSI->blIsLiftCloud){ + for(n=0x24;n<=0x2A;n++) + memset(g_sBadGuysSpriteInfo[n].bTileData,0x75,6); + } + else{ + for(n=0x24;n<=0x2A;n++) + memset(g_sBadGuysSpriteInfo[n].bTileData,0x5B,6); + } + + if(psPreBSI->blPeach){ + BADGUYSSPRITEINFO bgspiPeach={ 2,3,3,0,0,0x7A,0x7B,0xDA,0xDB,0xD8,0xD8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2,0x00000020,0x00000000}; + memcpy(&g_sBadGuysSpriteInfo[0x35],&bgspiPeach,sizeof(BADGUYSSPRITEINFO)); + }else{ + BADGUYSSPRITEINFO bgspiToad={ 2,3,3,0,0,0xCD,0xCD,0xCE,0xCE,0xCF,0xCF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2,0x0000002A,0x00000000}; + memcpy(&g_sBadGuysSpriteInfo[0x35],&bgspiToad,sizeof(BADGUYSSPRITEINFO)); + } + + +} \ No newline at end of file diff --git a/src/emubgset.h b/src/emubgset.h new file mode 100644 index 0000000..ca0e8e1 --- /dev/null +++ b/src/emubgset.h @@ -0,0 +1,34 @@ +/************************************************************************************ + + smb Utility + + File: emubgset.h + Description: + History: + + ************************************************************************************/ +#ifndef EMUBGSET_H +#define EMUBGSET_H + +typedef struct +{ + BOOL blIsLiftSmall; + BOOL blIsLiftCloud; + BOOL blPeach; +}PREPAREBGSPRINFO; +/********************* + + +**********************/ +void PrepareSpriteRAM(UINT uRoomID,int iPage); +/********************* + + +**********************/ +void SetPrepareBadGuysSpriteInfoStruct(BYTE bRoomID,int iWorld,int iArea,PREPAREBGSPRINFO *psPreBSI); +/********************* + + +**********************/ +void PrepareBadGuysSpriteInfo(PREPAREBGSPRINFO *psPreBSI); +#endif \ No newline at end of file diff --git a/src/emuengine.c b/src/emuengine.c new file mode 100644 index 0000000..d75e52a --- /dev/null +++ b/src/emuengine.c @@ -0,0 +1,2088 @@ +/************************************************************************************ + + smb Utility + + File: emuengine.c + Description: エミュレータの中心的なルーチン + History: + + ************************************************************************************/ +#include "smbutil.h" +#include "emulator.h" +#include "ini.h" +#include "nespal.h" +#include "objwndcmn.h" +//------------- +// +// Constants +// +//-------------- +#define NES_SCANLINE_VISIBLE_TOP 8 +#define NES_SCANLINE_VISIBLE_BOTTOM 231 +#define NES_SCANLINE_VBLANK 243 +#define NES_SCANLINE_BOTTOM 262 +#define NES_VISIBLESIZEY 224//(NES_SCREENSIZEY-16) +#define EMULATOR_WINDOWFRAMESIZEX (GetSystemMetrics(SM_CXSIZEFRAME) * 2) +#define EMULATOR_WINDOWFRAMESIZEY (GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYSIZEFRAME) * 2) +#define EMULATOR_TIMER_INTERVAL 17 +#define INITCOLORINDEX 0x20 +#define EMUWNDCLASSNAME TEXT("EMU_WND") + + +//------------- +// +// Global +// +//-------------- +BYTE bPPUCtrlReg1; +BYTE bPPUCtrlReg2; +BYTE bPPUStaReg; +CONTEXTM6502 *psM6502; +BYTE *pb6502CPUMemory; +BOOL blBGIsVertical; +BYTE bBGScrlH; +BYTE bBGScrlV; +WORD wScanline; +BYTE g_bInVBlank; +BOOL g_blVRAMAddrLow; +WORD wVRAMAddr; +BYTE pbVRAM[0x4000]; +BOOL blVRAMFirstRead; +BYTE pbVROMData[0x8000+8]; +BYTE pbSPRRAM[0x100]; +BYTE bSPRRAMAddr; +WORD wSprite0Tile; +BYTE gbBGColor; +BYTE bJoy1Read; +BYTE bJoy2Read; +WORD g_wPrevPC; +BOOL gblPause = FALSE; +BOOL gblExecute = FALSE; +BOOL g_fUpdate = FALSE; +BOOL gblDemoRecord = FALSE; +BOOL g_fUseMMX = FALSE; +BOOL g_fSkipJoyRead = FALSE; +BOOL g_fUseJoyPOV = FALSE; +// A, B, SELECT, START, UP, DOWN, LEFT, RIGHTの順 +// NOTE : A, B, SELECT, STARTが最初にくることを前提にして、 +// ジョイスティックのボタン設定を実装している +// (UP, DOWN, LEFT, RIGHTは未使用) +BYTE g_EmuKey[EMULATOR_NUM_BUTTONS] = {0}; +DWORD g_EmuJoyButton[EMULATOR_NUM_JOYBUTTONS] = {0}; +UINT g_uEmuJoyID = JOYSTICKID1; +DWORD g_dwEmuJoyXRight; +DWORD g_dwEmuJoyXLeft; +DWORD g_dwEmuJoyYUp; +DWORD g_dwEmuJoyYDown; +HWND ghEmuWnd = NULL; +UINT g_nTimerID = 0; +DWORD dwThreadID = 0; +CRITICAL_SECTION CriticalSection;//エミュレータのスレッドを複数作成しないためのクリテイカルセクションオブジェクト +HDC ghMemdcOffScreen = NULL; +HBITMAP ghBmOffScreen = NULL; +HBITMAP ghOldBmOffScreen = NULL; +BYTE *gpbBmBufOffScreen; +LPBITMAPINFO g_lpBmInfo; +HPALETTE g_hPal = NULL; + +/********************* + + JOYSTICK Functions + +**********************/ + +// +// 0: 無効とみなし、セットされない。 +// それ以外: 有効な値とみなす +// 要素数8つの配列 +// A, B, SELECT, START, UP, DOWN, LEFT, RIGHTの順 +BOOL SetEmulatorKeys(WORD aEmuKeys[]) +{ + int i; + + for(i = 0;i < EMULATOR_NUM_BUTTONS; i++) { + if(aEmuKeys[i]) + g_EmuKey[i] = (BYTE)aEmuKeys[i]; + } + + return TRUE; +} + +BOOL SetEmulatorJoyButtons(DWORD aEmuJoyButtons[]) +{ + int i; + + for(i = 0;i < EMULATOR_NUM_JOYBUTTONS; i++) { + if(aEmuJoyButtons[i]) + g_EmuJoyButton[i] = aEmuJoyButtons[i]; + } + + return TRUE; +} + +BOOL GetDefaultEmulatorKeys(WORD aEmuKeys[]) +{ + // A, B, SELECT, START, UP, DOWN, LEFT, RIGHTの順 + aEmuKeys[0] = 'N'; + aEmuKeys[1] = 'B'; + aEmuKeys[2] = VK_BACK; + aEmuKeys[3] = VK_RETURN; + aEmuKeys[4] = VK_UP; + aEmuKeys[5] = VK_DOWN; + aEmuKeys[6] = VK_LEFT; + aEmuKeys[7] = VK_RIGHT; + return TRUE; +} + +BOOL GetDefaultEmulatorJoyButtons(DWORD aEmuJoyButtons[]) +{ + // A, B, SELECT, STARTの順 + aEmuJoyButtons[0] = JOY_BUTTON2; + aEmuJoyButtons[1] = JOY_BUTTON1; + aEmuJoyButtons[2] = JOY_BUTTON3; + aEmuJoyButtons[3] = JOY_BUTTON4; + return TRUE; +} + +// 呼び出す前にg_uEmuJoyIDをJOYSTICKID1かJOYSTICKID2で初期化しなければならない。 +BOOL InitJoystick() +{ +// JOYINFO joyInfo; + JOYCAPS JoyCaps; + DWORD dwRange; +// MMRESULT mmResult; + + if(!joyGetNumDevs()) + goto JOY_ERROR; + + if (joyGetDevCaps(g_uEmuJoyID, &JoyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR) + goto JOY_ERROR; + + dwRange = JoyCaps.wXmax - JoyCaps.wXmin; + // 0 -> + g_dwEmuJoyXRight = dwRange / 2 + JoyCaps.wXmin + dwRange / 4; + g_dwEmuJoyXLeft = dwRange / 2 + JoyCaps.wXmin - dwRange / 4; + + // | + // V + dwRange = JoyCaps.wYmax - JoyCaps.wYmin; + g_dwEmuJoyYDown = dwRange / 2 + JoyCaps.wYmin + dwRange / 4; + g_dwEmuJoyYUp = dwRange / 2 + JoyCaps.wYmin - dwRange / 4; + + // + if (!(JoyCaps.wCaps & JOYCAPS_HASPOV)) // Joystick has point-of-view information. + g_fUseJoyPOV = FALSE; + +// mmResult=joyGetPos(g_uEmuJoyID,&joyInfo); +// if(mmResult!=JOYERR_NOERROR) +// goto JOY_ERROR; + +// wXCenter = joyInfo.wXpos; +// wYCenter = joyInfo.wYpos; + + return TRUE; + +JOY_ERROR: +// wXCenter = 0; +// wYCenter = 0; + g_fSkipJoyRead = TRUE; + return FALSE; +} + +BOOL GetEmulatorVKeys(WORD aEmuKeys[]) +{ + if(!ReadFromRegistry(INI_EMULATOR_KEYS, + REG_BINARY, + aEmuKeys, + EMULATOR_NUM_BUTTONS * sizeof(WORD))){ + GetDefaultEmulatorKeys(aEmuKeys); + return FALSE; + } + + return TRUE; +} + +BOOL GetEmulatorJoyButtons(DWORD aEmuJoyButtons[]) +{ + if(!ReadFromRegistry(INI_EMULATOR_JOYBUTTONS, + REG_BINARY, + aEmuJoyButtons, + EMULATOR_NUM_JOYBUTTONS * sizeof(DWORD))){ + GetDefaultEmulatorJoyButtons(aEmuJoyButtons); + return FALSE; + } + + return TRUE; +} + +// NOTE : レジストリへの書き込みは、keys.cのダイアログコールバック関数内でOKボタンを押した時に行われる。 + +BOOL LoadEmuKeySetting() +{ + WORD wKeys[EMULATOR_NUM_BUTTONS] = {0}; + DWORD dwJoyButtons[EMULATOR_NUM_JOYBUTTONS] = {0}; + BOOL blRetk, blRetj; + + blRetk = GetEmulatorVKeys(&wKeys[0]); + + SetEmulatorKeys(&wKeys[0]); + + blRetj = GetEmulatorJoyButtons(&dwJoyButtons[0]); + + SetEmulatorJoyButtons(&dwJoyButtons[0]); + + return (blRetk && blRetj) ? TRUE : FALSE; +} + +/****************** + + + +********************/ +// +#define ENABLE_JOYSTICK_RELATED_CONTROLS(H, E) {EnableWindow(GetDlgItem((H), IDC_JOYSTICKID), (E)); \ + EnableWindow(GetDlgItem((H), IDC_USEPOV), (E)); \ + EnableWindow(GetDlgItem((H), IDC_STATIC_JOYSTICKID), (E));} + +LRESULT CALLBACK EmulatorOptionDlgProc( HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam) +{ + switch (message) + { + case WM_INITDIALOG: + { + LPPROPSHEETPAGE lpPropPage=(LPPROPSHEETPAGE)lParam; + LPTSTR szBuf = GetTempStringBuffer(); + DWORD N; + + if(lpPropPage->lParam) + CenterPropatySheet(hDlg); + + // use MMX + if(g_fUseMMX) + CheckDlgButton(hDlg,IDC_SPEEDOPTIMIZE,BST_CHECKED); + + if(!IsMMXAvailable()){ + g_fUseMMX=FALSE; + CheckDlgButton(hDlg,IDC_SPEEDOPTIMIZE,BST_UNCHECKED); + EnableWindow(GetDlgItem(hDlg,IDC_SPEEDOPTIMIZE),FALSE); + } + + // disable joystick + if(g_fSkipJoyRead) { + CheckDlgButton(hDlg,IDC_SKIPJOYREAD,BST_CHECKED); + ENABLE_JOYSTICK_RELATED_CONTROLS(hDlg, FALSE); + } + + // joystick ID + for (N = 0;N < 2;N++) { + wsprintf(szBuf, "%s%d", STRING_EMULATOROPTION_JOYSTICK, N + 1); + SendDlgItemMessage(hDlg, IDC_JOYSTICKID, CB_ADDSTRING, 0, (LPARAM)szBuf); + } + SendDlgItemMessage(hDlg, IDC_JOYSTICKID, CB_SETCURSEL, g_uEmuJoyID == JOYSTICKID2 ? 1 : 0, 0); + + // use POV + if(g_fUseJoyPOV) + CheckDlgButton(hDlg, IDC_USEPOV, BST_CHECKED); + } + break; + case WM_COMMAND: + { + WORD wNotifyCode = HIWORD(wParam); + WORD wID = LOWORD(wParam); + switch(wID) + { + case IDC_SKIPJOYREAD: + if(wNotifyCode == BN_CLICKED) + { + BOOL fEnable = (IsDlgButtonChecked(hDlg, IDC_SKIPJOYREAD) == BST_UNCHECKED); + ENABLE_JOYSTICK_RELATED_CONTROLS(hDlg, fEnable); + } + break; + } + } + break; + case WM_NOTIFY: + { + LPNMHDR pnmh = (LPNMHDR) lParam; + switch (pnmh->code) { + case PSN_APPLY: + { + // + g_fUseMMX = FALSE; + if(BST_CHECKED==IsDlgButtonChecked(hDlg,IDC_SPEEDOPTIMIZE)) + g_fUseMMX=TRUE; + + g_fSkipJoyRead = FALSE; + if(BST_CHECKED==IsDlgButtonChecked(hDlg,IDC_SKIPJOYREAD)) + g_fSkipJoyRead=TRUE; + + g_uEmuJoyID = JOYSTICKID1; + if (SendDlgItemMessage(hDlg, IDC_JOYSTICKID, CB_GETCURSEL, 0, 0) == 1) + g_uEmuJoyID = JOYSTICKID2; + + g_fUseJoyPOV = FALSE; + if(BST_CHECKED == IsDlgButtonChecked(hDlg, IDC_USEPOV)) + g_fUseJoyPOV = TRUE; + + // ジョイスティックにおいて、それ自身や機能のうち、使用できないものは、 + // この関数内でリセットされる。 + InitJoystick(); + + return TRUE; + } + break; + } + } + break; + } + + return FALSE; +} + +#define EMULATOR_SETTING_BITS_USEMMX 0x00000008 +#define EMULATOR_SETTING_BITS_DONTUSEJOYSTICK 0x00000010 +#define EMULATOR_SETTING_BITS_JOYSTICKID 0x00000020 +#define EMULATOR_SETTING_BITS_USEPOV 0x00000040 + +void SaveEmulatorSetting() +{ + // ---- ---- ---- ---- ---- ---- -hij m--- + // m - use MMX + // j - do not use joystick + // i - joystick id (0 : JOYSTICKID1, 1 : JOYSTICKID2) + // h - use point of view + DWORD dwSetting = 0; + if (g_fUseMMX) dwSetting |= EMULATOR_SETTING_BITS_USEMMX;//8; + if (g_fSkipJoyRead) dwSetting |= EMULATOR_SETTING_BITS_DONTUSEJOYSTICK;//0x10; + if (g_uEmuJoyID == JOYSTICKID2) dwSetting |= EMULATOR_SETTING_BITS_JOYSTICKID; + if (g_fUseJoyPOV) dwSetting |= EMULATOR_SETTING_BITS_USEPOV; + WriteToRegistry(INI_EMULATOR_SETTING, REG_DWORD, &dwSetting, sizeof(DWORD)); +} + +BOOL LoadEmulatorSetting() +{ + // + DWORD dwSetting; + if(ReadFromRegistry(INI_EMULATOR_SETTING,REG_DWORD, &dwSetting, sizeof(DWORD))) + { + g_fUseMMX = (dwSetting & EMULATOR_SETTING_BITS_USEMMX) ? TRUE : FALSE; + g_fSkipJoyRead = (dwSetting & EMULATOR_SETTING_BITS_DONTUSEJOYSTICK) ? TRUE : FALSE; + g_uEmuJoyID = (dwSetting & EMULATOR_SETTING_BITS_JOYSTICKID) ? JOYSTICKID2 : JOYSTICKID1; + g_fUseJoyPOV = (dwSetting & EMULATOR_SETTING_BITS_USEPOV) ? TRUE : FALSE; + return TRUE; + } + return FALSE; +} + + + +/****************** + + グラフィックス + +*******************/ + +HPALETTE CreateNESPalette(HDC hdc) +{ + HPALETTE hPal = NULL; + LOGPALETTE *plogpal; + UINT n; + + if(hdc == NULL || !(GetDeviceCaps(hdc, RASTERCAPS) & RC_PALETTE)) return FALSE; + + // Reset system palette + SetSystemPaletteUse(hdc,SYSPAL_NOSTATIC); + SetSystemPaletteUse(hdc,SYSPAL_STATIC); + + //GetDeviceCaps(hdc,NUMRESERVED); + + plogpal = Malloc(sizeof(LOGPALETTE) + EMULATOR_NES_COLORS * sizeof(PALETTEENTRY)); + if(!plogpal) return NULL; + + plogpal->palVersion = 0x300; + plogpal->palNumEntries = EMULATOR_NES_COLORS; + + for(n = 0; n < EMULATOR_NES_COLORS; n++){ + plogpal->palPalEntry[n].peRed = rgbNESPal[n].rgbRed; + plogpal->palPalEntry[n].peGreen = rgbNESPal[n].rgbGreen; + plogpal->palPalEntry[n].peBlue = rgbNESPal[n].rgbBlue; + plogpal->palPalEntry[n].peFlags = PC_NOCOLLAPSE; + } + + hPal = CreatePalette(plogpal); + + Mfree(plogpal); + + return hPal; +} + +HPALETTE GetEmulatorPalette() +{ + return g_hPal; +} + + +static void TrashGraphics() +{ + if(ghOldBmOffScreen) SelectObject(ghMemdcOffScreen,ghOldBmOffScreen); + ghOldBmOffScreen=NULL; + if(ghBmOffScreen) DeleteObject(ghBmOffScreen); + ghBmOffScreen=NULL; + if(ghMemdcOffScreen)DeleteDC(ghMemdcOffScreen); + ghMemdcOffScreen=NULL; + if(g_hPal) DeleteObject(g_hPal); + g_hPal=NULL; + + if(g_lpBmInfo) Mfree(g_lpBmInfo); +} + + +// +BOOL InitGraphics(HWND hWnd) +{ + HDC hdc; + int iDevCaps; + + hdc = GetDC(hWnd); + + // + iDevCaps=GetDeviceCaps(hdc,RASTERCAPS); + if(!(iDevCaps&RC_DIBTODEV)){ + ReleaseDC(hWnd,hdc); + return FALSE; + } + + g_hPal = CreateNESPalette(hdc); + + ReleaseDC(hWnd,hdc); + + // + g_lpBmInfo = Malloc(sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)); + if(!g_lpBmInfo) return FALSE; + + memset(g_lpBmInfo, 0, sizeof(BITMAPINFO)); + g_lpBmInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + g_lpBmInfo->bmiHeader.biWidth = NES_SCREENSIZEX; + g_lpBmInfo->bmiHeader.biHeight = -NES_SCREENSIZEY; + g_lpBmInfo->bmiHeader.biBitCount = 8; + g_lpBmInfo->bmiHeader.biPlanes = 1; + + memcpy(g_lpBmInfo->bmiColors, rgbNESPal, EMULATOR_NES_COLORS * sizeof(RGBQUAD)); + + ghMemdcOffScreen = CreateCompatibleDC(NULL); + if(!ghMemdcOffScreen) + return FALSE; + + ghBmOffScreen = CreateDIBSection(ghMemdcOffScreen, + (LPBITMAPINFO)g_lpBmInfo, + DIB_RGB_COLORS, + &gpbBmBufOffScreen, + NULL, + 0); + + if(!ghBmOffScreen) + return FALSE; + + ghOldBmOffScreen = SelectObject(ghMemdcOffScreen, ghBmOffScreen); + if(!ghOldBmOffScreen) + return FALSE; + + ClearEmuBackBuffer(); + + return TRUE; +} + +void ClearEmuBackBuffer() +{ + if(ghMemdcOffScreen){ + RECT rc; + DWORD dwColor = GetSysColor(COLOR_WINDOW); + + SetRect(&rc, 0, 0, NES_SCREENSIZEX, NES_SCREENSIZEY); + FillRect(ghMemdcOffScreen, &rc,(HBRUSH) (COLOR_WINDOW + 1)); + } +} + +void SetEmuBackBufferPallete(LPBYTE lpPalData) +{ + int n; + + if(!ghMemdcOffScreen || !g_lpBmInfo) return; + + if(lpPalData){ + for(n = 0; n < 0x20; n++){ + if(lpPalData[n] > 63) continue; + memcpy(&g_lpBmInfo->bmiColors[n], &rgbNESPal[lpPalData[n]], sizeof(RGBQUAD)); + } + } + else{ + for(n = 0; n < 0x20; n++){ + SetDIBColorTable(ghMemdcOffScreen, n, 1, &g_lpBmInfo->bmiColors[n]); + } + } +} + +static void RefreshSpriteLine(DWORD dwLine) +{ + int x,y2; + DWORD y; + int iPosX; + int i; + int iFlipX,iFlipY,iCol; + int iPriority; + int iIndex; +// int iSize;// + BYTE *pbChrBase; + LPBYTE lpbBase=gpbBmBufOffScreen+dwLine*NES_SCREENSIZEX; + int iPtr; + LPBYTE pbVBuf; + +// int iSpritesPerLine = 0; + +#define iSize 8 // iSize=(bPPUCtrlReg1&0x20)?16:8; +/* + i=0x100; + for(;;) + { +SKIP: + + //C version + //i-=4; + //if(i<0) break; + //y = pbSPRRAM[i] + 1; + + //if ( ( y > dwLine ) || ( y + iSize <= dwLine ) ) continue; + + // Asm version + __asm { + mov eax,i + sub eax,4 + cmp eax,0 + jge NEXT + jmp BREAK +NEXT: + // y = pbSPRRAM[i] + 1; + xor ecx,ecx // y==ecx + mov cl,byte ptr pbSPRRAM[eax] + inc ecx + mov i,eax + mov y,ecx + + mov edx, dwLine + cmp ecx, edx + jg SKIP + add ecx,iSize + cmp edx,ecx + jge SKIP + } +*/ + +// bPPUStaReg &= 0xDF; + + for(i=0xFC;i>=0;i-=4) + { + y = pbSPRRAM[i] + 1; + + if ( ( y > dwLine ) || ( y + iSize <= dwLine ) ) continue; + + //iSpritesPerLine++; + + // C version + /* + iIndex = pbSPRRAM[i+1]; + iCol = (pbSPRRAM[i+2]&0x03); + iFlipX = (pbSPRRAM[i+2]&0x40); + iFlipY = (pbSPRRAM[i+2]&0x80); + iPriority = (pbSPRRAM[i+2]&0x20); + x = pbSPRRAM[i+3]; + */ + + // asm version + __asm { + mov ebx,i + xor edx,edx + mov dl,byte ptr (pbSPRRAM+1)[ebx] + mov iIndex,edx + + mov dl,byte ptr (pbSPRRAM+2)[ebx] + + mov eax, edx + and eax, 3 + mov iCol, eax + + mov eax, edx + and eax, 0x40 + mov iFlipX, eax + + mov eax, edx + and eax, 0x80 + mov iFlipY, eax + + and edx, 0x20 + mov iPriority, edx + + mov dl,byte ptr (pbSPRRAM+3)[ebx] + mov x, edx + + } + + + y2 = dwLine - y; + if (iFlipY) y2 = (iSize - 1) - y2; + + /* + if(iSize==16)//スーパーマリオは、8*8 + { + if((iIndex&0x01)) + { + iIndex&=0xFE; + iIndex|=0x100; + } + if(y2>7) + { + iIndex++; + y2&=0x07; + } + } + */ + +// pbChrBase=pbVRAM+(iIndex<<4)+y2; +// if(bPPUCtrlReg1&0x08 && iSize==8) pbChrBase+=0x1000; + + pbChrBase= pbVROMData + iIndex * 64 + y2 * 8; + if((bPPUCtrlReg1 & 0x08) /*&& iSize==8*/) pbChrBase += 0x4000; + + iCol = (iCol << 2) + 0x10; + + if(iPriority) + { + pbVBuf = lpbBase + x; + if(iFlipX) + { + for(iPosX = 7; iPosX >= 0; pbVBuf++) + { + iPtr = pbChrBase[iPosX--]; + if(iPtr && (!(*pbVBuf & 0x03)||(*pbVBuf & 0x10))) + *pbVBuf = iCol + iPtr; + } + } + else + { + for(iPosX = 0; iPosX < 8; pbVBuf++) + { + iPtr = pbChrBase[iPosX++]; + if(iPtr && (!(*pbVBuf & 0x03)||(*pbVBuf & 0x10)))//if(BACKCOLORINDEX==*pbVBuf && iPtr) + *pbVBuf = iCol + iPtr; + } + } + } + else + { + pbVBuf = lpbBase + x; + if(iFlipX) + { + pbChrBase += 7; + for(iPosX = 7; iPosX-- >= 0; pbChrBase--, pbVBuf++){ + if(!*pbChrBase) continue; + *pbVBuf = iCol + (*pbChrBase); + } + } + else + { + for(iPosX = 0; iPosX++ < 8; pbChrBase++, pbVBuf++) + { + if(!*pbChrBase) continue; + *pbVBuf = iCol + (*pbChrBase); + } + } + } /* if(iPriority) else*/ + } /* for */ + +// if(iSpritesPerLine > 7) +// { +// bPPUStaReg |= 0x20; +// } + + + return; +} + + +static void RefreshBackGroundLine(register WORD wLine) +{ + int x; + int iTileIndex; + int iPixelX; + int iStartY; +// int iStartYModEight; + int iNameTable; + LPBYTE lp_pbVROMData_iBase_iStartYModEight; + int iFirst=1; + LPBYTE pbChrBase; + LPBYTE pbVideoBuf=gpbBmBufOffScreen+wLine*NES_SCREENSIZEX; + int iColorByte; + int iCol; + LARGE_INTEGER qwCol64; + + iPixelX=((bBGScrlH & 7) ^ 7 ) - 7; + + iStartY = wLine; //iStartY = bBGScrlV + wLine; +// iStartYModEight=((iStartY&7)<<3); + iNameTable=(((bPPUCtrlReg1 & 0x03) * 0x400) | 0x2000); + + /* + //縦スクロール + if(iStartY>239) + { + iStartY-=240; + //対になるネームテーブルのアドレスの計算 + iNameTable^=0x800; + } + */ + + //タイルの計算 + x = bBGScrlH >> 3; + iTileIndex = iNameTable + ((iStartY / 8) * 32);// iTileIndex=((iStartY>>3)<<5)+iNameTable; + + lp_pbVROMData_iBase_iStartYModEight = pbVROMData + ((iStartY & 7) << 3);//iStartYModEight=((iStartY&7)<<3); + + if (bPPUCtrlReg1 & 0x10) lp_pbVROMData_iBase_iStartYModEight += 0x4000; + + while(iPixelX < 256) + { + int iIndex1 = iTileIndex + x; + + if((!(x & 1)) || iFirst){ + //アトリビュートテーブルのデータを取得 + if((!(x & 3)) || iFirst){ + +// iColorByte = pbVRAM[((iIndex1&0x3C00)|(iIndex1&0x1F)>>2)|((iIndex1&0x380)>>4)|0x3C0]; + __asm { + mov eax, iIndex1 + + mov ecx, eax + sar eax, 4 + and ch, 0x3C // --xx xx-- ---- ---- + + and eax, 0x0038 // ---- ---- --xx x--- + sar cl, 2 + and cl, 0x07 // ---- ---- ---- -xxx + + or eax, 0x03C0 + + or ecx, eax // ---- --11 11-- ---- + + xor edx, edx + mov dl, byte ptr pbVRAM[ecx] + mov iColorByte, edx + } + } + + //アトリビュートデータのどの2ビットを使用するかを計算 + /* + int iColorBits= ( (iIndex1&0x40)>>4 ) + (iIndex1&0x02) ; + iCol = ( (iColorByte>>iColorBits) & 0x03 ) ; + iCol<<=2; + */ + iCol = (((iColorByte >> ((iIndex1 & 0x02) | ((iIndex1 & 0x40) >> 4))) & 0x03) << 2) ; + iFirst = 0; + + if (g_fUseMMX) { + memset(&qwCol64, iCol, 8); + } + } + + pbChrBase = lp_pbVROMData_iBase_iStartYModEight + (pbVRAM[iIndex1] << 6)/**64*/; + + // C version +/* + { + int n; + n = (iPixelX>0) ? 0 : -iPixelX ; + pbChrBase += n; + + do{ + if(*pbChrBase) *pbVideoBuf = iCol+(*pbChrBase); + pbVideoBuf++; + pbChrBase++; + }while(++n<8); + iPixelX+=8; + } +*/ + + if(!g_fUseMMX){ + // asm version + __asm { + // n = (iPixelX<0) ? 8+iPixelX : 8 ; + // if(iPixelX<0)pbChrBase -= iPixelX; <- もしかするとこの部分がおかしい??(スクロールがスムーズでないことの原因?) + // カウントレジスタ + mov edx, iPixelX + mov ecx, 8 // n + mov esi, pbChrBase + mov edi, pbVideoBuf + cmp edx, 0 + jge L1 + add ecx, edx + sub esi, edx +L1: + // iPixelX+=8; + add iPixelX, 8 + // save counter + mov ebx, ecx + //cld + rep movs + // + mov pbChrBase, esi + mov pbVideoBuf, edi + // *pbVideoBuf |= iCol; + mov eax, iCol //iCol + sub edi, ebx + or [edi], eax + or [edi+1], eax + or [edi+2], eax + or [edi+3], eax + or [edi+4], eax + or [edi+5], eax + or [edi+6], eax + or [edi+7], eax + } + + if(++x & 0x20){ + x = 0; + iTileIndex ^= 0x400; + } + } + else{ + // asm version + __asm { + // n = (iPixelX<0) ? 8+iPixelX : 8 ; + // if(iPixelX<0)pbChrBase -= iPixelX; + // カウントレジスタ + mov ecx, 8 // n + mov esi, pbChrBase + mov edi, pbVideoBuf + mov edx, iPixelX + cmp edx,0 + jge L1MMX + add ecx, edx + sub esi, edx +L1MMX: + add pbVideoBuf, ecx + add iPixelX,8 + add pbChrBase, 8 + // + movq mm0,[esi] + // *pbVideoBuf |= iCol; + por mm0,qwCol64 + movq [edi], mm0 + /* + mov esi, edi + mov eax, iCol //iCol + rep stos + por mm0,[esi] + */ + + emms + } + if(++x&0x20){ + x=0; + iTileIndex^=0x400; + } + } + } +} + +static void RefreshLine(WORD wLine) +{ + if(bPPUCtrlReg2 & 0x08) + RefreshBackGroundLine(wLine); + else{ + //memset(gpbBmBufOffScreen + wLine * NES_SCREENSIZEX, 0, NES_SCREENSIZEX); + __asm { + mov edi, gpbBmBufOffScreen + xor edx, edx + mov dx, wLine + shl edx, 8 + add edi, edx + mov ecx, NES_SCREENSIZEX + mov al, 0 + rep stos + } + } + + if(bPPUCtrlReg2 & 0x10) + RefreshSpriteLine(wLine); + +} + +/******************************** + + キャラロムがエディットされたら + この関数を呼び出す必要がある + +*********************************/ +BOOL PrepareVROMData(BYTE *pbSource) +{ + BYTE *pbVROMDataPointer; + BYTE *pbVROMPointer; + int iByte; + int iBit; + int iIndex; + + if(IsBadReadPtr(pbSource, SMB_CHR_SIZE)) return FALSE; + + pbVROMDataPointer = pbVROMData; + pbVROMPointer = pbSource; + + for (iIndex = 0; iIndex < 0x200; iIndex++) + { + for (iByte = 0; iByte < 8; iByte++) + { + for (iBit = 7; iBit >= 0; iBit--) + { + *pbVROMDataPointer = ((pbVROMPointer[8] >> iBit) & 0x01); + *pbVROMDataPointer <<= 1; + *pbVROMDataPointer |= ((pbVROMPointer[0] >> iBit) & 0x01); + + pbVROMDataPointer++; + } + + pbVROMPointer++; + } + pbVROMPointer += 8; + } + + return TRUE; +} + + +/**************************** + + Functions for NES Register + +*****************************/ +UINT8 RdNESReg(UINT32 Addr,struct MemoryReadByte *psMemRead) +{ + register BYTE bRet; + switch (Addr) + { + case 0x2002: + { + bRet = bPPUStaReg; + bPPUStaReg &= 0x7F;//Unset vblank flag + if(g_bInVBlank) bPPUCtrlReg1 &= 0xFC; + blBGIsVertical = + g_blVRAMAddrLow = FALSE; + return bRet; + } + case 0x4016: + { +// JOYINFO joyInfo; + JOYINFOEX JoyInfoEx; + + //ジョイスティックの状態をトラップ + if(!g_fSkipJoyRead) { +// joyGetPos(g_uEmuJoyID,&joyInfo); + JoyInfoEx.dwSize = sizeof(JOYINFOEX); + JoyInfoEx.dwFlags = g_fUseJoyPOV ? JOY_RETURNX | JOY_RETURNY | JOY_RETURNBUTTONS | JOY_RETURNPOV : JOY_RETURNX | JOY_RETURNY | JOY_RETURNBUTTONS ; + joyGetPosEx(g_uEmuJoyID, &JoyInfoEx); + } + bRet=0x40; + switch(bJoy1Read++) + { + case 0://A + if (GetAsyncKeyState(g_EmuKey[0]) + ||(!g_fSkipJoyRead && (JoyInfoEx.dwButtons&g_EmuJoyButton[0])))//JOY_BUTTON2))) + bRet|=0x01; + break; + case 1://B + if (GetAsyncKeyState(g_EmuKey[1]) + ||(!g_fSkipJoyRead && (JoyInfoEx.dwButtons&g_EmuJoyButton[1])))//JOY_BUTTON1))) + bRet|=0x01; + break; + case 2://SELECT + if (GetAsyncKeyState(g_EmuKey[2]) + ||(!g_fSkipJoyRead && (JoyInfoEx.dwButtons&g_EmuJoyButton[2])))//JOY_BUTTON3))) + bRet|=0x01; + break; + case 3://START + if (GetAsyncKeyState(g_EmuKey[3]) + ||(!g_fSkipJoyRead && (JoyInfoEx.dwButtons&g_EmuJoyButton[3])))//JOY_BUTTON4))) + bRet|=0x01; + break; + case 4://UP + if (GetAsyncKeyState(g_EmuKey[4]) + || (!g_fSkipJoyRead && + ( + (JoyInfoEx.dwYpos < g_dwEmuJoyYUp) || (g_fUseJoyPOV && JoyInfoEx.dwPOV == JOY_POVFORWARD) + ) + ) + ) + bRet|=0x01; + break; + case 5://DOWN + if (GetAsyncKeyState(g_EmuKey[5]) + || (!g_fSkipJoyRead && + ( + (JoyInfoEx.dwYpos > g_dwEmuJoyYDown) || (g_fUseJoyPOV && JoyInfoEx.dwPOV == JOY_POVBACKWARD) + ) + ) + ) + bRet|=0x01; + break; + case 6://LEFT + if (GetAsyncKeyState(g_EmuKey[6]) + || (!g_fSkipJoyRead && + ( + (JoyInfoEx.dwXpos < g_dwEmuJoyXLeft) || (g_fUseJoyPOV && JoyInfoEx.dwPOV == JOY_POVLEFT) + ) + ) + ) + bRet|=0x01; + break; + case 7://RIGHT + if (GetAsyncKeyState(g_EmuKey[7]) + || (!g_fSkipJoyRead && + ( + (JoyInfoEx.dwXpos > g_dwEmuJoyXRight) || (g_fUseJoyPOV && JoyInfoEx.dwPOV == JOY_POVRIGHT) + ) + ) + ) + bRet|=0x01; + break; + }/* switch */ + + if(gblDemoRecord) + DemoRecorderHandler((BYTE)(bJoy1Read-1),bRet); + + return bRet; + } + case 0x4017: + { +// JOYINFO joyInfo; + JOYINFOEX JoyInfoEx; + + //ジョイスティックの状態をトラップ + if(!g_fSkipJoyRead) { +// joyGetPos(g_uEmuJoyID,&joyInfo); + JoyInfoEx.dwSize = sizeof(JOYINFOEX); + JoyInfoEx.dwFlags = g_fUseJoyPOV ? JOY_RETURNX | JOY_RETURNY | JOY_RETURNBUTTONS | JOY_RETURNPOV : JOY_RETURNX | JOY_RETURNY | JOY_RETURNBUTTONS ; + joyGetPosEx(g_uEmuJoyID, &JoyInfoEx); + } + bRet=0x40; + switch(bJoy2Read++) + { + case 0://A + if (GetAsyncKeyState(g_EmuKey[0]) + ||(!g_fSkipJoyRead && (JoyInfoEx.dwButtons&g_EmuJoyButton[0])))//JOY_BUTTON2))) + bRet|=0x01; + break; + case 1://B + if (GetAsyncKeyState(g_EmuKey[1]) + ||(!g_fSkipJoyRead && (JoyInfoEx.dwButtons&g_EmuJoyButton[1])))//JOY_BUTTON1))) + bRet|=0x01; + break; + case 2://SELECT + if (GetAsyncKeyState(g_EmuKey[2]) + ||(!g_fSkipJoyRead && (JoyInfoEx.dwButtons&g_EmuJoyButton[2])))//JOY_BUTTON3))) + bRet|=0x01; + break; + case 3://START + if (GetAsyncKeyState(g_EmuKey[3]) + ||(!g_fSkipJoyRead && (JoyInfoEx.dwButtons&g_EmuJoyButton[3])))//JOY_BUTTON4))) + bRet|=0x01; + break; + case 4://UP + if (GetAsyncKeyState(g_EmuKey[4]) + || (!g_fSkipJoyRead && + ( + (JoyInfoEx.dwYpos < g_dwEmuJoyYUp) || (g_fUseJoyPOV && JoyInfoEx.dwPOV == JOY_POVFORWARD) + ) + ) + ) + bRet|=0x01; + break; + case 5://DOWN + if (GetAsyncKeyState(g_EmuKey[5]) + || (!g_fSkipJoyRead && + ( + (JoyInfoEx.dwYpos > g_dwEmuJoyYDown) || (g_fUseJoyPOV && JoyInfoEx.dwPOV == JOY_POVBACKWARD) + ) + ) + ) + bRet|=0x01; + break; + case 6://LEFT + if (GetAsyncKeyState(g_EmuKey[6]) + || (!g_fSkipJoyRead && + ( + (JoyInfoEx.dwXpos < g_dwEmuJoyXLeft) || (g_fUseJoyPOV && JoyInfoEx.dwPOV == JOY_POVLEFT) + ) + ) + ) + bRet|=0x01; + break; + case 7://RIGHT + if (GetAsyncKeyState(g_EmuKey[7]) + || (!g_fSkipJoyRead && + ( + (JoyInfoEx.dwXpos > g_dwEmuJoyXRight) || (g_fUseJoyPOV && JoyInfoEx.dwPOV == JOY_POVRIGHT) + ) + ) + ) + bRet|=0x01; + break; + }/* switch */ + + // Note : DemoRecorderHandler()関数を2Conで呼び出してはいけない。 + + return bRet; + } + case 0x2007://Read + { + if(blVRAMFirstRead){ + blVRAMFirstRead=FALSE; + return 0x00; + } + bRet = pbVRAM[wVRAMAddr]; + wVRAMAddr += (bPPUCtrlReg1&0x4) ? 32 : 1 ; + return bRet; + } + case 0x2004: + { + bRet=pbSPRRAM[bSPRRAMAddr++]; + return bRet; + } + } + return 0; +} + +void WrNESReg(UINT32 Addr, UINT8 Value, struct MemoryWriteByte *psMemWrite) +{ + switch (Addr) + { + case 0x2000: + bPPUCtrlReg1=Value; + break; + case 0x2001: + bPPUCtrlReg2=Value; + break; + case 0x2005: + if(!blBGIsVertical){ + bBGScrlH=Value; + blBGIsVertical=TRUE; + break; + } + else{ + //bBGScrlV=Value; + blBGIsVertical=FALSE; + break; + } + break; + case 0x2006://Address Write + blVRAMFirstRead=TRUE; + if(g_blVRAMAddrLow){ + wVRAMAddr = (wVRAMAddr & 0xFF00) | Value ; + g_blVRAMAddrLow=FALSE; + break; + } + else{ + wVRAMAddr = (wVRAMAddr & 0xFF) | (Value<<8) ; + g_blVRAMAddrLow=TRUE; + break; + } + case 0x2007: + { + if((wVRAMAddr&0x3000)==0x2000) + pbVRAM[wVRAMAddr]=pbVRAM[wVRAMAddr^0x800]=Value; + else if(0x3f00 <= wVRAMAddr)//Write to Palette + { + if(wVRAMAddr&0x0003){ + pbVRAM[wVRAMAddr]=Value; + memcpy(&g_lpBmInfo->bmiColors[wVRAMAddr&0x1F],&rgbNESPal[Value],sizeof(RGBQUAD)); + } + //Palette mirror + else if(!(wVRAMAddr&0x000F) && gbBGColor!=Value) + { + register int i=0; + for(;i<8;i++){ + pbVRAM[0x3f00|(i<<2)]=Value; + memcpy(&g_lpBmInfo->bmiColors[(i<<2)],&rgbNESPal[Value],sizeof(RGBQUAD)); + } + //バックグラウンドの色データ + gbBGColor=Value; + } + } + + wVRAMAddr += (bPPUCtrlReg1&0x4) ? 32 : 1 ; + } + break; + case 0x4014: + memcpy(pbSPRRAM,psM6502->m6502Base+(0x100*Value),0x100); + break; + case 0x4016: + bJoy1Read=bJoy2Read=0; + break; + case 0x2002: + break; + case 0x2003: + bSPRRAMAddr=Value; + break; + case 0x2004: + pbSPRRAM[bSPRRAMAddr++]=Value; + break; + } +} + +/********************** + + Functions for M6502 + +***********************/ +static int GetFirstNonTransparentLine(BYTE bTile) +{ + BYTE *pbTileData; + BYTE pbZero[8]={0}; + static int i; + + if(bTile==wSprite0Tile) return i; + + wSprite0Tile=bTile; + + pbTileData=(bPPUCtrlReg1&0x08)?pbVROMData+0x4000+64*bTile:pbVROMData+64*bTile; + for(i=0;i++<7;pbTileData+=8){ + if(memcmp(pbTileData,pbZero,8)) break; + } + return i; +} + + +static WORD ExecuteCPU() +{ + // Execute CPU + m6502zpexec(113); + // Increment scanline + wScanline++; + // Set hity flag, if necessary + if(wScanline == pbSPRRAM[0] + GetFirstNonTransparentLine(pbSPRRAM[1])) + bPPUStaReg|=0x40; + // + if(wScanline > 7 && wScanline < 232) { + // Update scanline + RefreshLine(wScanline); + return wScanline; + } + else if(wScanline == NES_SCANLINE_VBLANK) { + PostMessage(GETFRAMEWNDHANDLE(ghEmuWnd), WM_UPDATEFRAME, 0, 0); //g_fUpdate = TRUE; + // VBlank begins + g_bInVBlank = TRUE; + // Set vblank flag + bPPUStaReg |= 0x80; + // if nessesary, execute NMI. + if(bPPUCtrlReg1 & 0x80) m6502zpnmi(); + return wScanline; + } + else if(wScanline == NES_SCANLINE_BOTTOM) { + // VBlank ends + g_bInVBlank = FALSE; + // Clear VBlank flag and hity flag + bPPUStaReg &= 0x30; + // Reset scanline + wScanline = 0; + return wScanline; + } + + return wScanline; +} + +void CALLBACK Run6502(UINT uID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2) +{ + if(gblPause) return; + + while(ExecuteCPU()); + + return; +} + +/*********************** + + used for Map Viewering + +************************/ + +_inline void ExecuteCPUNoRefreshScreen(int *lpiScanlines) +{ + m6502zpexec(113); + if(g_wPrevPC==m6502zppc){ + // detect a follow code. + // addr1 : jmp addr1 + LPBYTE lpbOpCode=&psM6502->m6502Base[m6502zppc]; + if(lpbOpCode[0]==0x4C + && lpbOpCode[1]==(m6502zppc&0xFF) + && lpbOpCode[2]==(m6502zppc>>8)){ + if(wScanline<242){ + (*lpiScanlines)-=(241-wScanline); + wScanline=241; + } + } + } + g_wPrevPC = m6502zppc; + + wScanline++; + + if(wScanline == pbSPRRAM[0]){ + bPPUStaReg |= 0x40; + } + + if(wScanline == 242){ + bPPUStaReg |= 0x80; //Set vblank flag + if(bPPUCtrlReg1 & 0x80){ + m6502zpnmi(); + } + } + else if(wScanline == 263){ + bPPUStaReg &= 0x30; //Unset vblank flag and hity flag + wScanline = 0; + } +} + +void Run6502Ex(int iFrames) +{ + register int n = 0; + + if(gblExecute) return; + + for(;;){ + if(++n <= iFrames) { + ExecuteCPUNoRefreshScreen(&iFrames); + continue; + } + break; + } +} + +void DrawAllScanline() +{ + WORD w; + for(w = 8; w < 239; w++) RefreshLine(w); +} + +/********************** + + memory map + +***********************/ +struct MemoryWriteByte NESWrite[] = +{ + {0x2000, 0x6FFF, WrNESReg}, + {(UINT32) -1, (UINT32) -1, NULL} +}; + +struct MemoryReadByte NESRead[] = +{ + {0x2000, 0x6FFF, RdNESReg}, + {(UINT32) -1, (UINT32) -1, NULL} +}; + +struct MemoryWriteByte NESWriteEx[] = +{ + {0x2000, 0x6FFF, WrNESReg}, + {(UINT32) -1, (UINT32) -1, NULL} +}; + +struct MemoryReadByte NESReadEx[] = +{ + {0x2000, 0x6FFF, RdNESReg}, + {(UINT32) -1, (UINT32) -1, NULL} +}; +/*************************** + + Nester Command Functions + +****************************/ + +void DestoryNester() +{ + if(psM6502) Mfree(psM6502); + psM6502=NULL; + if(pb6502CPUMemory) Mfree(pb6502CPUMemory); + pb6502CPUMemory=NULL; + + TrashGraphics(); + + if(IsEmulatorSavePresent()) FreeEmulatorSaveBuffer(); + + DeleteCriticalSection(&CriticalSection); +} + + +BOOL CreateNester() +{ + psM6502 = Malloc(m6502zpGetContextSize()); + if(!psM6502) return FALSE; + memset(psM6502, 0, m6502zpGetContextSize()); + + pb6502CPUMemory = Malloc(0x10000); + if(!pb6502CPUMemory) return FALSE; + + psM6502->m6502Base = pb6502CPUMemory; + psM6502->m6502MemoryRead = NESRead; + psM6502->m6502MemoryWrite = NESWrite; + + psM6502->m6502MemoryRead->pUserArea = psM6502; + psM6502->m6502MemoryWrite->pUserArea = psM6502; + + m6502zpSetContext(psM6502); + + InitGraphics(ghEmuWnd);//After ROMs are loaded + + InitJoystick(); + + // + InitializeCriticalSection(&CriticalSection); + + return TRUE; +} + +void ResetEmulator() +{ + m6502zpreset(); + + ClearEmuBackBuffer(); + + InitJoystick(); + + // PrepareVROMData(pbVRAM); + + //TODO ここにリセットの処理を追加してください。 + gblPause=FALSE; + gblDemoRecord=FALSE; + + g_bInVBlank=FALSE; + + blBGIsVertical=FALSE; + g_blVRAMAddrLow=FALSE; + blVRAMFirstRead=FALSE; + + wSprite0Tile=0x100; + + bJoy1Read=bJoy2Read=0x00; + + gbBGColor=0x00; + + wScanline=0x0000; + + g_wPrevPC=0; +} + + + +//blState == TRUE ->suspend, blState == FALSE ->start +BOOL SuspendEmulator(BOOL blState) +{ +// if(!hThread) return FALSE; + + if(blState) + gblPause=TRUE; + else + { + gblPause=FALSE; +// ResumeThread(hThread); + } + return TRUE; +} + +BOOL IsEmulatorSuspended() +{ + return gblPause; +} + +void StopEmulator() +{ + EnterCriticalSection(&CriticalSection); + + if(!g_nTimerID) goto RET; + + timeKillEvent(g_nTimerID); + timeEndPeriod(EMULATOR_TIMER_INTERVAL); + g_nTimerID=0; + + ClearEmuBackBuffer(); + InvalidateRect(ghEmuWnd,NULL,FALSE); + +RET: + LeaveCriticalSection(&CriticalSection); +} + +void StartEmulator() +{ + EnterCriticalSection(&CriticalSection); + + if(g_nTimerID) goto RET; + + timeBeginPeriod(EMULATOR_TIMER_INTERVAL); + g_nTimerID = timeSetEvent(EMULATOR_TIMER_INTERVAL, + 0, + (LPTIMECALLBACK)Run6502, + 0, + TIME_PERIODIC|TIME_CALLBACK_FUNCTION); + +RET: + LeaveCriticalSection(&CriticalSection); +} + +BOOL IsEmulatorRunning() +{ + return (g_nTimerID)?TRUE:FALSE; +} + +BOOL SetupEmulator(EMULATORSETUP* psEmuSetup) +{ + if(pb6502CPUMemory) + { + if(psEmuSetup->pbTRAINER) memcpy(pb6502CPUMemory+0x7000,psEmuSetup->pbTRAINER,0x200); + if(psEmuSetup->pbPRGROM) memcpy(pb6502CPUMemory+0x8000,psEmuSetup->pbPRGROM,0x8000); + if(psEmuSetup->pbCHRROM) memcpy(pbVRAM,psEmuSetup->pbCHRROM,0x2000); + if(psEmuSetup->pbVRAM) memcpy(pbVRAM+0x2000,psEmuSetup->pbVRAM,0x2000); + + if(psEmuSetup->CPUReg.blValid) + { + m6502zpGetContext(psM6502); + psM6502->m6502af=psEmuSetup->CPUReg.Reg.wAF; + psM6502->m6502pc=psEmuSetup->CPUReg.Reg.wPC; + psM6502->m6502s=psEmuSetup->CPUReg.Reg.wS; + psM6502->m6502x=psEmuSetup->CPUReg.Reg.wX; + psM6502->m6502y=psEmuSetup->CPUReg.Reg.wY; + m6502zpSetContext(psM6502); + } + } + else + return FALSE; + + return TRUE; +} + +static BOOL LoadRAMData(LPSTR ResName) +{ + HGLOBAL hRAMData; + BYTE *pbRAMData; + + hRAMData=LoadResource(NULL,FindResource(NULL,ResName,"BINARY")); + if(!hRAMData) return FALSE; + pbRAMData=(BYTE*)LockResource(hRAMData); + if(!pbRAMData){ + FreeResource(hRAMData); + return FALSE; + } + memcpy(pb6502CPUMemory,pbRAMData,0x800); + UnlockResource(hRAMData); + FreeResource(hRAMData); + return TRUE; +} + +void TestPlaySetup(TESTPLAYSETUP *psTPS) +{ + WORD wMapAddr; + BYTE bTmpBuf; + + // + if(!LoadRAMData("RAMDATA1")) return; + + //Reg + m6502zpGetContext(psM6502); + psM6502->m6502pc=0x8E16; + psM6502->m6502af=0xA493; + psM6502->m6502x=0x07; + psM6502->m6502y=0x10; + psM6502->m6502s=0xF5; + m6502zpSetContext(psM6502); + + bPPUCtrlReg1=0x10; + bPPUCtrlReg2=0x1E; + bPPUStaReg=0x00; + wScanline=0xF7; + + wVRAMAddr=0x0000; + + //ルームの属性 + pb6502CPUMemory[0x74E]=((psTPS->bRoomID>>5)&0x03); + + pb6502CPUMemory[0x750]=(psTPS->bRoomID&0x1F); + + //マップヘッダの処理 + bTmpBuf=pb6502CPUMemory[psTPS->MapAddress.word]; + + pb6502CPUMemory[0x741]=psTPS->bBackObject1; + pb6502CPUMemory[0x744]=psTPS->bBackObject2; + + pb6502CPUMemory[0x710]=((bTmpBuf>>3)&0x07);//出現位置 + + if(((bTmpBuf>>6)&0x03)) + pb6502CPUMemory[0x715]=((bTmpBuf>>6)&0x03);//持ち時間 + else{ + pb6502CPUMemory[0x715]=0x00; + pb6502CPUMemory[0x7F8]=0x00; + } + + bTmpBuf=pb6502CPUMemory[psTPS->MapAddress.word+1]; + + pb6502CPUMemory[0x727]=psTPS->bBasicBlock;//初期基本背景ブロック + + pb6502CPUMemory[0x742]=psTPS->bBackView;//初期景色 + + if(((bTmpBuf>>6)&0x03)==0x03){ + pb6502CPUMemory[0x733]=0x00; + pb6502CPUMemory[0x743]=0x03; + } + else + pb6502CPUMemory[0x733]=((bTmpBuf>>6)&0x03); + + //アドレス + wMapAddr=psTPS->MapAddress.word+2; + pb6502CPUMemory[0xE7]=(BYTE)(wMapAddr&0xFF); + pb6502CPUMemory[0xE8]=(BYTE)((wMapAddr>>8)&0xFF); + + pb6502CPUMemory[0xE9]=psTPS->BadGuysAddress.byte.bLower; + pb6502CPUMemory[0xEA]=psTPS->BadGuysAddress.byte.bUpper; + + pb6502CPUMemory[0x75F]=psTPS->bWorld; + pb6502CPUMemory[0x75C]=psTPS->bArea; + pb6502CPUMemory[0x760]=psTPS->bArea2; + + pb6502CPUMemory[0x6CC]=psTPS->bIsDifficult; + if(pb6502CPUMemory[0x903B]<=psTPS->bWorld && pb6502CPUMemory[0x9044]<=psTPS->bArea) + pb6502CPUMemory[0x6CC]=0x01; + + pb6502CPUMemory[0x725]=psTPS->bPage; + + memcpy(pb6502CPUMemory+0x72D,psTPS->bLeftObjOfs,3); + memcpy(pb6502CPUMemory+0x730,psTPS->bLeftObjNum,3); + + pb6502CPUMemory[0x734]=psTPS->bLeftObjData1;//階段 + memcpy(pb6502CPUMemory+0x736,psTPS->bLeftObjData2,3);//きのこの島の茎 + + pb6502CPUMemory[0x72C]=psTPS->bMapOfs; + pb6502CPUMemory[0x72A]=psTPS->bMapPage; + pb6502CPUMemory[0x72B]=psTPS->bMapPageFlag; + + pb6502CPUMemory[0x739]=psTPS->bBadGuysOfs; + pb6502CPUMemory[0x73A]=psTPS->bBadGuysPage; + pb6502CPUMemory[0x73B]=psTPS->bBadGuysPageFlag; + pb6502CPUMemory[0x71B]=psTPS->bBadGuysPage2; + + pb6502CPUMemory[0x7FC]=psTPS->bIsCleared; + pb6502CPUMemory[0x76A]=psTPS->bIsCleared; + + pb6502CPUMemory[0x754]=psTPS->bMarioSize; + pb6502CPUMemory[0x756]=psTPS->bMarioCap; + + //上の表示をクリアー + memset(pbVRAM+0x2000,0x24,128); + memset(pbVRAM+0x23C0,0xAA,0x40); + memset(pbVRAM+0x2400,0x24,128); + memset(pbVRAM+0x27C0,0xAA,0x40); +} + +void TestPlaySetupEx(TESTPLAYSETUPEX *psTPSEx) +{ + + if(!LoadRAMData("RAMDATA2")) return; + + //Reg + m6502zpGetContext(psM6502); + psM6502->m6502pc=0x8E16; + psM6502->m6502af=0xA48F; + psM6502->m6502x=0xFF; + psM6502->m6502y=0x02; + psM6502->m6502s=0xF9; + m6502zpSetContext(psM6502); + + // + bPPUCtrlReg1=0x10; + bPPUCtrlReg2=0x1E; + bPPUStaReg=0x40; + wScanline=0x1F; + + // + wVRAMAddr=0x0000; + + //---------------------------------- + // マリオの初期位置を設定するハック + //---------------------------------- + //00009165: B9 16 91 lda $9116,y ; 初期横位置 + if (psTPSEx->fPosXHack){ + pb6502CPUMemory[0x9165] = 0xA9; + pb6502CPUMemory[0x9166] = psTPSEx->bPosX; + pb6502CPUMemory[0x9167] = 0xEA; + } + //0000916A: BD 1C 91 lda $911C,x ; 初期縦位置 + if (psTPSEx->fPosYHack){ + pb6502CPUMemory[0x916A] = 0xA9; + pb6502CPUMemory[0x916B] = psTPSEx->bPosY; + pb6502CPUMemory[0x916C] = 0xEA; + } + + //------------- + // 無敵ハック + //------------- + if (psTPSEx->bInvincible) + { + // ファイアバー + pb6502CPUMemory[0xCE0D] = 0xA9; + pb6502CPUMemory[0xCE0E] = 0x01; + pb6502CPUMemory[0xCE0F] = 0xEA; + //普通の敵 + pb6502CPUMemory[0xD92C] = 0xA9; + pb6502CPUMemory[0xD92D] = 0x01; + pb6502CPUMemory[0xD92E] = 0xEA; + } + + //$075A:マリオの残機 + //○ミスすると-1 00でミスをするとFF -1したときの値が80-FFならゲームオーバー + + // + // + // + pb6502CPUMemory[0x715]=pb6502CPUMemory[0x7F8]=0x00; + // + pb6502CPUMemory[0x752]=0x01; + pb6502CPUMemory[0x751]=psTPSEx->bPage; + pb6502CPUMemory[0x750]=psTPSEx->bRoomID; + + pb6502CPUMemory[0x7FC]=pb6502CPUMemory[0x76A]=psTPSEx->bIsCleared; + + pb6502CPUMemory[0x6CC]=psTPSEx->bIsDifficult; + if(pb6502CPUMemory[0x903B]<=psTPSEx->bWorld + && pb6502CPUMemory[0x9044]<=psTPSEx->bArea) + pb6502CPUMemory[0x6CC]=0x01; + + pb6502CPUMemory[0x75F]=psTPSEx->bWorld; + pb6502CPUMemory[0x75C]=psTPSEx->bArea; + pb6502CPUMemory[0x760]=psTPSEx->bArea2; + + pb6502CPUMemory[0x754]=psTPSEx->bMarioSize; + pb6502CPUMemory[0x756]=psTPSEx->bMarioCap; + + // 敵を0ページから表示するハック + if(psTPSEx->bBadGuyHack){ + pb6502CPUMemory[0xC1BB]=0x4C; + pb6502CPUMemory[0xC1BC]=0xCB; + pb6502CPUMemory[0xC1BD]=0xC1; + pb6502CPUMemory[0xC1BE]=0xEA; + pb6502CPUMemory[0xC1BF]=0xEA; + } +} + +void DirectWriteToEmulatorRAM(WORD wAddr,LPBYTE lpBuf,WORD wSize) +{ + memcpy(pb6502CPUMemory+wAddr,lpBuf,wSize); +} + +/**************** + + セーブとロード + +*****************/ +typedef struct +{ + //RAM + BYTE pbRAM[0x800]; + //CPU registers + CONTEXTM6502 sM6502; + //PPU + BYTE bPPUCtrlReg1; + BYTE bPPUCtrlReg2; + BYTE bPPUStaReg; + //back ground scroll + BOOL blBGIsVertical; + BYTE bBGScrlH; + BYTE bBGScrlV; + // + WORD wScanline; + // VRAM + BYTE pbVRAM[0x2000]; + BOOL blVRAMAddrLow; + WORD wVRAMAddr; + BOOL blVRAMFirstRead; + //sprite + BYTE pbSPRRAM[0x100]; + BYTE bSPRRAMAddr; + BYTE gbBGColor; + WORD wSprite0Tile; + //JoyStick + BYTE bJoy1Read; + BYTE bJoy2Read; +}SAVERAMSTRUCT; + +SAVERAMSTRUCT *g_psSRS=NULL; + +BOOL LoadEmulatorState(EMULATORSETUP* psEmuSetup) +{ + if(!g_psSRS) return FALSE; + + ResetEmulator(); + StopEmulator(); + + if(psEmuSetup) SetupEmulator(psEmuSetup); + + memcpy(pb6502CPUMemory,g_psSRS->pbRAM,0x800); + //CPU registers + m6502zpSetContext(&g_psSRS->sM6502); + //PPU + bPPUCtrlReg1=g_psSRS->bPPUCtrlReg1; + bPPUCtrlReg2=g_psSRS->bPPUCtrlReg2; + bPPUStaReg=g_psSRS->bPPUStaReg; + //back ground scroll + blBGIsVertical=g_psSRS->blBGIsVertical; + bBGScrlH=g_psSRS->bBGScrlH; + bBGScrlV=g_psSRS->bBGScrlV; + + // + wScanline=g_psSRS->wScanline; + // VRAM + memcpy(pbVRAM+0x2000,g_psSRS->pbVRAM,0x2000); + wVRAMAddr=g_psSRS->wVRAMAddr; + g_blVRAMAddrLow=g_psSRS->blVRAMAddrLow; + blVRAMFirstRead=g_psSRS->blVRAMFirstRead; + //sprite + memcpy(pbSPRRAM,g_psSRS->pbSPRRAM,0x100); + bSPRRAMAddr=g_psSRS->bSPRRAMAddr; + gbBGColor=g_psSRS->gbBGColor; + + SetEmuBackBufferPallete(&g_psSRS->pbVRAM[0x1F00]); + + wSprite0Tile=g_psSRS->wSprite0Tile; + + //JoyStick + bJoy1Read=g_psSRS->bJoy1Read; + bJoy2Read=g_psSRS->bJoy2Read; + + StartEmulator(); + + return TRUE; +} + +BOOL IsEmulatorSavePresent() +{ + return (g_psSRS)?TRUE:FALSE; +} + +void FreeEmulatorSaveBuffer() +{ + if(g_psSRS) Mfree(g_psSRS); + g_psSRS=NULL; +} + +BOOL SaveEmulatorState() +{ + if(!g_nTimerID) return FALSE; + + if(!g_psSRS && (g_psSRS=Malloc(sizeof(SAVERAMSTRUCT)))==NULL) return FALSE; + + StopEmulator(); + memcpy(g_psSRS->pbRAM,pb6502CPUMemory,0x800); + //CPU registers + m6502zpGetContext(&g_psSRS->sM6502); + //PPU + g_psSRS->bPPUCtrlReg1=bPPUCtrlReg1; + g_psSRS->bPPUCtrlReg2=bPPUCtrlReg2; + g_psSRS->bPPUStaReg=bPPUStaReg; + //back ground scroll + g_psSRS->blBGIsVertical=blBGIsVertical; + g_psSRS->bBGScrlH=bBGScrlH; + g_psSRS->bBGScrlV=bBGScrlV; + // + g_psSRS->wScanline=wScanline; + // VRAM + memcpy(g_psSRS->pbVRAM,pbVRAM+0x2000,0x2000); + g_psSRS->wVRAMAddr=wVRAMAddr; + g_psSRS->blVRAMAddrLow=g_blVRAMAddrLow; + g_psSRS->blVRAMFirstRead=blVRAMFirstRead; + //sprite + memcpy(g_psSRS->pbSPRRAM,pbSPRRAM,0x100); + g_psSRS->bSPRRAMAddr=bSPRRAMAddr; + g_psSRS->gbBGColor=gbBGColor; + g_psSRS->wSprite0Tile=0x100;//wSprite0Tile; + //JoyStick + g_psSRS->bJoy1Read=bJoy1Read; + g_psSRS->bJoy2Read=bJoy2Read; + + LoadEmulatorState(NULL); + + return TRUE; +} + + +/******************** + + + +*********************/ + +long FAR PASCAL EmuWndProc( HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam ) +{ + static RECT rcClient; + switch(message) + { + case WM_PAINT: + { + PAINTSTRUCT ps; + HDC hdc; + + BeginPaint(hWnd, &ps); + + hdc = ps.hdc; + + SelectPalette(hdc, g_hPal, FALSE); + + RealizePalette(hdc); + + SetStretchBltMode(hdc, COLORONCOLOR); + + + StretchDIBits(hdc,//Handle to the device context. + 0, 0, rcClient.right, rcClient.bottom, + 0, 8, NES_SCREENSIZEX, NES_VISIBLESIZEY, + gpbBmBufOffScreen, + g_lpBmInfo, + DIB_RGB_COLORS, + SRCCOPY); + + EndPaint(hWnd, &ps); + + break; + } + case WM_SIZE: + GetClientRect(hWnd,&rcClient); + break; + case WM_MDIACTIVATE: + if(!IsEmulatorRunning()) + break; + if((HWND) lParam==hWnd) + SuspendEmulator(FALSE); + else + SuspendEmulator(TRUE); + break; + case WM_CREATE: + { + ghEmuWnd=hWnd; + //DisableIME + ImmAssociateContext(hWnd, (HIMC)NULL); + //Create Emulator + if(ghEmuWnd) { + //初期化するために必要な値のロードもあるのでCreateNester()の前の呼び出す。 + LoadEmulatorSetting(); + LoadEmuKeySetting(); + CreateNester(); + } + } + break; + case WM_DESTROY: + { + SaveEmulatorSetting(); + //Destroy Emulator + StopEmulator(); + DestoryNester(); + ghEmuWnd = NULL; + } + break; + case WM_SYSCOMMAND: + { + if(wParam==SC_CLOSE){ + StopEmulator(); + ShowWindow(hWnd,SW_SHOWMINIMIZED); + return 0; + } + } + break; + case WM_SIZING: + { + /* + WMSZ_BOTTOM Bottom edge + WMSZ_BOTTOMLEFT Bottom-left corner + WMSZ_BOTTOMRIGHT Bottom-right corner + WMSZ_LEFT Left edge + WMSZ_RIGHT Right edge + WMSZ_TOP Top edge + WMSZ_TOPLEFT Top-left corner + WMSZ_TOPRIGHT Top-right corner + */ + DWORD fwSide = wParam; // edge of window being sized + LPRECT lprc = (LPRECT) lParam; // screen coordinates of drag rectangle + int iSizeRate,iLength; + switch(fwSide) + { + case WMSZ_TOP: + case WMSZ_BOTTOM: + iLength=lprc->bottom-lprc->top; + iSizeRate=(iLength-EMULATOR_WINDOWFRAMESIZEY-NES_VISIBLESIZEY/2)/NES_VISIBLESIZEY; + break; + case WMSZ_RIGHT: + case WMSZ_LEFT: + iLength=lprc->right-lprc->left; + iSizeRate=(iLength-EMULATOR_WINDOWFRAMESIZEX-NES_SCREENSIZEX/2)/NES_SCREENSIZEX; + break; + case WMSZ_TOPLEFT: + case WMSZ_TOPRIGHT: + case WMSZ_BOTTOMLEFT: + case WMSZ_BOTTOMRIGHT: + iLength=lprc->bottom-lprc->top; + iSizeRate=(iLength-EMULATOR_WINDOWFRAMESIZEY-NES_VISIBLESIZEY/2)/NES_VISIBLESIZEY; + break; + } + if(iSizeRate<0) + iSizeRate=0; + iSizeRate++; + lprc->right=lprc->left+EMULATOR_WINDOWFRAMESIZEX+NES_SCREENSIZEX*iSizeRate; + lprc->bottom=lprc->top+EMULATOR_WINDOWFRAMESIZEY+NES_VISIBLESIZEY*iSizeRate; + + return TRUE; + } + break; + } + return DefMDIChildProc (hWnd, message, wParam, lParam); +} + +/************** + + +***************/ +BOOL RegisterEmuWndClass(HINSTANCE hInstance) +{ + WNDCLASS wc; + + wc.style = CS_HREDRAW | CS_VREDRAW | CS_CLASSDC; + wc.lpfnWndProc = EmuWndProc; + wc.cbClsExtra = + wc.cbWndExtra = 0; + wc.hInstance = hInstance; + wc.hIcon = LoadIcon(hInstance, "EMUICON"); + wc.hCursor = LoadCursor(NULL, IDC_ARROW); + wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); + wc.lpszMenuName = NULL; + wc.lpszClassName = EMUWNDCLASSNAME; + if(!RegisterClass(&wc)) return FALSE; + + return TRUE; +} + +HWND CreateEmulatorWnd(HINSTANCE hInstance,HWND hWndMDIClient) +{ + + HWND hWnd; + + if(ghEmuWnd) return FALSE; + + //WS_VISIBLEを指定して作成しないと、Windowメニューにウインドウが追加されない。 + hWnd=CreateMDIWindow(EMUWNDCLASSNAME, + STRING_WINDOW_EMULATOR, + WS_CAPTION|WS_THICKFRAME|WS_MINIMIZEBOX|WS_SYSMENU|WS_VISIBLE, + 30,20, + EMULATOR_WINDOWFRAMESIZEX+NES_SCREENSIZEX,EMULATOR_WINDOWFRAMESIZEY+NES_VISIBLESIZEY, + hWndMDIClient, + hInstance, + 0); + return hWnd; +} + +HWND GetEmuWndHandle(){ return ghEmuWnd;} diff --git a/src/emulator.h b/src/emulator.h new file mode 100644 index 0000000..2363fbf --- /dev/null +++ b/src/emulator.h @@ -0,0 +1,192 @@ +/************************************************************************************ + + smb Utility + + File: emulator.h + Description: + History: + + ************************************************************************************/ +#ifndef EMULATOR_H +#define EMULATOR_H + +#include "M6502.h" + +typedef struct +{ + BYTE *pbPRGROM; + BYTE *pbCHRROM; + BYTE *pbTRAINER; + BYTE *pbVRAM; + struct + { + BOOL blValid; + struct + { + WORD wAF; + WORD wPC; + BYTE wX; + BYTE wY; + BYTE wS; + }Reg; + }CPUReg; +}EMULATORSETUP; + +typedef struct +{ + union + { + struct{ + BYTE bLower; + BYTE bUpper; + }byte; + WORD word; + }BadGuysAddress; + union + { + struct{ + BYTE bLower; + BYTE bUpper; + }byte; + WORD word; + }MapAddress; + BYTE bRoomID; + BYTE bPage; + BYTE bBackView; + BYTE bBasicBlock; + BYTE bBackObject1;//$741 + BYTE bBackObject2;//$744 + BYTE bLeftObjOfs[3]; + BYTE bLeftObjNum[3]; + BYTE bLeftObjData1;//階段$734 + BYTE bLeftObjData2[3];//キノコの島$737 + BYTE bMapOfs;//$072C + BYTE bMapPage;//$072A + BYTE bMapPageFlag;//$072B + BYTE bBadGuysOfs;//$0739 + BYTE bBadGuysPage;//$073A + BYTE bBadGuysPageFlag;//$073B + BYTE bBadGuysPage2;//$071B + BYTE bWorld; + BYTE bArea; //$075C 通常のもの + BYTE bArea2;//$0760 導入面も1つのエリアに数える + BYTE bIsCleared;//0 -NO, 1 -YES + BYTE bIsDifficult; + BYTE bMarioSize;//$0756 0-large 1-small + BYTE bMarioCap;//$0754 0-normal 1-super 2-fire + BOOL blIsStatusDraw; +}TESTPLAYSETUP; + +typedef struct +{ + BYTE bRoomID; + BYTE bPage; + BYTE bWorld; + BYTE bArea;//$075C 通常のもの + BYTE bArea2;//$0760 導入面も1つのエリアに数える + BYTE bIsCleared;//0 -NO, 1 -YES + BYTE bIsDifficult; + BYTE bMarioSize;//$0756 0-large 1-small + BYTE bMarioCap;//$0754 0-normal 1-super 2-fire + BYTE bBadGuyHack; + BYTE fPosXHack; + BYTE bPosX; + BYTE fPosYHack; + BYTE bPosY; + BYTE bInvincible; +}TESTPLAYSETUPEX; + +typedef struct _tagNESCONTEXT +{ + // + CONTEXTM6502 *psM6502; + // + BYTE *pb6502CPUMemory; + //PPU Reg + BYTE bPPUCtrlReg1; + BYTE bPPUCtrlReg2; + BYTE bPPUStaReg; + //back ground scroll + BOOL blBGIsVertical; + BYTE bBGScrlH; + BYTE bBGScrlV; + //vram + WORD wVRAMAddr; + BYTE *pbVRAM; + BOOL blVRAMFirstRead; + BYTE bBGColor; + //sprite + BYTE bSPRRAMAddr; + BYTE *pbSPRRAM; + // + BYTE bJoy1Read; + BYTE bJoy2Read; + //current scanline + WORD wScanline; +}NESCONTEXT,FAR *LPNESCONTEXT; + +// +BOOL RegisterEmuWndClass(HINSTANCE hInstance); +HWND CreateEmulatorWnd(HINSTANCE hInstance,HWND hWndMDIClient); +BOOL PrepareVROMData(BYTE *pbSource); +//エミュレータ ウインドウの基本制御 +void StartEmulator(void); +void StopEmulator(void); +BOOL SuspendEmulator(BOOL blState);//blState == TRUE ->suspend, blState == FALSE ->start +void ResetEmulator(void); +BOOL SetupEmulator(EMULATORSETUP* psEmuSetup); + +void ClearEmuBackBuffer(); + +void SetEmuBackBufferPallete(LPBYTE lpPalData); + +//HPALETTE GetEmulatorPalette(); +//BOOL RestoreEmulatorPalette(HDC hdc); + + +BOOL IsEmulatorRunning(); + +BOOL IsEmulatorSavePresent(); +void FreeEmulatorSaveBuffer(); +BOOL SaveEmulatorState(); +BOOL LoadEmulatorState(EMULATORSETUP* psEmuSetup); +// +void DrawAllScanline(); +void Run6502Ex(int iFrames); + +HWND GetEmuWndHandle(void); + +void TestPlaySetup(TESTPLAYSETUP *psTPS); +void TestPlaySetupEx(TESTPLAYSETUPEX *psTPS); +void DirectWriteToEmulatorRAM(WORD wAddr,LPBYTE lpBuf,WORD wSize); + +LRESULT CALLBACK EmulatorOptionDlgProc( HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam); + +BOOL LoadEmuKeySetting(); + +// キーボードのボタン WORD型の要素数EMULATOR_NUM_BUTTONSの配列 +BOOL GetEmulatorVKeys(WORD aEmuKeys[]); +BOOL GetDefaultEmulatorKeys(WORD aEmuKeys[]); +// ジョイスティックのボタン DWORD型の要素数EMULATOR_NUM_JOYBUTTONSの配列 +BOOL GetEmulatorJoyButtons(DWORD aEmuJoyButtons[]); + + +// 方向キーを含めたボタン数 +#define EMULATOR_NUM_BUTTONS 8 +// 方向キーを除いたジョイスティックでボタンの入力として受け取るA, B, Select, Startの4つ +#define EMULATOR_NUM_JOYBUTTONS 4 +// Win32 API joyGetPosEx()関数で取得可能なボタンの最大数 +#define JOYSTICK_MAX_BUTTONS 32 + +//gblDemoRecordがTRUEの場合、ジョイステイックのルーチンから呼び出される。 +//emuutil.cに実装されている。 +void DemoRecorderHandler(BYTE bJoy1Read,BYTE bRet); + +#define EMULATOR_NES_COLORS 64 + +#define NES_SCREENSIZEX 256 +#define NES_SCREENSIZEY 240 + +#define WM_UPDATEFRAME (WM_USER + 1) + +#endif /* EMULATOR_H */ diff --git a/src/emuutil.c b/src/emuutil.c new file mode 100644 index 0000000..357bf25 --- /dev/null +++ b/src/emuutil.c @@ -0,0 +1,927 @@ +/************************************************************************************ + + smb Utility + + File: emuutil.c + Description: ビューの表示・テストプレイのためのルーチン + History: + + ************************************************************************************/ +#include "smbutil.h" +#include "M6502.h" + +#include "emuutil.h" +#include "emulator.h" +#include "objlist.h" +#include "objlib.h" +#include "roommng.h" +#include "emubgset.h" +#include "ini.h" +#include "logview.h" + + +BOOL g_blUseTestPlayPage=FALSE; +BYTE g_bTestPlayPage=0; +BOOL g_bl0PageBadGuyHack=FALSE; +BYTE gbIsCleared=0; +BOOL g_bInvincible = FALSE; +int giMarioState=0;//0 - normal 1- super mario 2 - fire mario + +#define TESTPLAY_STARTPOS_MAXDOTX 240 + +typedef enum _STARTPOSHACK +{ + NONE = 0, + POS = 1, + DOT = 2 +}STARTPOSHACK; +STARTPOSHACK g_fUseStartPosXHack = NONE; +int g_bStartPosX = 0; +STARTPOSHACK g_fUseStartPosYHack = NONE; +int g_bStartPosY = 0; + +void LoadTestPlaySettings() +{ + UINT uData; + + // HARD + uData = GetIntegerFromINI(INIFILE_TESTPLAY,INIFILE_TESTPLAY_HARD,0); + if( !uData || uData==1 ) + gbIsCleared = uData; + + // STATE + uData = GetIntegerFromINI(INIFILE_TESTPLAY,INIFILE_TESTPLAY_STATE,0); + if( uData >=0 && uData<=2 ) + giMarioState = uData; + + // BADGUYS + uData = GetIntegerFromINI(INIFILE_TESTPLAY,INIFILE_TESTPLAY_BADGUYS,0); + if( !uData || uData==1 ) + g_bl0PageBadGuyHack = uData; + + // INVINCIBLE + uData = GetIntegerFromINI(INIFILE_TESTPLAY,INIFILE_TESTPLAY_INVINCIBLE,0); + if( !uData || uData==1 ) + g_bInvincible = uData; + + // PAGE + uData = GetIntegerFromINI(INIFILE_TESTPLAY,INIFILE_TESTPLAY_PAGE,256); + if( uData == 256 ){ + g_blUseTestPlayPage=FALSE; + g_bTestPlayPage=0; + } + else if(uData < 256){ + g_blUseTestPlayPage=TRUE; + g_bTestPlayPage=uData; + } + + return; +} + +/*********************************** + + + +************************************/ +static void TestPlay(int iPage, LPPOINT lpPt) +{ + TESTPLAYSETUPEX sTPS; + EMULATORSETUP es; +// BYTE bBuf[2]; + + // + StopEmulator(); + ResetEmulator(); + + // + memset(&es,0,sizeof(EMULATORSETUP)); + es.pbPRGROM=bPRGROM+0x8000; + es.pbCHRROM=bCHRROM; + if(iTrainer) es.pbTRAINER=bPRGROM+0x7000; + + SetupEmulator(&es); + + // + memset(&sTPS,0,sizeof(TESTPLAYSETUPEX)); + + sTPS.bRoomID=GetRoomID(); + sTPS.bPage=iPage; + + sTPS.bWorld=(BYTE)g_iWorld; + sTPS.bArea=(BYTE)g_iArea; + sTPS.bArea2=(BYTE)g_iArea2; + + // + if(gbIsCleared) + { + sTPS.bIsCleared=0x01;//クリボー→メット + sTPS.bIsDifficult=0x01;//5-3以降 + } + + switch(giMarioState) + { + case 1: + sTPS.bMarioSize=0x00; + sTPS.bMarioCap=0x01; + break; + case 2: + sTPS.bMarioSize=0x00; + sTPS.bMarioCap=0x02; + break; + default: + sTPS.bMarioSize=0x01; + sTPS.bMarioCap=0x00; + break; + } + + if(g_bl0PageBadGuyHack) + sTPS.bBadGuyHack = 1; + + if(g_bInvincible) + sTPS.bInvincible = 1; + + // + if (lpPt) + sTPS.fPosXHack = TRUE; + else + sTPS.fPosXHack = g_fUseStartPosXHack; + if (lpPt) + sTPS.bPosX = (BYTE)lpPt->x; + else if (g_fUseStartPosXHack) + sTPS.bPosX = g_bStartPosX; + // + if (lpPt) + sTPS.fPosYHack = TRUE; + else + sTPS.fPosYHack = g_fUseStartPosYHack; + + if (lpPt) + sTPS.bPosY = (BYTE)lpPt->y; + else if (g_fUseStartPosYHack) + sTPS.bPosY = g_bStartPosY; + + TestPlaySetupEx(&sTPS); + + StartEmulator(); +} + +void RunEmulatorTestPlay() +{ + TestPlay(g_iPage, NULL); +} + +void RunEmulatorTestPlayEx(int iPage, BOOL blHalfPoint, LPPOINT lpPt) +{ + if(blHalfPoint) + iPage = GetHalfPointPage(rm_GetWorld(), rm_GetArea()); + else if(g_blUseTestPlayPage) + iPage = g_bTestPlayPage; + + TestPlay(iPage, lpPt); +} + + +/******************************** + + + + +*********************************/ +extern BOOL gblDemoRecord; +//extern BOOL gblQuit; +#define DEMO_BUFFER_SIZE 21 +#define DEMO_STATE_ADDRESS 0x8340 +#define DEMO_TIMER_ADDRESS 0x8355 +static int g_iDemoIndex; +static BYTE g_bDemoJoyState[DEMO_BUFFER_SIZE]; +static BYTE g_bDemoJoyTimer[DEMO_BUFFER_SIZE]; +static BYTE g_bDemoJoy; + +void InitDemoRecorder() +{ + // + memset(g_bDemoJoyState,0,DEMO_BUFFER_SIZE); + memset(g_bDemoJoyTimer,0,DEMO_BUFFER_SIZE); + g_bDemoJoy=0x00; + g_iDemoIndex=-1; +} + +void DemoRecorderHandler(BYTE bJoy1Read, BYTE bRet) +{ + if(bRet&1) g_bDemoJoy |= (0x80>>bJoy1Read); + + if(bJoy1Read != 0x07) return; + + if(g_iDemoIndex >= (int)(DEMO_BUFFER_SIZE - 1) /*|| ((g_iDemoIndex!=-1) && !g_bDemoJoy)*/){ + // + gblDemoRecord = FALSE; + // + SetStatusBarText(STRING_CONFIRM_DEMORECORD2); + MessageBeep(MB_OK); + // +// gblDataChanged = TRUE; + fr_SetDataChanged(TRUE); + undoPrepare(UNDONAME_TOOLDEMORECORDER); + // + g_bDemoJoyState[g_iDemoIndex] = 0x00; + g_bDemoJoyTimer[g_iDemoIndex] = 0xFF; + // + memcpy(bPRGROM+DEMO_STATE_ADDRESS, g_bDemoJoyState, DEMO_BUFFER_SIZE); + memcpy(bPRGROM+DEMO_TIMER_ADDRESS, g_bDemoJoyTimer, DEMO_BUFFER_SIZE); + // + return; + } + + if(!g_bDemoJoy) g_bDemoJoy=0x10; + + if(g_iDemoIndex!=-1){ + if(g_bDemoJoyState[g_iDemoIndex]==g_bDemoJoy && g_bDemoJoyTimer[g_iDemoIndex]!=0xFF) + g_bDemoJoyTimer[g_iDemoIndex]++; + else{ + g_bDemoJoyState[++g_iDemoIndex]=g_bDemoJoy; + g_bDemoJoyTimer[g_iDemoIndex]=0x01; + } + } + else if(g_bDemoJoy){ + g_bDemoJoyState[++g_iDemoIndex]=g_bDemoJoy; + g_bDemoJoyTimer[g_iDemoIndex]=0x01; + } + g_bDemoJoy=0x00; + +} + +void DemoRecord() +{ + TESTPLAYSETUP sTPS; + EMULATORSETUP es; + BYTE bMapHead[2]; + BYTE bRoomID; + + if(!gblIsROMLoaded) return; + + StopEmulator(); + ResetEmulator(); + + memset(&es,0,sizeof(EMULATORSETUP)); + es.pbPRGROM=bPRGROM+0x8000; + es.pbCHRROM=bCHRROM; + if(iTrainer) es.pbTRAINER=bPRGROM+0x7000; + + SetupEmulator(&es); + + memset(&sTPS,0,sizeof(TESTPLAYSETUP)); + + bRoomID=rm_GetMainRoomID(0); + + sTPS.BadGuysAddress.word=GetBadGuysAddress(bRoomID); + sTPS.MapAddress.word=GetMapAddress(bRoomID); + sTPS.bRoomID=bRoomID; + + GetMapHeadData(bRoomID,bMapHead); + if((bMapHead[0]&0x07)&0x04){ + sTPS.bBackObject1=0x00; + sTPS.bBackObject2=(bMapHead[0]&0x07); + } + else{ + sTPS.bBackObject1=(bMapHead[0]&0x07); + sTPS.bBackObject2=0x00; + }//初期背景色 + + sTPS.bBasicBlock =(bMapHead[1]&0x0F);//初期基本背景ブロック + sTPS.bBackView =((bMapHead[1]>>4)&0x03);//初期景色 + + sTPS.bMarioSize=0x01; + sTPS.bMarioCap=0x00; + + memset(sTPS.bLeftObjNum,0xFF,3); + memset(sTPS.bLeftObjOfs,0x00,3); + + TestPlaySetup(&sTPS); + + gblDemoRecord=TRUE; + InitDemoRecorder(); + + StartEmulator(); +} +/************************************************************* + + BOOL RunEmulatorViewPage(UINT uRoomID,int iPage) + + uRoomIDで指定されたルームのiPageで指定されたページのマップの絵を + エミュレータウインドウのバックバッファに準備する。uRoomIDに + GETADDRESS_CURRENT_EDITTING定数を指定すると、現在エディトしている + ルームを指定したことになる。 + + ●補助関数● + static void PrepareMapRelatedMemory(int iPage,int iMapType,MAPRELATEDMEMORY *psMRM) + + マップに関連したメモリーのセットアップを行う。 + +**************************************************************/ +//エミュレータウインドウを操作するためのグローバル変数 +extern HDC ghMemdcOffScreen; +extern BOOL gblShowSprite; + +typedef struct +{ + BYTE bBasicDataMask; + BYTE bBasicData; + BYTE bIsSizeFixed; + BYTE bFixedSize; + BYTE bSizeMask; + BYTE bExInfo; +}MAPOBJLEFTINFO; + +//bExInfoメンバで有効な値 +#define EXINFO_STEPS 0x01//階段のための特殊処理 +#define EXINFO_ATHLETIC 0x02//アスレチック台とキラーのための特殊処理 + +MAPOBJLEFTINFO MapObjLeftInfo0B[]={0x7F,0x0C,0x01,0x03,0x00,0x00,//逆L字型土管「固定」 + 0x70,0x10,0x00,0x00,0x0F,0x02,//アスレチック台(要注意) + 0x70,0x20,0x00,0x00,0x0F,0x00,//横に並んだレンガブロック + 0x70,0x30,0x00,0x00,0x0F,0x00,//横に並んだ壊せないブロック + 0x70,0x40,0x00,0x00,0x0F,0x00,//横に並んだコインブロック + 0x70,0x70,0x01,0x01,0x00,0x00};//土管「固定」 +MAPOBJLEFTINFO MapObjLeftInfoC[]={0x70,0x00,0x00,0x00,0x0F,0x00,//谷 + 0x70,0x10,0x00,0x00,0x0F,0x00,//天秤リフトの横ロープ + 0x70,0x20,0x00,0x00,0x0F,0x00,//つり橋 + 0x70,0x30,0x00,0x00,0x0F,0x00,//つり橋 + 0x70,0x40,0x00,0x00,0x0F,0x00,//つり橋 + 0x70,0x50,0x00,0x00,0x0F,0x00,//川 + 0x70,0x60,0x00,0x00,0x0F,0x00,//横に並んだ?ブロック(コイン、高さ3) + 0x70,0x70,0x00,0x00,0x0F,0x00};//横に並んだ?ブロック(コイン、高さ7) +MAPOBJLEFTINFO MapObjLeftInfoD[]={0x7F,0x40,0x01,0x03,0x00,0x00, + 0x7F,0x44,0x01,0x0C,0x00,0x00};//クッパの橋「固定」 +MAPOBJLEFTINFO MapObjLeftInfoF[]={0x70,0x20,0x01,0x04,0x00,0x00,//城「固定」 + 0x78,0x30,0x00,0x00,0x07,0x01,//階段(可変) + 0x78,0x38,0x01,0x08,0x00,0x01,//階段「固定」 + 0x70,0x40,0x01,0x03,0x00,0x00};//逆L字型 + +int GetNumMapObjLeftInfoC(){return sizeof(MapObjLeftInfoC)/sizeof(MAPOBJLEFTINFO);}; +int GetNumMapObjLeftInfoD(){return sizeof(MapObjLeftInfoD)/sizeof(MAPOBJLEFTINFO);}; +int GetNumMapObjLeftInfo0B(){return sizeof(MapObjLeftInfo0B)/sizeof(MAPOBJLEFTINFO);}; +int GetNumMapObjLeftInfoF(){return sizeof(MapObjLeftInfoF)/sizeof(MAPOBJLEFTINFO);}; + +typedef struct +{ + BYTE bBackView; + BYTE bBasicBlock; + BYTE bBackObject1; + BYTE bBackObject2; + BYTE bLeftObjNum[3]; + BYTE bLeftObjOfs[3]; + BYTE bLeftObjData1;//階段 + BYTE bLeftObjData2[3];//きのこの島の茎 + BYTE bMapOfs; + BYTE bMapPageFlag; +}MAPRELATEDMEMORY; + + +static BOOL PrepareMapRelatedMemory(UINT uRoomID,int iPage,int iMapType,MAPRELATEDMEMORY *psMRM) +{ + MAPOBJLEFTINFO *psMapObjLeftInfo; + int iLeftDataNum; + OBJECTSEEKINFO ObjSeek; + BOOL blRet=FALSE; + + if(!psMRM || iPage<0) return FALSE; + + iLeftDataNum=2; + memset(psMRM->bLeftObjNum,0xFF,3); + memset(psMRM->bLeftObjOfs,0x00,3); + + if(!MapSeekFirst(&ObjSeek,uRoomID)) return TRUE; + { + //0ページのマップデータがない場合に0ページの表示を要求された場合 + if(iPage==0 && (ObjSeek.pbData[1]&0x80)) return TRUE; + + for(;;) + { + if(ObjSeek.dwPage>=(DWORD)iPage){ + blRet=TRUE; + //ページ送りコマンド + if(((ObjSeek.pbData[0]&0x0F)==0x0D) && ((ObjSeek.pbData[1]&0x40)==0x00) && ObjSeek.dwPage==(DWORD)iPage) + psMRM->bMapPageFlag=0x00; + else + psMRM->bMapPageFlag=0x01; + break; + } + + // + if((ObjSeek.pbData[0]&0x0F)==0x0E){ + if(ObjSeek.pbData[1]&0x40){ + if((ObjSeek.pbData[1]&0x07)&0x04){ + psMRM->bBackObject1=0x00; + psMRM->bBackObject2=(ObjSeek.pbData[1]&0x07); + } + else{ + psMRM->bBackObject1=(ObjSeek.pbData[1]&0x07); + // psMRM->bBackObject2=0x00; + } + } + else{ + psMRM->bBasicBlock =(ObjSeek.pbData[1]&0x0F);//初期基本背景ブロック + psMRM->bBackView =((ObjSeek.pbData[1]>>4)&0x03);//初期景色 + } + } + else if((ObjSeek.dwPage+1)==(DWORD)iPage){ + int iMaxNumObjs; + int n; + + if(iLeftDataNum>=0) + { + switch(ObjSeek.pbData[0]&0x0F) + { + case 0x0C:psMapObjLeftInfo=MapObjLeftInfoC;iMaxNumObjs=GetNumMapObjLeftInfoC();break; + case 0x0D:psMapObjLeftInfo=MapObjLeftInfoD;iMaxNumObjs=GetNumMapObjLeftInfoD();break; + case 0x0F:psMapObjLeftInfo=MapObjLeftInfoF;iMaxNumObjs=GetNumMapObjLeftInfoF();break; + default:psMapObjLeftInfo=MapObjLeftInfo0B;iMaxNumObjs=GetNumMapObjLeftInfo0B();break; + } + for(n=0;n>4)&0x0F)+iBasicSize-0x10); + + if(iLeftObjNum>=0 && !((psMapObjLeftInfo[n].bExInfo&EXINFO_ATHLETIC) && iMapType==2)){//アスレチックオブジェクトで、大砲面ではない + psMRM->bLeftObjNum[iLeftDataNum]=(BYTE)iLeftObjNum; + psMRM->bLeftObjOfs[iLeftDataNum]=(BYTE)(ObjSeek.dwOfs); + if(psMapObjLeftInfo[n].bExInfo&EXINFO_STEPS) + psMRM->bLeftObjData1=0x08-(0x0F-(ObjSeek.pbData[0]>>4)); + if((psMapObjLeftInfo[n].bExInfo&EXINFO_ATHLETIC) && iMapType==1) + psMRM->bLeftObjData2[iLeftDataNum]=((ObjSeek.pbData[1]&psMapObjLeftInfo[n].bSizeMask)/2); + iLeftDataNum--; + } + }/* if */ + }/* if */ + }/* else if */ + + if(!MapSeekNext(&ObjSeek)){ + + break; + } + }/* for */ + }/* if */ + + psMRM->bMapOfs=(BYTE)ObjSeek.dwOfs; + + return blRet; +} + +BOOL RunEmulatorViewPage(UINT uRoomID, int iPage) +{ + TESTPLAYSETUP sTPS; + EMULATORSETUP es; + BYTE bMapHead[2]; + MAPRELATEDMEMORY sMRM; + PREPAREBGSPRINFO sPreBgSprInfo; + + if(!gblIsROMLoaded) return FALSE; + + StopEmulator(); + ResetEmulator(); + + memset(&es,0,sizeof(EMULATORSETUP)); + es.pbPRGROM=bPRGROM+0x8000; + es.pbCHRROM=bCHRROM; + if(iTrainer) es.pbTRAINER=bPRGROM+0x7000; + + SetupEmulator(&es); + + memset(&sTPS,0,sizeof(TESTPLAYSETUP)); + + sTPS.BadGuysAddress.word=GetBadGuysAddress(uRoomID); + sTPS.MapAddress.word=GetMapAddress(uRoomID); + if(uRoomID==GETADDRESS_CURRENT_EDITTING) + sTPS.bRoomID=GetRoomID(); + else + sTPS.bRoomID=uRoomID; + + sTPS.bWorld=g_iWorld; + sTPS.bArea=g_iArea; + sTPS.bArea2=g_iArea2; + + sTPS.bPage=iPage; + + memset(&sMRM,0x00,sizeof(MAPRELATEDMEMORY)); + GetMapHeadData(uRoomID,bMapHead); + if((bMapHead[0]&0x07)&0x04) + { + sMRM.bBackObject1=0x00; + sMRM.bBackObject2=(bMapHead[0]&0x07); + } + else + { + sMRM.bBackObject1=(bMapHead[0]&0x07); + sMRM.bBackObject2=0x00; + }//初期背景色 + + sMRM.bBasicBlock =(bMapHead[1]&0x0F);//初期基本背景ブロック + sMRM.bBackView =((bMapHead[1]>>4)&0x03);//初期景色 + + PrepareMapRelatedMemory(uRoomID,iPage,(bMapHead[1]>>6)&0x03,&sMRM); + + sTPS.bBackObject1=sMRM.bBackObject1; + sTPS.bBackObject2=sMRM.bBackObject2; + sTPS.bBasicBlock=sMRM.bBasicBlock; + sTPS.bBackView=sMRM.bBackView; + memcpy(sTPS.bLeftObjNum,sMRM.bLeftObjNum,3); + memcpy(sTPS.bLeftObjOfs,sMRM.bLeftObjOfs,3); + sTPS.bLeftObjData1=sMRM.bLeftObjData1;//階段 + memcpy(sTPS.bLeftObjData2,sMRM.bLeftObjData2,3);//きのこの島の茎 + + sTPS.bMapOfs=sMRM.bMapOfs; + sTPS.bMapPageFlag=sMRM.bMapPageFlag; + sTPS.bMapPage=iPage; + + sTPS.bMarioSize=0x01; + sTPS.bMarioCap=0x00; + + sTPS.blIsStatusDraw=FALSE; + + TestPlaySetup(&sTPS); + + Run6502Ex(0x1280);//橙色の土管、夜に注意,0x1280 + + SetPrepareBadGuysSpriteInfoStruct(sTPS.bRoomID,sTPS.bWorld,sTPS.bArea,&sPreBgSprInfo); + PrepareBadGuysSpriteInfo(&sPreBgSprInfo); + PrepareSpriteRAM(uRoomID,iPage); + + DrawAllScanline(); + + return TRUE; +} + + + +/************************************************************* + +void TransferFromEmuBackBuffer(HDC hDCDest,int iDestX,int iDestY,int iWidth,int iHeight,BOOL blIsStretch) + + blIsStretch TRUE…iWidth,iHeightが有効。FALSE…iWidth,iHeightを無視 + + エミュレータウインドウのバックバッファーからhDCDestで指定され + たデバイスコンテキストへBitBltを行う + +**************************************************************/ +void InstallEmulatorPalette(HDC hdc) +{ + /* + HPALETTE hPal=GetEmulatorPalette(); + if(!hPal) return; + + SelectPalette(hdc,hPal,FALSE); + RealizePalette(hdc); + */ +} + +void TransferFromEmuBackBuffer(HDC hDCDest,int iDestX,int iDestY,int iWidth,int iHeight,BOOL blIsStretch) +{ + if(!gblIsROMLoaded) return; + + if(hDCDest && ghMemdcOffScreen) + { + SetEmuBackBufferPallete(NULL); + + InstallEmulatorPalette(hDCDest); + + if(blIsStretch){ + StretchBlt(hDCDest,iDestX,iDestY,iWidth,iHeight,ghMemdcOffScreen,0,16,NES_SCREENSIZEX,NES_SCREENSIZEY-16,SRCCOPY); + } + else{ + BitBlt(hDCDest,iDestX,iDestY,iWidth,iHeight,ghMemdcOffScreen,0,16,SRCCOPY); + } + } +} + +/************************************************************** + + void RunEmulatorNormal() + + エミュレータの通常起動を行う。 + +***************************************************************/ +void RunEmulatorNormal() +{ + EMULATORSETUP es; + + StopEmulator(); + + memset(&es,0,sizeof(EMULATORSETUP)); + es.pbPRGROM=bPRGROM+0x8000; + es.pbCHRROM=bCHRROM; + if(iTrainer) es.pbTRAINER=bPRGROM+0x7000; + + SetupEmulator(&es); + + ResetEmulator(); + StartEmulator(); +} + + +LRESULT CALLBACK TestPlaySettingDlgProc( HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam) +{ + static STARTPOSHACK sphPrevX, sphPrevY; + switch (message) + { + case WM_INITDIALOG: + { + int n; + LPTSTR StateName[] = {STRING_TESTPLAYSETTING_MARIO, STRING_TESTPLAYSETTING_SUPERMARIO, STRING_TESTPLAYSETTING_FIREMARIO}; + LPTSTR StartUnitName[] = {STRING_TESTPLAYSETTING_NONE, STRING_TESTPLAYSETTING_POS, STRING_TESTPLAYSETTING_DOT}; + + if (rm_IsSubRoom()) + EnableWindow(GetDlgItem(hDlg, IDC_HALFPAGE), FALSE); + if(gbIsCleared) + CheckDlgButton(hDlg, IDC_ISCLEARED, BST_CHECKED); + if(g_bl0PageBadGuyHack) + CheckDlgButton(hDlg, IDC_0PAGEBADGUYS, BST_CHECKED); + if(g_bInvincible) + CheckDlgButton(hDlg, IDC_INVINCIBLE, BST_CHECKED); + + sphPrevX = g_fUseStartPosXHack; + switch(g_fUseStartPosXHack) + { + case NONE: + n = 0; + break; + case POS: + n = g_bStartPosX / 16; + break; + case DOT: + n = g_bStartPosX; + } + SetDlgItemInt(hDlg, IDC_XPOS, n, TRUE); + for(n = 0;n < 3;n++) + { + SendDlgItemMessage(hDlg, IDC_XPOSHACK, CB_ADDSTRING, 0, (LPARAM)StartUnitName[n]); + } + SendDlgItemMessage(hDlg, IDC_XPOSHACK, CB_SETCURSEL, (WPARAM)g_fUseStartPosXHack, 0); + PostMessage(hDlg, WM_COMMAND, MAKEWPARAM(IDC_XPOSHACK, CBN_SELCHANGE), 0); + + sphPrevY = g_fUseStartPosYHack; + switch(g_fUseStartPosYHack) + { + case NONE: + n = -1; + break; + case POS: + n = (g_bStartPosY / 16) - 1; + break; + case DOT: + n = g_bStartPosY; + } + SetDlgItemInt(hDlg, IDC_YPOS, n, TRUE); + for(n = 0;n < 3;n++) + { + SendDlgItemMessage(hDlg, IDC_YPOSHACK, CB_ADDSTRING, 0, (LPARAM)StartUnitName[n]); + } + SendDlgItemMessage(hDlg, IDC_YPOSHACK, CB_SETCURSEL, (WPARAM)g_fUseStartPosYHack, 0); + PostMessage(hDlg, WM_COMMAND, MAKEWPARAM(IDC_YPOSHACK, CBN_SELCHANGE), 0); + + + for(n = 0;n < 3;n++) + { + SendDlgItemMessage(hDlg, IDC_MARIOSTATE, CB_ADDSTRING, 0, (LPARAM)StateName[n]); + } + SendDlgItemMessage(hDlg, IDC_MARIOSTATE, CB_SETCURSEL, (WPARAM)giMarioState, 0); + + SetDlgItemInt(hDlg, IDC_PAGE, g_bTestPlayPage, FALSE); + if(g_blUseTestPlayPage) + CheckRadioButton(hDlg, IDC_FROMCURPAGE, IDC_FROMDESTPAGE, IDC_FROMDESTPAGE); + else + CheckRadioButton(hDlg, IDC_FROMCURPAGE, IDC_FROMDESTPAGE, IDC_FROMCURPAGE); + SendDlgItemMessage(hDlg, IDC_PAGESPIN, UDM_SETRANGE, 0, MAKEWPARAM(SMB_MAX_PAGE,0)); + + return TRUE; + } + case WM_COMMAND: + switch(LOWORD(wParam)) + { + case IDC_PAGE: + { + switch(HIWORD(wParam)) + { + case EN_CHANGE: + CheckRadioButton(hDlg, IDC_FROMCURPAGE, IDC_FROMDESTPAGE, IDC_FROMDESTPAGE); + break; + } + } + break; + case IDC_XPOSHACK: + { + switch(HIWORD(wParam)) + { + case CBN_SELCHANGE: + { + BOOL fEditEnable, fTraslated; + WORD wSpinMin, wSpinMax; + int iNewValue; + STARTPOSHACK iRet = SendDlgItemMessage(hDlg, IDC_XPOSHACK, CB_GETCURSEL, 0, 0); + + if(iRet == CB_ERR) break; + iNewValue = GetDlgItemInt(hDlg, IDC_XPOS, &fTraslated, TRUE); + switch(iRet) + { + case NONE: + fEditEnable = FALSE; + break; + case POS: + if (fTraslated + && sphPrevX == DOT) + iNewValue /= 16; + if (iNewValue < 0) + iNewValue = 0; + else if(iNewValue > 15) + iNewValue = 15; + fEditEnable = TRUE; + wSpinMin = 0; + wSpinMax = 15; + break; + case DOT: + if (fTraslated + && sphPrevX == POS) + iNewValue *= 16; + if (iNewValue < 0) + iNewValue = 0; + else if(iNewValue > TESTPLAY_STARTPOS_MAXDOTX) + iNewValue = TESTPLAY_STARTPOS_MAXDOTX; + fEditEnable = TRUE; + wSpinMin = 0; + wSpinMax = TESTPLAY_STARTPOS_MAXDOTX; + break; + } + EnableWindow(GetDlgItem(hDlg,IDC_XPOS), fEditEnable); + SetDlgItemInt(hDlg, IDC_XPOS, iNewValue, TRUE); + SendDlgItemMessage(hDlg, IDC_XPOSSPIN, UDM_SETRANGE, 0, MAKEWPARAM(wSpinMax, wSpinMin)); + + sphPrevX = iRet; + return TRUE; + } + } + } + break; + case IDC_YPOSHACK: + { + switch(HIWORD(wParam)) + { + case CBN_SELCHANGE: + { + BOOL fEditEnable, fTraslated; + WORD wSpinMin, wSpinMax; + int iNewValue; + STARTPOSHACK iRet = SendDlgItemMessage(hDlg, IDC_YPOSHACK, CB_GETCURSEL, 0, 0); + + if(iRet == CB_ERR) break; + iNewValue = GetDlgItemInt(hDlg, IDC_YPOS, &fTraslated, TRUE); + switch(iRet) + { + case NONE: + fEditEnable = FALSE; + break; + case POS: + if (fTraslated + && sphPrevY == DOT){ + iNewValue /= 16; + iNewValue--; + } + if (iNewValue < -1) + iNewValue = -1; + else if(iNewValue > TESTPLAY_SETTINGS_MAXYPOS) + iNewValue = TESTPLAY_SETTINGS_MAXYPOS; + fEditEnable = TRUE; + wSpinMin = -1; + wSpinMax = TESTPLAY_SETTINGS_MAXYPOS; + break; + case DOT: + if (fTraslated + && sphPrevY == POS){ + iNewValue++; + iNewValue *= 16; + } + if (iNewValue < 0) + iNewValue = 0; + else if(iNewValue > (TESTPLAY_SETTINGS_MAXYPOS + 1) * 16) + iNewValue = (TESTPLAY_SETTINGS_MAXYPOS + 1) * 16; + fEditEnable = TRUE; + wSpinMin = 0; + wSpinMax = (TESTPLAY_SETTINGS_MAXYPOS + 1) * 16; + break; + } + EnableWindow(GetDlgItem(hDlg,IDC_YPOS), fEditEnable); + SetDlgItemInt(hDlg, IDC_YPOS, iNewValue, TRUE); + SendDlgItemMessage(hDlg, IDC_YPOSSPIN, UDM_SETRANGE, 0, MAKEWPARAM(wSpinMin, wSpinMax)); + + sphPrevY = iRet; + return TRUE; + } + } + + } + break; + case IDC_HALFPAGE: + { + switch(HIWORD(wParam)) + { + case BN_CLICKED: + SetDlgItemInt(hDlg, IDC_PAGE, GetHalfPointPage(rm_GetWorld(),rm_GetArea()), FALSE); + break; + } + } + break; + case IDOK: + { + int iRet; + BOOL fTranslated; + STARTPOSHACK iSPH; + + gbIsCleared=0x00; + if(IsDlgButtonChecked(hDlg,IDC_ISCLEARED)==BST_CHECKED) + gbIsCleared=0x01; + + // + iSPH = SendDlgItemMessage(hDlg, IDC_XPOSHACK, CB_GETCURSEL, 0, 0); + if (iSPH == CB_ERR) + return FALSE; + if (iSPH) { + iRet = GetDlgItemInt(hDlg, IDC_XPOS, &fTranslated, TRUE); + switch(iSPH) + { + case POS: + if (!fTranslated + || iRet < 0 + || iRet > 15) + return FALSE; + g_bStartPosX = iRet * 16; + break; + case DOT: + if (!fTranslated + || iRet < 0 + || iRet > TESTPLAY_STARTPOS_MAXDOTX) + return FALSE; + g_bStartPosX = iRet; + break; + } + } + g_fUseStartPosXHack = iSPH; + + // + iSPH = SendDlgItemMessage(hDlg, IDC_YPOSHACK, CB_GETCURSEL, 0, 0); + if (iSPH == CB_ERR) + return FALSE; + if (iSPH) { + iRet = GetDlgItemInt(hDlg, IDC_YPOS, &fTranslated, TRUE); + switch(iSPH) + { + case POS: + if (!fTranslated + || iRet < -1 + || iRet > TESTPLAY_SETTINGS_MAXYPOS) + return FALSE; + g_bStartPosY = (iRet + 1) * 16; + break; + case DOT: + if (!fTranslated + || iRet < 0 + || iRet > (TESTPLAY_SETTINGS_MAXYPOS + 1) * 16) + return FALSE; + g_bStartPosY = iRet; + break; + } + } + g_fUseStartPosYHack = iSPH; + + iRet = SendDlgItemMessage(hDlg,IDC_MARIOSTATE,CB_GETCURSEL,0,0); + if(iRet == CB_ERR) return TRUE; + giMarioState = iRet; + + g_blUseTestPlayPage = FALSE; + if(BST_CHECKED == IsDlgButtonChecked(hDlg,IDC_FROMDESTPAGE)){ + iRet = GetDlgItemInt(hDlg, IDC_PAGE, &fTranslated, FALSE); + if(!fTranslated) return TRUE; + g_bTestPlayPage = iRet; + g_blUseTestPlayPage = TRUE; + } + + g_bl0PageBadGuyHack = FALSE; + if(BST_CHECKED == IsDlgButtonChecked(hDlg,IDC_0PAGEBADGUYS)) + g_bl0PageBadGuyHack = TRUE; + + g_bInvincible = FALSE; + if(BST_CHECKED == IsDlgButtonChecked(hDlg,IDC_INVINCIBLE)) + g_bInvincible = TRUE; + + + } + case IDCANCEL: + EndDialog(hDlg, TRUE); + return TRUE; + } + } + return FALSE; +} \ No newline at end of file diff --git a/src/emuutil.h b/src/emuutil.h new file mode 100644 index 0000000..5ce7ee8 --- /dev/null +++ b/src/emuutil.h @@ -0,0 +1,79 @@ +/************************************************************************************ + + smb Utility + + File: emuutil.h + Description: + History: + + ************************************************************************************/ +#ifndef EMUUTIL_H +#define EMUUTIL_H + +#define TESTPLAY_SETTINGS_MAXYPOS 12 + +void LoadTestPlaySettings(); + +/********************************* + + テストプレイの設定ダイアログ関数 + +**********************************/ +LRESULT CALLBACK TestPlaySettingDlgProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam); + +/***************************************************************** + +BOOL RunEmulatorViewPage(UINT uRoomID,int iPage); + + uRoomIDで指定されたルームのiPageで指定されたページのマップの絵を + エミュレータウインドウのバックバッファに準備する。uRoomIDに + GETADDRESS_CURRENT_EDITTING定数を指定すると、現在エディトしている + ルームを指定したことになる。 + +*******************************************************************/ +BOOL RunEmulatorViewPage(UINT uRoomID,int iPage); + +/*********************************************************************************************************** + +void TransferFromEmuBackBuffer(HDC hDCDest,int iDestX,int iDestY,int iWidth,int iHeight,BOOL blIsStretch) + + blIsStretch TRUE iDestX,iDestY,iWidth,iHeightへ1画面分、StretchBlt()行う + FALSE iDestX,iDestYへiWidth,iHeight分、BitBlt()行う + + エミュレータウインドウのバックバッファーからhDCDestで指定されたデバイスコンテキストへBitBltを行う + +************************************************************************************************************/ +void TransferFromEmuBackBuffer(HDC hDCDest,int iDestX,int iDestY,int iWidth,int iHeight,BOOL blIsStretch); + + +void InstallEmulatorPalette(HDC hdc); +/******************************************************************** + + void RunEmulatorTestPlay(); + + 現在エディトしているルームのテストプレイをルームのはじめから行う。 + +*********************************************************************/ +void RunEmulatorTestPlay(); + +/******************************************************************** + + void RunEmulatorTestPlayEx(int iPage); + + 現在エディトしているルームのテストプレイを指定されたページから行う + +*********************************************************************/ +void RunEmulatorTestPlayEx(int iPage,BOOL blHalfPoint,LPPOINT lpPt); + +/******************************* + + void RunEmulatorNormal(); + + エミュレータの通常起動を行う + +********************************/ +void RunEmulatorNormal(); + +void DemoRecord(); + +#endif /* EMUUTIL_H */ \ No newline at end of file diff --git a/src/filemng.c b/src/filemng.c new file mode 100644 index 0000000..d1041a2 --- /dev/null +++ b/src/filemng.c @@ -0,0 +1,115 @@ +/************************************************************************************ + + smb Utility + + File: filemng.h + Description: ファイルのロード。セーブを行うルーチン + History: + + ************************************************************************************/ +#include "smbutil.h" + +// 外部エディタ変更対応 +FILETIME gFileTime; +BOOL gblFileCmpEnable; +extern char gFilePath[MAX_PATH]; + +static BOOL GetFileLastWrite(LPFILETIME lpFileTime) +{ + HANDLE hFile; + + gblFileCmpEnable=TRUE; + hFile=CreateFile(gFilePath,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); + if(!hFile){ + gblFileCmpEnable=FALSE; + return FALSE; + } + + if(!GetFileTime(hFile,NULL,NULL,lpFileTime)){ + gblFileCmpEnable=FALSE; + CloseHandle(hFile); + return FALSE; + } + CloseHandle(hFile); + return TRUE; +} + +void SetROMFileTime() +{ + GetFileLastWrite(&gFileTime); +} + +//(再)ロードした時点のファイルの最終更新時間と +//  同じ…TRUE +// 違う…FALSE +// を返す。 +BOOL CheckROMFileTime() +{ + FILETIME TmpFileTime; + + if(!gblFileCmpEnable) return TRUE;//失敗 + + if(!GetFileLastWrite(&TmpFileTime)) return TRUE;//失敗 + + if(!memcmp(&TmpFileTime,&gFileTime,sizeof(FILETIME))) return TRUE; + + return FALSE; +} + +BOOL LoadROM(LPSTR pFilename) +{ + FILE *fp; + + iTrainer=0; + gblIsROMLoaded=FALSE; + + if((fp=fopen(pFilename,"rb"))==NULL){ + Msg(STRING_FILEERROR_NOTFOUND, MB_OK|MB_ICONWARNING); + return FALSE; + } + + fread(&Head,1,sizeof(INESHEADER),fp); + if(memcmp(Head.cType,"NES\x1a",4) || (Head.bNum_CHARs!=SMB_NUM_CHARS || Head.bNum_PRGs!=SMB_NUM_PRGS) || ((Head.bROM_Type&0x01)!=0x01)){ + Msg(STRING_FILEERROR_FILEFORMAT, MB_OK|MB_ICONWARNING); + fclose(fp); + return FALSE; + } + + if(Head.bROM_Type & 0x4){ + iTrainer=INES_TRAINERSIZE; + fread(bPRGROM+0x7000,INES_TRAINERSIZE,1,fp); + } + + fread(bPRGROM + 0x8000, SMB_PRG_SIZE, 1, fp); + + fread(bCHRROM, SMB_CHR_SIZE, 1, fp); + + fclose(fp); + + // + gblIsROMLoaded=TRUE; + SetROMFileTime(); + + return TRUE; +} + +BOOL SaveAsFile(LPSTR pFilename) +{ + FILE *fp; + + if((fp=fopen(pFilename,"w+b"))==NULL) return FALSE; + + fwrite(&Head,sizeof(INESHEADER),1,fp); + if(iTrainer) fwrite(bPRGROM+0x7000,INES_TRAINERSIZE,1,fp); + fwrite(bPRGROM+0x8000,INES_PRGROMBANKSIZE*SMB_NUM_PRGS,1,fp); + fwrite(bCHRROM,INES_CHRROMBANKSIZE*SMB_NUM_CHARS,1,fp); + + fclose(fp); + + // +// gblDataChanged=FALSE; + fr_SetDataChanged(FALSE); + SetROMFileTime(); + + return TRUE; +} diff --git a/src/filemng.h b/src/filemng.h new file mode 100644 index 0000000..cd4754e --- /dev/null +++ b/src/filemng.h @@ -0,0 +1,35 @@ +/************************************************************************************ + + smb Utility + + File: filemng.h + Description: + History: + + ************************************************************************************/ +#ifndef FILEMNG_H +#define FILEMNG_H + +typedef struct _tagINESHEADER +{ + char cType[4]; + unsigned char bNum_PRGs; + unsigned char bNum_CHRs; + unsigned char bROM_CTRL1; + unsigned char bROM_CTRL2; + char cReserved[8]; +}iNES_HEADER; + +#define INES_ROMBANKSIZE 0x4000 +#define INES_VROMBANKSIZE 0x2000 +#define INES_TRAINERSIZE 0x200 + +BOOL SaveAsFile(LPSTR pFilename); + +BOOL LoadROM(LPSTR pFilename); +// 書き換えられた - TRUE, 同じ - FALSE +BOOL CheckROMFileTime(); + +void SetROMFileTime(); + +#endif /* FILEMNG_H */ \ No newline at end of file diff --git a/src/frame.c b/src/frame.c new file mode 100644 index 0000000..fa8ecd2 --- /dev/null +++ b/src/frame.c @@ -0,0 +1,1528 @@ +/************************************************************************************ + + smb Utility + + File: frame.c + Description: + History: + + ************************************************************************************/ +#include "smbutil.h" +#include "emulator.h" +#include "objlist.h" +#include "objlib.h" +#include "objmng.h" +#include "objview.h" +#include "objeditcom.h" +//#include "keyaccel.h" +#include "roommng.h" +#include "emulator.h" +#include "emuutil.h" +#include "logview.h" +#include "tools.h" +#include "filemng.h" +#include "ini.h" +#include "keys.h" +#include "versinfo.h" + +#define FRAMEWNDCLASSNAME "MDIFRAME" + +HINSTANCE ghInst; +HWND ghWndMDIClient; +HWND ghWndFrame; + +HWND ghWndEmu; +HWND ghWndMapEdit;//マップエディトウインドウへのハンドル +HWND ghWndMapView; + +HWND g_hTbWnd=NULL; +HWND g_hSbWnd=NULL; + + +HWND g_hEditToolDlg=NULL; + +TCHAR gFilePath[MAX_PATH] = {0}; + +INESHEADER Head; +BYTE bPRGROM[PRG_SIZE]; +BYTE bCHRROM[SMB_CHR_SIZE]; +int iTrainer=0; + +BOOL gblIsROMLoaded = FALSE; +BOOL gblDataChanged = FALSE; + +BOOL g_fShowMsgOnSave = TRUE; +/**************** + + +*****************/ + +HWND fr_GetStatusBar() +{ + return g_hSbWnd; +} + +int Msg(LPCTSTR lpText, UINT uType) +{ + return MessageBox(ghWndMDIClient, lpText, PROGRAMNAME, uType); +} + +UINT CALLBACK OFNHookProc(HWND hDlg,UINT uiMsg,WPARAM wParam,LPARAM lParam) +{ + switch(uiMsg) + { + case WM_INITDIALOG: + { + HWND hWnd; + HWND hWndOwner; + LPOPENFILENAME lpOfn = (LPOPENFILENAME)lParam; + + hWnd = GetParent(hDlg); + hWndOwner = lpOfn->hwndOwner; + + if(IsZoomed(hWndOwner)){ + RECT rcDlg; + RECT rcOwner; + int x,y,w,h; + + GetWindowRect(hWnd,&rcDlg); + GetWindowRect(hWndOwner,&rcOwner); + + w=rcDlg.right-rcDlg.left; + h=rcDlg.bottom-rcDlg.top; + x=rcOwner.left + ((rcOwner.right-rcOwner.left)-w)/2; + y=rcOwner.top + ((rcOwner.bottom-rcOwner.top)-h)/2; + if(x>=0 && y>=0 && w>=0 && h>=0) + MoveWindow(hWnd,x,y,w,h,TRUE); + } + return 1; + } + break; + case WM_NOTIFY: + { + LPOFNOTIFY lpon = (LPOFNOTIFY) lParam; + + switch(lpon->hdr.code) + { + case CDN_FILEOK: + { + lpon->lpOFN->lCustData = FALSE; + if (IsDlgButtonChecked(hDlg,IDC_TITLE) == BST_CHECKED) + lpon->lpOFN->lCustData = TRUE; + } + break; + } + } + break; + } + //the default dialog box procedure processes the message + return 0; +} + +BOOL GetFileName(LPTSTR lpPath,HWND hWnd) +{ + OPENFILENAME fname; + char filename[64]={0}; + char filefilter[]= {'i','N','E','S',' ','f','o','m','a','t',' ','R','O','M',' ','i','m','a','g','e',' ','(','*','.','n','e','s',')','\0','*','.','n','e','s','\0', + 'A','l','l',' ','(','*','.','*',')','\0','*','.','*','\0','\0','\0'}; + + memset(&fname,0,sizeof(OPENFILENAME)); + fname.lStructSize=sizeof(fname); + fname.lpstrInitialDir=NULL; + fname.hwndOwner=hWnd; + fname.lpstrFilter=filefilter; + fname.nFilterIndex=0; + fname.lpstrFile=lpPath; + fname.nMaxFile=MAX_PATH; + fname.lpstrFileTitle=filename; + fname.nMaxFileTitle=sizeof(filename); + fname.lpfnHook=NULL; + fname.Flags=OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_EXPLORER | OFN_NOCHANGEDIR; + fname.lpstrDefExt="nes"; + + if(!GetOpenFileName(&fname)) return FALSE; + + return TRUE; + +} + +/***************************** + + +******************************/ +LRESULT CALLBACK ApplicationOptionDlgProc( HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam) +{ + switch (message) + { + case WM_INITDIALOG: + { + BOOL fCheck; + LPPROPSHEETPAGE lpPropPage=(LPPROPSHEETPAGE)lParam; + + if(lpPropPage->lParam) + CenterPropatySheet(hDlg); + + fCheck = g_fShowMsgOnSave ? BST_CHECKED : BST_UNCHECKED; + CheckDlgButton(hDlg, IDC_MSGONSAVE, fCheck); + } + break; + case WM_NOTIFY: + { + LPNMHDR pnmh = (LPNMHDR) lParam; + switch (pnmh->code) { + case PSN_APPLY: + { + g_fShowMsgOnSave = FALSE; + if(BST_CHECKED==IsDlgButtonChecked(hDlg, IDC_MSGONSAVE)) + g_fShowMsgOnSave=TRUE; + return TRUE; + } + break; + } + } + break; + } + + return FALSE; +} + +/****************************************** + + この関数は、はじめに表示されるページの + WM_INITDIALGのハンドラ内で呼び出される。 + +*******************************************/ +void CenterPropatySheet(HWND hDlg) +{ + HWND hWndParent=GetParent(GetParent(hDlg)); + HWND hWndProp=GetParent(hDlg); + // プロパテイシートを中央に持っていくためのもの + if(IsZoomed(hWndParent)) + { + RECT rcDlg; + RECT rcOwner; + int x,y,w,h; + + GetWindowRect(hWndProp,&rcDlg); + GetWindowRect(hWndParent,&rcOwner); + + w=rcDlg.right-rcDlg.left; + h=rcDlg.bottom-rcDlg.top; + x=rcOwner.left + ((rcOwner.right-rcOwner.left)-w)/2; + y=rcOwner.top + ((rcOwner.bottom-rcOwner.top)-h)/2; + if(x>=0 && y>=0 && w>=0 && h>=0) + SetWindowPos(hWndProp,NULL,x,y,w,h,SWP_NOZORDER|SWP_NOSIZE); + } +} + + +void OptionPropertySheet(HWND hwndOwner,int nStartPage) +{ + //TODO +#define OPTPS_NUM_PAGES 4 + LPTSTR lpTitle[OPTPS_NUM_PAGES]={STRING_OPTIONDIALOG_EMULATOR, STRING_OPTIONDIALOG_EDITOR, STRING_OPTIONDIALOG_APPLICATION, STRING_OPTIONDIALOG_OBJECTVIEW}; + LPTSTR lpDlgResName[OPTPS_NUM_PAGES]={"EMULATOROPTIONDLG", "EDITOROPTIONDLG", "APPLICATIONOPTIONDLG", "OBJECTVIEWOPTIONDLG"}; + DLGPROC pfnDlgProc[OPTPS_NUM_PAGES]={EmulatorOptionDlgProc, EditorOptionDlgProc, ApplicationOptionDlgProc, ObjectViewOptionDlgProc}; + //Local + PROPSHEETPAGE psp[OPTPS_NUM_PAGES]; + PROPSHEETHEADER psh; + int i; + + for(i=0;i= 0x8000;P += DUMP_BYTESPERLINE, wAddr += DUMP_BYTESPERLINE, wOfs += DUMP_BYTESPERLINE){ + wsprintf(szBuffer, + "$%.4x(%.4x) %.2X %.2X %.2X %.2X %.2X %.2X %.2X %.2X %.2X %.2X %.2X %.2X %.2X %.2X %.2X %.2X", + wAddr, wOfs, P[0], P[1], P[2], P[3], P[4], P[5], P[6], P[7], P[8], P[9], P[10], P[11], P[12], P[13], P[14], P[15]); + lv_OutputString(szBuffer, LOGVIEW_OUTPUTSTRING_CR); + } + } +} +*/ +/************************** + + ファイルの保存・ロード + +***************************/ +BOOL ConfirmOnExit() +{ + if(fr_GetDataChanged()) + { + int iRet; + + iRet = Msg(STRING_CONFIRM_EXIT, MB_YESNOCANCEL | MB_ICONINFORMATION); + if(iRet == IDYES) + { + if(!SaveAsFile(gFilePath)){ + Msg(STRING_FILEERROR_SAVE, MB_OK | MB_ICONWARNING); + return FALSE; + } + } + else if(iRet == IDCANCEL) + return FALSE; + } + return TRUE; +} + +#define SMBCHR_VALID_SIZE 0x1EC0 +BOOL LoadCHRROMFromFile(LPSTR pFileName, BOOL fLoadAll) +{ + FILE *fp; + INESHEADER CHRHead; + int iCHRTrn; + WORD wCHRValidSize; + LPTSTR szMsg = GetTempStringBuffer(); + + if (!gblIsROMLoaded) return FALSE; + + if((fp = fopen(pFileName, "rb")) == NULL){ + Msg(STRING_FILEERROR_NOTFOUND, MB_OK | MB_ICONWARNING); + return FALSE; + } + + fread(&CHRHead, 1, sizeof(INESHEADER), fp); + if(memcmp(CHRHead.cType, "NES\x1a", 4) || (CHRHead.bNum_CHARs != SMB_NUM_CHARS || CHRHead.bNum_PRGs != SMB_NUM_PRGS)){ + Msg(STRING_FILEERROR_FILEFORMAT, MB_OK | MB_ICONWARNING); + fclose(fp); + return FALSE; + } + + undoPrepare(UNDONAME_CHRLOAD); + + iCHRTrn = (CHRHead.bROM_Type & 0x4) ? INES_TRAINERSIZE : 0; + + fseek(fp, iCHRTrn + INES_PRGROMBANKSIZE * SMB_NUM_PRGS, SEEK_CUR); + + wCHRValidSize = (!fLoadAll) ? bPRGROM[0x870A] | ((WORD)bPRGROM[0x8705] << 8) : SMB_CHR_SIZE; + + if (wCHRValidSize > SMB_CHR_SIZE) + wCHRValidSize = SMB_CHR_SIZE; + + fread(bCHRROM, 1, wCHRValidSize, fp); + + fclose(fp); + + wsprintf(szMsg, STRING_LOGVIEW_LOADCHR, pFileName, wCHRValidSize); + lv_OutputString(szMsg, LOGVIEW_OUTPUTSTRING_CR); + + return TRUE; +} + + +BOOL LoadROMFromFile() +{ + LPTSTR szLV = GetTempStringBuffer(); + memset(bPRGROM,0,0x10000); + memset(bCHRROM,0,0x2000); + + if(gblIsROMLoaded) StopEmulator(); + + undoReset(); + + if(!LoadROM(gFilePath)) + { + gFilePath[0] = 0; + //gblIsROMLoaded=FALSE;//LoadROMが失敗した時点でFALSEになっている。 + ObjectListClear(); + ClearObjectViewBackBuffer(); + UpdateObjectView(0); + InitGlobalValue(); + SetToolBarButtonState(g_hTbWnd); + UpdateStatusBarRoomInfoText(g_hSbWnd); + RefreshWindowTitle(FALSE); + return FALSE; + } + + //キャラロムの前処理 + PrepareVROMData(bCHRROM); + + InitGlobalValue(); + + OpenNewRoomProcess(); + RefreshWindowTitle(FALSE); + SetToolBarButtonState(g_hTbWnd); + + wsprintf(szLV, STRING_LOGVIEW_FILEOPEN, gFilePath); + lv_OutputString(szLV, LOGVIEW_OUTPUTSTRING_CR); + + return TRUE; +} + + + +BOOL SetSaveFileName(HWND hWnd) +{ + OPENFILENAME fname; + TCHAR filename[65]; + char filefilter[]= {'i','N','E','S',' ','f','o','m','a','t',' ','R','O','M',' ','i','m','a','g','e',' ','(','*','.','n','e','s',')','\0','*','.','n','e','s','\0','\0','\0'}; + TCHAR curdir[MAX_PATH]; + TCHAR FilePath[MAX_PATH]; + + ReadFromRegistry(INI_MDIFRAME_FILEPATH, REG_SZ, &curdir, MAX_PATH * sizeof(TCHAR)); + + FilePath[0] = filename[0] = 0; + memset(&fname, 0, sizeof(OPENFILENAME)); + fname.lStructSize = sizeof(OPENFILENAME); + fname.lpstrInitialDir = curdir; + fname.hwndOwner = hWnd; + fname.lpstrFilter = filefilter; + fname.nFilterIndex = 0; + fname.lpstrFile = FilePath; + fname.nMaxFile = MAX_PATH; + fname.lpstrFileTitle = filename; + fname.nMaxFileTitle = sizeof(filename); + fname.lpfnHook = (LPOFNHOOKPROC)OFNHookProc; + fname.Flags = OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_EXPLORER|OFN_ENABLEHOOK|OFN_NOREADONLYRETURN| OFN_NOCHANGEDIR; + fname.lpstrDefExt = "nes"; + + if(!GetSaveFileName(&fname)) return FALSE; + + // + memset(curdir, 0, MAX_PATH * sizeof(TCHAR)); + memcpy(curdir, FilePath, fname.nFileOffset * sizeof(TCHAR)); + WriteToRegistry(INI_MDIFRAME_FILEPATH, REG_SZ, curdir, MAX_PATH * sizeof(TCHAR)); + + memcpy(gFilePath,FilePath,MAX_PATH); + + return TRUE; +} + +BOOL SaveToFile() +{ + LPTSTR szBuf = GetTempStringBuffer(); + + if(!SaveAsFile(gFilePath)) return FALSE; + + wsprintf(szBuf, STRING_LOGVIEW_FILESAVE, gFilePath); + lv_OutputString(szBuf, LOGVIEW_OUTPUTSTRING_CR); + SetStatusBarText(STRING_STATUSBAR_FILESAVE); + + return TRUE; +} + +/******************** + + バージョン情報 + +*********************/ + +void DumpVersion() +{ + LPTSTR szBuf = GetTempStringBuffer(); + + wsprintf(szBuf,"----------------- %s Ver.%d.%.2d -----------------",PROGRAMNAME, MAJORVERSION, MINORVERSION); + lv_OutputString(szBuf, LOGVIEW_OUTPUTSTRING_CR); + + wsprintf(szBuf,"(C) 1999-%d M.K.S", THISYEAR); + lv_OutputString(szBuf, LOGVIEW_OUTPUTSTRING_CR); + + lv_OutputString(__DATE__, LOGVIEW_OUTPUTSTRING_CR); + + lv_OutputString(STRING_VERSION_CONTRIBUTION, LOGVIEW_OUTPUTSTRING_CR); + +} + +LRESULT CALLBACK VersionDlgProc( HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam) +{ + switch (message) + { + case WM_INITDIALOG: + { + LPTSTR szBuf = GetTempStringBuffer(); + + wsprintf(szBuf,"%s Ver.%d.%.2d",PROGRAMNAME, MAJORVERSION, MINORVERSION); + SetDlgItemText(hDlg, IDC_TITLE, szBuf); + + wsprintf(szBuf,"(C) 1999-%d M.K.S", THISYEAR); + SetDlgItemText(hDlg, IDC_COPYRIGHT, szBuf); + + SetDlgItemText(hDlg, IDC_NOTE, __DATE__); + + SetDlgItemText(hDlg, IDC_CONTRIBUTION, STRING_VERSION_CONTRIBUTION); + + DumpVersion(); + } + break; + case WM_COMMAND: + { + if(LOWORD(wParam) == IDOK) + { + EndDialog(hDlg, TRUE); + return TRUE; + } + } + break; + } + + return FALSE; +} + +static void ResizeMDIParentWindow(HWND hWnd) +{ + WORD wWidth; // width of client area + WORD wHeight; // height of client area + int iToolY, iStatusY, iLogViewY; + RECT rc; +// POINT pt; + + iToolY = iStatusY = iLogViewY = 0; + + GetClientRect(hWnd, &rc); + wWidth = (WORD)(rc.right - rc.left); + wHeight = (WORD)(rc.bottom - rc.top); + + if(g_hTbWnd){ + GetWindowRect(g_hTbWnd, &rc); + iToolY = rc.bottom - rc.top; + } + + if(g_hSbWnd){ + GetWindowRect(g_hSbWnd, &rc); + iStatusY = rc.bottom - rc.top; + } + + if(lv_ShowLogView()){ + GetWindowRect(lv_GetLogViewWnd(), &rc); + iLogViewY = rc.bottom - rc.top; + } + + // + if(g_hTbWnd){ + MoveWindow(g_hTbWnd, 0, 0, wWidth, iToolY, TRUE); + } + if(g_hSbWnd){ + MoveWindow(g_hSbWnd, 0, wHeight - iStatusY, wWidth, iStatusY, TRUE); + SizeMainWindowStatusBar(g_hSbWnd, hWnd); + } + if(lv_ShowLogView()){ + MoveWindow(lv_GetBorderWnd(), + 0, + wHeight - iStatusY - (iLogViewY + LOGVIEW_BORDERWIDTH), + wWidth, + LOGVIEW_BORDERWIDTH, + TRUE); + MoveWindow(lv_GetLogViewWnd(), + 0, + wHeight - iStatusY - iLogViewY, + wWidth, + iLogViewY, + TRUE); + iLogViewY += LOGVIEW_BORDERWIDTH; + } + MoveWindow(ghWndMDIClient,0, iToolY, wWidth, wHeight - iToolY - iStatusY - iLogViewY,TRUE); + + SendMessage(ghWndMDIClient,WM_MDIICONARRANGE,(WPARAM)0,(LPARAM)0); + +} + +static void LoadWindowPlacement(LPTSTR lpValueName,HWND hWnd) +{ + WINDOWPLACEMENT sWndPl={0}; + + if(ReadFromRegistry(lpValueName,REG_BINARY,&sWndPl,sizeof(WINDOWPLACEMENT))){ + sWndPl.length=sizeof(WINDOWPLACEMENT); + SetWindowPlacement(hWnd,&sWndPl); + } +} + +static BOOL SaveWindowPlacement(LPTSTR lpValueName,HWND hWnd) +{ + WINDOWPLACEMENT sWndPl={0}; + + sWndPl.length=sizeof(WINDOWPLACEMENT); + sWndPl.flags=WPF_RESTORETOMAXIMIZED|WPF_SETMINPOSITION; + GetWindowPlacement(hWnd,&sWndPl); + WriteToRegistry(lpValueName,REG_BINARY,&sWndPl,sizeof(WINDOWPLACEMENT)); + + return TRUE; +} + +static void SetMenuStateNeedRom(HWND hWnd) +{ +#define SMSNR_NUM_MENUS 24 + UINT uMenuID[SMSNR_NUM_MENUS]={IDM_FILE_SAVE, + IDM_FILE_SAVEAS, + IDM_FILE_CHRLOAD, + IDM_FILE_IPS, + IDM_SETTING_AREA, + IDM_SETTING_MAPHEAD, + IDM_SETTING_MAP, + IDM_SETTING_BADGUYS, + IDM_SETTING_GAME, + IDM_EDIT_STRINGS, + IDM_EDIT_LOOP, + IDM_EDIT_AREASORT, + IDM_EDIT_LOOPWIZARD, + IDM_TOOL_WORLDDATAUPDATE, + IDM_TOOL_GENERALSETTING, + IDM_TOOL_DEMORECORD, + IDM_EMULATOR_NORMALPLAY, + IDM_EMULATOR_LOADPLAY, + IDM_EMULATOR_PAGEPLAY, + IDM_EMULATOR_PAGEPLAYHALF, + IDM_EMULATOR_TESTPLAYSETTING, + IDM_EMULATOR_LOAD, + IDM_EMULATOR_SAVE, + IDM_EMULATOR_STOP}; + + static BOOL blPrevLoaded = TRUE; + register int i; + HMENU hMenu; + UINT uEnable; + + hMenu=GetMenu(hWnd); + + if(gblIsROMLoaded){ + if(blPrevLoaded!=TRUE){ + for(i=0;icode==TTN_GETDISPINFO)// + { + LPNMTTDISPINFO TTtext; + //tooltip for toolbar + TTtext=(LPNMTTDISPINFO)lParam; + switch(TTtext->hdr.idFrom){ + case IDM_FILE_OPEN:TTtext->lpszText = STRING_TOOLTIP_OPEN; break; + case IDM_FILE_SAVE:TTtext->lpszText = STRING_TOOLTIP_SAVE; break; + case IDM_SETTING_AREA:TTtext->lpszText = STRING_TOOLTIP_ROOM; break; + case IDM_SETTING_BADGUYS:TTtext->lpszText = STRING_TOOLTIP_BADGUYS; break; + case IDM_SETTING_MAP:TTtext->lpszText = STRING_TOOLTIP_MAP; break; + case IDM_EMULATOR_NORMALPLAY:TTtext->lpszText = STRING_TOOLTIP_TESTPLAY; break; + case IDM_EMULATOR_PAGEPLAY:TTtext->lpszText = STRING_TOOLTIP_PAGETESTPLAY; break; + case IDM_EMULATOR_PAGEPLAYHALF:TTtext->lpszText = STRING_TOOLTIP_HALFPOINTTESTPLAY; break; + case IDM_EMULATOR_STOP:TTtext->lpszText = STRING_TOOLTIP_STOP; break; + case IDM_EMULATOR_TESTPLAYSETTING:TTtext->lpszText = STRING_TOOLTIP_TESTPLAYSETTING; break; + } + } + } + break; + case WM_COMMAND: + { + switch(LOWORD(wParam)) + { + case IDM_FILE_OPEN: + { + OPENFILENAME fname; + char filename[64]={0}; + char filefilter[]= {'i','N','E','S',' ','f','o','m','a','t',' ','R','O','M',' ','i','m','a','g','e',' ','(','*','.','n','e','s',')','\0','*','.','n','e','s','\0', + 'A','l','l',' ','(','*','.','*',')','\0','*','.','*','\0','\0','\0'}; + TCHAR curdir[MAX_PATH]={0}; + TCHAR FilePath[MAX_PATH]={0}; + + if(!ConfirmOnExit()) goto OPENCANCEL; + + ReadFromRegistry(INI_MDIFRAME_FILEPATH,REG_SZ,&curdir,MAX_PATH*sizeof(TCHAR)); + + memset(&fname,0,sizeof(OPENFILENAME)); + fname.lStructSize=sizeof(fname); + fname.lpstrInitialDir=curdir; + fname.hwndOwner=hWnd; + fname.lpstrFilter=filefilter; + fname.nFilterIndex=0; + fname.lpstrFile=FilePath; + fname.nMaxFile=MAX_PATH; + fname.lpstrFileTitle=filename; + fname.nMaxFileTitle=sizeof(filename); + fname.lpfnHook=(LPOFNHOOKPROC)OFNHookProc; + fname.Flags=OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_EXPLORER | OFN_ENABLEHOOK | OFN_NOCHANGEDIR; + fname.lpstrDefExt="nes"; + + if(!GetOpenFileName(&fname)) goto OPENCANCEL; + + memset(curdir,0,MAX_PATH*sizeof(TCHAR)); + memcpy(curdir,FilePath,fname.nFileOffset*sizeof(TCHAR)); + WriteToRegistry(INI_MDIFRAME_FILEPATH,REG_SZ,curdir,MAX_PATH*sizeof(TCHAR)); + + memcpy(gFilePath,FilePath,MAX_PATH*sizeof(TCHAR)); + LoadROMFromFile(); +OPENCANCEL: + SendMessage(g_hTbWnd,TB_CHECKBUTTON,(LPARAM)IDM_FILE_OPEN,(WPARAM)MAKELONG(FALSE,0)); + } + break; + case IDM_FILE_SAVE: + if(gblIsROMLoaded){ + if (g_fShowMsgOnSave){ + if(IDNO == Msg(STRING_CONFIRM_SAVE, MB_YESNO | MB_ICONQUESTION | MB_DEFBUTTON2)) + break; + } + while(gFilePath[0]=='\0' || !SaveToFile()){ + Msg(STRING_FILEERROR_SAVE, MB_OK | MB_ICONWARNING); + if(!SetSaveFileName(hWnd)) break; + } + RefreshWindowTitle(FALSE); + } + break; + case IDM_FILE_SAVEAS: + { + if(!gblIsROMLoaded) break; + if(SetSaveFileName(hWnd)){ + if(SaveToFile()) + RefreshWindowTitle(FALSE); + else + Msg(STRING_FILEERROR_SAVEAS, MB_OK | MB_ICONWARNING); + } + } + break; + case IDM_FILE_CHRLOAD: + { + OPENFILENAME fname; + char filename[64]={0}; + char filefilter[]= {'i','N','E','S',' ','f','o','m','a','t',' ','R','O','M',' ','i','m','a','g','e',' ','(','*','.','n','e','s',')','\0','*','.','n','e','s','\0', + 'A','l','l',' ','(','*','.','*',')','\0','*','.','*','\0','\0','\0'}; + TCHAR curdir[MAX_PATH]={0}; + TCHAR filepath[MAX_PATH]={0}; + + if(!gblIsROMLoaded) break; + + memset(&fname,0,sizeof(OPENFILENAME)); + fname.lStructSize=sizeof(fname); + fname.lpstrInitialDir=curdir; + fname.hwndOwner=hWnd; + fname.lpstrTitle=STRING_FILEOPENDIALOG_CHRLOAD; + fname.lpstrFilter=filefilter; + fname.nFilterIndex=0; + fname.lpstrFile=filepath; + fname.nMaxFile=sizeof(filepath); + fname.lpstrFileTitle=filename; + fname.nMaxFileTitle=sizeof(filename); + fname.lpfnHook=(LPOFNHOOKPROC)OFNHookProc; + fname.Flags=OFN_FILEMUSTEXIST | OFN_HIDEREADONLY| OFN_EXPLORER | OFN_ENABLEHOOK| OFN_NOCHANGEDIR | OFN_ENABLETEMPLATE; + fname.lpstrDefExt="nes"; + fname.hInstance = GetModuleHandle(NULL); + fname.lpTemplateName = "LOADCHROPTION"; + + if(!GetOpenFileName(&fname)) break; + + if(LoadCHRROMFromFile(filepath, fname.lCustData)){ + //キャラロムの前処理 + PrepareVROMData(bCHRROM); + UpdateObjectView(0); + } + } + break; + case IDM_FILE_EXIT: + PostMessage(hWnd, WM_CLOSE, 0, 0); + break; + case IDM_EDIT_UNDO: + { + if(gblIsROMLoaded) undoRestore(); + } + break; + case IDM_SETTING_AREA: + { + if(gblIsROMLoaded){ + DialogBox(ghInst, "ROOMSELECTDLG", hWnd, AreaSettingDlgProc); + if(g_hTbWnd){ + LPARAM dwState; + // ボタンを元に戻す + SendMessage(g_hTbWnd, TB_CHECKBUTTON, (LPARAM)IDM_SETTING_AREA, 0); + // 途中ページテストプレイのボタンの有効、無効 + dwState = (rm_IsSubRoom()) ? MAKELPARAM(FALSE, 0) : MAKELPARAM(TRUE, 0); + SendMessage(g_hTbWnd, TB_ENABLEBUTTON, IDM_EMULATOR_PAGEPLAYHALF, dwState); + } + } + } + break; + case IDM_SETTING_MAPHEAD: + { + if(gblIsROMLoaded) + DialogBox(ghInst,"MAPCOMHEADEDITDLG",hWnd,MapComHeadEditDlgProc); + } + break; + case IDM_SETTING_MAP: + { +// if(EDITMODE_MAP == GetMapEditMode()) break; + ChangeMapEditMode(CHANGEEDITMODE_MAP, FALSE); + if(gblIsROMLoaded) + { + UpdateObjectViewCursole(); + UpdateObjectList(0); + UpdateObjectView(0); + } + SendMessage(g_hTbWnd,TB_CHECKBUTTON,(LPARAM)IDM_SETTING_MAP,(WPARAM)1); + } + break; + case IDM_SETTING_BADGUYS: + { +// if(EDITMODE_BADGUYS == GetMapEditMode()) break; + ChangeMapEditMode(CHANGEEDITMODE_BADGUYS, FALSE); + if(gblIsROMLoaded) + { + UpdateObjectViewCursole(); + UpdateObjectList(0); + UpdateObjectView(0); + } + SendMessage(g_hTbWnd,TB_CHECKBUTTON,(LPARAM)IDM_SETTING_BADGUYS,(WPARAM)1); + + } + break; + case IDM_VIEW_TOOLBAR: + { + if(g_hTbWnd){ + DestroyWindow(g_hTbWnd); + g_hTbWnd=NULL; + } + else{ + g_hTbWnd=CreateMainWindowToolBar(hWnd); + } + ResizeMDIParentWindow(hWnd); + } + break; + case IDM_VIEW_STATUSBAR: + { + if(g_hSbWnd){ + DestroyWindow(g_hSbWnd); + g_hSbWnd=NULL; + } + else{ + g_hSbWnd=CreateMainWindowStatusBar(hWnd); + } + ResizeMDIParentWindow(hWnd); + } + break; + case IDM_VIEW_LOGVIEW: + { + if(lv_ShowLogView()){ + lv_DestroyLogView(); + } + else{ + lv_CreateLogView(hWnd, -1); + } + ResizeMDIParentWindow(hWnd); + } + break; + case IDM_EDIT_STRINGS: + if(gblIsROMLoaded) DialogBox(ghInst, "STRINGEDITDLG", hWnd, StringEditDlgProc); + break; + case IDM_EDIT_LOOP: + if(gblIsROMLoaded) DialogBox(ghInst, "LOOPEDITDLG", hWnd, LoopEditDlgProc); + break; + case IDM_EDIT_AREASORT: + if(gblIsROMLoaded) DialogBox(ghInst, "AREASORTDLG", hWnd, AreaSortDlgProc); + break; + case IDM_TOOL_WORLDDATAUPDATE: + if(gblIsROMLoaded + && (IDOK == Msg(STRING_CONFIRM_UPDATEWORLD, MB_OKCANCEL | MB_ICONINFORMATION))){ + LPTSTR szBuf = GetTempStringBuffer(); + UpdateWorldData(TRUE); + wsprintf(szBuf,"$9CB4 : %.2xH %.2xH %.2xH %.2xH %.2xH %.2xH %.2xH %.2xH", + bPRGROM[SMB_WORLD_SETTING], + bPRGROM[SMB_WORLD_SETTING + 1], + bPRGROM[SMB_WORLD_SETTING + 2], + bPRGROM[SMB_WORLD_SETTING + 3], + bPRGROM[SMB_WORLD_SETTING + 4], + bPRGROM[SMB_WORLD_SETTING + 5], + bPRGROM[SMB_WORLD_SETTING + 6], + bPRGROM[SMB_WORLD_SETTING + 7]); + lv_OutputString(szBuf, LOGVIEW_OUTPUTSTRING_CR); + + } + break; + case IDM_TOOL_GENERALSETTING: + if(gblIsROMLoaded) DialogBox(ghInst, "GENERALSETTINGDLG", hWnd, GeneralSettingDlgProc); + break; + case IDM_SETTING_GAME: + if(gblIsROMLoaded) GameSettingPropertySheet(hWnd); + break; + case IDM_TOOL_DEMORECORD: + if(gblIsROMLoaded){ + if(IDCANCEL == Msg(STRING_CONFIRM_DEMORECORD, MB_OKCANCEL | MB_ICONINFORMATION)) break; + + OpenIcon(GetEmuWndHandle()); + SendMessage(ghWndMDIClient,WM_MDIACTIVATE,(WPARAM)GetEmuWndHandle(),0); + + DemoRecord(); + } + break; + /* + case IDM_TOOL_DUMPPRG: + { + _beginthread(DumpPRGROM, 0 , NULL); + } + break; + */ + case IDM_EMULATOR_NORMALPLAY: + { + if(!gblIsROMLoaded) break; + + RunEmulatorTestPlay(); + + OpenIcon(GetEmuWndHandle()); + SendMessage(ghWndMDIClient,WM_MDIACTIVATE,(WPARAM)GetEmuWndHandle(),0); + } + break; + case IDM_EMULATOR_PAGEPLAY: + { + int iPage; + + if(!gblIsROMLoaded) break; + + if(GetMapEditMode()) + GetBadGuysData(GETADDRESS_CURRENT_EDITTING,GetSelectedIndex(),NULL,&iPage); + else + GetMapData(GETADDRESS_CURRENT_EDITTING,GetSelectedIndex(),NULL,&iPage); + + RunEmulatorTestPlayEx(iPage,FALSE,NULL); + + OpenIcon(GetEmuWndHandle()); + SendMessage(ghWndMDIClient,WM_MDIACTIVATE,(WPARAM)GetEmuWndHandle(),0); + } + break; + case IDM_EMULATOR_PAGEPLAYHALF: + { + if(!gblIsROMLoaded || rm_IsSubRoom()) break; + RunEmulatorTestPlayEx(0,TRUE,NULL); + OpenIcon(GetEmuWndHandle()); + SendMessage(ghWndMDIClient,WM_MDIACTIVATE,(WPARAM)GetEmuWndHandle(),0); + } + break; + case IDM_EMULATOR_LOADPLAY: + { + if(!gblIsROMLoaded) break; + + RunEmulatorNormal(); + + OpenIcon(GetEmuWndHandle()); + SendMessage(ghWndMDIClient,WM_MDIACTIVATE,(WPARAM)GetEmuWndHandle(),0); + } + break; + case IDM_EMULATOR_STOP: + { + if(!gblIsROMLoaded) break; + StopEmulator(); + } + break; + case IDM_EMULATOR_SAVE: + if(!gblIsROMLoaded) break; + if(SaveEmulatorState()) + SetStatusBarText(STRING_STATUSBAR_EMUSAVE); + break; + case IDM_EMULATOR_LOAD: + { + EMULATORSETUP es; + + if(!gblIsROMLoaded) break; + + memset(&es,0,sizeof(EMULATORSETUP)); + + es.pbPRGROM=bPRGROM+0x8000; + es.pbCHRROM=bCHRROM; + if(iTrainer) es.pbTRAINER=bPRGROM+0x7000; + if(LoadEmulatorState(&es)) + { + SetStatusBarText(STRING_STATUSBAR_EMULOAD); + OpenIcon(GetEmuWndHandle()); + SendMessage(ghWndMDIClient,WM_MDIACTIVATE,(WPARAM)GetEmuWndHandle(),0); + } + } + break; + case IDM_EMULATOR_TESTPLAYSETTING: + if(gblIsROMLoaded){ + DialogBox(ghInst,"TESTPLAYSETTINGDLG",hWnd,TestPlaySettingDlgProc); + if(g_hTbWnd) SendMessage(g_hTbWnd,TB_CHECKBUTTON,(LPARAM)IDM_EMULATOR_TESTPLAYSETTING,(WPARAM)MAKELONG(FALSE,0)); + } + break; + case IDM_TOOL_OPTION: + OptionPropertySheet(hWnd,0); + break; + case IDM_TOOL_CUSTOMIZE: + DialogBox(ghInst,"CUSTOMIZEDLG",hWnd,CustomizeDlgProc); + break; + case IDM_WINDOW_CLOSEALL: + ShowWindow(ghWndMapView,SW_MINIMIZE); + ShowWindow(ghWndMapEdit,SW_MINIMIZE); + ShowWindow(GetEmuWndHandle(),SW_MINIMIZE); + break; + case IDM_WINDOW_CASCADE: + SendMessage(ghWndMDIClient,WM_MDICASCADE,(WPARAM)0,(LPARAM)0); + break; + case IDM_WINDOW_NEXT: + { + HWND hCurWnd; + + hCurWnd=(HWND)SendMessage(ghWndMDIClient,WM_MDIGETACTIVE,0,0); + if(!hCurWnd) break; + SendMessage(ghWndMDIClient,WM_MDINEXT,(WPARAM)hCurWnd,(LPARAM)0); + } + break; + case IDM_WINDOW_PREV: + { + HWND hCurWnd; + + hCurWnd=(HWND)SendMessage(ghWndMDIClient,WM_MDIGETACTIVE,0,0); + if(!hCurWnd) break; + SendMessage(ghWndMDIClient,WM_MDINEXT,(WPARAM)hCurWnd,(LPARAM)1); + } + break; + case IDM_HELP_VERSION: + DialogBox(ghInst,"VERSIONDLG",hWnd,VersionDlgProc); + break; + default: + { + if(gblIsROMLoaded) MapEditCommand(LOWORD(wParam)); + } + } + + } + break; + case WM_SIZE: + { + ResizeMDIParentWindow(hWnd); + return 0;//important + } + case WM_INITMENU: + { + CheckMenuRadioItem(GetMenu(hWnd),IDM_SETTING_MAP,IDM_SETTING_BADGUYS,IDM_SETTING_MAP+GetMapEditMode(),MF_BYCOMMAND); + + if(g_hTbWnd) + MyCheckMenuItem(hWnd,IDM_VIEW_TOOLBAR,TRUE); + else + MyCheckMenuItem(hWnd,IDM_VIEW_TOOLBAR,FALSE); + + if(g_hSbWnd) + MyCheckMenuItem(hWnd,IDM_VIEW_STATUSBAR,TRUE); + else + MyCheckMenuItem(hWnd,IDM_VIEW_STATUSBAR,FALSE); + + if(lv_GetLogViewWnd()) + MyCheckMenuItem(hWnd,IDM_VIEW_LOGVIEW,TRUE); + else + MyCheckMenuItem(hWnd,IDM_VIEW_LOGVIEW,FALSE); + + EnableMenuItem(GetMenu(hWnd),IDM_EDIT_UNDO,MF_BYCOMMAND|MF_GRAYED); + { + TCHAR tcUndoMenu[UNDO_MENUTEXT_BUFFERSIZE]; + + wsprintf(tcUndoMenu,UNDO_MENUTEXT,undoGetNameBuffer()); + MySetMenuItemText(hWnd,IDM_EDIT_UNDO,tcUndoMenu); + if(undoIsEnabled()) + EnableMenuItem(GetMenu(hWnd),IDM_EDIT_UNDO,MF_BYCOMMAND|MF_ENABLED); + } + + SetMenuStateNeedRom(hWnd); + + } + break; + case WM_DROPFILES: + { + if(ConfirmOnExit()){ + DragQueryFile((HANDLE)wParam,0,gFilePath,MAX_PATH); + LoadROMFromFile(); + } + + DragFinish((HANDLE)wParam); + } + break; + case WM_CREATE: + { + CLIENTCREATESTRUCT ccs; + DWORD dwSetting; + + // MDI + if(!ReadFromRegistry(INI_MDIFRAME_OTHERSETTING,REG_DWORD,&dwSetting,sizeof(DWORD))) + dwSetting=0xFFFFFFFF; + + g_hTbWnd=NULL;g_hSbWnd=NULL; + if(dwSetting&MDIFRAME_OTHERSETTING_TOOLBAR) g_hTbWnd=CreateMainWindowToolBar(hWnd); + if(dwSetting&MDIFRAME_OTHERSETTING_STATUSBAR) g_hSbWnd=CreateMainWindowStatusBar(hWnd); + g_fShowMsgOnSave = (dwSetting & MDIFRAME_OTHERSETTING_MSGONSAVE) ? TRUE : FALSE; + + if(lv_ShowLogView()) + lv_CreateLogView(hWnd, -1); + + // ObjView + if(!ReadFromRegistry(INI_OBJECTVIEW_SETTING, REG_DWORD, &dwSetting, sizeof(DWORD))) + dwSetting = OBJVIEWSETTING_DEFAULT; + ObjectViewSetSetting(dwSetting); + + ccs.hWindowMenu = GetSubMenu(GetMenu(hWnd),5); + ccs.idFirstChild = IDM_WINDOW_CHILD; + + ghWndMDIClient = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, + TEXT("mdiclient"), + TEXT("mdiclient"), + WS_CHILD | WS_VISIBLE|WS_CLIPCHILDREN | WS_CLIPSIBLINGS |MDIS_ALLCHILDSTYLES, + 0, 0, + 0, 0, + hWnd, + (HMENU)IDW_MDICLIENT, + GetModuleHandle(NULL), + (LPSTR)&ccs); + + ShowWindow (ghWndMDIClient,SW_SHOW); + UpdateWindow (ghWndMDIClient); + + DumpVersion(); + return 0; + } + case WM_CLOSE: + if(fr_GetDataChanged() && !ConfirmOnExit()) return 0; + break; + case WM_DESTROY: + { + DWORD dwSetting; + + SaveWindowPlacement(INI_MDIFRAME_WINDOW,hWnd); + SaveWindowPlacement(INI_OBJECTLIST_WINDOW,ghWndMapEdit); + SaveWindowPlacement(INI_OBJECTVIEW_WINDOW,ghWndMapView); + SaveWindowPlacement(INI_EMULATOR_WINDOW,ghWndEmu); + + dwSetting=0; + if(g_hTbWnd){ + dwSetting |= MDIFRAME_OTHERSETTING_TOOLBAR; + DestroyWindow(g_hTbWnd); + g_hTbWnd = NULL; + } + if(g_hSbWnd){ + dwSetting |= MDIFRAME_OTHERSETTING_STATUSBAR; + DestroyWindow(g_hSbWnd); + g_hSbWnd = NULL; + } + if(g_fShowMsgOnSave) + dwSetting |= MDIFRAME_OTHERSETTING_MSGONSAVE; + WriteToRegistry(INI_MDIFRAME_OTHERSETTING, REG_DWORD, &dwSetting, sizeof(DWORD)); + + dwSetting = ObjectViewGetSetting(); + WriteToRegistry(INI_OBJECTVIEW_SETTING, REG_DWORD, &dwSetting, sizeof(DWORD)); + + lv_Trash(); + + DestroyWindow(ghWndMDIClient); + + PostQuitMessage(0); + } + break; + } + + return DefFrameProc (hWnd,ghWndMDIClient,msg,wParam,lParam); +} + +BOOL RegisterWndClass(HINSTANCE hInstance,int nCmdShow) +{ + WNDCLASSEX wcx; + + wcx.cbSize = sizeof(WNDCLASSEX); + wcx.lpfnWndProc = (WNDPROC) MDIFrameWndProc; + wcx.style = + wcx.cbClsExtra = + wcx.cbWndExtra = 0; + wcx.hInstance = hInstance; + wcx.hIcon = LoadIcon(hInstance, "APPICON"); + wcx.hIconSm = LoadIcon(hInstance, "APPICON"); + wcx.hCursor = LoadCursor(NULL,IDC_ARROW); + wcx.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE+1); + wcx.lpszMenuName = "MAINWNDMENU"; + wcx.lpszClassName = FRAMEWNDCLASSNAME; + + if (!RegisterClassEx(&wcx))return FALSE; + + if(!RegisterMapEditWndClass(hInstance)) return FALSE; + if(!RegisterEmuWndClass(hInstance)) return FALSE; + if(!RegisterMapViewWndClass(hInstance)) return FALSE; + + if(!lv_Initialize()) return FALSE; + + /* Create the frame */ + ghWndFrame = CreateWindowEx(WS_EX_ACCEPTFILES, + FRAMEWNDCLASSNAME, + PROGRAMNAME, + WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + NULL, + NULL, + hInstance, + NULL); + + if(!ghWndFrame || !ghWndMDIClient) return FALSE; + + //Create MDI Child window + //最後にオブジェクトビューを作成すれば、オブジェクトビューがアクティブで起動する。 + ghWndEmu=CreateEmulatorWnd(hInstance,ghWndMDIClient); + ghWndMapEdit=CreateMapEditWnd(hInstance,ghWndMDIClient); + ghWndMapView=CreateMapViewWnd(hInstance,ghWndMDIClient);//After Emulator is Created + + if(!ghWndMapEdit||!ghWndEmu||!ghWndMapView) return FALSE; + + //ウインドウメニューのため + Sleep(5); + + ShowWindow(ghWndMapView,SW_HIDE); + ShowWindow(ghWndMapView,SW_HIDE); + ShowWindow(ghWndMapEdit,SW_HIDE); + ShowWindow(ghWndEmu,SW_HIDE); + + if(nCmdShow==SW_SHOWNORMAL){ + LoadWindowPlacement(INI_MDIFRAME_WINDOW,ghWndFrame); + LoadWindowPlacement(INI_EMULATOR_WINDOW, ghWndEmu); + LoadWindowPlacement(INI_OBJECTLIST_WINDOW,ghWndMapEdit); + LoadWindowPlacement(INI_OBJECTVIEW_WINDOW,ghWndMapView); + nCmdShow=SW_SHOWNA; + } + + ShowWindow (ghWndFrame,nCmdShow); + UpdateWindow (ghWndFrame); + + ShowWindow(ghWndMapView,SW_SHOWNA); + UpdateWindow(ghWndMapView); + + ShowWindow(ghWndMapEdit,SW_SHOWNA); + UpdateWindow(ghWndMapEdit); + + ShowWindow(ghWndEmu,SW_SHOWNA); + UpdateWindow(ghWndEmu); + + lv_AdjustLogView(); + + if(strlen(gFilePath)!=0) + LoadROMFromFile(); + + return TRUE; + +} + + + + +int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow) +{ + MSG msg; + HACCEL hAccel; + + // Ensure that the common control DLL is loaded + InitCommonControls(); + + // Get file + gFilePath[0] = 0; + if (lstrlen(lpCmdLine)) { + if (lpCmdLine[0] != '"') { + lstrcpy((LPTSTR)gFilePath, (LPCTSTR)lpCmdLine); + } + else { + lstrcpyn(gFilePath, lpCmdLine + 1, lstrlen(lpCmdLine) - 1); + } + } + + ghInst = hInstance; + + if(!RegisterWndClass(hInstance,nCmdShow)) return 0; + + LoadTestPlaySettings(); + + hAccel = ky_Initialize(); + + LoadEditorOption(); + + while (GetMessage(&msg,NULL,0,0)) + { + if(!TranslateMDISysAccel(ghWndMDIClient, &msg) && + !TranslateAccelerator(ghWndFrame,hAccel,&msg)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + + return msg.wParam; + +} \ No newline at end of file diff --git a/src/frame.h b/src/frame.h new file mode 100644 index 0000000..ca71d40 --- /dev/null +++ b/src/frame.h @@ -0,0 +1,22 @@ +/************************************************************************************ + + smb Utility + + File: frame.h + Description: + History: + + ************************************************************************************/ +#ifndef FRAME_H +#define FRAME_H + +int Msg(LPCTSTR lpText,UINT uType); +void SetStatusBarText(LPTSTR lpText); +void RefreshWindowTitle(BOOL); +void UpdateStatusBarRoomInfoText(HWND hSbWnd); +void CenterPropatySheet(HWND hDlg); +HWND fr_GetStatusBar(); +BOOL fr_SetDataChanged(BOOL); +BOOL fr_GetDataChanged(); + +#endif /* FRAME_H */ \ No newline at end of file diff --git a/src/image/assist_img.bmp b/src/image/assist_img.bmp new file mode 100644 index 0000000..f54b848 Binary files /dev/null and b/src/image/assist_img.bmp differ diff --git a/src/image/castle_img.bmp b/src/image/castle_img.bmp new file mode 100644 index 0000000..055b6f0 Binary files /dev/null and b/src/image/castle_img.bmp differ diff --git a/src/image/emulator.ico b/src/image/emulator.ico new file mode 100644 index 0000000..b6a6f7d Binary files /dev/null and b/src/image/emulator.ico differ diff --git a/src/image/lf_img.bmp b/src/image/lf_img.bmp new file mode 100644 index 0000000..372a303 Binary files /dev/null and b/src/image/lf_img.bmp differ diff --git a/src/image/maplisti.ico b/src/image/maplisti.ico new file mode 100644 index 0000000..37af05d Binary files /dev/null and b/src/image/maplisti.ico differ diff --git a/src/image/mapview.ico b/src/image/mapview.ico new file mode 100644 index 0000000..cc8b114 Binary files /dev/null and b/src/image/mapview.ico differ diff --git a/src/image/rg_img.bmp b/src/image/rg_img.bmp new file mode 100644 index 0000000..5581031 Binary files /dev/null and b/src/image/rg_img.bmp differ diff --git a/src/image/rom.ico b/src/image/rom.ico new file mode 100644 index 0000000..cef6f93 Binary files /dev/null and b/src/image/rom.ico differ diff --git a/src/image/sea_img.bmp b/src/image/sea_img.bmp new file mode 100644 index 0000000..49b532d Binary files /dev/null and b/src/image/sea_img.bmp differ diff --git a/src/image/sky_img.bmp b/src/image/sky_img.bmp new file mode 100644 index 0000000..2f68707 Binary files /dev/null and b/src/image/sky_img.bmp differ diff --git a/src/image/smbutil.ico b/src/image/smbutil.ico new file mode 100644 index 0000000..a15c9dd Binary files /dev/null and b/src/image/smbutil.ico differ diff --git a/src/image/toolbar.bmp b/src/image/toolbar.bmp new file mode 100644 index 0000000..32f710f Binary files /dev/null and b/src/image/toolbar.bmp differ diff --git a/src/image/tvmask.bmp b/src/image/tvmask.bmp new file mode 100644 index 0000000..38940b0 Binary files /dev/null and b/src/image/tvmask.bmp differ diff --git a/src/image/ug_img.bmp b/src/image/ug_img.bmp new file mode 100644 index 0000000..77cc1c1 Binary files /dev/null and b/src/image/ug_img.bmp differ diff --git a/src/image/xgauge_img.bmp b/src/image/xgauge_img.bmp new file mode 100644 index 0000000..e4083ff Binary files /dev/null and b/src/image/xgauge_img.bmp differ diff --git a/src/image/ygauge_img.bmp b/src/image/ygauge_img.bmp new file mode 100644 index 0000000..1babd9b Binary files /dev/null and b/src/image/ygauge_img.bmp differ diff --git a/src/ini.c b/src/ini.c new file mode 100644 index 0000000..3e427c0 --- /dev/null +++ b/src/ini.c @@ -0,0 +1,169 @@ +/************************************************************************************ + + smb Utility + + File: ini.c + Description: レジストリ、INIファイルアクセスのためのルーチン + History: + + ************************************************************************************/ +#include +#include +#include "ini.h" +#include "cmnlib.h" +/******************** + + レジストリアクセス + +*********************/ + +/************************************* +dwType + REG_BINARY 任意の形式のバイナリデータ + REG_DWORD 32ビット値 + REG_SZ 文字列 +**************************************/ +BOOL WriteToRegistry(LPSTR lpValueName,DWORD dwType,LPVOID lpData,DWORD dwSize) +{ + HKEY hRegKey; + BOOL blRet=TRUE; + + RegCreateKeyEx(HKEY_CURRENT_USER,REGROOTPATH,0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hRegKey,NULL); + if(!hRegKey) return FALSE; + if(ERROR_SUCCESS!=RegSetValueEx(hRegKey,lpValueName,0,dwType,lpData,dwSize)) + blRet=FALSE; + RegCloseKey(hRegKey); + return blRet; +} + +/************************************* +dwType + REG_BINARY 任意の形式のバイナリデータ + REG_DWORD 32ビット値 + REG_SZ 文字列 +**************************************/ +BOOL ReadFromRegistry(LPSTR lpValueName,DWORD dwType,LPVOID lpData,DWORD dwSize) +{ + HKEY hRegKey; + DWORD dwTypeRet; + BOOL blRet=TRUE; + LONG lResult; + + RegCreateKeyEx(HKEY_CURRENT_USER,REGROOTPATH,0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hRegKey,NULL); + if(!hRegKey) return FALSE; + lResult=RegQueryValueEx(hRegKey,lpValueName,NULL,&dwTypeRet,lpData,&dwSize); + if(lResult!=ERROR_SUCCESS || dwType!=dwTypeRet) blRet=FALSE; + RegCloseKey(hRegKey); + return blRet; +} + +BOOL DeleteRegistryEntries() +{ + if(ERROR_SUCCESS!=RegDeleteKey(HKEY_CURRENT_USER,REGROOTPATH)) + return FALSE; + return TRUE; +} + +/********************** + + + + **********************/ + +static BOOL CheckFileExistance(LPTSTR lpFile) +{ + return (0xFFFFFFFF != GetFileAttributes(lpFile)) ? TRUE : FALSE; +} + +int GetAppPathName(LPTSTR lpBuffer,int iBufferSize,LPTSTR lpFileName) +{ + TCHAR FullPath[MAX_PATH]; + LPTSTR pt, p; + int cb; + + // NOTE : コマンドプロンプトから実行された場合、入力されたコマンド文字列がそのまま取得される。 + // 例えば、WinIPSの置かれているディレクトリ内からコマンドプロンプトで"winips"と起動すると、 + // "winips"が取得されるので、以下の方法ではだめ。 + // p = GetCommandLine(); + // 実行可能ファイルのフルパス名を取得する + GetModuleFileName(GetModuleHandle(NULL), FullPath, MAX_PATH); + p = FullPath; + + while(*p == '"') + p = CharNext(p); + pt = p; // "を除いた先頭へのポインタ + // マルチバイト文字数を得る + for (;*p && *p != '"';p = CharNext(p)); // 終端へ"を探す + for (;pt < p && *(CharPrev(pt, p)) != '\\';p = CharPrev(pt, p)); // 終端から\を探す + // + cb = p - pt; // バイト数 + if (iBufferSize <= cb + (int)sizeof(TCHAR)) // + NULL文字 + return 0; + // + memcpy(lpBuffer, pt, cb); + // + *(LPTSTR)((LPBYTE)lpBuffer + cb) = '\0'; + + // ファイル名の指定があれば、それをコピー + if (lpFileName) { + if (iBufferSize <= cb + (int)sizeof(TCHAR) + (int)strlen(lpFileName)) + return 0; + lstrcat(lpBuffer, lpFileName); + } + + return cb; + +/* + TCHAR FullPath[MAX_PATH]; + LPTSTR lpCmdLine; + int iCopySize; + int iDirNameSize;//カレントディレクトリの名前のサイズ + int iFileNameSize;// + + if(!lpBuffer) return 0; + + lpCmdLine = GetCommandLine(); + + while(*lpCmdLine == '"') lpCmdLine++; + for(iDirNameSize = 0;;iDirNameSize++) { + if((*(lpCmdLine + iDirNameSize) == '\0') + ||(*(lpCmdLine + iDirNameSize) == '"') + ||(*(lpCmdLine + iDirNameSize)==' ')) { + memcpy(FullPath, lpCmdLine, iDirNameSize * sizeof(TCHAR)); + FullPath[iDirNameSize] = 0; + if(CheckFileExistance(FullPath)) + break; + } + } + + for(;iDirNameSize >= 0;iDirNameSize--)if(*(lpCmdLine + iDirNameSize - 1) == '\\')break; + + if(lpFileName) + { + for(iFileNameSize = 0;;iFileNameSize++) { + if(*(lpFileName + iFileNameSize) == '\0') + break; + } + } + else + iFileNameSize = 0; + + memcpy(FullPath, lpCmdLine, iDirNameSize * sizeof(TCHAR)); + FullPath[iDirNameSize] = 0; + if(lpFileName) memcpy(FullPath + iDirNameSize, lpFileName, iFileNameSize); + + iCopySize = (iBufferSize < iDirNameSize + iFileNameSize) ? iBufferSize : iDirNameSize + iFileNameSize; + + memcpy(lpBuffer, FullPath, iCopySize * sizeof(TCHAR)); + lpBuffer[iCopySize] = 0; + + return iCopySize; +*/ +} + +UINT GetIntegerFromINI(LPCTSTR lpAppName,LPCTSTR lpKeyName,INT nDefault) +{ + TCHAR szPath[MAX_PATH]; + GetAppPathName(szPath,MAX_PATH,INIFILE_FILENAME); + return GetPrivateProfileInt(lpAppName,lpKeyName,nDefault,szPath); +} diff --git a/src/ini.h b/src/ini.h new file mode 100644 index 0000000..fd4a747 --- /dev/null +++ b/src/ini.h @@ -0,0 +1,62 @@ +/************************************************************************************ + + smb Utility + + File: ini.h + Description: + History: + + ************************************************************************************/ +#ifndef INI_H +#define INI_H + +// +#define REGROOTPATH "Software\\smbUtil" +// +#define INI_MDIFRAME_WINDOW "MDIFRAME_WNDPL" +#define INI_OBJECTLIST_WINDOW "OBJLIST_WNDPL" +#define INI_MDIFRAME_OTHERSETTING "MDIFRAME_OTHER" +#define INI_MDIFRAME_FILEPATH "MDIFRAME_FILEPATH" +#define MDIFRAME_OTHERSETTING_TOOLBAR 0x00000001 +#define MDIFRAME_OTHERSETTING_STATUSBAR 0x00000002 +#define MDIFRAME_OTHERSETTING_MSGONSAVE 0x00010000 +#define INI_OBJECTLIST_COLUMNWIDTH0 "OBJLIST_COLWIDTH0" +#define INI_OBJECTLIST_COLUMNWIDTH1 "OBJLIST_COLWIDTH1" +#define INI_OBJECTLIST_COLUMNWIDTH2 "OBJLIST_COLWIDTH2" +#define INI_OBJECTLIST_COLUMNWIDTH3 "OBJLIST_COLWIDTH3" +#define INI_OBJECTVIEW_WINDOW "OBJVIEW_WNDPL" +#define INI_EMULATOR_WINDOW "EMULATOR_WNDPL" +#define INI_EMULATOR_SETTING "EMULATOR_SETTING" +#define INI_EMULATOR_KEYS "EMULATOR_KEYS" +#define INI_EMULATOR_JOYBUTTONS "EMULATOR_JOYBUTTONS" +#define INI_EDITOR_KEYS "EDITOR_KEYS" +#define INI_EDITOR_WHEEL "EDITOR_WHEEL" +#define INI_OBJECTVIEW_SETTING "OBJVIEW_SETTING" +// HIWORD(N):高さ LOWORD(N):設定 +#define LOGVIEW_SHOWLOGVIEW 0x00000001 +#define INI_LOGVIEW_SETTING "LOGVIEW_SETTING" +//#define INI_LOGVIEW_BORDER "LOGVIEW_BORDERPL" +//#define INI_LOGVIEW_LOGVIEW "LOGVIEW_LOGVIEWPL" + +#define INI_APP_ORIGINALROMPATH "APP_ORIGINALROMPATH" + +#define INI_INSTALL_DIR "INSTALL_DIR" + +BOOL WriteToRegistry(LPSTR lpValueName,DWORD dwType,LPVOID lpData,DWORD dwSize); +BOOL ReadFromRegistry(LPSTR lpValueName,DWORD dwType,LPVOID lpData,DWORD dwSize); +// アンインストール時に呼び出す +BOOL DeleteRegistryEntries(); + +#define INIFILE_FILENAME "smbutil.ini" +#define INIFILE_TESTPLAY "TESTPLAY" +#define INIFILE_TESTPLAY_HARD "HARD" +#define INIFILE_TESTPLAY_STATE "STATE" +#define INIFILE_TESTPLAY_BADGUYS "BADGUYS" +#define INIFILE_TESTPLAY_PAGE "PAGE" +#define INIFILE_TESTPLAY_INVINCIBLE "INVINCIBLE" +#define INIFILE_EDITOR "EDITOR" +#define INIFILE_EDITOR_PROTECT "PROTECT" + +UINT GetIntegerFromINI(LPCTSTR,LPCTSTR,INT); + +#endif /* INI_H */ diff --git a/src/international/beta4/resource.rc b/src/international/beta4/resource.rc new file mode 100644 index 0000000..1b2d810 --- /dev/null +++ b/src/international/beta4/resource.rc @@ -0,0 +1,869 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resrc1.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "resource.h" +#define APSTUDIO_HIDDEN_SYMBOLS +#include "windows.h" +#undef APSTUDIO_HIDDEN_SYMBOLS +#include "windowsx.h" +#include "winver.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// 日本語 resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN) +#ifdef _WIN32 +LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT +#pragma code_page(932) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +APPICON ICON DISCARDABLE "image/smbutil.ico" +EMUICON ICON DISCARDABLE "image/emulator.ico" +ROMICON ICON DISCARDABLE "image/rom.ico" +MAPVIEWICON ICON DISCARDABLE "image/mapview.ico" +MAPLISTICON ICON DISCARDABLE "image/maplisti.ico" + +///////////////////////////////////////////////////////////////////////////// +// +// BINARY +// + +RAMDATA1 BINARY DISCARDABLE "data/ram1.bin" +RAMDATA2 BINARY DISCARDABLE "data/ram2.bin" + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +MAINWNDMENU MENU DISCARDABLE +BEGIN + POPUP "&File" + BEGIN + MENUITEM "&Open...", IDM_FILE_OPEN + MENUITEM "&Save", IDM_FILE_SAVE + MENUITEM "Save&As...", IDM_FILE_SAVEAS + MENUITEM SEPARATOR + MENUITEM "Load Another Rom's &GFX...", IDM_FILE_CHRLOAD + MENUITEM SEPARATOR + MENUITEM "E&xit", IDM_FILE_EXIT + END + POPUP "&Edit" + BEGIN + MENUITEM "&Undo", IDM_EDIT_UNDO + MENUITEM SEPARATOR + MENUITEM "Choose &room...", IDM_SETTING_AREA + MENUITEM SEPARATOR + MENUITEM "Edit &Badguys Mode", IDM_SETTING_BADGUYS + MENUITEM "Edit &Map Mode", IDM_SETTING_MAP + MENUITEM SEPARATOR + MENUITEM "Edit &Header...", IDM_SETTING_MAPHEAD + END + POPUP "&View" + BEGIN + MENUITEM "&ToolBar", IDM_VIEW_TOOLBAR + MENUITEM "&StatusBar", IDM_VIEW_STATUSBAR + END + POPUP "&Emulator" + BEGIN + MENUITEM "&TitleScreen", IDM_EMULATOR_LOADPLAY + MENUITEM "Start of le&vel", IDM_EMULATOR_NORMALPLAY + MENUITEM "&Curent Page", IDM_EMULATOR_PAGEPLAY + MENUITEM "&Halfway Area", IDM_EMULATOR_PAGEPLAYHALF + MENUITEM "&End", IDM_EMULATOR_STOP + MENUITEM SEPARATOR + MENUITEM "Settings...", IDM_EMULATOR_TESTPLAYSETTING + MENUITEM SEPARATOR + MENUITEM "&Save State", IDM_EMULATOR_SAVE + MENUITEM "&Load state", IDM_EMULATOR_LOAD + END + POPUP "&Tools" + BEGIN + MENUITEM "Edit &Text...", IDM_EDIT_STRINGS + MENUITEM "Edit &Looping Castle Loop...", IDM_EDIT_LOOP + MENUITEM "World Data &Update", IDM_TOOL_WORLDDATAUPDATE + MENUITEM "Sort &Areas...", IDM_EDIT_AREASORT + MENUITEM "Record Intro &Demo", IDM_TOOL_DEMORECORD + MENUITEM "&General Setting...", IDM_TOOL_GENERALSETTING + MENUITEM "&Edit Some Game Stuff...", IDM_SETTING_GAME + MENUITEM SEPARATOR + MENUITEM "&Options...", IDM_TOOL_OPTION + MENUITEM "&Configuration...", IDM_TOOL_CUSTOMIZE + END + POPUP "&Window" + BEGIN + MENUITEM "&Cascade", IDM_WINDOW_CASCADE + MENUITEM "Close &All", IDM_WINDOW_CLOSEALL + MENUITEM SEPARATOR + MENUITEM "&Next Window", IDM_WINDOW_NEXT + MENUITEM "&Previous", IDM_WINDOW_PREV + END + POPUP "&Help" + BEGIN + MENUITEM "&About SMB Utility", IDM_HELP_VERSION + END +END + +MAPVIEW_POPUP MENU DISCARDABLE +BEGIN + POPUP "DUMMY" + BEGIN + MENUITEM "&Next page", IDM_MAPVIEW_NEXTPAGE + MENUITEM "&Previous page", IDM_MAPVIEW_PREVPAGE + MENUITEM SEPARATOR + MENUITEM "&Send...", IDM_MAPVIEW_SENDOBJECT + MENUITEM "&Edit...", IDM_MAPVIEW_SHOWEDITDIALOG + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +VERSIONDLG DIALOG DISCARDABLE 22, 17, 231, 75 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_VISIBLE | WS_CAPTION +CAPTION "About" +FONT 8, "MS Sans Serif" +BEGIN + ICON "APPICON",IDC_STATIC,12,13,20,20 + LTEXT "COPYRIGHT",IDC_COPYRIGHT,44,20,92,8 + DEFPUSHBUTTON "OK",IDOK,178,9,37,14,WS_GROUP + LTEXT "NAME",IDC_TITLE,44,8,121,8 + LTEXT "DATE",IDC_NOTE,44,32,92,8,SS_CENTERIMAGE + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,48,229,1 + LTEXT "Multi-6502 CPU emulator by Neil Bradley (neil@synthcom.com)", + IDC_STATIC,2,53,227,8 + LTEXT "International version contributors: Chezzman1, Yy", + IDC_STATIC,2,63,227,8 +END + +ROOMSELECTDLG DIALOGEX 0, 0, 159, 199 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION +CAPTION "Choose room" +FONT 8, "MS Sans Serif" +BEGIN + CONTROL "Tree1",IDC_ROOM,"SysTreeView32",TVS_HASBUTTONS | + TVS_HASLINES | TVS_LINESATROOT | WS_TABSTOP,3,2,153,151, + WS_EX_CLIENTEDGE + DEFPUSHBUTTON "OK",IDOK,101,160,50,14 + PUSHBUTTON "Cancel",IDCANCEL,101,178,50,14 +END + +MAPCOMHEADEDITDLG DIALOG DISCARDABLE 0, 0, 309, 183 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION +CAPTION "Edit header" +FONT 8, "MS Sans Serif" +BEGIN + DEFPUSHBUTTON "OK",IDOK,254,12,47,14 + PUSHBUTTON "Cancel",IDCANCEL,255,29,47,14 + COMBOBOX IDC_TIME,58,16,184,56,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | + WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_POSITION,58,33,184,119,CBS_DROPDOWNLIST | + CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_BACKCOLOR,58,51,184,131,CBS_DROPDOWNLIST | + CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_MAPTYPE,58,69,184,56,CBS_DROPDOWNLIST | + CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_VIEW,58,86,184,55,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | + WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_FIRSTBLOCK,58,104,184,168,CBS_DROPDOWNLIST | + CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP + LTEXT "Time",IDC_STATIC,9,18,34,8 + LTEXT "Position",IDC_STATIC,9,35,34,8 + LTEXT "Back ground",IDC_STATIC,9,53,38,8 + LTEXT "Type",IDC_STATIC,9,70,34,8 + LTEXT "Seanery",IDC_STATIC,9,88,34,8 + LTEXT "Basic brick",IDC_STATIC,9,106,46,9 + COMBOBOX IDC_MAPATTR,58,123,59,74,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "Attribute",IDC_STATIC,9,125,38,8 + COMBOBOX IDC_PAGE,68,161,28,90,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "Halfway page",IDC_STATIC_PAGE,11,163,56,8 + LTEXT "Room",IDC_STATIC,6,2,18,8 + LTEXT "Area",IDC_STATIC,6,145,15,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,25,5,225,1 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,25,148,228,1 +END + +MAPCOMEDITDLG DIALOG DISCARDABLE 0, 0, 266, 159 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTERMOUSE | WS_POPUP | WS_VISIBLE | + WS_CAPTION +CAPTION "Edit" +FONT 8, "MS Sans Serif" +BEGIN + EDITTEXT IDC_XPOS,31,19,24,13,ES_CENTER | ES_AUTOHSCROLL + CONTROL "Spin1",IDC_XPOSSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | + UDS_HORZ,55,19,6,14 + EDITTEXT IDC_YPOS,89,19,24,13,ES_CENTER | ES_AUTOHSCROLL + CONTROL "Spin2",IDC_YPOSSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,112,17,6, + 16 + EDITTEXT IDC_LEN,174,38,24,13,ES_CENTER | ES_AUTOHSCROLL + CONTROL "Spin3",IDC_LENSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,200,38,11, + 14 + CONTROL "page flag",IDC_PAGEFLAG,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,127,20,43,10 + COMBOBOX IDC_TYPE,25,38,122,76,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + EDITTEXT IDC_BIN,14,139,46,14,ES_AUTOHSCROLL + DEFPUSHBUTTON "OK",IDOK,208,4,46,14 + PUSHBUTTON "Cancel",IDCANCEL,208,21,46,14 + LTEXT "H pos",IDC_STATIC,6,21,25,8 + LTEXT "V pos",IDC_STATIC,64,21,22,8 + LTEXT "Length",IDC_STATIC_LENGTH,150,40,22,9 + CONTROL "Binary",IDC_ISBIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, + 3,124,35,10 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,50,127,138,1 + COMBOBOX IDC_VIEW,165,58,96,95,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + COMBOBOX IDC_FIRSTBLOCK,26,58,110,94,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_BACKCOLOR,31,76,230,95,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "scenery",IDC_STATIC_VIEW,138,60,26,8 + LTEXT "brick",IDC_STATIC_BLOCK,7,60,15,8 + LTEXT "back\nground",IDC_STATIC_BACKCOLOR,7,75,22,15 + EDITTEXT IDC_NOTE,10,95,251,22,ES_MULTILINE | ES_READONLY | + ES_WANTRETURN | WS_VSCROLL | NOT WS_TABSTOP + LTEXT "Type",IDC_STATIC,6,40,18,8 + EDITTEXT IDC_OFFSET,204,136,13,12,ES_CENTER | ES_READONLY | NOT + WS_BORDER | NOT WS_TABSTOP + LTEXT "byte",IDC_STATIC,221,136,14,8 + LTEXT "Object",IDC_STATIC,3,6,20,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,30,9,164,1 +END + +GAMESETTINGDLG DIALOG DISCARDABLE 0, 0, 159, 204 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION +CAPTION "General Setting" +FONT 8, "MS Sans Serif" +BEGIN + EDITTEXT IDC_MARIOLEFT,19,24,25,14,ES_AUTOHSCROLL + CONTROL "Spin1",IDC_MARIOLEFTSPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS,44,24,9,14 + LTEXT "players",IDC_STATIC,8,8,27,10 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,46,49,106,1 + CONTROL "Enable Pilania plants from 1-1",IDC_FLOWER,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,19,62,108,10 + COMBOBOX IDC_POLEGFX,16,98,70,88,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "graphics for vertical balls",IDC_STATIC,7,81,86,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,90,84,62,1 + LTEXT "Pirana plants",IDC_STATIC,7,46,39,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,35,11,119,1 + LTEXT "Time",IDC_STATIC,7,120,15,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,36,122,115,1 + LTEXT "400",IDC_STATIC,16,134,20,8 + LTEXT "300",IDC_STATIC,16,151,20,8 + LTEXT "200",IDC_STATIC,16,169,19,8 + COMBOBOX IDC_TIME400,39,131,70,126,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + COMBOBOX IDC_TIME300,39,148,70,122,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + COMBOBOX IDC_TIME200,39,166,70,127,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP +END + +STRINGEDITDLG DIALOG DISCARDABLE 0, 0, 247, 51 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION | WS_SYSMENU +CAPTION "Edit text" +FONT 8, "MS Sans Serif" +BEGIN + COMBOBOX IDC_STRINGSELECT,30,9,156,90,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + EDITTEXT IDC_STRING,30,28,156,12,ES_AUTOHSCROLL + PUSHBUTTON "Write",IDC_STRINGWRITE,190,27,50,14 + LTEXT "Characters",IDC_STATIC,203,12,37,8 + LTEXT "Type",IDC_STATIC,7,12,20,8 + LTEXT "Text",IDC_STATIC,7,29,17,8 + LTEXT "0",IDC_LEN,194,12,8,8 +END + +LOOPEDITDLG DIALOG DISCARDABLE 0, 0, 215, 183 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION +CAPTION "Edit Looping" +FONT 8, "MS Sans Serif" +BEGIN + DEFPUSHBUTTON "OK",IDOK,158,7,50,14 + PUSHBUTTON "Cancel",IDCANCEL,158,25,50,14 + EDITTEXT IDC_WORLD,23,18,117,14,ES_AUTOHSCROLL + EDITTEXT IDC_PAGE,24,49,118,14,ES_AUTOHSCROLL + EDITTEXT IDC_YPOS,23,84,118,14,ES_AUTOHSCROLL + EDITTEXT IDC_RETURNPOS,23,120,118,14,ES_AUTOHSCROLL + LTEXT "World",IDC_STATIC,9,5,29,8 + LTEXT "Page",IDC_STATIC,9,38,23,8 + LTEXT "V pos",IDC_STATIC,9,70,27,8 + LTEXT "Offset of map page skip data",IDC_STATIC,10,106,198,10 + EDITTEXT IDC_DATA1,47,156,20,14,ES_AUTOHSCROLL + EDITTEXT IDC_DATA2,77,156,21,14,ES_AUTOHSCROLL + LTEXT "World 7's loop",IDC_STATIC,9,143,54,8 + LTEXT "World",IDC_STATIC,24,159,19,8 +END + +TESTPLAYSETTINGDLG DIALOG DISCARDABLE 0, 0, 190, 193 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION +CAPTION "Test Setting" +FONT 8, "MS Sans Serif" +BEGIN + DEFPUSHBUTTON "OK",IDOK,129,10,50,14 + PUSHBUTTON "Cancel",IDCANCEL,129,28,50,14 + CONTROL "hard",IDC_ISCLEARED,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,15,20,29,10 + COMBOBOX IDC_MARIOSTATE,15,50,94,54,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "state",IDC_STATIC,6,36,16,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,29,38,91,1 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,25,9,94,1 + LTEXT "hard mode",IDC_STATIC,7,6,19,8 + LTEXT "current page",IDC_STATIC,7,106,51,8 + CONTROL "selected object",IDC_FROMCURPAGE,"Button", + BS_AUTORADIOBUTTON,13,121,61,10 + CONTROL "specify page",IDC_FROMDESTPAGE,"Button", + BS_AUTORADIOBUTTON,13,137,53,10 + EDITTEXT IDC_PAGE,85,135,25,14,ES_AUTOHSCROLL + CONTROL "Spin1",IDC_PAGESPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,110,135,9, + 14 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,54,108,118,1 + LTEXT "badguys",IDC_STATIC,7,71,31,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,37,73,134,1 + CONTROL "enable badguys in start page",IDC_0PAGEBADGUYS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,14,87,109,10 + LTEXT "stating position(current page)",IDC_STATIC,7,155,91,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,100,157,72,1 + COMBOBOX IDC_MARIOSTART,44,170,123,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + CONTROL "enable",IDC_ISMARIOSTART,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,171,35,10 +END + +AREASORTDLG DIALOG DISCARDABLE 0, 0, 151, 177 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION | WS_SYSMENU +CAPTION "Sort areas" +FONT 8, "MS Sans Serif" +BEGIN + LISTBOX IDC_AREA,6,7,116,160,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | + WS_HSCROLL | WS_TABSTOP + PUSHBUTTON "up",IDC_UP,126,66,21,14 + PUSHBUTTON "down",IDC_DOWN,126,94,21,14 +END + +EDITOROPTIONDLG DIALOG DISCARDABLE 0, 0, 187, 93 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION +FONT 8, "MS Sans Serif" +BEGIN + CONTROL "Enable room protect system",IDC_ISADDRESS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,13,31,153,10 + LTEXT "Option",IDC_STATIC,7,13,22,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,32,16,139,1 +END + +EMULATOROPTIONDLG DIALOG DISCARDABLE 0, 0, 187, 75 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION | WS_SYSMENU +FONT 8, "MS Sans Serif" +BEGIN + CONTROL "Enable MMX",IDC_SPEEDOPTIMIZE,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,11,27,73,10 + CONTROL "Disable Pad",IDC_SKIPJOYREAD,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,11,44,90,10 + LTEXT "Option",IDC_STATIC,7,13,22,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,34,16,138,1 +END + +SENDOBJECTDLG DIALOG DISCARDABLE 0, 0, 185, 127 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTERMOUSE | WS_POPUP | WS_VISIBLE | + WS_CAPTION +CAPTION "Send object to another room" +FONT 8, "MS Sans Serif" +BEGIN + DEFPUSHBUTTON "OK",IDOK,128,7,50,14 + PUSHBUTTON "Cancel",IDCANCEL,128,24,50,14 + CONTROL "",IDC_VIEW,"Static",SS_BITMAP | SS_SUNKEN,13,8,100,108 + COMBOBOX IDC_DATA,143,78,31,123,CBS_DROPDOWN | WS_VSCROLL | + WS_TABSTOP + EDITTEXT IDC_PAGEEDIT2,142,101,26,14,ES_CENTER | ES_AUTOHSCROLL + CONTROL "Spin3",IDC_PAGEEDIT2SPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS,167,101,7,14 + LTEXT "Room",IDC_STATIC,121,79,21,8 + LTEXT "Page",IDC_STATIC,122,104,19,8 +END + +BADGUYSCOMEDITDLG DIALOG DISCARDABLE 0, 0, 359, 161 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTERMOUSE | WS_POPUP | WS_VISIBLE | + WS_CAPTION +CAPTION "Edit" +FONT 8, "MS Sans Serif" +BEGIN + EDITTEXT IDC_XPOS,32,17,23,14,ES_CENTER + CONTROL "Spin1",IDC_XPOSSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | + UDS_HORZ,53,17,7,14 + EDITTEXT IDC_YPOS,86,17,23,14,ES_CENTER | ES_AUTOHSCROLL + CONTROL "Spin1",IDC_YPOSSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,108,17,7, + 14 + CONTROL "page flag",IDC_PAGEFLAG,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,122,14,43,10 + CONTROL "after 5-3",IDC_BIT6,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,122,26,42,10 + COMBOBOX IDC_TYPE,31,39,142,165,CBS_DROPDOWNLIST | + CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP + CONTROL "Skip Page",IDC_ISPAGECOMMAND,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,8,58,57,10 + EDITTEXT IDC_PAGEEDIT,69,56,23,14,ES_AUTOHSCROLL + CONTROL "Spin1",IDC_PAGEEDITSPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS | UDS_HORZ,94,56,7,14 + EDITTEXT IDC_XPOS2,33,89,23,14,ES_CENTER + CONTROL "Spin1",IDC_XPOS2SPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | + UDS_HORZ,55,89,10,14 + CONTROL "page flag",IDC_PAGEFLAG2,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,71,90,43,10 + CONTROL "Preview",IDC_OPENPREVIEW,"Button",BS_AUTOCHECKBOX | + BS_PUSHLIKE | WS_TABSTOP,134,86,46,12 + COMBOBOX IDC_DATA,93,107,29,123,CBS_DROPDOWN | WS_VSCROLL | + WS_TABSTOP + EDITTEXT IDC_WORLD,33,108,23,14,ES_CENTER | ES_AUTOHSCROLL + CONTROL "Spin2",IDC_WORLDSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,56,108,9, + 14 + EDITTEXT IDC_PAGEEDIT2,149,107,23,14,ES_CENTER | ES_AUTOHSCROLL + CONTROL "Spin3",IDC_PAGEEDIT2SPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS,172,107,7,14 + CONTROL "Binary",IDC_ISBIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, + 3,128,35,10 + EDITTEXT IDC_BIN,13,141,127,14,ES_AUTOHSCROLL + DEFPUSHBUTTON "OK",IDOK,190,12,43,14 + PUSHBUTTON "Cancel",IDCANCEL,191,30,43,14 + LTEXT "H pos",IDC_STATIC_XPOS1,8,20,23,8 + LTEXT "V pos",IDC_STATIC_YPOS,62,19,18,8 + LTEXT "Type",IDC_STATIC_TYPE,8,41,21,8 + LTEXT "room",IDC_STATIC_ROOM,73,110,15,8 + LTEXT "world",IDC_STATIC_WORLD,9,110,16,8 + LTEXT "page",IDC_STATIC_PAGE,129,110,17,8 + LTEXT "H pos",IDC_STATIC_XPOS2,7,91,18,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,63,78,120,1 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,50,131,134,1 + LTEXT "Bytes",IDC_STATIC,210,138,18,8 + EDITTEXT IDC_OFFSET,190,138,16,12,ES_CENTER | ES_READONLY | NOT + WS_BORDER | NOT WS_TABSTOP + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDVERT,238,13,1,120 + CONTROL "",IDC_VIEW,"Static",SS_BITMAP | SS_SUNKEN,246,20,105, + 108 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,32,8,150,1 + LTEXT "Room change",IDC_STATIC_ROOMMOVE,3,76,40,8 + LTEXT "Object",IDC_STATIC_OBJECT,3,5,20,8 +END + +GAMESETTING1UPDLG DIALOG DISCARDABLE 0, 0, 187, 111 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION +FONT 8, "MS Sans Serif" +BEGIN + EDITTEXT IDC_COINSFOR1UP,79,34,25,14,ES_AUTOHSCROLL + CONTROL "Spin2",IDC_COINSFOR1UPSPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS,104,34,9,14 + COMBOBOX IDC_WORLD,17,34,48,119,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "Coins for 1UP Mushroom",IDC_STATIC,7,13,52,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,59,16,118,1 +END + +GAMESETTINGWARPZONEDLG DIALOG DISCARDABLE 0, 0, 187, 95 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION +FONT 8, "MS Sans Serif" +BEGIN + EDITTEXT IDC_WARPA1,55,32,23,14,ES_AUTOHSCROLL + CONTROL "Spin2",IDC_WARPASPIN1,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,78,32,9, + 14 + EDITTEXT IDC_WARPA2,98,32,23,14,ES_AUTOHSCROLL + CONTROL "Spin2",IDC_WARPASPIN2,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,121,31,9, + 14 + EDITTEXT IDC_WARPA3,140,32,23,14,ES_AUTOHSCROLL + CONTROL "Spin2",IDC_WARPASPIN3,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,163,32,9, + 14 + EDITTEXT IDC_WARPB1,55,49,23,14,ES_AUTOHSCROLL + CONTROL "Spin2",IDC_WARPBSPIN1,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,79,49,9, + 14 + EDITTEXT IDC_WARPC1,55,65,23,14,ES_AUTOHSCROLL + CONTROL "Spin2",IDC_WARPCSPIN1,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,79,65,9, + 14 + EDITTEXT IDC_WARPC2,98,65,23,14,ES_AUTOHSCROLL + CONTROL "Spin2",IDC_WARPCSPIN2,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,121,65,9, + 14 + EDITTEXT IDC_WARPC3,140,65,23,14,ES_AUTOHSCROLL + CONTROL "Spin2",IDC_WARPCSPIN3,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,164,65,9, + 14 + LTEXT "Warpzone 1",IDC_STATIC,11,34,43,8 + LTEXT "Warpzone 2",IDC_STATIC,11,51,39,10 + LTEXT "Warpzone 3",IDC_STATIC,11,68,42,9 + EDITTEXT IDC_WARPB2,98,49,23,14,ES_AUTOHSCROLL + CONTROL "Spin2",IDC_WARPBSPIN2,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,122,49,9, + 14 + EDITTEXT IDC_WARPB3,140,49,23,14,ES_AUTOHSCROLL + CONTROL "Spin2",IDC_WARPBSPIN3,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,163,49,9, + 14 + LTEXT "Warpzone",IDC_STATIC,7,13,33,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,47,16,130,1 +END + +GAMESETTINGKOOPADLG DIALOG DISCARDABLE 0, 0, 195, 93 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION +FONT 8, "MS Sans Serif" +BEGIN + EDITTEXT IDC_WORLD,43,27,30,14,ES_AUTOHSCROLL + CONTROL "Spin1",IDC_WORLDSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,73,27,11, + 14 + LTEXT "Bowser's Hammer",IDC_STATIC,8,11,65,8 + COMBOBOX IDC_KOOPA,84,65,99,132,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "True character of Bowser",IDC_STATIC,9,50,89,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,104,52,76,1 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,81,15,100,1 + COMBOBOX IDC_KOOPAWORLD,27,65,46,132,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "World",IDC_STATIC,17,30,22,8 +END + +GAMESETTINGWORLDDLG DIALOG DISCARDABLE 0, 0, 187, 101 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "become hard",IDC_STATIC,7,10,41,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,52,13,128,1 + EDITTEXT IDC_DIFFICULTYWORLD,38,24,25,14,ES_AUTOHSCROLL + CONTROL "Spin1",IDC_DIFFICULTYWORLDSPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS,63,24,9,14 + EDITTEXT IDC_DIFFICULTYAREA,99,24,25,14,ES_AUTOHSCROLL + CONTROL "Spin1",IDC_DIFFICULTYAREASPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS,123,24,9,14 + LTEXT "world",IDC_STATIC,14,27,21,8 + LTEXT "area",IDC_STATIC,81,27,14,8 + EDITTEXT IDC_SEABLOCKWORLD,35,69,25,14,ES_AUTOHSCROLL + CONTROL "Spin1",IDC_SEABLOCKWORLDSPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS,62,69,9,14 + LTEXT "changed sea brick to castle brick in sea",IDC_STATIC,8, + 51,121,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,132,54,48,1 + LTEXT "world",IDC_STATIC,14,71,18,8 +END + +GENERALSETTINGDLG DIALOG DISCARDABLE 0, 0, 187, 51 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION +CAPTION "General Setting" +FONT 8, "MS Sans Serif" +BEGIN + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,58,12,45,1 + EDITTEXT IDC_CLEARWORLD,17,24,25,14,ES_AUTOHSCROLL + CONTROL "Spin1",IDC_CLEARWORLDSPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS,42,25,9,14 + CONTROL "Custum",IDC_ISCLEARWORLD,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,65,28,38,10 + LTEXT "Worlds in game",IDC_STATIC,7,10,55,8 + DEFPUSHBUTTON "OK",IDOK,122,10,50,14 + PUSHBUTTON "Cancel",IDCANCEL,122,30,50,14 +END + +CUSTOMIZEDLG DIALOG DISCARDABLE 0, 0, 195, 201 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "Customize" +FONT 8, "MS Sans Serif" +BEGIN + DEFPUSHBUTTON "OK",IDOK,32,180,50,14 + PUSHBUTTON "Cancel",IDCANCEL,113,180,50,14 + LISTBOX IDC_KEYLIST,33,42,103,47,LBS_NOINTEGRALHEIGHT | + WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYVALUE,33,98,103,129,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "Keyboard",IDC_STATIC,7,7,34,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,40,11,146,1 + COMBOBOX IDC_KEYID,33,21,102,69,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "Type",IDC_STATIC,10,23,17,8 + LTEXT "Target",IDC_STATIC,9,62,22,8 + LTEXT "Value",IDC_STATIC,10,113,20,8 + CONTROL "Ctrl",IDC_CTRL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,34, + 121,27,10 + CONTROL "Shift",IDC_SHIFT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, + 109,121,30,10 + CONTROL "Alt",IDC_ALT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,73, + 121,25,10 + PUSHBUTTON "Load",IDC_RESET,126,151,50,14 + GROUPBOX "Preset keys",IDC_STATIC,14,139,170,32 + COMBOBOX IDC_PRESET,23,151,98,69,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resrc1.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""resource.h""\r\n" + "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" + "#include ""windows.h""\r\n" + "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" + "#include ""windowsx.h""\r\n" + "#include ""winver.h""\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO DISCARDABLE +BEGIN + "VERSIONDLG", DIALOG + BEGIN + RIGHTMARGIN, 229 + END + + "ROOMSELECTDLG", DIALOG + BEGIN + LEFTMARGIN, 3 + RIGHTMARGIN, 156 + BOTTOMMARGIN, 196 + END + + "MAPCOMHEADEDITDLG", DIALOG + BEGIN + LEFTMARGIN, 3 + RIGHTMARGIN, 303 + TOPMARGIN, 2 + BOTTOMMARGIN, 178 + END + + "MAPCOMEDITDLG", DIALOG + BEGIN + LEFTMARGIN, 2 + RIGHTMARGIN, 261 + TOPMARGIN, 1 + BOTTOMMARGIN, 156 + END + + "GAMESETTINGDLG", DIALOG + BEGIN + LEFTMARGIN, 1 + RIGHTMARGIN, 157 + TOPMARGIN, 2 + BOTTOMMARGIN, 198 + END + + "STRINGEDITDLG", DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 240 + TOPMARGIN, 6 + BOTTOMMARGIN, 48 + END + + "LOOPEDITDLG", DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 208 + TOPMARGIN, 7 + BOTTOMMARGIN, 176 + END + + "TESTPLAYSETTINGDLG", DIALOG + BEGIN + LEFTMARGIN, 1 + RIGHTMARGIN, 187 + TOPMARGIN, 3 + BOTTOMMARGIN, 188 + END + + "AREASORTDLG", DIALOG + BEGIN + LEFTMARGIN, 6 + RIGHTMARGIN, 147 + TOPMARGIN, 7 + BOTTOMMARGIN, 167 + END + + "EDITOROPTIONDLG", DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 86 + END + + "EMULATOROPTIONDLG", DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 68 + END + + "SENDOBJECTDLG", DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 178 + TOPMARGIN, 7 + BOTTOMMARGIN, 120 + END + + "BADGUYSCOMEDITDLG", DIALOG + BEGIN + LEFTMARGIN, 3 + RIGHTMARGIN, 351 + BOTTOMMARGIN, 155 + END + + "GAMESETTING1UPDLG", DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 104 + END + + "GAMESETTINGWARPZONEDLG", DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 88 + END + + "GAMESETTINGKOOPADLG", DIALOG + BEGIN + LEFTMARGIN, 6 + RIGHTMARGIN, 188 + TOPMARGIN, 7 + BOTTOMMARGIN, 86 + END + + "GAMESETTINGWORLDDLG", DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 94 + END + + "GENERALSETTINGDLG", DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 44 + END + + "CUSTOMIZEDLG", DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 190 + TOPMARGIN, 7 + BOTTOMMARGIN, 194 + END +END +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Bitmap +// + +TOOLBAR_IMG BITMAP DISCARDABLE "image/toolbar.bmp" +SEA_IMG BITMAP DISCARDABLE "image/sea_img.bmp" +SKY_IMG BITMAP DISCARDABLE "image/sky_img.bmp" +UG_IMG BITMAP DISCARDABLE "image/ug_img.bmp" +CASTLE_IMG BITMAP DISCARDABLE "image/castle_img.bmp" +TVMASK BITMAP DISCARDABLE "image/tvmask.bmp" +RG_IMG BITMAP DISCARDABLE "image/rg_img.bmp" +LF_IMG BITMAP DISCARDABLE "image/lf_img.bmp" +IDB_XGAUGE_IMG BITMAP DISCARDABLE "image/xgauge_img.bmp" +IDB_YGAUGE_IMG BITMAP DISCARDABLE "image/ygauge_img.bmp" +#endif // 日本語 resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/src/international/beta4/string.h b/src/international/beta4/string.h new file mode 100644 index 0000000..ec570c5 --- /dev/null +++ b/src/international/beta4/string.h @@ -0,0 +1,380 @@ +/************************************************************************************ + + + smb Utility + + File: string_j.h + Description: + History: + +| partially translated by Yy + + ************************************************************************************/ +#ifndef STRING_J_H +#define STRING_J_H + +#define STRING_NULL "" +#define STRING_UNKNOWN "Unknown" + +// +// +#define STRING_FILEOPENDIALOG_CHRLOAD "Load CHR file(For importing)" +#define STRING_WINDOW_EMULATOR "Emulator" +#define STRING_WINDOW_OBJLIST "Level Objects List" +#define STRING_WINDOW_OBJVIEW "Main Editing Window" + +// +#define STRING_OBJVIEW_TITLE "%s <%dpage>" +#define STRING_OBJVIEW_TITLE2 "%s <%d-%dpage>" + +// +#define STRING_STATUSBAR_EMULOAD "Loaded state" +#define STRING_STATUSBAR_EMUSAVE "Saved state" +#define STRING_STATUSBAR_FILESAVE "Saved file" + +// +#define STRING_FILEERROR_SAVE "Failed to save" +#define STRING_FILEERROR_SAVEAS "Failed to save as" +#define STRING_FILEERROR_FILEFORMAT "Found file format(file type) error" +#define STRING_FILEERROR_NOTFOUND "Not found file" + +// +#define STRING_CONFIRM_EXIT "Save and exit? (Yes saves the rom and exits, no doesn't save and justs exits, and cancle goes back to the program)" +#define STRING_CONFIRM_RELOAD "Changed file by other editor.\nReload?" +#define STRING_CONFIRM_DEMORECORD "Start recording demonstration." +#define STRING_CONFIRM_DEMORECORD2 "Stoped recording demonstration." +#define STRING_CONFIRM_UPDATEWORLD "Reflesh world data?" + +// +#define STRING_OPTIONDIALOG_TITLE "option" +#define STRING_OPTIONDIALOG_EMULATOR "emulator" +#define STRING_OPTIONDIALOG_EDITOR "editor" +#define STRING_OPTIONDIALOG_APPLICATION "application" + +// +#define STRING_TOOLTIP_OPEN "Open" +#define STRING_TOOLTIP_SAVE "Save" +#define STRING_TOOLTIP_ROOM "Choose room" +#define STRING_TOOLTIP_BADGUYS "Edit Badguys" +#define STRING_TOOLTIP_MAP "Edit Map" +#define STRING_TOOLTIP_TESTPLAY "Test Level" +#define STRING_TOOLTIP_PAGETESTPLAY "Test Page" +#define STRING_TOOLTIP_HALFPOINTTESTPLAY "Test Halfway Point" +#define STRING_TOOLTIP_STOP "Stop Emulation" +#define STRING_TOOLTIP_TESTPLAYSETTING "Testing Settings" + +// +#define STRING_SENDOBJECT_SRCERROR "Can't send source object." +#define STRING_SENDOBJECT_DSTERROR "There are no objects in destination page." + +#define STRING_UNDO_MENUTEXT "&Undo %s" +#define STRING_UNDONAME_KEYEDIT "Keyboard input" +#define STRING_UNDONAME_DLGEDIT "Dialog input" +#define STRING_UNDONAME_SENDOBJ "Send object" +#define STRING_UNDONAME_HEADDLG "Setting(Option)" +#define STRING_UNDONAME_CHRLOAD "Load charactor ROM" +#define STRING_UNDONAME_TOOLSTR "Strings editor" +#define STRING_UNDONAME_TOOLLOOPBIN "Loop editor" +#define STRING_UNDONAME_TOOLWORLD "Auto reflesh world data" +#define STRING_UNDONAME_TOOLAREAROOM "Edit first ROOM of AREA" +#define STRING_UNDONAME_TOOLDEMORECORDER "Demo recording" +#define STRING_UNDONAME_TOOLOTHER "Other setting" +#define STRING_UNDONAME_TOOLGLOBAL "Setting" + + +#define STRING_POLEGFX_DEFAULT "default" +#define STRING_POLEGFX_ROPE "rope" +#define STRING_POLEGFX_TREE "tree" +#define STRING_POLEGFX_OTHER "other" + +#define STRING_SETTING_WORLDX "world%d" +#define STRING_SETTING_WARPZONE "warpzone" +#define STRING_SETTING_1UP "1UP mushroom" +#define STRING_SETTING_KOOPA "Bowser" +#define STRING_SETTING_WORLD "world" +#define STRING_SETTING_OTHER "other" +#define STRING_SETTING_TITLE "Other setting" + + +#define STRING_STRINGDATA_01 "Mario(Status bar)" +#define STRING_STRINGDATA_02 "Mario(Unknows, but I thought I remember where this text was used!)" +#define STRING_STRINGDATA_03 "mario(Ditto)" +#define STRING_STRINGDATA_04 "Luigi(Status bar)" +#define STRING_STRINGDATA_05 "World time(Status Bar, the World and Time texts are the same line of text!)" +#define STRING_STRINGDATA_06 "World(On the World 1-1 ect screen)" +#define STRING_STRINGDATA_07 "Time up" +#define STRING_STRINGDATA_08 "Game over" +#define STRING_STRINGDATA_09 "Welcome to warp zone!" +#define STRING_STRINGDATA_10 "Thank you Mario!" +#define STRING_STRINGDATA_11 "Thank you Luigi!" +#define STRING_STRINGDATA_12 "but our princess is in" +#define STRING_STRINGDATA_13 "another castle!" +#define STRING_STRINGDATA_14 "your quest is over." +#define STRING_STRINGDATA_15 "we present you a new quest." +#define STRING_STRINGDATA_16 "push button b" +#define STRING_STRINGDATA_17 "to select a world" +#define STRING_STRINGDATA_18 "ゥ1985 Nintendo" +#define STRING_STRINGDATA_19 "1 player game" +#define STRING_STRINGDATA_20 "2 player game" + +#define STRING_TESTPLAYSETTING_MARIO "Small Mario" +#define STRING_TESTPLAYSETTING_SUPERMARIO "Big Mario" +#define STRING_TESTPLAYSETTING_FIREMARIO "Fire Mario" + +#define STRING_KEYCONFIG_EMU_A "A" +#define STRING_KEYCONFIG_EMU_B "B" +#define STRING_KEYCONFIG_EMU_SELECT "Select" +#define STRING_KEYCONFIG_EMU_START "Start" +#define STRING_KEYCONFIG_EMU_UP "Up" +#define STRING_KEYCONFIG_EMU_DOWN "Down" +#define STRING_KEYCONFIG_EMU_LEFT "Left" +#define STRING_KEYCONFIG_EMU_RIGHT "Right" +#define STRING_KEYCONFIG_EDIT_ADD1 "Object value +1" +#define STRING_KEYCONFIG_EDIT_DEC1 "Object value -1" +#define STRING_KEYCONFIG_EDIT_ADD16 "Object value +16" +#define STRING_KEYCONFIG_EDIT_DEC16 "Object value -16" +#define STRING_KEYCONFIG_EDIT_UP "Object position to up" +#define STRING_KEYCONFIG_EDIT_DOWN "Object position to down" +#define STRING_KEYCONFIG_EDIT_LEFT "Object position to left" +#define STRING_KEYCONFIG_EDIT_RIGHT "Object position to righht" +#define STRING_KEYCONFIG_EDIT_NEXTPAGE "Next page" +#define STRING_KEYCONFIG_EDIT_PREVPAGE "Previous page" +#define STRING_KEYCONFIG_EDIT_NEXTOBJ "Next object" +#define STRING_KEYCONFIG_EDIT_PREVOBJ "Previous object" +#define STRING_KEYCONFIG_EDIT_SAVEFILE "File: Overwrite Save" +#define STRING_KEYCONFIG_EDIT_UNDO "Edit: Undo" +#define STRING_KEYCONFIG_EDIT_ROOM "Edit: Open room" +#define STRING_KEYCONFIG_EDIT_BADGUYS "Edit: Badguys" +#define STRING_KEYCONFIG_EDIT_MAP "Edit: Map(Level)" +#define STRING_KEYCONFIG_EDIT_TESTPLAY "Emulator: Test play" +#define STRING_KEYCONFIG_EDIT_PAGETESTPLAY "Emulator: Page test play" +#define STRING_KEYCONFIG_EDIT_PAGETESTPLAY2 "Emulator: Middle point test play" +#define STRING_KEYCONFIG_EDIT_STOP "Emulator: Stop" +#define STRING_KEYCONFIG_EDIT_SAVEEMU "Emulator: Save" +#define STRING_KEYCONFIG_EDIT_LOADEMU "Emulator: Load" +#define STRING_KEYCONFIG_EDIT_EMUSETTING "Emulator: Test play option" +#define STRING_KEYCONFIG_EDIT_NEXTWIN "Window: Next" +#define STRING_KEYCONFIG_EDIT_PREVWIN "Window: Previous" +#define STRING_KEYCONFIG_KEYACCEL "Keyboard accelerator" +#define STRING_KEYCONFIG_EMULATOR "Emulator" +#define STRING_KEYCONFIG_OVERLAPPED "It is overlapped at %s - \"%s\"." +#define STRING_KEYCONFIG_INITIALIZE "Load preset-key?" +#define STRING_KEYCONFIG_NOTIFY "It is enabled at next start. " + +#define STRING_KEYCONFIG_PRESET_DESKTOP "Desktop PC (Ten key)" +#define STRING_KEYCONFIG_PRESET_NOTE "Note PC" + +#define STRING_OBJLIST_LENNAME "Length:%d, %s" +#define STRING_OBJLIST_UNKNOWN "Unknown object" +#define STRING_OBJLIST_CRASH "*Freezes" +#define STRING_OBJLIST_BACK "Background:%s" +#define STRING_OBJLIST_VIEWBLOCK "Scene:%s Block:%s" +#define STRING_OBJLIST_ROPE "Lift's vertical rope" +#define STRING_OBJLIST_LENCASTLE "Castle, Length:%d" +#define STRING_OBJLIST_STEP "Stairs, Length:%d, Height:%d" +#define STRING_OBJLIST_STEP98 "Stairs, Length:9 Height:8" +#define STRING_OBJLIST_STEP98_2 "*Stairs, Length:9, Height:8" +#define STRING_OBJLIST_NONE "*Nothing" + +#define STRING_OBJLIST_ROOM "Room change[%.2xH(%s),w=%d,p=%d]" +#define STRING_OBJLIST_PAGECOMMAND "Page change : %.2d" +#define STRING_OBJLIST_HARD " (Only after 5-3)" + +#define STRING_SEA "Sea" +#define STRING_SKY "Ground" +#define STRING_UNDERGROUND "Under ground" +#define STRING_CASTLE "Castle" + +#define STRING_OBJLIST_COLUMN_BIN "Hex" +#define STRING_OBJLIST_COLUMN_PAGE "Page" +#define STRING_OBJLIST_COLUMN_POS "Position" +#define STRING_OBJLIST_COLUMN_TYPE "Type" + +#define STRING_OBJDATA_MAP_B_01 "? Block (Mushroom)" +#define STRING_OBJDATA_MAP_B_02 "? Block (Coin)" +#define STRING_OBJDATA_MAP_B_03 "Hidden block (Coin)" +#define STRING_OBJDATA_MAP_B_04 "Hidden block (1UP mushroom)" +#define STRING_OBJDATA_MAP_B_05 "Brick (Mushroom)" +#define STRING_OBJDATA_MAP_B_06 "Brick (tree of beans)" +#define STRING_OBJDATA_MAP_B_07 "Brick (Star)" +#define STRING_OBJDATA_MAP_B_08 "Brick (10coins)" +#define STRING_OBJDATA_MAP_B_09 "Brick (1UP mushroom)" +#define STRING_OBJDATA_MAP_B_10 "Sideways pipe" +#define STRING_OBJDATA_MAP_B_11 "Used block" +#define STRING_OBJDATA_MAP_B_12 "Jump stand" +#define STRING_OBJDATA_MAP_B_13 "reverse L pipe" +#define STRING_OBJDATA_MAP_B_14 "pole" +#define STRING_OBJDATA_MAP_B_15 "*Nothing" +#define STRING_OBJDATA_MAP_B_16 "*Nothing" +#define STRING_OBJDATA_MAP_B_17 "island(cannon)" +#define STRING_OBJDATA_MAP_B_18 "Horizontal brick(seaplant)" +#define STRING_OBJDATA_MAP_B_19 "Horizontal block" +#define STRING_OBJDATA_MAP_B_20 "Horizontal coins" +#define STRING_OBJDATA_MAP_B_21 "Vertical brick(seaplant)" +#define STRING_OBJDATA_MAP_B_22 "Vertical block" +#define STRING_OBJDATA_MAP_B_23 "pipe(Player can't enter.)" +#define STRING_OBJDATA_MAP_B_24 "pipe(Player can enter.)" + +#define STRING_OBJDATA_HELP_B12 ""//"キャラクタの1つ。キャラクタオーバーで表示されなくなると、マリオが挟まって出れなくなるので注意。" +#define STRING_OBJDATA_HELP_B13 ""//"高さ9固定。横からでも上からでも入れる。(横位置+2)から2キャラ分は、先に指定された障害物を消す。" +#define STRING_OBJDATA_HELP_B14 ""//"やたらと使用しないこと。1ルームに2回以上使用すると暴走しやすくなるので注意。" +#define STRING_OBJDATA_HELP_B23 ""//"長さを1にしても必ず2になる。" + +#define STRING_OBJDATA_MAP_C_01 "Hole" +#define STRING_OBJDATA_MAP_C_02 "Balance's horizontal rope" +#define STRING_OBJDATA_MAP_C_03 "Bridge(V=7)" +#define STRING_OBJDATA_MAP_C_04 "Bridge(V=8)" +#define STRING_OBJDATA_MAP_C_05 "Bridge(V=10)" +#define STRING_OBJDATA_MAP_C_06 "Hole filled with water" +#define STRING_OBJDATA_MAP_C_07 "Horizontal ?Block(coin, V=3)" +#define STRING_OBJDATA_MAP_C_08 "Horizontal ?Block(coin, V=7)" + +#define STRING_OBJDATA_HELP_C01 ""//"縦位置8から12の先指定したすべてのマップキャラを消す。" +#define STRING_OBJDATA_HELP_C02 ""//"縦位置0固定" +#define STRING_OBJDATA_HELP_C06 ""//"縦位置10から12の先指定したすべてのマップキャラを消す。" + +#define STRING_OBJDATA_MAP_D_01 "Page skip" +#define STRING_OBJDATA_MAP_D_02 "Reverse L pipe" +#define STRING_OBJDATA_MAP_D_03 "Pole" +#define STRING_OBJDATA_MAP_D_04 "Axe" +#define STRING_OBJDATA_MAP_D_05 "Rope" +#define STRING_OBJDATA_MAP_D_06 "Bridge" +#define STRING_OBJDATA_MAP_D_07 "Scroll stop (warp zone)" +#define STRING_OBJDATA_MAP_D_08 "Scroll stop" +#define STRING_OBJDATA_MAP_D_10 "Cheep-cheep(red, fly)" +#define STRING_OBJDATA_MAP_D_11 "Bullet Bill(Cheep-cheep)continuation" +#define STRING_OBJDATA_MAP_D_12 "stop continuation" +#define STRING_OBJDATA_MAP_D_13 "Loop command" +#define STRING_OBJDATA_MAP_D_14 "?" +#define STRING_OBJDATA_MAP_D_15 "*Freeze" + +#define STRING_OBJDATA_HELP_D01 "Skip page" +#define STRING_OBJDATA_HELP_D03 ""//"やたらと使用しない事。1ルームに2回以上使用すると暴走しやすくなるので注意。" +#define STRING_OBJDATA_HELP_D04 ""//"縦位置6固定" +#define STRING_OBJDATA_HELP_D05 ""//"縦位置7固定" +#define STRING_OBJDATA_HELP_D06 ""//"縦位置8、長さ13固定" +#define STRING_OBJDATA_HELP_D12 ""//"連続出現キャラを出した後、暴走を防ぐためにポールを出す前に指定。" +#define STRING_OBJDATA_HELP_D13 ""//"ページ送りコマンドとセットでループを形成する。" + +#define STRING_OBJDATA_MAP_E_01 "Basic brick & scenery" +#define STRING_OBJDATA_MAP_E_02 "Change background" + +#define STRING_OBJDATA_MAP_F_01 "Rope of lift" +#define STRING_OBJDATA_MAP_F_02 "vertical rope of balance lift" +#define STRING_OBJDATA_MAP_F_03 "Castle" +#define STRING_OBJDATA_MAP_F_04 "width:n, height:n, steps" +#define STRING_OBJDATA_MAP_F_05 "width:9, height:8, steps" +#define STRING_OBJDATA_MAP_F_06 "long reverse L pipe" +#define STRING_OBJDATA_MAP_F_07 "vertical balls" +#define STRING_OBJDATA_MAP_F_08 "Nothing" + +#define STRING_OBJDATA_HELP_F01 ""//"縦位置0、長さ13固定。指定横位置において、先指定したすべてのマップキャラを消す。" +#define STRING_OBJDATA_HELP_F02 ""//"縦位置1固定。指定横位置において、先指定したすべてのマップキャラを消す。" +#define STRING_OBJDATA_HELP_F03 ""//"やたらと使用しないこと。多く使用すると暴走しやすくなる。" +#define STRING_OBJDATA_HELP_F05 ""//"長さ0〜3 問題なし。\n長さ4〜6 グラフィックスが潰れる。長さ7 グラフィックスが潰れる。(横位置+16)の位置に縦位置7の壊せないブロック1個。" +#define STRING_OBJDATA_HELP_F07 ""//"ツタのようにつかまって上下移動が可能。縦位置2固定" + +#define STRING_OBJDATA_BB_01 "Brick: None" +#define STRING_OBJDATA_BB_02 "Brick: Surface" +#define STRING_OBJDATA_BB_03 "Brick: Surface&ceiling" +#define STRING_OBJDATA_BB_04 "Brick: Surface&ceiling(3)" +#define STRING_OBJDATA_BB_05 "Brick: Surface&ceiling(4)" +#define STRING_OBJDATA_BB_06 "Brick: Surface&ceiling(8)" +#define STRING_OBJDATA_BB_07 "Brick: Surface(4)&ceiling" +#define STRING_OBJDATA_BB_08 "Brick: Surface(4)&ceiling(3)" +#define STRING_OBJDATA_BB_09 "Brick: Surface(4)&ceiling(4)" +#define STRING_OBJDATA_BB_10 "Brick: Surface(5)&ceiling" +#define STRING_OBJDATA_BB_11 "Brick: Surface" +#define STRING_OBJDATA_BB_12 "Brick: Surface(5)&ceiling(4)" +#define STRING_OBJDATA_BB_13 "Brick: Surface(8)&ceiling" +#define STRING_OBJDATA_BB_14 "Brick: Surface&ceiling&middle(5)" +#define STRING_OBJDATA_BB_15 "Brick: Surface&ceiling&middle(4)" +#define STRING_OBJDATA_BB_16 "Brick: All" + +#define STRING_OBJDATA_T_01 "Not set" +#define STRING_OBJDATA_T_02 "400" +#define STRING_OBJDATA_T_03 "300" +#define STRING_OBJDATA_T_04 "200" + +#define STRING_OBJDATA_P_01 "V=-1, H=1.5" +#define STRING_OBJDATA_P_02 "start of area: X, from another room; V=-1, H=1.5" +#define STRING_OBJDATA_P_03 "V=10, H=1.5" +#define STRING_OBJDATA_P_04 "V=4, H=1.5" +#define STRING_OBJDATA_P_07 "V=10, H=1.5(walking)" + +#define STRING_OBJDATA_BC_01 "Nothing" +#define STRING_OBJDATA_BC_02 "In water" +#define STRING_OBJDATA_BC_03 "Wall" +#define STRING_OBJDATA_BC_04 "Over water" +#define STRING_OBJDATA_BC_05 "Night" +#define STRING_OBJDATA_BC_06 "Snow" +#define STRING_OBJDATA_BC_07 "Night and snow" +#define STRING_OBJDATA_BC_08 "Night and snow" + +#define STRING_OBJDATA_MT_01 "Green and tree" +#define STRING_OBJDATA_MT_02 "Orange and mushroom" +#define STRING_OBJDATA_MT_03 "Guns" +#define STRING_OBJDATA_MT_04 "Clouds" + +#define STRING_OBJDATA_V_01 "Nothing" +#define STRING_OBJDATA_V_02 "Clouds" +#define STRING_OBJDATA_V_03 "Mountain" +#define STRING_OBJDATA_V_04 "Fence" + + +#define STRING_OBJDATA_BADGUYS_01 "Koopa Troopa (green)" +#define STRING_OBJDATA_BADGUYS_02 "Koopa Troopa (red)" +#define STRING_OBJDATA_BADGUYS_03 "Buzzy Beetle" +#define STRING_OBJDATA_BADGUYS_04 "Koopa Troopa (red, both ways)" +#define STRING_OBJDATA_BADGUYS_05 "Koopa Troopa (green, stopped)" +#define STRING_OBJDATA_BADGUYS_06 "The Hammer Brothers" +#define STRING_OBJDATA_BADGUYS_07 "Little Goomba" +#define STRING_OBJDATA_BADGUYS_08 "Bloober" +#define STRING_OBJDATA_BADGUYS_09 "Bullet Bill" +#define STRING_OBJDATA_BADGUYS_10 "Koopa Paratroopa (green, stopped)" +#define STRING_OBJDATA_BADGUYS_11 "Cheep-cheep (green)" +#define STRING_OBJDATA_BADGUYS_12 "Cheep-cheep (red)" +#define STRING_OBJDATA_BADGUYS_13 "Podoboo" +#define STRING_OBJDATA_BADGUYS_14 "Pirana plants" +#define STRING_OBJDATA_BADGUYS_15 "Koopa Paratroopa (green, leaping)" +#define STRING_OBJDATA_BADGUYS_16 "Koopa Paratroopa (red, up&down)" +#define STRING_OBJDATA_BADGUYS_17 "Koopa Paratroopa (green, right&left)" +#define STRING_OBJDATA_BADGUYS_18 "Lakitu" +#define STRING_OBJDATA_BADGUYS_19 "Spiny" +#define STRING_OBJDATA_BADGUYS_20 "*Unknown" +#define STRING_OBJDATA_BADGUYS_21 "Cheep-cheep(fly)" +#define STRING_OBJDATA_BADGUYS_22 "Bowser's fire" +#define STRING_OBJDATA_BADGUYS_23 "*Crash" +#define STRING_OBJDATA_BADGUYS_24 "Bullet Bill(Cheep-cheep)continuation" +#define STRING_OBJDATA_BADGUYS_25 "*None" +#define STRING_OBJDATA_BADGUYS_28 "Fire Bar (right)" +#define STRING_OBJDATA_BADGUYS_29 "Fire Bar (right, fast)" +#define STRING_OBJDATA_BADGUYS_30 "Fire Bar (left)" +#define STRING_OBJDATA_BADGUYS_31 "Fire Bar (left, fast)" +#define STRING_OBJDATA_BADGUYS_32 "Long Fire Bar (right)" +#define STRING_OBJDATA_BADGUYS_33 "Fire Bar" +#define STRING_OBJDATA_BADGUYS_37 "lift(balance)" +#define STRING_OBJDATA_BADGUYS_38 "lift(up&down)" +#define STRING_OBJDATA_BADGUYS_39 "lift(up)" +#define STRING_OBJDATA_BADGUYS_40 "lift(down)" +#define STRING_OBJDATA_BADGUYS_41 "lift(right&left)" +#define STRING_OBJDATA_BADGUYS_42 "lift(fall)" +#define STRING_OBJDATA_BADGUYS_43 "lift(surfing)" +#define STRING_OBJDATA_BADGUYS_44 "short lift(up)" +#define STRING_OBJDATA_BADGUYS_45 "short lift(down)" +#define STRING_OBJDATA_BADGUYS_46 "Bowser, King of the Koopa" +#define STRING_OBJDATA_BADGUYS_47 "*Unknown" +#define STRING_OBJDATA_BADGUYS_48 "*Unknown" +#define STRING_OBJDATA_BADGUYS_51 "Jumping board(fake)" +#define STRING_OBJDATA_BADGUYS_53 "Warp Zone" +#define STRING_OBJDATA_BADGUYS_54 "Mushroom retainers" +#define STRING_OBJDATA_BADGUYS_56 "2 Little Goomba(V=10)" +#define STRING_OBJDATA_BADGUYS_57 "3 Little Goomba(V=10)" +#define STRING_OBJDATA_BADGUYS_58 "2 Little Goomba(V=6)" +#define STRING_OBJDATA_BADGUYS_59 "3 Little Goomba(V=6)" +#define STRING_OBJDATA_BADGUYS_60 "2 Koopa Troopa (green, V=10)" +#define STRING_OBJDATA_BADGUYS_61 "3 Koopa Troopa (green, V=10)" +#define STRING_OBJDATA_BADGUYS_62 "2 Koopa Troopa (green, V=6)" +#define STRING_OBJDATA_BADGUYS_63 "3 Koopa Troopa (green, V=6)" + +#endif diff --git a/src/keyaccel.c b/src/keyaccel.c new file mode 100644 index 0000000..3c6a7ea --- /dev/null +++ b/src/keyaccel.c @@ -0,0 +1,95 @@ +/************************************************************************************ + + smb Utility + + File: keyaccel.c + Description: + History: + + ************************************************************************************/ + +#include "smbutil.h" +#include "ini.h" +#include "keyaccel.h" + +BOOL GetPresetEditorKeys(WORD aEditKeys[], DWORD dwID) +{ + WORD wKeys[KEYACCEL_NUM_PRESETS][KEYACCEL_NUM_COMMANDS] = + { + //"種類を+1", "種類を-1", "種類を+16", "種類を-16", "位置を上へ", "位置を下へ", "位置を左へ", "位置を右へ", "次のページへ", "前のページへ", "次のオブジェクトへ", "前のオブジェクトへ", + VK_ADD, VK_SUBTRACT, VK_MULTIPLY, VK_DIVIDE, VK_NUMPAD8, VK_NUMPAD2, VK_NUMPAD4, VK_NUMPAD6, VK_NUMPAD9, VK_NUMPAD3, VK_NUMPAD7, VK_NUMPAD1, CTRLBIT | 0x53, CTRLBIT | 0x5A, VK_F2, VK_F3, VK_F4, VK_F9, VK_F10, VK_F11, VK_F12, VK_F5, VK_F7, VK_F8, VK_TAB, SHIFTBIT | VK_TAB, + 0x57, 0x51, 0x52, 0x45, 0x53, 0x58, 0x5A, 0x43, 0x44, 0x41, 0x46, 0x56, CTRLBIT | 0x53, CTRLBIT | 0x5A, VK_F2, VK_F3, VK_F4, VK_F9, VK_F10, VK_F11, VK_F12, VK_F5, VK_F7, VK_F8, VK_TAB, SHIFTBIT | VK_TAB + }; + + if (dwID >= KEYACCEL_NUM_PRESETS) + return FALSE; + + memcpy(aEditKeys, wKeys[dwID], KEYACCEL_NUM_COMMANDS * sizeof(WORD)); + + return TRUE; +} + +BOOL GetEditorVKeys(WORD aEditKeys[]) +{ + if(!ReadFromRegistry(INI_EDITOR_KEYS, + REG_BINARY, + aEditKeys, + KEYACCEL_NUM_COMMANDS * sizeof(WORD))){ + GetPresetEditorKeys(aEditKeys, KEYACCEL_PRESETID_DESKTOP); + return FALSE; + } + return TRUE; +} + +HACCEL CreateEditCommandAccel() +{ + UINT uCmd[KEYACCEL_NUM_COMMANDS] = + { + IDM_EDITCOMMAND_ADD1TOTYPE, + IDM_EDITCOMMAND_DEC1TOTYPE, + IDM_EDITCOMMAND_ADD16TOTYPE, + IDM_EDITCOMMAND_DEC16TOTYPE, + IDM_EDITCOMMAND_UP, + IDM_EDITCOMMAND_DOWN, + IDM_EDITCOMMAND_LEFT, + IDM_EDITCOMMAND_RIGHT, + IDM_EDITCOMMAND_FWDPAGE, + IDM_EDITCOMMAND_REWPAGE, + IDM_EDITCOMMAND_NEXTOBJ, + IDM_EDITCOMMAND_PREVOBJ, + IDM_FILE_SAVE, + IDM_EDIT_UNDO, + IDM_SETTING_AREA, + IDM_SETTING_BADGUYS, + IDM_SETTING_MAP, + IDM_EMULATOR_NORMALPLAY, + IDM_EMULATOR_PAGEPLAY, + IDM_EMULATOR_PAGEPLAYHALF, + IDM_EMULATOR_STOP, + IDM_EMULATOR_SAVE, + IDM_EMULATOR_LOAD, + IDM_EMULATOR_TESTPLAYSETTING, + IDM_WINDOW_NEXT, + IDM_WINDOW_PREV + }; + ACCEL accel[KEYACCEL_NUM_COMMANDS]; + WORD wVKeys[KEYACCEL_NUM_COMMANDS]; + UINT N; + + GetEditorVKeys(&wVKeys[0]); + + for(N=0;Ncmd = uCmd[N]; + lpAccel->fVirt = FNOINVERT | FVIRTKEY; + if(GETCTRL(wVKey)) lpAccel->fVirt |= FCONTROL; + if(GETALT(wVKey)) lpAccel->fVirt |= FALT; + if(GETSHIFT(wVKey)) lpAccel->fVirt |= FSHIFT; + lpAccel->key = GETVKEY(wVKey); + } + + return CreateAcceleratorTable(accel,KEYACCEL_NUM_COMMANDS); +} diff --git a/src/keyaccel.h b/src/keyaccel.h new file mode 100644 index 0000000..06edebc --- /dev/null +++ b/src/keyaccel.h @@ -0,0 +1,37 @@ +/************************************************************************************ + + smb Utility + + File: keyaccel.h + Description: + History: + + ************************************************************************************/ +#ifndef KEYACCEL_H +#define KEYACCEL_H + +#define CTRLBIT 0x0100 +#define ALTBIT 0x0200 +#define SHIFTBIT 0x0400 + +#define GETVKEY(W) ((BYTE)( (W) & 0xFF )) +#define GETCTRL(W) ( (W) & CTRLBIT ) +#define GETALT(W) ( (W) & ALTBIT ) +#define GETSHIFT(W) ( (W) & SHIFTBIT ) +#define GETASSISTKEY(W) ( (W) & 0xFF00 ) + +#define SETVKEY(W,K) (W) = ((W) & 0xFF00) | ( (K) & 0xFF ) +#define SETCTRL(W) ( (W) | CTRLBIT ) +#define SETALT(W) ( (W) | ALTBIT ) +#define SETSHIFT(W) ( (W) | SHIFTBIT ) + +#define KEYACCEL_NUM_COMMANDS 26 +#define KEYACCEL_NUM_PRESETS 2 +#define KEYACCEL_PRESETID_DESKTOP 0 +#define KEYACCEL_PRESETID_NOTE 1 + +BOOL GetPresetEditorKeys(WORD aEditKeys[], DWORD dwID); +BOOL GetEditorVKeys(WORD aEditKeys[]); +HACCEL CreateEditCommandAccel(); + +#endif \ No newline at end of file diff --git a/src/keys.c b/src/keys.c new file mode 100644 index 0000000..9e0db51 --- /dev/null +++ b/src/keys.c @@ -0,0 +1,704 @@ +/************************************************************************************ + + smb Utility + + File: keys.c + Description: + History: + + ************************************************************************************/ +#include "smbutil.h" +#include "emulator.h" +#include "keyaccel.h" +#include "ini.h" +#include "keys.h" +#include "objeditcom.h" + +// none, +shift, +ctrl, +shift+ctrl +#define CUSTOMIZE_WHEEL_NUMFUNCS 4 + +#define CUSTOMIZE_WHEEL_TYPE_NONE 0 +#define CUSTOMIZE_WHEEL_TYPE_CTRL 1 +#define CUSTOMIZE_WHEEL_TYPE_SHIFT 2 +#define CUSTOMIZE_WHEEL_TYPE_CTRLSHIFT 3 + +WHEELFUNC g_wfWheelFunc[CUSTOMIZE_WHEEL_NUMFUNCS]; +const WHEELFUNC g_wfWheelFuncDefault[CUSTOMIZE_WHEEL_NUMFUNCS] = {PAGE, TYPE16, TYPE1, OBJ}; + +static void ExecuteWheelCommand(WHEELFUNC wf, short zDelta) +{ + switch(wf) + { + case TYPE1: + if (zDelta > 0) + MapEditCommand(IDM_EDITCOMMAND_ADD1TOTYPE); + else if (zDelta) + MapEditCommand(IDM_EDITCOMMAND_DEC1TOTYPE); + break; + case TYPE16: + if (zDelta > 0) + MapEditCommand(IDM_EDITCOMMAND_ADD16TOTYPE); + else if (zDelta) + MapEditCommand(IDM_EDITCOMMAND_DEC16TOTYPE); + break; + case PAGE: + if (zDelta > 0) + MapEditCommand(IDM_EDITCOMMAND_REWPAGE); + else if (zDelta) + MapEditCommand(IDM_EDITCOMMAND_FWDPAGE); + break; + case OBJ: + if (zDelta > 0) + MapEditCommand(IDM_EDITCOMMAND_PREVOBJ); + else if (zDelta) + MapEditCommand(IDM_EDITCOMMAND_NEXTOBJ); + break; + } +} + +VOID ky_WM_MOUSEWHEEL(WPARAM wParam, LPARAM lParam) +{ + DWORD fwKeys = LOWORD(wParam); + short zDelta = (short) HIWORD(wParam); + + if ((fwKeys & MK_CONTROL) + &&(fwKeys & MK_SHIFT)) { + ExecuteWheelCommand(g_wfWheelFunc[CUSTOMIZE_WHEEL_TYPE_CTRLSHIFT], zDelta); + } + else if (fwKeys & MK_CONTROL) { + ExecuteWheelCommand(g_wfWheelFunc[CUSTOMIZE_WHEEL_TYPE_CTRL], zDelta); + } + else if (fwKeys & MK_SHIFT){ + ExecuteWheelCommand(g_wfWheelFunc[CUSTOMIZE_WHEEL_TYPE_SHIFT], zDelta); + } + else{ + ExecuteWheelCommand(g_wfWheelFunc[CUSTOMIZE_WHEEL_TYPE_NONE], zDelta); + } +} + +HANDLE ky_Initialize() +{ + if(!ReadFromRegistry(INI_EDITOR_WHEEL, + REG_BINARY, + g_wfWheelFunc, + CUSTOMIZE_WHEEL_NUMFUNCS * sizeof(WHEELFUNC))) { + CopyMemory(g_wfWheelFunc, g_wfWheelFuncDefault, CUSTOMIZE_WHEEL_NUMFUNCS * sizeof(WHEELFUNC)); + } + + return CreateEditCommandAccel(); +} + +#define NUM_VKEYINFO 83 + +const struct { + BYTE bVKey; + LPTSTR lpKeyName; +}g_VKeyInfo[NUM_VKEYINFO] = +{ +VK_BACK, "Back Space", +VK_TAB, "Tab", +VK_CLEAR, "Clear", +VK_RETURN, "Enter", +VK_PAUSE, "Pause", +VK_CAPITAL, "Caps Lock", +VK_ESCAPE, "Esc", +VK_SPACE, "Space", +VK_PRIOR, "Page Up", +VK_NEXT, "Page Down", + +VK_END, "End", +VK_HOME, "Home", +VK_LEFT, "Left", +VK_UP, "Up", +VK_RIGHT, "Right", +VK_DOWN, "Down", +VK_SELECT, "Select", +VK_SNAPSHOT,"Print Screen", +VK_INSERT, "Insert", +VK_DELETE, "Delete", + +0x30, "0", +0x31, "1", +0x32, "2", +0x33, "3", +0x34, "4", +0x35, "5", +0x36, "6", +0x37, "7", +0x38, "8", +0x39, "9", + +0x41, "a", +0x42, "b", +0x43, "c", +0x44, "d", +0x45, "e", +0x46, "f", +0x47, "g", +0x48, "h", +0x49, "i", +0x4A, "j", + +0x4B, "k", +0x4C, "l", +0x4D, "m", +0x4E, "n", +0x4F, "o", +0x50, "p", +0x51, "q", +0x52, "r", +0x53, "s", +0x54, "t", + +0x55, "u", +0x56, "v", +0x57, "w", +0x58, "x", +0x59, "y", +0x5A, "z", +VK_NUMPAD0, "Numpad 0", +VK_NUMPAD1, "Numpad 1", +VK_NUMPAD2, "Numpad 2", +VK_NUMPAD3, "Numpad 3", + +VK_NUMPAD4, "Numpad 4", +VK_NUMPAD5, "Numpad 5", +VK_NUMPAD6, "Numpad 6", +VK_NUMPAD7, "Numpad 7", +VK_NUMPAD8, "Numpad 8", +VK_NUMPAD9, "Numpad 9", +VK_MULTIPLY,"Numpad *", +VK_ADD, "Numpad +", +VK_SUBTRACT, "Numpad -", +VK_DECIMAL, "Numpad .", + +VK_DIVIDE, "Numpad /", +VK_F1, "f1", +VK_F2, "f2", +VK_F3, "f3", +VK_F4, "f4", +VK_F5, "f5", +VK_F6, "f6", +VK_F7, "f7", +VK_F8, "f8", +VK_F9, "f9", + +VK_F10, "f10", +VK_F11, "f11", +VK_F12, "f12" +}; + +static UINT FindVkeyIndex(BYTE bVkey) +{ + INT h,l,m; + + l = 0; + h = NUM_VKEYINFO; + + while(l <= h){ + m = (l + h) / 2; + if(g_VKeyInfo[m].bVKey <= bVkey) l = m + 1; + if(g_VKeyInfo[m].bVKey >= bVkey) h = m - 1; + } + + if(l - h == 2) + return (l - 1); + + return -1L; +} + + +// A, B, SELECT, START, UP, DOWN, LEFT, RIGHTの順 +// NOTE : A, B, SELECT, STARTが最初にくることを前提にして、 +// ジョイスティックのボタン設定を実装している +// (UP, DOWN, LEFT, RIGHTは未使用) +LPTSTR g_szEmuKeyName[EMULATOR_NUM_BUTTONS] = +{ + STRING_KEYCONFIG_EMU_A,//"A", + STRING_KEYCONFIG_EMU_B,//"B", + STRING_KEYCONFIG_EMU_SELECT,//"セレクト", + STRING_KEYCONFIG_EMU_START,//"スタート", + STRING_KEYCONFIG_EMU_UP,//"上", + STRING_KEYCONFIG_EMU_DOWN,//"下", + STRING_KEYCONFIG_EMU_LEFT,//"左", + STRING_KEYCONFIG_EMU_RIGHT//"右" +}; + +LPTSTR g_szEditKeyName[KEYACCEL_NUM_COMMANDS] = +{ + STRING_KEYCONFIG_EDIT_ADD1,//"種類を+1", + STRING_KEYCONFIG_EDIT_DEC1,//"種類を-1", + STRING_KEYCONFIG_EDIT_ADD16,//"種類を+16", + STRING_KEYCONFIG_EDIT_DEC16,//"種類を-16", + STRING_KEYCONFIG_EDIT_UP,//"位置を上へ", + STRING_KEYCONFIG_EDIT_DOWN,//"位置を下へ", + STRING_KEYCONFIG_EDIT_LEFT,//"位置を左へ", + STRING_KEYCONFIG_EDIT_RIGHT,//"位置を右へ", + STRING_KEYCONFIG_EDIT_NEXTPAGE,//"次のページへ", + STRING_KEYCONFIG_EDIT_PREVPAGE,//"前のページへ", + STRING_KEYCONFIG_EDIT_NEXTOBJ,//"次のオブジェクトへ", + STRING_KEYCONFIG_EDIT_PREVOBJ,//"前のオブジェクトへ", + STRING_KEYCONFIG_EDIT_SAVEFILE,//"ファイル: 上書き保存", + STRING_KEYCONFIG_EDIT_UNDO,//"編集: 元に戻す", + STRING_KEYCONFIG_EDIT_ROOM,//"編集: ルームを開く", + STRING_KEYCONFIG_EDIT_BADGUYS,//"編集: 敵", + STRING_KEYCONFIG_EDIT_MAP,//"編集: 地形", + STRING_KEYCONFIG_EDIT_TESTPLAY,//"エミュレータ: テストプレイ", + STRING_KEYCONFIG_EDIT_PAGETESTPLAY,//"エミュレータ: ページテストプレイ", + STRING_KEYCONFIG_EDIT_PAGETESTPLAY2,//"エミュレータ: 途中ページテストプレイ", + STRING_KEYCONFIG_EDIT_STOP,//"エミュレータ: 停止", + STRING_KEYCONFIG_EDIT_SAVEEMU,//"エミュレータ: セーブ", + STRING_KEYCONFIG_EDIT_LOADEMU,//"エミュレータ: ロード", + STRING_KEYCONFIG_EDIT_EMUSETTING,//"エミュレータ: テストプレイの設定", + STRING_KEYCONFIG_EDIT_NEXTWIN,//"ウインドウ: 次へ", + STRING_KEYCONFIG_EDIT_PREVWIN,//"ウインドウ: 前へ" +}; + +#define CUSTOMIZE_KEYIDS 2 + +#define CUSTOMIZE_KEYS_ID_INVALID 0 +#define CUSTOMIZE_KEYS_ID_EDIT 1 +#define CUSTOMIZE_KEYS_ID_EMU 2 + +static void EnableAccessoryKey(HWND hDlg,BOOL blEnable) +{ + CheckDlgButton(hDlg,IDC_CTRL,FALSE); + EnableWindow(GetDlgItem(hDlg,IDC_CTRL),blEnable); + CheckDlgButton(hDlg,IDC_ALT,FALSE); + EnableWindow(GetDlgItem(hDlg,IDC_ALT),blEnable); + CheckDlgButton(hDlg,IDC_SHIFT,FALSE); + EnableWindow(GetDlgItem(hDlg,IDC_SHIFT),blEnable); +} + +static DWORD FindOverlappedKeyDefinition(WORD wVkey,LPWORD lpwEditVKeys,LPWORD lpbEmuVKeys) +{ + int N; + + for(N=0;N> 16) + { + case CUSTOMIZE_KEYS_ID_EDIT: + wsprintf(szBuf, STRING_KEYCONFIG_OVERLAPPED, STRING_KEYCONFIG_KEYACCEL, g_szEditKeyName[dwResult & 0xFFFF]); + break; + case CUSTOMIZE_KEYS_ID_EMU: + wsprintf(szBuf, STRING_KEYCONFIG_OVERLAPPED, STRING_KEYCONFIG_EMULATOR, g_szEmuKeyName[dwResult & 0xFFFF]); + break; + } + return szBuf; +} + +#define WM_UPDATEKEYVALUE (WM_USER + 1) + +// ジョイスティック +DWORD g_adwJoyButtonFlags[JOYSTICK_MAX_BUTTONS] = {JOY_BUTTON1, JOY_BUTTON2, JOY_BUTTON3, JOY_BUTTON4, JOY_BUTTON5, JOY_BUTTON6, JOY_BUTTON7, JOY_BUTTON8, + JOY_BUTTON9, JOY_BUTTON10, JOY_BUTTON11, JOY_BUTTON12, JOY_BUTTON13, JOY_BUTTON14, JOY_BUTTON15, JOY_BUTTON16, + JOY_BUTTON17, JOY_BUTTON18, JOY_BUTTON19, JOY_BUTTON20, JOY_BUTTON21, JOY_BUTTON22, JOY_BUTTON23, JOY_BUTTON24, + JOY_BUTTON25, JOY_BUTTON26, JOY_BUTTON27, JOY_BUTTON28, JOY_BUTTON29, JOY_BUTTON30, JOY_BUTTON31, JOY_BUTTON32 }; + +// ジョイスティックの一つのボタンフラグビットからコンボボックスでのインデックスを得る +static UINT FindJoyButtonIndex(DWORD dwJoyButton) +{ + DWORD n; + + for (n = 0;n < JOYSTICK_MAX_BUTTONS;n++) { + if (g_adwJoyButtonFlags[n] == dwJoyButton) + return n; + } + + return (UINT)-1; +} + +LRESULT CALLBACK CustomizeDlgProc( HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam) +{ + static WORD bEmuVKeys[EMULATOR_NUM_BUTTONS]; + static WORD bEditVKeys[KEYACCEL_NUM_COMMANDS]; + static DWORD dwEmuJoyButtons[EMULATOR_NUM_JOYBUTTONS]; + static WHEELFUNC wfWheelFunc[CUSTOMIZE_WHEEL_NUMFUNCS]; + static UINT uKeyID,uKey,uKeyValue; + switch (message) + { + case WM_INITDIALOG: + { + UINT N; + LPTSTR lpKeyID[CUSTOMIZE_KEYIDS] = {STRING_KEYCONFIG_KEYACCEL, STRING_KEYCONFIG_EMULATOR}; + LPTSTR lpPreset[KEYACCEL_NUM_PRESETS] = {STRING_KEYCONFIG_PRESET_DESKTOP, STRING_KEYCONFIG_PRESET_NOTE}; + LPTSTR lpWheel[CUSTOMIZE_WHEEL_NUMFUNCS] = {STRING_KEYCONFIG_WHEEL_NONE, STRING_KEYCONFIG_WHEEL_CTRL, STRING_KEYCONFIG_WHEEL_SHIFT, STRING_KEYCONFIG_WHEEL_SHIFTCTRL}; + LPTSTR lpWheelFunc[CUSTOMIZE_WHEEL_NUMFUNCS] = {STRING_KEYCONFIG_WHEEL_TYPE1, STRING_KEYCONFIG_WHEEL_TYPE16, STRING_KEYCONFIG_WHEEL_PAGE, STRING_KEYCONFIG_WHEEL_OBJ}; + LPTSTR szButtonName = GetTempStringBuffer(); + + //--------------- + // 初期化 + //--------------- + // + GetEditorVKeys(&bEditVKeys[0]); + GetEmulatorVKeys(&bEmuVKeys[0]); + GetEmulatorJoyButtons(&dwEmuJoyButtons[0]); + CopyMemory(wfWheelFunc, g_wfWheelFunc, sizeof(WHEELFUNC) * CUSTOMIZE_WHEEL_NUMFUNCS); + + // キーボード + for(N=0;N 0){ + SendMessage(g_hEditWnd, EM_LINESCROLL, 0, lines); + index = SendMessage(g_hEditWnd, EM_LINEINDEX, lines - 1, 0); + SendMessage(g_hEditWnd, EM_SETSEL, index, index); + } +} + +HWND lv_CreateLogView(HWND hWndParent, int nHeight) +{ + HWND hWnd; + RECT rc; + HINSTANCE hInstance = GetModuleHandle(NULL); + + GetClientRect(hWndParent, &rc); + + if (nHeight <= 0 || nHeight + LOGVIEW_BORDERWIDTH > rc.bottom - rc.top) + nHeight = g_nLogViewBorderPos; + + hWnd = CreateWindowEx(0, + BORDERWNDCLASSNAME, + "", + WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS, + 0, nHeight, + rc.right - rc.left, LOGVIEW_BORDERWIDTH, + hWndParent, + NULL, + hInstance, + NULL); + + g_hBorderWnd = hWnd; + + hWnd = CreateWindowEx(0, + LOGVIEWWNDCLASSNAME, + NULL, + WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, + 0, nHeight + LOGVIEW_BORDERWIDTH, + rc.right - rc.left, 1, + hWndParent, + NULL, + hInstance, + NULL); + + g_hLogViewWnd = hWnd; + + // + AdjustLogView((WORD)nHeight); + + // + SetLogViewTexts(); + + // + g_fShowLogView = TRUE; + + return hWnd; +} + +BOOL lv_OutputString(LPTSTR szText, DWORD dwFlag) +{ + UINT nNewLen, nValidLen, nCR, nNeedLen; + + if (!szText || szText[0] == 0) return FALSE; + + // 単位は、byte + nNewLen = lstrlen(szText); + nValidLen = lstrlen(g_szLogBuffer) + 1; + + nCR = (dwFlag & LOGVIEW_OUTPUTSTRING_CR) ? 2 : 0; + + // 新しい文字列が最大バッファを超えている場合 + if (nNewLen + nCR + 1 >= LOGVIEW_BUFSIZ){ + g_szLogBuffer[0] = 0; + nNewLen = LOGVIEW_BUFSIZ - nCR;// + lstrcpyn(g_szLogBuffer, szText, nNewLen); + } + // 新しい文字列を格納するバッファが足りない場合 + else if (nValidLen + nNewLen + nCR > LOGVIEW_BUFSIZ) { + nNeedLen = (nNewLen + nCR) - (LOGVIEW_BUFSIZ - nValidLen); + MoveMemory(g_szLogBuffer, g_szLogBuffer + nNeedLen, nValidLen - nNeedLen); + lstrcpyn(g_szLogBuffer + nValidLen - nNeedLen - 1, szText, nNewLen + 1); + } + // 新しい文字列を格納するバッファが足りている場合 + else{ + lstrcat(g_szLogBuffer, szText); + } + + if (dwFlag & LOGVIEW_OUTPUTSTRING_CR){ + lstrcat(g_szLogBuffer,"\x0D\x0A"); + } + + if (g_hEditWnd) + SetLogViewTexts(); + + if (dwFlag & LOGVIEW_OUTPUTSTRING_BEEP) + MessageBeep(MB_OK); + + return TRUE; +} + +BOOL lv_OutputDebugString(LPTSTR szText) +{ + return lv_OutputString(szText, LOGVIEW_OUTPUTSTRING_CR); +} + +VOID lv_AdjustLogView() +{ + AdjustLogView(g_nLogViewBorderPos); + if (g_hLogViewWnd) + PostMessage(GetParent(g_hLogViewWnd), WM_SIZE, 0, 0); +} + +BOOL lv_ShowLogView() +{ + return g_fShowLogView; +} + +HWND lv_GetBorderWnd() +{ + return g_hBorderWnd; +} + +HWND lv_GetLogViewWnd() +{ + return g_hLogViewWnd; +} \ No newline at end of file diff --git a/src/logview.h b/src/logview.h new file mode 100644 index 0000000..2c2527c --- /dev/null +++ b/src/logview.h @@ -0,0 +1,27 @@ +#ifndef LOGVIEW_H +#define LOGVIEW_H + +#define LOGVIEW_DEFAULTHEIGHT 512 +#define LOGVIEW_BORDERWIDTH 5 + +#define LOGVIEW_FONTHEIGHT 12 + +#define LOGVIEW_FONTNAME "MS Pゴシック" +#define LOGVIEW_FONTNAMEI "MS Sans Serif" + +#define LOGVIEW_OUTPUTSTRING_CR 0x00000001 +#define LOGVIEW_OUTPUTSTRING_BEEP 0x00000002 + +BOOL lv_OutputDebugString(LPTSTR); + +HWND lv_GetBorderWnd(); +HWND lv_GetLogViewWnd(); +BOOL lv_OutputString(LPTSTR, DWORD); +BOOL lv_ShowLogView(); +VOID lv_AdjustLogView(); +BOOL lv_Initialize(); +VOID lv_Trash(); +VOID lv_DestroyLogView(); +HWND lv_CreateLogView(HWND hWndParent, int nHeight); + +#endif \ No newline at end of file diff --git a/src/misc/history.txt b/src/misc/history.txt new file mode 100644 index 0000000..afd7d2d --- /dev/null +++ b/src/misc/history.txt @@ -0,0 +1,173 @@ +0.31 +・とりあえず公開 +0.32 +・マップビューのカーソルの更新に関する不具合を修正。 +・マップビューのウインドウの大きさに応じたマップの表示。 +・マップビューの処理の軽量化。 +・アクセレレータキーの強化(子ウインドウ間の移動等)。 +・マップビューで表示できる範囲を1行追加。 +・マップビューの処理の不具合(3-3の最後が青空になる)を修正。 +・マップリストのキー入力のいくつかのバグを修正。 +・ページごとの移動キー(NUMPAD9(D)、NUMPAD3(A))の追加。 +0.33 +・エミュレータのフレームスキップ機能の追加 +・コードの整理。 +・マップのダイアログでサイズの表示がおかしくなるバグを修正。 +・マップビューに縦位置-1を追加。 +・マウス入力の追加(色がついている部分をクリック)。 +・マップビューの動作をエディトしやすくなるように改良。 +0.40 +・ルーム間移動の命令の編集用にプレビューを追加。 +・マップビューに敵を表示(一部未完成)。 +・エミュレータのセーブ・ロード機能の追加。 +・エリアの変更ダイアログをより使いやすく。 +・エミュレータのスプライトのプライオリティの改善。 +・エリアの並べ替え機能を追加。 +・ループウィザードを追加(仮)。 +・ツールバー、ステータスバーの追加。 +・マップエディトの文字キーの動作の修正。 +・その他、細かい不具合、バグの修正。 +0.41 +・マップビューに目盛りを追加。 +・マップリストが強制終了する不具合を修正。 +0.50 +・オブジェクトの他ルームへの移動機能の追加。 +・マップビューをオブジェクトビューへ、マップリストをオブジェクトリストへ改名。 +・ルームごとのオブジェクトデータの保護機能の追加。 +・オブジェクトビューの目盛りの補助線機能追加。 +・オブジェクトリストにリストビューを使用。 +・ツールバー、ステータスの表示・非表示。 +・エミュレータのキー(BとA)の変更。 +0.60 +・途中からテストプレイを可能にするページテストプレイ機能追加。 +・エリアの開始ルームの変更機能追加。 +・エミュレータのスピードアップ。 +・エミュレータのスピード制限機能追加。 +・文字列の編集のインデックス(タイル番号)による指定機能追加。 +・全般の設定に設定可能な項目を追加。 +・いくつかのバグ・不具合を修正。 +0.61 +・いくつかのバグフィックス(重要なものも含まれています)。 +・細かい点の改良。 +・ツールバーのグラフィックス。 +0.70 +・ インストーラでの配布。 +・ マニュアルを充実。 +・ アンドゥー機能の追加。 +・ IPSファイル作成機能の追加。 +・ オブジェクトビューに種類を確認できるツールチップを追加。 +・ エリアの開始ルームから移動可能なルームにおいて +1)開いたときに最初に表示されるページ +2)テストプレイの開始ページ +3)ワールドとエリアの設定 +を改良。 +・ オブジェクトビューで雲面のアスレチック台が表示されないバグを修正。 +・ 外部エディタによる書き込みチェックの動作不良の修正。 +・ ユーザーインターフェイスの動作の改良。 +・ その他、細かいバグの修正。 +0.80 +・ 編集ダイアログに”適用”ボタンを追加。 +・ デモレコーダー機能の追加。 +・ その他、細かい改良。 +0.81 +・ マニュアルを充実。 +・ オブジェクトビューで、更新時に目盛りの補助線がフラッシュしないように改善。 +・ その他の設定で”ワールド”に設定できる項目を追加。 +・ ソースコードの整理。 +0.85 +・ 途中開始ページからのテストプレイボタン追加。 +・ ページテストプレイでのスタートの高さの変更機能の追加。 +・ エミュレータのスピードアップ。 +・ エミュレータの正確さアップ。 +・ キーによる編集時のUNDO機能がちょっと使えるものになった。 +・ オブジェクトビュ−が少しだけスピードアップ。 +・ IPSファイル作成機能の削除。 +・ ”ルームを開く”ダイアログで、表示されない移動可能なルームのバグを修正 +0.88 +・ テストプレイの設定などのデフォルト値が変更可能に。 +・ インストーラーでの配布を中止 +・ 敵の編集ダイアログでの入力時の横位置にまつわるバグを修正。 +・ オブジェクトリストの縦ロープが城になるバグを修正。 +・ 使いにくいマウス編集(移動)を廃止。 +・ オブジェクトビューで途中開始ページが分かるように。 +・ オブジェクトを送るの動作の改良。 +・ 敵用のキーボード入力のページ送りコマンドにまつわる不具合を修正。 +・ 次/1つ前のオブジェクトへ移動の編集キー(NUMPAD7/1)を追加。 +・ エミュレータ・キーボードアクセラレータのキー割り当てがカスタマイズ可能に。 +・ エミュレータ実行速度の制限方法を改善することにより、システムに対する余計な負荷がかなり少なくなった。 +・ エミュレーターのGDI関連のバグを修正 +0.89(正式版ベータ1) +・ 初期化ファイルの読み込みに失敗する可能性があることを修正。 +・ ドラッグ&ドロップによる起動に関するバグを修正。 +・ エリアの開始ルームの編集後、自動的にワールドの区分の更新ツールを実行するようにした。 +・ 全般の設定の"元に戻す"機能を無効に +・ サンプルレベル(M.K.H氏作)を追加 +0.90(正式版ベータ2) +・ マウス編集(移動)を復活。 +・ ホイールマウスによる種類の変更に対応。 +・ キーボードのカスタマイズにプリセットキー機能を追加 +0.91(正式版ベータ3) +・ キーボードのカスタマイズで重複した設定をした場合、どのキーと重複するかを知らせるようにした。 +1.00(2001年11月29日、正式版) +・ 変更点なし +1.01(2004年8月12日) +・ 階段の長さ、斧・クッパの橋に関する注意点を追加。 +・ オブジェクトビューで、複数のオブジェクトが同じ位置にある場合に、ツールチップにそれらをすべて表示するように修正。 +・ オブジェクトビューで、同じ位置に複数のオブジェクトがあるオブジェクトスクエアを選択した場合、ポップアップウィンドウを表示して選択できる機能を追加。 +・ オブジェクトの詳細がオブジェクトビューで確認できるようなビットマップ表示に対応。 +・ オブジェクトビューで5-3以降出現の敵を半分反転させて表示。 +・ オブジェクトビューでの途中開始ページの表現を左上に右矢印を表示し、わかりやすく。 +・ オブジェクトビューのマウスホイール操作を、なにもキーを押さない状態でホイールした場合には、アクティブオブジェクトをページ単位での移動、シフトキーを押しながらホイールした場合は、種類を1ずつ変更するように変更。Ctrlを押しながらの操作は、従来通り、種類を16ずつ変更します。また、オブジェクトビューでホイールボタンをクリックすると敵・地形モードの切り替えを行えるように。 +・ 上書き保存時に確認のメッセージを表示するオプションを実装。 +・ オブジェクトビューをアクティブにすると同時にオブジェクトスクエアを選択すると、移動用の十字が残ってしまう不具合を修正。 +・ サンプルレベルを「マリオファン リローデッド」に変更。 +1.02(2004年8月25日) +・ オブジェクトビューの補助ビットマップの表示・非表示の設定に対応。 +・ 敵・地形オブジェクト編集モードの切り替え時に、アクティブオブジェクトのあるページが、新しい編集モードの最大ページを超えている場合に、従来は、最初のオブジェクトが選択状態になっていたのを、最後のオブジェクトを選択状態にするように改良。 +・ オブジェクトビューのツールチップにページ、位置の情報も表示するように改良。 +・ オブジェクトビューで、垂直方向のグリッドで、ページ境界の色を見やすい破線に変更。 +・ オブジェクトビューのグリッドの表示非表示を記憶するように改良。 +・ テストプレイの設定で、開始固定ページの設定に途中ページを設定できるボタンを追加。 +・ テストプレイの設定で、マリオの出現位置の縦位置、横位置を設定可能に。これに伴い、初期位置の設定を削除。 +・ オブジェクトビューで選択した任意の位置からマリオをスタートさせることのできるテストプレイ「ポイントテストプレイ」機能を追加。 +・ ルーム間の移動の命令の位置がおかしくなる場合がある不具合を修正。 +・ 敵オブジェクトのページ送りコマンドは、6ビットであることにまつわる不具合を修正。 +・ ルームの保護機能有効時には、1ルームで処理できる範囲のオブジェクトのみ編集、表示できるように修正。 +・ オブジェクトを他ルームに送る機能に送り先ルームの1ルームの最大オブジェクト数のチェックを追加。 +・ オブジェクトビューでオブジェクトのない場合、右クリックのポップアップメニューで実行できない項目を無効化。 +・ ホイールクリックで、ポップアップウィンドウが消えないというWindowsの仕様により、ポップアップを表示させたまま、ホイールクリックで編集モードを変えれられると問題が生じる可能性があるため、ホイールクリックによる編集モードの変更を廃止。その代わりに右クリックで表示されるポップアップウィンドウに同等の機能のメニュー項目を追加。 +1.03(2004年10月1日) +・ オプション変更後、ルームを開いた時の処理を行うように修正。 +・ デモレコーディング終了時にビープ音を鳴らすように。 +・ CHRROMの読み込みのオプションとして、「キャラクタROM全体を読み込む」機能を実装。 +・ 「その他の設定」にあったメモリーリークを除去。 +・ キーを押さずにホイール、Shift + ホイール、Ctrl + ホイールの操作に対する機能の割り当てを変更可能に。 +・ 「テストプレイの設定」に「ダメージ判定無効化」オプションを追加。 +・ 「エリアの開始ルームの編集」ダイアログにプレビューを追加。 +1.04(2005年3月1日) +・ エミュレータ初期化関数にジョイスティックの初期化関数を呼び出すように変更し、一部のPS2コントローラーコンバータに対応。 +・ オブジェクトビューで、複数のオブジェクトがあるオブジェクトスクエアをクリックした時に表示されるポップアップの非表示オプションを追加。 +・ オブジェクトビューのツールチップで横位置が負の値の場合に異常な数値が表示されるバグを修正。 +1.05 +・ オブジェクトビューで、複数のオブジェクトがあるオブジェクトスクエアをコントロールキーを押しながらクリックした場合にのみ、オブジェクト選択用ポップアップが表示されるように変更。 +1.06 +・ 内容の変更はありません。 +・ このバージョンはファイナルリリースであり、ソースコードの扱いを変更したバージョンです。 +1.061 +・ オブジェクトビューの補助画像において、?ブロック内のアイテムの視認性をアップ。 +・ 編集を加えたファイルについて、タイトルバーの名前にアスタリスクを付くように。 +(・ 1.06がファイナルリリースであるとした不具合を修正。) +1.08 +・ エミュレータで使用するジョイスティックのボタンの割り当てを変更可能に。 +・ ジョイスティックの方向キーの読み込みがアナログスティックに対応。 +・ コントローラの方向キーとして、ジョイスティックのPOVを割り当てることが可能に。 +・ コマンドプロンプトから起動した場合に、初期化ファイル読み込み時のディレクトリ取得処理に失敗する不具合を修正。 +1.08 再公開 +・ デモレコーダーが正しく動作していなかった不具合を修正。 +・ ジョイスティックの状態取得APIの呼び出しをPOVの有効・無効設定を反映したものに変更。 +・ メインウィンドウのエミュレータのメニューキーをE(編集と重複している)からMに変更し、途中ページテストプレイのメニューキーを追加。 +・ Internationalバージョンのログのフォントを「Arial」から「MS Sans Serif」に変更。 +・ メインウィンドウの「元に戻す」に続く名前をダブルクォーテーションで囲むように変更。 +・ カスタマイズダイアログでAlt・Shift・Ctrlを変更してキーが重複した場合に、メッセージボックスのエラー文字列が正しく表示されない不具合を修正。 +・ 文字列の編集で、Enterキーを押しても書き込みを行えるように変更。 +・ その他、細かい点の修正。 diff --git a/src/misc/howto.htm b/src/misc/howto.htm new file mode 100644 index 0000000..61c56ee --- /dev/null +++ b/src/misc/howto.htm @@ -0,0 +1,784 @@ + + + + + + +SMB Utilityの使い方 + + + + +

使い方 Ver. 1.08向け

+ +

 使用する上で、疑問となりそうな点や知っておくと便利な機能などを説明・紹介します。文章中の”オリジナル”とは、改造されていないスーパーマリオブラザーズのことです。なお、この文書は、SMB Utilityの使い方を中心に書いていますが、新しいマップを作成する上で必要なことを全部は説明できていません。足りない部分については、オリジナルのスーパーマリオブラザーズで、どのようになっているかを調べてみたり、インターネット上の情報を検索したりして補ってください。

+ +

1.基本操作

+ +

ファイルを開く

+ +
+

 ”開く”ダイアログボックスの他に、ドラッグ&ドロップによっても、ファイルを開くことができます。SMB + UtilityのアイコンにROMファイルをドラッグ&ドロップするか、起動中のSMB + UtilityにROMファイルをドラック&ドロップします。 

+

※ 対応ROMファイルフォーマットは、.NESフォーマットマッパー0のみです。また、SMB + Utilityは、ROMを開く前に、最大限のROMのチェックは行いますが、そのチェックをパスしてしまうような他のROMを読み込んだ場合、その動作は未知です。

+
+ +

元に戻す

+ +
+

 メニュー [ 編集 ] - [ + 元に戻す ] + を選択することで、一つ前の処理を元に戻すことができます。1回前の操作に対してだけ行うことができます。

+
+ +

2.オブジェクトの編集

+ +

 はじめに、オリジナルマップを作成する上で理解しておく必要のあるルームとページという用語について簡単に説明します。土管や豆の木などで、行き来する場所を +1つのルームと呼びます。また、エリアのスタート地点となるルームをメインルーム、メインルームから豆の木や土管で移動可能なルームをサブルームと呼びます。例えば、オリジナルの +1-1には、地上面と地下面(コイン部屋)の 2つのルームがあり、前者がメインルーム、後者がサブルームです。また、ページは、ルームを分割した単位のことで、1画面に表示できる幅(16キャラクタ分)を +1ページとします。例えば、オリジナルの 1-1の地下面(コイン部屋)は、1ページで終わります。また、ルームにおけるページは、ルームの始まりから +0ページ、1ページ、2ページ、・・・ +と数えます。オブジェクトは、?ブロックやクリボーなどのマップを構成する部品で、敵オブジェクトと地形オブジェクトに大別されます。

+ +

編集するルームの変更

+ +
+

 メニュー [編集] - [ルームの変更] + または、ツールバーの土管の絵のボタンをクリックして、”ルームの変更”ダイアログを開きます。ツリービューの + 1項目が、1ルームに対応しています。ツリービューの最も左側にある項目がメインルームです。メインルームの項目の左にボタン(□の中に+があるボタン)がある場合、そのメインルームのサブルームが存在します。ボタンをクリックするか、項目をダブルクリックすることで、メインルームの下にサブルームが表示されます。ルームを変更するには、目的のルームを選択して、”OK”ボタンをクリックします。

+
+ +

敵・地形オブジェクト編集モードの切り替え

+ +
+

 地形を編集する場合は、メニュー + [ 編集 ] - [ 地形 ] + または、ツールバーのショベルカーのボタンをクリック、敵を編集する場合は、メニュー + [ 編集 ] - [ 敵 ] + または、ツールバーのカメの甲羅のボタンをクリックします。デフォルト設定では、キーボードのF3、F4がそれぞれ敵、地形編集モードへの切り替えキーになっています。また、オブジェクトビューで右クリックすると表示されるポップアップメニューの編集モードを切り替えを選択すると敵と地形の編集モードを切り替えることができます。

+
+ +

ウインドウとその役割

+ +
+
+ + + + + + + + + + + + + + + + + + + + +
 オブジェクトリストウインドウリストによってオブジェクトを確認できます。
 オブジェクトビューウインドウ視覚的にオブジェクトを確認できます。
エミュレータウインドウエミュレータ実行用のウインドウです。
ステータスバー左側には、ファイル保存の完了などのメッセージが表示されます。右側には、「エリア + (ルームID [敵オブジェクトデータの開始アドレス, + 地形オブジェクトデータの開始アドレス] )」の情報が表示されます。
 ツールバー左からファイルを開く、ファイルを上書き保存、編集するルームの変更、敵編集モード、地形編集モード、エリアの開始からのテストプレイ、アクティブオブジェクトのあるページからのテストプレイ、エリアの途中でミスした場合に開始となるページからのテストプレイ、エミュレータの実行停止、テストプレイの設定を実行するボタンになっています。
+

選択されて編集の対象になっているオブジェクトのことをアクティブオブジェクトと呼びます。オブジェクトリストウインドウとオブジェクトビューウインドウにおけるアクティブオブジェクトの表現については、それぞれのウインドウの項目を参照してください。

+

オブジェクトリストウインドウとオブジェクトビューウインドウからは、”編集”ダイアログと”移動先指定”ダイアログの2つのダイアログを使用できます。それぞれのウインドウからのダイアログの表示の方法については、それぞれのウインドウの項目を、ダイアログについての説明は、「オブジェクト + ビュー/リストの補助ダイアログ」の項目を参照してください。

+
+ +

オブジェクトリストウインドウ

+ +
+

 オブジェクトリストウインドウは、リストビューで構成されるウインドウで、オブジェクトをリストとして見ることができ、オブジェクトの詳細・バイナリデータを確認するのに使用します。

+

@ アクティブオブジェクト

+

 1行が1つのオブジェクトに対応しており、強調表示になっている行がアクティブオブジェクトを表しています。選択したいオブジェクトの行をクリック、または、十字キーでアクティブオブジェクトを変更できます。

+

A ”編集”ダイアログの表示

+

 目的のオブジェクトの行をダブルクリック、または、Enterキーを押すと、”編集”ダイアログボックスが表示されます。このダイアログによってアクティブオブジェクトを編集できます。詳細については、オブジェクト +ビュー/リストの補助ダイアログの項目の@ ”編集”ダイアログを参照してください。

+

B + ”移動先の指定”ダイアログの表示

+

 目的のオブジェクトの行を右クリックすると、”移動先の指定”ダイアログが表示されます。このダイアログによってアクティブオブジェクトを他ルームに送ることができます。詳細については、オブジェクト +ビュー/リストの補助ダイアログの項目のA ”移動先指定”ダイアログを参照してください。

+
+ +

オブジェクトビューウインドウ

+ +
+

 オブジェクトビューウインドウは、垂直方向と水平方向の目盛りとビューで構成されるウインドウで、オブジェクトを視覚的に確認でき、オブジェクトの選択が容易に行うことができます。

+

@ オブジェクトの表現

+

 色のついた正方形(地形オブジェクトは緑系の色、敵オブジェクトは、青系の色)1つが、1つのオブジェクトに対応しています。この正方形のことをオブジェクトスクエアと呼びます。また、明るい色の正方形の部分がアクティブオブジェクトを、暗い色の正方形の部分がそれ以外のオブジェクトを表しており、前者をアクティブ(オブジェクト)スクエアと呼ぶことにします。オブジェクトビューウインドウでアクティブオブジェクトを選択するには、目的のオブジェクトスクエアをクリックします。オブジェクトスクエアに複数のオブジェクトがある場合、Ctrlキーを押しながらクリックすると、ポップアップメニューが表示され、アクティブにするオブジェクトを選択することができます。また、オブジェクトスクエアをマウスでポイントするとツールチップが表示され、オブジェクトのページ、位置、種類を確認できます。敵オブジェクトで、「5-3以降表示される」オブジェクトについては、そのオブジェクトスクエアの半分が反転表示されます。

+

A ”編集”ダイアログの表示

+

 ウインドウをダブルクリック、または、ウインドウを右クリックで表示されるポップアップメニューで”アクティブオブジェクトを編集”を選択すると、”編集”ダイアログボックスが表示され、アクティブオブジェクトを編集することができます。詳細については、オブジェクト +ビュー/リストの補助ダイアログの項目の@ ”編集”ダイアログを参照してください。

+

B + ”移動先の指定”ダイアログの表示

+

 ウインドウを右クリックすると表示されるポップアップメニューで”アクティブオブジェクトを他ルームへ送る”を選択すると、”移動先の指定”ダイアログが表示され、アクティブオブジェクトをダイアログで指定したルームへ送ることができます。詳細については、オブジェクト +ビュー/リストの補助ダイアログの項目のA ”移動先指定”ダイアログを参照してください。

+

C ウインドウのサイズ

+

 ウインドウの右端をドラッグすると1ページずつ段階的にウインドウのサイズを変更することができます。なお、オブジェクトビューウインドウの描画が遅い場合、ウインドウの表示範囲を小さくして使用すると、緩和されます。

+

D 目盛りの補助線の表示

+

 座標を読み取りやすくするための補助線を表示することができます。垂直方向の補助線は、横位置目盛りを、水平方向の補助線は、縦位置目盛りをクリックすることで表示します。もう一度クリックすることで、非表示にすることができます。ページ境界の垂直方向の補助線は破線、その他は直線になっています。この補助線の表示・非表示は、アプリケーション終了後も保存されます。

+

E マウスによる編集

+

 オブジェクトビューでは、マウスによるオブジェクトの移動と種類の変更を行うことができます。アクティブオブジェクトをドラッグするとアクティブスクエアの4辺それぞれに接する4つの四角形が表示されます。ドラッグしたまま、表示された四角形へマウスを移動させるとその四角形の位置へオブジェクトが移動されます。また、Windows(R)98かそれ以降のOS上で、ホイールマウスを使用している場合、ホイールを回転させることによってアクティブオブジェクトを変更したり、種類を変更することができます。何もキーを押さない状態でホイールを回転させた場合、アクティブオブジェクトをページ単位で移動させます。Shiftキー、Ctrlキーを押しながらホイールを回転させた場合、それぞれ、1ずつ、16ずつ種類が変化していきます。なお、ホイールを使用して種類を変更する場合、オブジェクトビューウインドウがアクティブな状態になっていることを確認してください。

+

F 途中開始ページの表現

+

 オリジナルでは、あるページを超えたところでミスをするとそのページから再スタートすることになります。そのページの左上隅には、右方向の矢印が表示されます。

+

G + ポイントテストプレイ

+

 オブジェクトビューで選択した任意の位置からマリオをスタートさせることのできるテストプレイのことをポイントテストプレイといいます。ポイントテストプレイをスタートさせるには、まず、オブジェクトビューのマリオをスタートさせたい位置で右クリックし、ポップアップメニューを表示させます。そのメニュー内の「この位置からテストプレイ」を選択することで、マウスカーソルで指定したページの横位置、縦位置からエミュレータでテストプレイを行うことができます。なお、このポイントテストプレイでは、新ルーム移動後の初期出現位置が異常になるなどの実際のプレイとは異なった点が発生します。

+
+ +

オブジェクト +ビュー/リストの補助ダイアログ

+ +
+

@ ”編集”ダイアログ

+

 このダイアログは、アクティブオブジェクトを編集するときに使用します。

+

改ページフラグ

+

 改ページフラグは、各ページの先頭のオブジェクトがもつフラグです。

+

ページ送りコマンド

+

 ページ送りコマンドは、その次のオブジェクトのページを設定するオブジェクトです。このオブジェクトによって、空白のページを作成することができます。”敵”オブジェクト用のページ送りコマンドは、ページ送りコマンドのチェックボックスをオンにして、その隣のエディットボックスで指定ページを設定します。”地形”オブジェクト用のページ送りコマンドは、縦位置を13、種類を”ページ送りコマンド”に設定して、長さで指定ページを設定します。ページ送りコマンドを配置する際には、以下の3点に注意します。

+

 ・ + ページ送りコマンドの改ページフラグは、オフにする。

+

 ・ + ページ送りコマンドの次のオブジェクトの改ページフラグも、オフにしておく。 +

+

 ・ + 逆戻りするようなページの指定はしない。

+

バイナリ入力

+

 バイナリ入力は、エディトボックスに入力した数値がそのまま書きこまれます。この数値の入力には、16進数を用い、数値(1バイト)と数値(1バイト)の間は、必ずスペース1個分空けてください。マップ編集の場合は、3バイトまで、敵編集の場合は、4バイトまで入力できます。入力したデータのサイズが編集しているオブジェクトのデータのサイズを超えた場合、残りのバイトは、編集しているデータを超えたところからコピーされます。

+

ルーム間移動の命令 + (敵オブジェクト)  
+
 このオブジェクトによって豆の木や土管などによるルーム変更時の移動先の指定を行います。”ワールド”は、このオブジェクトが有効になるワールドで、誤った設定を行った場合、移動先の指定は有効になりません。”ルーム”と”ページ”で、それぞれ移動先のルームとそのルーム内のページを設定します。このとき、”ページ”は、指定した”ルーム”の(ページ送りコマンド以外の)地形オブジェクトの存在するページに設定しなければ、ブラックアウトしてしまいます。なお、”プレビュー”ボタンをクリックすると表示されるプレビューによって、移動先を視覚的に確認することができます。

+

A ”移動先指定”ダイアログ

+

 このダイアログでは、アクティブオブジェクトを他のルームへ移動させることができます。移動先のパラメータとしてルームとページの指定します。プレビューには、移動先のページが表示されます。OKをクリックすると実際に移動されます。ただし、次のような場合、移動できません。
+
 ・移動するオブジェクトが改ページフラグを持っているかページ送りコマンドである(移動元のエラー)。
+  ・移動先のページ(オブジェクトの全くないルームを除く)には、オブジェクトがない(移動先のエラー)。
+  ・移動先のルームにSMBエンジンが処理できる数を超えたオブジェクトがある。

+
+ +

キーボードによる編集

+ +
+

 キーボードを使用すると、アクティブオブジェクトに対するスピーディな編集を行うことができます。下の表は、初期設定におけるキーと操作の対応表です。テン・キーを使用する際には、NumLockがオンになっている必要があります。

+

 キーの詳細

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
テン・キーの 8アクティブオブジェクトの位置を上へ移動する。
テン・キーの 4アクティブオブジェクトの位置を左へ移動する。
テン・キーの 2アクティブオブジェクトの位置を下へ移動する。
テン・キーの 6アクティブオブジェクトの位置を右へ移動する。
+アクティブオブジェクトの種類のデータを1だけ増やす。
-アクティブオブジェクトの種類のデータを1だけ減らす。
*アクティブオブジェクトの種類のデータを16だけ増やす。
/アクティブオブジェクトの種類のデータを16だけ減らす。
テン・キーの 9アクティブオブジェクトをその次のページの先頭のオブジェクトに変更する。
テン・キーの 3アクティブオブジェクトをその1つ前のページの先頭のオブジェクトに変更する。
テン・キーの + 7アクティブオブジェクトをその次のオブジェクトに変更する。
テン・キーの + 1アクティブオブジェクトをその1つ前のオブジェクトに変更する。
+

※ + キー入力の際、次のようなオブジェクトの移動はできません。 +

+

 ・ オブジェクトの第1バイト目にFDH(地形)、FFH(敵)を入力してしまうような移動。

+

 ・ 1ページに1つしかないオブジェクトを他のページに移動させる。

+

※ + これらのキーの割り当ては、変更することもできます。"5. + カスタマイズ"を参照してください。

+
+ +

エミュレータウインドウ

+ +
+

@ 入力デバイス

+

 キーボードかジョイスティックを使用します。デフォルトでは、以下のような割り当てになっています。

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
キーボードジョイスティック 
十字キー十字ボタン移動ボタン
Backspaceボタン3SELECT
Enterボタン4START
Bボタン1B
Nボタン2A
+

※ キーボード入力とジョイスティックのボタンに関しては、カスタマイズ可能です。これについての詳細は、"5.カスタマイズ"を参照してください。

+

※ PCに2つのジョイスティックがインストールされている場合、メニュー[ツール] - [オプション] で”オプション”ダイアログを開き、”エミュレータ”のページの”使用するジョイスティック”で、どのジョイスティックを使用するかを選択することができます。

+

※ メニュー[ツール] - [オプション] で”オプション”ダイアログを開き、”エミュレータ”のページの”ジョイスティックのpoint of viewを有効にする”をチェックすることで、ジョイスティックのハットスイッチ(point of view)を方向キーとして割り当てることができます。

+

※ PCにジョイスティックがインストールされているが、SMB Utilityでは使用しない場合、メニュー[ツール] - [オプション] で”オプション”ダイアログを開き、”エミュレータ”のページの”ジョイスティックを使用しない。”をチェックして、ジョイスティックの使用を無効にしてください。

+

※ ジョイスティックがWindowsに認識されていない場合、メニュー + [ツール] - [オプション] で開く”オプション”ダイアログ、”エミュレータ”のページの”ジョイスティックを使用しない。”のチェックをはずすことはできません。

+ +

A 実行の種類

+

通常起動 タイトル画面から実行します。

+

テストプレイ 現在編集しているルームの先頭ページ(0ページ)にプレイヤーを置いた状態で実行します。

+

ページテストプレイ テストプレイとの違いは、プレイヤーの置かれるページが、アクティブオブジェクトのあるページか、指定したページ(”テストプレイの設定”ダイアログで変更可能)であるということです。なお、地形オブジェクトの全くないページを開始ページとして設定できません。

+

途中ページテストプレイ テストプレイとの違いは、プレイヤーの置かれるページが、途中開始ページであるということです。なお、途中開始ページに地形オブジェクトが全くない場合、途中ページテストプレイは行えません。

+

B + テストプレイの設定”ダイアログ

+

 このダイアログ内の設定は、テストプレイの時のみ有効で、実際のROMファイルへの影響はありません。以下の設定を有効にしてテストプレイを行った場合、実際にプレイしたときとは違う場合があります。

+

 ・ + 「開始ページの敵も出現させる。」を有効にした場合。
+
+  ・ 「無敵状態にする。」を有効にした場合。
+
+  ・ + 「ページテストプレイの開始位置」を設定した場合。(ルーム間の移動を行った場合、初期出現位置がおかしくなります。)

+

また、このダイアログ内のデフォルトの(起動時に設定される)値を変更することもできます。"5. + カスタマイズ"を参照してください。

+

C ウインドウのサイズ

+

 ウインドウの右・下端をドラッグすると段階的にウインドウのサイズを変更することができます。なお、描画が遅い場合、ウインドウの表示範囲を小さくして使用すると、緩和されることがあります。

+

D セーブ・ロード機能

+

 セーブされたデータは、アプリケーションを終了すると消去されます。また、セーブ後にオブジェクトを移動し、その後、ロードを行うと正常に実行されない恐れがあります。

+
+ +

ルーム・エリアの設定の変更

+ +
+

 メニュー [ 編集 ] - [ 設定 ] + で”設定”ダイアログを開きます。”エリア”に関する項目は、エリアの開始ルームを編集しているときのみ有効になります。”途中の開始ページ”では、プレイヤーがミスしたときの中間スタートのページを設定します。

+
+ +

3.ツール

+ +

 ツールは、ゲーム全体にかかわる設定や、オブジェクトの補助的なデータなどを変更する際に使用します。

+ +

文字列編集ツール

+ +
+

 このツールでは、画面上側にあるゲームステータスの部分の表示や、ワールドクリアした際に表示される文字列等の編集を行うことができます。

+

特殊文字の入力

+

 通常のアルファベット・数字・記号(' + . ', ' ! ', ' - ', ' * ' [ = 'x' ], ' @ ' [ = '(C)' ])の他に、タイルの番号による指定も可能です。具体的には、#xx(xxは、16進数のタイルの番号)と入力することで、その番号(xx)に対応するタイルを指定できます。なお、xxは必ず2文字でなければいけません(例えば#Aと指定するのではなく#0Aと指定する)。タイルの番号の確認は、Nesticleで行えます。

+
+ +

ループ編集ツール

+ +
+

  ループデータをバイナリ入力によって変更できます。スペースで区切られた数字1つが、1バイトに対応しており、その数字は16進数です。

+

■ ループとその作成法

+

 ループは、オリジナルのの4-4,7-4,8-4で見られる、ある地点において、ある高さを通れば、次に進むことができ、さもなければ、ある地点へマップが戻されてしまうというワナです。ループコマンド、ページ送りコマンドの2種類の地形オブジェクトとループデータの1種類のデータの合計3つ要素によって形成されます。

+

 簡単にループの作成法について説明します。この説明のように作成すれば、ほとんどすべての場合、思い通りのループを作成可能ですが、何らかの未知の原因により、うまくいかない場合もあるということを頭の片隅に置いておいてください。また、この説明は非常に分かりにくいものになっています。オリジナルも参考にしてください。

+

@ ループデータのまとまり

+

 (”A + データの意味”の表中の)a、b、c、d + のデータは、まとまりがあります。具体的には、a、b、c、d + のそれぞれ n バイト目が、n + 個目のループデータのまとまりになっています(n + = 1、2、3、…、11)。例えば、オリジナルでは、03 + 05 40 12(いずれも16進数)は、1つめのループデータのまとまり、03 + 09 B0 36(いずれも16進数)は、2つ目のループデータのまとまりです。

+

A データの意味

+ + + + + + + + + + + + + + + + + + + + + +
 a. ワールド ループが有効になるワールドを指定します。((ワールド)-1)で指定することに注意してください。
 b. ページ ”B 判定1つタイプの(オリジナルの4-4や8-4で見られる)ループの作成法 ”や”C 判定3つタイプの(オリジナルの7-4で見られる)ループの作成法”を参照してください。
 c. + 縦位置の条件 ループしないために通るべき縦位置を上位4ビットで指定します。例えば、00(16進数)は縦位置 + -1、10(16進数)は縦位置 0、20(16進数)は縦位置 + 1、…、 F0(16進数)は 縦位置 15 + の指定になります。なお、下位4ビットは、特に理由がない限り、0にしておきます。
 d. 戻り位置 ループした際に戻されるページの先頭にある地形オブジェクト用ページ送りコマンドをマップの先頭からの(0起算の)バイト数を指定します。このバイト数は、地形オブジェクト用ページ送りコマンドの”編集”ダイアログ内の”XXバイト目”の項目のXXをそのまま入力します。
 e. ワールド7のループの設定 ワールド7のループを他のワールドで出す場合、この2つのデータを希望のワールドに変更します。((ワールド)-1)で指定することに注意してください。
+

B 判定1つタイプの(オリジナルの4-4や8-4で見られる)ループの作成法 

+

 ”a. + ワールド”で、設定したワールド内のルームにおいて、次のような関係でデータ、オブジェクトを設定します。なお、ループのデータは、同じまとまりのデータを使用します。

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ページp + p + 1p + 2p + 3 + p + 4
ループデータ

”d. 戻り位置”を設定。注1

+
  

”c. 縦位置の条件”を設定。

+

”b. ページ”のデータに ( p + 4 ) + を設定

+
地形オブジェクト

ページの先頭に地形オブジェクトの + p ページへのページ送りコマンド注2

+
  

ループコマンド注3

+
 
備考

ループした際に戻されるページ

+
  

プレイヤーがこのページの横位置 + 0 にやってきた時に、縦位置の判定が行われる。

+

このページには、ループした場合、p + ページが表示され、ループしなかった場合は、( + p + 4 )ページが表示される。

+
+

注 1 このバイト数は、地形オブジェクトのページ送りコマンドの”編集”ダイアログ内の”XXバイト目”の項目のXXをそのまま入力します。

+

注 + 2 たとえ、改ページフラグを使えば p + ページになるとしても、必ずページ送りコマンドを使って + p ページに設定し、そのページ送りコマンドはページの先頭になるように配置します。

+

注 + 3 地形オブジェクトの縦位置13のオブジェクトです。

+

C 判定3つタイプの(オリジナルの7-4で見られる)ループの作成法

+

 まず、”e.ワールド7のループの設定”を、2つともループをこのタイプのループを作成するワールドに変更します( + ((ワールド)-1) + で指定することに注意してください。)。このワールドでは、”判定 + 1つのタイプのループ”を作成することはできません。データとオブジェクトをどのように配置するかについては、まず、判定個所が3つあるため、ループデータは、3つのまとまりを使用します。この3つのまとまりに、”判定1つのタイプのループ”と同様に、”a + ワールド”、”d 戻り位置”を設定し(それぞれのデータは、3つのまとまりとも等しくなる)、その他のデータ・オブジェクトについては、以下のように設定・配置します。

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ページp + p + 1p + 2p + 3 + p + 4
データまとまり1

(”d. 戻り位置”を設定。)

+
”c. 縦位置の条件”を設定。

”b. + ページ”のデータに ( p + 2 ) を設定

+
  
まとまり2 ”c. 縦位置の条件”を設定。”b. + ページ”のデータに ( p + 3 ) を設定 
まとまり3  ”c. 縦位置の条件”を設定。”b. + ページ”のデータに ( p + 4 ) を設定
地形オブジェクト

ページの先頭に地形オブジェクトの + p ページへのページ送りコマンド(Bの注2 + を参照)

+
ループコマンド ループコマンドループコマンド 
備考

ループした際に戻されるページ

+
プレイヤーがこのページの横位置 + 0 にやってきた時に、縦位置の判定が行われる。プレイヤーがこのページの横位置 + 0 にやってきた時に、縦位置の判定が行われる。

プレイヤーがこのページの横位置 + 0 にやってきた時に、縦位置の判定が行われる。

+

このページには、ループした場合、p + ページが表示され、ループしなかった場合は、( + p + 4 )ページが表示される。

+
+

作成上のコツ

+

・ + ループコマンドをページの先頭に置くと、うまくいかなくなることがあります。

+

・ + 戻り位置のページの前のページの敵が表示されてしまう場合、その敵を左に移動させる(横位置を減らす)か、最後の判定の行われるページのループコマンドを右に移動させる(横位置を増やす)ことで解決することがあります。

+

・ + ループするかの判定が行われる際、ループのデータの参照は、後ろの方のまとまりから順に行われます。

+
+ +

ワールドの区分の更新ツール

+ +
+

 ワールドとエリアの表示が、”エリアの変更”ダイアログと実際とで違う場合、このツールを実行してください。この機能は、多分、もう使用する必要がないと思います。というのは、以前のSMB + Utilityでは、例えば、1ワールドが4つ以外のエリアで構成されているオリジナルマップを作成した場合、ワープゾーンでワールドを変更するとおかしなルームからワールドが始まっていました。これを修正するのが「ワールドの区分の更新」機能なのですが、最近のバージョンでは、そうなる可能性のあるところで自動的に実行するように改良されています。

+
+ +

エリア開始ルームの編集ツール

+ +
+

 このツールで、エリアの開始ルームの変更と並べ替え行うことができます。

+

(1) エリア開始ルームの変更

+

 変更したいエリアをダブルクリックすると、”エリアの開始ルームの指定”ダイアログが表示されます。このダイアログで、新しいルームを選びます。

+

(2) + エリア開始ルームの並べ替え

+

 移動したいエリアを選択して、右側にある↑ボタンで、始めのほうに、↓ボタンで後のほうに移動します。

+

 エリアの開始ルームの変更によって、土管や豆の木によるルーム間の移動が正常に行われなくなることがありますが、これは、ルーム間移動の命令のワールドの設定の関係でルーム間移動の命令が無効になったことが原因です。ルーム間移動の命令のワールドの設定を適切に変更することで解決します。

+
+ +

デモレコーダー

+ +
+

 このツールでは、タイトル画面中のデモプレイを作成することができます。何かのボタンを押した時点で記録が開始され、保存できる容量を越えた時点で記録が終了します。SMBのデモデータの性質上、一つのキーをできるだけ長く維持することを心がける(つまりキーの変化の周期を長くする)と長いデモを作成することができます。

+
+ +

全般の設定ツール

+
+

クリアーとなるワールド
+  ここで指定したワールドをクリアーするとエンディングとなります。このワールドは、1から8の間のワールドで指定します。この変更は、”元に戻す”機能で元に戻すことはできません。また、ここでの指定より後のワールドのルームは、”ルームの変更”ダイアログで選択できなくなります。「カスタム」チェックボックスは、バイナリエディタでの改造をサポートするための機能で、元々チェックされた状態からチェックをはずした場合以外、ツール側から操作に意味はありません。キノピオをピーチ姫にするワールドのデータ、文字表示と音楽を変えるワールドのデータ、終わりの判定のワールドのデータの3つが等しくない(バイナリエディタで編集されている)場合に、このチェックボックスがオンになり、エディトボックスの値をROMに書き込まないします。

+
+ +

その他の設定ツール

+ +
+

ワープゾーン

+

 オリジナルでは、ワールドとして36を設定すると表示なしとなります。

+

1UPキノコ 

+

 隠れブロックの1UPキノコには、獲得権のようなものが存在し、この獲得権がない場合、配置した隠れブロックの1UPキノコは、表示されません。この獲得権の取得・喪失の条件はどのようになっているかについては、まず、スタート時にはすでに与えられています。その後、プレイヤーが隠れブロックの1UPキノコの付近にやってきた時点で、失います。隠れブロックの1UPキノコの獲得権を失った後で、再び獲得権を得るための方法は、2つあります。1つは、ワープゾーンに入ることです。もう1つは、各ワールドの3番目のエリアで、”ある枚数”以上のコインを取って、ゴールすることです。この”ある枚数”をここで設定することができます。

+

ワールド(難易度の境目)

+

 ここで設定したワールドとエリア以降では、次のような難易度の変化があります。

+
+

・ リフトが短くなる。

+

・ ”5-3以降表示”の敵が表示されるようになる。

+
+
+ +

4.その他の機能

+ +

キャラクタROMの読み込み機能

+ +
+

 メニュー [ファイル] - [キャラクタROMの読み込み] + で、”開く”ダイアログを開き、読み込み元のROMファイルを指定します。読み込み元のROMファイルからキャラクタROMが、現在編集しているROMへ読み込まれます。この際、絵のデータ部分のみ読み込むようになっています。キャラクタROM全体を取り込みたい場合は、「キャラクタロム全体を読み込む。」のチェックボックスをオンにしてROMファイルを指定ください。

+
+ +

外部エディタによるファイル変更の監視機能

+ +
+

 開いた(または、保存した)ファイルに対して外部のプログラムが、何らかの書き込みを行った場合、smb + Utility は、再度そのファイルを読み直すかどうかの確認をします。読み直した場合、SMB + Utility + で開いた時または、前回の保存時からの変更は、すべて無効になりますのでご注意ください。

+
+ +

ルームごとのオブジェクトの保護機能

+ +
+

 この機能は、編集しているルーム内のオブジェクトのみを表示・編集できるようにします。この機能を有効にしておくと、オブジェクトの終了を示すデータが無効になっても、編集しているルームのオブジェクトのみ表示され、誤って他のルームのデータを編集してしまうといったことを防止します。メニュー + [ツール] + - [オプション] + で、”オプション”ダイアログを開き、”エディタ”のページ内の”ルームごとのオブジェクトの保護機能を有効にする”チェックボックスによって、この機能を有効・無効にすることができます。

+
+ +

5.カスタマイズ

+ +

 より使いやすくするために、好みに応じて変更できる部分があります。

+ +

起動時に設定されるデフォルト値の変更

+ +
+

 起動時に設定されるデフォルト値は、SMB + Utility + 実行可能ファイルのあるディレクトリにある初期化ファイル"smbutil.ini"に保存されています。これをテキストエディタを使用して編集することにより、変更できます。

+

(1) ”テストプレイの設定”のデフォルト値

+

 テストプレイの設定のデフォルト値(起動時に設定される値)を変更することができます。"smbutil.ini"をテキストエディタで開き、次の部分を見つけてください。

+
+

[TESTPLAYDEFAULTS]
+ HARD = 0
+ STATE = 0
+ BADGUYS = 0
+ INVINCIBLE = 0
+ PAGE = 256

+
+

ここが、テストプレイの設定のデフォルト値を指定した部分です。”[TESTPLAYDEFAULTS]” + の下の5行のそれぞれについて、左辺がキー名、右辺が値となっています。それぞれのキー名に対応する設定の内容と有効な値は、以下のようになっています。

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
キー名対応する設定の内容有効な値
HARD裏面として出す0: オフ、1: オフ
STATEマリオの状態0: マリオ、1: + スーパーマリオ、2: ファイアーマリオ
BADGUYS開始ページの敵も出現させる。0: オフ、1: オフ
INVINCIBLEプレイヤーのダメージ判定の無効化する。0: オフ、1: オフ
PAGEページテストプレイの開始ページ0-255: + 指定したページから
+ 256: + 選択しているオブジェクトのあるページから
+

(2) ”ルームごとのオブジェクトの保護機能を有効にする。”のデフォルト値

+

 エディターのオプション”ルームごとのオブジェクトの保護機能を有効にする。”を起動時に、オンにするかオフにするかの設定です。"smbutil.ini"をテキストエディタで開き、次の部分を見つけてください。

+

[EDITOR]
+ PROTECT = 1

+

”PROTECT”キーが1の場合はオン、0の場合はオフになります。

+
+ +

キーボード入力編集のキー設定の変更

+ +
+

 メニュー [ツール]-[カスタマイズ] + で表示される”カスタマイズ”ダイアログの”キーボード”で行います。Ctrl・Alt・Shiftチェックボックスは、オンにすると、それぞれCtrlキー・Altキー・Shiftキーを同時に押しながらという設定になります。キーボードアクセレレータとエミュレータのキー割り当ては、重複してはいけません。また、”プリセットキー”では、キーボードの種類にあわせた予め設定されたキーをまとめて設定できます。この設定は、次回の起動時から有効になります。

+
+ +

マウスホイール設定の変更

+
+

 メニュー [ツール]-[カスタマイズ] + で表示される”カスタマイズ”ダイアログの”マウスホイール”で行います。同時キーの項目は、そのキーを押しながらホイールすることを意味します。内容で、それに対する動作を設定します。重複する割り当てを行おうとした場合、重複した設定をしようとしたホイール操作の前の割り当てと重複している割り当てが交換される形で設定が行われます。

+
+ +

ジョイスティックのボタン割り当ての変更

+
+

 メニュー [ツール]-[カスタマイズ] + で表示される”カスタマイズ”ダイアログの”ジョイスティック”で行います。内容でコントローラーのボタンを選択し、値でそれに割り当てるジョイスティックのボタンを設定します。重複する割り当てを行おうとした場合、重複した設定をしようとしたボタンの前の割り当てと重複している割り当てが交換される形で設定が行われます。

+
+ + +

上書き保存時に確認のメッセージボックスの表示

+
+

 上書き保存時に確認のメッセージボックスを表示し、誤って保存してしまうことを防ぐことができます。このメッセージボックスの表示・非表示は、メニュー + [ツール] + - [オプション] + で、”オプション”ダイアログを開き、”アプリケーション”のページ内の”上書き保存時に、確認メッセージボックスを表示する。”のオン・オフで、設定できます。

+
+ +

オブジェクトビューの補助ビットマップの非表示

+
+

 高度な改造マリオ作成者向けな機能として、オブジェクトビューに表示されるキノコなどの補助ビットマップを非表示にできます。メニュー + [ツール] + - [オプション] + で、”オプション”ダイアログを開き、”オブジェクトビュー”のページ内の”補助ビットマップを非表示にする”のオン・オフで、それぞれ非表示・表示に設定できます。

+
+ +

6.トラブルシューティング

+ +

 問題に遭遇した場合の解決法として、参考にしてください。

+ +

アプリケーション関連

+ +

(1) +キーボードによる編集で、オブジェクトを動かせない。

+ +
+

オブジェクトの第1バイトにマップの場合はFDH、敵の場合はFFH(それぞれ、オブジェクトの終了示す。)を作るような移動は、行えないようになっています。

+

1ページに1つしかない改ページフラグを持つオブジェクトを他のページに移動させることは、行えないようになっています。

+
+ +

(2) +ワールドやエリアの表示が、”ルームの変更”ダイアログボックスと実際とで違っている。

+ +
+

 ワールドの区分を設定するデータが適切でないことが原因です。”ワールドの区分の更新”ツールを実行して解決します。

+
+ +

(3) +ルーム間移動の命令がうまく働かない。

+ +
+

 ルーム間移動の命令を有効にしたいワールドを正しく設定する必要があります。

+
+ +

マップ作成関連

+ +

(1) +斧を踏んだときにクッパの橋が落ちない。

+ +
+

 クッパの橋や斧の地形オブジェクトのあるページが奇数ページである場合、そのようなことが状態が発生します。偶数ページに変更してください。

+
+ +

(2) 地形オブジェクトが消えてしまう。

+
+

 縦に多数のオブジェクトを(約4つ以上)配置している場合、そのようなことが起こります。縦にあまり重ならないよう工夫して配置してみてください。

+
+ +

(3) エリアの表示がおかしくなる。

+
+

 幅9・高さ8の階段を長さ0以外の地形オブジェクトを設置した場合、その次のエリアからそのような問題が発生します。階段の長さを0に設定してください。

+
+ +

(4) + ルームの長さを長くしたい。

+
+

 これは、キーボード入力による編集では、行うことができません。まず、そのルームの一番最後のオブジェクトを選択してください。ただし、そのオブジェクトは、そのページの唯一のオブジェクトであってはいけません。そして、オブジェクトビューまたは、オブジェクトリストでダブルクリックして表示される「編集」ダイアログで、改ページフラグのチェックボックスをオンにして「OK」ボタンをクリックします。するとそのオブジェクトによって、1ページ分だけルームが長くなるはずです。

+
+

(5) +1-3などのオリジナルでは他ルームへ行く術のないエリアで、他ルームへの移動を可能にしたい。

+
+

 そのようなルームには、敵オブジェクトの一つである「ルーム間移動の命令」が一つもないはずです。「ルーム間移動の命令」によって移動先ルームを指定するため、このようなルームから他のルームへの移動を行わせたい場合、「ルーム間移動の命令」をそのルームに配置することが必要です。解決法としては、他のルームから使用されていない「ルーム間移動の命令」のオブジェクトを「送る」コマンドで、そのルームへ移動させます。もう一つ、あまりお勧めできない解決法があります。敵編集モードにし、適当な敵オブジェクトで編集ダイアログを開き、バイナリ入力で、1バイト目をXEH(Xは任意)と入力し、無理やりに「ルーム間移動の命令」を作ってしまうということです。この操作を行うと、敵データ終了データが無効になってしまう等の予期せぬ症状が発生することがありますので、データの後処理には細心の注意が必要です。なお、敵データ終了データが無効になってしまう問題は、この方法によってそのルームに「ルーム間移動の命令」を偶数個ずつ増やすことで回避できます。

+
+ +

7.参考文献

+ +

k1氏: スーパーマリオオリジナルマップ作成講座
+ ルーム、ページ、改ページフラグ、ページ送りコマンド、ルーム間移動の命令、ループ、ループコマンドの用語が定義されている他、敵・地形オブジェクトのデータの詳細について分かりやすく書かれています。

+ +
+ +

+(C) 1999-2012 M.K.S
+本文書に登場する登場する会社名・商品名は、一般に各社の商標または登録商標です。

+ + diff --git a/src/misc/license.txt b/src/misc/license.txt new file mode 100644 index 0000000..ffb83a0 --- /dev/null +++ b/src/misc/license.txt @@ -0,0 +1,9 @@ +------------------------------------- +SMB Utility 1.08 ソースコードについて +------------------------------------- +○ ソースコードの扱いについて + 内部で使用している"Multi-6502 CPU emulator"のライセンスの関係上、非商用に限って自由な配布・改変・複製を行ってよいものとします。ただし、悪意のあるコードを埋め込む改変や、ゲームROMファイルを同梱した配布は固く禁止します。著作権は作者(M.K.S)にあるものとします。また、使用した際に生じたすべての損害に対して、作者は補償の義務を負わないものとします。 + +○ コンパイルにあたって +・ Visual C++ 6.0を使用しています。 +・ "Multi-6502 CPU emulator"のアセンブルにはNASM(http://www.nasm.us/)が必要です。binディレクトリにnasm.exeをコピーしてビルドします。 diff --git a/src/misc/readme.txt b/src/misc/readme.txt new file mode 100644 index 0000000..e5c5644 --- /dev/null +++ b/src/misc/readme.txt @@ -0,0 +1,32 @@ + + + SMB Utility ver.1.08 + + + + このテキストは、メモ帳の[編集]-[右端で折り返す]をチェックすると読みやすくなります。 + + +§1 概要 + SMB Utility は、Super Mario Bros.(TM)のオリジナルマップを作成するためのWindows(R)用アプリケーションです。SMB Utilityとその作者は、Super Mario Bros.(TM)の開発元であるNintendo(R)とは、一切関係ありません。 + +§2 ファイルの説明 + smbutil.exe: SMB Utilityの実行可能ファイルです。 + smbutil.ini: SMB Utilityの初期化ファイルです。 + readme.txt: 現在、開いているファイルです。 + howto.htm: 使用上のヒントが書かれています。 + history.txt: SMB Utilityのバージョンアップ履歴です。 + delreg.exe: SMB Utility のレジストリキー(設定)を削除するプログラムで、アンインストール時に実行します。 + sample/: M.K.H氏によってSMB Utilityで作成されたサンプルレベル用IPSファイルです。 + +§3 ライセンス + SMB Utility(以下、本ソフトウエアとします。)は、フリーウェアです。本ソフトウエアの著作権は、M.K.S(以下、作者とします。)に帰属します。本ソフトウエアの転載・配布は、(内部で使用しているMulti-6502 CPU emulatorのライセンスの関係上)非商用に限り自由に行ってよいものとし、ゲームROMファイルを同梱することは固く禁止します。また、本ソフトウエアを使用したことによって生じたすべての損害に対して、作者は補償の義務を負いません。 + +§4 貢献 + Multi-6502 CPU emulator by Neil Bradley (neil@synthcom.com) + Chezzman1さんとわいわいさんは、1.00 International beta3の英訳に協力してくださいました。 + 1.08 Internationalの英訳において、Insectduelさんの作成されたISD SMB Utilに同梱されているReadMe.txtの中のWhat's added in ISD SMB Util?の項目を参考にさせていただきました。 + 1.08 Internationalの英訳において、MirracleMXXさんの作成されたSMB Utility English Version 1.07を参考にさせていただきました。 + +§5 その他 + このテキスト内に登場する会社名・商品名は、各社の商標または登録商標です。 diff --git a/src/misc/sample/readme.txt b/src/misc/sample/readme.txt new file mode 100644 index 0000000..60f783c --- /dev/null +++ b/src/misc/sample/readme.txt @@ -0,0 +1,14 @@ + + マリオファン リローデッド + + +0.紹介 + マリオファンを元に作られた、地形や敵オブジェクトの組み合わせの面白さが光る作品です。IPSファイル形式での配布ですので、Windows以外のOSを使用していて、マリオファンをプレイできなかった方も、その楽しさの一部を味わうことができます。 + +1.スタッフ + プロデュース: M.K.H + 追加プログラミング: M.K.S + タイトル編集: M.K.H + レベル編集: M.K.H + テストプレイ: M.K.S + 配布プログラム作成: M.K.S diff --git a/src/misc/sample/smbfr.ips b/src/misc/sample/smbfr.ips new file mode 100644 index 0000000..4d7a77a Binary files /dev/null and b/src/misc/sample/smbfr.ips differ diff --git a/src/misc/sample/smbfr_t.ips b/src/misc/sample/smbfr_t.ips new file mode 100644 index 0000000..b53b1a4 Binary files /dev/null and b/src/misc/sample/smbfr_t.ips differ diff --git a/src/misc/smbutil.ini b/src/misc/smbutil.ini new file mode 100644 index 0000000..100bfcf --- /dev/null +++ b/src/misc/smbutil.ini @@ -0,0 +1,9 @@ +[TESTPLAY] +HARD = 0 +STATE = 0 +BADGUYS = 0 +INVINCIBLE = 0 +PAGE = 256 + +[EDITOR] +PROTECT = 1 diff --git a/src/nespal.h b/src/nespal.h new file mode 100644 index 0000000..cc31ac8 --- /dev/null +++ b/src/nespal.h @@ -0,0 +1,148 @@ +/************************************************************************************ + + smb Utility + + File: nespal.h + Description: + History: + + ************************************************************************************/ + +//Colors NES uses +/* +PALETTEENTRY peNESPal[]= +{ +0x7f, 0x7f, 0x7f, 0x00, +0x00, 0x00, 0xff, 0x00, +0x00, 0x00, 0xbf, 0x00, +0x47, 0x2b, 0xbf, 0x00, +0x97, 0x00, 0x87, 0x00, +0xab, 0x00, 0x23, 0x00, +0xab, 0x13, 0x00, 0x00, +0x8b, 0x17, 0x00, 0x00, +0x53, 0x30, 0x00, 0x00, +0x00, 0x78, 0x00, 0x00, +0x00, 0x6b, 0x00, 0x00, +0x00, 0x5b, 0x00, 0x00, +0x00, 0x43, 0x58, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0xbf, 0xbf, 0xbf, 0x00, +0x00, 0x78, 0xf8, 0x00, +0x00, 0x58, 0xf8, 0x00, +0x6b, 0x47, 0xff, 0x00, +0xdb, 0x00, 0xcd, 0x00, +0xe7, 0x00, 0x5b, 0x00, +0xf8, 0x38, 0x00, 0x00, +0xe7, 0x5f, 0x13, 0x00, +0xaf, 0x7f, 0x00, 0x00, +0x00, 0xb8, 0x00, 0x00, +0x00, 0xab, 0x00, 0x00, +0x00, 0xab, 0x47, 0x00, +0x00, 0x8b, 0x8b, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0xf8, 0xf8, 0xf8, 0x00, +0x3f, 0xbf, 0xff, 0x00, +0x6b, 0x88, 0xff, 0x00, +0x98, 0x78, 0xf8, 0x00, +0xf8, 0x78, 0xf8, 0x00, +0xf8, 0x58, 0x98, 0x00, +0xf8, 0x78, 0x58, 0x00, +0xff, 0xa3, 0x47, 0x00, +0xf8, 0xb8, 0x00, 0x00, +0xb8, 0xf8, 0x18, 0x00, +0x5b, 0xdb, 0x57, 0x00, +0x58, 0xf8, 0x98, 0x00, +0x00, 0xeb, 0xdb, 0x00, +0x78, 0x78, 0x78, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0xff, 0xff, 0xff, 0x00, +0xa7, 0xe7, 0xff, 0x00, +0xb8, 0xb8, 0xf8, 0x00, +0xd8, 0xb8, 0xf8, 0x00, +0xf8, 0xb8, 0xf8, 0x00, +0xfb, 0xa7, 0xc3, 0x00, +0xf0, 0xd0, 0xb0, 0x00, +0xff, 0xe3, 0xab, 0x00, +0xfb, 0xdb, 0x7b, 0x00, +0xd8, 0xf8, 0x78, 0x00, +0xb8, 0xf8, 0xb8, 0x00, +0xb8, 0xf8, 0xd8, 0x00, +0x00, 0xff, 0xff, 0x00, +0xf8, 0xd8, 0xf8, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00 +}; +*/ + +RGBQUAD rgbNESPal[EMULATOR_NES_COLORS]= +{ +0x7f, 0x7f, 0x7f, 0x00, +0xff, 0x00, 0x00, 0x00, +0xbf, 0x00, 0x00, 0x00, +0xbf, 0x2b, 0x47, 0x00, +0x87, 0x00, 0x97, 0x00, +0x23, 0x00, 0xab, 0x00, +0x00, 0x13, 0xab, 0x00, +0x00, 0x17, 0x8b, 0x00, +0x00, 0x30, 0x53, 0x00, +0x00, 0x78, 0x00, 0x00, +0x00, 0x6b, 0x00, 0x00, +0x00, 0x5b, 0x00, 0x00, +0x58, 0x43, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0xbf, 0xbf, 0xbf, 0x00, +0xf8, 0x78, 0x00, 0x00, +0xf8, 0x58, 0x00, 0x00, +0xff, 0x47, 0x6b, 0x00, +0xcd, 0x00, 0xdb, 0x00, +0x5b, 0x00, 0xe7, 0x00, +0x00, 0x38, 0xf8, 0x00, +0x13, 0x5f, 0xe7, 0x00, +0x00, 0x7f, 0xaf, 0x00, +0x00, 0xb8, 0x00, 0x00, +0x00, 0xab, 0x00, 0x00, +0x47, 0xab, 0x00, 0x00, +0x8b, 0x8b, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0xf8, 0xf8, 0xf8, 0x00, +0xff, 0xbf, 0x3f, 0x00, +0xff, 0x88, 0x6b, 0x00, +0xf8, 0x78, 0x98, 0x00, +0xf8, 0x78, 0xf8, 0x00, +0x98, 0x58, 0xf8, 0x00, +0x58, 0x78, 0xf8, 0x00, +0x47, 0xa3, 0xff, 0x00, +0x00, 0xb8, 0xf8, 0x00, +0x18, 0xf8, 0xb8, 0x00, +0x57, 0xdb, 0x5b, 0x00, +0x98, 0xf8, 0x58, 0x00, +0xdb, 0xeb, 0x00, 0x00, +0x78, 0x78, 0x78, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0xff, 0xff, 0xff, 0x00, +0xff, 0xe7, 0xa7, 0x00, +0xf8, 0xb8, 0xb8, 0x00, +0xf8, 0xb8, 0xd8, 0x00, +0xf8, 0xb8, 0xf8, 0x00, +0xc3, 0xa7, 0xfb, 0x00, +0xb0, 0xd0, 0xf0, 0x00, +0xab, 0xe3, 0xff, 0x00, +0x7b, 0xdb, 0xfb, 0x00, +0x78, 0xf8, 0xd8, 0x00, +0xb8, 0xf8, 0xb8, 0x00, +0xd8, 0xf8, 0xb8, 0x00, +0xff, 0xff, 0x00, 0x00, +0xf8, 0xd8, 0xf8, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +}; diff --git a/src/objdata.h b/src/objdata.h new file mode 100644 index 0000000..588290f --- /dev/null +++ b/src/objdata.h @@ -0,0 +1,207 @@ +/************************************************************************************ + + smb Utility + + File: objdata.h + Description: + History: + + ************************************************************************************/ + +SMBMAPOBJECTINFO smbMapObjectInfo0B[]={ + STRING_OBJDATA_MAP_B_01, 0x7F, 0x00, 0x00, 0x00, 0, STRING_NULL, + STRING_OBJDATA_MAP_B_02, 0x7F, 0x01, 0x00, 0x00, 0, STRING_NULL, + STRING_OBJDATA_MAP_B_03, 0x7F, 0x02, 0x00, 0x00, 0, STRING_NULL, + STRING_OBJDATA_MAP_B_04, 0x7F, 0x03, 0x00, 0x00, 0, STRING_NULL, + STRING_OBJDATA_MAP_B_05, 0x7F, 0x04, 0x00, 0x00, 0, STRING_NULL, + STRING_OBJDATA_MAP_B_06, 0x7F, 0x05, 0x00, 0x00, 0, STRING_NULL, + STRING_OBJDATA_MAP_B_07, 0x7F, 0x06, 0x00, 0x00, 0, STRING_NULL, + STRING_OBJDATA_MAP_B_08, 0x7F, 0x07, 0x00, 0x00, 0, STRING_NULL, + STRING_OBJDATA_MAP_B_09, 0x7F, 0x08, 0x00, 0x00, 0, STRING_NULL, + STRING_OBJDATA_MAP_B_10, 0x7F, 0x09, 0x00, 0x00, 0, STRING_NULL, + STRING_OBJDATA_MAP_B_11, 0x7F, 0x0A, 0x00, 0x00, 0, STRING_NULL, + STRING_OBJDATA_MAP_B_12, 0x7F, 0x0B, 0x00, 0x00, 0, STRING_OBJDATA_HELP_B12, + STRING_OBJDATA_MAP_B_13, 0x7F, 0x0C, 0x00, 0x00, 0, STRING_OBJDATA_HELP_B13, + STRING_OBJDATA_MAP_B_14, 0x7F, 0x0D, 0x00, 0x00, 0, STRING_OBJDATA_HELP_B14, + STRING_OBJDATA_MAP_B_15, 0x7F, 0x0E, 0x00, 0x00, 0, STRING_NULL, + STRING_OBJDATA_MAP_B_16, 0x7F, 0x0F, 0x00, 0x00, 0, STRING_NULL, + STRING_OBJDATA_MAP_B_17, 0x70, 0x10, 0x01, 0x0F, -1, STRING_NULL, + STRING_OBJDATA_MAP_B_18, 0x70, 0x20, 0x01, 0x0F, -1, STRING_NULL, + STRING_OBJDATA_MAP_B_19, 0x70, 0x30, 0x01, 0x0F, -1, STRING_NULL, + STRING_OBJDATA_MAP_B_20, 0x70, 0x40, 0x01, 0x0F, -1, STRING_NULL, + STRING_OBJDATA_MAP_B_21, 0x70, 0x50, 0x01, 0x0F, -1, STRING_NULL, + STRING_OBJDATA_MAP_B_22, 0x70, 0x60, 0x01, 0x0F, -1, STRING_NULL, + STRING_OBJDATA_MAP_B_23, 0x78, 0x70, 0x01, 0x07, -1, STRING_OBJDATA_HELP_B23, + STRING_OBJDATA_MAP_B_24, 0x78, 0x78, 0x01, 0x07, -1, STRING_OBJDATA_HELP_B23 +}; + +SMBMAPOBJECTINFO smbMapObjectInfoC[]={ + STRING_OBJDATA_MAP_C_01, 0x70, 0x00, 0x01, 0x0F, -1, STRING_OBJDATA_HELP_C01, + STRING_OBJDATA_MAP_C_02, 0x70, 0x10, 0x01, 0x0F, -1, STRING_OBJDATA_HELP_C02, + STRING_OBJDATA_MAP_C_03, 0x70, 0x20, 0x01, 0x0F, -1, STRING_NULL, + STRING_OBJDATA_MAP_C_04, 0x70, 0x30, 0x01, 0x0F, -1, STRING_NULL, + STRING_OBJDATA_MAP_C_05, 0x70, 0x40, 0x01, 0x0F, -1, STRING_NULL, + STRING_OBJDATA_MAP_C_06, 0x70, 0x50, 0x01, 0x0F, -1, STRING_OBJDATA_HELP_C06, + STRING_OBJDATA_MAP_C_07, 0x70, 0x60, 0x01, 0x0F, -1, STRING_NULL, + STRING_OBJDATA_MAP_C_08, 0x70, 0x70, 0x01, 0x0F, -1, STRING_NULL +}; + +SMBMAPOBJECTINFO smbMapObjectInfoD[]={ + STRING_OBJDATA_MAP_D_01, 0x40, 0x00, 0x01, 0x3F, 0, STRING_OBJDATA_HELP_D01, + STRING_OBJDATA_MAP_D_02, 0x7F, 0x40, 0x00, 0x00, 0, STRING_NULL, + STRING_OBJDATA_MAP_D_03, 0x7F, 0x41, 0x00, 0x00, 0, STRING_OBJDATA_HELP_D03, + STRING_OBJDATA_MAP_D_04, 0x7F, 0x42, 0x00, 0x00, 0, STRING_OBJDATA_HELP_D04, + STRING_OBJDATA_MAP_D_05, 0x7F, 0x43, 0x00, 0x00, 0, STRING_OBJDATA_HELP_D05, + STRING_OBJDATA_MAP_D_06, 0x7F, 0x44, 0x00, 0x00, 0, STRING_OBJDATA_HELP_D06, + STRING_OBJDATA_MAP_D_07, 0x7F, 0x45, 0x00, 0x00, 0, STRING_NULL, + STRING_OBJDATA_MAP_D_08, 0x7F, 0x46, 0x00, 0x00, 0, STRING_NULL, + STRING_OBJDATA_MAP_D_08, 0x7F, 0x47, 0x00, 0x00, 0, STRING_NULL, + STRING_OBJDATA_MAP_D_10, 0x7F, 0x48, 0x00, 0x00, 0, STRING_NULL, + STRING_OBJDATA_MAP_D_11, 0x7F, 0x49, 0x00, 0x00, 0, STRING_NULL, + STRING_OBJDATA_MAP_D_12, 0x7F, 0x4A, 0x00, 0x00, 0, STRING_OBJDATA_HELP_D12, + STRING_OBJDATA_MAP_D_13, 0x7F, 0x4B, 0x00, 0x00, 0, STRING_OBJDATA_HELP_D13, + STRING_OBJDATA_MAP_D_14, 0x7F, 0x4C, 0x00, 0x00, 0, STRING_NULL, + STRING_OBJDATA_MAP_D_15, 0x7F, 0x4D, 0x00, 0x00, 0, STRING_NULL, + STRING_OBJDATA_MAP_D_15, 0x7F, 0x4E, 0x00, 0x00, 0, STRING_NULL, + STRING_OBJDATA_MAP_D_15, 0x7F, 0x4F, 0x00, 0x00, 0, STRING_NULL +}; + +SMBMAPOBJECTINFO smbMapObjectInfoE[]={ + STRING_OBJDATA_MAP_E_01, 0x40, 0x00, 0x00, 0x00, 0, STRING_NULL, + STRING_OBJDATA_MAP_E_02, 0x40, 0x40, 0x00, 0x00, 0, STRING_NULL +}; + +SMBMAPOBJECTINFO smbMapObjectInfoF[]={ + STRING_OBJDATA_MAP_F_01, 0x70, 0x00, 0x01, 0x0F, 0, STRING_OBJDATA_HELP_F01, + STRING_OBJDATA_MAP_F_02, 0x70, 0x10, 0x01, 0x0F, -1, STRING_OBJDATA_HELP_F02, + STRING_OBJDATA_MAP_F_03, 0x70, 0x20, 0x01, 0x0F, 0, STRING_OBJDATA_HELP_F03, + STRING_OBJDATA_MAP_F_04, 0x78, 0x30, 0x01, 0x07, -1, STRING_NULL, + STRING_OBJDATA_MAP_F_05, 0x78, 0x38, 0x01, 0x07, 0, STRING_OBJDATA_HELP_F05, + STRING_OBJDATA_MAP_F_06, 0x70, 0x40, 0x01, 0x0F, -1, STRING_NULL, + STRING_OBJDATA_MAP_F_07, 0x70, 0x50, 0x01, 0x0F, -1, STRING_OBJDATA_HELP_F07, + STRING_OBJDATA_MAP_F_08, 0x70, 0x60, 0x01, 0x0F, 0, STRING_NULL, + STRING_OBJDATA_MAP_F_08, 0x70, 0x70, 0x01, 0x0F, 0, STRING_NULL +}; + +int GetNum0BMapObject(){return sizeof(smbMapObjectInfo0B) / sizeof(SMBMAPOBJECTINFO);} +int GetNumCMapObject() {return sizeof(smbMapObjectInfoC) / sizeof(SMBMAPOBJECTINFO);} +int GetNumDMapObject() {return sizeof(smbMapObjectInfoD) / sizeof(SMBMAPOBJECTINFO);} +int GetNumEMapObject() {return sizeof(smbMapObjectInfoE) / sizeof(SMBMAPOBJECTINFO);} +int GetNumFMapObject() {return sizeof(smbMapObjectInfoF) / sizeof(SMBMAPOBJECTINFO);} + +struct {LPSTR Name;}smbMapBasicBlock[]={ + STRING_OBJDATA_BB_01, STRING_OBJDATA_BB_02, STRING_OBJDATA_BB_03, STRING_OBJDATA_BB_04, + STRING_OBJDATA_BB_05, STRING_OBJDATA_BB_06, STRING_OBJDATA_BB_07, STRING_OBJDATA_BB_08, + STRING_OBJDATA_BB_09, STRING_OBJDATA_BB_10, STRING_OBJDATA_BB_11, STRING_OBJDATA_BB_12, + STRING_OBJDATA_BB_13, STRING_OBJDATA_BB_14, STRING_OBJDATA_BB_15, STRING_OBJDATA_BB_16 +}; + +LPSTR smbMapHeadTime[]={ + STRING_OBJDATA_T_01, + STRING_OBJDATA_T_02, + STRING_OBJDATA_T_03, + STRING_OBJDATA_T_04 +}; + +LPTSTR smbMapHeadPosition[]={ + STRING_OBJDATA_P_01, + STRING_OBJDATA_P_02, + STRING_OBJDATA_P_03, + STRING_OBJDATA_P_04, + STRING_OBJDATA_P_01, + STRING_OBJDATA_P_01, + STRING_OBJDATA_P_07, + STRING_OBJDATA_P_07 +}; + +LPTSTR smbMapHeadBackColor[]={ + STRING_OBJDATA_BC_01, + STRING_OBJDATA_BC_02, + STRING_OBJDATA_BC_03, + STRING_OBJDATA_BC_04, + STRING_OBJDATA_BC_05, + STRING_OBJDATA_BC_06, + STRING_OBJDATA_BC_07, + STRING_OBJDATA_BC_08 +}; + +LPTSTR smbMapHeadMapType[]={ + STRING_OBJDATA_MT_01, + STRING_OBJDATA_MT_02, + STRING_OBJDATA_MT_03, + STRING_OBJDATA_MT_04 +}; + +LPTSTR smbMapHeadView[]={ + STRING_OBJDATA_V_01, + STRING_OBJDATA_V_02, + STRING_OBJDATA_V_03, + STRING_OBJDATA_V_04 +}; + +SMBBADGUYSINFO smbBudGuysInfo[]={ + STRING_OBJDATA_BADGUYS_01, -1, 0x00, 0, + STRING_OBJDATA_BADGUYS_02, -1, 0x00, 0, + STRING_OBJDATA_BADGUYS_03, -1, 0x00, 0, + STRING_OBJDATA_BADGUYS_04, -1, 0x00, 0, + STRING_OBJDATA_BADGUYS_05, -1, 0x00, 0, + STRING_OBJDATA_BADGUYS_06, -1, 0x00, 0, + STRING_OBJDATA_BADGUYS_07, -1, 0x00, 0, + STRING_OBJDATA_BADGUYS_08, -1, 0x00, 0, + STRING_OBJDATA_BADGUYS_09, -1, 0x00, 0, + STRING_OBJDATA_BADGUYS_10, -1, 0x00, 0, + STRING_OBJDATA_BADGUYS_11, -1, 0x00, 0, + STRING_OBJDATA_BADGUYS_12, -1, 0x00, 0, + STRING_OBJDATA_BADGUYS_13, -1, 0x00, 0, + STRING_OBJDATA_BADGUYS_14, -1, 0x00, 0, + STRING_OBJDATA_BADGUYS_15, -1, 0x00, 0, + STRING_OBJDATA_BADGUYS_16, -1, 0x00, 0, + STRING_OBJDATA_BADGUYS_17, -1, 0x00, 0, + STRING_OBJDATA_BADGUYS_18, -1, 0x00, 0, + STRING_OBJDATA_BADGUYS_19, -1, 0x00, 0, + STRING_OBJDATA_BADGUYS_20, -1, 0x00, 0, + STRING_OBJDATA_BADGUYS_21, 0, 0x00, 0, + STRING_OBJDATA_BADGUYS_22, 0, 0x00, 0, + STRING_OBJDATA_BADGUYS_23, 0, 0x00, 0, + STRING_OBJDATA_BADGUYS_24, 0, 0x00, 0, + STRING_OBJDATA_BADGUYS_25, 0, 0x00, 0, + STRING_OBJDATA_BADGUYS_25, 0, 0x00, 0, + STRING_OBJDATA_BADGUYS_25, 0, 0x00, 0, + STRING_OBJDATA_BADGUYS_28, -2, 0x00, 0, + STRING_OBJDATA_BADGUYS_29, -2, 0x00, 0, + STRING_OBJDATA_BADGUYS_30, -2, 0x00, 0, + STRING_OBJDATA_BADGUYS_31, -2, 0x00, 0, + STRING_OBJDATA_BADGUYS_32, -2, 0x00, 0, + STRING_OBJDATA_BADGUYS_33, -2, 0x00, 0, + STRING_OBJDATA_BADGUYS_33, -2, 0x00, 0, + STRING_OBJDATA_BADGUYS_33, -2, 0x00, 0, + STRING_OBJDATA_BADGUYS_25, 0, 0x00, 0, + STRING_OBJDATA_BADGUYS_37, -2, 0x00, 0, + STRING_OBJDATA_BADGUYS_38, -2, 0x00, 0, + STRING_OBJDATA_BADGUYS_39, -2, 0x00, 1, + STRING_OBJDATA_BADGUYS_40, -2, 0x00, 1, + STRING_OBJDATA_BADGUYS_41, -2, 0x00, 0, + STRING_OBJDATA_BADGUYS_42, -2, 0x00, 0, + STRING_OBJDATA_BADGUYS_43, -2, 0x00, 0, + STRING_OBJDATA_BADGUYS_44, -2, 0x00, 1, + STRING_OBJDATA_BADGUYS_45, -2, 0x00, 1, + STRING_OBJDATA_BADGUYS_46, -1, 0x00, 0, + STRING_OBJDATA_BADGUYS_47, -1, 0x00, 0, + STRING_OBJDATA_BADGUYS_48, -1, 0x00, 0, + STRING_OBJDATA_BADGUYS_25, 0, 0x00, 0, + STRING_OBJDATA_BADGUYS_25, 0, 0x00, 0, + STRING_OBJDATA_BADGUYS_51, -1, 0x00, 0, + STRING_OBJDATA_BADGUYS_25, 0, 0x00, 0, + STRING_OBJDATA_BADGUYS_53, -1, 0x00, 0, + STRING_OBJDATA_BADGUYS_54, 0, 0x09, 0, + STRING_OBJDATA_BADGUYS_23, 0, 0x00, 0, + STRING_OBJDATA_BADGUYS_56, 0, 0x0A, -3, + STRING_OBJDATA_BADGUYS_57, 0, 0x0A, -3, + STRING_OBJDATA_BADGUYS_58, 0, 0x06, -3, + STRING_OBJDATA_BADGUYS_59, 0, 0x06, -3, + STRING_OBJDATA_BADGUYS_60, 0, 0x0A, -3, + STRING_OBJDATA_BADGUYS_61, 0, 0x0A, -3, + STRING_OBJDATA_BADGUYS_62, 0, 0x06, -3, + STRING_OBJDATA_BADGUYS_63, 0, 0x06, -3, + STRING_OBJDATA_BADGUYS_25, 0, 0x00, 0 +}; \ No newline at end of file diff --git a/src/objeditcom.c b/src/objeditcom.c new file mode 100644 index 0000000..53d198f --- /dev/null +++ b/src/objeditcom.c @@ -0,0 +1,701 @@ +/************************************************************************************ + + smb Utility + + File: objeditcom.c + Description: + History: + + ************************************************************************************/ +#include "smbutil.h" +#include "roommng.h" +#include "objmng.h" +#include "objlib.h" +#include "objview.h" +#include "objlist.h" +#include "objeditcom.h" +#include "ini.h" + +/*********************** + + キーボード入力ハンドラ + +************************/ +static int SetDataNextPageBadGuys(int iItem) +{ + //移動するデータ + BYTE bBuf[3]; + int iBufSize; + BOOL blIsPage; + // + BYTE *pbBuf; + // + BYTE *pbPrev; + // + OBJECTSEEKINFO ObjSeek,ObjSeekTmp; + BYTE bNextPageXPos; + int iMaxIndex; + DWORD dwPrevPageRelated = PAGEOBJECT_NO; + + if(!BadGuysSeekFirst(&ObjSeek,GETADDRESS_CURRENT_EDITTING)) return iItem; + for(;;){ + if(ObjSeek.dwIndex==(DWORD)iItem) break; + dwPrevPageRelated = BadGuysIsPageRelatedObject(ObjSeek.pbData); + if(!BadGuysSeekNext(&ObjSeek)) return INVALID_OBJECT_INDEX; + } + // + pbPrev=pbBuf=ObjSeek.pbData; + iBufSize = ObjSeek.dwObjLen; + memcpy(bBuf,ObjSeek.pbData,iBufSize); + blIsPage=(bBuf[1]&0x80)?TRUE:FALSE; + + //Check if this page is last one.if so return. + memcpy(&ObjSeekTmp,&ObjSeek,sizeof(OBJECTSEEKINFO)); + for(iMaxIndex=iItem;;iMaxIndex++){ + if(ObjSeekTmp.dwPage!=ObjSeek.dwPage) break; + if(!BadGuysSeekNext(&ObjSeekTmp)) return INVALID_OBJECT_INDEX; + } + + if(!BadGuysSeekNext(&ObjSeek)) return INVALID_OBJECT_INDEX; + iItem++; + + //移動するデータが改ページフラグを持っていて、かつ次のデータがページを構成する + //オブジェクトである場合か、以下のような並びの(*)のオブジェクト + // ページ送りコマンド + // (改ページフラグあり・なしの両方の)横位置15のオブジェクト…(*) + //は、移動させない。 + { + BOOL blSetPage = (dwPrevPageRelated == PAGEOBJECT_SETPAGE); + BOOL blNextPageRelated = ((ObjSeek.pbData[1]&0x80)||((ObjSeek.pbData[0]&0x0f)==0x0F)); + if( (blIsPage && blNextPageRelated) + || (blIsPage && blSetPage) + || (blSetPage && blNextPageRelated)) + return INVALID_OBJECT_INDEX; + } + // 同じ横位置15にあるオブジェクトをとばす。 + // データが変更されるため、BadGuysSeek()関数は、使えないことに注意 + for(;iItem<=iMaxIndex;iItem++) + { + BYTE bTmp[3]; + int iTmpSize; + // コピーを保存しておく + iTmpSize=((ObjSeek.pbData[0]&0x0F)==0x0E)?3:2; + memcpy(bTmp,ObjSeek.pbData,iTmpSize); + // データを移動 + memcpy(pbPrev,bTmp,iTmpSize); + pbPrev+=iTmpSize; + // + if(bTmp[1]&0x80){ + bNextPageXPos=0; + break; + } + else if((bTmp[0]&0x0f)==0x0F){ + bNextPageXPos=(bTmp[0]&0xF0); + break; + } + // + ObjSeek.pbData+=iTmpSize; + } + + //移動したデータにページフラッグがある場合 + if(blIsPage) + pbBuf[1]|=0x80; + + // + bBuf[0]&=0x0F; + bBuf[0]|=bNextPageXPos; + bBuf[1]&=0x7F; + memcpy(pbPrev,bBuf,iBufSize); + + return iItem; +} + +static int SetDataPrevPageBadGuys(int iItem) +{ + BYTE bBuf[3]; + int iBufSize; + BYTE *pbBuf; + BYTE *pbPageTop; + int n=0; + BOOL blIsPage;//移動するデータ + OBJECTSEEKINFO ObjSeek; + DWORD dwPrevPageRelated = PAGEOBJECT_NO; + + if(!BadGuysSeekFirst(&ObjSeek,GETADDRESS_CURRENT_EDITTING)) + return INVALID_OBJECT_INDEX; + for(;;){ + + if(ObjSeek.dwIndex==(DWORD)iItem){ + if(!ObjSeek.dwPage) + return INVALID_OBJECT_INDEX; + break; + } + + if( ((ObjSeek.pbData[0]&0x0F)==0x0F) + || (ObjSeek.pbData[1]&0x80) ) + { + pbPageTop=ObjSeek.pbData; + n=0; + } + + dwPrevPageRelated = BadGuysIsPageRelatedObject(ObjSeek.pbData); + + if(!BadGuysSeekNext(&ObjSeek)) + return INVALID_OBJECT_INDEX; + + n--; + + } + + pbBuf = ObjSeek.pbData; + iBufSize = ObjSeek.dwObjLen; + memcpy(bBuf,ObjSeek.pbData,iBufSize); + blIsPage=(bBuf[1]&0x80)?TRUE:FALSE; + +// if(!(bBuf[1]&0x80) && iItem==0) return INVALID_OBJECT_INDEX; + if(!BadGuysSeekNext(&ObjSeek)) return INVALID_OBJECT_INDEX; + + // 移動するデータが改ページフラグを持っていて、かつ次のデータが改ページフラグを持っ + // ている場合すなわち、そのデータが1ページに1つしかない + //以下のような並びの(*)のオブジェクト + // ページ送りコマンド + // 改ページフラグなしの横位置15のオブジェクト…(*) + // 改ページフラグを持ったオブジェクト + //は、移動させない。 + if(blIsPage || dwPrevPageRelated == PAGEOBJECT_SETPAGE){ + if( (ObjSeek.pbData[1]&0x80) + || ((ObjSeek.pbData[0]&0x0f)==0x0F) ) + return INVALID_OBJECT_INDEX; + } + + // 移動するデータ自身が改ページフラグを持っている場合、 + // 次のデータに改ページフラグを移動する + if(blIsPage){ + ObjSeek.pbData[1]|=0x80; + + bBuf[0]|=0xF0; + bBuf[1]&=0x7F; + memcpy(pbBuf,bBuf,iBufSize); + //インデックスの変更なし + n=0; + } + else{ + memmove(pbPageTop+iBufSize,pbPageTop,pbBuf-pbPageTop); + bBuf[0]|=0xF0; + memcpy(pbPageTop,bBuf,iBufSize); + } + + return (iItem+n); +} + +static int SetObjIndexBadGuys(int iItem,BOOL fPlus) +{ + OBJECTSEEKINFO ObjSeek; + + if(!fPlus) + iItem--; + else + iItem++; + + if(iItem<0) + return INVALID_OBJECT_INDEX; + + if(!BadGuysSeekFirst(&ObjSeek,GETADDRESS_CURRENT_EDITTING)) + return INVALID_OBJECT_INDEX; + for(;;){ + if(ObjSeek.dwIndex==(DWORD)iItem){ + break; + } + if(!BadGuysSeekNext(&ObjSeek)) + return INVALID_OBJECT_INDEX; + } + + SetSelectedItem(iItem,FALSE); + + return iItem; +} + + +//戻り値 リストボックスの更新が必要な場合、TRUE, さもなければ、FALSE +static BOOL BadGuysKeyInput(int iItem,int iVKey) +{ + BYTE bBuf[3]; + BOOL bRet=FALSE; + + if(-1==GetBadGuysData(GETADDRESS_CURRENT_EDITTING,iItem,bBuf,NULL)) return FALSE; + switch(iVKey) + { + case IDM_EDITCOMMAND_DOWN: + if(bBuf[0]==0xFF) break; + if((bBuf[0]&0x0F)!=0x0F){ + bBuf[0]++; + if(SetBadGuysData(GETADDRESS_CURRENT_EDITTING,iItem,bBuf)) + bRet=TRUE; + } + break; + case IDM_EDITCOMMAND_UP: + if(bBuf[0]==0xFF) break; + if((bBuf[0]&0x0F)!=0x00){ + bBuf[0]--; + if(SetBadGuysData(GETADDRESS_CURRENT_EDITTING,iItem,bBuf)) + bRet=TRUE; + } + break; + case IDM_EDITCOMMAND_RIGHT: + if((bBuf[0]&0xF0)!=0xF0) + { + bBuf[0]+=0x10; + if(bBuf[0]==0xFF) break; + SetBadGuysData(GETADDRESS_CURRENT_EDITTING,iItem,bBuf); + bRet=TRUE; + } + else if((bBuf[0]&0xF0)==0xF0)//次のページへ + { + int iCurIndex; + int iPage; + BYTE bTmp[3]; + + iCurIndex=SetDataNextPageBadGuys(iItem); + if(iCurIndex!=INVALID_OBJECT_INDEX){ + SortByPosXBadGuys(GETADDRESS_CURRENT_EDITTING,&iCurIndex,FALSE); + SetSelectedItem(iCurIndex,TRUE);//giSelectedItem=iCurIndex; + //ページ、カーソルの更新 + GetBadGuysData(GETADDRESS_CURRENT_EDITTING,GetSelectedIndex(),bTmp,&iPage); + SetMapViewCursoleBadGuys(bTmp,iPage); + bRet=TRUE; + } + } + break; + case IDM_EDITCOMMAND_LEFT: + if((bBuf[0]&0xF0)!=0x00) + { + bBuf[0]-=0x10; + if(bBuf[0]==0xFF) break; + SetBadGuysData(GETADDRESS_CURRENT_EDITTING,iItem,bBuf); + bRet=TRUE; + } + else if((bBuf[0]&0xF0)==0x00)//前のページへ + { + int iCurIndex; + int iPage; + BYTE bTmp[3]; + + if((bBuf[0]|0xF0)==0xFF) break; + iCurIndex=SetDataPrevPageBadGuys(iItem); + if(iCurIndex!=INVALID_OBJECT_INDEX){ + SortByPosXBadGuys(GETADDRESS_CURRENT_EDITTING,&iCurIndex,FALSE); + SetSelectedItem(iCurIndex,TRUE);//giSelectedItem=iCurIndex; + + //ページ、カーソルの更新 + GetBadGuysData(GETADDRESS_CURRENT_EDITTING,GetSelectedIndex(),bTmp,&iPage); + SetMapViewCursoleBadGuys(bTmp,iPage); + bRet=TRUE; + } + } + break; + case IDM_EDITCOMMAND_ADD1TOTYPE: + if((bBuf[1]&0x3F)!=0x3F) bBuf[1]++; + SetBadGuysData(GETADDRESS_CURRENT_EDITTING,iItem,bBuf); + bRet=TRUE; + break; + case IDM_EDITCOMMAND_DEC1TOTYPE: + if((bBuf[1]&0x3F)!=0x00) bBuf[1]--; + SetBadGuysData(GETADDRESS_CURRENT_EDITTING,iItem,bBuf); + bRet=TRUE; + break; + case IDM_EDITCOMMAND_ADD16TOTYPE: + if((bBuf[1]&0x3F)<=0x2F) + bBuf[1]+=0x10; + else + bBuf[1]|=0x3F; + SetBadGuysData(GETADDRESS_CURRENT_EDITTING,iItem,bBuf); + bRet=TRUE; + break; + case IDM_EDITCOMMAND_DEC16TOTYPE: + if((bBuf[1]&0x3F)>=0x10) + bBuf[1]-=0x10; + else + bBuf[1]&=0xC0; + SetBadGuysData(GETADDRESS_CURRENT_EDITTING,iItem,bBuf); + bRet=TRUE; + break; + case IDM_EDITCOMMAND_REWPAGE: + { + int iPage; + BYTE bBuf[3]; + int iNewIndex; + + GetBadGuysData(GETADDRESS_CURRENT_EDITTING,GetSelectedIndex(),NULL,&iPage); + iNewIndex=GetBadGuysDataIndex(GETADDRESS_CURRENT_EDITTING,NULL,iPage-1,TRUE); + if(iNewIndex!=-1) SetSelectedItem(iNewIndex,TRUE);//giSelectedItem=iNewIndex; + + bRet=TRUE; + + //カーソルの更新 + GetBadGuysData(GETADDRESS_CURRENT_EDITTING,GetSelectedIndex(),bBuf,&iPage); + SetMapViewCursoleBadGuys(bBuf,iPage); + + } + break; + case IDM_EDITCOMMAND_FWDPAGE: + { + int iPage; + BYTE bBuf[3]; + int iNewIndex; + + GetBadGuysData(GETADDRESS_CURRENT_EDITTING,GetSelectedIndex(),NULL,&iPage); + iNewIndex=GetBadGuysDataIndex(GETADDRESS_CURRENT_EDITTING,NULL,iPage+1,FALSE); + if(iNewIndex!=-1) SetSelectedItem(iNewIndex,TRUE);//giSelectedItem=iNewIndex; + bRet=TRUE; + + //カーソルの更新 + GetBadGuysData(GETADDRESS_CURRENT_EDITTING,GetSelectedIndex(),bBuf,&iPage); + SetMapViewCursoleBadGuys(bBuf,iPage); + } + break; + case IDM_EDITCOMMAND_NEXTOBJ: + case IDM_EDITCOMMAND_PREVOBJ: + { + int iNewIndex; + BOOL blPlus; + + blPlus = (iVKey == IDM_EDITCOMMAND_NEXTOBJ) ? TRUE : FALSE; + + if( (iNewIndex = SetObjIndexBadGuys(iItem,blPlus)) + != INVALID_OBJECT_INDEX) + { + int iPage; + BYTE bBuf[3]; + // + bRet = TRUE; + // カーソルの更新 + GetBadGuysData(GETADDRESS_CURRENT_EDITTING,GetSelectedIndex(),bBuf,&iPage); + SetMapViewCursoleBadGuys(bBuf,iPage); + } + } + break; + } + + return bRet; +} + +static int SetObjIndexMap(int iItem,BOOL fPlus) +{ + OBJECTSEEKINFO ObjSeek; + + if(!fPlus) + iItem--; + else + iItem++; + + if(iItem<0) + return INVALID_OBJECT_INDEX; + + if(!MapSeekFirst(&ObjSeek,GETADDRESS_CURRENT_EDITTING)) + return INVALID_OBJECT_INDEX; + for(;;){ + if(ObjSeek.dwIndex==(DWORD)iItem){ + break; + } + if(!MapSeekNext(&ObjSeek)) + return INVALID_OBJECT_INDEX; + } + + SetSelectedItem(iItem,FALSE); + + return iItem; +} + +BOOL MapKeyInput(int iItem,int iVKey) +{ + BYTE bBuf[2]; + BOOL bRet=FALSE; + + if(-1==GetMapData(GETADDRESS_CURRENT_EDITTING,iItem,bBuf,NULL)) return FALSE; + switch(iVKey) + { + case IDM_EDITCOMMAND_DOWN: + if(bBuf[0]==0xFD) break; + if((bBuf[0]&0x0F)!=0x0F){ + bBuf[0]++; + if(SetMapData(GETADDRESS_CURRENT_EDITTING,iItem,bBuf)) + bRet=TRUE; + } + break; + case IDM_EDITCOMMAND_UP: + if(bBuf[0]==0xFD) break; + if((bBuf[0]&0x0F)!=0x00){ + bBuf[0]--; + if(SetMapData(GETADDRESS_CURRENT_EDITTING,iItem,bBuf)) + bRet=TRUE; + } + break; + case IDM_EDITCOMMAND_RIGHT: + if((bBuf[0]&0xF0)!=0xF0) + { + bBuf[0]+=0x10; + if(bBuf[0]==0xFD) break; + if(SetMapData(GETADDRESS_CURRENT_EDITTING,iItem,bBuf)) + bRet=TRUE; + } + else if((bBuf[0]&0xF0)==0xF0)//次のページへ + { + /* + bBuf … 移動するデータ + */ + BYTE bTmp[3]={0}; + BYTE bNextPageXPos; + int n=0; + int i; + BOOL blIsPage;//移動するデータ + + blIsPage=(bBuf[1]&0x80)?TRUE:FALSE; + + if(blIsPage)//移動するデータが改ページフラグを持っていて、かつ次のデータが改ページフラグを持っている場合すなわち、1ページに1つしかデータがない場合移動させない + { + if(-1==GetMapData(GETADDRESS_CURRENT_EDITTING,iItem+1,bTmp,NULL)) break; + if((bTmp[1]&0x80)||((bTmp[0]&0x0f)==0x0D) && ((bTmp[1]&0x40)==0x00)) goto CANCELNEXT; + } + + for(i=1;;i++) + { + BYTE bData[2]; + + if(-1==GetMapData(GETADDRESS_CURRENT_EDITTING,iItem+i,bData,NULL)) + goto CANCELNEXT; + if(bData[0]==0xFD) + goto CANCELNEXT; + if((bData[1]&0x80)||((bData[0]&0x0f)==0x0D) && ((bData[1]&0x40)==0x00)) + break; + } + + for(n=1;;n++) + { + if(-1==GetMapData(GETADDRESS_CURRENT_EDITTING,iItem+n,bTmp,NULL)) break; + if(bTmp[0]==0xFD) goto CANCELNEXT; + SetMapData(GETADDRESS_CURRENT_EDITTING,iItem+n-1,bTmp); + if((bTmp[1]&0x80)){ + bNextPageXPos=0; + break; + } + else if(((bTmp[0]&0x0f)==0x0D) && ((bTmp[1]&0x40)==0x00)){ + bNextPageXPos=(bTmp[0]&0xF0); + break; + } + } + + if(blIsPage)//移動するデータが改ページフラグを持ってい場合 + { + GetMapData(GETADDRESS_CURRENT_EDITTING,iItem,bTmp,NULL); + bTmp[1]|=0x80; + SetMapData(GETADDRESS_CURRENT_EDITTING,iItem,bTmp); + } + + bBuf[0]&=0x0F; + bBuf[0]|=bNextPageXPos; + bBuf[1]&=0x7F; + + SetMapData(GETADDRESS_CURRENT_EDITTING,iItem+n,bBuf); + + bRet=TRUE; + } +CANCELNEXT: + break; + case IDM_EDITCOMMAND_LEFT: + if((bBuf[0]&0xF0)!=0x00) + { + bBuf[0]-=0x10; + if(bBuf[0]==0xFD) break; + if(SetMapData(GETADDRESS_CURRENT_EDITTING,iItem,bBuf)) + bRet=TRUE; + } + else if((bBuf[0]&0xF0)==0x00)//前のページへ + { + BYTE bTmp[2]={0}; + int n=0; + int iPage; + + if((bBuf[0]|0xF0)==0xFD) break; + + //もし、0ページののデータならキャンセル + GetMapData(GETADDRESS_CURRENT_EDITTING,iItem,NULL,&iPage); + if(iPage==0) break; + + if(bBuf[1]&0x80)//移動するデータが改ページフラグを持っていて、かつ次のデータが改ページフラグを持っている場合すなわち、1ページに1つしかデータがない場合移動させない + { + if(-1!=GetMapData(GETADDRESS_CURRENT_EDITTING,iItem+1,bTmp,NULL)){ + if((bTmp[1]&0x80)||((bTmp[0]&0x0f)==0x0D) && ((bTmp[1]&0x40)==0x00)) + goto CANCELPREV; + } + } + + if(bBuf[1]&0x80) + { + GetMapData(GETADDRESS_CURRENT_EDITTING,iItem+1,bTmp,NULL); + bTmp[1]|=0x80; + SetMapData(GETADDRESS_CURRENT_EDITTING,iItem+1,bTmp); + + bBuf[0]|=0xF0; + bBuf[1]&=0x7F; + SetMapData(GETADDRESS_CURRENT_EDITTING,iItem,bBuf); + } + else + { + for(;;) + { + n--; + if(iItem+n<0) goto CANCELPREV; + GetMapData(GETADDRESS_CURRENT_EDITTING,iItem+n,bTmp,NULL); + if(bTmp[0]==0xFD) goto CANCELPREV; + SetMapData(GETADDRESS_CURRENT_EDITTING,iItem+n+1,bTmp); + if((bTmp[1]&0x80)||((bTmp[0]&0x0f)==0x0D) && ((bTmp[1]&0x40)==0x00)) break; + } + bBuf[0]|=0xF0; + SetMapData(GETADDRESS_CURRENT_EDITTING,iItem+n,bBuf); + } + bRet=TRUE; + } + +CANCELPREV: + break; + case IDM_EDITCOMMAND_ADD1TOTYPE: + if((bBuf[1]&0x7F)!=0x7F) bBuf[1]++; + SetMapData(GETADDRESS_CURRENT_EDITTING,iItem,bBuf); + bRet=TRUE; + break; +// case VK_SUBTRACT: +// case 'Q': + case IDM_EDITCOMMAND_DEC1TOTYPE: + if((bBuf[1]&0x7F)!=0x00) bBuf[1]--; + SetMapData(GETADDRESS_CURRENT_EDITTING,iItem,bBuf); + bRet=TRUE; + break; + case IDM_EDITCOMMAND_ADD16TOTYPE: + if((bBuf[1]&0x7F)<=0x6F) + bBuf[1]+=0x10; + else + bBuf[1]|=0x7F; + SetMapData(GETADDRESS_CURRENT_EDITTING,iItem,bBuf); + bRet=TRUE; + break; + case IDM_EDITCOMMAND_DEC16TOTYPE: + if((bBuf[1]&0x7F)>=0x10) + bBuf[1]-=0x10; + else + bBuf[1]&=0x80; + SetMapData(GETADDRESS_CURRENT_EDITTING,iItem,bBuf); + bRet=TRUE; + break; + /* + case VK_NUMPAD0: + if(bBuf[1]&0x80) bBuf[1]&=0x7F; + else bBuf[1]|=0x80; + SetMapData(iItem,bBuf); + bRet=TRUE; + break; + */ + case IDM_EDITCOMMAND_REWPAGE: + { + int iPage; + BYTE bBuf[2]; + int iNewIndex; + GetMapData(GETADDRESS_CURRENT_EDITTING,GetSelectedIndex(),NULL,&iPage); + iNewIndex=GetMapDataIndex(GETADDRESS_CURRENT_EDITTING,NULL,iPage-1,TRUE); + if(iNewIndex!=-1) SetSelectedItem(iNewIndex,TRUE);//giSelectedItem=iNewIndex; + bRet=TRUE; + + //カーソルの更新 + GetMapData(GETADDRESS_CURRENT_EDITTING,GetSelectedIndex(),bBuf,&iPage); + SetMapViewCursoleMap(bBuf,iPage); + + } + break; + case IDM_EDITCOMMAND_FWDPAGE: + { + int iPage; + BYTE bBuf[2]; + int iNewIndex; + + GetMapData(GETADDRESS_CURRENT_EDITTING,GetSelectedIndex(),NULL,&iPage); + iNewIndex=GetMapDataIndex(GETADDRESS_CURRENT_EDITTING,NULL,iPage+1,FALSE); + if(iNewIndex!=-1) SetSelectedItem(iNewIndex,TRUE);//giSelectedItem=iNewIndex; + bRet=TRUE; + + //カーソルの更新 + GetMapData(GETADDRESS_CURRENT_EDITTING,GetSelectedIndex(),bBuf,&iPage); + SetMapViewCursoleMap(bBuf,iPage); + } + break; + case IDM_EDITCOMMAND_NEXTOBJ: + case IDM_EDITCOMMAND_PREVOBJ: + { + int iNewIndex; + BOOL blPlus; + + blPlus = (iVKey == IDM_EDITCOMMAND_NEXTOBJ) ? TRUE : FALSE; + + if( (iNewIndex = SetObjIndexMap(iItem,blPlus)) + != INVALID_OBJECT_INDEX) + { + int iPage; + BYTE bBuf[2]; + // + bRet = TRUE; + // カーソルの更新 + GetMapData(GETADDRESS_CURRENT_EDITTING,GetSelectedIndex(),bBuf,&iPage); + SetMapViewCursoleMap(bBuf,iPage); + } + } + break; + } + + return bRet; +} + +static BOOL IsUndoNeeded(int iID) +{ + if(iID==IDM_EDITCOMMAND_ADD1TOTYPE || + iID==IDM_EDITCOMMAND_DEC1TOTYPE || + iID==IDM_EDITCOMMAND_ADD16TOTYPE || + iID==IDM_EDITCOMMAND_DEC16TOTYPE || + iID==IDM_EDITCOMMAND_RIGHT || + iID==IDM_EDITCOMMAND_LEFT || + iID==IDM_EDITCOMMAND_UP || + iID==IDM_EDITCOMMAND_DOWN) + return TRUE; + return FALSE; +} + +BOOL MapEditCommand(WORD wCommand) +{ + static int iPrevEditMode=-2; + BOOL fReturn; + + if(GetMapEditMode()!=iPrevEditMode) + g_blKeyCommandUndo=TRUE; + // + if(IsUndoNeeded(wCommand) && g_blKeyCommandUndo){ + undoPrepare(UNDONAME_KEYEDIT); + g_blKeyCommandUndo=FALSE; + } + // + iPrevEditMode=GetMapEditMode(); + // + if(GetMapEditMode()){ + //敵 + if(fReturn=BadGuysKeyInput(GetSelectedIndex(),wCommand)){ + UpdateObjectList(1); + UpdateObjectView(0); + } + } + else{ + //マップ + if(fReturn=MapKeyInput(GetSelectedIndex(),wCommand)){ + UpdateObjectList(1); + UpdateObjectView(0); + } + } + + return fReturn; +} + diff --git a/src/objeditcom.h b/src/objeditcom.h new file mode 100644 index 0000000..c8255ee --- /dev/null +++ b/src/objeditcom.h @@ -0,0 +1,15 @@ +/************************************************************************************ + + smb Utility + + File: objeditcom.h + Description: + History: + + ************************************************************************************/ +#ifndef OBJEDITCOM_H +#define OBJEDITCOM_H + +BOOL MapEditCommand(WORD wCommand); + +#endif \ No newline at end of file diff --git a/src/objeditdlg.c b/src/objeditdlg.c new file mode 100644 index 0000000..3bdeb85 --- /dev/null +++ b/src/objeditdlg.c @@ -0,0 +1,820 @@ +/************************************************************************************ + + smb Utility + + File: objeditdlg.c + Description: + History: + + ************************************************************************************/ +#include "smbutil.h" +#include "roommng.h" +#include "emulator.h" +#include "emuutil.h" +#include "objlist.h" +#include "objlib.h" +#include "objview.h" +#include "objmng.h" +#include "resource.h" + +extern SMBMAPOBJECTINFO smbMapObjectInfo0B[]; +extern SMBMAPOBJECTINFO smbMapObjectInfoC[]; +extern SMBMAPOBJECTINFO smbMapObjectInfoD[]; +extern SMBMAPOBJECTINFO smbMapObjectInfoE[]; +extern SMBMAPOBJECTINFO smbMapObjectInfoF[]; +extern struct {LPSTR Name;}smbMapBasicBlock[]; +extern LPSTR smbMapHeadTime[]; +extern LPSTR smbMapHeadPosition[]; +extern LPSTR smbMapHeadBackColor[]; +extern LPSTR smbMapHeadMapType[]; +extern LPSTR smbMapHeadView[]; +extern SMBBADGUYSINFO smbBudGuysInfo[]; +extern int GetNum0BMapObject(); +extern int GetNumCMapObject(); +extern int GetNumDMapObject(); +extern int GetNumEMapObject(); +extern int GetNumFMapObject(); +/*********************** + + 敵エデイットダイアログ + +************************/ +#define BADGUYS_EDITDLG_NOPREVIEWSIZE 420 +#define BADGUYS_EDITDLG_HASPREVIEWSIZE 625 + +#define DISABLE_2BYTES 0 +#define DISABLE_3BYTES 1 +static void DisableBadguysEditDlgControls(HWND hDlg,int iDisableFlag) +{ + int n; + + if(iDisableFlag==DISABLE_2BYTES) + { + int iCtrlID[]={IDC_XPOS,IDC_YPOS,IDC_PAGEFLAG,IDC_BIT6,IDC_TYPE,IDC_ISPAGECOMMAND,IDC_PAGEEDIT,IDC_STATIC_XPOS1,IDC_STATIC_YPOS,IDC_STATIC_TYPE,IDC_STATIC_OBJECT}; + int iEditCtrlID[]={IDC_XPOS,IDC_YPOS,IDC_PAGEEDIT}; + + for(n=0;n<(sizeof(iEditCtrlID)/sizeof(int));n++) + SetDlgItemText(hDlg,iEditCtrlID[n],""); + for(n=0;n<(sizeof(iCtrlID)/sizeof(int));n++) + EnableWindow(GetDlgItem(hDlg,iCtrlID[n]),FALSE); + } + else if(iDisableFlag==DISABLE_3BYTES) + { + int iCtrlID[]={IDC_XPOS2,IDC_DATA,IDC_PAGEEDIT2,IDC_PAGEFLAG2,IDC_WORLD,IDC_OPENPREVIEW,IDC_STATIC_ROOMMOVE,IDC_STATIC_XPOS2,IDC_STATIC_ROOM,IDC_STATIC_WORLD,IDC_STATIC_PAGE}; + int iEditCtrlID[]={IDC_XPOS2,IDC_DATA,IDC_PAGEEDIT2,IDC_WORLD}; + + for(n=0;n<(sizeof(iEditCtrlID)/sizeof(int));n++) + SetDlgItemText(hDlg,iEditCtrlID[n],""); + for(n=0;n<(sizeof(iCtrlID)/sizeof(int));n++) + EnableWindow(GetDlgItem(hDlg,iCtrlID[n]),FALSE); + } +} + +void UpdateBadguysEditDlgPreview(HWND hDlg,BOOL blGetRoomIDFromList) +{ + BYTE bRoomID; + int iPage; + BOOL blSuccess; + char cBuf[10]; + HWND hPVWnd; + HDC hPVdc; + RECT rcPV; + + if(!blGetRoomIDFromList) + { + GetDlgItemText(hDlg,IDC_DATA,cBuf,10); + if(1!=sscanf(cBuf,"%x",&bRoomID)) return; + } + else + { + int iSel; + BYTE bID[SMB_NUM_ADDRESSDATA]; + + GetValidRoomIDs(bID); + iSel=SendDlgItemMessage(hDlg,IDC_DATA,CB_GETCURSEL,0,0); + if(iSel==CB_ERR) return; + bRoomID=bID[iSel]; + } + + if(!IsRoomIDValid(bRoomID)) return; + + iPage=GetDlgItemInt(hDlg,IDC_PAGEEDIT2,&blSuccess,FALSE); + if(!blSuccess) return; + + hPVWnd=GetDlgItem(hDlg,IDC_VIEW); + GetClientRect(hPVWnd,&rcPV); + hPVdc=GetDC(hPVWnd); + if(hPVdc) + { + if(RunEmulatorViewPage(bRoomID,iPage)) + TransferFromEmuBackBuffer(hPVdc,0,0,rcPV.right-rcPV.left,rcPV.bottom-rcPV.top,TRUE); + else + FillRect(hPVdc,&rcPV,GetSysColorBrush(COLOR_3DFACE)); + ReleaseDC(hPVWnd,hPVdc); + } + ClearEmuBackBuffer(); +} + +LRESULT CALLBACK BadGuysComEditDlgProc( HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam) +{ + static BOOL blIs3BytesObj; + switch (message) + { + case WM_INITDIALOG: + { + int n,iPage,iOfs; + BYTE bBuf[3]; + char cOfs[10]; + RECT rcDlg; + + iOfs=GetBadGuysData(GETADDRESS_CURRENT_EDITTING,GetSelectedIndex(),bBuf,&iPage); + if(iOfs==-1){ + EndDialog(hDlg, TRUE); + return TRUE; + } + + //Resize Window + GetWindowRect(hDlg,&rcDlg); + MoveWindow(hDlg,rcDlg.left,rcDlg.top,BADGUYS_EDITDLG_NOPREVIEWSIZE,rcDlg.bottom-rcDlg.top,TRUE); + + for(n=0;n<64;n++) + SendDlgItemMessage(hDlg,IDC_TYPE,CB_ADDSTRING,0,(LPARAM)smbBudGuysInfo[n].Name); + SendDlgItemMessage(hDlg,IDC_XPOSSPIN,UDM_SETRANGE,0,MAKEWPARAM(15,0)); + + SendDlgItemMessage(hDlg,IDC_PAGEEDITSPIN,UDM_SETRANGE,0,MAKEWPARAM(0x3F,0)); + + sprintf(cOfs,"%.2XH",iOfs); + SetDlgItemText(hDlg,IDC_OFFSET,cOfs); + + //page + SetDlgItemInt(hDlg,IDC_PAGE,iPage,FALSE); + if((bBuf[0]&0x0F)==0x0E) + { + BYTE bRoomIDs[SMB_NUM_ADDRESSDATA]; + char cBuf[20]; + int n; + + //ワールドの範囲 + SendDlgItemMessage(hDlg,IDC_WORLDSPIN,UDM_SETRANGE,0,MAKEWPARAM(8,1)); + //ページの範囲 + SendDlgItemMessage(hDlg,IDC_PAGEEDIT2SPIN,UDM_SETRANGE,0,MAKEWPARAM(0x1F,0)); + //ページの範囲 + SendDlgItemMessage(hDlg,IDC_XPOS2SPIN,UDM_SETRANGE,0,MAKEWPARAM(0xF,0)); + + sprintf(cBuf,"%.2x %.2x %.2x",bBuf[0],bBuf[1],bBuf[2]); + SetDlgItemText(hDlg,IDC_BIN,cBuf); + CheckDlgButton(hDlg,IDC_ISBIN,BST_UNCHECKED); + + //XPos + SetDlgItemInt(hDlg,IDC_XPOS2,(bBuf[0]>>4)&0x0F,TRUE); + //World + SetDlgItemInt(hDlg,IDC_WORLD,((bBuf[2]>>5)&0x07)+1,TRUE); + //Page + SetDlgItemInt(hDlg,IDC_PAGEEDIT2,bBuf[2]&0x1F,TRUE); + //Room ID + sprintf(cBuf,"%.2x",bBuf[1]&0x7F); + SetDlgItemText(hDlg,IDC_DATA,cBuf); + GetValidRoomIDs(&bRoomIDs[0]); + for(n=0;n>4)&0x0F,TRUE); + // + //Page data + SetDlgItemInt(hDlg,IDC_PAGEEDIT,(int)bBuf[1] & 0x3F,FALSE); + + CheckDlgButton(hDlg,IDC_ISPAGECOMMAND,BST_CHECKED); + //bin + sprintf(cBuf,"%.2x %.2x",bBuf[0],bBuf[1]); + SetDlgItemText(hDlg,IDC_BIN,cBuf); + CheckDlgButton(hDlg,IDC_ISBIN,BST_UNCHECKED); + + blIs3BytesObj=FALSE; + DisableBadguysEditDlgControls(hDlg,DISABLE_3BYTES); + // 一応なにか選択しておく + SendDlgItemMessage(hDlg,IDC_TYPE,CB_SETCURSEL,0,0); + // 関係のない要素を無効化 + EnableWindow(GetDlgItem(hDlg,IDC_TYPE), FALSE); + EnableWindow(GetDlgItem(hDlg,IDC_BIT6), FALSE); + + return TRUE; + } + else + { + char cBuf[10]; + + SetDlgItemInt(hDlg, IDC_XPOS, GetBadGuysXPos(bBuf), TRUE); + SetDlgItemInt(hDlg, IDC_YPOS, GetBadGuysYPos(bBuf), TRUE); + SendDlgItemMessage(hDlg,IDC_TYPE,CB_SETCURSEL,bBuf[1]&0x3F,0); + sprintf(cBuf,"%.2x %.2x",bBuf[0],bBuf[1]); + SetDlgItemText(hDlg,IDC_BIN,cBuf); + CheckDlgButton(hDlg,IDC_ISBIN,BST_UNCHECKED); + if(bBuf[1]&0x40) CheckDlgButton(hDlg,IDC_BIT6,BST_CHECKED); + if(bBuf[1]&0x80) CheckDlgButton(hDlg,IDC_PAGEFLAG,BST_CHECKED); + //y位置の範囲の設定 + SendDlgItemMessage(hDlg,IDC_YPOSSPIN,UDM_SETRANGE,0,MAKEWPARAM(-1,13+smbBudGuysInfo[bBuf[1]&0x3F].YDelta)); + //x位置の範囲の設定 + SendDlgItemMessage(hDlg,IDC_XPOSSPIN,UDM_SETRANGE,0,MAKEWPARAM(15+smbBudGuysInfo[bBuf[1]&0x3F].XDelta,smbBudGuysInfo[bBuf[1]&0x3F].XDelta)); + + blIs3BytesObj=FALSE; + DisableBadguysEditDlgControls(hDlg,DISABLE_3BYTES); + EnableWindow(GetDlgItem(hDlg,IDC_PAGEEDIT), FALSE); + return TRUE; + } + } + case WM_PAINT: + if(BST_UNCHECKED==IsDlgButtonChecked(hDlg,IDC_OPENPREVIEW)) break; + UpdateBadguysEditDlgPreview(hDlg,FALSE); + break; + case WM_COMMAND: + switch(LOWORD(wParam)) + { + case IDOK: + { + if(IsDlgButtonChecked(hDlg,IDC_ISBIN)&BST_CHECKED) + { + char cBuf[20]; + BYTE bBuf[4]; + int iSize; + //バイナリデータの取得 + GetDlgItemText(hDlg,IDC_BIN,cBuf,20); + iSize=sscanf(cBuf,"%x %x %x %x",&bBuf[0],&bBuf[1],&bBuf[2],&bBuf[3]); + if(iSize<1 || iSize>4) return TRUE; + + undoPrepare(UNDONAME_DLGEDIT); + SetBadGuysDataBinary(GETADDRESS_CURRENT_EDITTING,GetSelectedIndex(),bBuf,iSize); + } + else if(!blIs3BytesObj) + { + BOOL blSuccess; + BYTE bBuf[2]; +// TCHAR cBuf[20]; + UINT uRet; + BYTE bTmp; + BYTE bType; + + memset(bBuf,0,2); + if(IsDlgButtonChecked(hDlg,IDC_ISPAGECOMMAND)==BST_CHECKED) + { + // + bBuf[0] |= 0x0F; + // + uRet = GetDlgItemInt(hDlg,IDC_PAGEEDIT,&blSuccess,FALSE); + if(!blSuccess || uRet > 0x3F) return TRUE; + bBuf[1] = (BYTE)uRet; + //XPOS + uRet = GetDlgItemInt(hDlg,IDC_XPOS,&blSuccess,FALSE); + if(!blSuccess) return TRUE; + bBuf[0]|=((uRet&0x0F)<<4); + // + if (IsDlgButtonChecked(hDlg,IDC_PAGEFLAG) == BST_CHECKED) + bBuf[1] |= 0x80; + //if (IsDlgButtonChecked(hDlg,IDC_BIT6) == BST_CHECKED) + // bBuf[1] |= 0x40; + } + else + { + //種類の取得 + bType=(BYTE)SendDlgItemMessage(hDlg,IDC_TYPE,CB_GETCURSEL,0,0); + bBuf[1]|=bType; + //Xの取得 + //GetDlgItemText(hDlg,IDC_XPOS,cBuf,20); + //if(1!=sscanf(cBuf,"%d",&bTmp)) return TRUE; + bTmp = GetDlgItemInt(hDlg, IDC_XPOS, &blSuccess, TRUE); + if (!blSuccess) return TRUE; + bTmp-=smbBudGuysInfo[bType].XDelta; + if(bTmp>0xF) return TRUE; + bBuf[0]|=(bTmp<<4); + //Yの取得 + //GetDlgItemText(hDlg,IDC_YPOS,cBuf,20); + //if(1!=sscanf(cBuf,"%d",&bTmp)) return TRUE; + bTmp = GetDlgItemInt(hDlg, IDC_YPOS, &blSuccess, TRUE); + if (!blSuccess) return TRUE; + bTmp+=abs(smbBudGuysInfo[bType].YDelta); + if(bTmp>0xD) return TRUE; + bBuf[0]|=(bTmp&0x0F); + //改ページフラグの取得 + if(BST_CHECKED&IsDlgButtonChecked(hDlg,IDC_PAGEFLAG)) + bBuf[1]|=0x80; + //第2バイトのビット6の取得 + if(BST_CHECKED&IsDlgButtonChecked(hDlg,IDC_BIT6)) + bBuf[1]|=0x40; + } + + undoPrepare(UNDONAME_DLGEDIT); + SetBadGuysData(GETADDRESS_CURRENT_EDITTING,GetSelectedIndex(),bBuf); + } + else + { + BYTE bBuf[3]; + TCHAR cBuf[3]; + BYTE bTmp; + BOOL blSuccess; + + memset(bBuf,0,3); + + //XPOS + bTmp=(BYTE)GetDlgItemInt(hDlg,IDC_XPOS2,&blSuccess,FALSE); + if(!blSuccess || bTmp>0x0F) return TRUE; + bBuf[0]|=((bTmp&0x0F)<<4); + //YPOS + bBuf[0]|=0x0E; + //改ページフラグ + if(BST_CHECKED==IsDlgButtonChecked(hDlg,IDC_PAGEFLAG2)) + bBuf[1]|=0x80; + // + GetDlgItemText(hDlg,IDC_DATA,cBuf,3); + if(1!=sscanf(cBuf,"%x",&bTmp)) return TRUE; + bBuf[1]|=(bTmp&0x7F); + //ワールド + bTmp=GetDlgItemInt(hDlg,IDC_WORLD,&blSuccess,FALSE); + if(!blSuccess || bTmp>8) return TRUE; + bBuf[2]|=(((bTmp-1)&0x07)<<5); + //ページ + bTmp=GetDlgItemInt(hDlg,IDC_PAGEEDIT2,&blSuccess,FALSE); + if(!blSuccess || bTmp>0x1F) return TRUE; + bBuf[2]|=(bTmp&0x1F); + + undoPrepare(UNDONAME_DLGEDIT); + + SetBadGuysData(GETADDRESS_CURRENT_EDITTING,GetSelectedIndex(),bBuf); + } + } + + UpdateObjectList(0); + UpdateObjectView(0); + ObjectListSetCursor(GetSelectedIndex()); + case IDCANCEL: + EndDialog(hDlg, TRUE); + return TRUE; + case IDC_TYPE: + { + BYTE bType; + bType=(BYTE)SendDlgItemMessage(hDlg,IDC_TYPE,CB_GETCURSEL,0,0); + if(bType!=CB_ERR) + { + //y位置の範囲の設定 + SendDlgItemMessage(hDlg,IDC_YPOSSPIN,UDM_SETRANGE,0,MAKEWPARAM(-1,13+smbBudGuysInfo[bType].YDelta)); + //x位置の範囲の設定 + SendDlgItemMessage(hDlg,IDC_XPOSSPIN,UDM_SETRANGE,0,MAKEWPARAM(15+smbBudGuysInfo[bType].XDelta,smbBudGuysInfo[bType].XDelta)); + } + if(HIWORD(wParam)==CBN_SELCHANGE) + CheckDlgButton(hDlg,IDC_ISBIN,BST_UNCHECKED); + return TRUE; + } + case IDC_BIN: + if(HIWORD(wParam)==EN_CHANGE) + CheckDlgButton(hDlg,IDC_ISBIN,BST_CHECKED); + return TRUE; + case IDC_XPOS: + case IDC_YPOS: + if(HIWORD(wParam)==EN_CHANGE) + CheckDlgButton(hDlg,IDC_ISBIN,BST_UNCHECKED); + return TRUE; + case IDC_PAGEFLAG: + case IDC_BIT6: + if(HIWORD(wParam)==BN_CLICKED) + CheckDlgButton(hDlg,IDC_ISBIN,BST_UNCHECKED); + return TRUE; + //ルーム間移動 + case IDC_DATA: + if(BST_UNCHECKED==IsDlgButtonChecked(hDlg,IDC_OPENPREVIEW)) return TRUE; + if(HIWORD(wParam)==CBN_EDITCHANGE) + UpdateBadguysEditDlgPreview(hDlg,FALSE); + else if(HIWORD(wParam)==CBN_SELCHANGE) + UpdateBadguysEditDlgPreview(hDlg,TRUE); + return TRUE; + case IDC_PAGEEDIT2: + if(HIWORD(wParam)==EN_CHANGE){ + if(BST_UNCHECKED==IsDlgButtonChecked(hDlg,IDC_OPENPREVIEW)) return TRUE; + UpdateBadguysEditDlgPreview(hDlg,FALSE); + return TRUE; + } + case IDC_OPENPREVIEW: + { + if(HIWORD(wParam)==BN_CLICKED) + { + RECT rcDlg; + + GetWindowRect(hDlg,&rcDlg); + if(BST_UNCHECKED==IsDlgButtonChecked(hDlg,IDC_OPENPREVIEW)) + MoveWindow(hDlg,rcDlg.left,rcDlg.top,BADGUYS_EDITDLG_NOPREVIEWSIZE,rcDlg.bottom-rcDlg.top,TRUE); + else if(BST_CHECKED==IsDlgButtonChecked(hDlg,IDC_OPENPREVIEW)) + { + MoveWindow(hDlg,rcDlg.left,rcDlg.top,BADGUYS_EDITDLG_HASPREVIEWSIZE,rcDlg.bottom-rcDlg.top,TRUE); + UpdateBadguysEditDlgPreview(hDlg,FALSE); + } + } + } + return TRUE; + case IDC_ISPAGECOMMAND: + { + if(BST_CHECKED == IsDlgButtonChecked(hDlg, IDC_ISPAGECOMMAND)){ + EnableWindow(GetDlgItem(hDlg,IDC_TYPE), FALSE); + EnableWindow(GetDlgItem(hDlg,IDC_BIT6), FALSE); + EnableWindow(GetDlgItem(hDlg,IDC_PAGEEDIT), TRUE); + } + else{ + EnableWindow(GetDlgItem(hDlg,IDC_TYPE), TRUE); + EnableWindow(GetDlgItem(hDlg,IDC_BIT6), TRUE); + EnableWindow(GetDlgItem(hDlg,IDC_PAGEEDIT), FALSE); + } + } + return TRUE; + } + } + return FALSE; +} + +/********************************* + + マップエディトダイアログ関数関数 + +***********************************/ + +void DisableConrols(HWND hDlg) +{ + SetDlgItemText(hDlg,IDC_LEN,""); + EnableWindow(GetDlgItem(hDlg,IDC_LEN),FALSE); + EnableWindow(GetDlgItem(hDlg,IDC_STATIC_LENGTH),FALSE); + + SendDlgItemMessage(hDlg,IDC_VIEW,CB_SETCURSEL,(WPARAM)-1,0); + EnableWindow(GetDlgItem(hDlg,IDC_VIEW),FALSE); + EnableWindow(GetDlgItem(hDlg,IDC_STATIC_VIEW),FALSE); + + SendDlgItemMessage(hDlg,IDC_FIRSTBLOCK,CB_SETCURSEL,(WPARAM)-1,0); + EnableWindow(GetDlgItem(hDlg,IDC_FIRSTBLOCK),FALSE); + EnableWindow(GetDlgItem(hDlg,IDC_STATIC_BLOCK),FALSE); + + SendDlgItemMessage(hDlg,IDC_BACKCOLOR,CB_SETCURSEL,(WPARAM)-1,0); + EnableWindow(GetDlgItem(hDlg,IDC_BACKCOLOR),FALSE); + EnableWindow(GetDlgItem(hDlg,IDC_STATIC_BACKCOLOR),FALSE); +} + +static void EnableControl(HWND hDlg,int iCtrlID) +{ + EnableWindow(GetDlgItem(hDlg,iCtrlID),TRUE); +} + +#define PREPAREDLG_MAPCOMEDIT_ALL 0 +#define PREPAREDLG_MAPCOMEDIT_YPOS 1 +#define PREPAREDLG_MAPCOMEDIT_BININPUTONLY 2 +static void PrepareMapComEditDlg(HWND hDlg,BYTE *bBuf,int iPage,int iPrepareOption) +{ + int n; + int iMaxNumObjs; + SMBMAPOBJECTINFO* psObjInfo; + + CheckDlgButton(hDlg,IDC_ISBIN,BST_UNCHECKED); + + //XPOS + SendDlgItemMessage(hDlg,IDC_XPOSSPIN,UDM_SETRANGE,0,MAKEWPARAM(15,0)); + SetDlgItemInt(hDlg,IDC_XPOS,(bBuf[0]>>4)&0x0F,FALSE); + + //PAGE FLAG + if(bBuf[1]&0x80) CheckDlgButton(hDlg,IDC_PAGEFLAG,BST_CHECKED); + + //YPOS + if(iPrepareOption!=PREPAREDLG_MAPCOMEDIT_YPOS) + { + SendDlgItemMessage(hDlg,IDC_YPOSSPIN,UDM_SETRANGE,0,MAKEWPARAM(0,15)); + SetDlgItemInt(hDlg,IDC_YPOS,bBuf[0]&0x0F,FALSE); + } + + //タイプを並べる + DisableConrols(hDlg); + switch(bBuf[0]&0x0F) + { + case 0x0C:psObjInfo=smbMapObjectInfoC;iMaxNumObjs=GetNumCMapObject();break; + case 0x0D:psObjInfo=smbMapObjectInfoD;iMaxNumObjs=GetNumDMapObject();break; + case 0x0E: + { + psObjInfo=smbMapObjectInfoE; + iMaxNumObjs=GetNumEMapObject(); + if(bBuf[1]&0x40) + { + SendDlgItemMessage(hDlg,IDC_BACKCOLOR,CB_SETCURSEL,bBuf[1]&0x07,0); + EnableControl(hDlg,IDC_BACKCOLOR); + EnableControl(hDlg,IDC_STATIC_BACKCOLOR); + } + else + { + SendDlgItemMessage(hDlg,IDC_VIEW,CB_SETCURSEL,(bBuf[1]>>4)&0x03,0); + EnableControl(hDlg,IDC_VIEW); + EnableControl(hDlg,IDC_STATIC_VIEW); + SendDlgItemMessage(hDlg,IDC_FIRSTBLOCK,CB_SETCURSEL,bBuf[1]&0x0F,0); + EnableControl(hDlg,IDC_FIRSTBLOCK); + EnableControl(hDlg,IDC_STATIC_BLOCK); + } + } + break; + case 0x0F:psObjInfo=smbMapObjectInfoF;iMaxNumObjs=GetNumFMapObject();break; + default:psObjInfo=smbMapObjectInfo0B;iMaxNumObjs=GetNum0BMapObject();break; + } + + while(SendDlgItemMessage(hDlg,IDC_TYPE,CB_GETCOUNT,0,0) && CB_ERR!=SendDlgItemMessage(hDlg,IDC_TYPE,CB_GETCOUNT,0,0)) + { + SendDlgItemMessage(hDlg,IDC_TYPE,CB_DELETESTRING,0,0); + } + + for(n=0;n0x0F) return FALSE; + bNewData[0]|=((bTmp&0x0F)<<4); + //Yの取得 + bTmp=(BYTE)GetDlgItemInt(hDlg,IDC_YPOS,&blSuccess,FALSE); + if(!blSuccess || bTmp>0x0F) return FALSE; + bNewData[0]|=(bTmp&0x0F); + + iSel=SendDlgItemMessage(hDlg,IDC_TYPE,CB_GETCURSEL,0,0); + if(iSel==CB_ERR) return TRUE; + + switch(bTmp&0x0F) + { + case 0x0C:psObjInfo=smbMapObjectInfoC;break; + case 0x0D:psObjInfo=smbMapObjectInfoD;break; + case 0x0E: + { + BYTE bSel; + psObjInfo=smbMapObjectInfoE; + if(iSel&0x1) + { + EnableControl(hDlg,IDC_BACKCOLOR); + bSel=(BYTE)SendDlgItemMessage(hDlg,IDC_BACKCOLOR,CB_GETCURSEL,0,0); + bSel&=0x07; + bNewData[1]|=bSel; + } + else + { + EnableControl(hDlg,IDC_FIRSTBLOCK); + bSel=(BYTE)SendDlgItemMessage(hDlg,IDC_FIRSTBLOCK,CB_GETCURSEL,0,0); + bSel&=0x0F; + bNewData[1]|=bSel; + + EnableControl(hDlg,IDC_VIEW); + bSel=(BYTE)SendDlgItemMessage(hDlg,IDC_VIEW,CB_GETCURSEL,0,0); + bSel&=0x03; + bNewData[1]|=(bSel<<4); + + } + } + break; + case 0x0F:psObjInfo=smbMapObjectInfoF;break; + default:psObjInfo=smbMapObjectInfo0B;break; + } + + // + bNewData[1]|=psObjInfo[iSel].bBasicData; + + // + if(psObjInfo[iSel].bIsSizeValid) + { + iSize=GetDlgItemInt(hDlg,IDC_LEN,&blSuccess,FALSE); + if(!blSuccess) return FALSE; + //増加分を足してから、マスクすることは、重要。例えば、長さ8の土管の入力。 + iSize+=psObjInfo[iSel].iSizeDelta; + + if(iSize<0 || iSize>psObjInfo[iSel].bSizeMask) return TRUE; + bNewData[1]+=iSize; + } + // + undoPrepare(UNDONAME_DLGEDIT); + memcpy(bBuf,bNewData,2); + SetMapData(GETADDRESS_CURRENT_EDITTING,GetSelectedIndex(),bNewData); + } + + UpdateObjectList(0); + UpdateObjectView(0); + ObjectListSetCursor(GetSelectedIndex()); + } + case IDCANCEL: + EndDialog(hDlg, TRUE); + return TRUE; + case IDC_YPOS: + if(HIWORD(wParam)==EN_CHANGE) + { + BYTE bTmp; + BOOL blSuccess; + + //Yの取得 + bTmp=(BYTE)GetDlgItemInt(hDlg,IDC_YPOS,&blSuccess,FALSE); + if(!blSuccess) return FALSE; + bBuf[0]&=0xF0; + bBuf[0]|=(bTmp&0x0F); + + PrepareMapComEditDlg(hDlg,bBuf,iPage,PREPAREDLG_MAPCOMEDIT_YPOS); + return TRUE; + } + break; + case IDC_XPOS: + if(HIWORD(wParam)==EN_CHANGE) + { + BYTE bTmp; + BOOL blSuccess; + + bTmp=(BYTE)GetDlgItemInt(hDlg,IDC_XPOS,&blSuccess,FALSE); + if(!blSuccess) return FALSE; + bBuf[0]&=0x0F; + bBuf[0]|=(bTmp<<4); + + //PrepareMapComEditDlg(hDlg,bBuf,iPage,PREPAREDLG_MAPCOMEDIT_BININPUTONLY); + return TRUE; + } + break; + case IDC_LEN: + if(HIWORD(wParam)==EN_CHANGE) + { + + return TRUE; + } + break; + case IDC_TYPE://種類を変更 + if(HIWORD(wParam)==CBN_SELCHANGE) + { + BYTE bTmp; + int iSel; + BOOL blSuccess; + SMBMAPOBJECTINFO* psObjInfo; + + bTmp=(BYTE)GetDlgItemInt(hDlg,IDC_YPOS,&blSuccess,FALSE); + if(!blSuccess) return TRUE; + + iSel=SendDlgItemMessage(hDlg,IDC_TYPE,CB_GETCURSEL,0,0); + if(iSel==CB_ERR) return TRUE; + + switch(bTmp&0x0F) + { + case 0x0C:psObjInfo=smbMapObjectInfoC;break; + case 0x0D:psObjInfo=smbMapObjectInfoD;break; + case 0x0E: + { + psObjInfo=smbMapObjectInfoE; + if(iSel&0x1) + bBuf[1]|=0x40; + else + bBuf[1]&=0xBF; + } + break; + case 0x0F:psObjInfo=smbMapObjectInfoF;break; + default:psObjInfo=smbMapObjectInfo0B;break; + } + + // + if((bTmp&0x0F)!=0x0E) + { + bBuf[1]&=psObjInfo[iSel].bSizeMask; + bBuf[1]|=psObjInfo[iSel].bBasicData; + } + PrepareMapComEditDlg(hDlg,bBuf,iPage,PREPAREDLG_MAPCOMEDIT_ALL); + return TRUE; + } + break; + case IDC_PAGEFLAG: + if(HIWORD(wParam)==BN_CLICKED) + { + + if(IsDlgButtonChecked(hDlg,IDC_PAGEFLAG)&BST_CHECKED) + { + if(!(bBuf[1]&0x80)) iPage++; + bBuf[1]|=0x80; + } + else + { + if(bBuf[1]&0x80) iPage--; + bBuf[1]&=0x7F; + } + //PrepareMapComEditDlg(hDlg,bBuf,iPage,PREPAREDLG_MAPCOMEDIT_BININPUTONLY); + return TRUE; + } + break; + case IDC_BIN: + { + if(HIWORD(wParam)==EN_CHANGE) + CheckDlgButton(hDlg,IDC_ISBIN,BST_CHECKED); + return TRUE; + } + break; + } + } + break; + + } + return FALSE; +} \ No newline at end of file diff --git a/src/objlib.c b/src/objlib.c new file mode 100644 index 0000000..1b4de3f --- /dev/null +++ b/src/objlib.c @@ -0,0 +1,919 @@ +/************************************************************************************ + + smb Utility + + File: objlib.c + Description: + History: + + ************************************************************************************/ +#include "smbutil.h" +#include "roommng.h" +#include "objlist.h" +#include "objlib.h" +#include "objview.h" +#include "objmng.h" +#include "ini.h" + +BOOL g_blIsLengthValid=TRUE; + +BOOL ObjectSeekGetIsLengthValid(){return g_blIsLengthValid;} +void ObjectSeekSetIsLengthValid(BOOL blIsValid){g_blIsLengthValid=blIsValid;} + +void LoadEditorOption() +{ + UINT uData; + // HARD + uData = GetIntegerFromINI(INIFILE_EDITOR,INIFILE_EDITOR_PROTECT,1); + if( !uData || uData==1 ) + g_blIsLengthValid = uData; +} + +/* +設定用ダイアログコールバック関数 +*/ +LRESULT CALLBACK EditorOptionDlgProc( HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam) +{ + switch (message) + { + case WM_INITDIALOG: + { + LPPROPSHEETPAGE lpPropPage=(LPPROPSHEETPAGE)lParam; + + if(lpPropPage->lParam) + CenterPropatySheet(hDlg); + + CheckDlgButton(hDlg,IDC_ISADDRESS,BST_CHECKED); + if(!g_blIsLengthValid) CheckDlgButton(hDlg,IDC_ISADDRESS,BST_UNCHECKED); + } + break; + case WM_NOTIFY: + { + LPNMHDR pnmh = (LPNMHDR) lParam; + switch (pnmh->code) { + case PSN_APPLY: + { + g_blIsLengthValid=FALSE; + if(BST_CHECKED==IsDlgButtonChecked(hDlg,IDC_ISADDRESS)) g_blIsLengthValid=TRUE; + return TRUE; + } + break; + } + } + break; + } + + return FALSE; +} + +/********************************************* + + 直接オブジェクトデータを検索するときの補助関数 + +**********************************************/ +/********* + 敵 +**********/ + + +//敵のページについての処理(補助関数) +static void BadGuysSetPage(OBJECTSEEKINFO *psObjSeek) +{ + if(!psObjSeek) return; + + if(((psObjSeek->pbData[1])&0x80) && !psObjSeek->blIsPrevPageCom){ + psObjSeek->dwPage++; + } + else if(((psObjSeek->pbData[0])&0x0F)==0x0F){ + // nhxx xxxx + // n:改ページフラグ + // h:5-3以降出現 + // xxxxxx:新しいページ + psObjSeek->dwPage = psObjSeek->pbData[1] & 0x3F; + psObjSeek->blIsPrevPageCom=TRUE; + } + + if(((psObjSeek->pbData[0])&0x0F)!=0x0F) psObjSeek->blIsPrevPageCom=FALSE; +} + +//ルーム内のデータならTRUE、ルーム外のデータならFALSEを返す +static BOOL BadGuysCheckDataLength(OBJECTSEEKINFO *psObjSeek) +{ + if(!psObjSeek) return FALSE; + + if((psObjSeek->dwLength)<(psObjSeek->dwOfs)+BadGuysGetDataLength(psObjSeek->pbData)) + return FALSE; + + return TRUE; +} + +//敵のデータのサイズを得る +int BadGuysGetDataLength(BYTE *pbBuf){ + return ((pbBuf[0]&0x0F)==0x0E)?3:2; +} + +//敵のデータを検索するためのデータを初期化する +//uRoomIDには、取得したいルームのデータを指定。 +//GETADDRESS_CURRENT_EDITTINGを指定すると現在エディトしているルーム +BOOL BadGuysSeekFirst(OBJECTSEEKINFO *psObjSeek,UINT uRoomID){ + if(!psObjSeek) return FALSE; + //構造体を初期化 + memset(psObjSeek,0,sizeof(OBJECTSEEKINFO)); + psObjSeek->pbData=bPRGROM+GetBadGuysAddress(uRoomID); + + if(psObjSeek->pbData[0]==0xFF) return FALSE; + + //ページの情報をセット + BadGuysSetPage(psObjSeek); + //長さの情報をセット + psObjSeek->dwLength=BadGuysGetAllDataLength(uRoomID); + //オブジェクトのサイズ + psObjSeek->dwObjLen=BadGuysGetDataLength(psObjSeek->pbData); + + if(g_blIsLengthValid && !BadGuysCheckDataLength(psObjSeek)) return FALSE; + + return TRUE; +} + +//次のデータを得る +//正しくデータを取得できた場合は、TRUE, NULLを渡すか、データの終了の場合は、FALSEを返す。 +BOOL BadGuysSeekNext(OBJECTSEEKINFO *psObjSeek){ + int iCurObjSize; + if(!psObjSeek) return FALSE; + // + iCurObjSize=BadGuysGetDataLength(psObjSeek->pbData); + psObjSeek->pbData+=iCurObjSize; + psObjSeek->dwOfs+=iCurObjSize; + + if(psObjSeek->pbData[0]==0xFF) return FALSE; + + //ページの情報をセット + BadGuysSetPage(psObjSeek); + //インデックスをインクリメント + psObjSeek->dwIndex++; + //オブジェクトのサイズ + psObjSeek->dwObjLen=BadGuysGetDataLength(psObjSeek->pbData); + + if(g_blIsLengthValid + && (!BadGuysCheckDataLength(psObjSeek) + || psObjSeek->dwOfs > 0xFF)) // 1ルームに存在できる最大オブジェクト数 + return FALSE; + + return TRUE; +} + +DWORD BadGuysIsPageRelatedObject(LPBYTE lpbBuf) +{ + if( lpbBuf[1]&0x80 ) + return PAGEOBJECT_NEXTPAGEFLAG; + if ( (lpbBuf[0]&0x0F)==0x0F ) + return PAGEOBJECT_SETPAGE; + return PAGEOBJECT_NO; +} + + +/********** + マップ +***********/ +//ページの処理(補助関数) +static void MapSetPage(OBJECTSEEKINFO *psObjSeek) +{ + if(!psObjSeek) return; + + if(((psObjSeek->pbData[1])&0x80) /*&& !psObjSeek->blIsPrevPageCom*/){ + psObjSeek->dwPage++; + } + else if((((psObjSeek->pbData[0])&0x0F)==0x0D) && (!((psObjSeek->pbData[1])&0x40))){ + psObjSeek->dwPage=((psObjSeek->pbData[1])&0x3F); + //psObjSeek->blIsPrevPageCom=TRUE; + } + + //if(!((((psObjSeek->pbData[0])&0x0F)==0x0D) && (!((psObjSeek->pbData[1])&0x40)))) psObjSeek->blIsPrevPageCom=FALSE; +} + +//ルーム内のデータならTRUE、ルーム外のデータならFALSEを返す +static BOOL MapCheckDataLength(OBJECTSEEKINFO *psObjSeek) +{ + if(!psObjSeek) return FALSE; + + if((psObjSeek->dwLength)<(psObjSeek->dwOfs)+2) + return FALSE; + + return TRUE; +} + +//検索するためのデータを初期化する +//uRoomIDには、取得したいルームのデータを指定。 +//GETADDRESS_CURRENT_EDITTINGを指定すると現在エディトしているルーム +BOOL MapSeekFirst(OBJECTSEEKINFO *psObjSeek,UINT uRoomID){ + if(!psObjSeek) return FALSE; + //構造体を初期化 + memset(psObjSeek,0,sizeof(OBJECTSEEKINFO)); + psObjSeek->pbData=bPRGROM+GetMapAddress(uRoomID)+2;//+2は、ヘッダ分 + + if(psObjSeek->pbData[0]==0xFD) return FALSE; + + //ページの情報をセット + MapSetPage(psObjSeek); + //長さの情報をセット + psObjSeek->dwLength=MapGetAllDataLength(uRoomID); + //オブジェクトのサイズ + psObjSeek->dwObjLen=2; + + if(g_blIsLengthValid && !MapCheckDataLength(psObjSeek)) return FALSE; + + return TRUE; +} + +BOOL MapSeekNext(OBJECTSEEKINFO *psObjSeek){ + if(!psObjSeek) return FALSE; + // + psObjSeek->pbData+=2; + psObjSeek->dwOfs+=2; + + if(psObjSeek->pbData[0]==0xFD) return FALSE; + + //ページの情報をセット + MapSetPage(psObjSeek); + //インデックスをインクリメント + psObjSeek->dwIndex++; + //オブジェクトのサイズ + psObjSeek->dwObjLen=2; + + if(g_blIsLengthValid + && (!MapCheckDataLength(psObjSeek) + || psObjSeek->dwOfs > 0xFF)) // 1ルームに存在できる最大オブジェクト数 + return FALSE; + + return TRUE; +} + +/*********************************** + + マップのデータ変更処理関数 + +************************************/ +int GetMapData(UINT uRoomID, int iIndex, BYTE *pbBuf, int *piPage) +{ + OBJECTSEEKINFO ObjSeek; + + if(iIndex<0) return -1; + + if(!MapSeekFirst(&ObjSeek,uRoomID)) return -1; + for(;;){ + if(ObjSeek.dwIndex==(DWORD)iIndex) break; + if(!MapSeekNext(&ObjSeek)) return -1; + } + + if(pbBuf && sizeof(pbBuf)>=2) memcpy(pbBuf,ObjSeek.pbData,2); + + if(piPage) *piPage=ObjSeek.dwPage; + + return ObjSeek.dwOfs; +} + + +void GetMapHeadData(UINT uRoomID, BYTE *pbBuf) +{ + if(!pbBuf || sizeof(pbBuf)<2) return; + + memcpy(pbBuf,bPRGROM+GetMapAddress(uRoomID),2); +} + +BOOL SortByPosXMap(UINT uRoomID,int *piCurIndex,BOOL IsResort) +{ + BYTE *pbData; + BOOL blRet; + UINT uPageBaseOfs; + int iIndexBase;//先頭からの基準インデックス + int iIndex;//基準からのインデックス + BOOL blReSortNeed; + DWORD dwLength; + + blReSortNeed=FALSE; + blRet=FALSE; + iIndexBase=0; + iIndex=0; + uPageBaseOfs=0; + dwLength=MapGetAllDataLength(uRoomID); + pbData=bPRGROM+GetMapAddress(uRoomID); + pbData+=2; + for(;;) + { + BYTE *pbPageBase; + int iPageBaseNum=0; + + pbPageBase=pbData; + //1ページ内の検索 + for(;;) + { + int n=0; + for(;;) + { + if((pbPageBase[iPageBaseNum]&0xF0)>(pbPageBase[iPageBaseNum+n]&0xF0)) + { + BYTE bTmp[2]; + + // + if((pbPageBase[iPageBaseNum]&0x0F)==0x0D && (pbPageBase[iPageBaseNum+1]&0x70)==0x00) + blReSortNeed=TRUE; + + //改ページフラグ + if(pbPageBase[iPageBaseNum+1]&0x80) + { + pbPageBase[iPageBaseNum+n+1]|=0x80; + pbPageBase[iPageBaseNum+1]&=0x7F; + } + memcpy(bTmp,pbPageBase+iPageBaseNum,2); + memcpy(pbPageBase+iPageBaseNum,pbPageBase+iPageBaseNum+n,2); + memcpy(pbPageBase+iPageBaseNum+n,bTmp,2); + //データが変わった + blRet=TRUE; + //インデックスの処理 + if(piCurIndex) + { + if((iIndexBase+iIndex)==*piCurIndex) + { + *piCurIndex=iIndexBase; + } + else if(iIndexBase==*piCurIndex) + { + *piCurIndex=iIndexBase+iIndex; + } + } + } + + n+=2; + iIndex++; + if((pbPageBase[iPageBaseNum+n+1]&0x80)|| + ( (pbPageBase[iPageBaseNum+n]&0x0F)==0x0D && (pbPageBase[iPageBaseNum+n+1]&0x70)==0x00)|| + (pbPageBase[iPageBaseNum+n]==0xFD)|| + (g_blIsLengthValid && ((DWORD)(uPageBaseOfs+n+2)>=dwLength))) + break; + } + + iPageBaseNum+=2; + uPageBaseOfs+=2; + iIndexBase++; + iIndex=0; + + if((pbPageBase[iPageBaseNum+1]&0x80)|| + ((pbPageBase[iPageBaseNum]&0x0F)==0x0D && (pbPageBase[iPageBaseNum+1]&0x70)==0x00)|| + (pbPageBase[iPageBaseNum]==0xFD)|| + (g_blIsLengthValid && ((DWORD)uPageBaseOfs+2>=dwLength))) break; + } + + pbData+=iPageBaseNum; + + if(pbData[0]==0xFD)break; + } + + if(!IsResort && blReSortNeed){ + blRet=SortByPosXMap(uRoomID,piCurIndex,TRUE); + } + + return blRet; +} + +BOOL SetMapData(UINT uRoomID,int iIndex,BYTE *bBuf) +{ + OBJECTSEEKINFO ObjSeek; + + if(sizeof(bBuf)<2 || iIndex<0) return FALSE; + + if(bBuf[0]==0xFD) return FALSE; + + if(!MapSeekFirst(&ObjSeek,uRoomID)) return FALSE; + for(;;){ + if(ObjSeek.dwIndex==(DWORD)iIndex) break; + if(!MapSeekNext(&ObjSeek)) return FALSE; + } + + memcpy(ObjSeek.pbData ,bBuf,2); + +// gblDataChanged=TRUE; + fr_SetDataChanged(TRUE); + + { + int iPage; + BYTE bTmp[2]; + + SortByPosXMap(uRoomID,&iIndex,FALSE); + //giSelectedItem=iIndex; + SetSelectedItem(iIndex,FALSE); + GetMapData(uRoomID,iIndex,bTmp,&iPage); + //カーソルの更新 + SetMapViewCursoleMap(bTmp,iPage); + } + + return TRUE; +} + +BOOL SetMapDataBinary(UINT uRoomID,int iIndex, BYTE *bBuf,int iValidSize) +{ + OBJECTSEEKINFO ObjSeek; + + if(sizeof(bBuf)<2 || iIndex<0) return FALSE; + + if(!MapSeekFirst(&ObjSeek,uRoomID)) return FALSE; + + for(;;){ + if(ObjSeek.dwIndex==(DWORD)iIndex) break; + if(!MapSeekNext(&ObjSeek)) return FALSE; + } + + if(g_blIsLengthValid && (ObjSeek.dwLengthnNumSamePos = 0; + psGetIndex->iIndex = 0; + } + + if(MapSeekFirst(&ObjSeek,uRoomID)){ + for(;;){ + if(!fFound) iCurIndex++; + if(ObjSeek.dwPage>=(DWORD)iPage) { + if(!psGetIndex){ + if(ObjSeek.dwPage>(DWORD)iPage && iCurIndex>0 && blPageOverDec) iCurIndex--; + break; + } + else if(ObjSeek.dwPage==(DWORD)iPage) + { + //if((psGetIndex->dwFlag&GETINDEX_FLAG_BIN) && !memcmp(pbBuf,ObjSeek.pbData,sizeof(pbBuf)))break; + if((psGetIndex->dwFlag & GETINDEX_FLAG_XY) + && psGetIndex->x == GetMapXPos(ObjSeek.pbData) + && psGetIndex->y == GetMapYPos(ObjSeek.pbData)){ + fFound = TRUE; + if(psGetIndex && (++psGetIndex->nNumSamePos > 1)){ + if(iCurIndex != GETDATAINDEX_ERROR_PL) + psGetIndex->iIndex = iCurIndex; + iCurIndex = GETDATAINDEX_ERROR_PL; + } + } + } + } + + if(!MapSeekNext(&ObjSeek)){ + if(!fFound){ + if(psGetIndex && (psGetIndex->dwFlag & GETINDEX_FLAG_END)) + iCurIndex = iCurIndex; + else + iCurIndex = GETDATAINDEX_ERROR_NOTFOUND; + } + break; + } + } + } + return iCurIndex; +} + +/*********************************** + + 敵のデータ変更処理関数 + +************************************/ +int GetBadGuysData(UINT uRoomID,int iIndex, BYTE *bBuf, int *piPage) +{ + OBJECTSEEKINFO ObjSeek; + + if(iIndex<0) return -1; + + if(!BadGuysSeekFirst(&ObjSeek,uRoomID)) return -1; + + for(;;){ + if(ObjSeek.dwIndex==(DWORD)iIndex) break; + if(!BadGuysSeekNext(&ObjSeek)) return -1; + } + + if(sizeof(bBuf)>=3 && bBuf) + memcpy(bBuf,ObjSeek.pbData,BadGuysGetDataLength(ObjSeek.pbData)); + if(piPage) *piPage=ObjSeek.dwPage; + + return ObjSeek.dwOfs; +} + +static BOOL MemorySwap(BYTE *pbBuf1,int iBuf1Size, BYTE *pbBuf2, int iBuf2Size) +{ + BYTE *pbBufSmall;//アドレスの小さい方 + BYTE *pbTmpSmall; + BYTE *pbBufLarge;//アドレスの大きい方 + BYTE *pbTmpLarge; + int iSizeSmall;//アドレスの小さい方のデータのサイズ + int iSizeLarge;//アドレスの大きい方のデータのサイズ + + if(pbBuf1==pbBuf2) return FALSE; + + if(pbBuf1>pbBuf2) + { + pbBufSmall=pbBuf2; + iSizeSmall=iBuf2Size; + pbBufLarge=pbBuf1; + iSizeLarge=iBuf1Size; + } + else + { + pbBufSmall=pbBuf1; + iSizeSmall=iBuf1Size; + pbBufLarge=pbBuf2; + iSizeLarge=iBuf2Size; + } + + pbTmpSmall=Malloc(iSizeSmall); + if(!pbTmpSmall) return FALSE; + memcpy(pbTmpSmall,pbBufSmall,iSizeSmall); + + pbTmpLarge=Malloc(iSizeLarge); + if(!pbTmpSmall) + { + Mfree(pbTmpSmall); + return FALSE; + } + memcpy(pbTmpLarge,pbBufLarge,iSizeLarge); + + memmove(pbBufSmall+iSizeLarge,pbBufSmall+iSizeSmall,pbBufLarge-(pbBufSmall+iSizeSmall)); + + memcpy(pbBufSmall,pbTmpLarge,iSizeLarge); + memcpy(pbBufLarge+iSizeLarge-iSizeSmall,pbTmpSmall,iSizeSmall); + + Mfree(pbTmpSmall); + Mfree(pbTmpLarge); + + return TRUE; +} + +/*************************************************** +並べ替えが起こったらTRUE、そうでなければFALSEを返す。 +****************************************************/ +/* +BOOL SortByPosXBadGuysEx(UINT uRoomID,int *piCurIndex,BOOL blIsResort) +{ + UINT uPage; + BOOL blRet=FALSE; + OBJECTSEEKINFO ObjSeek; + OBJECTSEEKINFO ObjSeekBase; + + if(!BadGuysSeekFirst(&ObjSeekBase,uRoomID)) return FALSE; + for(;;){ + uPage=ObjSeekBase.dwPage; + for(;;){ + memcpy(&ObjSeek,&ObjSeekBase,sizeof(OBJECTSEEKINFO)); + for(;;){ + if(!BadGuysSeekNext(&ObjSeek) || uPage!=ObjSeek.dwPage) break; + if((ObjSeekBase.pbData[0]&0xF0)>(ObjSeek.pbData[0]&0xF0)){ + + } + } + if(!BadGuysSeekNext(&ObjSeekBase) || uPage!=ObjSeekBase.dwPage) break; + } + } + return ; +} +*/ +BOOL SortByPosXBadGuys(UINT uRoomID,int *piCurIndex,BOOL blIsResort) +{ + BYTE *pbData; + BOOL blRet; + UINT uPageBaseOfs; + int iIndexBase;//先頭からの基準インデックス + int iIndex;//基準からのインデックス + BOOL blReSortNeed; + DWORD dwLength; + + blReSortNeed=FALSE; + blRet=FALSE; + pbData=bPRGROM+GetBadGuysAddress(uRoomID); + dwLength=BadGuysGetAllDataLength(uRoomID); + iIndexBase=0; + iIndex=0; + uPageBaseOfs=0; + for(;;) + { + BYTE *pbPageBase; + int iPageBaseNum=0; + + pbPageBase=pbData; + //1ページ内のソート + for(;;) + { + int n=0; + for(;;) + { + if((pbPageBase[iPageBaseNum+n]&0x0F)!=0x0E) + n+=2; + else + n+=3; + + iIndex++; + + if((pbPageBase[iPageBaseNum+n+1]&0x80)|| + (pbPageBase[iPageBaseNum+n]==0xFF)|| + ((pbPageBase[iPageBaseNum+n]&0x0F)==0x0F)|| + (g_blIsLengthValid && ((DWORD)(uPageBaseOfs+n+BadGuysGetDataLength(&pbPageBase[iPageBaseNum]))>dwLength))) break; + + //スワップが必要なら行う + if((pbPageBase[iPageBaseNum]&0xF0)>(pbPageBase[iPageBaseNum+n]&0xF0)) + { + BYTE bTmp[3]; + int iData1Size; + int iData2Size; + + //ページのベースが送りコマンドで、それと何かをスワップした場合、再ソートが必要 + if((pbPageBase[iPageBaseNum]&0x0F)==0x0F) blReSortNeed=TRUE; + + iData1Size=((pbPageBase[iPageBaseNum]&0x0F)==0x0E)?3:2; + iData2Size=((pbPageBase[iPageBaseNum+n]&0x0F)==0x0E)?3:2; + if(pbPageBase[iPageBaseNum+1]&0x80) + { + pbPageBase[iPageBaseNum+1]&=0x7F; + pbPageBase[iPageBaseNum+n+1]|=0x80; + } + + if(iData1Size==iData2Size) + { + memcpy(bTmp,pbPageBase+iPageBaseNum,iData1Size); + memcpy(pbPageBase+iPageBaseNum,pbPageBase+iPageBaseNum+n,iData1Size); + memcpy(pbPageBase+iPageBaseNum+n,bTmp,iData1Size); + } + else + { + MemorySwap(pbPageBase+iPageBaseNum,iData1Size,pbPageBase+iPageBaseNum+n,iData2Size); + n+=(iData2Size-iData1Size); + } + //データが変わった + blRet=TRUE; + //インデックスの処理 + if(piCurIndex) + { + if((iIndexBase+iIndex)==*piCurIndex) + { + *piCurIndex=iIndexBase; + } + else if(iIndexBase==*piCurIndex) + { + *piCurIndex=iIndexBase+iIndex; + } + } + }/* if */ + + }/* for */ + + if((pbPageBase[iPageBaseNum]&0x0F)!=0x0E){ + iPageBaseNum+=2; + uPageBaseOfs+=2; + } + else{ + iPageBaseNum+=3; + uPageBaseOfs+=3; + } + iIndexBase++; + iIndex=0; + + if((pbPageBase[iPageBaseNum+1]&0x80)|| + (pbPageBase[iPageBaseNum]==0xFF)|| + ((pbPageBase[iPageBaseNum]&0x0F)==0x0F)|| + (g_blIsLengthValid && ((DWORD)(uPageBaseOfs+BadGuysGetDataLength(&pbPageBase[iPageBaseNum]))>dwLength))) break; + }/* for */ + + pbData+=iPageBaseNum; + + if(pbData[0]==0xFF) break; + + } /* for */ + + if(!blIsResort && blReSortNeed){ + blRet=SortByPosXBadGuys(uRoomID,piCurIndex,TRUE); + } + + return blRet; +} + +/* + 注意: データのサイズの違うオブジェクト(ルーム間移動の命令にクリボーなど)を設定しようとすると失敗する + +*/ +BOOL SetBadGuysData(UINT uRoomID,int iIndex, BYTE *bBuf) +{ + int iValidSize1,iValidSize2; + OBJECTSEEKINFO ObjSeek; + + if(sizeof(bBuf)<3 || !bBuf) return FALSE; + + if(bBuf[0]==0xFF) return FALSE; + + if(!BadGuysSeekFirst(&ObjSeek,uRoomID)) return FALSE; + for(;;){ + if(ObjSeek.dwIndex==(DWORD)iIndex) break; + if(!BadGuysSeekNext(&ObjSeek)) return FALSE; + } + + //入力データのサイズを取得 + iValidSize1=BadGuysGetDataLength(bBuf); + //元のデータのサイズを取得 + iValidSize2=BadGuysGetDataLength(ObjSeek.pbData); + if(iValidSize1!=iValidSize2) return FALSE; + memcpy(ObjSeek.pbData,bBuf,iValidSize1); + +// gblDataChanged=TRUE; + fr_SetDataChanged(TRUE); + + // + { + int iPage; + BYTE bTmp[3]; + + SortByPosXBadGuys(GETADDRESS_CURRENT_EDITTING,&iIndex,FALSE); + //giSelectedItem=iIndex; + SetSelectedItem(iIndex,FALSE); + GetBadGuysData(GETADDRESS_CURRENT_EDITTING,iIndex,bTmp,&iPage); + //マップビューのカーソルの更新 + SetMapViewCursoleBadGuys(bTmp,iPage); + } + + return TRUE; +} + +BOOL SetBadGuysDataBinary(UINT uRoomID,int iIndex, BYTE *bBuf,int iValidSize) +{ + OBJECTSEEKINFO ObjSeek; + + if(sizeof(bBuf)<3 || !bBuf) return FALSE; + + if(!BadGuysSeekFirst(&ObjSeek,uRoomID)) return FALSE; + + for(;;){ + if(ObjSeek.dwIndex==(DWORD)iIndex) break; + if(!BadGuysSeekNext(&ObjSeek)) return FALSE; + } + + if(g_blIsLengthValid && (ObjSeek.dwLengthnNumSamePos = 0; + psGetIndex->iIndex = 0; + } + + if(BadGuysSeekFirst(&ObjSeek,uRoomID)){ + for(;;){ + if(!fFound) iCurIndex++; + if(!psGetIndex){ + if(ObjSeek.dwPage>=(DWORD)iPage) { + if(ObjSeek.dwPage>(DWORD)iPage && iCurIndex>0 && blPageOverDec) iCurIndex--; + break; + } + } + else { + //if((psGetIndex->dwFlag&GETINDEX_FLAG_BIN) && !memcmp(pbBuf,ObjSeek.pbData,sizeof(pbBuf)))break; + if(psGetIndex->dwFlag&GETINDEX_FLAG_XY){ + int iTmpPage; + iTmpPage=ObjSeek.dwPage; + x=GetBadGuysXPos(ObjSeek.pbData); + y=GetBadGuysYPos(ObjSeek.pbData); + if(x<0){ + iTmpPage--; + x+=16; + } + else if(x>15){ + iTmpPage++; + x-=16; + } + if(x==psGetIndex->x + && y==psGetIndex->y + && iTmpPage==iPage){ + fFound = TRUE; + if(psGetIndex && (++psGetIndex->nNumSamePos > 1)){ + if(iCurIndex != GETDATAINDEX_ERROR_PL) + psGetIndex->iIndex = iCurIndex; + iCurIndex = GETDATAINDEX_ERROR_PL; + } + } + } + } + + if(!BadGuysSeekNext(&ObjSeek)){ + if(!fFound){ + if(psGetIndex && (psGetIndex->dwFlag & GETINDEX_FLAG_END)) + iCurIndex = iCurIndex; + else + iCurIndex = GETDATAINDEX_ERROR_NOTFOUND; + } + break; + } + } + } + return iCurIndex; +} + +/*************************** + + + +****************************/ +extern SMBBADGUYSINFO smbBudGuysInfo[]; +int GetBadGuysYPos(BYTE *pbBuf) +{ + int iRet; + if((pbBuf[0]&0x0F)!=0x0E){ + if((pbBuf[0]&0x0F)!=0x0F){ + if(smbBudGuysInfo[pbBuf[1]&0x3F].bFixedYPos) + iRet=smbBudGuysInfo[pbBuf[1]&0x3F].bFixedYPos; + else + iRet=(pbBuf[0]&0x0F)+smbBudGuysInfo[pbBuf[1]&0x3F].YDelta; + } + else + iRet=0x0F; + }else{ + iRet=0x0E; + } + return iRet; +} + +int GetBadGuysXPos(BYTE *pbBuf) +{ + if((pbBuf[0]&0x0F)!=0x0E) + return ((pbBuf[0]>>4)&0x0F)+smbBudGuysInfo[pbBuf[1]&0x3F].XDelta; + else + return ((pbBuf[0]>>4)&0x0F); +} + +// +int GetMapXPos(BYTE *pbBuf) +{ + return ((pbBuf[0]>>4)&0x0F); +} +int GetMapYPos(BYTE *pbBuf) +{ + return (pbBuf[0]&0x0F); +} + +BOOL BadGuysIsHardObject(BYTE *pbBuf) +{ + BYTE bBuf = pbBuf[0] &0x0F; + return ( (bBuf != 0x0E) + && (bBuf != 0x0F) + && (pbBuf[1] & 0x40)) ? TRUE : FALSE; +} \ No newline at end of file diff --git a/src/objlib.h b/src/objlib.h new file mode 100644 index 0000000..a3dd01e --- /dev/null +++ b/src/objlib.h @@ -0,0 +1,100 @@ +/************************************************************************************ + + smb Utility + + File: objlib.h + Description: + History: + + ************************************************************************************/ +#ifndef OBJLIB_H +#define OBJLIB_H + +/************************************** + + オブジェクトのアドレスに関する定数 + +***************************************/ +#define SMB_OBJECT_START_ADDRESS 0x9D70 +#define SMB_OBJECT_END_ADDRESS 0xAEDC //このアドレスには、書いてはいけない。(このアドレスの1つ前までは、マップデータ) +#define SMB_ALL_OBJECT_SIZE SMB_OBJECT_END_ADDRESS-SMB_OBJECT_START_ADDRESS + +LRESULT CALLBACK EditorOptionDlgProc( HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam); +void LoadEditorOption(); + +/*************************** + + オブジェクトの探索関数 + +****************************/ +typedef struct _tagOBJECTSEEKINFO +{ + LPBYTE pbData;//ポインタ + DWORD dwPage;//ページ + DWORD dwOfs;//データの先頭(マップは、2バイトのヘッダは除く) + DWORD dwLength;//アドレスから計算した全ルームデータの長さ + DWORD dwIndex;//先頭のオブジェクトを0としたインデックス + DWORD dwObjLen;//ポインタの指しているデータのサイズ + BOOL blIsPrevPageCom;//ページの処理に使われる +}OBJECTSEEKINFO, FAR *LPOBJECTSEEKINFO; + +BOOL BadGuysSeekFirst(OBJECTSEEKINFO *psObjSeek,UINT uRoomID); +BOOL BadGuysSeekNext(OBJECTSEEKINFO *psObjSeek); + +BOOL MapSeekFirst(OBJECTSEEKINFO *psObjSeek,UINT uRoomID); +BOOL MapSeekNext(OBJECTSEEKINFO *psObjSeek); + +/******************************* + + +********************************/ +#define GETDATAINDEX_ERROR_NOTFOUND -1 +#define GETDATAINDEX_ERROR_PL -2 + +#define GETINDEX_FLAG_BIN 1 +#define GETINDEX_FLAG_XY 2 +#define GETINDEX_FLAG_END 4 +typedef struct _tagGETINDEXINFO +{ + DWORD dwFlag; + LPBYTE pbBuf; + int x;//coordinate of mapview + int y;//coordinate of mapview + int iIndex; + int nNumSamePos; +}GETINDEXINFO, FAR *LPGETINDEXINFO; + +int GetMapData(UINT uRoomID,int iIndex,BYTE *pbBuf,int *piPage); +void GetMapHeadData(UINT uRoomID,BYTE *pbBuf); +BOOL SortByPosXMap(UINT uRoomID,int *piCurIndex,BOOL IsResort); +BOOL SetMapData(UINT uRoomID,int iIndex,BYTE *bBuf); +BOOL SetMapDataBinary(UINT uRoomID,int iIndex, BYTE *bBuf,int iValidSize); +int GetMapDataIndex(UINT uRoomID,GETINDEXINFO *psGetIndex,int iPage,BOOL blPageOverDec); + +int BadGuysGetDataLength(BYTE *pbBuf); +int GetBadGuysData(UINT uRoomID,int iIndex, BYTE *bBuf, int *piPage); +BOOL SortByPosXBadGuys(UINT uRoomID,int *piCurIndex,BOOL blIsResort); +BOOL SetBadGuysData(UINT uRoomID,int iIndex, BYTE *bBuf); +BOOL SetBadGuysDataBinary(UINT uRoomID,int iIndex, BYTE *bBuf,int iValidSize); +int GetBadGuysDataIndex(UINT uRoomID,GETINDEXINFO *psGetIndex,int iPage,BOOL blPageOverDec); + +/******************* + + + +*******************/ +#define PAGEOBJECT_NO 0 +#define PAGEOBJECT_NEXTPAGEFLAG 1 +#define PAGEOBJECT_SETPAGE 2 +DWORD BadGuysIsPageRelatedObject(LPBYTE lpbBuf); + + +int GetBadGuysYPos(BYTE *pbBuf); +int GetBadGuysXPos(BYTE *pbBuf); +int GetMapXPos(BYTE *pbBuf); +int GetMapYPos(BYTE *pbBuf); + +BOOL BadGuysIsHardObject(BYTE *pbBuf); + + +#endif /* OBJLIB_H */ \ No newline at end of file diff --git a/src/objlist.c b/src/objlist.c new file mode 100644 index 0000000..dd9053f --- /dev/null +++ b/src/objlist.c @@ -0,0 +1,728 @@ +/************************************************************************************ + + smb Utility + + File: objlist.c + Description: + History: + + ************************************************************************************/ +#include "smbutil.h" +#include "roommng.h" +#include "objlist.h" +#include "objlib.h" +#include "objmng.h" +#include "objview.h" +#include "ini.h" +#include "objwndcmn.h" +/************************ + + ユーザー定義メッセージ + +*************************/ +#define WM_LVSELCHANGE (WM_USER + 100) + +/****************** + + グローバル変数 + +*******************/ + +//リストビューのハンドル +HWND g_hWndListView; + + + + + +/*************** + +補助関数 + +***************/ +//リストボックス +void ObjectListClear() +{ + ListView_DeleteAllItems(g_hWndListView); +} + +void ObjectListSetCursor(int iIndex) +{ + // clear cursor + ListView_SetItemState(g_hWndListView,-1,~(LVIS_SELECTED|LVIS_FOCUSED),LVIS_SELECTED|LVIS_FOCUSED); + // set cursor + ListView_SetItemState(g_hWndListView,iIndex,LVIS_SELECTED|LVIS_FOCUSED ,LVIS_SELECTED|LVIS_FOCUSED ); +} + +void ObjectListShowCursor() +{ + ListView_EnsureVisible(g_hWndListView,GetSelectedIndex(),FALSE); +} + +//グローバルな変数の初期化 +void InitMapEditGlobalValue() +{ + SetSelectedItem(0,TRUE); +} + +/************************************************* + + マップの情報の表示 + +***************************************************/ +#include "objdata.h" + + +void FormatMapString(LPBYTE lpbBuf,LPTSTR lpszBuf) +{ + switch((lpbBuf[0]&0x0f)) + { + case 0x0C: + wsprintf(lpszBuf, STRING_OBJLIST_LENNAME, (lpbBuf[1] & 0x0F) + 1, smbMapObjectInfoC[(lpbBuf[1] >> 4) & 0x07].Name); + break; + case 0x0D: + if(!(lpbBuf[1]&0x40)) + wsprintf(lpszBuf, "%s:%.2d", smbMapObjectInfoD[0].Name, lpbBuf[1] & 0x3F); + else{ + if((lpbBuf[1]&0x70)==0x40) + wsprintf(lpszBuf, "%s", smbMapObjectInfoD[(lpbBuf[1] & 0x0F) + 1].Name); + else + wsprintf(lpszBuf, STRING_OBJLIST_UNKNOWN); + } + break; + case 0x0E: + if(lpbBuf[1]&0x40) + wsprintf(lpszBuf, STRING_OBJLIST_BACK, smbMapHeadBackColor[lpbBuf[1] & 0x07]); + else + wsprintf(lpszBuf, STRING_OBJLIST_VIEWBLOCK, smbMapHeadView[(lpbBuf[1] >> 4) & 0x03], smbMapBasicBlock[lpbBuf[1] & 0x0F].Name); + break; + case 0x0F: + { + switch((lpbBuf[1]>>4)&0x07) + { + case 0: + wsprintf(lpszBuf, STRING_OBJLIST_ROPE); + break; + // オブジェクトのデータベースの都合(1と4,5との間には、追加の要素が1つ入っているため)により、 + // 1と4,5は違う処理 + case 1: + wsprintf(lpszBuf, STRING_OBJLIST_LENNAME, (lpbBuf[1] & 0x0F) + 1, smbMapObjectInfoF[((lpbBuf[1] >> 4) & 0x07)].Name); + break; + case 4: + case 5: + wsprintf(lpszBuf, STRING_OBJLIST_LENNAME, (lpbBuf[1] & 0x0F) + 1, smbMapObjectInfoF[((lpbBuf[1] >> 4) & 0x07) + 1].Name); + break; + case 2: + { + BYTE bHeight; + bHeight = lpbBuf[1] & 0x0F; + if(0x00 <= bHeight && bHeight <= 0x0B) + wsprintf(lpszBuf, STRING_OBJLIST_LENCASTLE, 0x0B - bHeight + 1); + else + wsprintf(lpszBuf, STRING_OBJLIST_CRASH); + } + break; + case 3: + if(!((lpbBuf[1]>>3)&0x01)) + wsprintf(lpszBuf,STRING_OBJLIST_STEP,(lpbBuf[1]&0x07)+1,(lpbBuf[1]&0x07)+1); + else + { + BYTE bLower; + bLower=(lpbBuf[1]&0x07); + if(0<= bLower && bLower <=0x03) + wsprintf(lpszBuf, STRING_OBJLIST_STEP98); + else if(0x04<= bLower && bLower <=0x06) + wsprintf(lpszBuf, STRING_OBJLIST_STEP98_2); + else if(0x07==bLower) + wsprintf(lpszBuf, STRING_OBJLIST_STEP98_2); + } + break; + case 6: + case 7: + wsprintf(lpszBuf, STRING_OBJLIST_NONE); + break; + } + } + break; + default: + if(!(lpbBuf[1]&0x70)){ + wsprintf(lpszBuf,"%s",smbMapObjectInfo0B[lpbBuf[1] & 0x0F].Name); + } + else if((lpbBuf[1]&0x70)!=0x70){ + wsprintf(lpszBuf, STRING_OBJLIST_LENNAME, (lpbBuf[1] & 0x0F) + 1, smbMapObjectInfo0B[0x0F + ((lpbBuf[1] >> 4) & 0x07)].Name); + } + else{ + if(lpbBuf[1]&0x08)//土管 + wsprintf(lpszBuf, STRING_OBJLIST_LENNAME,(lpbBuf[1] & 0x07) + 1, smbMapObjectInfo0B[0x17].Name); + else + wsprintf(lpszBuf, STRING_OBJLIST_LENNAME,(lpbBuf[1] & 0x0F) + 1, smbMapObjectInfo0B[0x16].Name); + } + break; + }/* switch */ +} + +static BOOL smbMapCommand(BOOL blQuietUpdate) +{ + OBJECTSEEKINFO ObjSeek; + int n; + + if(MapSeekFirst(&ObjSeek,GETADDRESS_CURRENT_EDITTING)) + { + for(n=0;;n++) + { + LPTSTR cBuf = GetTempStringBuffer(); + LVITEM lvItem; + + //バイナリ + wsprintf(cBuf,"%.2x %.2x",ObjSeek.pbData[0],ObjSeek.pbData[1]); + + if(blQuietUpdate){ + BYTE bBuf[2]; + LPTSTR cCurText = GetTempStringBuffer2(); + lvItem.iItem=n; + lvItem.iSubItem=0; + lvItem.mask=LVIF_TEXT; + lvItem.pszText=cCurText; + lvItem.cchTextMax=TMPSTRBUFSIZ; + if(ListView_GetItem(g_hWndListView,&lvItem)){ + sscanf(cCurText,"%x %x",&bBuf[0],&bBuf[1]); + if(!memcmp(bBuf,ObjSeek.pbData,2)) + goto CANCEL_SET_ITEM_TEXT; + } + ListView_SetItemText(g_hWndListView,n,0,cBuf); + } + else{ + memset(&lvItem,0,sizeof(LVITEM)); + lvItem.mask=LVIF_TEXT; + lvItem.iItem=n; + lvItem.iSubItem=0; + lvItem.pszText=cBuf; + ListView_InsertItem(g_hWndListView,&lvItem); + } + + //ページ + wsprintf(cBuf,"%d",ObjSeek.dwPage); + ListView_SetItemText(g_hWndListView,n,1,cBuf); + //位置 + wsprintf(cBuf,"(%d,%d)",GetMapXPos(ObjSeek.pbData),GetMapYPos(ObjSeek.pbData)); + ListView_SetItemText(g_hWndListView,n,2,cBuf); + //種類 + FormatMapString(ObjSeek.pbData,cBuf); + ListView_SetItemText(g_hWndListView,n,3,cBuf); + +CANCEL_SET_ITEM_TEXT: + if(!MapSeekNext(&ObjSeek)) break; + }/* for */ + }/* if */ + + return TRUE; +} + +/************************************************* + + 敵の情報の表示 + + +***************************************************/ +void FormatBadGuysString(LPBYTE lpbBuf,LPTSTR lpszBuf) +{ + LPSTR bit6[]={"", STRING_OBJLIST_HARD}; + + switch(lpbBuf[0]&0x0F) + { + case 0x0E://ルーム間移動の命令(3バイト) + { + LPTSTR lpAttr[] = {STRING_SEA, STRING_SKY, STRING_UNDERGROUND, STRING_CASTLE}; + wsprintf(lpszBuf, STRING_OBJLIST_ROOM, lpbBuf[1] & 0x7F, lpAttr[(lpbBuf[1] >> 5) & 0x03], ((lpbBuf[2] >> 5) & 0x07) + 1,lpbBuf[2] & 0x1F); + } + break; + case 0x0F://送りコマンド(2バイト) + wsprintf(lpszBuf, STRING_OBJLIST_PAGECOMMAND, lpbBuf[1] & 0x3F); + break; + default://(敵キャラコマンド) + { + wsprintf(lpszBuf, "%s%s", smbBudGuysInfo[lpbBuf[1] & 0x3f].Name, bit6[(lpbBuf[1] >> 6) & 0x01]); + } + } +} +static BOOL smbBadGuysCommand(BOOL blQuietUpdate) +{ + OBJECTSEEKINFO ObjSeek; + int n; + + if(BadGuysSeekFirst(&ObjSeek,GETADDRESS_CURRENT_EDITTING)) + { + for(n=0;;n++) + { + LPTSTR cBuf = GetTempStringBuffer(); + LVITEM lvItem; + + //バイナリ + if(ObjSeek.dwObjLen==2) + wsprintf(cBuf,"%.2x %.2x",ObjSeek.pbData[0],ObjSeek.pbData[1]); + else + wsprintf(cBuf,"%.2x %.2x %.2x",ObjSeek.pbData[0],ObjSeek.pbData[1],ObjSeek.pbData[2]); + + if(blQuietUpdate){ + BYTE bBuf[3]; + LPTSTR cCurText = GetTempStringBuffer2(); + int iSizeLV,iSizeSrc; + lvItem.iItem=n; + lvItem.iSubItem=0; + lvItem.mask=LVIF_TEXT; + lvItem.pszText=cCurText; + lvItem.cchTextMax=TMPSTRBUFSIZ; + if(ListView_GetItem(g_hWndListView,&lvItem)){ + iSizeLV=sscanf(cCurText,"%x %x %x",&bBuf[0],&bBuf[1],&bBuf[2]); + iSizeSrc=BadGuysGetDataLength(ObjSeek.pbData); + if(iSizeLV==iSizeSrc && !memcmp(bBuf,ObjSeek.pbData,iSizeSrc)) + goto CANCEL_SET_ITEM_TEXT; + ListView_SetItemText(g_hWndListView,n,0,cBuf); + } + } + else{ + memset(&lvItem,0,sizeof(LVITEM)); + lvItem.mask=LVIF_TEXT; + lvItem.iItem=n; + lvItem.iSubItem=0; + lvItem.pszText=cBuf; + ListView_InsertItem(g_hWndListView,&lvItem); + } + //ページ + wsprintf(cBuf,"%d",ObjSeek.dwPage); + ListView_SetItemText(g_hWndListView,n,1,cBuf); + //位置 + wsprintf(cBuf,"(%d,%d)",GetBadGuysXPos(ObjSeek.pbData),GetBadGuysYPos(ObjSeek.pbData)); + ListView_SetItemText(g_hWndListView,n,2,cBuf); + //種類 + FormatBadGuysString(ObjSeek.pbData,cBuf); + ListView_SetItemText(g_hWndListView,n,3,cBuf); +CANCEL_SET_ITEM_TEXT: + if(!BadGuysSeekNext(&ObjSeek)) break; + }/* for */ + }/* if */ + return TRUE; +} + +/************************************************* + + リストボックスの更新 + + +***************************************************/ +void UpdateObjectList(DWORD dwUpdateFlag) +{ + if(!gblIsROMLoaded) return; + + //Set redraw mode and delete all items + SendMessage(g_hWndListView,WM_SETREDRAW,(WPARAM)FALSE,0); + if(!(dwUpdateFlag&1)) + ListView_DeleteAllItems(g_hWndListView); + + if(GetMapEditMode()) + smbBadGuysCommand(dwUpdateFlag&1); + else + smbMapCommand(dwUpdateFlag&1); + + ObjectListSetCursor(GetSelectedIndex()); + + SendMessage(g_hWndListView,WM_SETREDRAW,(WPARAM)TRUE,0); +} + + +/************************** + + マップの設定の変更 + +***************************/ + +#define RESTART_PAGE_ADDRESS 0x91F7 + +int GetHalfPointPage(int w,int a) +{ + BYTE bTmp; + ADDRESSDATA adRestartPageAddress; + + ADDRESSDATA_LOAD(adRestartPageAddress,RESTART_PAGE_ADDRESS); + + bTmp=*(bPRGROM+ADDRESSDATA_GET(adRestartPageAddress)+w*2+((a>>1)&0x01)); + bTmp>>=(!(a&0x01))*4; + bTmp&=0x0F; + + return bTmp; +} + +LRESULT CALLBACK MapComHeadEditDlgProc( HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam) +{ + switch (message) + { + case WM_INITDIALOG: + { + register int n; + BYTE bRoomID; + BYTE bBuf[2]; + LPTSTR AttrName[]={STRING_SEA,STRING_SKY,STRING_UNDERGROUND,STRING_CASTLE}; + + //ルームの属性 + for(n=0;n<4;n++) + SendDlgItemMessage(hDlg,IDC_MAPATTR,CB_ADDSTRING,0,(LPARAM)AttrName[n]); + bRoomID=GetRoomID(); + SendDlgItemMessage(hDlg,IDC_MAPATTR,CB_SETCURSEL,(bRoomID>>5)&0x03,0); + + //途中からのページ + for(n=0;n<16;n++){ + TCHAR cTmp[3]; + wsprintf(cTmp,"%d",n); + SendDlgItemMessage(hDlg,IDC_PAGE,CB_ADDSTRING,0,(LPARAM)cTmp); + } + + if(!rm_IsSubRoom()) + { + SendDlgItemMessage(hDlg,IDC_PAGE,CB_SETCURSEL,GetHalfPointPage(g_iWorld,g_iArea),0); + } + else{ + EnableWindow(GetDlgItem(hDlg,IDC_PAGE),FALSE); + EnableWindow(GetDlgItem(hDlg,IDC_STATIC_PAGE),FALSE); + } + + GetMapHeadData(GETADDRESS_CURRENT_EDITTING,bBuf); + for(n=0;n<4;n++) + SendDlgItemMessage(hDlg,IDC_TIME,CB_ADDSTRING,0,(LPARAM)smbMapHeadTime[n]); + SendDlgItemMessage(hDlg,IDC_TIME,CB_SETCURSEL,(WPARAM)((bBuf[0]>>6)&0x03),0); + for(n=0;n<8;n++) + SendDlgItemMessage(hDlg,IDC_POSITION,CB_ADDSTRING,0,(LPARAM)smbMapHeadPosition[n]); + SendDlgItemMessage(hDlg,IDC_POSITION,CB_SETCURSEL,(WPARAM)((bBuf[0]>>3)&0x07),0); + for(n=0;n<8;n++) + SendDlgItemMessage(hDlg,IDC_BACKCOLOR,CB_ADDSTRING,0,(LPARAM)smbMapHeadBackColor[n]); + SendDlgItemMessage(hDlg,IDC_BACKCOLOR,CB_SETCURSEL,bBuf[0]&0x07,0); + for(n=0;n<4;n++) + SendDlgItemMessage(hDlg,IDC_MAPTYPE,CB_ADDSTRING,0,(LPARAM)smbMapHeadMapType[n]); + SendDlgItemMessage(hDlg,IDC_MAPTYPE,CB_SETCURSEL,(bBuf[1]>>6)&0x03,0); + for(n=0;n<4;n++) + SendDlgItemMessage(hDlg,IDC_VIEW,CB_ADDSTRING,0,(LPARAM)smbMapHeadView[n]); + SendDlgItemMessage(hDlg,IDC_VIEW,CB_SETCURSEL,(bBuf[1]>>4)&0x03,0); + for(n=0;n<16;n++) + SendDlgItemMessage(hDlg,IDC_FIRSTBLOCK,CB_ADDSTRING,0,(LPARAM)smbMapBasicBlock[n].Name); + SendDlgItemMessage(hDlg,IDC_FIRSTBLOCK,CB_SETCURSEL,bBuf[1]&0x0F,0); + + return TRUE; + } + case WM_COMMAND: + switch(LOWORD(wParam)) + { + case IDOK: + { + BYTE bBuf[2]={0}; + BYTE bTmp; + int iNewAttr; + + undoPrepare(UNDONAME_HEADDLG); + + bTmp=(BYTE)SendDlgItemMessage(hDlg,IDC_TIME,CB_GETCURSEL,0,0); + bBuf[0]|=((bTmp&0x3)<<6); + bTmp=(BYTE)SendDlgItemMessage(hDlg,IDC_POSITION,CB_GETCURSEL,0,0); + bBuf[0]|=((bTmp&0x7)<<3); + bTmp=(BYTE)SendDlgItemMessage(hDlg,IDC_BACKCOLOR,CB_GETCURSEL,0,0); + bBuf[0]|=(bTmp&0x07); + bTmp=(BYTE)SendDlgItemMessage(hDlg,IDC_MAPTYPE,CB_GETCURSEL,0,0); + bBuf[1]|=((bTmp&0x3)<<6); + bTmp=(BYTE)SendDlgItemMessage(hDlg,IDC_VIEW,CB_GETCURSEL,0,0); + bBuf[1]|=((bTmp&0x3)<<4); + bTmp=(BYTE)SendDlgItemMessage(hDlg,IDC_FIRSTBLOCK,CB_GETCURSEL,0,0); + bBuf[1]|=(bTmp&0x0F); + + memcpy(bPRGROM+GetMapAddress(GETADDRESS_CURRENT_EDITTING),bBuf,2); + + iNewAttr=SendDlgItemMessage(hDlg,IDC_MAPATTR,CB_GETCURSEL,0,0); + + ChangeRoomAttribute(GetRoomID(),iNewAttr&0x03); + + //途中から + if(!rm_IsSubRoom()) + { + BYTE bTmp; + BYTE bMask=0xF0; + BYTE bSel; + ADDRESSDATA adRestartPageAddress; + + //memcpy(&adRestartPageAddress.byte.bLower,bPRGROM+RESTART_PAGE_ADDRESS,2); + ADDRESSDATA_LOAD(adRestartPageAddress,RESTART_PAGE_ADDRESS); + + bSel=(BYTE)SendDlgItemMessage(hDlg,IDC_PAGE,CB_GETCURSEL,0,0); + bSel<<=(!(g_iArea&0x01))*4; + bMask>>=(!(g_iArea&0x01))*4; + bTmp=bPRGROM[ADDRESSDATA_GET(adRestartPageAddress)+g_iWorld*2+((g_iArea>>1)&0x01)]; + + bTmp&=bMask; + bTmp|=bSel; + + if(g_iWorld>=0 && g_iWorld>1)&0x01)]=bTmp; + } + +// gblDataChanged = TRUE; + fr_SetDataChanged(TRUE); + + UpdateObjectList(0); + //RefreshWindowTitle(); + UpdateObjectView(0); + UpdateStatusBarRoomInfoText(NULL); + } + case IDCANCEL: + EndDialog(hDlg, TRUE); + return TRUE; + } + } + return FALSE; +} + + + +/********************** + + +***********************/ + +static void ResizeListView(HWND hwndListView, HWND hwndParent) +{ + RECT rc; + + GetClientRect(hwndParent, &rc); + + MoveWindow(hwndListView,rc.left,rc.top,rc.right - rc.left,rc.bottom - rc.top,TRUE); +} + + +static HWND CreateListView(HWND hwndParent) +{ + HWND hwndListView; + BOOL bSuccess = TRUE; + + hwndListView = CreateWindowEx(0, // ex style + WC_LISTVIEW, // class name - defined in commctrl.h + "", // dummy text + WS_TABSTOP | WS_CHILD | WS_VISIBLE | + LVS_AUTOARRANGE | LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SINGLESEL, // style + 0, // x position + 0, // y position + 0, // width + 0, // height + hwndParent, // parent + (HMENU)IDW_LISTVIEW, // ID + GetModuleHandle(NULL), // instance + NULL); // no extra data + + if(!hwndListView) return NULL; + + +// if(IsCommonControlSupported(COMCTRL_V470)) +// ListView_SetExtendedListViewStyle(hwndListView,LVS_EX_FULLROWSELECT); + + + ResizeListView(hwndListView, hwndParent); + + + return hwndListView; +} + +#define LISTVIEW_COLUMNS 4 + +static void LoadListViewColumnWidth(int *piWidth) +{ + int n; + DWORD dwWidth; + LPTSTR lpRegKey[LISTVIEW_COLUMNS]={INI_OBJECTLIST_COLUMNWIDTH0, + INI_OBJECTLIST_COLUMNWIDTH1, + INI_OBJECTLIST_COLUMNWIDTH2, + INI_OBJECTLIST_COLUMNWIDTH3}; + for(n=0;n<4;n++){ + if(ReadFromRegistry(lpRegKey[n],REG_DWORD,&dwWidth,sizeof(DWORD))){ + piWidth[n]=dwWidth; + } + } + +} + +static BOOL InitListView(HWND hwndListView) +{ + LV_COLUMN lvColumn; + int i; + TCHAR szString[LISTVIEW_COLUMNS][20] = {STRING_OBJLIST_COLUMN_BIN, + STRING_OBJLIST_COLUMN_PAGE, + STRING_OBJLIST_COLUMN_POS, + STRING_OBJLIST_COLUMN_TYPE}; + int iWidth[LISTVIEW_COLUMNS]={50,45,55,200}; + + //empty the list + ListView_DeleteAllItems(hwndListView); + + // + LoadListViewColumnWidth(iWidth); + + //initialize the columns + lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; + lvColumn.fmt = LVCFMT_LEFT; + + for(i=0;icode) + { + case NM_RDBLCLK: + case NM_DBLCLK: + case NM_RETURN: + { + int iRet; + iRet = ListView_GetNextItem(g_hWndListView,-1,LVNI_SELECTED); + if(iRet == -1) break; + iRet = GetSelectedIndex(); + if(GetMapEditMode()) + DialogBox(GetModuleHandle(NULL),"BADGUYSCOMEDITDLG",hWnd,BadGuysComEditDlgProc); + else + DialogBox(GetModuleHandle(NULL),"MAPCOMEDITDLG",hWnd,MapComEditDlgProc); + + } + break; + case NM_RCLICK: + if(!gblIsROMLoaded) break; + DialogBox(GetModuleHandle(NULL),"SENDOBJECTDLG",hWnd,SendObjectDlgProc); + break; + case NM_CLICK: + case LVN_KEYDOWN: + { + PostMessage(hWnd,WM_LVSELCHANGE,0,0); + } + break; + case NM_SETFOCUS: +// case NM_KILLFOCUS: + { + if(gblIsROMLoaded){ + // set a scroll bar ensureing cursole is visible + ListView_EnsureVisible(g_hWndListView,GetSelectedIndex(),FALSE); + } + } + break; + } + } + break; + case WM_SETFOCUS: + //キーボードフォーカスをリストボックスへ + SetFocus(g_hWndListView); + break; + case WM_CREATE: + { + g_hWndListView=CreateListView(hWnd); + InitListView(g_hWndListView); + //DisableIME + ImmAssociateContext(g_hWndListView, (HIMC)NULL); + UpdateObjectList(0); + return 0; + } + case WM_DESTROY: + { + SaveListViewColumnWidth(); + DestroyWindow(g_hWndListView); + g_hWndListView=NULL; + } + break; + case WM_SYSCOMMAND: + { + if(wParam==SC_CLOSE) return 0; + } + break; + default: + return DefMDIChildProc (hWnd, message, wParam, lParam); + } + return DefMDIChildProc (hWnd, message, wParam, lParam); +} /* MainWndProc */ + +#define MAPEDITWNDCLASSNAME "MAPEDITWND" + +BOOL RegisterMapEditWndClass(HINSTANCE hInstance) +{ + WNDCLASS wc; + #define CBWNDEXTRA 12 + wc.style = CS_HREDRAW | CS_VREDRAW | CS_NOCLOSE; + wc.lpfnWndProc = MapEditWndProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = CBWNDEXTRA; + wc.hInstance = hInstance; + wc.hIcon = LoadIcon( hInstance, "MAPLISTICON" ); + wc.hCursor = LoadCursor( NULL, IDC_ARROW ); + wc.hbrBackground = (HBRUSH) (COLOR_WINDOW+1); + wc.lpszMenuName = NULL; + wc.lpszClassName = MAPEDITWNDCLASSNAME; + + if(!RegisterClass(&wc))return FALSE; + + return TRUE; +} + +HWND CreateMapEditWnd(HINSTANCE hInstance,HWND hWndMDIClient) +{ + HWND hWnd; + + //WS_VISIBLEを指定して作成しないと、Windowメニューにウインドウが追加されない。 + hWnd=CreateMDIWindow(MAPEDITWNDCLASSNAME, + STRING_WINDOW_OBJLIST, + WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN|WS_VISIBLE, + 90,//CW_USEDEFAULT, + 60,//CW_USEDEFAULT, + GetSystemMetrics(SM_CXSCREEN)/2, + GetSystemMetrics(SM_CYSCREEN)/2, + hWndMDIClient,// + hInstance, + 0); + return hWnd; +} \ No newline at end of file diff --git a/src/objlist.h b/src/objlist.h new file mode 100644 index 0000000..5e30297 --- /dev/null +++ b/src/objlist.h @@ -0,0 +1,40 @@ +/************************************************************************************ + + smb Utility + + File: objlist.h + Description: + History: + + ************************************************************************************/ +#ifndef OBJLIST_H +#define OBJLIST_H + +/******************** + + マップエディト関数 + +*********************/ +void InitMapEditGlobalValue(); + +LRESULT CALLBACK MapComEditDlgProc( HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam); +LRESULT CALLBACK BadGuysComEditDlgProc( HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam); +LRESULT CALLBACK MapComHeadEditDlgProc( HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam); + +// +void FormatMapString(LPBYTE lpbBuf,LPTSTR lpszBuf); +void FormatBadGuysString(LPBYTE lpbBuf,LPTSTR lpszBuf); + +// +void ObjectListSetCursor(int iIndex); +void ObjectListClear(); +void ObjectListShowCursor(); +void UpdateObjectList(); + +HWND CreateMapEditWnd(HINSTANCE hInstance,HWND hWndMDIClient); +BOOL RegisterMapEditWndClass(HINSTANCE hInstance); + + +int GetHalfPointPage(int w,int a); + +#endif /* OBJLIST_H */ \ No newline at end of file diff --git a/src/objmng.c b/src/objmng.c new file mode 100644 index 0000000..36622a4 --- /dev/null +++ b/src/objmng.c @@ -0,0 +1,97 @@ +/************************************************************************************ + + smb Utility + + File: objmng.c + Description: + History: + + ************************************************************************************/ +#include "smbutil.h" +#include "roommng.h" +#include "objlib.h" +#include "objmng.h" +//現在エディトしているオブジェクトの種類を保存している +//0はマップ、 1は敵を示す。 +int giEditMode = 0; +//現在エディトしているオブジェクトのインデックスを保存 +int giSelectedItem = 0; + +void SetSelectedItem(int iItem,BOOL blInitKeyUndo) +{ + if(giSelectedItem==iItem || iItem<0) return; + + giSelectedItem=iItem; + + // + if(blInitKeyUndo) + g_blKeyCommandUndo=TRUE; +} + +/******************************************** + + エデイットの対象(マップ<->敵)を切り替える + + iMode CHANGEEDITMODE_SWITCHING … 現在のモードとは逆のモードにする(敵→マップ、マップ→敵) + CHANGEEDITMODE_MAP … マップ + CHANGEEDITMODE_BADGUYS … 敵 + CHANGEEDITMODE_BADGUYS … モードの変更無し +**********************************************/ +void ChangeMapEditMode(int iMode, BOOL blInitSelect) +{ + int iPage; + BYTE bBuf[3]={0}; + GETINDEXINFO gii = {0}; + + if(iMode == CHANGEEDITMODE_SWITCHING) + giEditMode = (giEditMode) ? EDITMODE_MAP : EDITMODE_BADGUYS; + else if(iMode == CHANGEEDITMODE_MAP || CHANGEEDITMODE_BADGUYS == 1) + giEditMode = iMode; + + if(!gblIsROMLoaded) return; + + //新しいインデックスの設定 + if(blInitSelect){ + //giSelectedItem=0;//初期化 + SetSelectedItem(0,TRUE); + } + else{ + if(giEditMode == CHANGEEDITMODE_BADGUYS){//敵への切り替えーマップで選択されていたページを選択 + int iNewIndex; + if(GETDATAINDEX_ERROR_NOTFOUND != GetMapData(GETADDRESS_CURRENT_EDITTING,giSelectedItem,NULL,&iPage)){ + iNewIndex = GetBadGuysDataIndex(GETADDRESS_CURRENT_EDITTING, NULL, iPage, TRUE); + if(iNewIndex == GETDATAINDEX_ERROR_NOTFOUND){ + gii.dwFlag = GETINDEX_FLAG_END; + iNewIndex = GetBadGuysDataIndex(GETADDRESS_CURRENT_EDITTING, &gii, iPage, TRUE); + } + //giSelectedItem=iNewIndex; + SetSelectedItem(iNewIndex,TRUE); + } + } + else{ + int iNewIndex; + if(GETDATAINDEX_ERROR_NOTFOUND != GetBadGuysData(GETADDRESS_CURRENT_EDITTING,giSelectedItem,NULL,&iPage)){ + iNewIndex = GetMapDataIndex(GETADDRESS_CURRENT_EDITTING,NULL,iPage,TRUE); + if(iNewIndex == GETDATAINDEX_ERROR_NOTFOUND){ + gii.dwFlag = GETINDEX_FLAG_END; + iNewIndex = GetMapDataIndex(GETADDRESS_CURRENT_EDITTING,&gii,iPage,TRUE); + } + //giSelectedItem=iNewIndex; + SetSelectedItem(iNewIndex,TRUE); + } + } + } +} + +/*************************************** +EDITMODE_MAP=Map EDITMODE_BADGUYS=Bad Guys +****************************************/ +int GetMapEditMode() +{ + return giEditMode; +} + +int GetSelectedIndex() +{ + return giSelectedItem; +} diff --git a/src/objmng.h b/src/objmng.h new file mode 100644 index 0000000..16c0d5a --- /dev/null +++ b/src/objmng.h @@ -0,0 +1,31 @@ +/************************************************************************************ + + smb Utility + + File: objmng.h + Description: + History: + + ************************************************************************************/ +#ifndef OBJ_MNG +#define OBJ_MNG + +#define INVALID_OBJECT_INDEX -1 + +#define CHANGEEDITMODE_ASITIS -2 +#define CHANGEEDITMODE_SWITCHING -1 +#define CHANGEEDITMODE_MAP 0 +#define CHANGEEDITMODE_BADGUYS 1 + +void ChangeMapEditMode(int,BOOL); +// +void SetSelectedItem(int,BOOL); +// +#define EDITMODE_MAP 0 +#define EDITMODE_BADGUYS 1 +//0=Map 1=Bad Guys +int GetMapEditMode(); +// +int GetSelectedIndex(); + +#endif \ No newline at end of file diff --git a/src/objview.c b/src/objview.c new file mode 100644 index 0000000..638dd1c --- /dev/null +++ b/src/objview.c @@ -0,0 +1,1591 @@ +/************************************************************************************ + + smb Utility + + File: objview.c + Description: + History: + + ************************************************************************************/ +#include "smbutil.h" +#include "objview.h" +#include "emulator.h" +#include "emuutil.h" +#include "roommng.h" +#include "objlib.h" +#include "objmng.h" +#include "objlist.h" +#include "ini.h" +#include "objviewbmp.h" +#include "objwndcmn.h" +#include "keys.h" + +#define ID_OBJVIEW_OBJSELECT_BASE 8000 + +#define MAPVIEWWNDCLASSNAME "MAPVIEWWND" +#define IDW_YPOSWINDOW 1000 +#define IDW_XPOSWINDOW 1001 +#define IDW_REWVPAGEWINDOW 6000 +#define IDW_FWDPAGEWINDOW 6001 +#define OBJVIEW_CHARACTER_WIDTH 16 +#define CHARCTERS_PER_PAGE 16 +#define OBJVIEW_COLOR_BADGUYS_INACTIVE RGB(0,127,127) +#define OBJVIEW_COLOR_BADGUYS_ACTIVE RGB(0,255,255) +#define OBJVIEW_COLOR_MAP_INACTIVE RGB(0,127,0) +#define OBJVIEW_COLOR_MAP_ACTIVE RGB(0,255,0) + +#define TOP_16PIXEL 16 +#define LABEL_FONTSIZE 8 +#define LABEL_WHITESPACE 12 +#define YPOSLABEL_WIDTH 21 +#define XPOSLABEL_HEIGHT 19 +#define XPOSLABEL_WIDTH OBJVIEW_CHARACTER_WIDTH*CHARCTERS_PER_PAGE +#define MAPVIEW_CLIENTHEIGHT (OBJVIEW_CHARACTER_WIDTH*17) +#define MAPVIEW_WINDOWHEIGHT (MAPVIEW_CLIENTHEIGHT+XPOSLABEL_HEIGHT+GetSystemMetrics(SM_CYCAPTION)+GetSystemMetrics(SM_CYSIZEFRAME)*2) +#define MAPVIEW_VISIBLEHEIGHT (OBJVIEW_CHARACTER_WIDTH*14) +#define ONE_PAGE_SIZE (NES_SCREENSIZEX+GetSystemMetrics(SM_CXSIZEFRAME)*2-1+YPOSLABEL_WIDTH) + +#define OBJVIEW_BADGUYSHARD_RECTWIDTH 8 + +extern BOOL MapEditCommand(WORD wCommand); + +HWND ghMapViewWnd=NULL; +HWND ghToolTip=NULL; +HWND ghYPosWnd=NULL; +HDC ghMemdcYPos=NULL; +HBITMAP ghBitmapYPos=NULL; +HBITMAP ghPrevBitmapYPos=NULL; +HWND ghXPosWnd=NULL; +HDC ghMemdcXPos=NULL; +HBITMAP ghBitmapXPos=NULL; +HBITMAP ghPrevBitmapXPos=NULL; +HWND ghRPBtnWnd=NULL; +HWND ghFPBtnWnd=NULL; +HDC ghMemdcMapViewWnd=NULL; +HBITMAP ghBitmapMapViewWnd=NULL; +HBITMAP ghPrevBitmapMapViewWnd=NULL; +int giCursorX=-1; +int giCursorY=-1; +//マップビューの左端に表示されているマップのページ +int giMapViewPageBase=0; +//マップビューの左端を0ページとしたときのカーソルのあるページ +int giMapViewEditPage=0; +//カーソルのあるマップのページ +int giMapViewPage=0; +//ウインドウで表示可能なページ数(0起算) +int giWndPages; +// +int g_iCursoleEnable=0; + +BOOL g_blIsXPosLineDraw = FALSE; +BOOL g_blIsYPosLineDraw = FALSE; + +BOOL g_fNotDrawAssistBmp = FALSE; + +//BOOL g_fNoObjSelectPopup = FALSE; + +/***************************** + + +******************************/ +LRESULT CALLBACK ObjectViewOptionDlgProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam) +{ + switch (message) + { + case WM_INITDIALOG: + { + BOOL fCheck; + LPPROPSHEETPAGE lpPropPage=(LPPROPSHEETPAGE)lParam; + + if(lpPropPage->lParam) + CenterPropatySheet(hDlg); + + fCheck = g_fNotDrawAssistBmp ? BST_CHECKED : BST_UNCHECKED; + CheckDlgButton(hDlg, IDC_NOTDRAWASSISTBMP, fCheck); + +// fCheck = g_fNoObjSelectPopup ? BST_CHECKED : BST_UNCHECKED; +// CheckDlgButton(hDlg, IDC_NOOBJSELECTPOPUP, fCheck); + } + break; + case WM_NOTIFY: + { + LPNMHDR pnmh = (LPNMHDR) lParam; + switch (pnmh->code) { + case PSN_APPLY: + { + g_fNotDrawAssistBmp = FALSE; + if(BST_CHECKED==IsDlgButtonChecked(hDlg, IDC_NOTDRAWASSISTBMP)) + g_fNotDrawAssistBmp = TRUE; +// g_fNoObjSelectPopup = FALSE; +// if(BST_CHECKED==IsDlgButtonChecked(hDlg, IDC_NOOBJSELECTPOPUP)) +// g_fNoObjSelectPopup = TRUE; + return TRUE; + } + break; + } + } + break; + } + + return FALSE; +} + +DWORD ObjectViewGetSetting() +{ + DWORD dwSetting = 0; + + if (g_fNotDrawAssistBmp) + dwSetting |= OBJVIEWSETTING_NOTDRAWASSISTBMP; + + if (g_blIsXPosLineDraw) + dwSetting |= OBJVIEWSETTING_DRAWXPOSLINE; + + if (g_blIsYPosLineDraw) + dwSetting |= OBJVIEWSETTING_DRAWYPOSLINE; + +// if (g_fNoObjSelectPopup) +// dwSetting |= OBJVIEWSETTING_NOPOPUP; + + return dwSetting; +} + +void ObjectViewSetSetting(DWORD dwSetting) +{ + g_fNotDrawAssistBmp = (dwSetting & OBJVIEWSETTING_NOTDRAWASSISTBMP) ? TRUE : FALSE; + g_blIsXPosLineDraw = (dwSetting & OBJVIEWSETTING_DRAWXPOSLINE) ? TRUE : FALSE; + g_blIsYPosLineDraw = (dwSetting & OBJVIEWSETTING_DRAWYPOSLINE) ? TRUE : FALSE; +// g_fNoObjSelectPopup = (dwSetting & OBJVIEWSETTING_NOPOPUP) ? TRUE : FALSE; +} + +/************************* + + + +**************************/ +void InitMapViewGlobalValue() +{ + giMapViewPage=0; + giCursorX=-1; + giCursorY=-1; + g_iCursoleEnable=0; + giMapViewPage=0; + giMapViewEditPage=0; + giMapViewPageBase=0; +} + +/************************* + + + +**************************/ +static void RefreshMapViewWindowTitle() +{ + TCHAR cWndTitle[50]; + TCHAR cCurWndTitle[50]; + + if(!ghMapViewWnd) return; + + if(gblIsROMLoaded) + { + GetWindowText(ghMapViewWnd, cCurWndTitle, 49); + if(giWndPages) + wsprintf(cWndTitle, STRING_OBJVIEW_TITLE2, STRING_WINDOW_OBJVIEW, giMapViewPageBase, giMapViewPageBase+giWndPages); + else + wsprintf(cWndTitle, STRING_OBJVIEW_TITLE, STRING_WINDOW_OBJVIEW, giMapViewPageBase); + if(lstrcmp(cCurWndTitle, cWndTitle)) + SetWindowText(ghMapViewWnd,cWndTitle); + } + else + SetWindowText(ghMapViewWnd, STRING_WINDOW_OBJVIEW); +} + +/*********************** + + + +************************/ +int ShowMapViewCursole(BOOL blShow) +{ + if(blShow){ + g_iCursoleEnable++; + if(g_iCursoleEnable>0) g_iCursoleEnable=0; + } + else{ + g_iCursoleEnable--; + } + return g_iCursoleEnable; +} + +static BOOL IsMapViewCursoleVisible() +{ + BOOL blRet; + + blRet=(g_iCursoleEnable<0)?FALSE:TRUE; + + return blRet; +} + +void EnsureMapViewCursoleVisible() +{ + g_iCursoleEnable=0; +} + +static void SetMapViewPage(int iPage) +{ + giMapViewPage=iPage; +} + +static void SetMapViewPageBase(int iPage) +{ + giMapViewEditPage=0; + giMapViewPageBase=giMapViewPage=iPage; + +} + +static void SetMapViewCursor(int iCursorX,int iCursorY) +{ + if(iCursorX<0) + { + iCursorX=0x10+iCursorX; + if(giMapViewPage>0) giMapViewPage--; + } + giCursorX=iCursorX; + giCursorY=iCursorY; +} + +BOOL ShadeRect( HDC hDC, int x,int y, COLORREF crHighlightColor ) +{ + + COLORREF crOldBkColor, crOldTextColor; + HBRUSH hBrush, hOldBrush; + HBITMAP hBitmap, hBrushBitmap, hOldMemBitmap; + int OldBkMode, nWidth, nHeight; + HDC hMemDC; + RECT rcRect = { 0, 0, 0, 0},rcDstRect; + // The bitmap bits are for a monochrome "every-other-pixel" + // bitmap (for a pattern brush) + WORD Bits[8] = { 0x0055, 0x00aa, 0x0055, 0x00aa, + 0x0055, 0x00aa, 0x0055, 0x00aa }; + + // The Width and Height of the target area + SetRect(&rcDstRect,x,y,x+OBJVIEW_CHARACTER_WIDTH,y+OBJVIEW_CHARACTER_WIDTH); + nWidth = OBJVIEW_CHARACTER_WIDTH + 1; + nHeight = OBJVIEW_CHARACTER_WIDTH + 1; + + // Need a pattern bitmap + hBrushBitmap = CreateBitmap( 8, 8, 1, 1, &Bits ); + // Need to store the original image + hBitmap = CreateCompatibleBitmap( hDC, nWidth, nHeight ); + // Need a memory DC to work in + hMemDC = CreateCompatibleDC( hDC ); + // Create the pattern brush + hBrush = CreatePatternBrush( hBrushBitmap ); + + // Has anything failed so far? If so, abort! + if( (hBrushBitmap==NULL) || (hBitmap==NULL) || + (hMemDC==NULL) || (hBrush==NULL) ) + { + if( hBrushBitmap != NULL ) DeleteObject(hBrushBitmap); + if( hBitmap != NULL ) DeleteObject( hBitmap ); + if( hMemDC != NULL ) DeleteDC( hMemDC ); + if( hBrush != NULL ) DeleteObject( hBrush ); + return FALSE; + } + + // Select the bitmap into the memory DC + hOldMemBitmap = (HBITMAP)SelectObject( hMemDC, hBitmap ); + + // How wide/tall is the original? + rcRect.right = nWidth; + rcRect.bottom = nHeight; + + // Lay down the pattern in the memory DC + FillRect( hMemDC, &rcRect, hBrush ); + + // Fill in the non-color pixels with the original image + BitBlt( hMemDC, 0, 0, nWidth, nHeight, hDC, + x, y, SRCAND ); + + // Set the color scheme + crOldTextColor = SetTextColor( hDC, crHighlightColor ); + crOldBkColor = SetBkColor( hDC, RGB(0,0,0) ); + OldBkMode=SetBkMode( hDC, OPAQUE ); + + // Select the pattern brush + hOldBrush = (HBRUSH)SelectObject( hDC, hBrush ); + // Fill in the color pixels, and set the others to black + FillRect( hDC, &rcDstRect, hBrush ); + // Fill in the black ones with the original image + BitBlt( hDC, x, y, nWidth, nHeight, + hMemDC, 0, 0, SRCPAINT ); + + // Restore target DC settings + SetBkMode( hDC, OldBkMode ); + SetBkColor( hDC, crOldBkColor ); + SetTextColor( hDC, crOldTextColor ); + + // Clean up + SelectObject( hMemDC, hOldMemBitmap ); + DeleteObject( hBitmap ); + DeleteDC( hMemDC ); + DeleteObject( hBrushBitmap ); + SelectObject( hDC, hOldBrush ); + DeleteObject( hBrush ); + + return TRUE; +} + +static void DrawMapViewCursor(int iMode) +{ + HDC hdc; + int x,y; + COLORREF crColor; + + if(!gblIsROMLoaded) return; + + y=XPOSLABEL_HEIGHT+TOP_16PIXEL+giCursorY*16; + x=YPOSLABEL_WIDTH+giCursorX*16+giMapViewEditPage*256; + crColor=(!iMode)?OBJVIEW_COLOR_MAP_ACTIVE:OBJVIEW_COLOR_BADGUYS_ACTIVE; + + if(hdc=GetDC(ghMapViewWnd)){ + ShadeRect(hdc,x,y,crColor); + ReleaseDC(ghMapViewWnd,hdc); + } +} + +/********************* + + + +**********************/ +static void DrawPosLines() +{ +#define POSLINE_COLOR_NORMAL COLOR_3DLIGHT +#define POSLINE_COLOR_PAGE COLOR_HIGHLIGHT +#define POSLINE_WIDTH 1 + HDC hdc; + RECT rc; + HPEN hPen, hPenPage, hOldPen; + int n,iPrevBkMode,iPrevRop; + COLORREF crPrevBk; + + if(!g_blIsXPosLineDraw && !g_blIsYPosLineDraw) return; + + hPen = CreatePen(PS_SOLID, POSLINE_WIDTH, GetSysColor(POSLINE_COLOR_NORMAL)); + hPenPage = CreatePen(PS_DOT, POSLINE_WIDTH, GetSysColor(POSLINE_COLOR_PAGE)); + + GetClientRect(ghMapViewWnd, &rc); + hdc = ghMemdcMapViewWnd; + + hOldPen = SelectObject(hdc, hPen); + crPrevBk = SetBkColor(hdc, GetSysColor(POSLINE_COLOR_NORMAL)); + iPrevBkMode = SetBkMode(hdc, OPAQUE); + iPrevRop = SetROP2(hdc, R2_COPYPEN); + + if(g_blIsXPosLineDraw){ + int x; + for(x = 15, n = 0;x < rc.right;x += 16, n++){ + if((n&0x0f)!=0x0f){ + MoveToEx(hdc, x ,0, NULL); + LineTo(hdc, x, rc.bottom); + } + else{ + SelectObject(hdc, hPenPage); + MoveToEx(hdc, x, 0, NULL); + LineTo(hdc, x, rc.bottom); + SelectObject(hdc, hPen); + } + } + } + + if(g_blIsYPosLineDraw){ + int y; + for(y = 15;y < rc.bottom;y += 16){ + MoveToEx(hdc, 0, y, NULL); + LineTo(hdc,rc.right,y); + } + } + + // restore dc + SelectObject(hdc, hOldPen); + SetBkColor(hdc, crPrevBk); + SetBkMode(hdc, iPrevBkMode); + SetROP2(hdc, iPrevRop); + // delete objet + DeleteObject(hPen); + DeleteObject(hPenPage); + +} + +/********************* + + + +**********************/ +static void SetColorToGauge(HDC hdc) +{ +#define GAUGE_COLORS 2 + RGBQUAD rgbCol[GAUGE_COLORS]; + int iSysColor[GAUGE_COLORS]={COLOR_WINDOW, COLOR_WINDOWTEXT}; + DWORD dwColor; + int n; + + for(n=0;n= 0) ? (ObjSeek.dwPage - giMapViewPageBase) * 256 : 0; + x = GetMapXPos(ObjSeek.pbData) * 16 + uBaseX; + y = TOP_16PIXEL + GetMapYPos(ObjSeek.pbData) * 16; + + ShadeRect(ghMemdcMapViewWnd,x,y,OBJVIEW_COLOR_MAP_INACTIVE); + + if (!g_fNotDrawAssistBmp) + DrawMapAssistBmpData(&ObjSeek, ghMemdcMapViewWnd, x, y); + + FormatMapString(ObjSeek.pbData, lpText); + lpText2 = GetTempStringBuffer2(); + if (tx != x || ty != y) + wsprintf(lpText2, STRING_OBJVIEW_TOOLTIP, ObjSeek.dwPage, (x - uBaseX) / OBJVIEW_CHARACTER_WIDTH, y / OBJVIEW_CHARACTER_WIDTH - 1, lpText); + else + lpText2 = lpText; + AddToolToObjectViewToolTip(XPOSLABEL_HEIGHT+x,YPOSLABEL_WIDTH+y,lpText2,id++); + + tx = x; + ty = y; + } + if(!MapSeekNext(&ObjSeek)) break; + } + } + } + else{ + if(BadGuysSeekFirst(&ObjSeek,GETADDRESS_CURRENT_EDITTING)){ + for(;;){ + if((DWORD)giMapViewPageBase<=ObjSeek.dwPage && ObjSeek.dwPage<=(DWORD)giMapViewPageBase+(DWORD)giWndPages+1){// + uBaseX = (ObjSeek.dwPage - giMapViewPageBase >= 0) ? (ObjSeek.dwPage - giMapViewPageBase) * 256 : 0; + x=GetBadGuysXPos(ObjSeek.pbData)*16 + uBaseX; + y=TOP_16PIXEL+(GetBadGuysYPos(ObjSeek.pbData))*16; + + if (BadGuysIsHardObject(ObjSeek.pbData)){ + SetRect(&rcInv, x, y, x + OBJVIEW_BADGUYSHARD_RECTWIDTH, y + OBJVIEW_CHARACTER_WIDTH); + InvertRect(ghMemdcMapViewWnd, &rcInv); + } + + ShadeRect(ghMemdcMapViewWnd,x,y,OBJVIEW_COLOR_BADGUYS_INACTIVE); + + if (!g_fNotDrawAssistBmp) + DrawBadguysAssistBmpData(&ObjSeek, ghMemdcMapViewWnd, x, y); + + + FormatBadGuysString(ObjSeek.pbData,lpText); + lpText2 = GetTempStringBuffer2(); + if (tx != x || ty != y) + wsprintf(lpText2, STRING_OBJVIEW_TOOLTIP, ObjSeek.dwPage, (x - uBaseX) / OBJVIEW_CHARACTER_WIDTH, y / OBJVIEW_CHARACTER_WIDTH - 1, lpText); + else + lpText2 = lpText; + AddToolToObjectViewToolTip(XPOSLABEL_HEIGHT+x,YPOSLABEL_WIDTH+y,lpText2,id++); + + // + tx = x; + ty = y; + } + if(!BadGuysSeekNext(&ObjSeek)) break; + } + } + } + +} + +BOOL DrawHalfPageMark() +{ + int halfpage,uBaseX; + ASSISTBMPDATA ABD = {0}; + + if(rm_IsSubRoom()) return FALSE; + + halfpage = GetHalfPointPage(rm_GetWorld(),rm_GetArea()); + + if(giMapViewPageBase>halfpage + || giMapViewPageBase + giWndPages < halfpage) + return FALSE; + + uBaseX = (halfpage - giMapViewPageBase) * 256; + + // + ABD.iBmpIndex = 3; + ABD.iPosDeltaX = + ABD.iPosDeltaY = 0; + + BitBltAssistBmp(ghMemdcMapViewWnd, &ABD, uBaseX, 0); + + return TRUE; +} + + +/************************************** + + バックバッファからの転送と補助の描画 + +***************************************/ + +static void RedrawMapViewWnd() +{ + HDC hdc; + + if(!ghMemdcMapViewWnd || !ghMapViewWnd) return; + + hdc=GetDC(ghMapViewWnd); + BitBlt(hdc,YPOSLABEL_WIDTH,XPOSLABEL_HEIGHT,GetSystemMetrics(SM_CXSCREEN),MAPVIEW_CLIENTHEIGHT,ghMemdcMapViewWnd,0,0,SRCCOPY); + ReleaseDC(ghMapViewWnd,hdc); + + if(IsMapViewCursoleVisible()) + DrawMapViewCursor(GetMapEditMode()); +} + + +void ClearObjectViewBackBuffer() +{ + RECT rc; + + rc.top=rc.left=0; + rc.right=GetSystemMetrics(SM_CXSCREEN); + rc.bottom=MAPVIEW_CLIENTHEIGHT; + + if(ghMemdcMapViewWnd) FillRect(ghMemdcMapViewWnd,&rc,GetSysColorBrush(COLOR_WINDOW)); +} + +static void ClearMapViewBackBufferSpecialObjectArea(int iPage) +{ + RECT rc; + + rc.top=0; + rc.left=0; + rc.right=iPage*NES_SCREENSIZEX; + rc.bottom=MAPVIEW_CLIENTHEIGHT; + + if(ghMemdcMapViewWnd) FillRect(ghMemdcMapViewWnd,&rc,GetSysColorBrush(COLOR_WINDOW)); +} + +void UpdateObjectView(DWORD dwUpdateFlag) +{ + + RECT rcWnd; + int n; + + if(!gblIsROMLoaded || !ghMapViewWnd || !ghMemdcMapViewWnd) return; + + //マップビューウインドウの幅を取得 + GetClientRect(ghMapViewWnd,&rcWnd); + giWndPages=(rcWnd.right-YPOSLABEL_WIDTH)/NES_SCREENSIZEX; + + if(giMapViewPageXPOSLABEL_HEIGHT + && xPos>YPOSLABEL_WIDTH){ + + lpMouseInput->X=xPos; + lpMouseInput->Y=yPos; + //label size + lpMouseInput->Y-=XPOSLABEL_HEIGHT; + lpMouseInput->X-=YPOSLABEL_WIDTH; + //pixel to 16pixel*16pixel box + lpMouseInput->Y/=OBJVIEW_CHARACTER_WIDTH; + lpMouseInput->Y--; + lpMouseInput->X/=OBJVIEW_CHARACTER_WIDTH; + //page + lpMouseInput->Page=giMapViewPageBase+(lpMouseInput->X/CHARCTERS_PER_PAGE); + lpMouseInput->X&=0xF; + + if(lpMouseInput->X>15 || lpMouseInput->Y>15) return FALSE; + + + return TRUE; + } + + return FALSE; +} + +static BOOL ObjviewObjPos2MousePos(LPOBJVIEWMOUSEINPUT lpMouseInput,LPPOINT lpPt) +{ + if(IsBadReadPtr(lpMouseInput,sizeof(OBJVIEWMOUSEINPUT)) + || IsBadReadPtr(lpPt,sizeof(POINT))) + return FALSE; + + // charcters + lpPt->x=CHARCTERS_PER_PAGE*(lpMouseInput->Page-giMapViewPageBase); + if(lpPt->x<0) return FALSE; + lpPt->x+=lpMouseInput->X; + lpPt->y=lpMouseInput->Y+1; + // pixels + lpPt->x*=OBJVIEW_CHARACTER_WIDTH; + lpPt->y*=OBJVIEW_CHARACTER_WIDTH; + lpPt->x+=YPOSLABEL_WIDTH; + lpPt->y+=XPOSLABEL_HEIGHT; + + return TRUE; +} + +static BOOL ObjviewInvertObject(HWND hWnd,LPOBJVIEWMOUSEINPUT lpMouseInput) +{ + RECT rcx,rcy; + int TX,TY,W; + POINT pt; + HDC hdc; + + if(!ObjviewObjPos2MousePos(lpMouseInput,&pt)) + return FALSE; + + W = OBJVIEW_CHARACTER_WIDTH * 3; + TX = (pt.x)?pt.x-OBJVIEW_CHARACTER_WIDTH:0; + TY=(pt.y)?pt.y-OBJVIEW_CHARACTER_WIDTH:0; + + SetRect(&rcx,TX,pt.y,TX+W,pt.y+OBJVIEW_CHARACTER_WIDTH); + SetRect(&rcy,pt.x,TY,pt.x+OBJVIEW_CHARACTER_WIDTH,TY+W); + hdc=GetDC(hWnd); + InvertRect(hdc,&rcx); + InvertRect(hdc,&rcy); + ReleaseDC(hWnd,hdc); + + return TRUE; +} + +long FAR PASCAL MapViewWndProc( HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam ) +{ + static BOOL fObjectIsGrabed = FALSE, fObjViewActive = FALSE; + static OBJVIEWMOUSEINPUT GrabedObject, TestPlayPos; + + switch(message) + { + case WM_COMMAND: + { + switch(LOWORD(wParam)) + { + case IDW_FWDPAGEWINDOW: + { + switch(HIWORD(wParam)) + { + case BN_CLICKED: + SendMessage(hWnd,WM_COMMAND,MAKEWPARAM(IDM_MAPVIEW_NEXTPAGE,0),0); + SetFocus(hWnd); + break; + } + } + break; + case IDW_REWVPAGEWINDOW: + { + switch(HIWORD(wParam)) + { + case BN_CLICKED: + SendMessage(hWnd,WM_COMMAND,MAKEWPARAM(IDM_MAPVIEW_PREVPAGE,0),0); + SetFocus(hWnd); + break; + } + } + break; + case IDM_MAPVIEW_NEXTPAGE: + { + if(!gblIsROMLoaded) break; + MapEditCommand(IDM_EDITCOMMAND_FWDPAGE); + } + break; + case IDM_MAPVIEW_PREVPAGE: + { + if(!gblIsROMLoaded) break; + MapEditCommand(IDM_EDITCOMMAND_REWPAGE); + } + break; + case IDM_MAPVIEW_SHOWEDITDIALOG: + if(!gblIsROMLoaded) break; + if(GetMapEditMode()) + DialogBox(GetModuleHandle(NULL),"BADGUYSCOMEDITDLG",hWnd,BadGuysComEditDlgProc); + else + DialogBox(GetModuleHandle(NULL),"MAPCOMEDITDLG",hWnd,MapComEditDlgProc); + break; + case IDM_MAPVIEW_SENDOBJECT: + { + if(!gblIsROMLoaded) break; + DialogBox(GetModuleHandle(NULL),"SENDOBJECTDLG",hWnd,SendObjectDlgProc); + } + break; + case IDM_MAPVIEW_TESTPLAY: + { + POINT pt; + if(!gblIsROMLoaded) break; + pt.x = TestPlayPos.X * 16; + pt.y = (TestPlayPos.Y + 1) * 16; + RunEmulatorTestPlayEx(TestPlayPos.Page, FALSE, &pt); + + OpenIcon(GetEmuWndHandle()); + SendMessage(GETCLIENTWNDHANDLE(hWnd), WM_MDIACTIVATE, (WPARAM)GetEmuWndHandle(),0); + + } + break; + case IDM_MAPVIEW_SWITCHEDITMODE: + { + if(!gblIsROMLoaded) break; + ObjwndSwitchEditMode(hWnd); + } + break; + case IDW_YPOSWINDOW: + { + if(HIWORD(wParam)==STN_CLICKED){ + g_blIsYPosLineDraw=(g_blIsYPosLineDraw)?FALSE:TRUE; + UpdateObjectView(0); + } + } + break; + case IDW_XPOSWINDOW: + { + if(HIWORD(wParam)==STN_CLICKED){ + g_blIsXPosLineDraw=(g_blIsXPosLineDraw)?FALSE:TRUE; + UpdateObjectView(0); + } + } + break; + } + } + break; + case WM_MBUTTONDOWN: + { + //ObjwndSwitchEditMode(hWnd); + } + break; + case WM_INITMENU: + { + HMENU hMenuInit = (HMENU)wParam; + + if(!gblIsROMLoaded){ + EnableMenuItem(hMenuInit,IDM_MAPVIEW_NEXTPAGE,MF_BYCOMMAND|MF_GRAYED); + EnableMenuItem(hMenuInit,IDM_MAPVIEW_PREVPAGE,MF_BYCOMMAND|MF_GRAYED); + EnableMenuItem(hMenuInit,IDM_MAPVIEW_SENDOBJECT,MF_BYCOMMAND|MF_GRAYED); + EnableMenuItem(hMenuInit,IDM_MAPVIEW_SHOWEDITDIALOG,MF_BYCOMMAND|MF_GRAYED); + EnableMenuItem(hMenuInit,IDM_MAPVIEW_TESTPLAY,MF_BYCOMMAND|MF_GRAYED); + EnableMenuItem(hMenuInit,IDM_MAPVIEW_SWITCHEDITMODE,MF_BYCOMMAND|MF_GRAYED); + } + + if(TestPlayPos.Y > TESTPLAY_SETTINGS_MAXYPOS){ + EnableMenuItem(hMenuInit,IDM_MAPVIEW_TESTPLAY,MF_BYCOMMAND|MF_GRAYED); + } + + if(!rm_IsThereObject()){ + EnableMenuItem(hMenuInit,IDM_MAPVIEW_NEXTPAGE,MF_BYCOMMAND|MF_GRAYED); + EnableMenuItem(hMenuInit,IDM_MAPVIEW_PREVPAGE,MF_BYCOMMAND|MF_GRAYED); + EnableMenuItem(hMenuInit,IDM_MAPVIEW_SENDOBJECT,MF_BYCOMMAND|MF_GRAYED); + EnableMenuItem(hMenuInit,IDM_MAPVIEW_SHOWEDITDIALOG,MF_BYCOMMAND|MF_GRAYED); + } + } + break; + case WM_DRAWITEM: + { + UINT idCtl=(UINT)wParam;//control identifier + LPDRAWITEMSTRUCT lpdis =(LPDRAWITEMSTRUCT)lParam;//item-drawing information + RECT rc; + + GetClientRect(lpdis->hwndItem,&rc); + switch(idCtl) + { + case IDW_YPOSWINDOW: + { + BitBlt(lpdis->hDC,0,0,YPOSLABEL_WIDTH,MAPVIEW_CLIENTHEIGHT,ghMemdcYPos,0,0,SRCCOPY); + } + break; + case IDW_XPOSWINDOW: + { + int n,iPages=rc.right/NES_SCREENSIZEX+1; + for(n=0;nhDC,n*NES_SCREENSIZEX,0,XPOSLABEL_WIDTH,XPOSLABEL_HEIGHT,ghMemdcXPos,0,0,SRCCOPY); + } + break; + } + } + break; + case WM_SIZE: + { + WORD wWidth = LOWORD(lParam); // width of client area + WORD wHeight = HIWORD(lParam); // height of client area + + MoveWindow(ghYPosWnd,0,XPOSLABEL_HEIGHT,YPOSLABEL_WIDTH,wHeight-XPOSLABEL_HEIGHT,TRUE); + MoveWindow(ghXPosWnd,YPOSLABEL_WIDTH,0,wWidth-YPOSLABEL_WIDTH,XPOSLABEL_HEIGHT,TRUE); + + UpdateObjectView(0); + } + break; + case WM_WINDOWPOSCHANGING: + { + LPWINDOWPOS lpwp = (LPWINDOWPOS) lParam; + int iPages=0; + UINT uBasePageSize=ONE_PAGE_SIZE-GetSystemMetrics(SM_CXSIZEFRAME); + if((UINT)lpwp->cx>uBasePageSize) + iPages=(lpwp->cx-(NES_SCREENSIZEX/2))/NES_SCREENSIZEX; + lpwp->cx=ONE_PAGE_SIZE+NES_SCREENSIZEX*iPages-1; + lpwp->cy=MAPVIEW_WINDOWHEIGHT; + return 0; + } + break; + case WM_PAINT: + { + // + HDC hdc = (HDC) wParam; + InstallEmulatorPalette(hdc); + RedrawMapViewWnd(); + } + break; + case WM_KEYUP: + { + ObjectListShowCursor(); + } + break; + case WM_LBUTTONDBLCLK: + if(!gblIsROMLoaded) break; + if(GetMapEditMode()) + DialogBox(GetModuleHandle(NULL),"BADGUYSCOMEDITDLG",hWnd,BadGuysComEditDlgProc); + else + DialogBox(GetModuleHandle(NULL),"MAPCOMEDITDLG",hWnd,MapComEditDlgProc); + break; + case WM_MDIACTIVATE: + { + HWND hwndChildDeact = (HWND) wParam; // child being deactivated +// HWND hwndChildAct = (HWND) lParam; // child being activated + + fObjViewActive = (hwndChildDeact == hWnd) ? FALSE : TRUE; + } + break; + case WM_LBUTTONUP: + if(fObjectIsGrabed && !fObjViewActive){ + ObjviewInvertObject(hWnd,&GrabedObject); + fObjectIsGrabed = FALSE; + ReleaseCapture(); + //ClipCursor(NULL); + } + fObjViewActive = FALSE; + break; + case WM_LBUTTONDOWN: + { + DWORD fwKeys = wParam; // key flags + int iNewIndex; + GETINDEXINFO sGetIndex; + OBJVIEWMOUSEINPUT MouseInput; + BOOL uPopMenuSelected = 0; //ポップアップメニューが  0:非表示、-1:表示→選択なし、それ以外:表示→選択あり + + + if(!gblIsROMLoaded) break; + + if(!ObjviewMousePos2ObjPos(LOWORD(lParam),HIWORD(lParam),&MouseInput)) + break; + // + sGetIndex.dwFlag=GETINDEX_FLAG_XY; + sGetIndex.x=MouseInput.X; + sGetIndex.y=MouseInput.Y; + if(GetMapEditMode()) + iNewIndex=GetBadGuysDataIndex(GETADDRESS_CURRENT_EDITTING,&sGetIndex,MouseInput.Page,FALSE); + else + iNewIndex=GetMapDataIndex(GETADDRESS_CURRENT_EDITTING,&sGetIndex,MouseInput.Page,FALSE); + + if(iNewIndex==GETDATAINDEX_ERROR_NOTFOUND) + break; + + if(iNewIndex==GETDATAINDEX_ERROR_PL){ + BYTE bData[SMB_OBJECT_DATA_MAX_SIZE]; + int N = 0; + LPTSTR szMenuText = GetTempStringBuffer(); + HMENU hSelMenu; + POINT pt; + UINT uMenuFlag; + + if(MK_CONTROL & fwKeys){ + + LONG2POINT(lParam, pt); + + hSelMenu = CreatePopupMenu(); + if (!hSelMenu) break; + + if(!GetMapEditMode()){ + while(N < sGetIndex.nNumSamePos){ + GetMapData(GETADDRESS_CURRENT_EDITTING, sGetIndex.iIndex + N, bData, NULL); + FormatMapString(bData, szMenuText); + uMenuFlag = (sGetIndex.iIndex + N == GetSelectedIndex()) ? MF_BYPOSITION | MF_CHECKED : MF_BYPOSITION; + InsertMenu(hSelMenu, N, uMenuFlag, ID_OBJVIEW_OBJSELECT_BASE + sGetIndex.iIndex + N, szMenuText); + N++; + } + } + else{ + while(N < sGetIndex.nNumSamePos){ + GetBadGuysData(GETADDRESS_CURRENT_EDITTING, sGetIndex.iIndex + N, bData, NULL); + FormatBadGuysString(bData, szMenuText); + uMenuFlag = (sGetIndex.iIndex + N == GetSelectedIndex()) ? MF_BYPOSITION | MF_CHECKED : MF_BYPOSITION; + InsertMenu(hSelMenu, N, uMenuFlag, ID_OBJVIEW_OBJSELECT_BASE + sGetIndex.iIndex + N, szMenuText); + N++; + } + } + ClientToScreen(hWnd, (LPPOINT)&pt); + uPopMenuSelected = TrackPopupMenu (hSelMenu, TPM_RETURNCMD, pt.x, pt.y, 0, hWnd, NULL); + DestroyMenu(hSelMenu); + + if (uPopMenuSelected) { + SetSelectedItem(uPopMenuSelected - ID_OBJVIEW_OBJSELECT_BASE, TRUE); + } + else + uPopMenuSelected = -1; + } + else{ + + SetSelectedItem(sGetIndex.iIndex, TRUE); + } + } + else { + SetSelectedItem(iNewIndex, TRUE);//giSelectedItem=iNewIndex; + } + + if (uPopMenuSelected != -1) { + SetMapViewPage(MouseInput.Page); + SetMapViewCursor(MouseInput.X,MouseInput.Y); + } + + // + UpdateObjectList(1); + ObjectListShowCursor(); + // + UpdateObjectView(0); + + if (!uPopMenuSelected && !fObjViewActive) { + fObjectIsGrabed = TRUE; + CopyMemory(&GrabedObject, &MouseInput, sizeof(OBJVIEWMOUSEINPUT)); + ObjviewInvertObject(hWnd, &GrabedObject); + SetCapture(hWnd); + } + } + break; + case WM_RBUTTONDOWN: + { + RECT rc; + POINT pt; + OBJVIEWMOUSEINPUT MouseInput; + + if(ObjviewMousePos2ObjPos(LOWORD(lParam), HIWORD(lParam), &MouseInput)){ + + CopyMemory(&TestPlayPos, &MouseInput, sizeof(OBJVIEWMOUSEINPUT)); + + /* Draw the "floating" popup in the app's client area */ + GetClientRect (hWnd, (LPRECT)&rc); + + // Temporary porting macro + LONG2POINT(lParam, pt); + if(PtInRect((LPRECT)&rc,pt)) + ShowPopupMenu(hWnd, pt,"MAPVIEW_POPUP"); + } + } + break; + case WM_MOUSEMOVE: + { + MSG msg; + DWORD fwKeys = wParam; // key flags + OBJVIEWMOUSEINPUT MouseInput; + + if(ghToolTip){ + //we need to fill out a message structure and pass it to the tooltip + //with the TTM_RELAYEVENT message + msg.hwnd = hWnd; + msg.message = message; + msg.wParam = wParam; + msg.lParam = lParam; + GetCursorPos(&msg.pt); + msg.time = GetMessageTime(); + SendMessage(ghToolTip, TTM_RELAYEVENT, 0, (LPARAM)&msg); + } + + if((fwKeys&MK_LBUTTON) + && fObjectIsGrabed + && ObjviewMousePos2ObjPos(LOWORD(lParam),HIWORD(lParam),&MouseInput)){ + BOOL blUpdate=FALSE; + if(GrabedObject.Page==MouseInput.Page){ + if(GrabedObject.Y==MouseInput.Y){ + if(GrabedObject.X-1==MouseInput.X){ + if(MapEditCommand(IDM_EDITCOMMAND_LEFT)) + blUpdate=TRUE; + } + else if(GrabedObject.X+1==MouseInput.X){ + if(MapEditCommand(IDM_EDITCOMMAND_RIGHT)) + blUpdate=TRUE; + } + } + else if (GrabedObject.X==MouseInput.X){ + if(GrabedObject.Y+1==MouseInput.Y){ + if(MapEditCommand(IDM_EDITCOMMAND_DOWN)) + blUpdate=TRUE; + } + else if(GrabedObject.Y-1==MouseInput.Y){ + if(MapEditCommand(IDM_EDITCOMMAND_UP)) + blUpdate=TRUE; + } + } + } + else{ + if(GrabedObject.Page-1==MouseInput.Page + && MouseInput.X==15 + && !GrabedObject.X){ + if(MapEditCommand(IDM_EDITCOMMAND_LEFT)) + blUpdate=TRUE; + } + else if(GrabedObject.Page+1==MouseInput.Page + && MouseInput.X==0 + && GrabedObject.X==15){ + if(MapEditCommand(IDM_EDITCOMMAND_RIGHT)) + blUpdate=TRUE; + } + } + if(blUpdate){ + CopyMemory(&GrabedObject, &MouseInput, sizeof(OBJVIEWMOUSEINPUT)); + ObjviewInvertObject(hWnd, &GrabedObject); + } + } + } + break; + case 0x020A:// #define WM_MOUSEWHEEL 0x020A + { + if(!gblIsROMLoaded) break; + + ky_WM_MOUSEWHEEL(wParam, lParam); + } + break; + case WM_CREATE: + { + HDC hdc; + HBITMAP hBmp; + // + ghMapViewWnd=hWnd; + //DisableIME + ImmAssociateContext(hWnd, (HIMC)NULL); + // + hdc=GetDC(hWnd); + ghMemdcMapViewWnd=CreateCompatibleDC(hdc); + ghBitmapMapViewWnd=CreateCompatibleBitmap(hdc,GetSystemMetrics(SM_CXSCREEN),MAPVIEW_CLIENTHEIGHT); + ghPrevBitmapMapViewWnd=SelectObject(ghMemdcMapViewWnd,ghBitmapMapViewWnd); + ReleaseDC(hWnd,hdc); + + ClearObjectViewBackBuffer(); + ghMapViewWnd=hWnd; + + ghYPosWnd=CreateWindowEx(/*WS_EX_STATICEDGE*/0, + "STATIC", + NULL, + WS_CHILD|WS_VISIBLE|SS_OWNERDRAW|SS_NOTIFY, + 0,XPOSLABEL_HEIGHT,YPOSLABEL_WIDTH,0, + hWnd,(HMENU)IDW_YPOSWINDOW, + GetModuleHandle(NULL), + NULL); + PrepareGauge(ghYPosWnd,&ghMemdcYPos,&ghBitmapYPos,YPOSLABEL_WIDTH,MAPVIEW_CLIENTHEIGHT,&ghPrevBitmapYPos); + DrawYPosGauge(); + + ghXPosWnd=CreateWindowEx(/*WS_EX_STATICEDGE*/0, + "STATIC", + NULL, + WS_CHILD|WS_VISIBLE|SS_OWNERDRAW|SS_NOTIFY, + YPOSLABEL_WIDTH,0,0,XPOSLABEL_HEIGHT, + hWnd,(HMENU)IDW_XPOSWINDOW, + GetModuleHandle(NULL), + NULL); + PrepareGauge(ghXPosWnd,&ghMemdcXPos,&ghBitmapXPos,XPOSLABEL_WIDTH,XPOSLABEL_HEIGHT,&ghPrevBitmapXPos); + DrawXPosGauge(); + + ghRPBtnWnd=CreateWindow( + "BUTTON", + "", + WS_CHILD|WS_VISIBLE|BS_BITMAP|BS_CENTER, + 0,0,YPOSLABEL_WIDTH/2,XPOSLABEL_HEIGHT, + hWnd,(HMENU)IDW_REWVPAGEWINDOW, + GetModuleHandle(NULL), + NULL); + hBmp=(HBITMAP)LoadImage(GetModuleHandle(NULL),"LF_IMG",IMAGE_BITMAP,0,0,LR_LOADMAP3DCOLORS); + SendMessage(ghRPBtnWnd,BM_SETIMAGE,(WPARAM)IMAGE_BITMAP,(LPARAM)hBmp); + + ghFPBtnWnd=CreateWindow("BUTTON", + "", + WS_CHILD|WS_VISIBLE|BS_BITMAP|BS_CENTER, + YPOSLABEL_WIDTH/2,0,YPOSLABEL_WIDTH/2,XPOSLABEL_HEIGHT, + hWnd,(HMENU)IDW_FWDPAGEWINDOW, + GetModuleHandle(NULL), + NULL); + hBmp=(HBITMAP)LoadImage(GetModuleHandle(NULL),"RG_IMG",IMAGE_BITMAP,0,0,LR_LOADMAP3DCOLORS); + SendMessage(ghFPBtnWnd,BM_SETIMAGE,(WPARAM)IMAGE_BITMAP,(LPARAM)hBmp); + + ghToolTip=CreateObjectViewTooltip(); + + InitAssistBmp(hWnd); + // + ChangeMapViewScreenSize(2); + UpdateObjectView(0); + + } + break; + case WM_DESTROY: + { + HDC hdc; + HBITMAP hBmp; + + hdc=GetDC(hWnd); + + SelectObject(hdc,ghPrevBitmapMapViewWnd); + DeleteObject(ghBitmapMapViewWnd); + DeleteDC(ghMemdcMapViewWnd); + + ReleaseDC(hWnd,hdc); + + DeleteGauge(ghYPosWnd,&ghMemdcYPos,&ghBitmapYPos,&ghPrevBitmapYPos); + DestroyWindow(ghYPosWnd); + DeleteGauge(ghXPosWnd,&ghMemdcXPos,&ghBitmapXPos,&ghPrevBitmapXPos); + DestroyWindow(ghXPosWnd); + + hBmp=(HBITMAP)SendMessage(ghRPBtnWnd,BM_GETIMAGE,(WPARAM)IMAGE_BITMAP,0); + DeleteObject(hBmp); + DestroyWindow(ghRPBtnWnd); + + hBmp=(HBITMAP)SendMessage(ghFPBtnWnd,BM_GETIMAGE,(WPARAM)IMAGE_BITMAP,0); + DeleteObject(hBmp); + DestroyWindow(ghFPBtnWnd); + + DestroyWindow(ghToolTip); + + TrashAssistBmp(); + } + break; + case WM_SYSCOMMAND: + { + if(wParam == SC_CLOSE) return 0; + } + break; + } + return DefMDIChildProc (hWnd, message, wParam, lParam); +} + + +BOOL RegisterMapViewWndClass(HINSTANCE hInstance) +{ + WNDCLASS wc; + #define CBWNDEXTRA 0//12 + wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS | CS_NOCLOSE; + wc.lpfnWndProc = MapViewWndProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = CBWNDEXTRA; + wc.hInstance = hInstance; + wc.hIcon = LoadIcon( hInstance, "MAPVIEWICON" ); + wc.hCursor = LoadCursor( NULL, IDC_ARROW ); + wc.hbrBackground = (HBRUSH) (COLOR_WINDOW+1); + wc.lpszMenuName = NULL; + wc.lpszClassName = MAPVIEWWNDCLASSNAME; + + if(!RegisterClass(&wc))return FALSE; + + return TRUE; +} + +HWND CreateMapViewWnd(HINSTANCE hInstance,HWND hWndMDIClient) +{ + HWND hWnd; + + //WS_VISIBLEを指定して作成しないと、Windowメニューにウインドウが追加されない。 + hWnd=CreateMDIWindow(MAPVIEWWNDCLASSNAME, + STRING_WINDOW_OBJVIEW, + WS_SYSMENU|WS_MINIMIZEBOX|WS_CAPTION|WS_THICKFRAME|WS_CLIPCHILDREN|WS_VISIBLE, + 60,//CW_USEDEFAULT, + 40,//CW_USEDEFAULT, + GetSystemMetrics(SM_CXSCREEN)/2, + GetSystemMetrics(SM_CYSCREEN)/2, + hWndMDIClient, + hInstance, + 0); + + return hWnd; +} \ No newline at end of file diff --git a/src/objview.h b/src/objview.h new file mode 100644 index 0000000..840608a --- /dev/null +++ b/src/objview.h @@ -0,0 +1,33 @@ +/************************************************************************************ + + smb Utility + + File: objview.h + Description: + History: + + ************************************************************************************/ +#ifndef OBJVIEW_H +#define OBJVIEW_H + +BOOL RegisterMapViewWndClass(HINSTANCE hInstance); +HWND CreateMapViewWnd(HINSTANCE hInstance,HWND hWndMDIClient); +void ClearObjectViewBackBuffer(); +void UpdateObjectView(DWORD dwUpdateFlag); +void SetMapViewCursoleBadGuys(BYTE *pbBuf,int iPage); +void SetMapViewCursoleMap(BYTE *pbBuf,int iPage); +BOOL UpdateObjectViewCursole(); +void EnsureMapViewCursoleVisible(); +void SetObjectViewCursole(int iPage); +void InitMapViewGlobalValue(); +LRESULT CALLBACK ObjectViewOptionDlgProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam); + +#define OBJVIEWSETTING_DEFAULT 0x00000000 +#define OBJVIEWSETTING_NOTDRAWASSISTBMP 1 +#define OBJVIEWSETTING_DRAWXPOSLINE 2 +#define OBJVIEWSETTING_DRAWYPOSLINE 4 +//#define OBJVIEWSETTING_NOPOPUP 8 + +DWORD ObjectViewGetSetting(); +void ObjectViewSetSetting(DWORD); +#endif /* OBJVIEW_H */ \ No newline at end of file diff --git a/src/objviewbmp.c b/src/objviewbmp.c new file mode 100644 index 0000000..a40712d --- /dev/null +++ b/src/objviewbmp.c @@ -0,0 +1,361 @@ +#include "smbutil.h" +#include "objlib.h" +#include "objviewbmp.h" + +#define ASSISTBMP_1BMPWIDTH 16 +#define ASSISTBMP_1BMPHEIGHT 16 +#define ASSISTBMP_NUMBMPSHORIZONTAL 6// +#define ASSISTBMP_NUMBMPSVERTICAL 2// + +#define MAPASSISTBMPDATAINDEX_QBLOCKPOWERMUSH 1 +#define MAPASSISTBMPDATAINDEX_QBLOCKCOIN 2 +#define MAPASSISTBMPDATAINDEX_HIDDENCOIN 3 +#define MAPASSISTBMPDATAINDEX_HIDDEN1UPMUSH 4 +#define MAPASSISTBMPDATAINDEX_BRICKPOWERMUSH 5 +#define MAPASSISTBMPDATAINDEX_BRICKIVY 6 +#define MAPASSISTBMPDATAINDEX_BRICKSTAR 7 +#define MAPASSISTBMPDATAINDEX_BRICK10COINS 8 +#define MAPASSISTBMPDATAINDEX_BRICK1UPMUSH 9 +#define MAPASSISTBMPDATAINDEX_ARROWDOWN 10 + +ASSISTBMPDATA g_MapAssistBmpData[] = { + 0, 0, 0, // ビットマップ無し用のダミーデータ + 0, 0, 6, + 0, 0, 8, + 0, 0, 8, + 0, 0, 7, + 0, 0, 6, + 0, 0, 10, + 0, 0, 11, + 0, 0, 9, + 0, 0, 7, + 8, -16, 1 +}; + +#define BADGUYSASSISTBMPDATAINDEX_FIREBARRIGHT 1 +#define BADGUYSASSISTBMPDATAINDEX_FIREBARRIGHTFAST 2 +#define BADGUYSASSISTBMPDATAINDEX_FIREBARLEFT 3 +#define BADGUYSASSISTBMPDATAINDEX_FIREBARLEFTFAST 4 +#define BADGUYSASSISTBMPDATAINDEX_FIREBARLONG 5 +#define BADGUYSASSISTBMPDATAINDEX_LIFTTOSS 6 +#define BADGUYSASSISTBMPDATAINDEX_LIFTUP 7 +#define BADGUYSASSISTBMPDATAINDEX_LIFTDOWN 8 +#define BADGUYSASSISTBMPDATAINDEX_LIFTROLL 9 +#define BADGUYSASSISTBMPDATAINDEX_LIFTFALL 10 +#define BADGUYSASSISTBMPDATAINDEX_LIFTADVANCE 11 +#define BADGUYSASSISTBMPDATAINDEX_LIFTUPSMALL 12 +#define BADGUYSASSISTBMPDATAINDEX_LIFTDOWNSMALL 13 +#define BADGUYSASSISTBMPDATAINDEX_REDNOKONOKO 14 +#define BADGUYSASSISTBMPDATAINDEX_PATAPATAJUMP 15 +#define BADGUYSASSISTBMPDATAINDEX_PATAPATATOSS 16 +#define BADGUYSASSISTBMPDATAINDEX_PATAPATAROLL 17 +#define BADGUYSASSISTBMPDATAINDEX_CONTINUEOUS 18 +#define BADGUYSASSISTBMPDATAINDEX_NOMOVE 19 + +ASSISTBMPDATA g_BadGuysAssistBmpData[] = { + 0, 0, 0, //補助図形なしのダミーデータ + 0, 0, 12, + 0, 0, 13, + 0, 0, 14, + 0, 0, 15, + 0, 0, 12, + 0, -16, 4, + 0, -16, 0, + 0, -16, 1, + 0, -16, 5, + 0, -16, 1, + 0, -16, 3, + 0, -16, 0, + 0, -16, 1, + 0, -8, 16, + 0, -8, 14, //パタパタ(跳ねる) + 0, -8, 17, + 0, -8, 16, + 0, -8, 14, + 0, 0, 18 +}; + +HDC g_hAssistBmpDC = NULL; +HBITMAP g_hOldBmp = NULL; + +VOID TrashAssistBmp() +{ + if (g_hAssistBmpDC) { + SelectObject(g_hAssistBmpDC, g_hOldBmp); + DeleteDC(g_hAssistBmpDC); + g_hAssistBmpDC = NULL; + } +} + +BOOL InitAssistBmp(HWND hWnd) +{ + HBITMAP hBitmap; +// HBITMAP hOldBm; + BOOL blRet=FALSE; +// BITMAP sBmp; +// DWORD nWidth,nHeight; + HDC hDC; + + hBitmap = LoadImage(GetModuleHandle(NULL), "ASSIST_IMG", IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_SHARED); + if(!hBitmap) return FALSE; +// if(!GetObject(hBitmap,sizeof(BITMAP),&sBmp)) return FALSE; +// nWidth=sBmp.bmWidth; +// nHeight=sBmp.bmHeight; + + hDC = GetDC(hWnd); + if(g_hAssistBmpDC=CreateCompatibleDC(hDC)) + { + if(g_hOldBmp = SelectObject(g_hAssistBmpDC, hBitmap)) + { + blRet=TRUE; + } + } + + ReleaseDC(hWnd, hDC); + + return blRet; +} + + +static int GetMapAssistBmpDataIndex(LPBYTE lpbBuf) +{ + int iRet = 0; + + switch((lpbBuf[0]&0x0f)) + { + case 0x0C: + //wsprintf(lpszBuf, STRING_OBJLIST_LENNAME, (lpbBuf[1] & 0x0F) + 1, smbMapObjectInfoC[(lpbBuf[1] >> 4) & 0x07].Name); + break; + case 0x0D: + if(!(lpbBuf[1]&0x40)){ + //wsprintf(lpszBuf, "%s:%.2d", smbMapObjectInfoD[0].Name, lpbBuf[1] & 0x3F); + } + else{ + if((lpbBuf[1]&0x70)==0x40){ + //wsprintf(lpszBuf, "%s", smbMapObjectInfoD[(lpbBuf[1] & 0x0F) + 1].Name); + } + else{ + //wsprintf(lpszBuf, STRING_OBJLIST_UNKNOWN); + } + } + break; + case 0x0E: + if(lpbBuf[1]&0x40){ + //wsprintf(lpszBuf, STRING_OBJLIST_BACK, smbMapHeadBackColor[lpbBuf[1] & 0x07]); + } + else{ + //wsprintf(lpszBuf, STRING_OBJLIST_VIEWBLOCK, smbMapHeadView[(lpbBuf[1] >> 4) & 0x03], smbMapBasicBlock[lpbBuf[1] & 0x0F].Name); + } + break; + case 0x0F: + { + switch((lpbBuf[1]>>4)&0x07) + { + case 0: + //wsprintf(lpszBuf, STRING_OBJLIST_ROPE); + break; + // オブジェクトのデータベースの都合(1と4,5との間には、追加の要素が1つ入っているため)により、 + // 1と4,5は違う処理 + case 1: +// wsprintf(lpszBuf, STRING_OBJLIST_LENNAME, (lpbBuf[1] & 0x0F) + 1, smbMapObjectInfoF[((lpbBuf[1] >> 4) & 0x07)].Name); + break; + case 4: + case 5: +// wsprintf(lpszBuf, STRING_OBJLIST_LENNAME, (lpbBuf[1] & 0x0F) + 1, smbMapObjectInfoF[((lpbBuf[1] >> 4) & 0x07) + 1].Name); + break; + case 2: + { + BYTE bHeight; + bHeight = lpbBuf[1] & 0x0F; + if(0x00 <= bHeight && bHeight <= 0x0B){ + //wsprintf(lpszBuf, STRING_OBJLIST_LENCASTLE, 0x0B - bHeight + 1); + } + else{ + //wsprintf(lpszBuf, STRING_OBJLIST_CRASH); + } + } + break; + case 3: + if(!((lpbBuf[1]>>3)&0x01)){ + //wsprintf(lpszBuf,STRING_OBJLIST_STEP,(lpbBuf[1]&0x07)+1,(lpbBuf[1]&0x07)+1); + } + else + { + BYTE bLower; + bLower=(lpbBuf[1]&0x07); + if(0<= bLower && bLower <=0x03){ + //wsprintf(lpszBuf, STRING_OBJLIST_STEP98); + } + else if(0x04<= bLower && bLower <=0x06){ + //wsprintf(lpszBuf, STRING_OBJLIST_STEP98_2); + } + else if(0x07==bLower){ + //wsprintf(lpszBuf, STRING_OBJLIST_STEP98_2); + } + } + break; + case 6: + case 7: + //wsprintf(lpszBuf, STRING_OBJLIST_NONE); + break; + } + } + break; + default: + if(!(lpbBuf[1]&0x70)){ + //wsprintf(lpszBuf,"%s",smbMapObjectInfo0B[lpbBuf[1] & 0x0F].Name); + BYTE bType = lpbBuf[1] & 0x0F; + int iItemBlocks[] = { + MAPASSISTBMPDATAINDEX_QBLOCKPOWERMUSH, + MAPASSISTBMPDATAINDEX_QBLOCKCOIN, + MAPASSISTBMPDATAINDEX_HIDDENCOIN, + MAPASSISTBMPDATAINDEX_HIDDEN1UPMUSH, + MAPASSISTBMPDATAINDEX_BRICKPOWERMUSH, + MAPASSISTBMPDATAINDEX_BRICKIVY, + MAPASSISTBMPDATAINDEX_BRICKSTAR, + MAPASSISTBMPDATAINDEX_BRICK10COINS, + MAPASSISTBMPDATAINDEX_BRICK1UPMUSH }; + + if (bType < 0x09) + iRet = iItemBlocks[bType]; + } + else if((lpbBuf[1]&0x70)!=0x70){ + //wsprintf(lpszBuf, STRING_OBJLIST_LENNAME, (lpbBuf[1] & 0x0F) + 1, smbMapObjectInfo0B[0x0F + ((lpbBuf[1] >> 4) & 0x07)].Name); + } + else{ + if(lpbBuf[1]&0x08){//土管 + //wsprintf(lpszBuf, STRING_OBJLIST_LENNAME,(lpbBuf[1] & 0x07) + 1, smbMapObjectInfo0B[0x17].Name); + iRet = MAPASSISTBMPDATAINDEX_ARROWDOWN; + } + else{ + //wsprintf(lpszBuf, STRING_OBJLIST_LENNAME,(lpbBuf[1] & 0x0F) + 1, smbMapObjectInfo0B[0x16].Name); + } + } + break; + }/* switch */ + + return iRet; +} + +void BitBltAssistBmp(HDC hDestMemDC, LPASSISTBMPDATA lpABD, int x, int y) +{ + if (lpABD && hDestMemDC) { + BitBlt(hDestMemDC, + x + lpABD->iPosDeltaX, y + lpABD->iPosDeltaY, + ASSISTBMP_1BMPWIDTH, ASSISTBMP_1BMPHEIGHT, + g_hAssistBmpDC, + (lpABD->iBmpIndex % ASSISTBMP_NUMBMPSHORIZONTAL) * ASSISTBMP_1BMPWIDTH, + (lpABD->iBmpIndex / ASSISTBMP_NUMBMPSHORIZONTAL) * ASSISTBMP_1BMPHEIGHT * 2 + ASSISTBMP_1BMPHEIGHT, + SRCAND); + + BitBlt(hDestMemDC, + x + lpABD->iPosDeltaX, y + lpABD->iPosDeltaY, + ASSISTBMP_1BMPWIDTH, ASSISTBMP_1BMPHEIGHT, + g_hAssistBmpDC, + (lpABD->iBmpIndex % ASSISTBMP_NUMBMPSHORIZONTAL) * ASSISTBMP_1BMPWIDTH, + (lpABD->iBmpIndex / ASSISTBMP_NUMBMPSHORIZONTAL) * ASSISTBMP_1BMPHEIGHT * 2, + SRCPAINT); + } +} + +BOOL DrawMapAssistBmpData(LPOBJECTSEEKINFO lpOSI, HDC hDestMemDC, int x, int y) +{ + int iBmpDataIndex; + + iBmpDataIndex = GetMapAssistBmpDataIndex(lpOSI->pbData); + + if (!iBmpDataIndex) return TRUE; + + BitBltAssistBmp(hDestMemDC, &g_MapAssistBmpData[iBmpDataIndex], x, y); + + return TRUE; +} + + + +static int GetBadGuysAssistBmpDataIndex(LPBYTE lpbBuf) +{ + int iRet = 0; + switch(lpbBuf[0]&0x0F) + { + case 0x0E://ルーム間移動の命令(3バイト) + { +// LPTSTR lpAttr[] = {STRING_SEA, STRING_SKY, STRING_UNDERGROUND, STRING_CASTLE}; +// wsprintf(lpszBuf, STRING_OBJLIST_ROOM, lpbBuf[1] & 0x7F, lpAttr[(lpbBuf[1] >> 5) & 0x03], ((lpbBuf[2] >> 5) & 0x07) + 1,lpbBuf[2] & 0x1F); + } + break; + case 0x0F://送りコマンド(2バイト) +// wsprintf(lpszBuf, STRING_OBJLIST_PAGECOMMAND, lpbBuf[1]); + break; + default://(敵キャラコマンド) + { +// LPSTR bit6[]={"", STRING_OBJLIST_HARD}; +// wsprintf(lpszBuf, "%s%s", smbBudGuysInfo[lpbBuf[1] & 0x3f].Name, bit6[(lpbBuf[1] >> 6) & 0x01]); + BYTE bType = lpbBuf[1] & 0x3F; + int iFireBars[] = { + BADGUYSASSISTBMPDATAINDEX_FIREBARRIGHT, + BADGUYSASSISTBMPDATAINDEX_FIREBARRIGHTFAST, + BADGUYSASSISTBMPDATAINDEX_FIREBARLEFT, + BADGUYSASSISTBMPDATAINDEX_FIREBARLEFTFAST, + BADGUYSASSISTBMPDATAINDEX_FIREBARLONG, + }; + int iLifts[] = { + BADGUYSASSISTBMPDATAINDEX_LIFTTOSS, + BADGUYSASSISTBMPDATAINDEX_LIFTUP, + BADGUYSASSISTBMPDATAINDEX_LIFTDOWN, + BADGUYSASSISTBMPDATAINDEX_LIFTROLL, + BADGUYSASSISTBMPDATAINDEX_LIFTFALL, + BADGUYSASSISTBMPDATAINDEX_LIFTADVANCE, + BADGUYSASSISTBMPDATAINDEX_LIFTUPSMALL, + BADGUYSASSISTBMPDATAINDEX_LIFTDOWNSMALL + }; + + if (0x1B <= bType && bType <=0x1F){//ファイアバー + iRet = iFireBars[bType - 0x1B]; + } + else if(0x25 <= bType && bType <= 0x2C){//リフト + iRet = iLifts[bType - 0x25]; + } + else { + switch(bType) + { + case 0x03: + iRet = BADGUYSASSISTBMPDATAINDEX_REDNOKONOKO; + break; + case 0x0E: + iRet = BADGUYSASSISTBMPDATAINDEX_PATAPATAJUMP; + break; + case 0x0F: + iRet = BADGUYSASSISTBMPDATAINDEX_PATAPATATOSS; + break; + case 0x10: + iRet = BADGUYSASSISTBMPDATAINDEX_PATAPATAROLL; + break; + case 0x14: + case 0x17: + iRet = BADGUYSASSISTBMPDATAINDEX_CONTINUEOUS; + break; + case 0x04: + case 0x09: + case 0x12: + iRet = BADGUYSASSISTBMPDATAINDEX_NOMOVE; + } + } + } + } + return iRet; +} + + +BOOL DrawBadguysAssistBmpData(LPOBJECTSEEKINFO lpOSI, HDC hDestMemDC, int x, int y) +{ + int iBmpDataIndex; + + iBmpDataIndex = GetBadGuysAssistBmpDataIndex(lpOSI->pbData); + + if (!iBmpDataIndex) return TRUE; + + BitBltAssistBmp(hDestMemDC, &g_BadGuysAssistBmpData[iBmpDataIndex], x, y); + + return TRUE; +} diff --git a/src/objviewbmp.h b/src/objviewbmp.h new file mode 100644 index 0000000..6cc1467 --- /dev/null +++ b/src/objviewbmp.h @@ -0,0 +1,20 @@ +#ifndef OBJVIEWBMP_H +#define OBJVIEWBMP_H + + +typedef struct _tagASSISTBMPDATA +{ + int iPosDeltaX; + int iPosDeltaY; + int iBmpIndex; +}ASSISTBMPDATA, FAR *LPASSISTBMPDATA; + + + +VOID TrashAssistBmp(); +BOOL InitAssistBmp(HWND hWnd); +BOOL DrawMapAssistBmpData(LPOBJECTSEEKINFO lpOSI, HDC hDestMemDC, int x, int y); +BOOL DrawBadguysAssistBmpData(LPOBJECTSEEKINFO lpOSI, HDC hDestMemDC, int x, int y); +void BitBltAssistBmp(HDC hDestMemDC, LPASSISTBMPDATA lpABD, int x, int y); + +#endif \ No newline at end of file diff --git a/src/objwndcmn.c b/src/objwndcmn.c new file mode 100644 index 0000000..83d7e74 --- /dev/null +++ b/src/objwndcmn.c @@ -0,0 +1,24 @@ +/************************************************************************************ + + smb Utility + + File: objwndcmn.c + Description:オブジェクトビューとオブジェクトリストで共通のコード + History: + + ************************************************************************************/ + +#include "smbutil.h" +#include "objmng.h" +#include "objwndcmn.h" + +int ObjwndSwitchEditMode(HWND hWnd) +{ + WPARAM wParam; + int iNewMode = (EDITMODE_MAP == GetMapEditMode()) ? MAKEWPARAM(EDITMODE_BADGUYS, 0) : MAKEWPARAM(EDITMODE_MAP, 0); + + wParam = (EDITMODE_MAP == iNewMode) ? IDM_SETTING_MAP : IDM_SETTING_BADGUYS; + PostMessage(GETFRAMEWNDHANDLE(hWnd), WM_COMMAND, wParam,(LPARAM)NULL); + + return iNewMode; +} diff --git a/src/objwndcmn.h b/src/objwndcmn.h new file mode 100644 index 0000000..4881a3d --- /dev/null +++ b/src/objwndcmn.h @@ -0,0 +1,18 @@ +/************************************************************************************ + + smb Utility + + File: objwndcmn.h + Description:オブジェクトビューとオブジェクトリストで共通のコード + History: + + ************************************************************************************/ +#ifndef OBJWNDCMN_H +#define OBJWNDCMN_H + +#define GETFRAMEWNDHANDLE(H) GetParent(GetParent(H)) +#define GETCLIENTWNDHANDLE(H) GetParent(H) + +int ObjwndSwitchEditMode(HWND hWnd); + +#endif \ No newline at end of file diff --git a/src/resource.h b/src/resource.h new file mode 100644 index 0000000..985993d --- /dev/null +++ b/src/resource.h @@ -0,0 +1,292 @@ +/************************************************************************************ + + smb Utility + + File: resource.h + Description: + History: + + ************************************************************************************/ +#ifndef RESOURCE_H +#define RESOURCE_H + +#define IDS_MENUHELP_OPEN 1 +#define IDS_MENUHELP_SAVE 2 + +#define IDM_FILE_OPEN 1000 +#define IDM_FILE_SAVE 1001 +#define IDM_FILE_SAVEAS 1002 +#define IDM_FILE_EXIT 1003 +#define IDM_FILE_CHRLOAD 1010 +#define IDM_FILE_IPS 1018 + +#define IDM_SETTING_AREA 1004 +#define IDM_SETTING_MAPHEAD 1005 +#define IDM_SETTING_MAP 1006 +#define IDM_SETTING_BADGUYS 1007 +#define IDM_SETTING_GAME 1008 + +#define IDM_EDIT_STRINGS 1009 +#define IDM_EDIT_LOOP 1011 +#define IDM_EDIT_AREASORT 1012 +#define IDM_EDIT_LOOPWIZARD 1013 +#define IDM_EDIT_UNDO 1017 + +#define IDM_TOOL_GENERALSETTING 1040 +#define IDM_TOOL_WORLDDATAUPDATE 1041 +#define IDM_TOOL_OPTION 1042 +#define IDM_TOOL_DEMORECORD 1043 +#define IDM_TOOL_CUSTOMIZE 1044 +//#define IDM_TOOL_DUMPPRG 1045 +//#define IDM_TOOL_DUMPCHR 1046 +//#define IDM_TOOL_DUMPTRAINER 1047 + + + +#define IDM_VIEW_TOOLBAR 1070 +#define IDM_VIEW_STATUSBAR 1071 +#define IDM_VIEW_LOGVIEW 1072 + + +#define IDM_EMULATOR_NORMALPLAY 1020 +#define IDM_EMULATOR_LOADPLAY 1021 +#define IDM_EMULATOR_TESTPLAYSETTING 1022 +//#define IDM_EMULATOR_FRAMESKIP0 1023 +//#define IDM_EMULATOR_FRAMESKIP1 1024 +//#define IDM_EMULATOR_FRAMESKIP2 1025 +//#define IDM_EMULATOR_FRAMESKIP3 1026 +#define IDM_EMULATOR_SAVE 1027 +#define IDM_EMULATOR_LOAD 1028 +#define IDM_EMULATOR_STOP 1029 +#define IDM_EMULATOR_PAGEPLAY 1019 +#define IDM_EMULATOR_PAGEPLAYHALF 1050 + + +#define IDM_WINDOW_NEXT 1030 +#define IDM_WINDOW_PREV 1031 +#define IDM_WINDOW_CLOSEALL 1032 +#define IDM_WINDOW_CASCADE 1033 +#define IDM_WINDOW_CHILD 4000 + +#define IDM_HELP_VERSION 1060 + +/* +#define IDM_MAPVIEW_SCREENSIZE_1 1040 +#define IDM_MAPVIEW_SCREENSIZE_2 1041 +#define IDM_MAPVIEW_SCREENSIZE_3 1042 +*/ +#define IDM_MAPVIEW_NEXTPAGE 1100 +#define IDM_MAPVIEW_PREVPAGE 1101 +#define IDM_MAPVIEW_SHOWEDITDIALOG 1102 +#define IDM_MAPVIEW_SENDOBJECT 1103 +#define IDM_MAPVIEW_TESTPLAY 1104 +#define IDM_MAPVIEW_SWITCHEDITMODE 1105 + +#define IDC_STATIC -1 + +#define IDC_BIT6 2000 +#define IDC_PAGE 2001 +#define IDC_PAGESPIN 2002 +#define IDC_XPOS 2003 +#define IDC_XPOSSPIN 2004 +#define IDC_YPOS 2005 +#define IDC_YPOSSPIN 2006 +#define IDC_TYPE 2007 +#define IDC_LEN 2008 +#define IDC_LENSPIN 2009 +#define IDC_BIN 2010 +#define IDC_ISBIN 2011 +#define IDC_ISADDRESS 2015 +//#define IDC_APPLY 2168 + +#define IDC_STATIC_XPOS1 2154 +#define IDC_STATIC_YPOS 2155 +#define IDC_STATIC_TYPE 2156 +#define IDC_STATIC_OBJECT 2157 +#define IDC_STATIC_ROOMMOVE 2158 +#define IDC_STATIC_XPOS2 2159 +#define IDC_STATIC_ROOM 2160 +#define IDC_STATIC_WORLD 2161 +#define IDC_STATIC_PAGE 2162 + +#define IDC_STATIC_BLOCK 2163 +#define IDC_STATIC_VIEW 2164 +#define IDC_STATIC_BACKCOLOR 2165 +#define IDC_STATIC_LENGTH 2166 + +#define IDC_AREA 2012 +#define IDC_AREASPIN 2013 +#define IDC_PAGEFLAG 2014 + +#define IDC_NOTE 2051 +#define IDC_TITLE 2052 +#define IDC_CONTRIBUTION 2204 + +#define IDC_ADDRESS 2016 + +#define IDC_BROWSE 2168 + + +#define IDC_TIME 2017 +#define IDC_POSITION 2018 +#define IDC_BACKCOLOR 2019 +#define IDC_MAPTYPE 2020 +#define IDC_VIEW 2021 +#define IDC_FIRSTBLOCK 2022 +#define IDC_MAPATTR 2023 + +//マップ全般の設定 +#define IDC_MARIOLEFT 2030 +#define IDC_MARIOLEFTSPIN 2031 +#define IDC_ISWORLD 2032 +#define IDC_TIME400 2150 +#define IDC_TIME300 2151 +#define IDC_TIME200 2152 + +#define IDC_WORLD 2056 +#define IDC_RETURNPOS 2059 +#define IDC_DATA1 2060 +#define IDC_DATA2 2061 +#define IDC_DATA3 2062 +#define IDC_DATA4 2063 +//文字列の編集 +#define IDC_STRINGSELECT 2040 +#define IDC_STRING 2041 +#define IDC_STRINGWRITE 2042 + +#define IDC_DATA 2050 +#define IDC_POLEGFX 2054 +#define IDC_FLOWER 2053 + +#define IDC_WARPA1 2067 +#define IDC_WARPASPIN1 2068 +#define IDC_WARPA2 2073 +#define IDC_WARPASPIN2 2074 +#define IDC_WARPA3 2075 +#define IDC_WARPASPIN3 2076 +#define IDC_WARPB1 2077 +#define IDC_WARPBSPIN1 2078 +#define IDC_WARPC1 2079 +#define IDC_WARPCSPIN1 2080 +#define IDC_WARPC2 2081 +#define IDC_WARPCSPIN2 2082 +#define IDC_WARPC3 2083 +#define IDC_WARPCSPIN3 2084 +#define IDC_WARPB2 2085 +#define IDC_WARPBSPIN2 2086 +#define IDC_WARPB3 2087 +#define IDC_WARPBSPIN3 2088 + +#define IDC_COINSFOR1UP 2117 +#define IDC_COINSFOR1UPSPIN 2118 + + +#define IDC_KOOPA 2134 +#define IDC_KOOPAWORLD 2135 + +#define IDC_CLEARWORLD 2142 +#define IDC_CLEARWORLDSPIN 2143 +#define IDC_ISCLEARWORLD 2144 +#define IDC_DIFFICULTYWORLD 2145 +#define IDC_DIFFICULTYWORLDSPIN 2146 +#define IDC_DIFFICULTYAREA 2147 +#define IDC_DIFFICULTYAREASPIN 2148 +#define IDC_SEABLOCKWORLD 2169 +#define IDC_SEABLOCKWORLDSPIN 2170 + +// +#define IDC_ISCLEARED 2093 +#define IDC_MARIOSTATE 2094 +#define IDC_FROMCURPAGE 2095 +#define IDC_FROMDESTPAGE 2096 +#define IDC_0PAGEBADGUYS 2097 +#define IDC_MARIOSTART 2098 +#define IDC_ISMARIOSTART 2099 +#define IDC_INVINCIBLE 2211 + +#define IDC_XPOS2 2008 +#define IDC_XPOS2SPIN 2009 +#define IDC_PAGEFLAG2 2015 +#define IDC_ISPAGECOMMAND 2095 +#define IDC_PAGEEDIT 2096 +#define IDC_PAGEEDITSPIN 2097 +#define IDC_WORLDSPIN 2099 +#define IDC_PAGEEDIT2 2100 +#define IDC_PAGEEDIT2SPIN 2101 + +#define IDC_OPENPREVIEW 2102 + +//#define IDC_LOOPWIZARD 2102 + +#define IDC_UP 2110 +#define IDC_DOWN 2111 + +#define IDC_CHANGE 2106 + +#define IDC_MAPVIEW 2107 +#define IDC_ROOMID 2108 +#define IDC_ISROOMID 2113 + +#define IDC_ROOM 2114 +#define IDC_OFFSET 2115 + +#define IDC_FRAMESKIP 2116 +#define IDC_SPEEDLIMIT 2149 +#define IDC_PALOPTIMIZE 2153 +#define IDC_SPEEDOPTIMIZE 2171 +#define IDC_SKIPJOYREAD 2172 +#define IDC_USEPOV 2213 +#define IDC_JOYSTICKID 2214 +#define IDC_STATIC_JOYSTICKID 2215 + + +#define IDC_HELPPATH 2167 + +#define IDC_MSGONSAVE 2196 + +#define IDC_HALFPAGE 2198 + +#define IDC_XPOSHACK 2199 +#define IDC_YPOSHACK 2200 + +#define IDC_NOTDRAWASSISTBMP 2197 + +#define IDC_KEYLIST 2187 +#define IDC_KEYVALUE 2188 +#define IDC_KEYID 2189 +#define IDC_CTRL 2190 +#define IDC_SHIFT 2191 +#define IDC_ALT 2192 +#define IDC_RESET 2193 +#define IDC_PRESET 2195 +#define IDC_COPYRIGHT 2194 +#define IDC_WHEELCOMMAND 2201 +#define IDC_WHEELLIST 2202 +#define IDC_JOYBUTTONVALUE 2203 +#define IDC_JOYBUTTONLIST 2204 + + +//ルーム選択ダイアログボックス + +#define IDW_TOOLBAR 5000 +#define TOOLBAR_IMG 3002 +#define IDW_STATUSBAR 5002 +#define IDW_MDICLIENT 5003 +#define IDW_LISTVIEW 5004 +#define IDB_XGAUGE_IMG 3000 +#define IDB_YGAUGE_IMG 3001 + +#define IDM_EDITCOMMAND_ADD1TOTYPE 10000 +#define IDM_EDITCOMMAND_DEC1TOTYPE 10001 +#define IDM_EDITCOMMAND_ADD16TOTYPE 10002 +#define IDM_EDITCOMMAND_DEC16TOTYPE 10003 +#define IDM_EDITCOMMAND_RIGHT 10004 +#define IDM_EDITCOMMAND_LEFT 10005 +#define IDM_EDITCOMMAND_UP 10006 +#define IDM_EDITCOMMAND_DOWN 10007 +#define IDM_EDITCOMMAND_FWDPAGE 10008 +#define IDM_EDITCOMMAND_REWPAGE 10009 +#define IDM_EDITCOMMAND_NEXTOBJ 10010 +#define IDM_EDITCOMMAND_PREVOBJ 10011 + +#endif /* RESOURCE_H */ diff --git a/src/resource_i.rc b/src/resource_i.rc new file mode 100644 index 0000000..47de3f2 --- /dev/null +++ b/src/resource_i.rc @@ -0,0 +1,939 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resrc1.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "resource.h" +#define APSTUDIO_HIDDEN_SYMBOLS +#include "windows.h" +#undef APSTUDIO_HIDDEN_SYMBOLS +#include "windowsx.h" +#include "winver.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// 日本語 resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN) +#ifdef _WIN32 +LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT +#pragma code_page(932) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +APPICON ICON DISCARDABLE "image/smbutil.ico" +EMUICON ICON DISCARDABLE "image/emulator.ico" +ROMICON ICON DISCARDABLE "image/rom.ico" +MAPVIEWICON ICON DISCARDABLE "image/mapview.ico" +MAPLISTICON ICON DISCARDABLE "image/maplisti.ico" + +///////////////////////////////////////////////////////////////////////////// +// +// BINARY +// + +RAMDATA1 BINARY DISCARDABLE "data/ram1.bin" +RAMDATA2 BINARY DISCARDABLE "data/ram2.bin" + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +MAINWNDMENU MENU DISCARDABLE +BEGIN + POPUP "&File" + BEGIN + MENUITEM "&Open...", IDM_FILE_OPEN + MENUITEM "&Save", IDM_FILE_SAVE + MENUITEM "Save &As...", IDM_FILE_SAVEAS + MENUITEM SEPARATOR + MENUITEM "Import &CHR-ROM...", IDM_FILE_CHRLOAD + MENUITEM SEPARATOR + MENUITEM "E&xit", IDM_FILE_EXIT + END + POPUP "&Edit" + BEGIN + MENUITEM "&Undo", IDM_EDIT_UNDO + MENUITEM SEPARATOR + MENUITEM "Choose &Room...", IDM_SETTING_AREA + MENUITEM SEPARATOR + MENUITEM "&Badguys Mode", IDM_SETTING_BADGUYS + MENUITEM "&Map Mode", IDM_SETTING_MAP + MENUITEM SEPARATOR + MENUITEM "Edit &Header...", IDM_SETTING_MAPHEAD + END + POPUP "&View" + BEGIN + MENUITEM "&Toolbar", IDM_VIEW_TOOLBAR + MENUITEM "&Status Bar", IDM_VIEW_STATUSBAR + MENUITEM "&Log View", IDM_VIEW_LOGVIEW + END + POPUP "E&mulator" + BEGIN + MENUITEM "&Title Screen", IDM_EMULATOR_LOADPLAY + MENUITEM "Start of &Room", IDM_EMULATOR_NORMALPLAY + MENUITEM "Current &Page", IDM_EMULATOR_PAGEPLAY + MENUITEM "&Halfway Point", IDM_EMULATOR_PAGEPLAYHALF + MENUITEM "&End", IDM_EMULATOR_STOP + MENUITEM SEPARATOR + MENUITEM "Test &Configuration...", IDM_EMULATOR_TESTPLAYSETTING + MENUITEM SEPARATOR + MENUITEM "&Save State", IDM_EMULATOR_SAVE + MENUITEM "&Load state", IDM_EMULATOR_LOAD + END + POPUP "&Tools" + BEGIN + MENUITEM "Edit &Text...", IDM_EDIT_STRINGS + MENUITEM "Edit &Looping Castle Loop...", IDM_EDIT_LOOP + MENUITEM "World Data &Update", IDM_TOOL_WORLDDATAUPDATE + MENUITEM "Sort &Areas...", IDM_EDIT_AREASORT + MENUITEM "Record Intro &Demo", IDM_TOOL_DEMORECORD + MENUITEM "&General Setting...", IDM_TOOL_GENERALSETTING + MENUITEM "&Edit Some Game Stuff...", IDM_SETTING_GAME + MENUITEM SEPARATOR + MENUITEM "&Options...", IDM_TOOL_OPTION + MENUITEM "&Configuration...", IDM_TOOL_CUSTOMIZE + END + POPUP "&Window" + BEGIN + MENUITEM "&Cascade", IDM_WINDOW_CASCADE + MENUITEM "Close &All", IDM_WINDOW_CLOSEALL + MENUITEM SEPARATOR + MENUITEM "&Next", IDM_WINDOW_NEXT + MENUITEM "&Previous", IDM_WINDOW_PREV + END + POPUP "&Help" + BEGIN + MENUITEM "&About SMB Utility", IDM_HELP_VERSION + END +END + +MAPVIEW_POPUP MENU DISCARDABLE +BEGIN + POPUP "DUMMY" + BEGIN + MENUITEM "&Switch Edit Mode", IDM_MAPVIEW_SWITCHEDITMODE + MENUITEM SEPARATOR + MENUITEM "&Test", IDM_MAPVIEW_TESTPLAY + MENUITEM SEPARATOR + MENUITEM "&Next Page", IDM_MAPVIEW_NEXTPAGE + MENUITEM "&Previous Page", IDM_MAPVIEW_PREVPAGE + MENUITEM SEPARATOR + MENUITEM "&Send Object...", IDM_MAPVIEW_SENDOBJECT + MENUITEM "&Edit...", IDM_MAPVIEW_SHOWEDITDIALOG + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +VERSIONDLG DIALOG DISCARDABLE 22, 17, 246, 75 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_VISIBLE | WS_CAPTION +CAPTION "About" +FONT 8, "MS Sans Serif" +BEGIN + DEFPUSHBUTTON "OK",IDOK,197,8,37,14,WS_GROUP + ICON "APPICON",IDC_STATIC,12,13,20,20 + LTEXT "COPYRIGHT",IDC_COPYRIGHT,44,20,92,8 + LTEXT "NAME",IDC_TITLE,44,8,121,8 + LTEXT "DATE",IDC_NOTE,44,32,92,8,SS_CENTERIMAGE + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,48,244,1 + LTEXT "CONTRIBUTE",IDC_CONTRIBUTION,1,52,243,8 + LTEXT "International version contributors: Chezzman1, Insectduel, MirracleMXX, Yy", + IDC_STATIC,1,62,243,8 +END + +ROOMSELECTDLG DIALOGEX 0, 0, 159, 199 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION +CAPTION "Choose Room" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + CONTROL "Tree1",IDC_ROOM,"SysTreeView32",TVS_HASBUTTONS | + TVS_HASLINES | TVS_LINESATROOT | WS_TABSTOP,3,2,153,151, + WS_EX_CLIENTEDGE + DEFPUSHBUTTON "OK",IDOK,101,160,50,14 + PUSHBUTTON "Cancel",IDCANCEL,101,178,50,14 +END + +MAPCOMHEADEDITDLG DIALOG DISCARDABLE 0, 0, 309, 183 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION +CAPTION "Edit Header" +FONT 8, "MS Sans Serif" +BEGIN + COMBOBOX IDC_TIME,58,19,184,56,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | + WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_POSITION,58,36,184,119,CBS_DROPDOWNLIST | + CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_BACKCOLOR,58,54,184,131,CBS_DROPDOWNLIST | + CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_MAPTYPE,58,72,184,56,CBS_DROPDOWNLIST | + CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_VIEW,58,89,184,55,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | + WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_FIRSTBLOCK,58,107,184,168,CBS_DROPDOWNLIST | + CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_MAPATTR,58,126,59,74,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + COMBOBOX IDC_PAGE,68,161,28,90,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + DEFPUSHBUTTON "OK",IDOK,254,12,47,14 + PUSHBUTTON "Cancel",IDCANCEL,254,29,47,14 + LTEXT "Time",IDC_STATIC,9,21,34,8 + LTEXT "Position",IDC_STATIC,9,38,34,8 + LTEXT "Back ground",IDC_STATIC,9,56,38,8 + LTEXT "Type",IDC_STATIC,9,73,34,8 + LTEXT "Seanery",IDC_STATIC,9,91,34,8 + LTEXT "Basic Brick",IDC_STATIC,9,109,46,9 + LTEXT "Attribute",IDC_STATIC,9,128,38,8 + LTEXT "Halfway Page",IDC_STATIC_PAGE,11,163,52,8 + LTEXT "Room",IDC_STATIC,6,5,20,8 + LTEXT "Area",IDC_STATIC,6,145,17,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,27,8,223,1 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,24,148,229,1 +END + +MAPCOMEDITDLG DIALOG DISCARDABLE 0, 0, 266, 159 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTERMOUSE | WS_POPUP | WS_VISIBLE | + WS_CAPTION +CAPTION "Edit" +FONT 8, "MS Sans Serif" +BEGIN + EDITTEXT IDC_XPOS,27,19,28,13,ES_CENTER | ES_AUTOHSCROLL + CONTROL "Spin1",IDC_XPOSSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | + UDS_HORZ,55,19,6,14 + EDITTEXT IDC_YPOS,84,19,28,13,ES_CENTER | ES_AUTOHSCROLL + CONTROL "Spin2",IDC_YPOSSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,113,17,6, + 16 + CONTROL "Page Flag",IDC_PAGEFLAG,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,124,20,51,10 + COMBOBOX IDC_TYPE,25,38,122,76,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + EDITTEXT IDC_LEN,174,38,28,13,ES_CENTER | ES_AUTOHSCROLL + CONTROL "Spin3",IDC_LENSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,200,38,11, + 14 + COMBOBOX IDC_FIRSTBLOCK,26,58,110,94,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_VIEW,168,58,93,95,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + COMBOBOX IDC_BACKCOLOR,33,76,228,95,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + EDITTEXT IDC_NOTE,10,95,251,22,ES_MULTILINE | ES_READONLY | + ES_WANTRETURN | WS_VSCROLL | NOT WS_TABSTOP + CONTROL "Binary",IDC_ISBIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, + 3,124,34,10 + EDITTEXT IDC_BIN,14,139,57,14,ES_AUTOHSCROLL + EDITTEXT IDC_OFFSET,204,136,13,12,ES_CENTER | ES_READONLY | NOT + WS_BORDER | NOT WS_TABSTOP + DEFPUSHBUTTON "OK",IDOK,208,4,46,14 + PUSHBUTTON "Cancel",IDCANCEL,208,21,46,14 + LTEXT "H pos",IDC_STATIC,6,21,20,8 + LTEXT "V pos",IDC_STATIC,64,21,19,8 + LTEXT "Length",IDC_STATIC_LENGTH,150,40,22,9 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,37,127,133,1 + LTEXT "Scenery",IDC_STATIC_VIEW,139,60,28,8 + LTEXT "Brick",IDC_STATIC_BLOCK,7,60,18,8 + LTEXT "Back\nGround",IDC_STATIC_BACKCOLOR,7,75,24,17 + LTEXT "Type",IDC_STATIC,6,40,18,8 + LTEXT "Bytes",IDC_STATIC,221,136,19,8 + LTEXT "Object",IDC_STATIC,3,6,22,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,27,9,174,1 + LTEXT "Offset",IDC_STATIC,180,136,23,8 +END + +GAMESETTINGDLG DIALOG DISCARDABLE 0, 0, 159, 204 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION +CAPTION "General Setting" +FONT 8, "MS Sans Serif" +BEGIN + EDITTEXT IDC_MARIOLEFT,19,24,30,14,ES_AUTOHSCROLL + CONTROL "Spin1",IDC_MARIOLEFTSPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS,49,23,11,14 + CONTROL "Enable Pirana plants from 1-1",IDC_FLOWER,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,19,62,108,10 + COMBOBOX IDC_POLEGFX,20,98,70,88,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + COMBOBOX IDC_TIME400,39,131,70,126,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + COMBOBOX IDC_TIME300,39,148,70,122,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + COMBOBOX IDC_TIME200,39,166,70,127,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "Players",IDC_STATIC,8,8,27,10 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,54,49,98,1 + LTEXT "Graphics for vertical balls",IDC_STATIC,7,82,81,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,90,84,62,1 + LTEXT "Pirana plants",IDC_STATIC,7,46,45,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,35,11,119,1 + LTEXT "Time",IDC_STATIC,7,119,17,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,28,122,123,1 + LTEXT "400",IDC_STATIC,16,134,20,8 + LTEXT "300",IDC_STATIC,16,151,20,8 + LTEXT "200",IDC_STATIC,16,169,19,8 +END + +STRINGEDITDLG DIALOG DISCARDABLE 0, 0, 247, 48 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION | WS_SYSMENU +CAPTION "Edit Text" +FONT 8, "MS Sans Serif" +BEGIN + COMBOBOX IDC_STRINGSELECT,30,9,156,90,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + EDITTEXT IDC_STRING,30,28,156,12,ES_AUTOHSCROLL + PUSHBUTTON "Write",IDOK,189,27,50,14 + LTEXT "Characters",IDC_STATIC,203,12,37,8 + LTEXT "Type",IDC_STATIC,7,12,20,8 + LTEXT "Text",IDC_STATIC,7,29,17,8 + LTEXT "0",IDC_LEN,194,12,8,8 +END + +LOOPEDITDLG DIALOG DISCARDABLE 0, 0, 215, 183 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION +CAPTION "Edit Looping" +FONT 8, "MS Sans Serif" +BEGIN + EDITTEXT IDC_WORLD,23,18,117,14,ES_AUTOHSCROLL + EDITTEXT IDC_PAGE,24,49,118,14,ES_AUTOHSCROLL + EDITTEXT IDC_YPOS,23,84,118,14,ES_AUTOHSCROLL + EDITTEXT IDC_RETURNPOS,23,120,118,14,ES_AUTOHSCROLL + EDITTEXT IDC_DATA1,47,156,31,14,ES_AUTOHSCROLL + EDITTEXT IDC_DATA2,90,156,31,14,ES_AUTOHSCROLL + DEFPUSHBUTTON "OK",IDOK,158,7,50,14 + PUSHBUTTON "Cancel",IDCANCEL,158,25,50,14 + LTEXT "World",IDC_STATIC,9,5,29,8 + LTEXT "Page",IDC_STATIC,9,38,23,8 + LTEXT "V pos",IDC_STATIC,9,70,27,8 + LTEXT "Offset of map page skip data",IDC_STATIC,10,106,198,10 + LTEXT "World 7's loop",IDC_STATIC,9,143,54,8 + LTEXT "World",IDC_STATIC,24,159,19,8 +END + +TESTPLAYSETTINGDLG DIALOG DISCARDABLE 0, 0, 190, 230 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION +CAPTION "Test Configuration" +FONT 8, "MS Sans Serif" +BEGIN + CONTROL "Completed the game",IDC_ISCLEARED,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,15,20,79,10 + COMBOBOX IDC_MARIOSTATE,15,50,94,54,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + CONTROL "Enable badguys in start page",IDC_0PAGEBADGUYS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,14,87,109,10 + CONTROL "Enable invincible mode",IDC_INVINCIBLE,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,14,104,103,11 + CONTROL "Selected object",IDC_FROMCURPAGE,"Button", + BS_AUTORADIOBUTTON,13,136,68,10 + CONTROL "Specified page",IDC_FROMDESTPAGE,"Button", + BS_AUTORADIOBUTTON,13,152,64,10 + EDITTEXT IDC_PAGE,79,150,31,14,ES_AUTOHSCROLL + CONTROL "Spin1",IDC_PAGESPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | + UDS_HORZ,108,135,9,14 + PUSHBUTTON "Set to halfway page",IDC_HALFPAGE,114,148,69,17 + EDITTEXT IDC_XPOS,39,185,36,13,ES_AUTOHSCROLL + CONTROL "Spin1",IDC_XPOSSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | + UDS_HORZ,73,176,12,15 + COMBOBOX IDC_XPOSHACK,78,185,51,54,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + EDITTEXT IDC_YPOS,39,204,36,13,ES_AUTOHSCROLL + CONTROL "Spin1",IDC_YPOSSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,75,210,11, + 15 + COMBOBOX IDC_YPOSHACK,78,204,51,54,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + DEFPUSHBUTTON "OK",IDOK,129,10,50,14 + PUSHBUTTON "Cancel",IDCANCEL,129,28,50,14 + LTEXT "State",IDC_STATIC,6,36,20,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,26,39,94,1 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,25,9,95,1 + LTEXT "Hard",IDC_STATIC,7,6,15,8 + LTEXT "Current Page",IDC_STATIC,7,121,43,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,51,123,129,1 + LTEXT "Badguys",IDC_STATIC,7,71,27,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,36,74,144,1 + LTEXT "Starting Position",IDC_STATIC,7,170,52,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,61,172,119,1 + LTEXT "H pos",IDC_STATIC,11,187,26,9 + LTEXT "V pos",IDC_STATIC,11,207,26,9 +END + +AREASORTDLG DIALOG DISCARDABLE 0, 0, 255, 178 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION | WS_SYSMENU +CAPTION "Sort Areas" +FONT 8, "MS Sans Serif" +BEGIN + LISTBOX IDC_AREA,6,7,116,160,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | + WS_HSCROLL | WS_TABSTOP + PUSHBUTTON "Up",IDC_UP,124,64,23,14 + PUSHBUTTON "Down",IDC_DOWN,124,92,23,14 + CONTROL "",IDC_VIEW,"Static",SS_BITMAP | SS_SUNKEN,149,38,100, + 108 + EDITTEXT IDC_PAGEEDIT,212,154,31,14,ES_CENTER | ES_AUTOHSCROLL + CONTROL "Spin3",IDC_PAGEEDITSPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS | UDS_HORZ,239,153,10,14 + LTEXT "Page",IDC_STATIC,194,157,17,8 +END + +EDITOROPTIONDLG DIALOG DISCARDABLE 0, 0, 187, 33 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION +FONT 8, "MS Sans Serif" +BEGIN + CONTROL "Enable room protect system",IDC_ISADDRESS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,7,153,10 +END + +EMULATOROPTIONDLG DIALOG DISCARDABLE 0, 0, 187, 91 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION | WS_SYSMENU +FONT 8, "MS Sans Serif" +BEGIN + CONTROL "Enable MMX",IDC_SPEEDOPTIMIZE,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,7,85,10 + CONTROL "Disable Pad",IDC_SKIPJOYREAD,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,25,90,10 + COMBOBOX IDC_JOYSTICKID,35,42,64,59,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + CONTROL "Enable point of view",IDC_USEPOV,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,65,114,10 + LTEXT "Pad",IDC_STATIC_JOYSTICKID,10,44,21,8 +END + +SENDOBJECTDLG DIALOG DISCARDABLE 0, 0, 185, 127 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTERMOUSE | WS_POPUP | WS_VISIBLE | + WS_CAPTION +CAPTION "Send object to another room" +FONT 8, "MS Sans Serif" +BEGIN + COMBOBOX IDC_DATA,143,78,31,123,CBS_DROPDOWN | WS_VSCROLL | + WS_TABSTOP + EDITTEXT IDC_PAGEEDIT2,143,101,30,14,ES_CENTER | ES_AUTOHSCROLL + CONTROL "Spin3",IDC_PAGEEDIT2SPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS | UDS_HORZ,173,101,7,14 + DEFPUSHBUTTON "OK",IDOK,128,7,50,14 + PUSHBUTTON "Cancel",IDCANCEL,128,24,50,14 + CONTROL "",IDC_VIEW,"Static",SS_BITMAP | SS_SUNKEN,13,8,100,108 + LTEXT "Room",IDC_STATIC,121,80,20,8 + LTEXT "Page",IDC_STATIC,122,103,19,8 +END + +BADGUYSCOMEDITDLG DIALOG DISCARDABLE 0, 0, 402, 161 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTERMOUSE | WS_POPUP | WS_VISIBLE | + WS_CAPTION +CAPTION "Edit" +FONT 8, "MS Sans Serif" +BEGIN + EDITTEXT IDC_XPOS,29,17,27,14,ES_CENTER + CONTROL "Spin1",IDC_XPOSSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | + UDS_HORZ,56,17,7,14 + EDITTEXT IDC_YPOS,86,17,27,14,ES_CENTER | ES_AUTOHSCROLL + CONTROL "Spin1",IDC_YPOSSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,114,17,7, + 14 + CONTROL "Page Flag",IDC_PAGEFLAG,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,127,13,54,10 + CONTROL "After 5-3",IDC_BIT6,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,127,25,54,10 + COMBOBOX IDC_TYPE,29,39,150,165,CBS_DROPDOWNLIST | + CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP + CONTROL "Page Skip",IDC_ISPAGECOMMAND,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,8,59,47,10 + EDITTEXT IDC_PAGEEDIT,57,57,25,14,ES_CENTER | ES_AUTOHSCROLL + CONTROL "Spin1",IDC_PAGEEDITSPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS | UDS_HORZ,86,57,7,14 + EDITTEXT IDC_XPOS2,33,89,27,14,ES_CENTER + CONTROL "Spin1",IDC_XPOS2SPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | + UDS_HORZ,59,81,10,14 + CONTROL "Page Flag",IDC_PAGEFLAG2,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,72,90,53,10 + CONTROL "Preview",IDC_OPENPREVIEW,"Button",BS_AUTOCHECKBOX | + BS_PUSHLIKE | WS_TABSTOP,134,86,46,12 + EDITTEXT IDC_WORLD,33,108,27,14,ES_CENTER | ES_AUTOHSCROLL + CONTROL "Spin2",IDC_WORLDSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,58,116,9, + 14 + COMBOBOX IDC_DATA,91,108,30,123,CBS_DROPDOWN | WS_VSCROLL | + WS_TABSTOP + EDITTEXT IDC_PAGEEDIT2,148,107,27,14,ES_CENTER | ES_AUTOHSCROLL + CONTROL "Spin3",IDC_PAGEEDIT2SPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS | UDS_HORZ,179,107,7,14 + CONTROL "Binary",IDC_ISBIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, + 3,128,31,10 + EDITTEXT IDC_BIN,13,141,127,14,ES_AUTOHSCROLL + EDITTEXT IDC_OFFSET,216,141,16,12,ES_CENTER | ES_READONLY | NOT + WS_BORDER | NOT WS_TABSTOP + DEFPUSHBUTTON "OK",IDOK,190,12,43,14 + PUSHBUTTON "Cancel",IDCANCEL,190,30,43,14 + LTEXT "H pos",IDC_STATIC_XPOS1,8,19,21,8 + LTEXT "V pos",IDC_STATIC_YPOS,65,19,18,8 + LTEXT "Type",IDC_STATIC_TYPE,8,41,19,8 + LTEXT "Room",IDC_STATIC_ROOM,70,110,19,8 + LTEXT "World",IDC_STATIC_WORLD,10,110,22,8 + LTEXT "Page",IDC_STATIC_PAGE,128,110,17,8 + LTEXT "H pos",IDC_STATIC_XPOS2,10,91,23,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,23,78,160,1 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,38,131,146,1 + LTEXT "Bytes",IDC_STATIC,236,141,18,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDVERT,271,14,1,120 + CONTROL "",IDC_VIEW,"Static",SS_BITMAP | SS_SUNKEN,279,21,105, + 108 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,26,8,156,1 + LTEXT "Room change",IDC_STATIC_ROOMMOVE,3,75,21,8 + LTEXT "Object",IDC_STATIC_OBJECT,3,5,21,8 + LTEXT "Offset",IDC_STATIC,192,141,23,8 +END + +GAMESETTING1UPDLG DIALOG DISCARDABLE 0, 0, 187, 111 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION +FONT 8, "MS Sans Serif" +BEGIN + COMBOBOX IDC_WORLD,17,34,48,119,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + EDITTEXT IDC_COINSFOR1UP,76,34,34,14,ES_AUTOHSCROLL + CONTROL "Spin2",IDC_COINSFOR1UPSPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS,111,34,9,14 + LTEXT "Coins for 1UP mushroom",IDC_STATIC,7,13,81,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,88,16,92,1 +END + +GAMESETTINGWARPZONEDLG DIALOG DISCARDABLE 0, 0, 200, 95 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION +FONT 8, "MS Sans Serif" +BEGIN + EDITTEXT IDC_WARPA1,63,33,31,14,ES_AUTOHSCROLL + CONTROL "Spin2",IDC_WARPASPIN1,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,93,33,9, + 14 + EDITTEXT IDC_WARPA2,108,33,31,14,ES_AUTOHSCROLL + CONTROL "Spin2",IDC_WARPASPIN2,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,139,32,9, + 14 + EDITTEXT IDC_WARPA3,152,33,31,14,ES_AUTOHSCROLL + CONTROL "Spin2",IDC_WARPASPIN3,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,184,33,9, + 14 + EDITTEXT IDC_WARPB1,63,49,31,14,ES_AUTOHSCROLL + CONTROL "Spin2",IDC_WARPBSPIN1,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,93,49,9, + 14 + EDITTEXT IDC_WARPB2,108,49,31,14,ES_AUTOHSCROLL + CONTROL "Spin2",IDC_WARPBSPIN2,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,139,49,9, + 14 + EDITTEXT IDC_WARPB3,152,49,31,14,ES_AUTOHSCROLL + CONTROL "Spin2",IDC_WARPBSPIN3,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,184,49,9, + 14 + EDITTEXT IDC_WARPC1,63,65,31,14,ES_AUTOHSCROLL + CONTROL "Spin2",IDC_WARPCSPIN1,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,93,65,9, + 14 + EDITTEXT IDC_WARPC2,108,65,31,14,ES_AUTOHSCROLL + CONTROL "Spin2",IDC_WARPCSPIN2,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,139,65,9, + 14 + EDITTEXT IDC_WARPC3,152,65,31,14,ES_AUTOHSCROLL + CONTROL "Spin2",IDC_WARPCSPIN3,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,184,65,9, + 14 + LTEXT "Warp Zone 1",IDC_STATIC,11,36,43,8 + LTEXT "Warp Zone 2",IDC_STATIC,11,52,42,9 + LTEXT "Warp Zone 3",IDC_STATIC,11,68,42,9 + LTEXT "Warp Zone",IDC_STATIC,7,13,36,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,46,15,147,1 +END + +GAMESETTINGKOOPADLG DIALOG DISCARDABLE 0, 0, 215, 93 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION +FONT 8, "MS Sans Serif" +BEGIN + EDITTEXT IDC_WORLD,43,27,35,14,ES_AUTOHSCROLL + CONTROL "Spin1",IDC_WORLDSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,79,27,11, + 14 + COMBOBOX IDC_KOOPAWORLD,18,66,46,132,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KOOPA,74,66,134,132,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "Bowser's Hammer",IDC_STATIC,8,11,60,8 + LTEXT "True character of Bowser",IDC_STATIC,9,50,83,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,94,52,114,1 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,70,15,138,1 + LTEXT "World",IDC_STATIC,17,30,22,8 +END + +GAMESETTINGWORLDDLG DIALOG DISCARDABLE 0, 0, 187, 101 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION +FONT 8, "MS Sans Serif" +BEGIN + EDITTEXT IDC_DIFFICULTYWORLD,38,24,32,14,ES_AUTOHSCROLL + CONTROL "Spin1",IDC_DIFFICULTYWORLDSPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS,69,24,9,14 + EDITTEXT IDC_DIFFICULTYAREA,103,24,32,14,ES_AUTOHSCROLL + CONTROL "Spin1",IDC_DIFFICULTYAREASPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS,135,24,9,14 + EDITTEXT IDC_SEABLOCKWORLD,37,69,32,14,ES_AUTOHSCROLL + CONTROL "Spin1",IDC_SEABLOCKWORLDSPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS,69,69,9,14 + LTEXT "Become hard",IDC_STATIC,7,10,45,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,52,13,128,1 + LTEXT "World",IDC_STATIC,14,27,21,8 + LTEXT "Area",IDC_STATIC,85,27,16,8 + LTEXT "Changed sea brick to castle brick in sea",IDC_STATIC,8, + 51,126,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,136,54,43,1 + LTEXT "World",IDC_STATIC,14,72,22,8 +END + +GENERALSETTINGDLG DIALOG DISCARDABLE 0, 0, 187, 51 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION +CAPTION "General Setting" +FONT 8, "MS Sans Serif" +BEGIN + EDITTEXT IDC_CLEARWORLD,17,24,32,14,ES_AUTOHSCROLL + CONTROL "Spin1",IDC_CLEARWORLDSPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS,50,24,11,14 + CONTROL "Custom",IDC_ISCLEARWORLD,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,67,28,38,10 + DEFPUSHBUTTON "OK",IDOK,122,10,50,14 + PUSHBUTTON "Cancel",IDCANCEL,122,30,50,14 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,58,13,50,1 + LTEXT "Worlds in game",IDC_STATIC,7,10,50,8 +END + +CUSTOMIZEDLG DIALOG DISCARDABLE 0, 0, 354, 265 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "Configuration" +FONT 8, "MS Sans Serif" +BEGIN + COMBOBOX IDC_KEYID,33,21,115,69,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LISTBOX IDC_KEYLIST,33,42,115,47,LBS_NOINTEGRALHEIGHT | + WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYVALUE,33,98,115,129,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + CONTROL "Ctrl",IDC_CTRL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,40, + 121,27,10 + CONTROL "Alt",IDC_ALT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,79, + 121,25,10 + CONTROL "Shift",IDC_SHIFT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, + 115,121,30,10 + COMBOBOX IDC_PRESET,23,151,98,69,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + PUSHBUTTON "Load",IDC_RESET,126,151,50,14 + LISTBOX IDC_WHEELLIST,47,189,120,41,LBS_NOINTEGRALHEIGHT | + WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_WHEELCOMMAND,47,237,121,129,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LISTBOX IDC_JOYBUTTONLIST,225,23,120,39,LBS_NOINTEGRALHEIGHT | + WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_JOYBUTTONVALUE,225,71,121,129,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + DEFPUSHBUTTON "OK",IDOK,221,243,50,14 + PUSHBUTTON "Cancel",IDCANCEL,283,243,50,14 + LTEXT "Keyboard",IDC_STATIC,7,8,30,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,40,11,139,1 + LTEXT "Type",IDC_STATIC,10,23,17,8 + LTEXT "Target",IDC_STATIC,9,62,22,8 + LTEXT "Value",IDC_STATIC,10,113,20,8 + GROUPBOX "Preset keys",IDC_STATIC,14,139,170,32 + LTEXT "Mouse Wheel",IDC_STATIC,7,176,44,9 + LTEXT "Additional Key",IDC_STATIC,10,207,31,17 + LTEXT "Value",IDC_STATIC,15,239,21,9 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,54,179,126,1 + LTEXT "Pad",IDC_STATIC,191,8,13,9 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,207,11,141,1 + LTEXT "Target",IDC_STATIC,199,38,21,9 + LTEXT "Value",IDC_STATIC,201,73,20,9 +END + +APPLICATIONOPTIONDLG DIALOG DISCARDABLE 0, 0, 187, 24 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION +FONT 8, "MS Sans Serif" +BEGIN + CONTROL "Display message box when overwriting file", + IDC_MSGONSAVE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,7, + 173,10 +END + +OBJECTVIEWOPTIONDLG DIALOG DISCARDABLE 0, 0, 187, 90 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION +FONT 8, "MS Sans Serif" +BEGIN + CONTROL "Hide auxiliary bitmaps",IDC_NOTDRAWASSISTBMP,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,7,173,10 +END + +LOADCHROPTION DIALOGEX 0, 0, 187, 22 +STYLE WS_CHILD | WS_CLIPSIBLINGS +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + CONTROL "Import entire CHR-ROM",IDC_TITLE,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,7,173,8 +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resrc1.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""resource.h""\r\n" + "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" + "#include ""windows.h""\r\n" + "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" + "#include ""windowsx.h""\r\n" + "#include ""winver.h""\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO DISCARDABLE +BEGIN + "VERSIONDLG", DIALOG + BEGIN + RIGHTMARGIN, 244 + END + + "ROOMSELECTDLG", DIALOG + BEGIN + LEFTMARGIN, 3 + RIGHTMARGIN, 156 + BOTTOMMARGIN, 196 + END + + "MAPCOMHEADEDITDLG", DIALOG + BEGIN + LEFTMARGIN, 3 + RIGHTMARGIN, 303 + TOPMARGIN, 2 + BOTTOMMARGIN, 178 + END + + "MAPCOMEDITDLG", DIALOG + BEGIN + LEFTMARGIN, 2 + RIGHTMARGIN, 261 + TOPMARGIN, 1 + BOTTOMMARGIN, 156 + END + + "GAMESETTINGDLG", DIALOG + BEGIN + LEFTMARGIN, 1 + RIGHTMARGIN, 157 + TOPMARGIN, 2 + BOTTOMMARGIN, 198 + END + + "STRINGEDITDLG", DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 240 + TOPMARGIN, 6 + BOTTOMMARGIN, 45 + END + + "LOOPEDITDLG", DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 208 + TOPMARGIN, 7 + BOTTOMMARGIN, 176 + END + + "TESTPLAYSETTINGDLG", DIALOG + BEGIN + LEFTMARGIN, 1 + RIGHTMARGIN, 187 + TOPMARGIN, 3 + BOTTOMMARGIN, 225 + END + + "AREASORTDLG", DIALOG + BEGIN + LEFTMARGIN, 6 + RIGHTMARGIN, 249 + TOPMARGIN, 7 + BOTTOMMARGIN, 167 + END + + "EDITOROPTIONDLG", DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 26 + END + + "EMULATOROPTIONDLG", DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 84 + END + + "SENDOBJECTDLG", DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 178 + TOPMARGIN, 7 + BOTTOMMARGIN, 120 + END + + "BADGUYSCOMEDITDLG", DIALOG + BEGIN + LEFTMARGIN, 3 + RIGHTMARGIN, 394 + BOTTOMMARGIN, 155 + END + + "GAMESETTING1UPDLG", DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 104 + END + + "GAMESETTINGWARPZONEDLG", DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 193 + TOPMARGIN, 7 + BOTTOMMARGIN, 88 + END + + "GAMESETTINGKOOPADLG", DIALOG + BEGIN + LEFTMARGIN, 6 + RIGHTMARGIN, 208 + TOPMARGIN, 7 + BOTTOMMARGIN, 86 + END + + "GAMESETTINGWORLDDLG", DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 94 + END + + "GENERALSETTINGDLG", DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 44 + END + + "CUSTOMIZEDLG", DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 348 + TOPMARGIN, 7 + BOTTOMMARGIN, 257 + END +END +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Bitmap +// + +TOOLBAR_IMG BITMAP DISCARDABLE "image/toolbar.bmp" +SEA_IMG BITMAP DISCARDABLE "image/sea_img.bmp" +SKY_IMG BITMAP DISCARDABLE "image/sky_img.bmp" +UG_IMG BITMAP DISCARDABLE "image/ug_img.bmp" +CASTLE_IMG BITMAP DISCARDABLE "image/castle_img.bmp" +TVMASK BITMAP DISCARDABLE "image/tvmask.bmp" +RG_IMG BITMAP DISCARDABLE "image/rg_img.bmp" +LF_IMG BITMAP DISCARDABLE "image/lf_img.bmp" +IDB_XGAUGE_IMG BITMAP DISCARDABLE "image/xgauge_img.bmp" +IDB_YGAUGE_IMG BITMAP DISCARDABLE "image/ygauge_img.bmp" +ASSIST_IMG BITMAP DISCARDABLE "image/assist_img.bmp" +#endif // 日本語 resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/src/resource_j.rc b/src/resource_j.rc new file mode 100644 index 0000000..4a3f495 --- /dev/null +++ b/src/resource_j.rc @@ -0,0 +1,1017 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resrc1.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "resource.h" +#define APSTUDIO_HIDDEN_SYMBOLS +#include "windows.h" +#undef APSTUDIO_HIDDEN_SYMBOLS +#include "windowsx.h" +#include "winver.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// 日本語 resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN) +#ifdef _WIN32 +LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT +#pragma code_page(932) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +APPICON ICON DISCARDABLE "image/smbutil.ico" +EMUICON ICON DISCARDABLE "image/emulator.ico" +ROMICON ICON DISCARDABLE "image/rom.ico" +MAPVIEWICON ICON DISCARDABLE "image/mapview.ico" +MAPLISTICON ICON DISCARDABLE "image/maplisti.ico" + +///////////////////////////////////////////////////////////////////////////// +// +// BINARY +// + +RAMDATA1 BINARY DISCARDABLE "data/ram1.bin" +RAMDATA2 BINARY DISCARDABLE "data/ram2.bin" + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +MAINWNDMENU MENU DISCARDABLE +BEGIN + POPUP "ファイル(&F)" + BEGIN + MENUITEM "開く(&O)...", IDM_FILE_OPEN + MENUITEM "上書き保存(&S)", IDM_FILE_SAVE + MENUITEM "名前を付けて保存(&A)...", IDM_FILE_SAVEAS + MENUITEM SEPARATOR + MENUITEM "キャラクタロムの読みこみ(&C)...", IDM_FILE_CHRLOAD + MENUITEM SEPARATOR + MENUITEM "アプリケーションの終了(&X)", IDM_FILE_EXIT + END + POPUP "編集(&E)" + BEGIN + MENUITEM "元に戻す(&U)", IDM_EDIT_UNDO + MENUITEM SEPARATOR + MENUITEM "ルームの変更(&A)...", IDM_SETTING_AREA + MENUITEM SEPARATOR + MENUITEM "敵(&B)", IDM_SETTING_BADGUYS + MENUITEM "地形(&M)", IDM_SETTING_MAP + MENUITEM SEPARATOR + MENUITEM "ルーム/エリアの設定(&S)...", IDM_SETTING_MAPHEAD + END + POPUP "表示(&V)" + BEGIN + MENUITEM "ツールバー(&T)", IDM_VIEW_TOOLBAR + MENUITEM "ステータスバー(&S)", IDM_VIEW_STATUSBAR + MENUITEM "ログビュー(&L)", IDM_VIEW_LOGVIEW + END + POPUP "エミュレータ(&M)" + BEGIN + MENUITEM "通常起動(&B)", IDM_EMULATOR_LOADPLAY + MENUITEM "テストプレイ(&T)", IDM_EMULATOR_NORMALPLAY + MENUITEM "ページテストプレイ(&P)", IDM_EMULATOR_PAGEPLAY + MENUITEM "途中ページテストプレイ(&H)", IDM_EMULATOR_PAGEPLAYHALF + MENUITEM "停止(&E)", IDM_EMULATOR_STOP + MENUITEM SEPARATOR + MENUITEM "テストプレイの設定(&C)...", IDM_EMULATOR_TESTPLAYSETTING + MENUITEM SEPARATOR + MENUITEM "セーブ(&S)", IDM_EMULATOR_SAVE + MENUITEM "ロード(&L)", IDM_EMULATOR_LOAD + END + POPUP "ツール(&T)" + BEGIN + MENUITEM "文字列(&S)...", IDM_EDIT_STRINGS + MENUITEM "ループ(&B)...", IDM_EDIT_LOOP + MENUITEM "ワールドの区分の更新(&U)", IDM_TOOL_WORLDDATAUPDATE + MENUITEM "エリアの開始ルーム(&N)...", IDM_EDIT_AREASORT + MENUITEM "デモ レコーダー(&D)", IDM_TOOL_DEMORECORD + MENUITEM "全般の設定(&L)...", IDM_TOOL_GENERALSETTING + MENUITEM "その他の設定(&O)...", IDM_SETTING_GAME + MENUITEM SEPARATOR + MENUITEM "オプション(&O)...", IDM_TOOL_OPTION + MENUITEM "カスタマイズ(&C)...", IDM_TOOL_CUSTOMIZE + END + POPUP "ウィンドウ(&W)" + BEGIN + MENUITEM "重ねて表示(&C)", IDM_WINDOW_CASCADE + MENUITEM "すべて最小化(&L)", IDM_WINDOW_CLOSEALL + MENUITEM SEPARATOR + MENUITEM "次へ(&N)", IDM_WINDOW_NEXT + MENUITEM "前へ(&P)", IDM_WINDOW_PREV + END + POPUP "ヘルプ(&H)" + BEGIN + MENUITEM "バージョン情報(&V)", IDM_HELP_VERSION + END +END + +MAPVIEW_POPUP MENU DISCARDABLE +BEGIN + POPUP "DUMMY" + BEGIN + MENUITEM "編集モードの切り替え(&S)", IDM_MAPVIEW_SWITCHEDITMODE + MENUITEM SEPARATOR + MENUITEM "この位置からテストプレイ(&T)", IDM_MAPVIEW_TESTPLAY + MENUITEM SEPARATOR + MENUITEM "次のページへ(&N)", IDM_MAPVIEW_NEXTPAGE + MENUITEM "前のページへ(&P)", IDM_MAPVIEW_PREVPAGE + MENUITEM SEPARATOR + MENUITEM "アクティブオブジェクトを他ルームへ送る(&M)...", + IDM_MAPVIEW_SENDOBJECT + MENUITEM "アクティブオブジェクトを編集(&E)...", IDM_MAPVIEW_SHOWEDITDIALOG + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +VERSIONDLG DIALOG DISCARDABLE 22, 17, 191, 67 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_VISIBLE | WS_CAPTION +CAPTION "バージョン情報" +FONT 9, "MS Pゴシック" +BEGIN + DEFPUSHBUTTON "OK",IDOK,144,10,37,14,WS_GROUP + ICON "APPICON",IDC_STATIC,12,13,20,20 + LTEXT "COPYRIGHT",IDC_COPYRIGHT,44,20,92,8 + LTEXT "NAME",IDC_TITLE,44,8,92,8 + LTEXT "DATE",IDC_NOTE,44,32,92,8,SS_CENTERIMAGE + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,48,189,1 + LTEXT "CONTRIBUTE",IDC_CONTRIBUTION,2,53,187,8 +END + +ROOMSELECTDLG DIALOGEX 0, 0, 159, 199 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION +CAPTION "ルームの変更" +FONT 9, "MS Pゴシック", 0, 0, 0x1 +BEGIN + CONTROL "Tree1",IDC_ROOM,"SysTreeView32",TVS_HASBUTTONS | + TVS_HASLINES | TVS_LINESATROOT | WS_TABSTOP,3,2,153,151, + WS_EX_CLIENTEDGE + DEFPUSHBUTTON "OK",IDOK,101,160,50,14 + PUSHBUTTON "キャンセル",IDCANCEL,101,178,50,14 +END + +MAPCOMHEADEDITDLG DIALOG DISCARDABLE 0, 0, 309, 183 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION +CAPTION "設定" +FONT 9, "MS Pゴシック" +BEGIN + COMBOBOX IDC_TIME,58,16,184,56,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | + WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_POSITION,58,33,184,119,CBS_DROPDOWNLIST | + CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_BACKCOLOR,58,51,184,131,CBS_DROPDOWNLIST | + CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_MAPTYPE,58,69,184,56,CBS_DROPDOWNLIST | + CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_VIEW,58,86,184,55,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | + WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_FIRSTBLOCK,58,104,184,168,CBS_DROPDOWNLIST | + CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_MAPATTR,58,123,59,74,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + COMBOBOX IDC_PAGE,68,161,28,90,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + DEFPUSHBUTTON "OK",IDOK,254,12,47,14 + PUSHBUTTON "キャンセル",IDCANCEL,255,29,47,14 + LTEXT "時間",IDC_STATIC,9,18,34,8 + LTEXT "出現位置",IDC_STATIC,9,35,34,8 + LTEXT "初期背景",IDC_STATIC,9,53,34,8 + LTEXT "面設定",IDC_STATIC,9,70,34,8 + LTEXT "初期景色",IDC_STATIC,9,88,34,8 + LTEXT "初期基本ブロック",IDC_STATIC,9,106,46,9 + LTEXT "マップの種類",IDC_STATIC,8,125,38,8 + LTEXT "途中の開始ページ",IDC_STATIC_PAGE,11,163,56,8 + LTEXT "ルーム",IDC_STATIC,6,2,15,8 + LTEXT "エリア",IDC_STATIC,6,145,12,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,25,5,225,1 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,25,148,228,1 +END + +MAPCOMEDITDLG DIALOG DISCARDABLE 0, 0, 266, 159 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTERMOUSE | WS_POPUP | WS_VISIBLE | + WS_CAPTION +CAPTION "編集" +FONT 9, "MS Pゴシック" +BEGIN + EDITTEXT IDC_XPOS,31,19,27,13,ES_CENTER | ES_AUTOHSCROLL + CONTROL "Spin1",IDC_XPOSSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | + UDS_HORZ,58,12,6,14 + EDITTEXT IDC_YPOS,89,19,27,13,ES_CENTER | ES_AUTOHSCROLL + CONTROL "Spin2",IDC_YPOSSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,116,11,6, + 16 + CONTROL "改ページフラグ",IDC_PAGEFLAG,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,127,20,52,10 + COMBOBOX IDC_TYPE,25,38,122,76,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + EDITTEXT IDC_LEN,169,38,27,13,ES_CENTER | ES_AUTOHSCROLL + CONTROL "Spin3",IDC_LENSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,197,32,7, + 14 + COMBOBOX IDC_FIRSTBLOCK,31,58,110,94,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_VIEW,165,58,96,95,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + COMBOBOX IDC_BACKCOLOR,32,76,229,95,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + EDITTEXT IDC_NOTE,10,95,251,22,ES_MULTILINE | ES_READONLY | + ES_WANTRETURN | WS_VSCROLL | NOT WS_TABSTOP + CONTROL "バイナリ入力",IDC_ISBIN,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,3,124,48,10 + EDITTEXT IDC_BIN,14,139,46,14,ES_AUTOHSCROLL + EDITTEXT IDC_OFFSET,191,136,26,12,ES_RIGHT | ES_READONLY | NOT + WS_BORDER | NOT WS_TABSTOP + DEFPUSHBUTTON "OK",IDOK,208,4,46,14 + PUSHBUTTON "キャンセル",IDCANCEL,208,21,46,14 + LTEXT "横位置",IDC_STATIC,6,21,22,8 + LTEXT "縦位置",IDC_STATIC,64,21,22,8 + LTEXT "長さ",IDC_STATIC_LENGTH,153,40,16,9 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,50,127,138,1 + LTEXT "景色",IDC_STATIC_VIEW,147,60,15,8 + LTEXT "ブロック",IDC_STATIC_BLOCK,10,60,18,8 + LTEXT "背景",IDC_STATIC_BACKCOLOR,10,78,15,8 + LTEXT "種類",IDC_STATIC,6,40,15,8 + LTEXT "バイト目",IDC_STATIC,221,136,22,8 + LTEXT "オブジェクト",IDC_STATIC,3,6,27,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,30,9,168,1 +END + +GAMESETTINGDLG DIALOG DISCARDABLE 0, 0, 159, 195 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION +CAPTION "全般の設定" +FONT 9, "MS Pゴシック" +BEGIN + EDITTEXT IDC_MARIOLEFT,19,24,29,14,ES_AUTOHSCROLL + CONTROL "Spin1",IDC_MARIOLEFTSPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS,48,24,9,14 + CONTROL "1-1からパックンフラワーを出す。",IDC_FLOWER,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,19,62,94,10 + COMBOBOX IDC_POLEGFX,16,98,70,88,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + COMBOBOX IDC_TIME400,39,131,70,126,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + COMBOBOX IDC_TIME300,39,148,70,122,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + COMBOBOX IDC_TIME200,39,166,70,127,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "マリオの初期人数",IDC_STATIC,8,8,49,10 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,46,49,106,1 + LTEXT "縦に並んだ丸キャラのグラフィック",IDC_STATIC,7,81,86,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,90,84,62,1 + LTEXT "パックンフラワー",IDC_STATIC,7,46,35,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,60,11,94,1 + LTEXT "残り時間",IDC_STATIC,7,120,27,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,36,122,115,1 + LTEXT "400",IDC_STATIC,16,134,11,8 + LTEXT "300",IDC_STATIC,16,151,11,8 + LTEXT "200",IDC_STATIC,16,169,11,8 +END + +STRINGEDITDLG DIALOG DISCARDABLE 0, 0, 247, 48 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION | WS_SYSMENU +CAPTION "文字列の編集" +FONT 9, "MS Pゴシック" +BEGIN + COMBOBOX IDC_STRINGSELECT,30,9,156,90,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + EDITTEXT IDC_STRING,30,28,156,12,ES_AUTOHSCROLL + PUSHBUTTON "書きこみ",IDOK,190,27,50,14 + LTEXT "文字まで",IDC_STATIC,205,12,33,8 + LTEXT "種類",IDC_STATIC,7,12,15,8 + LTEXT "文字列",IDC_STATIC,7,29,22,8 + LTEXT "0",IDC_LEN,196,12,8,8 +END + +LOOPEDITDLG DIALOG DISCARDABLE 0, 0, 215, 183 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION +CAPTION "ループの編集" +FONT 9, "MS Pゴシック" +BEGIN + EDITTEXT IDC_WORLD,23,18,117,14,ES_AUTOHSCROLL + EDITTEXT IDC_PAGE,24,49,118,14,ES_AUTOHSCROLL + EDITTEXT IDC_YPOS,23,84,118,14,ES_AUTOHSCROLL + EDITTEXT IDC_RETURNPOS,23,120,118,14,ES_AUTOHSCROLL + EDITTEXT IDC_DATA1,106,155,20,14,ES_AUTOHSCROLL + EDITTEXT IDC_DATA2,136,155,21,14,ES_AUTOHSCROLL + DEFPUSHBUTTON "OK",IDOK,158,7,50,14 + PUSHBUTTON "キャンセル",IDCANCEL,158,25,50,14 + LTEXT "ワールド ((ワールド) -1で指定)",IDC_STATIC,9,5,78,8 + LTEXT "ページ (ループコマンドのあるページの次のページ)",IDC_STATIC,9, + 38,127,8 + LTEXT "縦位置の条件 (上位4ビットで指定。00=-1, 10=0, 20=1, …, f0=15)", + IDC_STATIC,9,70,184,8 + LTEXT "戻り位置(地形用ページ送りコマンドの先頭からの0起算によるバイト数)", + IDC_STATIC,10,106,198,10 + LTEXT "ワールド7のループの設定",IDC_STATIC,9,143,65,8 + LTEXT "ワールド ((ワールド) -1で指定)",IDC_STATIC,24,159,78,8 +END + +TESTPLAYSETTINGDLG DIALOG DISCARDABLE 0, 0, 191, 232 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION +CAPTION "テストプレイの設定" +FONT 9, "MS Pゴシック" +BEGIN + CONTROL "裏面として出す。",IDC_ISCLEARED,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,15,20,65,10 + COMBOBOX IDC_MARIOSTATE,15,50,94,54,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + CONTROL "開始ページの敵も出現させる。",IDC_0PAGEBADGUYS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,14,86,101,10 + CONTROL "無敵状態にする。",IDC_INVINCIBLE,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,14,103,67,10 + CONTROL "選択しているオブジェクトのあるページから",IDC_FROMCURPAGE, + "Button",BS_AUTORADIOBUTTON,12,137,127,10 + CONTROL "指定したページから",IDC_FROMDESTPAGE,"Button", + BS_AUTORADIOBUTTON,12,153,67,10 + EDITTEXT IDC_PAGE,79,151,28,14,ES_AUTOHSCROLL + CONTROL "Spin1",IDC_PAGESPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | + UDS_HORZ,104,157,10,14 + PUSHBUTTON "途中開始ページに設定",IDC_HALFPAGE,108,150,74,16 + EDITTEXT IDC_XPOS,38,189,31,12,ES_AUTOHSCROLL + CONTROL "Spin1",IDC_XPOSSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | + UDS_HORZ,68,182,10,14 + COMBOBOX IDC_XPOSHACK,72,189,44,54,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + EDITTEXT IDC_YPOS,38,207,31,12,ES_AUTOHSCROLL + CONTROL "Spin1",IDC_YPOSSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,70,213,10, + 14 + COMBOBOX IDC_YPOSHACK,72,207,44,54,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + DEFPUSHBUTTON "OK",IDOK,129,10,50,14 + PUSHBUTTON "キャンセル",IDCANCEL,129,28,50,14 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,43,9,76,1 + LTEXT "マリオの状態",IDC_STATIC,6,36,34,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,43,38,77,1 + LTEXT "裏面の設定",IDC_STATIC,6,7,35,8 + LTEXT "ページテストプレイの開始ページ",IDC_STATIC,6,121,79,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,88,123,94,1 + LTEXT "オプション",IDC_STATIC,7,72,22,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,31,74,151,1 + LTEXT "ページテストプレイの初期位置",IDC_STATIC,7,173,77,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,85,176,97,1 + LTEXT "横位置",IDC_STATIC,15,191,22,8 + LTEXT "縦位置",IDC_STATIC,15,209,22,8 +END + +AREASORTDLG DIALOG DISCARDABLE 0, 0, 255, 178 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION | WS_SYSMENU +CAPTION "エリアの開始ルームの編集" +FONT 9, "MS Pゴシック" +BEGIN + LISTBOX IDC_AREA,7,7,116,161,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | + WS_HSCROLL | WS_TABSTOP + PUSHBUTTON "↑",IDC_UP,128,67,15,14 + PUSHBUTTON "↓",IDC_DOWN,128,94,15,14 + CONTROL "",IDC_VIEW,"Static",SS_BITMAP | SS_SUNKEN,149,38,100, + 108 + EDITTEXT IDC_PAGEEDIT,214,154,28,14,ES_CENTER | ES_AUTOHSCROLL + CONTROL "Spin3",IDC_PAGEEDITSPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS | UDS_HORZ,239,154,10,14 + LTEXT "ページ",IDC_STATIC,194,157,17,8 +END + +LOOPWIZARDDLG DIALOGEX 0, 0, 311, 153 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION +CAPTION "ループ作成ウィザード" +FONT 9, "MS Pゴシック", 0, 0, 0x1 +BEGIN + DEFPUSHBUTTON "作成",IDOK,28,132,50,14 + PUSHBUTTON "キャンセル",IDCANCEL,113,132,50,14 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ | SS_SUNKEN,7,123, + 185,1 + EDITTEXT IDC_PAGE,123,78,22,14,ES_AUTOHSCROLL + CONTROL "Spin1",IDC_PAGESPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,145,78,9, + 14 + COMBOBOX IDC_YPOS,122,100,32,82,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + COMBOBOX IDC_DATA,7,31,181,104,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "ループの作成ページ",IDC_STATIC,17,80,68,8 + LTEXT "データのまとまりの指定",IDC_STATIC,7,17,154,8 + LTEXT "ループを起こさない縦位置の指定",IDC_STATIC,17,102,93,8 + COMBOBOX IDC_WORLD,121,55,33,79,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "ワールド",IDC_STATIC,17,57,95,8 + EDITTEXT IDC_NOTE,198,15,106,123,ES_MULTILINE | ES_AUTOVSCROLL | + ES_READONLY | ES_WANTRETURN | NOT WS_BORDER | NOT + WS_TABSTOP,WS_EX_TRANSPARENT +END + +EDITOROPTIONDLG DIALOG DISCARDABLE 0, 0, 187, 25 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION +FONT 9, "MS Pゴシック" +BEGIN + CONTROL "ルームごとのオブジェクトの保護機能を有効にする。", + IDC_ISADDRESS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,7, + 153,10 +END + +EMULATOROPTIONDLG DIALOG DISCARDABLE 0, 0, 187, 82 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION | WS_SYSMENU +FONT 9, "MS Pゴシック" +BEGIN + CONTROL "MMXを有効にする。",IDC_SPEEDOPTIMIZE,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,7,73,10 + CONTROL "ジョイスティックを使用しない。",IDC_SKIPJOYREAD,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,24,90,10 + COMBOBOX IDC_JOYSTICKID,71,41,64,59,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + CONTROL "ジョイスティックのpoint of viewを有効にする。",IDC_USEPOV, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,61,134,10 + LTEXT "使用するジョイスティック",IDC_STATIC_JOYSTICKID,7,44,58,8 +END + +SENDOBJECTDLG DIALOG DISCARDABLE 0, 0, 185, 127 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTERMOUSE | WS_POPUP | WS_VISIBLE | + WS_CAPTION +CAPTION "オブジェクトの送り先の指定" +FONT 9, "MS Pゴシック" +BEGIN + COMBOBOX IDC_DATA,142,78,29,123,CBS_DROPDOWN | WS_VSCROLL | + WS_TABSTOP + EDITTEXT IDC_PAGEEDIT2,142,101,29,14,ES_CENTER | ES_AUTOHSCROLL + CONTROL "Spin3",IDC_PAGEEDIT2SPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS | UDS_HORZ,170,101,7,14 + DEFPUSHBUTTON "OK",IDOK,128,7,50,14 + PUSHBUTTON "キャンセル",IDCANCEL,128,24,50,14 + CONTROL "",IDC_VIEW,"Static",SS_BITMAP | SS_SUNKEN,13,8,100,108 + LTEXT "ルーム",IDC_STATIC,123,79,15,8 + LTEXT "ページ",IDC_STATIC,122,104,17,8 +END + +BADGUYSCOMEDITDLG DIALOG DISCARDABLE 0, 0, 359, 161 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTERMOUSE | WS_POPUP | WS_VISIBLE | + WS_CAPTION +CAPTION "編集" +FONT 9, "MS Pゴシック" +BEGIN + EDITTEXT IDC_XPOS,32,17,24,14,ES_CENTER + CONTROL "Spin1",IDC_XPOSSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | + UDS_HORZ,55,17,7,14 + EDITTEXT IDC_YPOS,86,17,24,14,ES_CENTER | ES_AUTOHSCROLL + CONTROL "Spin1",IDC_YPOSSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,110,17,7, + 14 + CONTROL "改ページフラグ",IDC_PAGEFLAG,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,122,14,52,10 + CONTROL "5-3以降出現",IDC_BIT6,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,122,26,54,10 + COMBOBOX IDC_TYPE,31,39,142,165,CBS_DROPDOWNLIST | + CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP + CONTROL "ページ送りコマンド",IDC_ISPAGECOMMAND,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,8,58,57,10 + EDITTEXT IDC_PAGEEDIT,69,56,23,14,ES_AUTOHSCROLL + CONTROL "Spin1",IDC_PAGEEDITSPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS | UDS_HORZ,94,56,7,14 + EDITTEXT IDC_XPOS2,33,89,24,14,ES_CENTER + CONTROL "Spin1",IDC_XPOS2SPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | + UDS_HORZ,56,89,10,14 + CONTROL "改ページフラグ",IDC_PAGEFLAG2,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,71,90,52,10 + CONTROL "プレビュー",IDC_OPENPREVIEW,"Button",BS_AUTOCHECKBOX | + BS_PUSHLIKE | WS_TABSTOP,134,86,46,12 + EDITTEXT IDC_WORLD,33,108,24,14,ES_CENTER | ES_AUTOHSCROLL + CONTROL "Spin2",IDC_WORLDSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,57,108,9, + 14 + COMBOBOX IDC_DATA,93,108,26,123,CBS_DROPDOWN | WS_VSCROLL | + WS_TABSTOP + EDITTEXT IDC_PAGEEDIT2,149,107,24,14,ES_CENTER | ES_AUTOHSCROLL + CONTROL "Spin3",IDC_PAGEEDIT2SPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS | UDS_HORZ,172,107,7,14 + CONTROL "バイナリ入力",IDC_ISBIN,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,3,128,48,10 + EDITTEXT IDC_BIN,13,141,127,14,ES_AUTOHSCROLL + EDITTEXT IDC_OFFSET,184,138,22,12,ES_RIGHT | ES_READONLY | NOT + WS_BORDER | NOT WS_TABSTOP + DEFPUSHBUTTON "OK",IDOK,190,12,43,14 + PUSHBUTTON "キャンセル",IDCANCEL,191,30,43,14 + LTEXT "横位置",IDC_STATIC_XPOS1,8,20,22,8 + LTEXT "縦位置",IDC_STATIC_YPOS,62,19,22,8 + LTEXT "種類",IDC_STATIC_TYPE,8,41,15,8 + LTEXT "ルーム",IDC_STATIC_ROOM,73,110,15,8 + LTEXT "ワールド",IDC_STATIC_WORLD,9,110,19,8 + LTEXT "ページ",IDC_STATIC_PAGE,128,110,17,8 + LTEXT "横位置",IDC_STATIC_XPOS2,7,91,22,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,63,78,120,1 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,50,131,134,1 + LTEXT "バイト目",IDC_STATIC,210,138,22,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDVERT,238,13,1,120 + CONTROL "",IDC_VIEW,"Static",SS_BITMAP | SS_SUNKEN,246,20,100, + 108 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,32,8,150,1 + LTEXT "ルーム間移動の命令",IDC_STATIC_ROOMMOVE,3,76,56,8 + LTEXT "オブジェクト",IDC_STATIC_OBJECT,3,5,30,8 +END + +GAMESETTING1UPDLG DIALOG DISCARDABLE 0, 0, 187, 111 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION +FONT 9, "MS Pゴシック" +BEGIN + COMBOBOX IDC_WORLD,17,34,48,119,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + EDITTEXT IDC_COINSFOR1UP,79,34,30,14,ES_AUTOHSCROLL + CONTROL "Spin2",IDC_COINSFOR1UPSPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS,109,34,9,14 + LTEXT "隠れブロックの1UPキノコのためのコインの枚数",IDC_STATIC,7,13,120, + 8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,130,16,47,1 +END + +GAMESETTINGWARPZONEDLG DIALOG DISCARDABLE 0, 0, 187, 95 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION +FONT 9, "MS Pゴシック" +BEGIN + EDITTEXT IDC_WARPA1,57,32,29,14,ES_AUTOHSCROLL + CONTROL "Spin2",IDC_WARPASPIN1,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,85,32,9, + 14 + EDITTEXT IDC_WARPA2,100,32,29,14,ES_AUTOHSCROLL + CONTROL "Spin2",IDC_WARPASPIN2,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,129,31,9, + 14 + EDITTEXT IDC_WARPA3,142,32,29,14,ES_AUTOHSCROLL + CONTROL "Spin2",IDC_WARPASPIN3,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,171,32,9, + 14 + EDITTEXT IDC_WARPB1,57,49,29,14,ES_AUTOHSCROLL + CONTROL "Spin2",IDC_WARPBSPIN1,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,86,49,9, + 14 + EDITTEXT IDC_WARPB2,100,49,29,14,ES_AUTOHSCROLL + CONTROL "Spin2",IDC_WARPBSPIN2,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,130,49,9, + 14 + EDITTEXT IDC_WARPB3,142,49,29,14,ES_AUTOHSCROLL + CONTROL "Spin2",IDC_WARPBSPIN3,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,171,49,9, + 14 + EDITTEXT IDC_WARPC1,57,65,29,14,ES_AUTOHSCROLL + CONTROL "Spin2",IDC_WARPCSPIN1,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,86,65,9, + 14 + EDITTEXT IDC_WARPC2,100,65,29,14,ES_AUTOHSCROLL + CONTROL "Spin2",IDC_WARPCSPIN2,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,129,65,9, + 14 + EDITTEXT IDC_WARPC3,142,65,29,14,ES_AUTOHSCROLL + CONTROL "Spin2",IDC_WARPCSPIN3,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,172,65,9, + 14 + LTEXT "ワープゾーン 1",IDC_STATIC,13,34,37,8 + LTEXT "ワープゾーン 2",IDC_STATIC,13,51,39,10 + LTEXT "ワープゾーン 3",IDC_STATIC,13,68,36,9 + LTEXT "ワープゾーンの行き先ワールド",IDC_STATIC,7,13,74,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,85,16,92,1 +END + +GAMESETTINGKOOPADLG DIALOG DISCARDABLE 0, 0, 195, 93 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION +FONT 9, "MS Pゴシック" +BEGIN + EDITTEXT IDC_WORLD,26,28,30,14,ES_AUTOHSCROLL + CONTROL "Spin1",IDC_WORLDSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,56,28,10, + 14 + COMBOBOX IDC_KOOPAWORLD,27,65,46,132,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KOOPA,84,65,99,132,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "ハンマーを出し始めるワールド",IDC_STATIC,8,11,74,8 + LTEXT "クッパの正体",IDC_STATIC,9,50,38,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,46,52,134,1 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,81,15,100,1 +END + +GAMESETTINGWORLDDLG DIALOG DISCARDABLE 0, 0, 187, 101 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION +FONT 9, "MS Pゴシック" +BEGIN + EDITTEXT IDC_DIFFICULTYWORLD,38,24,25,14,ES_AUTOHSCROLL + CONTROL "Spin1",IDC_DIFFICULTYWORLDSPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS,64,24,9,14 + EDITTEXT IDC_DIFFICULTYAREA,99,24,28,14,ES_AUTOHSCROLL + CONTROL "Spin1",IDC_DIFFICULTYAREASPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS,127,24,9,14 + EDITTEXT IDC_SEABLOCKWORLD,20,70,28,14,ES_AUTOHSCROLL + CONTROL "Spin1",IDC_SEABLOCKWORLDSPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS,49,70,9,14 + LTEXT "難易度の境目",IDC_STATIC,7,10,49,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,59,13,121,1 + LTEXT "ワールド",IDC_STATIC,14,27,21,8 + LTEXT "エリア",IDC_STATIC,81,27,12,8 + LTEXT "海面のブロックが城のブロックになるワールド",IDC_STATIC,8,51,114, + 8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,125,54,55,1 +END + +GENERALSETTINGDLG DIALOG DISCARDABLE 0, 0, 187, 51 +STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION +CAPTION "全般の設定" +FONT 9, "MS Pゴシック" +BEGIN + EDITTEXT IDC_CLEARWORLD,17,24,25,14,ES_AUTOHSCROLL + CONTROL "Spin1",IDC_CLEARWORLDSPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS,42,25,9,14 + CONTROL "カスタム",IDC_ISCLEARWORLD,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,65,28,33,10 + DEFPUSHBUTTON "OK",IDOK,122,10,50,14 + PUSHBUTTON "キャンセル",IDCANCEL,122,30,50,14 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,58,12,45,1 + LTEXT "クリアーとなるワールド",IDC_STATIC,7,10,55,8 +END + +APPOPTIONDLG DIALOG DISCARDABLE 0, 0, 207, 93 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "アプリケーション" +FONT 9, "MS Pゴシック" +BEGIN + EDITTEXT IDC_HELPPATH,13,29,139,14,ES_AUTOHSCROLL + PUSHBUTTON "参照",IDC_BROWSE,163,29,31,14 +END + +CUSTOMIZEDLG DIALOG DISCARDABLE 0, 0, 354, 253 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "カスタマイズ" +FONT 9, "MS Pゴシック" +BEGIN + COMBOBOX IDC_KEYID,33,21,102,69,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LISTBOX IDC_KEYLIST,33,43,103,36,LBS_NOINTEGRALHEIGHT | + WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYVALUE,33,88,103,129,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + CONTROL "Ctrl",IDC_CTRL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,34, + 111,27,10 + CONTROL "Alt",IDC_ALT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,73, + 111,25,10 + CONTROL "Shift",IDC_SHIFT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, + 109,111,30,10 + COMBOBOX IDC_PRESET,23,141,98,69,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + PUSHBUTTON "ロード",IDC_RESET,126,141,38,14 + LISTBOX IDC_WHEELLIST,34,180,103,37,LBS_NOINTEGRALHEIGHT | + WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_WHEELCOMMAND,34,224,104,129,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LISTBOX IDC_JOYBUTTONLIST,210,22,103,36,LBS_NOINTEGRALHEIGHT | + WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_JOYBUTTONVALUE,210,65,104,129,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + DEFPUSHBUTTON "OK",IDOK,236,223,50,14 + PUSHBUTTON "キャンセル",IDCANCEL,292,223,50,14 + LTEXT "キーボード",IDC_STATIC,7,7,26,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,35,11,138,1 + LTEXT "対象",IDC_STATIC,13,23,15,8 + LTEXT "内容",IDC_STATIC,13,60,15,8 + LTEXT "値",IDC_STATIC,16,102,8,8 + GROUPBOX "プリセット キー",IDC_STATIC,14,129,158,32 + LTEXT "マウスホイール",IDC_STATIC,7,167,32,8 + LTEXT "同時キー",IDC_STATIC,9,196,24,8 + LTEXT "内容",IDC_STATIC,13,226,15,8 + LTEXT "ジョイスティック",IDC_STATIC,180,7,32,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,216,11,132,1 + LTEXT "内容",IDC_STATIC,188,35,15,8 + LTEXT "値",IDC_STATIC,191,67,8,8 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,40,170,132,1 +END + +APPLICATIONOPTIONDLG DIALOG DISCARDABLE 0, 0, 187, 24 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION +FONT 9, "MS Pゴシック" +BEGIN + CONTROL "上書き保存時に、確認メッセージボックスを表示する。", + IDC_MSGONSAVE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,7, + 173,10 +END + +OBJECTVIEWOPTIONDLG DIALOG DISCARDABLE 0, 0, 187, 90 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION +FONT 9, "MS Pゴシック" +BEGIN + CONTROL "補助ビットマップを非表示にする。",IDC_NOTDRAWASSISTBMP, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,7,173,10 +END + +LOADCHROPTION DIALOGEX 0, 0, 187, 22 +STYLE WS_CHILD | WS_CLIPSIBLINGS +EXSTYLE WS_EX_CONTROLPARENT +FONT 9, "MS Pゴシック", 0, 0, 0x1 +BEGIN + CONTROL "キャラクタロム全体を読み込む。",IDC_TITLE,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,7,173,8 +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resrc1.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""resource.h""\r\n" + "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" + "#include ""windows.h""\r\n" + "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" + "#include ""windowsx.h""\r\n" + "#include ""winver.h""\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO DISCARDABLE +BEGIN + "VERSIONDLG", DIALOG + BEGIN + RIGHTMARGIN, 189 + BOTTOMMARGIN, 64 + END + + "ROOMSELECTDLG", DIALOG + BEGIN + LEFTMARGIN, 3 + RIGHTMARGIN, 156 + BOTTOMMARGIN, 196 + END + + "MAPCOMHEADEDITDLG", DIALOG + BEGIN + LEFTMARGIN, 3 + RIGHTMARGIN, 303 + TOPMARGIN, 2 + BOTTOMMARGIN, 178 + END + + "MAPCOMEDITDLG", DIALOG + BEGIN + LEFTMARGIN, 2 + RIGHTMARGIN, 261 + TOPMARGIN, 1 + BOTTOMMARGIN, 156 + END + + "GAMESETTINGDLG", DIALOG + BEGIN + LEFTMARGIN, 1 + RIGHTMARGIN, 157 + TOPMARGIN, 2 + BOTTOMMARGIN, 189 + END + + "STRINGEDITDLG", DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 240 + TOPMARGIN, 6 + BOTTOMMARGIN, 45 + END + + "LOOPEDITDLG", DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 208 + TOPMARGIN, 7 + BOTTOMMARGIN, 176 + END + + "TESTPLAYSETTINGDLG", DIALOG + BEGIN + LEFTMARGIN, 1 + RIGHTMARGIN, 188 + TOPMARGIN, 3 + END + + "AREASORTDLG", DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 249 + TOPMARGIN, 7 + BOTTOMMARGIN, 168 + END + + "LOOPWIZARDDLG", DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 304 + TOPMARGIN, 6 + BOTTOMMARGIN, 146 + END + + "EDITOROPTIONDLG", DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 18 + END + + "EMULATOROPTIONDLG", DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 75 + END + + "SENDOBJECTDLG", DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 178 + TOPMARGIN, 7 + BOTTOMMARGIN, 120 + END + + "BADGUYSCOMEDITDLG", DIALOG + BEGIN + LEFTMARGIN, 3 + RIGHTMARGIN, 351 + BOTTOMMARGIN, 155 + END + + "GAMESETTING1UPDLG", DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 104 + END + + "GAMESETTINGWARPZONEDLG", DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 88 + END + + "GAMESETTINGKOOPADLG", DIALOG + BEGIN + LEFTMARGIN, 6 + RIGHTMARGIN, 188 + TOPMARGIN, 7 + BOTTOMMARGIN, 86 + END + + "GAMESETTINGWORLDDLG", DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 94 + END + + "GENERALSETTINGDLG", DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 44 + END + + "APPOPTIONDLG", DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 200 + TOPMARGIN, 7 + BOTTOMMARGIN, 86 + END + + "CUSTOMIZEDLG", DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 348 + TOPMARGIN, 7 + BOTTOMMARGIN, 246 + END + + "APPLICATIONOPTIONDLG", DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 17 + END + + "OBJECTVIEWOPTIONDLG", DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 83 + END + + "LOADCHROPTION", DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 15 + END +END +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Bitmap +// + +TOOLBAR_IMG BITMAP DISCARDABLE "image/toolbar.bmp" +SEA_IMG BITMAP DISCARDABLE "image/sea_img.bmp" +SKY_IMG BITMAP DISCARDABLE "image/sky_img.bmp" +UG_IMG BITMAP DISCARDABLE "image/ug_img.bmp" +CASTLE_IMG BITMAP DISCARDABLE "image/castle_img.bmp" +TVMASK BITMAP DISCARDABLE "image/tvmask.bmp" +RG_IMG BITMAP DISCARDABLE "image/rg_img.bmp" +LF_IMG BITMAP DISCARDABLE "image/lf_img.bmp" +IDB_XGAUGE_IMG BITMAP DISCARDABLE "image/xgauge_img.bmp" +IDB_YGAUGE_IMG BITMAP DISCARDABLE "image/ygauge_img.bmp" +ASSIST_IMG BITMAP DISCARDABLE "image\\assist_img.bmp" +#endif // 日本語 resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/src/resrc1.h b/src/resrc1.h new file mode 100644 index 0000000..2b74410 --- /dev/null +++ b/src/resrc1.h @@ -0,0 +1,17 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by resource_j.rc +// + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NO_MFC 1 +#define _APS_3D_CONTROLS 1 +#define _APS_NEXT_RESOURCE_VALUE 179 +#define _APS_NEXT_COMMAND_VALUE 40052 +#define _APS_NEXT_CONTROL_VALUE 2216 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/src/roommng.c b/src/roommng.c new file mode 100644 index 0000000..472c8b4 --- /dev/null +++ b/src/roommng.c @@ -0,0 +1,1538 @@ +/************************************************************************************ + + smb Utility + + File: roommng.c + Description: + History: + + ************************************************************************************/ +/* + + アドレス・ワールドの区分・メインル−ムIDを操作する + + アドレス管理(RM) + オブジェクト管理(OM) + + ルームと敵・マップデータのアドレスの関係 + ・読み込み + (1)敵・マップデータの開始アドレス(RM) + (2)有効なルームIDの列挙(RM) + (3)ルームIDが有効であるか無効であるかのチェック(RM) + ・書き込み + (1)ルームのタイプの変更(RM, OM) + (2)ルーム間のオブジェクトの移動(RM, OM) + + ワールド・エリアとルームの関係 + + 「B」現在編集中のルームに関連 + ・ルーム選択ダイアログの表示(RM,OM) + ・情報の取得(RM,OM) +  ルームID、開始ページ、ワールド、エリア、エリア2 + + ワールドに関連 + ・クリアとなるワールドの管理(RM) + ・ワールドの区分のデータの管理(RM, OM) + + +*/ +#include "smbutil.h" +#include "roommng.h" +#include "objview.h" +#include "objlist.h" +#include "objlib.h" +#include "roomseldlg.h" +#include "objmng.h" +#include "emuutil.h" +#include "emulator.h" //ClearEmuBackBuffer();の為だけ + +/********************* + + + *********************/ +/* +typedef struct _tagGLOBALROOMDATA +{ + BYTE bWorld[256];//ワールドの区分 + BYTE bMainRoomID[SMB_NUM_AREAS];//メインルームのルームIDの指定 + BYTE addrHeadMap[4]; + ADDRESSDATA addrDataMap[SMB_NUM_ADDRESSDATA]; + BYTE addrHeadBadGuys[4]; + ADDRESSDATA addrDataBadGuys[SMB_NUM_ADDRESSDATA]; +}GLOBALROOMDATA, FAR *LPGLOBALROOMDATA; +*/ + +BYTE bWorldData[SMB_NUM_WORLDS];//ワールドの区分 +BYTE bAreaData[SMB_NUM_AREAS];//メインルームのルームIDの指定 +BYTE addrHeadMap[4]; +ADDRESSDATA addrDataMap[SMB_NUM_ADDRESSDATA]; +BYTE addrHeadBadGuys[4]; +ADDRESSDATA addrDataBadGuys[SMB_NUM_ADDRESSDATA]; + +static void LoadCommandAddrData() +{ + int i; + // Load Value + memcpy(bWorldData,bPRGROM+SMB_WORLD_SETTING,/*GetNumWorlds()*/SMB_NUM_WORLDS); + memcpy(bAreaData,bPRGROM+SMB_AREA_SETTING,36); + memcpy(addrHeadMap,bPRGROM+SMB_MAP_ADDRESS_HEAD,4); + for(i=0;ibHead <((GETVALIDROONIDS*)arg2)->bHead) + return -1; + else if(((GETVALIDROONIDS*)arg1)->bHead==((GETVALIDROONIDS*)arg2)->bHead) + return 0; + else + return 1; +} + +//pbBufは、SMB_NUM_ADDRESSDATAバイト以上のバッファー +void GetValidRoomIDs(LPBYTE pbBuf) +{ + GETVALIDROONIDS gvrhMap[4+1]; + GETVALIDROONIDS gvrBadGuys[4+1]; + BYTE bAttr[]={0x00,0x20,0x40,0x60}; + int n,b; + + for(n=0;n<4;n++) + { + gvrhMap[n].bHead=addrHeadMap[n]; + gvrhMap[n].bAttr=bAttr[n]; + gvrBadGuys[n].bHead=addrHeadBadGuys[n]; + gvrBadGuys[n].bAttr=bAttr[n]; + } + gvrhMap[4].bHead=SMB_NUM_ADDRESSDATA; + gvrBadGuys[4].bHead=SMB_NUM_ADDRESSDATA; + + qsort(gvrhMap,4,sizeof(GETVALIDROONIDS),compare); + qsort(gvrBadGuys,4,sizeof(GETVALIDROONIDS),compare); + + for(n=0,b=0;n<4;n++) + { + int i,max; + max=gvrhMap[n+1].bHead-gvrhMap[n].bHead; + for(i=0;i>5)&0x03); + iOldAreaNum=(bRoomID&0x1F); + + for(n=0;n<4;n++) + { + //マップ + if(addrHeadMap[iOldAttr]addrHeadMap[n]) bTmpMap=addrHeadMap[n]; + } + //敵 + if(addrHeadBadGuys[iOldAttr]addrHeadBadGuys[n]) bTmpBadGuys=addrHeadBadGuys[n]; + } + } + + if(bTmpMap==0x20) bTmpMap=34-addrHeadMap[iOldAttr]; + else bTmpMap-=addrHeadMap[iOldAttr]; + + if(bTmpBadGuys==0x20) bTmpBadGuys=34-addrHeadBadGuys[iOldAttr]; + else bTmpBadGuys-=addrHeadBadGuys[iOldAttr]; + + if(bTmpMap<=iOldAreaNum || bTmpBadGuys<=iOldAreaNum) return FALSE; + + return TRUE; +} + +/************************* + + ワールド数の取得・変更 + +**************************/ +// ワールドの数、1==ワールド1でクリア,2==ワールド2でクリア +int g_iNumWorlds; + +#define SMB_CLEAR_STRINGMUSIC 0x8428 +#define SMB_CLEAR_JUDGE 0x846A +#define SMB_CLEAR_PEACH 0xEA17 + +// 3つとも等しい場合、そのワールドを、等しくない場合-1を返す。 +int GetClearWorld() +{ + BYTE bStr,bJdg,bPch; + + bStr=bPRGROM[SMB_CLEAR_STRINGMUSIC]; + bJdg=bPRGROM[SMB_CLEAR_JUDGE]; + bPch=bPRGROM[SMB_CLEAR_PEACH]; + if(bStr==bJdg && bJdg==bPch) return bStr; + return -1; +} + +void SetClearWorld(int iWorld) +{ + bPRGROM[SMB_CLEAR_STRINGMUSIC]=bPRGROM[SMB_CLEAR_JUDGE]=bPRGROM[SMB_CLEAR_PEACH]=(BYTE)iWorld; +} + +void SetNumWorlds(int iWorld) +{ + if(iWorld<0 + || iWorld>SMB_NUM_WORLDS) return; + + g_iNumWorlds=iWorld; +} + +int GetNumWorlds() +{ + return g_iNumWorlds; +} + +BOOL g_fSubRoom; // FALSE==メインルーム, TRUE==サブルーム +int g_iAreaIndex; // メインルームの場合のルームID取得用 +BYTE g_bRoomID; // サブルームの場合のルームID +int g_iPage; // サブルームの開始ページ(メインルームでは、必ず0) +int g_iWorld; // ワールド +int g_iArea; // エリア(通常) +int g_iArea2; // エリア(導入面も1つのエリアとして数える + +/***************************** + + 編集中のルームの情報を得る + +******************************/ +BYTE GetRoomID() +{ + return (g_fSubRoom)?g_bRoomID:MAKE_ROOMID(bAreaData[g_iAreaIndex]); +} + +BYTE rm_GetStartPage() +{ + return g_iPage; +} + +BYTE rm_GetWorld() +{ + return g_iWorld; +} + +BYTE rm_GetArea() +{ + return g_iArea; +} + +BYTE rm_GetArea2() +{ + return g_iArea2; +} + +BOOL rm_IsSubRoom() +{ + return g_fSubRoom; +} + +BOOL rm_IsThereObject() +{ + OBJECTSEEKINFO ObjSeek; + + if (EDITMODE_MAP == GetMapEditMode()){ + return MapSeekFirst(&ObjSeek, GETADDRESS_CURRENT_EDITTING); + } + else{ + return BadGuysSeekFirst(&ObjSeek, GETADDRESS_CURRENT_EDITTING); + } +} +/************************************************************************ + + それぞれのルームの敵・マップデータの先頭アドレス(6502CPUメモリ)を取得 + +*************************************************************************/ + +WORD GetBadGuysAddress(UINT uRoomID) +{ + if(uRoomID==CURRENT_ROOMID) + uRoomID=GetRoomID(); + return addrDataBadGuys[addrHeadBadGuys[((BYTE)uRoomID>>5)&0x3]+((BYTE)uRoomID&0x1F)].word; +} + +WORD GetMapAddress(UINT uRoomID) +{ + if(uRoomID==CURRENT_ROOMID) + uRoomID=GetRoomID(); + return addrDataMap[addrHeadMap[((BYTE)uRoomID>>5)&0x3]+((BYTE)uRoomID&0x1F)].word; +} + + +WORD BadGuysGetAllDataLength(UINT uRoomID) +{ + WORD wRoomAddr; + WORD wTmpAddr; + WORD wNextAddr=SMB_OBJECT_END_ADDRESS; + int n; + + wRoomAddr=GetBadGuysAddress(uRoomID); + + for(n=0;n>5)&0x03]; + tvi.iSelectedImage=g_iTVImgList[((*lpRoomInfo)[nCurRoom].bRoomID>>5)&0x03]; + // Save + tvi.lParam=(LPARAM)nCurRoom; + + tvins.item = tvi; + tvins.hInsertAfter=hPrevItem; + tvins.hParent=hParentItem; + + hParentItem=hPrevItem=(HTREEITEM)SendDlgItemMessage(hDlg,IDC_ROOM,TVM_INSERTITEM,0,(LPARAM)(LPTVINSERTSTRUCT)&tvins); + } + + if((*lpRoomInfo)[nCurRoom].bRoomID==GetRoomID() && + (*lpRoomInfo)[nCurRoom].iPage==g_iPage && + (*lpRoomInfo)[nCurRoom].blAreaStart!=g_fSubRoom && + (*lpRoomInfo)[nCurRoom].iAreaIndex==g_iAreaIndex && + (*lpRoomInfo)[nCurRoom].iWorld==g_iWorld && + (*lpRoomInfo)[nCurRoom].iArea==g_iArea && + (*lpRoomInfo)[nCurRoom].iArea2==g_iArea2 ) + SendDlgItemMessage(hDlg,IDC_ROOM,TVM_SELECTITEM,(WPARAM)TVGN_CARET,(LPARAM)hParentItem); + + + if((*lpRoomInfo)[nCurRoom].iPage>=0 && BadGuysSeekFirst(&sObjSeek,(*lpRoomInfo)[nCurRoom].bRoomID)) + { + for(;;) + { + if((DWORD)(*lpRoomInfo)[nCurRoom].iPage<=sObjSeek.dwPage + && (sObjSeek.pbData[0]&0x0f)==0x0E + && ((sObjSeek.pbData[2]>>5)&0x07)==(*lpRoomInfo)[nCurRoom].iWorld){ + // + int n; + for(n=0;n>3)&0x06)==0x06)?TRUE:FALSE; + + //マップヘッドを飛ばす。 + pbData+=2; + + for(;;) + { + if(pbData>bPRGROM+0xFFFF) return FALSE; + + //検索したエリアが求めるエリアなら終了 + if(bRoomID==bRoomData && iAreaNumber==n) + { + if(piWorld) *piWorld=iWRet; + if(piAreaNormal) *piAreaNormal=iARet; + if(piArea2) *piArea2=iARet2; + + if(iWRet>=GetNumWorlds()) + return FALSE; + + goto ENDSEEK; + } + + if(*pbData==0xFD) break; + + //”おの”のオブジェクト + if(((pbData[0]&0x0F)==0x0D)&&((pbData[1]&0x7F)==0x42)) + { + iWRet++; + iARet=-1; + iARet2=-1; + break; + } + pbData+=2; + } + + if(!blAutoWalk) iARet++; + + iARet2++; + } +ENDSEEK: + return TRUE; +} + +static LPVOID UpdateRoomDepedencyTreeView(HWND hDlg) +{ + int a,r; + HTREEITEM hPrevItem=TVI_FIRST; + ROOMINFO *lpRoomInfo; + + r=0; + lpRoomInfo=(LPROOMINFO)Malloc(sizeof(ROOMINFO)); + if(!lpRoomInfo) return (LPVOID)lpRoomInfo; + + for(a=0;a>5)&0x03]); + SendDlgItemMessage(hDlg,IDC_AREA,LB_ADDSTRING,0,(LPARAM)szBuf); + } +} + +LRESULT CALLBACK AreaSortDlgProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam) +{ + static BOOL sblWritten; + switch (message) + { + case WM_PAINT: + UpdateAreaSortPreview(hDlg); + return FALSE;//重要 + case WM_INITDIALOG: + { + sblWritten=FALSE; + + LoadCommandAddrData(); + UpdateAreaSortListBox(hDlg); + if(!g_fSubRoom) + SendDlgItemMessage(hDlg, IDC_AREA, LB_SETCURSEL, g_iAreaIndex, 0); + else + SendDlgItemMessage(hDlg, IDC_AREA, LB_SETCURSEL, 0, 0); + SendDlgItemMessage(hDlg, IDC_PAGEEDITSPIN, UDM_SETRANGE, 0, MAKEWPARAM(SMB_MAX_PAGE,0)); + return TRUE; + } + case WM_COMMAND: + { + WORD wNotifyCode = HIWORD(wParam); + switch(LOWORD(wParam)) + { + case IDCANCEL: + if(sblWritten){ + undoPrepare(UNDONAME_TOOLAREAROOM); + SaveCommandAddrData(); + OpenNewRoomProcess(); + UpdateWorldData(FALSE); +// gblDataChanged = TRUE; + fr_SetDataChanged(TRUE); + } + EndDialog(hDlg, TRUE); + return TRUE; + case IDC_PAGEEDIT: + { + if(wNotifyCode==EN_CHANGE){ + UpdateAreaSortPreview(hDlg); + } + } + return TRUE; + case IDC_UP: + { + int iSel; + BYTE bTmp; + + iSel=SendDlgItemMessage(hDlg,IDC_AREA,LB_GETCURSEL,0,0); + if(iSel==0 || iSel==LB_ERR) return TRUE; + + sblWritten=TRUE; + + bTmp=bAreaData[iSel]; + bAreaData[iSel]=bAreaData[iSel-1]; + bAreaData[iSel-1]=bTmp; + + UpdateAreaSortListBox(hDlg); + SendDlgItemMessage(hDlg,IDC_AREA,LB_SETCURSEL,iSel-1,0); + UpdateAreaSortPreview(hDlg); + } + return TRUE; + case IDC_DOWN: + { + int iSel; + BYTE bTmp; + + iSel=SendDlgItemMessage(hDlg,IDC_AREA,LB_GETCURSEL,0,0); + if(iSel==SMB_NUM_AREAS-1 || iSel==LB_ERR) return TRUE; + + sblWritten=TRUE; + + bTmp=bAreaData[iSel]; + bAreaData[iSel]=bAreaData[iSel+1]; + bAreaData[iSel+1]=bTmp; + + UpdateAreaSortListBox(hDlg); + SendDlgItemMessage(hDlg,IDC_AREA,LB_SETCURSEL,iSel+1,0); + UpdateAreaSortPreview(hDlg); + return TRUE; + } + case IDC_AREA: + { + if(wNotifyCode==LBN_DBLCLK){ + ROOMSELECT sRoomSel; + int iTmpCurSel; + + iTmpCurSel=SendDlgItemMessage(hDlg,IDC_AREA,LB_GETCURSEL,0,0); + if(iTmpCurSel==LB_ERR) return TRUE; + sRoomSel.blDoInit=TRUE; + sRoomSel.bInitRoomID=bAreaData[iTmpCurSel]; + sRoomSel.uInitPage=0; + sRoomSel.lpszTitle=STRING_AREASORT_TITLE; + if(RoomSelectDialogBox(hDlg,&sRoomSel)){ + sblWritten=TRUE; + bAreaData[iTmpCurSel]=sRoomSel.bNewRoomID; + UpdateAreaSortListBox(hDlg); + SendDlgItemMessage(hDlg,IDC_AREA,LB_SETCURSEL,iTmpCurSel,0); + UpdateAreaSortPreview(hDlg); + } + return TRUE; + } + else if(wNotifyCode==LBN_SELCHANGE) { + UpdateAreaSortPreview(hDlg); + } + } + break; + } + } + } + return FALSE; +} + +/******************** + + + +*********************/ +LRESULT CALLBACK GeneralSettingDlgProc( HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam) +{ + switch (message) + { + case WM_INITDIALOG: + { + int iClrWorld; + // + SendDlgItemMessage(hDlg,IDC_CLEARWORLDSPIN,UDM_SETRANGE,0,MAKEWPARAM(8,1)); + iClrWorld=GetClearWorld(); + if(iClrWorld!=-1) + { + SetDlgItemInt(hDlg,IDC_CLEARWORLD,iClrWorld+1,FALSE); + } + else + { + CheckDlgButton(hDlg,IDC_ISCLEARWORLD,BST_CHECKED); + SetDlgItemInt(hDlg,IDC_CLEARWORLD,1,FALSE); + } + } + break; + case WM_COMMAND: + switch(LOWORD(wParam)) + { + case IDOK: + { + BOOL blSuccess; + int iRet; + if(BST_UNCHECKED==IsDlgButtonChecked(hDlg,IDC_ISCLEARWORLD)) + { + iRet=GetDlgItemInt(hDlg,IDC_CLEARWORLD,&blSuccess,FALSE); + if(blSuccess && (iRet>0 && iRet<=8)){ + // + //undoPrepare(UNDONAME_TOOLGLOBAL); + // + SetClearWorld(iRet-1); + SetNumWorlds(iRet); + } + else + return TRUE; + } +// gblDataChanged=TRUE; + fr_SetDataChanged(TRUE); + } + case IDCANCEL: + { + EndDialog(hDlg, TRUE); + return TRUE; + } + break; + } + } + + return FALSE; +} +/******************** + + ワールドの自動設定 + +*********************/ +void UpdateWorldData(BOOL fCommand) +{ + int w,a; + int iWorld; + + if (fCommand) + undoPrepare(UNDONAME_TOOLWORLD); + + LoadCommandAddrData(); + for(w = 0, a = 0;w < GetNumWorlds();w++){ + bWorldData[w] = a; + for(;;){ + if(!GetWorldArea(&iWorld, NULL, NULL, a, bAreaData[a])) + goto CANCEL; + if(w != iWorld || a >= SMB_NUM_AREAS) break; + a++; + } + + } + +CANCEL: + + SaveCommandAddrData(); +// gblDataChanged = TRUE; + fr_SetDataChanged(TRUE); +} + +/********** + + smbattr + +***********/ +void ChangeRoomAttribute(BYTE bData,int iNewAttr) +{ + int iOldAttr; + int iOldAreaNum; + BYTE bOldAddrHeadMap[4]; + BYTE bOldAddrHeadBadGuys[4]; + int iNewAreaNum; + int n; + BYTE bBuf; + ADDRESSDATA addrDataBuf; + + LoadCommandAddrData(); + + iOldAttr=((bData>>5)&0x3); + iOldAreaNum=(bData&0x1F); + + memcpy(bOldAddrHeadMap,addrHeadMap,4); + memcpy(bOldAddrHeadBadGuys,addrHeadBadGuys,4); + + // 新しい属性と現在の属性が違うかチェックする。 + if(iOldAttr==iNewAttr) return; + + //新しい敵キャラコマンドアドレスヘッダ + /* + 0(海)の属性が増える  1,2,3の属性 を +1 + 1(地上)の属性が増える  2,3 の属性 を +1 + 2(地下)の属性が増える  3 の属性 を +1 + 3(城)の属性が増える + + 0(海)の属性が減る  1,2,3の属性 を -1 + 1(地上)の属性が減る  2,3 の属性 を -1 + 2(地下)の属性が減る  3 の属性 を -1 + 3(城)の属性が減る + + この2つの操作の組み合わせ + */ + //敵キャラ + for(n=0;n<=3;n++) + { + if(bOldAddrHeadBadGuys[n]>bOldAddrHeadBadGuys[iNewAttr]) + addrHeadBadGuys[n]++; + } + for(n=0;n<=3;n++) + { + if(bOldAddrHeadBadGuys[n]>bOldAddrHeadBadGuys[iOldAttr]) + addrHeadBadGuys[n]--; + } + //マップ + for(n=0;n<=3;n++) + { + if(bOldAddrHeadMap[n]>bOldAddrHeadMap[iNewAttr]) + addrHeadMap[n]++; + } + for(n=0;n<=3;n++) + { + if(bOldAddrHeadMap[n]>bOldAddrHeadMap[iOldAttr]) + addrHeadMap[n]--; + } + + //iNewAreaNum の計算(新しいヘッダを計算した後) + bBuf=34; + for(n=0;n<=3;n++) + { + if(addrHeadBadGuys[n]>addrHeadBadGuys[iNewAttr]&&bBuf>addrHeadBadGuys[n]) + bBuf=addrHeadBadGuys[n]; + } + iNewAreaNum=bBuf-addrHeadBadGuys[iNewAttr]-1; + + //敵キャラコマンドアドレスデータの入れ換え + memcpy(&addrDataBuf,&addrDataBadGuys[bOldAddrHeadBadGuys[iOldAttr]+iOldAreaNum],sizeof(ADDRESSDATA)); + for(n=bOldAddrHeadBadGuys[iOldAttr]+iOldAreaNum;n<33;n++) + memcpy(&addrDataBadGuys[n],&addrDataBadGuys[n+1],sizeof(ADDRESSDATA)); + for(n=33;n>addrHeadBadGuys[iNewAttr]+iNewAreaNum;n--) + memcpy(&addrDataBadGuys[n],&addrDataBadGuys[n-1],sizeof(ADDRESSDATA)); + memcpy(&addrDataBadGuys[n],&addrDataBuf,sizeof(ADDRESSDATA)); + + //マップ + memcpy(&addrDataBuf,&addrDataMap[bOldAddrHeadMap[iOldAttr]+iOldAreaNum],sizeof(ADDRESSDATA)); + for(n=bOldAddrHeadMap[iOldAttr]+iOldAreaNum;n<33;n++) + memcpy(&addrDataMap[n],&addrDataMap[n+1],sizeof(ADDRESSDATA)); + for(n=33;n>addrHeadMap[iNewAttr]+iNewAreaNum;n--) + memcpy(&addrDataMap[n],&addrDataMap[n-1],sizeof(ADDRESSDATA)); + memcpy(&addrDataMap[n],&addrDataBuf,sizeof(ADDRESSDATA)); + + + //エリアデータの書き換え + //エリアのデータを新しい属性の書き換える + for(n=0;n<36;n++) + { + if(((bAreaData[n]>>5)&0x3)==iOldAttr) + { + if(iOldAreaNum==(bAreaData[n]&0x1f)) + bAreaData[n]=(iNewAttr<<5)|iNewAreaNum; + else if(iOldAreaNum<(bAreaData[n]&0x1f)) + bAreaData[n]--; + } + } + + //ルーム変更コマンドの書き換え + //・属性を変更したルームへの + //・ルーム指定を変更したルームへの + for(n=0;n<34;n++) + { + BYTE *pbData; + + pbData=bPRGROM+(addrDataBadGuys[n].word); + + for(;;) + { + if(*pbData==0xFF) break; + if((*pbData&0x0f)==0x0E) + { + int iPageFlag=0; + + if(((*(pbData+1)>>5)&0x3)==iOldAttr) + { + if(iOldAreaNum==(*(pbData+1)&0x1f)) + { + if(*(pbData+1)&0x80) iPageFlag=1; + *(pbData+1)=(iNewAttr<<5)|iNewAreaNum; + if(iPageFlag) *(pbData+1)|=0x80; + } + else if(iOldAreaNum<(*(pbData+1)&0x1f)) + { + if(*(pbData+1)&0x80) iPageFlag=1; + *(pbData+1)-=1; + if(iPageFlag) *(pbData+1)|=0x80; + } + } + pbData+=3; + } + else + pbData+=2; + } + } + + //グローバルな値の再設定 + if(g_fSubRoom) g_bRoomID=((iNewAttr<<5)|iNewAreaNum); + + SaveCommandAddrData(); +} + +/******************************** + + オブジェクトのルーム間の移動 + +*********************************/ + +/* +*************重要******************** + 敵オブジェクトとマップオブジェクトでは、 + * ページ送りコマンド + * 改ページフラグを持ったオブジェクト + のようなオブジェクトデータの場合、実際に表示されるオブジェクトの様子には、違いがある。 + 具体的には、敵オブジェクトの場合、 + P ページ ページ送りコマンド + P ページ 改ページフラグを持ったオブジェクト + マップオブジェクトの場合 + P ページ   ページ送りコマンド + (P+1) ページ 改ページフラグを持ったオブジェクト + のように表示される。 + + 以上の +*/ + +// マップ用 + +static BOOL IsMapPageRelatedObject(LPBYTE lpbBuf) +{ + if( (lpbBuf[1]&0x80) || (( (lpbBuf[0]&0x0F)==0x0D) && !((lpbBuf[1])&0x40) )) + return TRUE; + return FALSE; +} + +static UINT MapMoveObject(UINT uRoomIDSrc,int iIndexSrc,UINT uRoomIDDst,int iPageDst) +{ + BYTE bBufSrc[2]; + OBJECTSEEKINFO ObjSeekSrc; + DWORD dwAddrSrc; + OBJECTSEEKINFO ObjSeekDst; + DWORD dwAddrDst; + register int i; + BOOL fPrevDst; + + //Get information of source object + if(iIndexSrc<0 || iPageDst<0 || !MapSeekFirst(&ObjSeekSrc,uRoomIDSrc)) return FALSE; + for(;;) + { + if(ObjSeekSrc.dwIndex==(DWORD)iIndexSrc && !IsMapPageRelatedObject(ObjSeekSrc.pbData)) + break; + if(!MapSeekNext(&ObjSeekSrc)){ + //Msg(STRING_SENDOBJECT_SRCERROR,MB_OK|MB_ICONWARNING); + return MOVEOBJ_ERR_SRCOBJ; + } + } + dwAddrSrc=GetMapAddress(uRoomIDSrc)+ObjSeekSrc.dwOfs+2; + + + //送り先のルームは、SMBエンジンで処理できる範囲のオブジェクト数か + if(MapSeekFirst(&ObjSeekDst,uRoomIDDst)){ + for(;;){ + if(!MapSeekNext(&ObjSeekDst)) + break; + } + } + if(ObjSeekDst.dwOfs + 2 > 0xFF) + return MOVEOBJ_ERR_OBJOVER; + + + //Get information of destinate object(Check) + fPrevDst=FALSE;// 送り先のページにオブジェクトが1つしかない場合への対応のため + if(MapSeekFirst(&ObjSeekDst,uRoomIDDst)){ + for(;;){ + BOOL fPageObj=IsMapPageRelatedObject(ObjSeekDst.pbData); + if((ObjSeekDst.dwPage==(DWORD)iPageDst)){ + if(!fPageObj) break; + fPrevDst=TRUE; + } + else if(fPrevDst){ + if(fPageObj) break; + fPrevDst=FALSE; + } + if(!MapSeekNext(&ObjSeekDst)){ + //Msg(STRING_SENDOBJECT_DSTERROR,MB_OK|MB_ICONWARNING); + return MOVEOBJ_ERR_DSTPAGE; + } + } + } + + // + LoadCommandAddrData(); + + // + memcpy(bBufSrc,ObjSeekSrc.pbData,2); + memmove(ObjSeekSrc.pbData,ObjSeekSrc.pbData+2,SMB_OBJECT_END_ADDRESS-dwAddrSrc-2);//-2は、切り取るオブジェクトのデータ分 + for(i=0;i 0xFF) + return MOVEOBJ_ERR_OBJOVER; + + + //Get information of destination object(check) + fPrevDst=FALSE;// 送り先のページにオブジェクトが1つしかない場合への対応のため + if(BadGuysSeekFirst(&ObjSeekDst,uRoomIDDst)){//for no room object + for(;;) + { + BOOL fPageObj=BadGuysIsPageRelatedObject(ObjSeekDst.pbData); + if((ObjSeekDst.dwPage==(DWORD)iPageDst)){ + if(!fPageObj) break; + fPrevDst=TRUE; + } + else if(fPrevDst){ + if(fPageObj) break; + fPrevDst=FALSE; + } + + if(!BadGuysSeekNext(&ObjSeekDst)){ + //Msg(STRING_SENDOBJECT_DSTERROR,MB_OK|MB_ICONWARNING); + return MOVEOBJ_ERR_DSTPAGE; + } + } + } +// dwAddrDst=GetBadGuysAddress(uRoomIDDst)+ObjSeekDst.dwOfs; + + // + LoadCommandAddrData(); + + // + memcpy(bBufSrc,ObjSeekSrc.pbData,iSrcSize); + memmove(ObjSeekSrc.pbData,ObjSeekSrc.pbData+iSrcSize,SMB_OBJECT_END_ADDRESS-dwAddrSrc-iSrcSize);//-2は、切り取るオブジェクトのデータ分 + for(i=0;i0) SetSelectedItem(GetSelectedIndex()-1,TRUE); + UpdateObjectViewCursole(); + } + else{ + undoRestore(); + ShowSendDlgError(uRet); + return TRUE; + } + } + else{ + + undoPrepare(UNDONAME_SENDOBJ); + uRet = MapMoveObject(GETADDRESS_CURRENT_EDITTING,GetSelectedIndex(),bRoomID,iPage); + if(uRet == MOVEOBJ_ERR_SUCCESS){ + SortByPosXMap(bRoomID,NULL,FALSE); + if(bRoomID!=GetRoomID() && GetSelectedIndex()>0) SetSelectedItem(GetSelectedIndex()-1,TRUE); + UpdateObjectViewCursole(); + } + else{ + undoRestore(); + ShowSendDlgError(uRet); + return TRUE; + } + } + +// gblDataChanged=TRUE; + fr_SetDataChanged(TRUE); + + UpdateObjectList(0); + UpdateObjectView(0); + } + case IDCANCEL: + { + EndDialog(hDlg, TRUE); + return TRUE; + } + case IDC_DATA: + if(HIWORD(wParam)==CBN_EDITCHANGE) + UpdateBadguysEditDlgPreview(hDlg,FALSE); + else if(HIWORD(wParam)==CBN_SELCHANGE) + UpdateBadguysEditDlgPreview(hDlg,TRUE); + return TRUE; + case IDC_PAGEEDIT2: + if(HIWORD(wParam)==EN_CHANGE){ + UpdateBadguysEditDlgPreview(hDlg,FALSE); + return TRUE; + } + } + } + + return FALSE; +} diff --git a/src/roommng.h b/src/roommng.h new file mode 100644 index 0000000..909d41e --- /dev/null +++ b/src/roommng.h @@ -0,0 +1,113 @@ +/************************************************************************************ + + smb Utility + + File: roommng.h + Description: + History: + + ************************************************************************************/ +#ifndef ROOMMNG_H +#define ROOMMNG_H + +#define SMB_NUM_ADDRESSDATA 34 +#define SMB_NUM_AREAS 36 +#define SMB_NUM_WORLDS 8 + +#define MAKE_ROOMID(b) ((BYTE)( (b)&0x7F )) + +//PRG ADDRESS +#define SMB_WORLD_SETTING 0x9CB4 +#define SMB_AREA_SETTING 0x9CBC +#define SMB_BADGUYS_ADDRESS_HEAD 0x9CE0 +#define SMB_BADGUYS_ADDRESS_LOW 0x9CE4 +#define SMB_BADGUYS_ADDRESS_HIGH 0x9D06 +#define SMB_MAP_ADDRESS_HEAD 0x9D28 +#define SMB_MAP_ADDRESS_LOW 0x9D2C +#define SMB_MAP_ADDRESS_HIGH 0x9D4E + +// +#define MOVEOBJ_ERR_SUCCESS 0 +#define MOVEOBJ_ERR_SRCOBJ 1 +#define MOVEOBJ_ERR_DSTPAGE 2 +#define MOVEOBJ_ERR_OBJOVER 4 + + +extern int g_iPage; +extern int g_iWorld; +extern int g_iArea; +extern int g_iArea2; + +//uRoomIDとして指定すると現在エディットしているアドレスが返ってくる +// 旧 +#define GETADDRESS_CURRENT_EDITTING 0x100 +// 新 +#define CURRENT_ROOMID GETADDRESS_CURRENT_EDITTING + +/************************************** + +**************************************/ +WORD GetBadGuysAddress(UINT uRoomID); + +/************************************** + +**************************************/ +WORD GetMapAddress(UINT uRoomID); + +/************************************** + +**************************************/ +WORD MapGetAllDataLength(UINT uRoomID); + +/************************************** + +**************************************/ +WORD BadGuysGetAllDataLength(UINT uRoomID); + +/************************************** + +**************************************/ +//現在編集しているルームのルームIDを得る +BYTE GetRoomID(); +BYTE rm_GetStartPage(); +BYTE rm_GetWorld(); +BYTE rm_GetArea(); +BYTE rm_GetArea2(); + +BYTE rm_GetMainRoomID(int iAreaIndex); + +BOOL rm_IsThereObject(); + +BOOL rm_IsSubRoom(); + +BOOL rm_Initialize(); + +void rm_UpdateGlobalRoomData(); + +int GetNumWorlds(); + +/************************************** + +**************************************/ +void ChangeRoomAttribute(BYTE bData,int iNewAttr); + +void GetValidRoomIDs(LPBYTE pbBuf); + +BOOL IsRoomIDValid(BYTE bRoomID); + +/************************************** + + ルームを新たに開いた時の初期化を行う + +**************************************/ +void OpenNewRoomProcess(); + +void UpdateWorldData(BOOL); + + + +LRESULT CALLBACK AreaSettingDlgProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam); +LRESULT CALLBACK AreaSortDlgProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam); +LRESULT CALLBACK SendObjectDlgProc( HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam); +LRESULT CALLBACK GeneralSettingDlgProc( HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam); +#endif /* ROOMMNG_H */ \ No newline at end of file diff --git a/src/roomseldlg.c b/src/roomseldlg.c new file mode 100644 index 0000000..58b3bff --- /dev/null +++ b/src/roomseldlg.c @@ -0,0 +1,152 @@ +/************************************************************************************ + + smb Utility + + File: roomseldlg.c + Description: + History: + + ************************************************************************************/ +#include "smbutil.h" +#include "emuutil.h" +#include "roommng.h" +#include "objlib.h" +#include "roomseldlg.h" + +void UpdatePreview(HWND hDlg,BOOL blGetRoomIDFromList) +{ + BYTE bRoomID; + int iPage; + BOOL blSuccess; + char cBuf[10]; + HWND hPVWnd; + HDC hPVdc; + RECT rcPV; + + if(!blGetRoomIDFromList) + { + GetDlgItemText(hDlg,IDC_DATA,cBuf,10); + if(1!=sscanf(cBuf,"%x",&bRoomID)) return; + } + else + { + int iSel; + BYTE bID[SMB_NUM_ADDRESSDATA]; + + GetValidRoomIDs(bID); + iSel=SendDlgItemMessage(hDlg,IDC_DATA,CB_GETCURSEL,0,0); + if(iSel==CB_ERR) return; + bRoomID=bID[iSel]; + } + + if(!IsRoomIDValid(bRoomID)) return; + + iPage=GetDlgItemInt(hDlg,IDC_PAGEEDIT2,&blSuccess,FALSE); + if(!blSuccess) return; + + hPVWnd=GetDlgItem(hDlg,IDC_VIEW); + GetClientRect(hPVWnd,&rcPV); + hPVdc=GetDC(hPVWnd); + if(hPVdc) + { + if(RunEmulatorViewPage(bRoomID,iPage)) + TransferFromEmuBackBuffer(hPVdc,0,0,rcPV.right-rcPV.left,rcPV.bottom-rcPV.top,TRUE); + else + FillRect(hPVdc,&rcPV,GetSysColorBrush(COLOR_3DFACE)); + ReleaseDC(hPVWnd,hPVdc); + } +} + +LRESULT CALLBACK RoomSelectDlgProc( HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam) +{ + switch (message) + { + case WM_INITDIALOG: + { + BYTE bRoomIDs[SMB_NUM_ADDRESSDATA]; + int n; + char cBuf[5]; + LPROOMSELECT lpRoomSelect=(LPROOMSELECT)lParam; + + // + SetWindowLong(hDlg,GWL_USERDATA,(LONG)lpRoomSelect); + + GetValidRoomIDs(bRoomIDs); + for(n=0;nblDoInit){ + // + sprintf(cBuf,"%.2x",lpRoomSelect->bInitRoomID&0x7F); + SetDlgItemText(hDlg,IDC_DATA,cBuf); + // + sprintf(cBuf,"%d",lpRoomSelect->uInitPage); + SetDlgItemText(hDlg,IDC_PAGEEDIT2,cBuf); + } + + if(lpRoomSelect->lpszTitle){ + SetWindowText(hDlg,lpRoomSelect->lpszTitle); + } + } + break; + case WM_PAINT: + UpdatePreview(hDlg,FALSE); + break; + case WM_COMMAND: + switch(LOWORD(wParam)) + { + case IDOK: + { + char cBuf[20]; + BOOL blSuccess; + BYTE bRoomID; + UINT iPage; + LPROOMSELECT lpRoomSelect; + + GetDlgItemText(hDlg,IDC_DATA,cBuf,20); + if(1!=sscanf(cBuf,"%x",&bRoomID)) return TRUE; + if(!IsRoomIDValid(bRoomID)) return TRUE; + iPage=GetDlgItemInt(hDlg,IDC_PAGEEDIT2,&blSuccess,FALSE); + if(!blSuccess) return TRUE; + + lpRoomSelect=(LPROOMSELECT)GetWindowLong(hDlg,GWL_USERDATA); + lpRoomSelect->bNewRoomID=bRoomID; + lpRoomSelect->uNewPage=(UINT)iPage; + + EndDialog(hDlg,TRUE); + return TRUE; + } + case IDCANCEL: + { + EndDialog(hDlg,FALSE); + return TRUE; + } + case IDC_DATA: + if(HIWORD(wParam)==CBN_EDITCHANGE) + UpdatePreview(hDlg,FALSE); + else if(HIWORD(wParam)==CBN_SELCHANGE) + UpdatePreview(hDlg,TRUE); + return TRUE; + case IDC_PAGEEDIT2: + if(HIWORD(wParam)==EN_CHANGE){ + UpdatePreview(hDlg,FALSE); + return TRUE; + } + } + } + + return FALSE; +} + +BOOL RoomSelectDialogBox(HWND hWnd,LPROOMSELECT lpRoomSelect) +{ + BOOL blRet; + + if(!lpRoomSelect) return FALSE; + + blRet=DialogBoxParam(GetModuleHandle(NULL),"SENDOBJECTDLG",hWnd,RoomSelectDlgProc,(LPARAM)lpRoomSelect); + + return blRet; +} \ No newline at end of file diff --git a/src/roomseldlg.h b/src/roomseldlg.h new file mode 100644 index 0000000..e71789c --- /dev/null +++ b/src/roomseldlg.h @@ -0,0 +1,27 @@ +/************************************************************************************ + + smb Utility + + File: roomseldlg.h + Description: + History: + + ************************************************************************************/ +#ifndef ROOMSELDLG_H +#define ROOMSELDLG_H + +//struct and function +typedef struct _tagROOMSELECT +{ + LPTSTR lpszTitle; + BOOL blDoInit; + BYTE bInitRoomID; + UINT uInitPage; + BYTE bNewRoomID; + UINT uNewPage; + +}ROOMSELECT, FAR * LPROOMSELECT; + +BOOL RoomSelectDialogBox(HWND hWnd,LPROOMSELECT lpRoomSelect); + +#endif \ No newline at end of file diff --git a/src/smbutil.dsp b/src/smbutil.dsp new file mode 100644 index 0000000..99c5c9e --- /dev/null +++ b/src/smbutil.dsp @@ -0,0 +1,452 @@ +# Microsoft Developer Studio Project File - Name="smbutil" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** 編集しないでください ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=smbutil - Win32 Debug +!MESSAGE これは有効なメイクファイルではありません。 このプロジェクトをビルドするためには NMAKE を使用してください。 +!MESSAGE [メイクファイルのエクスポート] コマンドを使用して実行してください +!MESSAGE +!MESSAGE NMAKE /f "smbutil.mak". +!MESSAGE +!MESSAGE NMAKE の実行時に構成を指定できます +!MESSAGE コマンド ライン上でマクロの設定を定義します。例: +!MESSAGE +!MESSAGE NMAKE /f "smbutil.mak" CFG="smbutil - Win32 Debug" +!MESSAGE +!MESSAGE 選択可能なビルド モード: +!MESSAGE +!MESSAGE "smbutil - Win32 Release" ("Win32 (x86) Application" 用) +!MESSAGE "smbutil - Win32 Debug" ("Win32 (x86) Application" 用) +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "smbutil - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /MT /W3 /WX /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x411 /d "NDEBUG" +# ADD RSC /l 0x411 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib comdlg32.lib shell32.lib advapi32.lib winmm.lib comctl32.lib imm32.lib libcmt.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib + +!ELSEIF "$(CFG)" == "smbutil - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /MT /W3 /WX /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x411 /d "_DEBUG" +# ADD RSC /l 0x411 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib comdlg32.lib shell32.lib advapi32.lib winmm.lib comctl32.lib imm32.lib libcmtd.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "smbutil - Win32 Release" +# Name "smbutil - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\cmnlib.c +# End Source File +# Begin Source File + +SOURCE=.\emubgset.c +# End Source File +# Begin Source File + +SOURCE=.\emuengine.c +# End Source File +# Begin Source File + +SOURCE=.\emuutil.c +# End Source File +# Begin Source File + +SOURCE=.\filemng.c +# End Source File +# Begin Source File + +SOURCE=.\frame.c +# End Source File +# Begin Source File + +SOURCE=.\ini.c +# End Source File +# Begin Source File + +SOURCE=.\keyaccel.c +# End Source File +# Begin Source File + +SOURCE=.\keys.c +# End Source File +# Begin Source File + +SOURCE=.\logview.c +# End Source File +# Begin Source File + +SOURCE=.\M6502.asm + +!IF "$(CFG)" == "smbutil - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - creating M6502.obj... +IntDir=.\Release +WkspDir=. +InputPath=.\M6502.asm + +"$(IntDir)\m6502.obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + "$(WkspDir)\bin\nasm.exe" -f win32 -o $(IntDir)\m6502.obj $(InputPath) + +# End Custom Build + +!ELSEIF "$(CFG)" == "smbutil - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - creating M6502.obj... +IntDir=.\Debug +WkspDir=. +InputPath=.\M6502.asm + +"$(IntDir)\m6502.obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + "$(WkspDir)\bin\nasm.exe" -f win32 -o $(IntDir)\m6502.obj $(InputPath) + +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\objeditcom.c +# End Source File +# Begin Source File + +SOURCE=.\objeditdlg.c +# End Source File +# Begin Source File + +SOURCE=.\objlib.c +# End Source File +# Begin Source File + +SOURCE=.\objlist.c +# End Source File +# Begin Source File + +SOURCE=.\objmng.c +# End Source File +# Begin Source File + +SOURCE=.\objview.c +# End Source File +# Begin Source File + +SOURCE=.\objviewbmp.c +# End Source File +# Begin Source File + +SOURCE=.\objwndcmn.c +# End Source File +# Begin Source File + +SOURCE=.\resource_j.rc +# End Source File +# Begin Source File + +SOURCE=.\roommng.c +# End Source File +# Begin Source File + +SOURCE=.\roomseldlg.c +# End Source File +# Begin Source File + +SOURCE=.\tools.c +# End Source File +# Begin Source File + +SOURCE=.\undo.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\cmnlib.h +# End Source File +# Begin Source File + +SOURCE=.\common.h +# End Source File +# Begin Source File + +SOURCE=.\emubgset.h +# End Source File +# Begin Source File + +SOURCE=.\emulator.h +# End Source File +# Begin Source File + +SOURCE=.\emuutil.h +# End Source File +# Begin Source File + +SOURCE=.\filemng.h +# End Source File +# Begin Source File + +SOURCE=.\frame.h +# End Source File +# Begin Source File + +SOURCE=.\ini.h +# End Source File +# Begin Source File + +SOURCE=.\keyaccel.h +# End Source File +# Begin Source File + +SOURCE=.\keys.h +# End Source File +# Begin Source File + +SOURCE=.\logview.h +# End Source File +# Begin Source File + +SOURCE=.\M6502.h +# End Source File +# Begin Source File + +SOURCE=.\nespal.h +# End Source File +# Begin Source File + +SOURCE=.\objdata.h +# End Source File +# Begin Source File + +SOURCE=.\objeditcom.h +# End Source File +# Begin Source File + +SOURCE=.\objlib.h +# End Source File +# Begin Source File + +SOURCE=.\objlist.h +# End Source File +# Begin Source File + +SOURCE=.\objmng.h +# End Source File +# Begin Source File + +SOURCE=.\objview.h +# End Source File +# Begin Source File + +SOURCE=.\objviewbmp.h +# End Source File +# Begin Source File + +SOURCE=.\objwndcmn.h +# End Source File +# Begin Source File + +SOURCE=.\resource.h +# End Source File +# Begin Source File + +SOURCE=.\resrc1.h +# End Source File +# Begin Source File + +SOURCE=.\roommng.h +# End Source File +# Begin Source File + +SOURCE=.\roomseldlg.h +# End Source File +# Begin Source File + +SOURCE=.\smbutil.h +# End Source File +# Begin Source File + +SOURCE=.\string_j.h +# End Source File +# Begin Source File + +SOURCE=.\strings.h +# End Source File +# Begin Source File + +SOURCE=.\tools.h +# End Source File +# Begin Source File + +SOURCE=.\undo.h +# End Source File +# Begin Source File + +SOURCE=.\versinfo.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# Begin Source File + +SOURCE=.\assist_img.bmp +# End Source File +# Begin Source File + +SOURCE=.\image\assist_img.bmp +# End Source File +# Begin Source File + +SOURCE=.\image\castle_img.bmp +# End Source File +# Begin Source File + +SOURCE=.\image\emulator.ico +# End Source File +# Begin Source File + +SOURCE=.\image\lf_img.bmp +# End Source File +# Begin Source File + +SOURCE=.\image\maplisti.ico +# End Source File +# Begin Source File + +SOURCE=.\image\mapview.ico +# End Source File +# Begin Source File + +SOURCE=.\data\ram1.bin +# End Source File +# Begin Source File + +SOURCE=.\data\ram2.bin +# End Source File +# Begin Source File + +SOURCE=.\data\ram3.bin +# End Source File +# Begin Source File + +SOURCE=.\image\rg_img.bmp +# End Source File +# Begin Source File + +SOURCE=.\image\rom.ico +# End Source File +# Begin Source File + +SOURCE=.\image\sea_img.bmp +# End Source File +# Begin Source File + +SOURCE=.\image\sky_img.bmp +# End Source File +# Begin Source File + +SOURCE=.\image\smbutil.ico +# End Source File +# Begin Source File + +SOURCE=.\image\toolbar.bmp +# End Source File +# Begin Source File + +SOURCE=.\image\tvmask.bmp +# End Source File +# Begin Source File + +SOURCE=.\image\ug_img.bmp +# End Source File +# Begin Source File + +SOURCE=.\image\xgauge_img.bmp +# End Source File +# Begin Source File + +SOURCE=.\image\ygauge_img.bmp +# End Source File +# End Group +# Begin Group "Document Files" + +# PROP Default_Filter "txt" +# Begin Source File + +SOURCE=.\misc\history.txt +# End Source File +# Begin Source File + +SOURCE=.\document\international.txt +# End Source File +# Begin Source File + +SOURCE=.\misc\readme.txt +# End Source File +# Begin Source File + +SOURCE=.\document\todo.txt +# End Source File +# End Group +# End Target +# End Project diff --git a/src/smbutil.dsw b/src/smbutil.dsw new file mode 100644 index 0000000..3730a00 --- /dev/null +++ b/src/smbutil.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# 警告: このワークスペース ファイル を編集または削除しないでください! + +############################################################################### + +Project: "smbutil"=".\smbutil.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/src/smbutil.h b/src/smbutil.h new file mode 100644 index 0000000..89a4000 --- /dev/null +++ b/src/smbutil.h @@ -0,0 +1,31 @@ +/************************************************************************************ + + smb Utility + + File: smbutil.h + Description: + History: + + ************************************************************************************/ +#ifndef SMBUTIL_H +#define SMBUTIL_H + +#define _WIN32_IE 0x200 +#include //imm32.lib +#include +#include //Comctl32.lib +#include +#include +#include +#include +#include "resource.h" +#include "common.h" +#include "frame.h" +#include "undo.h" +#include "cmnlib.h" +#include "strings.h" +#include "logview.h" + +// #define INTERNATIONAL + +#endif /* SMBUTIL_H */ \ No newline at end of file diff --git a/src/smbutil_i.dsp b/src/smbutil_i.dsp new file mode 100644 index 0000000..5c86b78 --- /dev/null +++ b/src/smbutil_i.dsp @@ -0,0 +1,452 @@ +# Microsoft Developer Studio Project File - Name="smbutil" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** 編集しないでください ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=smbutil - Win32 Debug +!MESSAGE これは有効なメイクファイルではありません。 このプロジェクトをビルドするためには NMAKE を使用してください。 +!MESSAGE [メイクファイルのエクスポート] コマンドを使用して実行してください +!MESSAGE +!MESSAGE NMAKE /f "smbutil_i.mak". +!MESSAGE +!MESSAGE NMAKE の実行時に構成を指定できます +!MESSAGE コマンド ライン上でマクロの設定を定義します。例: +!MESSAGE +!MESSAGE NMAKE /f "smbutil_i.mak" CFG="smbutil - Win32 Debug" +!MESSAGE +!MESSAGE 選択可能なビルド モード: +!MESSAGE +!MESSAGE "smbutil - Win32 Release" ("Win32 (x86) Application" 用) +!MESSAGE "smbutil - Win32 Debug" ("Win32 (x86) Application" 用) +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "smbutil - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /MT /W3 /WX /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "INTERNATIONAL" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x411 /d "NDEBUG" +# ADD RSC /l 0x411 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib comdlg32.lib shell32.lib advapi32.lib winmm.lib comctl32.lib imm32.lib libcmt.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib + +!ELSEIF "$(CFG)" == "smbutil - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /MT /W3 /WX /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "INTERNATIONAL" /YX /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x411 /d "_DEBUG" +# ADD RSC /l 0x411 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib comdlg32.lib shell32.lib advapi32.lib winmm.lib comctl32.lib imm32.lib libcmtd.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "smbutil - Win32 Release" +# Name "smbutil - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\cmnlib.c +# End Source File +# Begin Source File + +SOURCE=.\emubgset.c +# End Source File +# Begin Source File + +SOURCE=.\emuengine.c +# End Source File +# Begin Source File + +SOURCE=.\emuutil.c +# End Source File +# Begin Source File + +SOURCE=.\filemng.c +# End Source File +# Begin Source File + +SOURCE=.\frame.c +# End Source File +# Begin Source File + +SOURCE=.\ini.c +# End Source File +# Begin Source File + +SOURCE=.\keyaccel.c +# End Source File +# Begin Source File + +SOURCE=.\keys.c +# End Source File +# Begin Source File + +SOURCE=.\logview.c +# End Source File +# Begin Source File + +SOURCE=.\M6502.asm + +!IF "$(CFG)" == "smbutil - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - creating M6502.obj... +IntDir=.\Release +WkspDir=. +InputPath=.\M6502.asm + +"$(IntDir)\m6502.obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + "$(WkspDir)\bin\nasm.exe" -f win32 -o $(IntDir)\m6502.obj $(InputPath) + +# End Custom Build + +!ELSEIF "$(CFG)" == "smbutil - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - creating M6502.obj... +IntDir=.\Debug +WkspDir=. +InputPath=.\M6502.asm + +"$(IntDir)\m6502.obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + "$(WkspDir)\bin\nasm.exe" -f win32 -o $(IntDir)\m6502.obj $(InputPath) + +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\objeditcom.c +# End Source File +# Begin Source File + +SOURCE=.\objeditdlg.c +# End Source File +# Begin Source File + +SOURCE=.\objlib.c +# End Source File +# Begin Source File + +SOURCE=.\objlist.c +# End Source File +# Begin Source File + +SOURCE=.\objmng.c +# End Source File +# Begin Source File + +SOURCE=.\objview.c +# End Source File +# Begin Source File + +SOURCE=.\objviewbmp.c +# End Source File +# Begin Source File + +SOURCE=.\objwndcmn.c +# End Source File +# Begin Source File + +SOURCE=.\resource_i.rc +# End Source File +# Begin Source File + +SOURCE=.\roommng.c +# End Source File +# Begin Source File + +SOURCE=.\roomseldlg.c +# End Source File +# Begin Source File + +SOURCE=.\tools.c +# End Source File +# Begin Source File + +SOURCE=.\undo.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\cmnlib.h +# End Source File +# Begin Source File + +SOURCE=.\common.h +# End Source File +# Begin Source File + +SOURCE=.\emubgset.h +# End Source File +# Begin Source File + +SOURCE=.\emulator.h +# End Source File +# Begin Source File + +SOURCE=.\emuutil.h +# End Source File +# Begin Source File + +SOURCE=.\filemng.h +# End Source File +# Begin Source File + +SOURCE=.\frame.h +# End Source File +# Begin Source File + +SOURCE=.\ini.h +# End Source File +# Begin Source File + +SOURCE=.\keyaccel.h +# End Source File +# Begin Source File + +SOURCE=.\keys.h +# End Source File +# Begin Source File + +SOURCE=.\logview.h +# End Source File +# Begin Source File + +SOURCE=.\M6502.h +# End Source File +# Begin Source File + +SOURCE=.\nespal.h +# End Source File +# Begin Source File + +SOURCE=.\objdata.h +# End Source File +# Begin Source File + +SOURCE=.\objeditcom.h +# End Source File +# Begin Source File + +SOURCE=.\objlib.h +# End Source File +# Begin Source File + +SOURCE=.\objlist.h +# End Source File +# Begin Source File + +SOURCE=.\objmng.h +# End Source File +# Begin Source File + +SOURCE=.\objview.h +# End Source File +# Begin Source File + +SOURCE=.\objviewbmp.h +# End Source File +# Begin Source File + +SOURCE=.\objwndcmn.h +# End Source File +# Begin Source File + +SOURCE=.\resource.h +# End Source File +# Begin Source File + +SOURCE=.\resrc1.h +# End Source File +# Begin Source File + +SOURCE=.\roommng.h +# End Source File +# Begin Source File + +SOURCE=.\roomseldlg.h +# End Source File +# Begin Source File + +SOURCE=.\smbutil.h +# End Source File +# Begin Source File + +SOURCE=.\string_i.h +# End Source File +# Begin Source File + +SOURCE=.\strings.h +# End Source File +# Begin Source File + +SOURCE=.\tools.h +# End Source File +# Begin Source File + +SOURCE=.\undo.h +# End Source File +# Begin Source File + +SOURCE=.\versinfo.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# Begin Source File + +SOURCE=.\assist_img.bmp +# End Source File +# Begin Source File + +SOURCE=.\image\assist_img.bmp +# End Source File +# Begin Source File + +SOURCE=.\image\castle_img.bmp +# End Source File +# Begin Source File + +SOURCE=.\image\emulator.ico +# End Source File +# Begin Source File + +SOURCE=.\image\lf_img.bmp +# End Source File +# Begin Source File + +SOURCE=.\image\maplisti.ico +# End Source File +# Begin Source File + +SOURCE=.\image\mapview.ico +# End Source File +# Begin Source File + +SOURCE=.\data\ram1.bin +# End Source File +# Begin Source File + +SOURCE=.\data\ram2.bin +# End Source File +# Begin Source File + +SOURCE=.\data\ram3.bin +# End Source File +# Begin Source File + +SOURCE=.\image\rg_img.bmp +# End Source File +# Begin Source File + +SOURCE=.\image\rom.ico +# End Source File +# Begin Source File + +SOURCE=.\image\sea_img.bmp +# End Source File +# Begin Source File + +SOURCE=.\image\sky_img.bmp +# End Source File +# Begin Source File + +SOURCE=.\image\smbutil.ico +# End Source File +# Begin Source File + +SOURCE=.\image\toolbar.bmp +# End Source File +# Begin Source File + +SOURCE=.\image\tvmask.bmp +# End Source File +# Begin Source File + +SOURCE=.\image\ug_img.bmp +# End Source File +# Begin Source File + +SOURCE=.\image\xgauge_img.bmp +# End Source File +# Begin Source File + +SOURCE=.\image\ygauge_img.bmp +# End Source File +# End Group +# Begin Group "Document Files" + +# PROP Default_Filter "txt" +# Begin Source File + +SOURCE=.\misc\history.txt +# End Source File +# Begin Source File + +SOURCE=.\document\international.txt +# End Source File +# Begin Source File + +SOURCE=.\misc\readme.txt +# End Source File +# Begin Source File + +SOURCE=.\document\todo.txt +# End Source File +# End Group +# End Target +# End Project diff --git a/src/smbutil_i.dsw b/src/smbutil_i.dsw new file mode 100644 index 0000000..a4e24df --- /dev/null +++ b/src/smbutil_i.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# 警告: このワークスペース ファイル を編集または削除しないでください! + +############################################################################### + +Project: "smbutil"=.\smbutil_i.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/src/string_j.h b/src/string_j.h new file mode 100644 index 0000000..4db8fb6 --- /dev/null +++ b/src/string_j.h @@ -0,0 +1,434 @@ +/************************************************************************************ + + smb Utility + + File: string_j.h + Description: + History: + + ************************************************************************************/ +#ifndef STRING_J_H +#define STRING_J_H + +#define PROGRAMNAME "SMB Utility" + +#define STRING_VERSION_CONTRIBUTION "Multi-6502 CPU emulator by Neil Bradley (neil@synthcom.com)" + +#define STRING_NULL "" +#define STRING_UNKNOWN "不明" + +#define STRING_LOGVIEW_FILESAVE "%sに保存しました。" +#define STRING_LOGVIEW_FILEOPEN "%sを開きました。" +#define STRING_LOGVIEW_LOADCHR "%sから%.4xHバイトのCHRROMを読み込みました。" + +//ウインドウのタイトル +// +#define STRING_FILEOPENDIALOG_CHRLOAD "キャラクタロムの読み込み" +#define STRING_WINDOW_EMULATOR "エミュレータ" +#define STRING_WINDOW_OBJLIST "オブジェクト リスト" +#define STRING_WINDOW_OBJVIEW "オブジェクト ビュー" + +// +#define STRING_OBJVIEW_TITLE "%s <%dページ>" +#define STRING_OBJVIEW_TITLE2 "%s <%d-%dページ>" +#define STRING_OBJVIEW_TOOLTIP "%d,(%d,%d) %s" + +//ステータスバー +#define STRING_STATUSBAR_EMULOAD "ロードしました。" +#define STRING_STATUSBAR_EMUSAVE "セーブされました。" +#define STRING_STATUSBAR_FILESAVE "ファイルに保存しました。" + +//ファイルエラー +#define STRING_FILEERROR_SAVE "上書き保存できません。" +#define STRING_FILEERROR_SAVEAS "保存できません。" +#define STRING_FILEERROR_FILEFORMAT "ファイルの形式にエラーがあります。" +#define STRING_FILEERROR_NOTFOUND "ファイルが見つかりません。" + +//メッセージ +#define STRING_CONFIRM_SAVE "上書き保存しますか?" +#define STRING_CONFIRM_EXIT "変更を保存しますか?" +#define STRING_CONFIRM_RELOAD "ファイルが外部エディタで更新されています。\n再ロードしますか。(再ロードすると、未保存の内容は失われます。)" +#define STRING_CONFIRM_DEMORECORD "デモのレコーディングを開始します。" +#define STRING_CONFIRM_DEMORECORD2 "デモのレコーディングを終了しました。" +#define STRING_CONFIRM_UPDATEWORLD "ワールドの区分の更新を行います。" + +//オプション プロパテイ シート +#define STRING_OPTIONDIALOG_TITLE "オプション" +#define STRING_OPTIONDIALOG_EMULATOR "エミュレータ" +#define STRING_OPTIONDIALOG_EDITOR "エディタ" +#define STRING_OPTIONDIALOG_APPLICATION "アプリケーション" +#define STRING_OPTIONDIALOG_OBJECTVIEW "オブジェクトビュー" + +//ツールチップ +#define STRING_TOOLTIP_OPEN "開く" +#define STRING_TOOLTIP_SAVE "上書き保存" +#define STRING_TOOLTIP_ROOM "ルームの変更" +#define STRING_TOOLTIP_BADGUYS "敵" +#define STRING_TOOLTIP_MAP "地形" +#define STRING_TOOLTIP_TESTPLAY "テストプレイ" +#define STRING_TOOLTIP_PAGETESTPLAY "ページテストプレイ" +#define STRING_TOOLTIP_HALFPOINTTESTPLAY "途中ページテストプレイ" +#define STRING_TOOLTIP_STOP "停止" +#define STRING_TOOLTIP_TESTPLAYSETTING "テストプレイの設定" +//#define STRING_TOOLTIP_ETC "、その他" + +// オブジェクトを送るダイアログ +#define STRING_SENDOBJECT_SRCERROR "送り元のオブジェクトは、ページの関係に影響を与えるオブジェクトです。" +#define STRING_SENDOBJECT_DSTERROR "送り先のページには、オブジェクトがありません。" +#define STRING_SENDOBJECT_OVEROBJ "送り先のルームには、これ以上オブジェクトを送ることができません。" + +#define STRING_UNDO_MENUTEXT "元に戻す(&U) \"%s\"" +#define STRING_UNDONAME_KEYEDIT "キーボ-ド入力" +#define STRING_UNDONAME_DLGEDIT "ダイアログ入力" +#define STRING_UNDONAME_SENDOBJ "オブジェクトを送る" +#define STRING_UNDONAME_HEADDLG "設定" +#define STRING_UNDONAME_CHRLOAD "キャラクタロムの読み込み" +#define STRING_UNDONAME_TOOLSTR "文字列の編集" +#define STRING_UNDONAME_TOOLLOOPBIN "ループの編集(バイナリ)" +#define STRING_UNDONAME_TOOLWORLD "ワールドの区分の自動更新" +#define STRING_UNDONAME_TOOLAREAROOM "エリアの開始ルームの編集" +#define STRING_UNDONAME_TOOLDEMORECORDER "デモ レコーダー" +#define STRING_UNDONAME_TOOLOTHER "その他の設定" +//#define STRING_UNDONAME_TOOLGLOBAL "全般の設定" + + +#define STRING_POLEGFX_DEFAULT "デフォルト" +#define STRING_POLEGFX_ROPE "ひも" +#define STRING_POLEGFX_TREE "木" +#define STRING_POLEGFX_OTHER "その他" + +#define STRING_SETTING_WORLDX "ワールド%d" +#define STRING_SETTING_WARPZONE "ワープゾーン" +#define STRING_SETTING_1UP "1UPキノコ" +#define STRING_SETTING_KOOPA "クッパ" +#define STRING_SETTING_WORLD "ワールド" +#define STRING_SETTING_OTHER "その他" +#define STRING_SETTING_TITLE "その他の設定" + + +#define STRING_STRINGDATA_01 "MARIO(ステータス)" +#define STRING_STRINGDATA_02 "MARIO(2P時のタイムアップ)" +#define STRING_STRINGDATA_03 "MARIO(ゲームオーバー時)" +#define STRING_STRINGDATA_04 "LUIGI(ステータス表示/2P時のタイムアップ/ゲームオーバー)" +#define STRING_STRINGDATA_05 "WORLD TIME(ステータス)" +#define STRING_STRINGDATA_06 "WORLD(イントロ画面)" +#define STRING_STRINGDATA_07 "TIME UP" +#define STRING_STRINGDATA_08 "GAME OVER" +#define STRING_STRINGDATA_09 "WELCOME TO WARP ZONE!" +#define STRING_STRINGDATA_10 "THANK YOU MARIO!" +#define STRING_STRINGDATA_11 "THANK YOU LUIGI!" +#define STRING_STRINGDATA_12 "BUT OUR PRINCESS IS IN" +#define STRING_STRINGDATA_13 "ANOTHER CASTLE!" +#define STRING_STRINGDATA_14 "YOUR QUEST IS OVER." +#define STRING_STRINGDATA_15 "WE PRESENT YOU A NEW QUEST." +#define STRING_STRINGDATA_16 "PUSH BUTTON B" +#define STRING_STRINGDATA_17 "TO SELECT A WORLD" +#define STRING_STRINGDATA_18 "著作権表示(タイトル画面)" +#define STRING_STRINGDATA_19 "1 PLAYER GAME(タイトル画面)" +#define STRING_STRINGDATA_20 "2 PLAYER GAME(タイトル画面)" + + +#define STRING_TESTPLAYSETTING_MARIO "マリオ" +#define STRING_TESTPLAYSETTING_SUPERMARIO "スーパーマリオ" +#define STRING_TESTPLAYSETTING_FIREMARIO "ファイアーマリオ" +#define STRING_TESTPLAYSETTING_NONE "無効" +#define STRING_TESTPLAYSETTING_POS "位置" +#define STRING_TESTPLAYSETTING_DOT "ドット" + +#define STRING_EMULATOROPTION_JOYSTICK "ジョイスティック" + +#define STRING_KEYCONFIG_EMU_A "Aボタン" +#define STRING_KEYCONFIG_EMU_B "Bボタン" +#define STRING_KEYCONFIG_EMU_SELECT "セレクトボタン" +#define STRING_KEYCONFIG_EMU_START "スタートボタン" +#define STRING_KEYCONFIG_EMU_UP "上" +#define STRING_KEYCONFIG_EMU_DOWN "下" +#define STRING_KEYCONFIG_EMU_LEFT "左" +#define STRING_KEYCONFIG_EMU_RIGHT "右" +#define STRING_KEYCONFIG_EDIT_ADD1 "種類を+1" +#define STRING_KEYCONFIG_EDIT_DEC1 "種類を-1" +#define STRING_KEYCONFIG_EDIT_ADD16 "種類を+16" +#define STRING_KEYCONFIG_EDIT_DEC16 "種類を-16" +#define STRING_KEYCONFIG_EDIT_UP "位置を上へ" +#define STRING_KEYCONFIG_EDIT_DOWN "位置を下へ" +#define STRING_KEYCONFIG_EDIT_LEFT "位置を左へ" +#define STRING_KEYCONFIG_EDIT_RIGHT "位置を右へ" +#define STRING_KEYCONFIG_EDIT_NEXTPAGE "次のページへ" +#define STRING_KEYCONFIG_EDIT_PREVPAGE "前のページへ" +#define STRING_KEYCONFIG_EDIT_NEXTOBJ "次のオブジェクトへ" +#define STRING_KEYCONFIG_EDIT_PREVOBJ "前のオブジェクトへ" +#define STRING_KEYCONFIG_EDIT_SAVEFILE "ファイル: 上書き保存" +#define STRING_KEYCONFIG_EDIT_UNDO "編集: 元に戻す" +#define STRING_KEYCONFIG_EDIT_ROOM "編集: ルームを開く" +#define STRING_KEYCONFIG_EDIT_BADGUYS "編集: 敵" +#define STRING_KEYCONFIG_EDIT_MAP "編集: 地形" +#define STRING_KEYCONFIG_EDIT_TESTPLAY "エミュレータ: テストプレイ" +#define STRING_KEYCONFIG_EDIT_PAGETESTPLAY "エミュレータ: ページテストプレイ" +#define STRING_KEYCONFIG_EDIT_PAGETESTPLAY2 "エミュレータ: 途中ページテストプレイ" +#define STRING_KEYCONFIG_EDIT_STOP "エミュレータ: 停止" +#define STRING_KEYCONFIG_EDIT_SAVEEMU "エミュレータ: セーブ" +#define STRING_KEYCONFIG_EDIT_LOADEMU "エミュレータ: ロード" +#define STRING_KEYCONFIG_EDIT_EMUSETTING "エミュレータ: テストプレイの設定" +#define STRING_KEYCONFIG_EDIT_NEXTWIN "ウインドウ: 次へ" +#define STRING_KEYCONFIG_EDIT_PREVWIN "ウインドウ: 前へ" +#define STRING_KEYCONFIG_KEYACCEL "キーボードアクセラレータ" +#define STRING_KEYCONFIG_EMULATOR "エミュレータ" +#define STRING_KEYCONFIG_OVERLAPPED "%sの\"%s\"と重複しています。" +#define STRING_KEYCONFIG_INITIALIZE "プリセットキーをロードします。よろしいですか?" +#define STRING_KEYCONFIG_NOTIFY "次回の起動から有効になります。" + +#define STRING_KEYCONFIG_PRESET_DESKTOP "デスクトップ(テンキー編集)" +#define STRING_KEYCONFIG_PRESET_NOTE "ノート(文字キー編集)" + +#define STRING_KEYCONFIG_WHEEL_NONE "なし" +#define STRING_KEYCONFIG_WHEEL_SHIFT "+シフト" +#define STRING_KEYCONFIG_WHEEL_CTRL "+コントロール" +#define STRING_KEYCONFIG_WHEEL_SHIFTCTRL "+シフト+コントロール" +#define STRING_KEYCONFIG_WHEEL_TYPE1 "種類を増減1" +#define STRING_KEYCONFIG_WHEEL_TYPE16 "種類を増減16" +#define STRING_KEYCONFIG_WHEEL_PAGE "ページごとの移動" +#define STRING_KEYCONFIG_WHEEL_OBJ "オブジェクトごとの移動" + +#define STRING_KEYCONFIG_BUTTONX "ボタン%d" + + +#define STRING_OBJLIST_LENNAME "長さ%dの%s" +#define STRING_OBJLIST_UNKNOWN "不明なオブジェクト" +#define STRING_OBJLIST_CRASH "*暴走" +#define STRING_OBJLIST_BACK "背景:%s" +#define STRING_OBJLIST_VIEWBLOCK "景色:%s ブロック:%s" +#define STRING_OBJLIST_ROPE "縦位置0、長さ13のリフトの縦ロープ" +#define STRING_OBJLIST_LENCASTLE "長さ%dの城" +#define STRING_OBJLIST_STEP "幅%d・高さ%dの階段" +#define STRING_OBJLIST_STEP98 "幅9・高さ8の階段" +#define STRING_OBJLIST_STEP98_2 "*幅9・高さ8の階段" +#define STRING_OBJLIST_NONE "*無し" + +#define STRING_OBJLIST_ROOM "ルーム間移動の命令[%.2xH(%s),w=%d,p=%d]" +#define STRING_OBJLIST_PAGECOMMAND "ページ送りコマンド : %.2d" +#define STRING_OBJLIST_HARD "(5-3以降出現)" + +#define STRING_AREASORT_TITLE "エリアの開始ルームの指定" + +#define STRING_SEA "海" +#define STRING_SKY "地上" +#define STRING_UNDERGROUND "地下" +#define STRING_CASTLE "城" + +#define STRING_OBJLIST_COLUMN_BIN "バイナリ" +#define STRING_OBJLIST_COLUMN_PAGE "ページ" +#define STRING_OBJLIST_COLUMN_POS "位置" +#define STRING_OBJLIST_COLUMN_TYPE "種類" + +#define STRING_OBJDATA_MAP_B_01 "?ブロック(パワーキノコ)" +#define STRING_OBJDATA_MAP_B_02 "?ブロック(コイン1枚)" +#define STRING_OBJDATA_MAP_B_03 "隠れブロック(コイン1枚)" +#define STRING_OBJDATA_MAP_B_04 "隠れブロック(1UPキノコ)" +#define STRING_OBJDATA_MAP_B_05 "レンガブロック(パワーキノコ)" +#define STRING_OBJDATA_MAP_B_06 "レンガブロック(豆の木)" +#define STRING_OBJDATA_MAP_B_07 "レンガブロック(スター)" +#define STRING_OBJDATA_MAP_B_08 "レンガブロック(10コイン)" +#define STRING_OBJDATA_MAP_B_09 "レンガブロック(1UPキノコ)" +#define STRING_OBJDATA_MAP_B_10 "横から入る土管" +#define STRING_OBJDATA_MAP_B_11 "使用済みブロック" +#define STRING_OBJDATA_MAP_B_12 "ジャンプ台" +#define STRING_OBJDATA_MAP_B_13 "逆L字型土管" +#define STRING_OBJDATA_MAP_B_14 "ポール" +#define STRING_OBJDATA_MAP_B_15 "*無し" +#define STRING_OBJDATA_MAP_B_16 "*無し" +#define STRING_OBJDATA_MAP_B_17 "アスレチック台(砲台)" +#define STRING_OBJDATA_MAP_B_18 "横にならんだレンガブロック(海草)" +#define STRING_OBJDATA_MAP_B_19 "横にならんだ壊せないブロック" +#define STRING_OBJDATA_MAP_B_20 "横にならんだコイン列" +#define STRING_OBJDATA_MAP_B_21 "縦にならんだレンガブロック(海草)" +#define STRING_OBJDATA_MAP_B_22 "縦にならんだ壊せないブロック" +#define STRING_OBJDATA_MAP_B_23 "入れない土管" +#define STRING_OBJDATA_MAP_B_24 "入れる土管" + +#define STRING_OBJDATA_HELP_B12 "キャラクタの1つ。キャラクタオーバーで表示されなくなると、マリオが挟まって出れなくなるので注意。" +#define STRING_OBJDATA_HELP_B13 "高さ9固定。横からでも上からでも入れる。(横位置+2)から2キャラ分は、先に指定された障害物を消す。" +#define STRING_OBJDATA_HELP_B14 "やたらと使用しないこと。1ルームに2回以上使用すると暴走しやすくなるので注意。" +#define STRING_OBJDATA_HELP_B23 "長さを1にしても必ず2になる。" +//#define STRING_OBJDATA_HELP_B24 "長さを1にしても必ず2になる。" + +#define STRING_OBJDATA_MAP_C_01 "穴" +#define STRING_OBJDATA_MAP_C_02 "天秤リフトの横ロープ" +#define STRING_OBJDATA_MAP_C_03 "吊り橋(縦位置7)" +#define STRING_OBJDATA_MAP_C_04 "吊り橋(縦位置8)" +#define STRING_OBJDATA_MAP_C_05 "吊り橋(縦位置10)" +#define STRING_OBJDATA_MAP_C_06 "海(縦位置10)" +#define STRING_OBJDATA_MAP_C_07 "横に並んだ?ブロック(コイン、縦位置3)" +#define STRING_OBJDATA_MAP_C_08 "横に並んだ?ブロック(コイン、縦位置7)" + +#define STRING_OBJDATA_HELP_C01 "縦位置8から12の先指定したすべてのマップキャラを消す。" +#define STRING_OBJDATA_HELP_C02 "縦位置0固定" +#define STRING_OBJDATA_HELP_C06 "縦位置10から12の先指定したすべてのマップキャラを消す。" + +#define STRING_OBJDATA_MAP_D_01 "ページ送りコマンド" +#define STRING_OBJDATA_MAP_D_02 "逆L字型土管" +#define STRING_OBJDATA_MAP_D_03 "ポール" +#define STRING_OBJDATA_MAP_D_04 "ハンマー" +#define STRING_OBJDATA_MAP_D_05 "斜めのロープ" +#define STRING_OBJDATA_MAP_D_06 "クッパの橋" +#define STRING_OBJDATA_MAP_D_07 "画面スクロールをとめる(ワープゾ-ン)" +#define STRING_OBJDATA_MAP_D_08 "画面スクロールをとめる" +//#define STRING_OBJDATA_MAP_D_09 "画面スクロールをとめる" +#define STRING_OBJDATA_MAP_D_10 "赤いプクプク(空飛び)" +#define STRING_OBJDATA_MAP_D_11 "キラー(プクプク)連続" +#define STRING_OBJDATA_MAP_D_12 "連続出現キャラを出なくする" +#define STRING_OBJDATA_MAP_D_13 "ループコマンド" +#define STRING_OBJDATA_MAP_D_14 "?" +#define STRING_OBJDATA_MAP_D_15 "*暴走" +//#define STRING_OBJDATA_MAP_D_16 "*暴走" +//#define STRING_OBJDATA_MAP_D_17 "*暴走" + +#define STRING_OBJDATA_HELP_D01 "指定ページまでマップを送る。" +#define STRING_OBJDATA_HELP_D03 "やたらと使用しない事。1ルームに2回以上使用すると暴走しやすくなるので注意。" +#define STRING_OBJDATA_HELP_D04 "縦位置6固定、偶数ページに設置しないと橋が落ちない。" +#define STRING_OBJDATA_HELP_D05 "縦位置7固定" +#define STRING_OBJDATA_HELP_D06 "縦位置8、長さ13固定、偶数ページに設置しないと橋が落ちない。" +#define STRING_OBJDATA_HELP_D12 "連続出現キャラを出した後、暴走を防ぐためにポールを出す前に指定。" +#define STRING_OBJDATA_HELP_D13 "ページ送りコマンドとセットでループを形成する。" + +#define STRING_OBJDATA_MAP_E_01 "基本ブロックと景色の変更" +#define STRING_OBJDATA_MAP_E_02 "背景の変更" + +#define STRING_OBJDATA_MAP_F_01 "リフトの縦ロープ" +#define STRING_OBJDATA_MAP_F_02 "天秤リフトの縦ロープ" +#define STRING_OBJDATA_MAP_F_03 "城" +#define STRING_OBJDATA_MAP_F_04 "幅n,高さnの階段" +#define STRING_OBJDATA_MAP_F_05 "幅9、高さ8の階段" +#define STRING_OBJDATA_MAP_F_06 "長い逆L字土管" +#define STRING_OBJDATA_MAP_F_07 "縦に並んだ丸キャラ" +#define STRING_OBJDATA_MAP_F_08 "無し" +//#define STRING_OBJDATA_MAP_F_09 "無し" + +#define STRING_OBJDATA_HELP_F01 "縦位置0、長さ13固定。指定横位置において、先指定したすべてのマップキャラを消す。" +#define STRING_OBJDATA_HELP_F02 "縦位置1固定。指定横位置において、先指定したすべてのマップキャラを消す。" +#define STRING_OBJDATA_HELP_F03 "やたらと使用しないこと。多く使用すると暴走しやすくなる。" +#define STRING_OBJDATA_HELP_F05 "長さを0以外に設定すると、後のエリアの表示がおかしくなります。" +#define STRING_OBJDATA_HELP_F07 "ツタのようにつかまって上下移動が可能。縦位置2固定" + +#define STRING_OBJDATA_BB_01 "ブロック無し" +#define STRING_OBJDATA_BB_02 "地面にブロック" +#define STRING_OBJDATA_BB_03 "地面と天井にブロック" +#define STRING_OBJDATA_BB_04 "地面と天井(3)にブロック" +#define STRING_OBJDATA_BB_05 "地面と天井(4)にブロック" +#define STRING_OBJDATA_BB_06 "地面と天井(8)にブロック" +#define STRING_OBJDATA_BB_07 "地面(4)と天井にブロック" +#define STRING_OBJDATA_BB_08 "地面(4)と天井(3)にブロック" +#define STRING_OBJDATA_BB_09 "地面(4)と天井(4)にブロック" +#define STRING_OBJDATA_BB_10 "地面(5)と天井にブロック" +#define STRING_OBJDATA_BB_11 "天井にブロック" +#define STRING_OBJDATA_BB_12 "地面(5)と天井(4)にブロック" +#define STRING_OBJDATA_BB_13 "地面(8)と天井にブロック" +#define STRING_OBJDATA_BB_14 "地面と天井とその間(5)にブロック" +#define STRING_OBJDATA_BB_15 "地面と天井とその間(4)にブロック" +#define STRING_OBJDATA_BB_16 "すべてブロック" + +#define STRING_OBJDATA_T_01 "無し" +#define STRING_OBJDATA_T_02 "400" +#define STRING_OBJDATA_T_03 "300" +#define STRING_OBJDATA_T_04 "200" + +#define STRING_OBJDATA_P_01 "高さ-1、横位置1.5" +#define STRING_OBJDATA_P_02 "エリアの始まり:×。他ルームからの移動:高さ-1、横位置1.5" +#define STRING_OBJDATA_P_03 "高さ10、横位置1.5" +#define STRING_OBJDATA_P_04 "高さ4 、横位置1.5" +//#define STRING_OBJDATA_P_05 "高さ-1、横位置1.5" +//#define STRING_OBJDATA_P_06 "高さ-1、横位置1.5" +#define STRING_OBJDATA_P_07 "高さ10、横位置1.5(自動歩行)" +//#define STRING_OBJDATA_P_08 "高さ10、横位置1.5(自動歩行)" + +#define STRING_OBJDATA_BC_01 "青空" +#define STRING_OBJDATA_BC_02 "海" +#define STRING_OBJDATA_BC_03 "城壁" +#define STRING_OBJDATA_BC_04 "高さ11の川" +#define STRING_OBJDATA_BC_05 "夜" +#define STRING_OBJDATA_BC_06 "緑色の背景色(土管や山などを白に変更)" +#define STRING_OBJDATA_BC_07 "青い背景色を黒に、緑色の背景色を白に変更" +#define STRING_OBJDATA_BC_08 "青い背景色を黒に、緑色の背景色を白に、茶色を白に変更" + +#define STRING_OBJDATA_MT_01 "緑色のアスレチック面" +#define STRING_OBJDATA_MT_02 "橙色のアスレチック面" +#define STRING_OBJDATA_MT_03 "大砲面" +#define STRING_OBJDATA_MT_04 "雲面" + +#define STRING_OBJDATA_V_01 "無し" +#define STRING_OBJDATA_V_02 "空" +#define STRING_OBJDATA_V_03 "山" +#define STRING_OBJDATA_V_04 "柵のある庭" + + +#define STRING_OBJDATA_BADGUYS_01 "青いノコノコ" +#define STRING_OBJDATA_BADGUYS_02 "赤いノコノコ" +#define STRING_OBJDATA_BADGUYS_03 "メット" +#define STRING_OBJDATA_BADGUYS_04 "赤いノコノコ(往復)" +#define STRING_OBJDATA_BADGUYS_05 "青いノコノコ(停止)" +#define STRING_OBJDATA_BADGUYS_06 "ハンマーブロス" +#define STRING_OBJDATA_BADGUYS_07 "クリボー" +#define STRING_OBJDATA_BADGUYS_08 "ゲッソー" +#define STRING_OBJDATA_BADGUYS_09 "キラー" +#define STRING_OBJDATA_BADGUYS_10 "青いパタパタ(停止)" +#define STRING_OBJDATA_BADGUYS_11 "青いプクプク(直進)" +#define STRING_OBJDATA_BADGUYS_12 "赤いプクプク(直進)" +#define STRING_OBJDATA_BADGUYS_13 "バブル" +#define STRING_OBJDATA_BADGUYS_14 "パックンフラワー" +#define STRING_OBJDATA_BADGUYS_15 "青いパタパタ(跳ねる)" +#define STRING_OBJDATA_BADGUYS_16 "赤いパタパタ(上下)" +#define STRING_OBJDATA_BADGUYS_17 "青いパタパタ(左右)" +#define STRING_OBJDATA_BADGUYS_18 "ジュゲム" +#define STRING_OBJDATA_BADGUYS_19 "トゲゾー(停止)" +#define STRING_OBJDATA_BADGUYS_20 "*カラスみたいな赤いノコノコ" +#define STRING_OBJDATA_BADGUYS_21 "赤いプクプク(空飛、連続)" +#define STRING_OBJDATA_BADGUYS_22 "クッパの炎" +#define STRING_OBJDATA_BADGUYS_23 "*暴走" +#define STRING_OBJDATA_BADGUYS_24 "キラー(プクプク)連続" +#define STRING_OBJDATA_BADGUYS_25 "*無し" +//#define STRING_OBJDATA_BADGUYS_26 "*無し" +//#define STRING_OBJDATA_BADGUYS_27 "*無し" +#define STRING_OBJDATA_BADGUYS_28 "ファイアーバー(右回転)" +#define STRING_OBJDATA_BADGUYS_29 "ファイアーバー(右高速回転)" +#define STRING_OBJDATA_BADGUYS_30 "ファイアーバー(左回転)" +#define STRING_OBJDATA_BADGUYS_31 "ファイアーバー(左高速回転)" +#define STRING_OBJDATA_BADGUYS_32 "ロングファイアーバー(右回転)" +#define STRING_OBJDATA_BADGUYS_33 "ファイアーバー" +//#define STRING_OBJDATA_BADGUYS_34 "ファイアーバー" +//#define STRING_OBJDATA_BADGUYS_35 "ファイアーバー" +//#define STRING_OBJDATA_BADGUYS_36 "*無し" +#define STRING_OBJDATA_BADGUYS_37 "リフト(天秤)" +#define STRING_OBJDATA_BADGUYS_38 "リフト(上下)" +#define STRING_OBJDATA_BADGUYS_39 "リフト(上昇)" +#define STRING_OBJDATA_BADGUYS_40 "リフト(下降)" +#define STRING_OBJDATA_BADGUYS_41 "リフト(左右)" +#define STRING_OBJDATA_BADGUYS_42 "リフト(落下)" +#define STRING_OBJDATA_BADGUYS_43 "リフト(前進)" +#define STRING_OBJDATA_BADGUYS_44 "小さいリフト(上昇)" +#define STRING_OBJDATA_BADGUYS_45 "小さいリフト(下降)" +#define STRING_OBJDATA_BADGUYS_46 "クッパ" +#define STRING_OBJDATA_BADGUYS_47 "*生きているキノコ" +#define STRING_OBJDATA_BADGUYS_48 "*キノコの出る音だけ" +//#define STRING_OBJDATA_BADGUYS_49 "*無し" +//#define STRING_OBJDATA_BADGUYS_50 "*無し" +#define STRING_OBJDATA_BADGUYS_51 "にせジャンプ台" +//#define STRING_OBJDATA_BADGUYS_52 "*無し" +#define STRING_OBJDATA_BADGUYS_53 "ワープゾーン" +#define STRING_OBJDATA_BADGUYS_54 "キノピオ(ピーチ姫)" +//#define STRING_OBJDATA_BADGUYS_55 "*暴走" +#define STRING_OBJDATA_BADGUYS_56 "2体のクリボー(縦位置10)" +#define STRING_OBJDATA_BADGUYS_57 "3体のクリボー(縦位置10)" +#define STRING_OBJDATA_BADGUYS_58 "2体のクリボー(縦位置6)" +#define STRING_OBJDATA_BADGUYS_59 "3体のクリボー(縦位置6)" +#define STRING_OBJDATA_BADGUYS_60 "2体の青いノコノコ(縦位置10)" +#define STRING_OBJDATA_BADGUYS_61 "3体の青いノコノコ(縦位置10)" +#define STRING_OBJDATA_BADGUYS_62 "2体の青いノコノコ(縦位置6)" +#define STRING_OBJDATA_BADGUYS_63 "3体の青いノコノコ(縦位置6)" +//#define STRING_OBJDATA_BADGUYS_64 "*無し" + +// delreg.exe +#define STRING_DELREG_TITLE "SMB Utility レジストリの削除" +#define STRING_DELREG_CONFIRM "SMB Utilityで使用したレジストリのキーを削除しますか?" +#define STRING_DELREG_COMPLETE "SMB Utilityで使用したレジストリのキーを削除しました。" +#define STRING_DELREG_ERROR_01 "SMB Utilityのレジストリのキーは、存在しません。" + +#endif diff --git a/src/strings.h b/src/strings.h new file mode 100644 index 0000000..1e1e33f --- /dev/null +++ b/src/strings.h @@ -0,0 +1,14 @@ +#ifndef STRINGS_H +#define STRINGS_H + +#ifndef INTERNATIONAL + +#include "string_j.h" + +#else + +#include "string_i.h" + +#endif /* INTERNATIONAL */ + +#endif /* STRING_H */ diff --git a/src/tools.c b/src/tools.c new file mode 100644 index 0000000..e255bee --- /dev/null +++ b/src/tools.c @@ -0,0 +1,914 @@ +/************************************************************************************ + + smb Utility + + File: tools.c + Description: + History: + + ************************************************************************************/ +#include "smbutil.h" +#include "roomseldlg.h" +#include "objlib.h" +#include "roommng.h" +#include "objlist.h" +#include "objview.h" +#include "tools.h" +//プロパティシートの戻り値 +BOOL g_blOK; +/**************** + + 文字列の編集 + +*****************/ +typedef struct +{ + LPSTR pName; + BYTE bMaxLen; //Max characters + BYTE bRomType;//0=PRGROM 1=CHRROM + WORD wOffset; // +}SMBSTRINGINFO; + +#define SMB_STRING_MAXCHARS (27 * 3 + 1) + +SMBSTRINGINFO smbStringData[]={STRING_STRINGDATA_01, 5, 0, 0x8755, + STRING_STRINGDATA_02, 5, 0, 0x879B, + STRING_STRINGDATA_03, 5, 0, 0x87AE, + STRING_STRINGDATA_04, 5, 0, 0x87ed, + STRING_STRINGDATA_05, 11, 0, 0x875D, + STRING_STRINGDATA_06, 5, 0, 0x8786, + STRING_STRINGDATA_07, 7, 0, 0x87a3, + STRING_STRINGDATA_08, 9, 0, 0x87b6, + STRING_STRINGDATA_09, 21, 0, 0x87c3, + STRING_STRINGDATA_10, 16, 0, 0x8d57, + STRING_STRINGDATA_11, 16, 0, 0x8d6b, + STRING_STRINGDATA_12, 22, 0, 0x8d7f, + STRING_STRINGDATA_13, 15, 0, 0x8d98, + STRING_STRINGDATA_14, 19, 0, 0x8dab, + STRING_STRINGDATA_15, 27, 0, 0x8dc2, + STRING_STRINGDATA_16, 13, 0, 0x8de1, + STRING_STRINGDATA_17, 17, 0, 0x8df2, + STRING_STRINGDATA_18, 14, 1, 0x1fa5, + STRING_STRINGDATA_19, 13, 1, 0x1fb6, + STRING_STRINGDATA_20, 13, 1, 0x1fc6}; + +static char ConvertData2Char(BYTE bData) +{ + char cRet; + + switch(bData) + { + case 0x00:cRet='0';break; + case 0x01:cRet='1';break; + case 0x02:cRet='2';break; + case 0x03:cRet='3';break; + case 0x04:cRet='4';break; + case 0x05:cRet='5';break; + case 0x06:cRet='6';break; + case 0x07:cRet='7';break; + case 0x08:cRet='8';break; + case 0x09:cRet='9';break; + case 0x0A:cRet='A';break; + case 0x0B:cRet='B';break; + case 0x0C:cRet='C';break; + case 0x0D:cRet='D';break; + case 0x0E:cRet='E';break; + case 0x0F:cRet='F';break; + case 0x10:cRet='G';break; + case 0x11:cRet='H';break; + case 0x12:cRet='I';break; + case 0x13:cRet='J';break; + case 0x14:cRet='K';break; + case 0x15:cRet='L';break; + case 0x16:cRet='M';break; + case 0x17:cRet='N';break; + case 0x18:cRet='O';break; + case 0x19:cRet='P';break; + case 0x1A:cRet='Q';break; + case 0x1B:cRet='R';break; + case 0x1C:cRet='S';break; + case 0x1D:cRet='T';break; + case 0x1E:cRet='U';break; + case 0x1F:cRet='V';break; + case 0x20:cRet='W';break; + case 0x21:cRet='X';break; + case 0x22:cRet='Y';break; + case 0x23:cRet='Z';break; + case 0x24:cRet=' ';break; + // + case 0x28:cRet='-';break; + case 0x29:cRet='*';break; + case 0x2B:cRet='!';break; + case 0xCF:cRet='@';break; + case 0xAF:cRet='.';break; + default:cRet='?';break;//Space + } + return cRet; +} + +static BYTE ConvertChr2Data(char cChar,BOOL *blUnknown) +{ + BYTE bRet; + + *blUnknown=FALSE; + switch(cChar) + { + case '0':bRet=0x0;break; + case '1':bRet=0x1;break; + case '2':bRet=0x2;break; + case '3':bRet=0x3;break; + case '4':bRet=0x4;break; + case '5':bRet=0x5;break; + case '6':bRet=0x6;break; + case '7':bRet=0x7;break; + case '8':bRet=0x8;break; + case '9':bRet=0x9;break; + case 'a':bRet=0xa;break; + case 'b':bRet=0xb;break; + case 'c':bRet=0xc;break; + case 'd':bRet=0xd;break; + case 'e':bRet=0xe;break; + case 'f':bRet=0xf;break; + case 'g':bRet=0x10;break; + case 'h':bRet=0x11;break; + case 'i':bRet=0x12;break; + case 'j':bRet=0x13;break; + case 'k':bRet=0x14;break; + case 'l':bRet=0x15;break; + case 'm':bRet=0x16;break; + case 'n':bRet=0x17;break; + case 'o':bRet=0x18;break; + case 'p':bRet=0x19;break; + case 'q':bRet=0x1a;break; + case 'r':bRet=0x1b;break; + case 's':bRet=0x1c;break; + case 't':bRet=0x1d;break; + case 'u':bRet=0x1e;break; + case 'v':bRet=0x1f;break; + case 'w':bRet=0x20;break; + case 'x':bRet=0x21;break; + case 'y':bRet=0x22;break; + case 'z':bRet=0x23;break; + case ' ':bRet=0x24;break; + // + case '-':bRet=0x28;break; + case '*':bRet=0x29;break; + case '!':bRet=0x2B;break; + case '@':bRet=0xCF;break; + case '.':bRet=0xAF;break; + default: + { + bRet=0x24; + *blUnknown=TRUE; + } + break;//Space + } + return bRet; +} + +static int GetNumStrings() +{ + return sizeof(smbStringData)/sizeof(SMBSTRINGINFO); +} + +static void ChangeString(UINT iStringNum,LPSTR pString) +{ + BYTE *pbTmp; + BYTE bTmp; + BOOL blEOB=FALSE; + BOOL blUnknown=FALSE; + int i,n; + + CharLower(pString);//small char + pbTmp= (smbStringData[iStringNum].bRomType)?bCHRROM:bPRGROM; + pbTmp+=smbStringData[iStringNum].wOffset; + for(i=0,n=0;i9){ + SendDlgItemMessage(hDlg,IDC_TIME400,CB_ADDSTRING,0,(LPARAM)cBuf); + i=10; + } + SendDlgItemMessage(hDlg,IDC_TIME400,CB_SETCURSEL,i,0); + i=bPRGROM[SMB_TIME+1]; + if(i>9){ + SendDlgItemMessage(hDlg,IDC_TIME300,CB_ADDSTRING,0,(LPARAM)cBuf); + i=10; + } + SendDlgItemMessage(hDlg,IDC_TIME300,CB_SETCURSEL,i,0); + i=bPRGROM[SMB_TIME+2]; + if(i>9){ + SendDlgItemMessage(hDlg,IDC_TIME200,CB_ADDSTRING,0,(LPARAM)cBuf); + i=10; + } + SendDlgItemMessage(hDlg,IDC_TIME200,CB_SETCURSEL,i,0); + return TRUE; + } + case WM_NOTIFY: + { + LPNMHDR pnmh = (LPNMHDR) lParam; + switch (pnmh->code) { + case PSN_APPLY: + { + BOOL blSuccess; + int iRet; + int iPoleGfx; + BYTE bFlower[]="\x0D\x5F\x07\xF0\x2B"; + BYTE bNewFlower[]="\xEA\xEA\xEA\xEA\xEA"; + + if(!g_blOK){ + undoPrepare(UNDONAME_TOOLOTHER); + g_blOK=TRUE; + } + + //残りマリオ + iRet=GetDlgItemInt(hDlg,IDC_MARIOLEFT,&blSuccess,FALSE)-1; + if(!blSuccess || (iRet<0 || iRet>127)){ + SetWindowLong(hDlg,DWL_MSGRESULT,TRUE); + return TRUE; + } + bPRGROM[SMB_MARIO_LEFT]=iRet; + + //パックンフラワー + if(BST_CHECKED&IsDlgButtonChecked(hDlg,IDC_FLOWER)) + memset(bPRGROM+SMB_FLOWER,0xEA,5); + else if(!memcmp(bPRGROM+SMB_FLOWER,bNewFlower,5)) + memcpy(bPRGROM+SMB_FLOWER,bFlower,5); + + //ポールのグラフィックス + iPoleGfx=SendDlgItemMessage(hDlg,IDC_POLEGFX,CB_GETCURSEL,0,0); + if(iPoleGfx==CB_ERR)return TRUE; + if(iPoleGfx!=GetPoleGfxDatas()-1)//その他でなければ… + { + memcpy(bPRGROM+SMB_POLEGFX,PoleGfxInfo[iPoleGfx].bGfxData,4); + } + + // + iRet=SendDlgItemMessage(hDlg,IDC_TIME400,CB_GETCURSEL,0,0); + if(iRet!=10 && iRet!=CB_ERR) bPRGROM[SMB_TIME]=iRet; + iRet=SendDlgItemMessage(hDlg,IDC_TIME300,CB_GETCURSEL,0,0); + if(iRet!=10 && iRet!=CB_ERR) bPRGROM[SMB_TIME+1]=iRet; + iRet=SendDlgItemMessage(hDlg,IDC_TIME200,CB_GETCURSEL,0,0); + if(iRet!=10 && iRet!=CB_ERR) bPRGROM[SMB_TIME+2]=iRet; + return TRUE; + } + break; + } + } + break; + } + return FALSE; +} + +// + + +LRESULT CALLBACK GameSetting1upDlgProc( HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam) +{ + static BYTE lpbBuf[SMB_NUM_WORLDS]; + static int iCurSel; + switch (message) + { + case WM_INITDIALOG: + { + int n; + TCHAR cBuf[20]; + ADDRESSDATA ad1up; + //lpbBuf=Malloc(GetNumWorlds()); + if(lpbBuf){ + ADDRESSDATA_LOAD(ad1up, SMB_COINSFOR1UP_ADDRESS); + //1upキノコのためのコインの枚数 + memcpy(lpbBuf, bPRGROM + ADDRESSDATA_GET(ad1up), GetNumWorlds()); + + for(n = 0; n < GetNumWorlds(); n++){ + wsprintf(cBuf, STRING_SETTING_WORLDX, n + 1); + SendDlgItemMessage(hDlg,IDC_WORLD,CB_ADDSTRING,0,(LPARAM)cBuf); + } + SendDlgItemMessage(hDlg,IDC_WORLD,CB_SETCURSEL,0,0); + iCurSel=0; + // + SendDlgItemMessage(hDlg,IDC_COINSFOR1UPSPIN,UDM_SETRANGE,0,MAKEWPARAM(255,0)); + SetDlgItemInt(hDlg,IDC_COINSFOR1UP,lpbBuf[iCurSel],FALSE); + } + return TRUE; + } + case WM_COMMAND: + { + switch(LOWORD(wParam)) + { + case IDC_WORLD: + { + if(HIWORD(wParam)==CBN_SELCHANGE){ + int iRet; + iRet=SendDlgItemMessage(hDlg,IDC_WORLD,CB_GETCURSEL,0,0); + if(iRet!=CB_ERR){ + iCurSel=iRet; + if(lpbBuf) + SetDlgItemInt(hDlg,IDC_COINSFOR1UP,lpbBuf[iRet],FALSE); + } + } + } + break; + case IDC_COINSFOR1UP: + { + if(HIWORD(wParam)==EN_CHANGE){ + BOOL blSuccess; + int iTmp; + + iTmp=GetDlgItemInt(hDlg,IDC_COINSFOR1UP,&blSuccess,FALSE); + if(lpbBuf && iCurSelcode) { + case PSN_APPLY: + { + ADDRESSDATA ad1up; + if(lpbBuf){ + if(!g_blOK){ + undoPrepare(UNDONAME_TOOLOTHER); + g_blOK=TRUE; + } + ADDRESSDATA_LOAD(ad1up,SMB_COINSFOR1UP_ADDRESS); + memcpy(bPRGROM+ADDRESSDATA_GET(ad1up), lpbBuf, GetNumWorlds()); + //Mfree(lpbBuf); + //lpbBuf=NULL; + } + + return TRUE; + } + break; + } + } + break; + } + return FALSE; +} + +LRESULT CALLBACK GameSettingWarpZoneDlgProc( HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam) +{ + switch (message) + { + case WM_INITDIALOG: + { + //ワープゾーン + SendDlgItemMessage(hDlg,IDC_WARPASPIN1,UDM_SETRANGE,0,MAKEWPARAM(255,0)); + SendDlgItemMessage(hDlg,IDC_WARPASPIN2,UDM_SETRANGE,0,MAKEWPARAM(255,0)); + SendDlgItemMessage(hDlg,IDC_WARPASPIN3,UDM_SETRANGE,0,MAKEWPARAM(255,0)); + SendDlgItemMessage(hDlg,IDC_WARPBSPIN1,UDM_SETRANGE,0,MAKEWPARAM(255,0)); + SendDlgItemMessage(hDlg,IDC_WARPBSPIN2,UDM_SETRANGE,0,MAKEWPARAM(255,0)); + SendDlgItemMessage(hDlg,IDC_WARPBSPIN3,UDM_SETRANGE,0,MAKEWPARAM(255,0)); + SendDlgItemMessage(hDlg,IDC_WARPCSPIN1,UDM_SETRANGE,0,MAKEWPARAM(255,0)); + SendDlgItemMessage(hDlg,IDC_WARPCSPIN2,UDM_SETRANGE,0,MAKEWPARAM(255,0)); + SendDlgItemMessage(hDlg,IDC_WARPCSPIN3,UDM_SETRANGE,0,MAKEWPARAM(255,0)); + + SetDlgItemInt(hDlg,IDC_WARPA1,bPRGROM[SMB_WARPZONE_WORLD_ADDRESS],FALSE); + SetDlgItemInt(hDlg,IDC_WARPA2,bPRGROM[SMB_WARPZONE_WORLD_ADDRESS+1],FALSE); + SetDlgItemInt(hDlg,IDC_WARPA3,bPRGROM[SMB_WARPZONE_WORLD_ADDRESS+2],FALSE); + SetDlgItemInt(hDlg,IDC_WARPB1,bPRGROM[SMB_WARPZONE_WORLD_ADDRESS+4],FALSE); + SetDlgItemInt(hDlg,IDC_WARPB2,bPRGROM[SMB_WARPZONE_WORLD_ADDRESS+5],FALSE); + SetDlgItemInt(hDlg,IDC_WARPB3,bPRGROM[SMB_WARPZONE_WORLD_ADDRESS+6],FALSE); + SetDlgItemInt(hDlg,IDC_WARPC1,bPRGROM[SMB_WARPZONE_WORLD_ADDRESS+8],FALSE); + SetDlgItemInt(hDlg,IDC_WARPC2,bPRGROM[SMB_WARPZONE_WORLD_ADDRESS+9],FALSE); + SetDlgItemInt(hDlg,IDC_WARPC3,bPRGROM[SMB_WARPZONE_WORLD_ADDRESS+10],FALSE); + + //プロパテイシートを中央に持ってくる + CenterPropatySheet(hDlg); + + return TRUE; + } + case WM_NOTIFY: + { + LPNMHDR pnmh = (LPNMHDR) lParam; + switch (pnmh->code){ + case PSN_APPLY: + { + BOOL blSuccess; + int iRet; + int n; + int iAddrDelta[]={0,1,2,4,5,6,8,9,10}; + int iCtrlID[]={IDC_WARPA1,IDC_WARPA2,IDC_WARPA3,IDC_WARPB1,IDC_WARPB2,IDC_WARPB3,IDC_WARPC1,IDC_WARPC2,IDC_WARPC3}; + + if(!g_blOK){ + undoPrepare(UNDONAME_TOOLOTHER); + g_blOK=TRUE; + } + + for(n=0;n<9;n++){ + iRet=GetDlgItemInt(hDlg,iCtrlID[n],&blSuccess,FALSE); + if(!blSuccess || (iRet<0 || iRet>255)){ + SetWindowLong(hDlg,DWL_MSGRESULT,TRUE); + return TRUE; + } + bPRGROM[SMB_WARPZONE_WORLD_ADDRESS+iAddrDelta[n]]=iRet; + } + return TRUE; + } + break; + case PSN_RESET: + { + + + } + break; + } + } + break; + } + return FALSE; +} + +LRESULT CALLBACK GameSettingKoopaDlgProc( HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam) +{ + static BYTE lpbBuf[SMB_NUM_WORLDS]; + static int iCurSel; + + switch (message) + { + case WM_INITDIALOG: + { + char cBuf[50]; + int n; + ADDRESSDATA adKoopa; + extern struct {LPSTR Name;int YDelta;BYTE bFixedYPos;int XDelta;}smbBudGuysInfo[]; + + ADDRESSDATA_LOAD(adKoopa,SMB_KOOPAREALCHARCTER_ADDRESS); + //lpbBuf = Malloc(GetNumWorlds()); + if(lpbBuf){ + //1upキノコのためのコインの枚数 + memcpy(lpbBuf, bPRGROM + ADDRESSDATA_GET(adKoopa), GetNumWorlds()); + + for(n=0;ncode) { + case PSN_APPLY: + { + ADDRESSDATA adKoopa; + BOOL blSuccess; + int iRet; + + if(!g_blOK){ + undoPrepare(UNDONAME_TOOLOTHER); + g_blOK=TRUE; + } + + iRet=GetDlgItemInt(hDlg,IDC_WORLD,&blSuccess,FALSE); + if(!blSuccess || iRet<1 || iRet>256){ + SetWindowLong(hDlg,DWL_MSGRESULT,TRUE); + return TRUE; + } + + bPRGROM[SMB_KOOPAHAMMER]=(BYTE)(iRet-1); + + if(lpbBuf){ + ADDRESSDATA_LOAD(adKoopa,SMB_KOOPAREALCHARCTER_ADDRESS); + memcpy(bPRGROM+ADDRESSDATA_GET(adKoopa),lpbBuf,GetNumWorlds()); + //Mfree(lpbBuf); + //lpbBuf = NULL; + } + + return TRUE; + } + break; + } + } + break; + } + return FALSE; +} + +LRESULT CALLBACK GameSettingWorldDlgProc( HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam) +{ + switch (message) + { + case WM_INITDIALOG: + { + + SendDlgItemMessage(hDlg,IDC_DIFFICULTYWORLDSPIN,UDM_SETRANGE,0,MAKEWPARAM(256,1)); + SetDlgItemInt(hDlg,IDC_DIFFICULTYWORLD,bPRGROM[SMB_DIFFICULTYWORLD]+1,FALSE); + SendDlgItemMessage(hDlg,IDC_DIFFICULTYAREASPIN,UDM_SETRANGE,0,MAKEWPARAM(256,1)); + SetDlgItemInt(hDlg,IDC_DIFFICULTYAREA,bPRGROM[SMB_DIFFICULTYAREA]+1,FALSE); + SendDlgItemMessage(hDlg,IDC_SEABLOCKWORLDSPIN,UDM_SETRANGE,0,MAKEWPARAM(256,1)); + SetDlgItemInt(hDlg,IDC_SEABLOCKWORLD,bPRGROM[SMB_SEABLOCKWORLD]+1,FALSE); + + return TRUE; + } + case WM_NOTIFY: + { + LPNMHDR pnmh = (LPNMHDR) lParam; + switch (pnmh->code) { + case PSN_APPLY: + { + BOOL blSuccess; + int iRet; + + if(!g_blOK){ + undoPrepare(UNDONAME_TOOLOTHER); + g_blOK=TRUE; + } + + iRet=GetDlgItemInt(hDlg,IDC_DIFFICULTYWORLD,&blSuccess,FALSE)-1; + if(!blSuccess || iRet<0 || iRet>255){ + SetWindowLong(hDlg,DWL_MSGRESULT,TRUE); + return TRUE; + } + bPRGROM[SMB_DIFFICULTYWORLD]=(BYTE)iRet; + + iRet=GetDlgItemInt(hDlg,IDC_DIFFICULTYAREA,&blSuccess,FALSE)-1; + if(!blSuccess || iRet<0 || iRet>255){ + SetWindowLong(hDlg,DWL_MSGRESULT,TRUE); + return TRUE; + } + bPRGROM[SMB_DIFFICULTYAREA]=(BYTE)iRet; + + iRet=GetDlgItemInt(hDlg,IDC_SEABLOCKWORLD,&blSuccess,FALSE)-1; + if(!blSuccess || iRet<0 || iRet>255){ + SetWindowLong(hDlg,DWL_MSGRESULT,TRUE); + return TRUE; + } + bPRGROM[SMB_SEABLOCKWORLD]=(BYTE)iRet; + + return TRUE; + } + break; + } + } + break; + } + return FALSE; +} + +void GameSettingPropertySheet(HWND hwndOwner) +{ + //TODO +#define OPTPS_NUM_PAGES 5 + LPTSTR lpTitle[OPTPS_NUM_PAGES]={STRING_SETTING_WARPZONE, STRING_SETTING_1UP, STRING_SETTING_KOOPA, STRING_SETTING_WORLD, STRING_SETTING_OTHER}; + LPTSTR lpDlgResName[OPTPS_NUM_PAGES]={"GAMESETTINGWARPZONEDLG","GAMESETTING1UPDLG","GAMESETTINGKOOPADLG","GAMESETTINGWORLDDLG","GAMESETTINGDLG"}; + DLGPROC pfnDlgProc[OPTPS_NUM_PAGES]={GameSettingWarpZoneDlgProc,GameSetting1upDlgProc,GameSettingKoopaDlgProc,GameSettingWorldDlgProc,GameSettingDlgProc}; + //Local + PROPSHEETPAGE psp[OPTPS_NUM_PAGES]; + PROPSHEETHEADER psh; + int i; + + for(i=0;i