Wow, you're making quick progress! I really like the debugger you've put together.
Hope you don't mind, but I reviewed some of the more tricky instructions and have some corrections:
CMP/CPX/CPY
The flags can be set according to this (even used your !! trick):
setZN(reg - operand); // uint8 subtraction, not sure how JS handles it
SR.C = !!(reg >= operand);
ADC
In my opinion, the flags for this instruction are the most difficult to get right
SR.C: set if addition would result in 9th bit set. I cheated and did 16-bit math and set: SR.C = (u16 & 0x100)
ST.V: set if result would be > 127 or < -128. I cheated and did 16-bit signed math and set: SR.V=(s16 > 127 || s16 < -128)
SBC's flags are also tricky to get right
DEC (C6,D6,CE,DE), INX/INY/DEX/DEY
These need to set N/Z flags (you have comments on some, but not all)
ASL ac
SR.C should be set before AC is shifted
ASL abs/zpg
These all need to be reviewed, using the correct memory index and Z/N should be set after shifting
Vectors / BRK
The vector table is at 0xFFFA. You've got the reset one down, but still need to keep track of NMI and BRK. The NMI is the non-maskable interrupt which the PPU will generate on VBLANK once it's turned on and BRK instructions will go to the BRK vector.
NMI: 0xFFFA
RESET: 0xFFFC
BRK: 0xFFFE
If you'd like, I can review all the instructions when you think you have them all implemented.
I would also recommend against using SMB1 ROM for testing since it is actually one of the more difficult games to emulate. It has made the list of
Tricky-to-emulate games. I would suggest starting with one of the NROM games that doesn't use Sprite 0 hit and minimal scrolling such as Balloon Fight or Golf. Note that these are 16K PRG-ROM (only 1 bank) and thus will need to be loaded at both 0x8000 and 0xC000 (usually only the latter is needed) to get the vector table at the end.