Since posting an update to the M65C02A core yesterday, I've been working to add in the following instructions:
RMBx/SMBx zp
BBRx/BBSx zp,rel
PEA abs
PEI zp
PER rel16
REP/SEP #imm
ORA/AND/EOR/ADC/LDA/STA/CMP/CMP sp,S
ORA/AND/EOR/ADC/LDA/STA/CMP/CMP (sp,S),Y.
In addition, I have also decided to add in a co-processor emulation instruction:
COP will generate a trap like BRK. I've assigned the COP vector at location 0xFFE6:FFE7. I decided that I did not need to preserve the WDM op instruction reserved by WDC. Instead I decided to implement two versions of the COP instruction. The first will load the A or X register with the immediate operand, and the second will load the A or X register with a value from zero page. I initially thought of loading the operand into A. I am now thinking that given the JMP (abs,X) instruction, loading the operand into the X register would set up the service routine to use JMP (abs,X) to go to the desired operation quickly.
Furthermore, I decided that I would round out the JSR and JMP instructions with some of the missing addressing modes:
JMP (zp)
JSR (zp)
JSR (abs,X)
These instructions leave 19 opcodes not assigned. To support the MMU and other 16-bit IO page operations, I need two opcodes for moving 16-bit values in an indivisible manner from zero page to the IO page and vice-versa. I have decided that I will use opcodes 0x44 and 0x54 for this purpose. The architecture of the basic core would require too many changes to support the '816 block move instructions MVN/MVP which use these opcodes. I have designated these instructions as MWT (Move Word To IO Page) and MWF (Move Word From IO Page). The Y register functions as the register index in the IO page and a zp operand provides the source/destination of the 16-bit value being moved.
I will use opcode 0xFB (the XCE instruction in the '816) for the instruction prefix/escape opcode,
PFX, that will allow the M65C02A microprogram to extend/modify the behavior of selected instructions. For example, if the PFX instruction is used before the JSR abs instruction, I expect the instruction to be modified to perform a JSR (abs) instruction. Similarly, when prefixed by PFX, I plan on modifying the RMBx/SMBx zp instructions to perform as RMBx/SMBx (zp). (I expect to apply these types of modifications to instructions where the indirection makes sense. In other situations, I expect to use the PFX to change the index register, or to access the user mode stack pointer from kernel mode, etc.)
As part of these efforts, I realized that it would be easy to support 16-bit relative addressing. So I've made some relatively minor changes to the operand register data paths and to the relative address conditional multiplexer in the address generator. The M65C02A core can now support both 8-bit and 16-bit relative addressing. (I've posted an update to GitHUB that includes this modification.) Thus, I will implement the following two instructions to use the new 16-bit relative addressing mode just added to the core:
These two instructions should allow fully relocatable code for the M65C02A core.
With these five additional instructions, there are now only 14 unused opcodes. I expect that this should be sufficient to implement a good set of DTC/ITC primitives to support FORTH or another threaded code compiler.
I would be interested in any feedback on my plans for this core. Any suggestions for the remaining 14 opcodes, as they might apply to a threaded code interpreter, would be welcome.
My first vacation in two years away from home is coming to an end this weekend.

So progress on this project will likely slow down again to just the weekends.

Football season will soon be here, and I've got season tickets once again.

Taking time off from work to go to the games last season did make the pressure at work much more tolerable.
Edit: Added missing words and a blank line after each instruction list.