Advertisement
xiahanlu

DMG处理器

Oct 13th, 2018
223
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;; cpu_optick.asm
  2. ;; Sharp LR35902 Chip Opcode for GameBoy
  3. ;;
  4. ;; Copyright (C) 2018 moecmks
  5. ;; This file is part of KS3578.
  6. ;;
  7. ;; do What The Fuck you want to Public License
  8. ;;
  9. ;; Version 1.0, March 2000
  10. ;; Copyright (C) 2000 Banlu Kemiyatorn (]d).
  11. ;; 136 Nives 7 Jangwattana 14 Laksi Bangkok
  12. ;; Everyone is permitted to copy and distribute verbatim copies
  13. ;; of this license document, but changing it is not allowed.
  14. ;;
  15. ;; Ok, the purpose of this license is simple
  16. ;; and you just
  17. ;;
  18. ;; DO WHAT THE FUCK YOU WANT TO.
  19. ;;
  20.  
  21.   .686                      ; create 32 bit code          
  22.   .model flat, stdcall      ; 32 bit memory model
  23.   option casemap :none      ; case sensitive
  24.  
  25. ;; Sharp LR35902 Chip opcode mapper
  26. ;; http://www.pastraiser.com/cpu/gameboy/gameboy_opcodes.html
  27. ;; Z80 Chip opcode mapper
  28. ;; http://clrhome.org/table/
  29.  
  30. ;; Register F Mask
  31. ;; The register flag field is different from the standard, in order to optimize instruction operation.
  32. Z_FLAG equ 040H
  33. H_FLAG equ 010H
  34. N_FLAG equ 002H
  35. C_FLAG equ 001H
  36. ZC_FLAG equ 041H
  37.  
  38. ;; extern memory/IO read/write
  39. extrn gameboy_mmu_read@8:proc  ;; prototype ks_uint8 __stdcall gameboy_mmu_read (void;;gameboy, ks_uint16 addresss)
  40. extrn gameboy_mmu_write@12:proc ;; prototype void __stdcall gameboy_mmu_write (void;;gameboy, ks_uint16 addresss, ks_uint8 value)
  41. extrn gameboy_mmu_read_w@8:proc ;; prototype ks_uint16 __stdcall gameboy_mmu_read_w (void;;gameboy, ks_uint16 addresss)
  42. extrn gameboy_mmu_write_w@12:proc ;; prototype void __stdcall gameboy_mmu_write_w (void;;gameboy, ks_uint16 addresss, ks_uint16 value)
  43.  
  44. ;;  define union .
  45. defREG macro lo, hi
  46.   union
  47.     struct
  48.       lo db ?
  49.       hi db ?
  50.     ends
  51.     hi&lo dw ?
  52.   ends
  53. endm
  54.  
  55. defREG2 macro lo, hi, blk
  56.   union
  57.     struct
  58.       lo db ?
  59.       hi db ?
  60.     ends
  61.     blk dw ?
  62.   ends
  63. endm
  64.  
  65. ;;  XXX:memory order dep.
  66. cpu struct
  67.   defREG F, A  ;; A (Accumulator)
  68.                ;; probably the most commonly used register.
  69.                ;; Many instructions have special extended operation codes for accumulators.
  70.                ;; F (Program status byte)
  71.                
  72.   ;; defREG C, B ;; A2008: syntax error : C
  73.   union
  74.     struct
  75.       C_ db ?
  76.       B db ?
  77.     ends
  78.     BC dw ?
  79.   ends           ;; Register BC, without special explanation.
  80.   defREG E, D    ;; Register DE, without special explanation.
  81.   defREG L, H    ;; Register HL, which is mostly used to address 16-bit address data,
  82.                  ;;                              also has the basic properties of BC, DE registers
  83.   defREG2 SP_LO, SP_HI, SP_ ;; Stack Pointer.
  84.   defREG2 PC_LO, PC_HI, PC ;; Program Pointer.
  85.  
  86.   IME db ?        ;; Interrupt Master Enable
  87.  
  88.   halt dd ?     ;; for Halt
  89.  
  90.   stop dd ?     ;; for stop
  91.  
  92.   key1 db ?  
  93.  
  94.   gameboy dd ?
  95. cpu ends
  96.  
  97.     .code
  98.  
  99. ;;  prototype ks_int32 cpu_optick (struct cpu;;cpu_);
  100. cpu_optick proc C
  101.              option prologue:none, epilogue:none
  102.  
  103.         push ebx ;U -  save old frame      
  104.         push edi ;V -  save old frame
  105.         push esi
  106.         nop  
  107.        
  108. YG_PF_8 equ bl        
  109. YG_PF equ ebx
  110. YG_PC equ esi
  111. YG_GP equ edi
  112.  
  113. _GB_INT3_ASSERT macro address
  114.   .if [YG_GP].PC == address
  115.     int 3
  116.   .endif
  117. endm  
  118.         ; ebx <- save now P (cpu's PSB reg)
  119.         ; esi <- save now PC (cpu's EIP reg)
  120.         ; edi <- save regs root
  121.         ; eax <- calc temp or final calc out reslt
  122.         ; ecx <- calc temp
  123.         ; edx <- calc temp
  124.        
  125.         mov YG_GP, [esp+4+12]   ;; fetch CPU struct
  126.         mov si, [YG_GP].PC  
  127.         mov bl, [YG_GP].F
  128.         assume edi:ptr cpu
  129. ;;_GB_INT3_ASSERT 00994H
  130.         ; Fetch Opcode, PC++
  131.         push YG_PC
  132.         push [YG_GP].gameboy
  133.         call gameboy_mmu_read@8
  134.         inc YG_PC
  135.         and eax, 255
  136.         jmp dword ptr[OPTAB+eax*4]
  137.        
  138. EmptyMacro macro
  139. endm  
  140.  
  141. SetCyclesAndRet macro Cycles
  142.   ;; write back PC
  143.   mov [YG_GP].PC, si
  144.   mov eax, Cycles
  145.   jmp V_EXIT
  146. endm
  147.  
  148. SetCyclesRetP macro Cycles
  149.   ;; write back PC
  150.   mov [YG_GP].F, bl
  151.   SetCyclesAndRet Cycles
  152. endm
  153.  
  154. ;;  Register access-write unwind
  155. B_Write equ mov [YG_GP].B, al
  156. C_Write equ mov [YG_GP].C_, al
  157. D_Write equ mov [YG_GP].D, al
  158. E_Write equ mov [YG_GP].E, al
  159. H_Write equ mov [YG_GP].H, al
  160. L_Write equ mov [YG_GP].L, al
  161. A_Write equ mov [YG_GP].A, al
  162. F_Write equ mov [YG_GP].F, al
  163. SP_Write equ mov [YG_GP].SP_, ax
  164. DE_Write equ mov [YG_GP].DE, ax
  165. BC_Write equ mov [YG_GP].BC, ax
  166. HL_Write equ mov [YG_GP].HL, ax
  167. AF_Write equ mov [YG_GP].AF, ax
  168. PC_Write equ mov [YG_GP].PC, ax
  169.  
  170. ;; (Imm16) := Z80Register:BYTE
  171. xImm16_WriteReg8 macro _Reg
  172.   mov cl, [YG_GP]._Reg
  173.   push ecx
  174.   push eax
  175.   push [YG_GP].gameboy
  176.   call gameboy_mmu_write@12  
  177. endm
  178.  
  179. ;; (Imm16) := Z80Register:WORD
  180. xImm16_WriteReg16 macro _Reg
  181.   mov cx, [YG_GP]._Reg
  182.   push ecx
  183.   push eax
  184.   push [YG_GP].gameboy
  185.   call gameboy_mmu_write_w@12  
  186. endm
  187.  
  188. ;; (Imm16) := Z80Register-SP
  189. xImm16_WriteRegSP macro
  190.   xImm16_WriteReg16 SP_
  191. endm
  192.  
  193. ;; (Imm16) := Z80Register-A
  194. xImm16_WriteRegA macro
  195.   xImm16_WriteReg8 A
  196. endm
  197.  
  198. ;; (Z80Register:WORD ) :=  Value8:eax::al
  199. xRegister_WriteReg8 macro _Reg
  200.   push eax
  201.   mov ax, [YG_GP]._Reg
  202.   push eax
  203.   push [YG_GP].gameboy
  204.   call gameboy_mmu_write@12
  205. endm
  206.  
  207. ;; Unwind4
  208. xBC_Write equ xRegister_WriteReg8 BC  
  209. xDE_Write equ xRegister_WriteReg8 DE
  210. xHL_Write equ xRegister_WriteReg8 HL
  211. xAF_Write equ xRegister_WriteReg8 AF
  212. xPC_Write equ xRegister_WriteReg8 PC
  213.  
  214. xHL_Write_Inc macro
  215.   xHL_Write
  216.   inc [YG_GP].HL
  217. endm
  218.  
  219. xHL_Write_Dec macro
  220.   xHL_Write
  221.   dec [YG_GP].HL
  222. endm
  223.  
  224. ;;  Register access-read unwind
  225. B_Read equ  mov al, [YG_GP].B
  226. C_Read equ  mov al, [YG_GP].C_
  227. D_Read equ  mov al, [YG_GP].D
  228. E_Read equ  mov al, [YG_GP].E
  229. H_Read equ  mov al, [YG_GP].H
  230. L_Read equ  mov al, [YG_GP].L
  231. A_Read equ  mov al, [YG_GP].A
  232. BC_Read equ  mov ax, [YG_GP].BC
  233. DE_Read equ  mov ax, [YG_GP].DE
  234. HL_Read equ  mov ax, [YG_GP].HL
  235. SP_Read equ  mov ax, [YG_GP].SP_
  236. AF_Read equ  mov ax, [YG_GP].AF
  237.  
  238. ;; Imm8:eax::al := FetchPC++
  239. Imm8_Read macro
  240.   push    esi
  241.   push   [YG_GP].gameboy
  242.   call    gameboy_mmu_read@8
  243.   inc     esi
  244. endm
  245.  
  246. ;; Imm16:eax::ax := FetchPC, FetchPC +=2
  247. Imm16_Read macro
  248.   push    esi
  249.   push   [YG_GP].gameboy
  250.   call    gameboy_mmu_read_w@8
  251.   add     esi, 2
  252. endm
  253.  
  254. Read_ByxX86SpecRegister macro _Reg
  255.   ;;  _Reg:x86Register
  256.   push    _Reg
  257.   push   [YG_GP].gameboy
  258.   call    gameboy_mmu_read@8
  259. endm
  260.  
  261. Imm8Read_ExpandAddress16 macro
  262.   Imm8_Read
  263.   and eax, 000FFh
  264.   add eax, 0FF00h
  265. endm
  266.  
  267. Imm8_ExpandSignWord macro
  268.   Imm8_Read
  269.   movsx eax, al
  270. endm
  271.  
  272. C_ExpandAddress16 macro
  273.   movzx eax, [YG_GP].C_
  274.   add eax, 0FF00h
  275. endm
  276.  
  277. Imm8Read_ExpandAddress16_Fetch macro
  278.   Imm8Read_ExpandAddress16
  279.   Read_ByxX86SpecRegister eax
  280. endm
  281.  
  282. Imm16Read_Address_Fetch macro
  283.   Imm16_Read
  284.   Read_ByxX86SpecRegister eax
  285. endm
  286.  
  287. C_ExpandAddress16_Fetch macro
  288.   mov al, [YG_GP].C_
  289.   add eax, 0FF00h
  290.   Read_ByxX86SpecRegister eax
  291. endm
  292.  
  293. xRegister_Read macro _Reg
  294.   mov ax, [YG_GP].&_Reg
  295.   push eax
  296.   push [YG_GP].gameboy
  297.   call gameboy_mmu_read@8
  298. endm
  299.  
  300. ;; Unwind5
  301. xBC_Read equ xRegister_Read BC  
  302. xDE_Read equ xRegister_Read DE
  303. xHL_Read equ xRegister_Read HL
  304. xAF_Read equ xRegister_Read AF
  305. xPC_Read equ xRegister_Read PC
  306.  
  307. xHL_Read_Inc macro
  308.   xHL_Read
  309.   inc [YG_GP].HL
  310. endm
  311.  
  312. xHL_Read_Dec macro
  313.   xHL_Read
  314.   dec [YG_GP].HL
  315. endm
  316.  
  317. LD@Imm8 macro OpCase, Cycles_, WriteOrExt
  318.  OpCase&:
  319.     Imm8_Read
  320.     WriteOrExt
  321.     SetCyclesAndRet Cycles_
  322. endm
  323.       LD@Imm8 OP06, 8,  B_Write ;; LD B Imm8, 2, Cycles:8
  324.       LD@Imm8 OP0E, 8,  C_Write ;; LD C Imm8, 2, Cycles:8
  325.       LD@Imm8 OP16, 8,  D_Write ;; LD D Imm8, 2, Cycles:8
  326.       LD@Imm8 OP1E, 8,  E_Write ;; LD E Imm8, 2, Cycles:8
  327.       LD@Imm8 OP26, 8,  H_Write ;; LD H Imm8, 2, Cycles:8
  328.       LD@Imm8 OP2E, 8,  L_Write ;; LD L Imm8, 2, Cycles:8
  329.       LD@Imm8 OP36,12,  xHL_Write ;; LD xHL Imm8, 2, Cycles:8
  330.       LD@Imm8 OP3E, 8,  A_Write ;; LD A Imm8, 2, Cycles:8
  331.    
  332. LD@Imm16 macro OpCase, Cycles_, lrReg
  333.  OpCase&:
  334.     Imm16_Read
  335.     mov [YG_GP].&lrReg, ax
  336.     SetCyclesAndRet Cycles_
  337. endm    
  338.       LD@Imm16 OP01, 12, BC ;; LD BC Imm16, 3 Cycles:12
  339.       LD@Imm16 OP11, 12, DE ;; LD DE Imm16, 3 Cycles:12    
  340.       LD@Imm16 OP21, 12, HL ;; LD HL Imm16, 3 Cycles:12    
  341.       LD@Imm16 OP31, 12, SP_ ;; LD SP Imm16, 3 Cycles:12      
  342.  
  343. LD@RxHLToRxHL macro OpCase, Cycles_, ReadOrExt, WriteOrExt
  344.  OpCase&:
  345.     ReadOrExt
  346.     WriteOrExt
  347.     SetCyclesAndRet Cycles_
  348. endm      
  349.       LD@RxHLToRxHL OP40, 4, B_Read, B_Write ;; LD B B, 1 Cycles:4
  350.       LD@RxHLToRxHL OP41, 4, C_Read, B_Write ;; LD B C, 1 Cycles:4
  351.       LD@RxHLToRxHL OP42, 4, D_Read, B_Write ;; LD B D, 1 Cycles:4
  352.       LD@RxHLToRxHL OP43, 4, E_Read, B_Write ;; LD B E, 1 Cycles:4
  353.       LD@RxHLToRxHL OP44, 4, H_Read, B_Write ;; LD B H, 1 Cycles:4
  354.       LD@RxHLToRxHL OP45, 4, L_Read, B_Write ;; LD B L, 1 Cycles:4
  355.       LD@RxHLToRxHL OP46, 8, xHL_Read, B_Write ;; LD B xHL, 1 Cycles:8
  356.       LD@RxHLToRxHL OP47, 4, A_Read, B_Write ;; LD B A, 1 Cycles:4  
  357.      
  358.       LD@RxHLToRxHL OP48, 4, B_Read, C_Write ;; LD C B, 1 Cycles:4
  359.       LD@RxHLToRxHL OP49, 4, C_Read, C_Write ;; LD C C, 1 Cycles:4
  360.       LD@RxHLToRxHL OP4A, 4, D_Read, C_Write ;; LD C D, 1 Cycles:4
  361.       LD@RxHLToRxHL OP4B, 4, E_Read, C_Write ;; LD C E, 1 Cycles:4
  362.       LD@RxHLToRxHL OP4C, 4, H_Read, C_Write ;; LD C H, 1 Cycles:4
  363.       LD@RxHLToRxHL OP4D, 4, L_Read, C_Write ;; LD C L, 1 Cycles:4
  364.       LD@RxHLToRxHL OP4E, 8, xHL_Read, C_Write ;; LD C xHL, 1 Cycles:8
  365.       LD@RxHLToRxHL OP4F, 4, A_Read, C_Write ;; LD C A, 1 Cycles:4  
  366.  
  367.       LD@RxHLToRxHL OP50, 4, B_Read, D_Write ;; LD D B, 1 Cycles:4
  368.       LD@RxHLToRxHL OP51, 4, C_Read, D_Write ;; LD D C, 1 Cycles:4
  369.       LD@RxHLToRxHL OP52, 4, D_Read, D_Write ;; LD D D, 1 Cycles:4
  370.       LD@RxHLToRxHL OP53, 4, E_Read, D_Write ;; LD D E, 1 Cycles:4
  371.       LD@RxHLToRxHL OP54, 4, H_Read, D_Write ;; LD D H, 1 Cycles:4
  372.       LD@RxHLToRxHL OP55, 4, L_Read, D_Write ;; LD D L, 1 Cycles:4
  373.       LD@RxHLToRxHL OP56, 8, xHL_Read, D_Write ;; LD D xHL, 1 Cycles:8
  374.       LD@RxHLToRxHL OP57, 4, A_Read, D_Write ;; LD D A, 1 Cycles:4  
  375.      
  376.       LD@RxHLToRxHL OP58, 4, B_Read, E_Write ;; LD E B, 1 Cycles:4
  377.       LD@RxHLToRxHL OP59, 4, C_Read, E_Write ;; LD E C, 1 Cycles:4
  378.       LD@RxHLToRxHL OP5A, 4, D_Read, E_Write ;; LD E D, 1 Cycles:4
  379.       LD@RxHLToRxHL OP5B, 4, E_Read, E_Write ;; LD E E, 1 Cycles:4
  380.       LD@RxHLToRxHL OP5C, 4, H_Read, E_Write ;; LD E H, 1 Cycles:4
  381.       LD@RxHLToRxHL OP5D, 4, L_Read, E_Write ;; LD E L, 1 Cycles:4
  382.       LD@RxHLToRxHL OP5E, 8, xHL_Read, E_Write ;; LD E xHL, 1 Cycles:8
  383.       LD@RxHLToRxHL OP5F, 4, A_Read, E_Write ;; LD E A, 1 Cycles:4  
  384.  
  385.       LD@RxHLToRxHL OP60, 4, B_Read, H_Write ;; LD H B, 1 Cycles:4
  386.       LD@RxHLToRxHL OP61, 4, C_Read, H_Write ;; LD H C, 1 Cycles:4
  387.       LD@RxHLToRxHL OP62, 4, D_Read, H_Write ;; LD H D, 1 Cycles:4
  388.       LD@RxHLToRxHL OP63, 4, E_Read, H_Write ;; LD H E, 1 Cycles:4
  389.       LD@RxHLToRxHL OP64, 4, H_Read, H_Write ;; LD H H, 1 Cycles:4
  390.       LD@RxHLToRxHL OP65, 4, L_Read, H_Write ;; LD H L, 1 Cycles:4
  391.       LD@RxHLToRxHL OP66, 8, xHL_Read, H_Write ;; LD H xHL, 1 Cycles:8
  392.       LD@RxHLToRxHL OP67, 4, A_Read, H_Write ;; LD H A, 1 Cycles:4  
  393.      
  394.       LD@RxHLToRxHL OP68, 4, B_Read, L_Write ;; LD L B, 1 Cycles:4
  395.       LD@RxHLToRxHL OP69, 4, C_Read, L_Write ;; LD L C, 1 Cycles:4
  396.       LD@RxHLToRxHL OP6A, 4, D_Read, L_Write ;; LD L D, 1 Cycles:4
  397.       LD@RxHLToRxHL OP6B, 4, E_Read, L_Write ;; LD L E, 1 Cycles:4
  398.       LD@RxHLToRxHL OP6C, 4, H_Read, L_Write ;; LD L H, 1 Cycles:4
  399.       LD@RxHLToRxHL OP6D, 4, L_Read, L_Write ;; LD L L, 1 Cycles:4
  400.       LD@RxHLToRxHL OP6E, 8, xHL_Read, L_Write ;; LD L xHL, 1 Cycles:8
  401.       LD@RxHLToRxHL OP6F, 4, A_Read, L_Write ;; LD L A, 1 Cycles:4  
  402.        
  403.       LD@RxHLToRxHL OP70, 8, B_Read, xHL_Write ;; LD xHL B, 1 Cycles:8
  404.       LD@RxHLToRxHL OP71, 8, C_Read, xHL_Write ;; LD xHL C, 1 Cycles:8
  405.       LD@RxHLToRxHL OP72, 8, D_Read, xHL_Write ;; LD xHL D, 1 Cycles:8
  406.       LD@RxHLToRxHL OP73, 8, E_Read, xHL_Write ;; LD xHL E, 1 Cycles:8
  407.       LD@RxHLToRxHL OP74, 8, H_Read, xHL_Write ;; LD xHL H, 1 Cycles:8
  408.       LD@RxHLToRxHL OP75, 8, L_Read, xHL_Write ;; LD xHL L, 1 Cycles:8
  409.       ;; LD@RxHLToRxHL OP76, 8, xHL_Read, xHL_Write ;; LD xHL xHL, 1 Cycles:8
  410.       LD@RxHLToRxHL OP02, 8, A_Read, xBC_Write ;; LD xBC A, 1 Cycles:8    
  411.       LD@RxHLToRxHL OP12, 8, A_Read, xDE_Write ;; LD xDE A, 1 Cycles:8    
  412.       LD@RxHLToRxHL OP77, 8, A_Read, xHL_Write ;; LD xHL A, 1 Cycles:8    
  413.       LD@RxHLToRxHL OP22, 8, A_Read, xHL_Write_Inc;; LD xHL++ A, 1 Cycles:8  
  414.       LD@RxHLToRxHL OP32, 8, A_Read, xHL_Write_Dec ;; LD xHL-- A, 1 Cycles:8  
  415.        
  416.       LD@RxHLToRxHL OP78, 4, B_Read, A_Write ;; LD A B, 1 Cycles:4
  417.       LD@RxHLToRxHL OP79, 4, C_Read, A_Write ;; LD A C, 1 Cycles:4
  418.       LD@RxHLToRxHL OP7A, 4, D_Read, A_Write ;; LD A D, 1 Cycles:4
  419.       LD@RxHLToRxHL OP7B, 4, E_Read, A_Write ;; LD A E, 1 Cycles:4
  420.       LD@RxHLToRxHL OP7C, 4, H_Read, A_Write ;; LD A H, 1 Cycles:4
  421.       LD@RxHLToRxHL OP7D, 4, L_Read, A_Write ;; LD A L, 1 Cycles:4
  422.       LD@RxHLToRxHL OP0A, 8, xBC_Read, A_Write ;; LD A xBC, 1 Cycles:8
  423.       LD@RxHLToRxHL OP1A, 8, xDE_Read, A_Write ;; LD A xDE, 1 Cycles:8
  424.       LD@RxHLToRxHL OP7E, 8, xHL_Read, A_Write ;; LD A xHL, 1 Cycles:8
  425.       LD@RxHLToRxHL OP2A, 8, xHL_Read_Inc, A_Write ;; LD A xHL++, 1 Cycles:8
  426.       LD@RxHLToRxHL OP3A, 8, xHL_Read_Dec, A_Write ;; LD A xHL--, 1 Cycles:8
  427.       LD@RxHLToRxHL OP7F, 4, A_Read, A_Write ;; LD A A, 1 Cycles:4      
  428. ;; MISC LD
  429.       LD@RxHLToRxHL OP08,20, Imm16_Read, xImm16_WriteRegSP ;; LD (Imm16) SP, 3 Cycles:20
  430.       LD@RxHLToRxHL OPEA,16, Imm16_Read, xImm16_WriteRegA ;; LD (Imm16) A, 3 Cycles:16
  431.       LD@RxHLToRxHL OPE0,12, Imm8Read_ExpandAddress16, xImm16_WriteRegA ;; LD (Imm8+0FF00h) A, 2 Cycles:12
  432.       LD@RxHLToRxHL OPE2, 8, C_ExpandAddress16, xImm16_WriteRegA ;; LD (C+0FF00h) A, 2 Cycles:8  
  433.       LD@RxHLToRxHL OPF0,12, Imm8Read_ExpandAddress16_Fetch, A_Write ;; LD A, (Imm8+0FF00h)  2 Cycles:12
  434.       LD@RxHLToRxHL OPF2, 8, C_ExpandAddress16_Fetch, A_Write ;; LD A, (C+0FF00h) 2 Cycles:8    
  435.       LD@RxHLToRxHL OPFA,16, Imm16Read_Address_Fetch, A_Write ;; LD A, (Imm16) 3 Cycles:16
  436.       LD@RxHLToRxHL OPF9, 8, HL_Read, SP_Write ;; LD SP HL 1 Cycles:8
  437.      
  438.       OPF8: ;; LD HL SP+Imm8(sign8) 2 Cycles:12
  439.       Imm8_Read
  440.      
  441.       ;; Clear Reg-f
  442.       ;;xor YG_PF, YG_PF
  443.       xor edx, edx
  444.       ;; ext sign
  445.       movsx ax, al
  446.       mov cx, [YG_GP].SP_
  447.       and ecx, 0FFFFh
  448.       and eax, 0FFFFh
  449.       lea edx, [ecx+eax]
  450.       ;; SetH
  451.       mov [YG_GP].HL, dx
  452.       xor cx, ax
  453.       mov ax, dx
  454.       xor cx, ax
  455.       and cx, 01000h
  456.       shr cx, 8
  457.       ;;or YG_PF, ecx
  458.       ;; SetC
  459.       and dx, 010000h
  460.       shr dx, 16
  461.       ;;or YG_PF, edx
  462.       SetCyclesRetP 12
  463.      
  464.       ;; ALU, LOGIC 0x8x- 0xBx---------------------------------------------------------------------------------------
  465.  
  466. Add$c_xHLrToA macro atomic_it, Cycles
  467. ;; atomic_it 0(add) or 1(adc)
  468. ;; source value <- eax
  469. ;; target <- always register A
  470.   and eax, 0FFh ;; Value &= 0xFF
  471.   and YG_PF, atomic_it
  472.   shr YG_PF, 1 ;; check c-flags
  473.   movzx edx, [YG_GP].A
  474.   mov ecx, edx ;; temp WORD := A
  475.   adc ecx, eax ;; temp WORD := A + Value
  476.   mov [YG_GP].A, cl  ;; always write back A.
  477.   xor dx, ax  
  478.   mov ax, cx  
  479.   xor ax, dx  ;; temp WORD:= temp WORD^(A ^Value)
  480.   and ax, 010h
  481.   or YG_PF, eax   ;; SetH
  482.   or YG_PF_8, ch  ;; SetC
  483.   test cl, cl
  484.   setz cl
  485.   shl ecx, 6
  486.   or YG_PF, ecx ;; SetZ  XXX:ZTable
  487. endm
  488.      
  489. CmpSub$bc_xHLrToA macro atomic_it, Cycles, Register ;; [YG_GP].A || cl for cmp opcode
  490. ;; source <- eax
  491. ;; target <- always register A  or nodone
  492.   and eax, 0FFh ;; Value &= 0xFF
  493.   and YG_PF, atomic_it
  494.   shr YG_PF, 1 ;; check c-flags
  495.   movzx edx, [YG_GP].A
  496.   mov ecx, edx ;; temp WORD := A
  497.   sbb ecx, eax ;; temp WORD := A - Value
  498.   mov Register, cl  ;; always write back A.
  499.   xor dx, ax  
  500.   mov ax, cx  
  501.   xor ax, dx  ;; temp WORD:= temp WORD^(A ^Value)
  502.   and ax, 010h
  503.   or YG_PF, eax   ;; SetH
  504.   mov eax, ecx
  505.   shr ax, 15
  506.   or YG_PF_8, al  ;; SetC
  507.   test cl, cl
  508.   setz cl
  509.   shl ecx, 6
  510.   or YG_PF, ecx ;; SetZ  XXX:ZTable
  511.   or YG_PF, N_FLAG ;; SetN
  512. endm
  513.      
  514. ;; XOR | OR | AND do unwind base .
  515. Logic_T macro   Cycles, initFlags, LogicOp
  516. ;; source <- eax
  517. ;; target <- always register A
  518.  
  519. ;; clear psb .
  520.   mov YG_PF, initFlags
  521.   movzx edx, [YG_GP].A
  522.   LogicOp eax, edx
  523.   ;; always write back A.
  524.   mov [YG_GP].A, al
  525.  
  526.   ;; SetZ  XXX:ZTable
  527.   test al, al
  528.   setz al
  529.   shl eax, 6
  530.   or YG_PF, eax
  531. endm  
  532.      
  533. ;; unwind
  534. Add_ macro Cycles
  535.   Add$c_xHLrToA 0, Cycles
  536. endm
  537.  
  538. Adc_ macro Cycles
  539.   Add$c_xHLrToA 1, Cycles
  540. endm
  541.  
  542. Sub_ macro Cycles
  543.   CmpSub$bc_xHLrToA 0, Cycles, [YG_GP].A
  544. endm  
  545.      
  546. Sbc_ macro Cycles
  547.   CmpSub$bc_xHLrToA 1, Cycles, [YG_GP].A
  548. endm      
  549.  
  550. Cmp_ macro Cycles
  551.   CmpSub$bc_xHLrToA 0, Cycles, cl
  552. endm  
  553.      
  554. And_ macro Cycles
  555.   Logic_T Cycles, H_FLAG, and
  556. endm  
  557.      
  558. Xor_ macro Cycles
  559.   Logic_T Cycles, 0, xor
  560. endm      
  561.  
  562. Or_ macro Cycles
  563.   Logic_T Cycles, 0, or
  564. endm      
  565.  
  566. AddWord_  macro
  567. ;; source <- eax
  568. ;; target <- always register HL
  569.  
  570. ;; clear psb . save old Z
  571.   and YG_PF, Z_FLAG
  572.   movzx ecx, [YG_GP].HL
  573.   and eax, 0FFFFh
  574.   lea edx, [eax+ecx]
  575.   ;; always write back HL.
  576.   mov [YG_GP].HL, dx
  577.   ;; SetH
  578.   xor cx, ax
  579.   mov ax, dx
  580.   xor cx, ax
  581.   and cx, 01000h
  582.   shr cx, 8
  583.   or YG_PF, ecx
  584.   ;; SetC
  585.   and edx, 010000h
  586.   shr edx, 16
  587.   or YG_PF, edx
  588. endm
  589.  
  590. ;; TO SP
  591. AddWord2_  macro
  592. ;; source <- eax
  593. ;; target <- always register SP
  594.  
  595. ;; clear psb . save old Z
  596.   ;; xor YG_PF, YG_PF
  597.   movzx ecx, [YG_GP].SP_
  598.   and eax, 0FFFFh
  599.   lea edx, [eax+ecx]
  600.   ;; always write back SP.
  601.   mov [YG_GP].SP_, dx
  602.   ;; SetH
  603.   xor cx, ax
  604.   mov ax, dx
  605.   xor cx, ax
  606.   and cx, 01000h
  607.   shr cx, 8
  608.   ;;or YG_PF, ecx
  609.   ;; SetC
  610.   and dx, 010000h
  611.   shr dx, 16
  612.   ;;or YG_PF, edx
  613. endm
  614.  
  615.  
  616. DecWord_  macro
  617.   dec eax
  618. endm
  619.  
  620. IncWord_  macro
  621.   inc eax
  622. endm
  623.  
  624. Inc_  macro  ;; -----------------------
  625. ;; source <- eax
  626. ;; clear psb . save old Z
  627.   and YG_PF, C_FLAG
  628.   and eax, 0FFh
  629.   lea edx, [eax+1]
  630.   mov ecx, edx
  631.  
  632.   ;; SetH
  633.   xor cx, ax
  634.   and cx, 010h
  635.   or YG_PF, ecx
  636.  
  637.   mov eax, edx
  638.   test dl, dl
  639.   setz dl  
  640.   shl dl, 6
  641.   or YG_PF, edx
  642. endm
  643.  
  644. Dec_  macro  ;; -----------------------
  645. ;; source <- eax
  646. ;; clear psb . save old Z
  647.   and YG_PF, C_FLAG
  648.   or YG_PF, N_FLAG
  649.   and eax, 0FFh
  650.   lea edx, [eax-1]
  651.   mov ecx, edx
  652.  
  653.   ;; SetH
  654.   xor cx, ax
  655.   and cx, 010h
  656.   or YG_PF, ecx
  657.  
  658.   mov eax, edx
  659.   test dl, dl
  660.   setz dl
  661.   shl dl, 6
  662.   or YG_PF, edx
  663. endm
  664.  
  665. ;; --- Include OP, imm8 and ADD Word Register.
  666. Opcode@MainALU  macro  Opcode, Cycles, ReadOrExt, Op, WriteOrExt
  667.   Opcode&:
  668.     ReadOrExt
  669.     Op
  670.     WriteOrExt
  671.     SetCyclesRetP Cycles
  672. endm
  673.       Opcode@MainALU  OP80, 4, B_Read, Add_, EmptyMacro ;; ADD A, B  1 Cycles:4
  674.       Opcode@MainALU  OP81, 4, C_Read, Add_, EmptyMacro ;; ADD A, C  1 Cycles:4    
  675.       Opcode@MainALU  OP82, 4, D_Read, Add_, EmptyMacro ;; ADD A, D  1 Cycles:4
  676.       Opcode@MainALU  OP83, 4, E_Read, Add_, EmptyMacro ;; ADD A, E  1 Cycles:4      
  677.       Opcode@MainALU  OP84, 4, H_Read, Add_, EmptyMacro ;; ADD A, H  1 Cycles:4
  678.       Opcode@MainALU  OP85, 4, L_Read, Add_, EmptyMacro ;; ADD A, L  1 Cycles:4    
  679.       Opcode@MainALU  OP86, 8, xHL_Read, Add_, EmptyMacro ;; ADD A, xHL  1 Cycles:8
  680.       Opcode@MainALU  OP87, 4, A_Read, Add_, EmptyMacro ;; ADD A, A  1 Cycles:4  
  681.       Opcode@MainALU  OPC6, 8, Imm8_Read, Add_, EmptyMacro ;; ADD A, Imm8  2 Cycles:8
  682.       Opcode@MainALU  OP09, 8, BC_Read, AddWord_, HL_Write ;; ADD HL, BC  1 Cycles:8    
  683.       Opcode@MainALU  OP19, 8, DE_Read, AddWord_, HL_Write ;; ADD HL, DE  1 Cycles:8    
  684.       Opcode@MainALU  OP29, 8, HL_Read, AddWord_, HL_Write ;; ADD HL, HL  1 Cycles:8    
  685.       Opcode@MainALU  OP39, 8, SP_Read, AddWord_, HL_Write ;; ADD HL, SP  1 Cycles:8    
  686.       Opcode@MainALU  OPE8,16, Imm8_ExpandSignWord, AddWord2_, EmptyMacro ;; ADD SP, SignImm8  2 Cycles:16
  687.      
  688.       Opcode@MainALU  OP88, 4, B_Read, Adc_, EmptyMacro ;; ADC A, B  1 Cycles:4
  689.       Opcode@MainALU  OP89, 4, C_Read, Adc_, EmptyMacro ;; ADC A, C  1 Cycles:4    
  690.       Opcode@MainALU  OP8A, 4, D_Read, Adc_, EmptyMacro ;; ADC A, D  1 Cycles:4
  691.       Opcode@MainALU  OP8B, 4, E_Read, Adc_, EmptyMacro ;; ADC A, E  1 Cycles:4      
  692.       Opcode@MainALU  OP8C, 4, H_Read, Adc_, EmptyMacro ;; ADC A, H  1 Cycles:4
  693.       Opcode@MainALU  OP8D, 4, L_Read, Adc_, EmptyMacro ;; ADC A, L  1 Cycles:4    
  694.       Opcode@MainALU  OP8E, 8, xHL_Read, Adc_, EmptyMacro ;; ADC A, xHL  1 Cycles:8
  695.       Opcode@MainALU  OP8F, 4, A_Read, Adc_, EmptyMacro ;; ADC A, A  1 Cycles:4  
  696.       Opcode@MainALU  OPCE, 8, Imm8_Read, Adc_, EmptyMacro ;; ADC A, Imm8  2 Cycles:8    
  697.      
  698.       Opcode@MainALU  OP03, 8, BC_Read, IncWord_, BC_Write ;; INC BC  Cycles:8
  699.       Opcode@MainALU  OP13, 8, DE_Read, IncWord_, DE_Write ;; INC DE  Cycles:8
  700.       Opcode@MainALU  OP23, 8, HL_Read, IncWord_, HL_Write ;; INC HL  Cycles:8
  701.       Opcode@MainALU  OP33, 8, SP_Read, IncWord_, SP_Write ;; INC SP  Cycles:8
  702.      
  703.       Opcode@MainALU  OP04, 4, B_Read, Inc_, B_Write ;; INC B  1 Cycles:4
  704.       Opcode@MainALU  OP14, 4, D_Read, Inc_, D_Write ;; INC D  1 Cycles:4    
  705.       Opcode@MainALU  OP24, 4, H_Read, Inc_, H_Write ;; INC H  1 Cycles:4
  706.       Opcode@MainALU  OP34, 4, xHL_Read, Inc_, xHL_Write ;; INC xHL  1 Cycles:4      
  707.       Opcode@MainALU  OP0C, 4, C_Read, Inc_, C_Write ;; INC C  1 Cycles:4
  708.       Opcode@MainALU  OP1C, 4, E_Read, Inc_, E_Write ;; INC E  1 Cycles:4    
  709.       Opcode@MainALU  OP2C,12, L_Read, Inc_, L_Write ;; INC L  1 Cycles:12
  710.       Opcode@MainALU  OP3C, 4, A_Read, Inc_, A_Write ;; INC A  1 Cycles:4      
  711.      
  712.       Opcode@MainALU  OP90, 4, B_Read, Sub_, EmptyMacro ;; SUB A, B  1 Cycles:4
  713.       Opcode@MainALU  OP91, 4, C_Read, Sub_, EmptyMacro ;; SUB A, C  1 Cycles:4    
  714.       Opcode@MainALU  OP92, 4, D_Read, Sub_, EmptyMacro ;; SUB A, D  1 Cycles:4
  715.       Opcode@MainALU  OP93, 4, E_Read, Sub_, EmptyMacro ;; SUB A, E  1 Cycles:4      
  716.       Opcode@MainALU  OP94, 4, H_Read, Sub_, EmptyMacro ;; SUB A, H  1 Cycles:4
  717.       Opcode@MainALU  OP95, 4, L_Read, Sub_, EmptyMacro ;; SUB A, L  1 Cycles:4    
  718.       Opcode@MainALU  OP96, 8, xHL_Read, Sub_, EmptyMacro ;; SUB A, xHL  1 Cycles:8
  719.       Opcode@MainALU  OP97, 4, A_Read, Sub_, EmptyMacro ;; SUB A, A  1 Cycles:4  
  720.       Opcode@MainALU  OPD6, 8, Imm8_Read, Sub_, EmptyMacro ;; SUB A, Imm8  2 Cycles:8
  721.      
  722.       Opcode@MainALU  OP98, 4, B_Read, Sbc_, EmptyMacro ;; SBC A, B  1 Cycles:4
  723.       Opcode@MainALU  OP99, 4, C_Read, Sbc_, EmptyMacro ;; SBC A, C  1 Cycles:4    
  724.       Opcode@MainALU  OP9A, 4, D_Read, Sbc_, EmptyMacro ;; SBC A, D  1 Cycles:4
  725.       Opcode@MainALU  OP9B, 4, E_Read, Sbc_, EmptyMacro ;; SBC A, E  1 Cycles:4      
  726.       Opcode@MainALU  OP9C, 4, H_Read, Sbc_, EmptyMacro ;; SBC A, H  1 Cycles:4
  727.       Opcode@MainALU  OP9D, 4, L_Read, Sbc_, EmptyMacro ;; SBC A, L  1 Cycles:4    
  728.       Opcode@MainALU  OP9E, 8, xHL_Read, Sbc_, EmptyMacro ;; SBC A, xHL  1 Cycles:8
  729.       Opcode@MainALU  OP9F, 4, A_Read, Sbc_, EmptyMacro ;; SBC A, A  1 Cycles:4  
  730.       Opcode@MainALU  OPDE, 8, Imm8_Read, Sbc_, EmptyMacro ;; SBC A, Imm8  2 Cycles:8
  731.    
  732.       Opcode@MainALU  OP0B, 8, BC_Read, DecWord_, BC_Write ;; DEC BC  Cycles:8
  733.       Opcode@MainALU  OP1B, 8, DE_Read, DecWord_, DE_Write ;; DEC DE  Cycles:8
  734.       Opcode@MainALU  OP2B, 8, HL_Read, DecWord_, HL_Write ;; DEC HL  Cycles:8
  735.       Opcode@MainALU  OP3B, 8, SP_Read, DecWord_, SP_Write ;; DEC SP  Cycles:8
  736.      
  737.       Opcode@MainALU  OP05, 4, B_Read, Dec_, B_Write ;; DEC B  1 Cycles:4
  738.       Opcode@MainALU  OP15, 4, D_Read, Dec_, D_Write ;; DEC D  1 Cycles:4    
  739.       Opcode@MainALU  OP25, 4, H_Read, Dec_, H_Write ;; DEC H  1 Cycles:4
  740.       Opcode@MainALU  OP35, 4, xHL_Read, Dec_, xHL_Write ;; DEC xHL  1 Cycles:4      
  741.       Opcode@MainALU  OP0D, 4, C_Read, Dec_, C_Write ;; DEC C  1 Cycles:4
  742.       Opcode@MainALU  OP1D, 4, E_Read, Dec_, E_Write ;; DEC E  1 Cycles:4    
  743.       Opcode@MainALU  OP2D,12, L_Read, Dec_, L_Write ;; DEC L  1 Cycles:12
  744.       Opcode@MainALU  OP3D, 4, A_Read, Dec_, A_Write ;; DEC A  1 Cycles:4  
  745.      
  746.       Opcode@MainALU  OPA0, 4, B_Read, And_, EmptyMacro ;; AND A, B  1 Cycles:4
  747.       Opcode@MainALU  OPA1, 4, C_Read, And_, EmptyMacro ;; AND A, C  1 Cycles:4    
  748.       Opcode@MainALU  OPA2, 4, D_Read, And_, EmptyMacro ;; AND A, D  1 Cycles:4
  749.       Opcode@MainALU  OPA3, 4, E_Read, And_, EmptyMacro ;; AND A, E  1 Cycles:4      
  750.       Opcode@MainALU  OPA4, 4, H_Read, And_, EmptyMacro ;; AND A, H  1 Cycles:4
  751.       Opcode@MainALU  OPA5, 4, L_Read, And_, EmptyMacro ;; AND A, L  1 Cycles:4    
  752.       Opcode@MainALU  OPA6, 8, xHL_Read, And_, EmptyMacro ;; AND A, xHL  1 Cycles:8
  753.       Opcode@MainALU  OPA7, 4, A_Read, And_, EmptyMacro ;; AND A, A  1 Cycles:4  
  754.       Opcode@MainALU  OPE6, 8, Imm8_Read, And_, EmptyMacro ;; AND A, Imm8  2 Cycles:8
  755.        
  756.       Opcode@MainALU  OPA8, 4, B_Read, Xor_, EmptyMacro ;; XOR A, B  1 Cycles:4
  757.       Opcode@MainALU  OPA9, 4, C_Read, Xor_, EmptyMacro ;; XOR A, C  1 Cycles:4    
  758.       Opcode@MainALU  OPAA, 4, D_Read, Xor_, EmptyMacro ;; XOR A, D  1 Cycles:4
  759.       Opcode@MainALU  OPAB, 4, E_Read, Xor_, EmptyMacro ;; XOR A, E  1 Cycles:4      
  760.       Opcode@MainALU  OPAC, 4, H_Read, Xor_, EmptyMacro ;; XOR A, H  1 Cycles:4
  761.       Opcode@MainALU  OPAD, 4, L_Read, Xor_, EmptyMacro ;; XOR A, L  1 Cycles:4    
  762.       Opcode@MainALU  OPAE, 8, xHL_Read, Xor_, EmptyMacro ;; XOR A, xHL  1 Cycles:8
  763.       Opcode@MainALU  OPAF, 4, A_Read, Xor_, EmptyMacro ;; XOR A, A  1 Cycles:4  
  764.       Opcode@MainALU  OPEE, 8, Imm8_Read, Xor_, EmptyMacro ;; XOR A, Imm8  2 Cycles:8
  765.      
  766.       Opcode@MainALU  OPB0, 4, B_Read, Or_, EmptyMacro ;; OR A, B  1 Cycles:4
  767.       Opcode@MainALU  OPB1, 4, C_Read, Or_, EmptyMacro ;; OR A, C  1 Cycles:4    
  768.       Opcode@MainALU  OPB2, 4, D_Read, Or_, EmptyMacro ;; OR A, D  1 Cycles:4
  769.       Opcode@MainALU  OPB3, 4, E_Read, Or_, EmptyMacro ;; OR A, E  1 Cycles:4      
  770.       Opcode@MainALU  OPB4, 4, H_Read, Or_, EmptyMacro ;; OR A, H  1 Cycles:4
  771.       Opcode@MainALU  OPB5, 4, L_Read, Or_, EmptyMacro ;; OR A, L  1 Cycles:4    
  772.       Opcode@MainALU  OPB6, 8, xHL_Read, Or_, EmptyMacro ;; OR A, xHL  1 Cycles:8
  773.       Opcode@MainALU  OPB7, 4, A_Read, Or_, EmptyMacro ;; OR A, A  1 Cycles:4  
  774.       Opcode@MainALU  OPF6, 8, Imm8_Read, Or_, EmptyMacro ;; OR A, Imm8  2 Cycles:8
  775.      
  776.       Opcode@MainALU  OPB8, 4, B_Read, Cmp_, EmptyMacro ;; CP A, B  1 Cycles:4
  777.       Opcode@MainALU  OPB9, 4, C_Read, Cmp_, EmptyMacro ;; CP A, C  1 Cycles:4    
  778.       Opcode@MainALU  OPBA, 4, D_Read, Cmp_, EmptyMacro ;; CP A, D  1 Cycles:4
  779.       Opcode@MainALU  OPBB, 4, E_Read, Cmp_, EmptyMacro ;; CP A, E  1 Cycles:4      
  780.       Opcode@MainALU  OPBC, 4, H_Read, Cmp_, EmptyMacro ;; CP A, H  1 Cycles:4
  781.       Opcode@MainALU  OPBD, 4, L_Read, Cmp_, EmptyMacro ;; CP A, L  1 Cycles:4    
  782.       Opcode@MainALU  OPBE, 8, xHL_Read, Cmp_, EmptyMacro ;; CP A, xHL  1 Cycles:8
  783.       Opcode@MainALU  OPBF, 4, A_Read, Cmp_, EmptyMacro ;; CP A, A  1 Cycles:4  
  784.       Opcode@MainALU  OPFE, 8, Imm8_Read, Cmp_, EmptyMacro ;; CP A, Imm8  2 Cycles:8
  785.      
  786. PushWord_  macro  ;; -----------------------
  787. ;; source <- eax
  788.   mov cx, [YG_GP].SP_
  789.   sub cx, 2
  790.   mov [YG_GP].SP_, cx
  791.   push eax
  792.   push ecx
  793.   push [YG_GP].gameboy
  794.   call gameboy_mmu_write_w@12
  795. endm
  796.  
  797. PopWord_  macro  ;; -----------------------
  798.   mov cx, [YG_GP].SP_
  799.   push ecx
  800.   add cx, 2
  801.   mov [YG_GP].SP_, cx
  802.   push [YG_GP].gameboy
  803.   call gameboy_mmu_read_w@8
  804. endm
  805.  
  806. ;; ---
  807. Opcode@MainStackOperate  macro  Opcode, Cycles, ReadOrExt, Op, WriteOrExt
  808.   Opcode&:
  809.     ReadOrExt
  810.     Op
  811.     WriteOrExt
  812.     SetCyclesAndRet Cycles
  813. endm  
  814.  
  815.       Opcode@MainStackOperate  OPC1,12, PopWord_, EmptyMacro, BC_Write ;; POP BC  1 Cycles:12
  816.       Opcode@MainStackOperate  OPD1,12, PopWord_, EmptyMacro, DE_Write ;; POP DE  1 Cycles:12    
  817.       Opcode@MainStackOperate  OPE1,12, PopWord_, EmptyMacro, HL_Write ;; POP HL  1 Cycles:12
  818.       Opcode@MainStackOperate  OPF1,12, PopWord_, EmptyMacro, AF_Write ;; POP AF  1 Cycles:12  
  819.      
  820.       Opcode@MainStackOperate  OPC5,16, BC_Read, EmptyMacro, PushWord_ ;; PUSH BC  1 Cycles:16
  821.       Opcode@MainStackOperate  OPD5,16, DE_Read, EmptyMacro, PushWord_ ;; PUSH DE  1 Cycles:16    
  822.       Opcode@MainStackOperate  OPE5,16, HL_Read, EmptyMacro, PushWord_ ;; PUSH HL  1 Cycles:16
  823.       Opcode@MainStackOperate  OPF5,16, AF_Read, EmptyMacro, PushWord_ ;; PUSH AF  1 Cycles:16  
  824.  
  825. Opcode@Rst  macro  Opcode, Cycles, Vector
  826.   Opcode&:
  827.     mov ax, si
  828.     PushWord_
  829.     mov si, Vector
  830.     SetCyclesRetP Cycles
  831. endm  
  832.  
  833.       Opcode@Rst  OPC7,16, 000H ;; RST 00H  1 Cycles:16
  834.       Opcode@Rst  OPD7,16, 010H ;; RST 10H  1 Cycles:16    
  835.       Opcode@Rst  OPE7,16, 020H ;; RST 20H  1 Cycles:16
  836.       Opcode@Rst  OPF7,16, 030H ;; RST 30H  1 Cycles:16  
  837.       Opcode@Rst  OPCF,16, 008H ;; RST 08H  1 Cycles:16
  838.       Opcode@Rst  OPDF,16, 018H ;; RST 18H  1 Cycles:16    
  839.       Opcode@Rst  OPEF,16, 028H ;; RST 28H  1 Cycles:16
  840.       Opcode@Rst  OPFF,16, 038H ;; RST 38H  1 Cycles:16    
  841.      
  842. Opcode@JR    macro  Opcode, Flags, OpNOT
  843.    Opcode&:
  844.       mov eax, YG_PF
  845.       and eax, Flags
  846.       xor eax, OpNOT
  847.       jne @F
  848.       inc esi
  849.       SetCyclesRetP 8
  850.     @@:
  851.       Imm8_Read
  852.       movsx eax, al
  853.       add esi, eax
  854.       SetCyclesRetP 12
  855. endm
  856.       Opcode@JR  OP20,Z_FLAG, Z_FLAG ;; JR NZ
  857.       Opcode@JR  OP30,C_FLAG, C_FLAG ;; JR NC
  858.       Opcode@JR  OP28,Z_FLAG, 0 ;; JR Z
  859.       Opcode@JR  OP38,C_FLAG, 0 ;; JR C  
  860.       Opcode@JR  OP18,0, 1 ;; JR R8
  861.      
  862. Opcode@JP    macro  Opcode, Flags, OpNOT
  863.    Opcode&:
  864.       mov eax, YG_PF
  865.       and eax, Flags
  866.       xor eax, OpNOT
  867.       jne @F
  868.       add esi, 2
  869.       SetCyclesRetP 12
  870.     @@:
  871.       Imm16_Read
  872.       mov esi, eax
  873.       SetCyclesRetP 16
  874. endm      
  875.       Opcode@JP  OPC2,Z_FLAG, Z_FLAG ;; JP NZ
  876.       Opcode@JP  OPD2,C_FLAG, C_FLAG ;; JP NC
  877.       Opcode@JP  OPCA,Z_FLAG, 0 ;; JP Z
  878.       Opcode@JP  OPDA,C_FLAG, 0 ;; JP C  
  879.       Opcode@JP  OPC3,0, 1 ;; JP A16
  880.     OPE9:
  881.       mov si, [YG_GP].HL
  882.       mov [YG_GP].PC, ax
  883.       SetCyclesAndRet 4
  884.       ;; LD@RxHLToRxHL OPE9, 4, HL_Read, PC_Write ;; JP (HL), Same as LD PC HL, 1 Cycles:4  
  885.  
  886. Opcode@CALL    macro  Opcode, Flags, OpNOT
  887.    Opcode&:
  888.       mov eax, YG_PF
  889.       and eax, Flags
  890.       xor eax, OpNOT
  891.       jne @F
  892.       add esi, 2
  893.       SetCyclesRetP 12
  894.     @@:
  895.       lea eax, [YG_PC+2]
  896.       PushWord_
  897.       Imm16_Read
  898.       mov esi, eax
  899.       SetCyclesRetP 24
  900. endm
  901.       Opcode@CALL  OPC4,Z_FLAG, Z_FLAG ;; CALL NZ
  902.       Opcode@CALL  OPD4,C_FLAG, C_FLAG ;; CALL NC
  903.       Opcode@CALL  OPCC,Z_FLAG, 0 ;; CALL Z
  904.       Opcode@CALL  OPDC,C_FLAG, 0 ;; CALL C  
  905.       Opcode@CALL  OPCD,0, 1 ;; CALL  
  906.      
  907. Opcode@RET    macro  Opcode, Flags, OpNOT, RetHitCycles
  908.    Opcode&:
  909.       mov eax, YG_PF
  910.       and eax, Flags
  911.       xor eax, OpNOT
  912.       jne @F
  913.       SetCyclesRetP 8
  914.     @@:
  915.       PopWord_
  916.       mov YG_PC, eax
  917.       SetCyclesRetP RetHitCycles
  918. endm      
  919.  
  920. Opcode@RETI    macro  Opcode, Flags, OpNOT, RetHitCycles
  921.    Opcode&:
  922.       mov eax, YG_PF
  923.       and eax, Flags
  924.       xor eax, OpNOT
  925.       jne @F
  926.       SetCyclesRetP 8
  927.     @@:
  928.       PopWord_
  929.       mov YG_PC, eax
  930.       mov [YG_GP].IME, 1
  931.       SetCyclesRetP RetHitCycles
  932. endm
  933.  
  934.       Opcode@RET  OPC0,Z_FLAG, Z_FLAG, 20 ;; RET NZ
  935.       Opcode@RET  OPD0,C_FLAG, C_FLAG, 20 ;; RET NC
  936.       Opcode@RET  OPC8,Z_FLAG, 0, 20 ;; RET Z
  937.       Opcode@RET  OPD8,C_FLAG, 0, 20 ;; RET C  
  938.       Opcode@RET  OPC9,0, 1, 16 ;; RET  
  939.       Opcode@RETI OPD9,0, 1, 16 ;; RETI
  940.      
  941. ;;  MISC 8.
  942.       OP76:   ; Halt,  not backup PC in my source code ^_^
  943.         mov [YG_GP].halt, 1
  944.         SetCyclesAndRet 4    
  945.       OP10:   ; Stop, Check CGB speed mode
  946.         movzx eax, [YG_GP].key1
  947.         test eax, 1
  948.         je @F
  949.         xor eax, 080H ;; switch to "other" speed
  950.         and eax, 0FEH ;; reset LSB  see gb-programming-manual.pdf::2.6.2 CPU Operating Speed
  951.                       ;; for simplicity, I will not simulate the huge waste of time brought by handover.
  952.         mov [YG_GP].key1, al
  953.         SetCyclesAndRet 080000004H
  954.      @@:mov [YG_GP].stop, 1
  955.         add YG_PC, 1 ;; skip one byte (should is 00)
  956.       OP00:   ; NOP
  957.         SetCyclesAndRet 4          
  958.       OPF3:   ; DI
  959.         mov [YG_GP].IME, 0
  960.         SetCyclesAndRet 4
  961.       OPFB:   ; EI
  962.         mov [YG_GP].IME, 1
  963.         SetCyclesAndRet 4  
  964.       OP07:   ; RLCA
  965.         rol [YG_GP].A, 1
  966.         setc YG_PF_8
  967.         SetCyclesRetP 4
  968.       OP17:   ; RLA
  969.         shr YG_PF_8, 1
  970.         rcl [YG_GP].A, 1
  971.         setc YG_PF_8
  972.         SetCyclesRetP 4    
  973.       OP0F:   ; RRCA
  974.         ror [YG_GP].A, 1
  975.         setc YG_PF_8
  976.         SetCyclesRetP 4
  977.       OP1F:   ; RRA
  978.         shr YG_PF_8, 1
  979.         rcr [YG_GP].A, 1
  980.         setc YG_PF_8
  981.         SetCyclesRetP 4    
  982.       OP27:   ; DAA  
  983.         SetCyclesRetP 4    
  984.         mov al, [YG_GP].A
  985.         and YG_PF_8, N_FLAG
  986.         jne DAS_Proc
  987.         ;;  DAA.
  988.         daa
  989.         mov [YG_GP].A, al
  990.         setc YG_PF_8  ;; SETC
  991.         setz al
  992.         shl al, 6
  993.         or YG_PF_8, al
  994.         SetCyclesRetP 4        
  995.     DAS_Proc:
  996.         ;;  DAS
  997.         das    
  998.         mov [YG_GP].A, al
  999.         setc YG_PF_8  ;; SETC
  1000.         setz al
  1001.         shl al, 6
  1002.         or YG_PF_8, al
  1003.         or YG_PF_8, N_FLAG
  1004.         SetCyclesRetP 4    
  1005.       OP37:   ; SCF
  1006.         and YG_PF_8, Z_FLAG
  1007.         or YG_PF_8, C_FLAG  
  1008.         SetCyclesRetP 4    
  1009.       OP2F:   ; CPL  
  1010.         not [YG_GP].A
  1011.         or YG_PF_8, N_FLAG
  1012.         or YG_PF_8, H_FLAG
  1013.         SetCyclesRetP 4  
  1014.       OP3F:   ; CCF
  1015.         and YG_PF_8, ZC_FLAG
  1016.         xor YG_PF_8, C_FLAG  
  1017.         SetCyclesRetP 4
  1018.          
  1019.       ;; rortoe shift with  
  1020.       RLC_ macro Cycles
  1021.         rol al, 1
  1022.         setc YG_PF_8
  1023.         test al, al
  1024.         setz dl
  1025.         shl dl, 6
  1026.         or YG_PF_8, dl    
  1027.       endm
  1028.       ;; rortoe shift with  
  1029.       RRC_ macro Cycles
  1030.         ror al, 1
  1031.         setc YG_PF_8
  1032.         test al, al
  1033.         setz dl
  1034.         shl dl, 6
  1035.         or YG_PF_8, dl    
  1036.       endm      
  1037.       ;; logic shift with carry
  1038.       RL_ macro Cycles
  1039.         shr YG_PF_8, 1
  1040.         rcl al, 1
  1041.         setc YG_PF_8
  1042.         test al, al
  1043.         setz dl
  1044.         shl dl, 6
  1045.         or YG_PF_8, dl    
  1046.       endm
  1047.       ;; logic shift with carry
  1048.       RR_ macro Cycles
  1049.         shr YG_PF_8, 1
  1050.         rcr al, 1
  1051.         setc YG_PF_8
  1052.         test al, al
  1053.         setz dl
  1054.         shl dl, 6
  1055.         or YG_PF_8, dl    
  1056.       endm      
  1057.       ;; logic shift    
  1058.       RL_N_ macro Cycles
  1059.         shl al, 1
  1060.         setc YG_PF_8
  1061.         test al, al
  1062.         setz dl
  1063.         shl dl, 6
  1064.         or YG_PF_8, dl    
  1065.       endm
  1066.       ;; logic shift  
  1067.       RR_N_ macro Cycles
  1068.         shr al, 1
  1069.         setc YG_PF_8
  1070.         test al, al
  1071.         setz dl
  1072.         shl dl, 6
  1073.         or YG_PF_8, dl    
  1074.       endm    
  1075.       ;; arith shift  save msb
  1076.       RRS_N_ macro Cycles
  1077.         sar al, 1
  1078.         setc YG_PF_8
  1079.         setz dl
  1080.         shl dl, 6
  1081.         or YG_PF_8, dl    
  1082.       endm    
  1083.       ;; swap byte-lo 4bit and byte-hi 4bit
  1084.       SWAP_ macro Cycles
  1085.         ror al, 4
  1086.         test al, al
  1087.         setz cl
  1088.         shl cl, 6
  1089.         mov YG_PF, ecx
  1090.       endm        
  1091.        
  1092.       ;;  Set
  1093.       Opcode@SetBit macro Opcode, Cycles,  ReadOrExt, BitOrder, WriteOrExt
  1094.         Opcode&:
  1095.           ReadOrExt
  1096.           mov ecx, 1
  1097.           shl ecx, BitOrder
  1098.           or eax, ecx
  1099.           WriteOrExt
  1100.           SetCyclesAndRet Cycles
  1101.       endm
  1102.      
  1103.       Opcode@ResBit macro Opcode, Cycles,  ReadOrExt, BitOrder, WriteOrExt
  1104.         Opcode&:
  1105.           ReadOrExt
  1106.           mov ecx, 1
  1107.           shl ecx, BitOrder
  1108.           not ecx
  1109.           and eax, ecx
  1110.           WriteOrExt
  1111.           SetCyclesAndRet Cycles
  1112.       endm        
  1113.          
  1114.       Opcode@TestBit macro Opcode, Cycles,  ReadOrExt, BitOrder
  1115.         Opcode&:
  1116.           ReadOrExt
  1117.           and YG_PF, C_FLAG
  1118.           or YG_PF, H_FLAG
  1119.           mov ecx, 1
  1120.           shl ecx, BitOrder
  1121.           test al, cl
  1122.           setz al
  1123.           shl eax, 6
  1124.           or YG_PF, eax
  1125.           SetCyclesRetP Cycles
  1126.       endm      
  1127.        
  1128.       OPCB: ;; ---------------------------------- Perfix CB -----------------------------------------------------------------------------
  1129.         Imm8_Read
  1130.         and eax, 255
  1131.         jmp dword ptr[CBTAB+eax*4]
  1132.        
  1133.         ;; --- Include OP, imm8 and ADD Word Register.
  1134.         Opcode@MainALUExt  macro  Opcode, Cycles, ReadOrExt, Op, WriteOrExt
  1135.           Opcode&:
  1136.             ReadOrExt
  1137.             Op
  1138.             WriteOrExt
  1139.             SetCyclesRetP Cycles
  1140.         endm  
  1141.        
  1142.         Opcode@MainALUExt  CB00, 8, B_Read, RLC_, B_Write      ;; RLC B 2 Cycles:8
  1143.         Opcode@MainALUExt  CB01, 8, C_Read, RLC_, C_Write      ;; RLC C 2 Cycles:8
  1144.         Opcode@MainALUExt  CB02, 8, D_Read, RLC_, D_Write      ;; RLC D 2 Cycles:8
  1145.         Opcode@MainALUExt  CB03, 8, E_Read, RLC_, E_Write      ;; RLC E 2 Cycles:8    
  1146.         Opcode@MainALUExt  CB04, 8, H_Read, RLC_, H_Write      ;; RLC H 2 Cycles:8
  1147.         Opcode@MainALUExt  CB05, 8, L_Read, RLC_, L_Write      ;; RLC L 2 Cycles:8        
  1148.         Opcode@MainALUExt  CB06,16, xHL_Read, RLC_, xHL_Write      ;; RLC xHL 2 Cycles:16
  1149.         Opcode@MainALUExt  CB07, 8, A_Read, RLC_, A_Write      ;; RLC A 2 Cycles:8        
  1150.        
  1151.         Opcode@MainALUExt  CB08, 8, B_Read, RRC_, B_Write      ;; RRC B 2 Cycles:8
  1152.         Opcode@MainALUExt  CB09, 8, C_Read, RRC_, C_Write      ;; RRC C 2 Cycles:8
  1153.         Opcode@MainALUExt  CB0A, 8, D_Read, RRC_, D_Write      ;; RRC D 2 Cycles:8
  1154.         Opcode@MainALUExt  CB0B, 8, E_Read, RRC_, E_Write      ;; RRC E 2 Cycles:8    
  1155.         Opcode@MainALUExt  CB0C, 8, H_Read, RRC_, H_Write      ;; RRC H 2 Cycles:8
  1156.         Opcode@MainALUExt  CB0D, 8, L_Read, RRC_, L_Write      ;; RRC L 2 Cycles:8        
  1157.         Opcode@MainALUExt  CB0E,16, xHL_Read, RRC_, xHL_Write      ;; RRC xHL 2 Cycles:16
  1158.         Opcode@MainALUExt  CB0F, 8, A_Read, RRC_, A_Write      ;; RRC A 2 Cycles:8    
  1159.        
  1160.         Opcode@MainALUExt  CB10, 8, B_Read, RL_, B_Write      ;; RL B 2 Cycles:8
  1161.         Opcode@MainALUExt  CB11, 8, C_Read, RL_, C_Write      ;; RL C 2 Cycles:8
  1162.         Opcode@MainALUExt  CB12, 8, D_Read, RL_, D_Write      ;; RL D 2 Cycles:8
  1163.         Opcode@MainALUExt  CB13, 8, E_Read, RL_, E_Write      ;; RL E 2 Cycles:8    
  1164.         Opcode@MainALUExt  CB14, 8, H_Read, RL_, H_Write      ;; RL H 2 Cycles:8
  1165.         Opcode@MainALUExt  CB15, 8, L_Read, RL_, L_Write      ;; RL L 2 Cycles:8        
  1166.         Opcode@MainALUExt  CB16,16, xHL_Read, RL_, xHL_Write      ;; RL xHL 2 Cycles:16
  1167.         Opcode@MainALUExt  CB17, 8, A_Read, RL_, A_Write      ;; RL A 2 Cycles:8        
  1168.        
  1169.         Opcode@MainALUExt  CB18, 8, B_Read, RR_, B_Write      ;; RR B 2 Cycles:8
  1170.         Opcode@MainALUExt  CB19, 8, C_Read, RR_, C_Write      ;; RR C 2 Cycles:8
  1171.         Opcode@MainALUExt  CB1A, 8, D_Read, RR_, D_Write      ;; RR D 2 Cycles:8
  1172.         Opcode@MainALUExt  CB1B, 8, E_Read, RR_, E_Write      ;; RR E 2 Cycles:8    
  1173.         Opcode@MainALUExt  CB1C, 8, H_Read, RR_, H_Write      ;; RR H 2 Cycles:8
  1174.         Opcode@MainALUExt  CB1D, 8, L_Read, RR_, L_Write      ;; RR L 2 Cycles:8        
  1175.         Opcode@MainALUExt  CB1E,16, xHL_Read, RR_, xHL_Write      ;; RR xHL 2 Cycles:16
  1176.         Opcode@MainALUExt  CB1F, 8, A_Read, RR_, A_Write      ;; RR A 2 Cycles:8            
  1177.        
  1178.         Opcode@MainALUExt  CB20, 8, B_Read, RL_N_, B_Write      ;; SLA B 2 Cycles:8
  1179.         Opcode@MainALUExt  CB21, 8, C_Read, RL_N_, C_Write      ;; SLA C 2 Cycles:8
  1180.         Opcode@MainALUExt  CB22, 8, D_Read, RL_N_, D_Write      ;; SLA D 2 Cycles:8
  1181.         Opcode@MainALUExt  CB23, 8, E_Read, RL_N_, E_Write      ;; SLA E 2 Cycles:8    
  1182.         Opcode@MainALUExt  CB24, 8, H_Read, RL_N_, H_Write      ;; SLA H 2 Cycles:8
  1183.         Opcode@MainALUExt  CB25, 8, L_Read, RL_N_, L_Write      ;; SLA L 2 Cycles:8        
  1184.         Opcode@MainALUExt  CB26,16, xHL_Read, RL_N_, xHL_Write      ;; SLA xHL 2 Cycles:16
  1185.         Opcode@MainALUExt  CB27, 8, A_Read, RL_N_, A_Write      ;; SLA A 2 Cycles:8        
  1186.        
  1187.         Opcode@MainALUExt  CB28, 8, B_Read, RRS_N_, B_Write      ;; SRA B 2 Cycles:8
  1188.         Opcode@MainALUExt  CB29, 8, C_Read, RRS_N_, C_Write      ;; SRA C 2 Cycles:8
  1189.         Opcode@MainALUExt  CB2A, 8, D_Read, RRS_N_, D_Write      ;; SRA D 2 Cycles:8
  1190.         Opcode@MainALUExt  CB2B, 8, E_Read, RRS_N_, E_Write      ;; SRA E 2 Cycles:8    
  1191.         Opcode@MainALUExt  CB2C, 8, H_Read, RRS_N_, H_Write      ;; SRA H 2 Cycles:8
  1192.         Opcode@MainALUExt  CB2D, 8, L_Read, RRS_N_, L_Write      ;; SRA L 2 Cycles:8        
  1193.         Opcode@MainALUExt  CB2E,16, xHL_Read, RRS_N_, xHL_Write      ;; SRA xHL 2 Cycles:16
  1194.         Opcode@MainALUExt  CB2F, 8, A_Read, RRS_N_, A_Write      ;; SRA A 2 Cycles:8      
  1195.        
  1196.         Opcode@MainALUExt  CB30, 8, B_Read, SWAP_, B_Write      ;; SWAP B 2 Cycles:8
  1197.         Opcode@MainALUExt  CB31, 8, C_Read, SWAP_, C_Write      ;; SWAP C 2 Cycles:8
  1198.         Opcode@MainALUExt  CB32, 8, D_Read, SWAP_, D_Write      ;; SWAP D 2 Cycles:8
  1199.         Opcode@MainALUExt  CB33, 8, E_Read, SWAP_, E_Write      ;; SWAP E 2 Cycles:8    
  1200.         Opcode@MainALUExt  CB34, 8, H_Read, SWAP_, H_Write      ;; SWAP H 2 Cycles:8
  1201.         Opcode@MainALUExt  CB35, 8, L_Read, SWAP_, L_Write      ;; SWAP L 2 Cycles:8        
  1202.         Opcode@MainALUExt  CB36,16, xHL_Read, SWAP_, xHL_Write      ;; SWAP xHL 2 Cycles:16
  1203.         Opcode@MainALUExt  CB37, 8, A_Read, SWAP_, A_Write      ;; SWAP A 2 Cycles:8        
  1204.        
  1205.         Opcode@MainALUExt  CB38, 8, B_Read, RR_N_, B_Write      ;; SRL B 2 Cycles:8
  1206.         Opcode@MainALUExt  CB39, 8, C_Read, RR_N_, C_Write      ;; SRL C 2 Cycles:8
  1207.         Opcode@MainALUExt  CB3A, 8, D_Read, RR_N_, D_Write      ;; SRL D 2 Cycles:8
  1208.         Opcode@MainALUExt  CB3B, 8, E_Read, RR_N_, E_Write      ;; SRL E 2 Cycles:8    
  1209.         Opcode@MainALUExt  CB3C, 8, H_Read, RR_N_, H_Write      ;; SRL H 2 Cycles:8
  1210.         Opcode@MainALUExt  CB3D, 8, L_Read, RR_N_, L_Write      ;; SRL L 2 Cycles:8        
  1211.         Opcode@MainALUExt  CB3E,16, xHL_Read, RR_N_, xHL_Write      ;; SRL xHL 2 Cycles:16
  1212.         Opcode@MainALUExt  CB3F, 8, A_Read, RR_N_, A_Write      ;; SRL A 2 Cycles:8        
  1213.        
  1214.         Opcode@TestBit CB40, 8,  B_Read, 0 ;; BIT B, 0 Cycles:8
  1215.         Opcode@TestBit CB41, 8,  C_Read, 0 ;; BIT C, 0 Cycles:8        
  1216.         Opcode@TestBit CB42, 8,  D_Read, 0 ;; BIT D, 0 Cycles:8        
  1217.         Opcode@TestBit CB43, 8,  E_Read, 0 ;; BIT E, 0 Cycles:8    
  1218.         Opcode@TestBit CB44, 8,  H_Read, 0 ;; BIT H, 0 Cycles:8
  1219.         Opcode@TestBit CB45, 8,  L_Read, 0 ;; BIT L, 0 Cycles:8        
  1220.         Opcode@TestBit CB46,16,  xHL_Read, 0 ;; BIT xHL, 0 Cycles:16      
  1221.         Opcode@TestBit CB47, 8,  A_Read, 0 ;; BIT A, 0 Cycles:8        
  1222.      
  1223.         Opcode@TestBit CB48, 8,  B_Read, 1 ;; BIT B, 1 Cycles:8
  1224.         Opcode@TestBit CB49, 8,  C_Read, 1 ;; BIT C, 1 Cycles:8        
  1225.         Opcode@TestBit CB4A, 8,  D_Read, 1 ;; BIT D, 1 Cycles:8        
  1226.         Opcode@TestBit CB4B, 8,  E_Read, 1 ;; BIT E, 1 Cycles:8    
  1227.         Opcode@TestBit CB4C, 8,  H_Read, 1 ;; BIT H, 1 Cycles:8
  1228.         Opcode@TestBit CB4D, 8,  L_Read, 1 ;; BIT L, 1 Cycles:8        
  1229.         Opcode@TestBit CB4E,16,  xHL_Read, 1 ;; BIT xHL, 1 Cycles:16      
  1230.         Opcode@TestBit CB4F, 8,  A_Read, 1 ;; BIT A, 1 Cycles:8
  1231.  
  1232.         Opcode@TestBit CB50, 8,  B_Read, 2 ;; BIT B, 2 Cycles:8
  1233.         Opcode@TestBit CB51, 8,  C_Read, 2 ;; BIT C, 2 Cycles:8        
  1234.         Opcode@TestBit CB52, 8,  D_Read, 2 ;; BIT D, 2 Cycles:8        
  1235.         Opcode@TestBit CB53, 8,  E_Read, 2 ;; BIT E, 2 Cycles:8    
  1236.         Opcode@TestBit CB54, 8,  H_Read, 2 ;; BIT H, 2 Cycles:8
  1237.         Opcode@TestBit CB55, 8,  L_Read, 2 ;; BIT L, 2 Cycles:8        
  1238.         Opcode@TestBit CB56,16,  xHL_Read, 2 ;; BIT xHL, 2 Cycles:16      
  1239.         Opcode@TestBit CB57, 8,  A_Read, 2 ;; BIT A, 2 Cycles:8        
  1240.      
  1241.         Opcode@TestBit CB58, 8,  B_Read, 3 ;; BIT B, 3 Cycles:8
  1242.         Opcode@TestBit CB59, 8,  C_Read, 3 ;; BIT C, 3 Cycles:8        
  1243.         Opcode@TestBit CB5A, 8,  D_Read, 3 ;; BIT D, 3 Cycles:8        
  1244.         Opcode@TestBit CB5B, 8,  E_Read, 3 ;; BIT E, 3 Cycles:8    
  1245.         Opcode@TestBit CB5C, 8,  H_Read, 3 ;; BIT H, 3 Cycles:8
  1246.         Opcode@TestBit CB5D, 8,  L_Read, 3 ;; BIT L, 3 Cycles:8        
  1247.         Opcode@TestBit CB5E,16,  xHL_Read, 3 ;; BIT xHL, 3 Cycles:16      
  1248.         Opcode@TestBit CB5F, 8,  A_Read, 3 ;; BIT A, 3 Cycles:8
  1249.  
  1250.         Opcode@TestBit CB60, 8,  B_Read, 4 ;; BIT B, 4 Cycles:8
  1251.         Opcode@TestBit CB61, 8,  C_Read, 4 ;; BIT C, 4 Cycles:8        
  1252.         Opcode@TestBit CB62, 8,  D_Read, 4 ;; BIT D, 4 Cycles:8        
  1253.         Opcode@TestBit CB63, 8,  E_Read, 4 ;; BIT E, 4 Cycles:8    
  1254.         Opcode@TestBit CB64, 8,  H_Read, 4 ;; BIT H, 4 Cycles:8
  1255.         Opcode@TestBit CB65, 8,  L_Read, 4 ;; BIT L, 4 Cycles:8        
  1256.         Opcode@TestBit CB66,16,  xHL_Read, 4 ;; BITxHLD, 4 Cycles:16      
  1257.         Opcode@TestBit CB67, 8,  A_Read, 4 ;; BIT A, 4 Cycles:8        
  1258.      
  1259.         Opcode@TestBit CB68, 8,  B_Read, 5 ;; BIT B, 5 Cycles:8
  1260.         Opcode@TestBit CB69, 8,  C_Read, 5 ;; BIT C, 5 Cycles:8        
  1261.         Opcode@TestBit CB6A, 8,  D_Read, 5 ;; BIT D, 5 Cycles:8        
  1262.         Opcode@TestBit CB6B, 8,  E_Read, 5 ;; BIT E, 5 Cycles:8    
  1263.         Opcode@TestBit CB6C, 8,  H_Read, 5 ;; BIT H, 5 Cycles:8
  1264.         Opcode@TestBit CB6D, 8,  L_Read, 5 ;; BIT L, 5 Cycles:8        
  1265.         Opcode@TestBit CB6E,16,  xHL_Read, 5 ;; BIT xHL, 5 Cycles:16      
  1266.         Opcode@TestBit CB6F, 8,  A_Read, 5 ;; BIT A, 5 Cycles:8
  1267.        
  1268.         Opcode@TestBit CB70, 8,  B_Read, 6 ;; BIT B, 6 Cycles:8
  1269.         Opcode@TestBit CB71, 8,  C_Read, 6 ;; BIT C, 6 Cycles:8        
  1270.         Opcode@TestBit CB72, 8,  D_Read, 6 ;; BIT D, 6 Cycles:8        
  1271.         Opcode@TestBit CB73, 8,  E_Read, 6 ;; BIT E, 6 Cycles:8    
  1272.         Opcode@TestBit CB74, 8,  H_Read, 6 ;; BIT H, 6 Cycles:8
  1273.         Opcode@TestBit CB75, 8,  L_Read, 6 ;; BIT L, 6 Cycles:8        
  1274.         Opcode@TestBit CB76,16,  xHL_Read, 6 ;; BIT xHL, 6 Cycles:16      
  1275.         Opcode@TestBit CB77, 8,  A_Read, 6 ;; BIT A, 6 Cycles:8        
  1276.      
  1277.         Opcode@TestBit CB78, 8,  B_Read, 7 ;; BIT B, 7 Cycles:8
  1278.         Opcode@TestBit CB79, 8,  C_Read, 7 ;; BIT C, 7 Cycles:8        
  1279.         Opcode@TestBit CB7A, 8,  D_Read, 7 ;; BIT D, 7 Cycles:8        
  1280.         Opcode@TestBit CB7B, 8,  E_Read, 7 ;; BIT E, 7 Cycles:8    
  1281.         Opcode@TestBit CB7C, 8,  H_Read, 7 ;; BIT H, 7 Cycles:8
  1282.         Opcode@TestBit CB7D, 8,  L_Read, 7 ;; BIT L, 7 Cycles:8        
  1283.         Opcode@TestBit CB7E,16,  xHL_Read, 7 ;; BIT xHL, 7 Cycles:16      
  1284.         Opcode@TestBit CB7F, 8,  A_Read, 7 ;; BIT A, 7 Cycles:8
  1285.        
  1286.         Opcode@ResBit CB80, 8,  B_Read, 0, B_Write ;; RES B, 0 Cycles:8
  1287.         Opcode@ResBit CB81, 8,  C_Read, 0, C_Write ;; RES C, 0 Cycles:8        
  1288.         Opcode@ResBit CB82, 8,  D_Read, 0, D_Write ;; RES D, 0 Cycles:8        
  1289.         Opcode@ResBit CB83, 8,  E_Read, 0, E_Write ;; RES E, 0 Cycles:8    
  1290.         Opcode@ResBit CB84, 8,  H_Read, 0, H_Write ;; RES H, 0 Cycles:8
  1291.         Opcode@ResBit CB85, 8,  L_Read, 0, L_Write ;; RES L, 0 Cycles:8        
  1292.         Opcode@ResBit CB86,16,  xHL_Read, 0, xHL_Write ;; RES xHL, 0 Cycles:16      
  1293.         Opcode@ResBit CB87, 8,  A_Read, 0, A_Write ;; RES A, 0 Cycles:8        
  1294.      
  1295.         Opcode@ResBit CB88, 8,  B_Read, 1, B_Write ;; RES B, 1 Cycles:8
  1296.         Opcode@ResBit CB89, 8,  C_Read, 1, C_Write ;; RES C, 1 Cycles:8        
  1297.         Opcode@ResBit CB8A, 8,  D_Read, 1, D_Write ;; RES D, 1 Cycles:8        
  1298.         Opcode@ResBit CB8B, 8,  E_Read, 1, E_Write ;; RES E, 1 Cycles:8    
  1299.         Opcode@ResBit CB8C, 8,  H_Read, 1, H_Write ;; RES H, 1 Cycles:8
  1300.         Opcode@ResBit CB8D, 8,  L_Read, 1, L_Write ;; RES L, 1 Cycles:8        
  1301.         Opcode@ResBit CB8E,16,  xHL_Read, 1, xHL_Write ;; RES xHL, 1 Cycles:16      
  1302.         Opcode@ResBit CB8F, 8,  A_Read, 1, A_Write ;; RES A, 1 Cycles:8
  1303.  
  1304.         Opcode@ResBit CB90, 8,  B_Read, 2, B_Write ;; RES B, 2 Cycles:8
  1305.         Opcode@ResBit CB91, 8,  C_Read, 2, C_Write ;; RES C, 2 Cycles:8        
  1306.         Opcode@ResBit CB92, 8,  D_Read, 2, D_Write ;; RES D, 2 Cycles:8        
  1307.         Opcode@ResBit CB93, 8,  E_Read, 2, E_Write ;; RES E, 2 Cycles:8    
  1308.         Opcode@ResBit CB94, 8,  H_Read, 2, H_Write ;; RES H, 2 Cycles:8
  1309.         Opcode@ResBit CB95, 8,  L_Read, 2, L_Write ;; RES L, 2 Cycles:8        
  1310.         Opcode@ResBit CB96,16,  xHL_Read, 2, xHL_Write ;; RES xHL, 2 Cycles:16      
  1311.         Opcode@ResBit CB97, 8,  A_Read, 2, A_Write ;; RES A, 2 Cycles:8        
  1312.      
  1313.         Opcode@ResBit CB98, 8,  B_Read, 3, B_Write ;; RES B, 3 Cycles:8
  1314.         Opcode@ResBit CB99, 8,  C_Read, 3, C_Write ;; RES C, 3 Cycles:8        
  1315.         Opcode@ResBit CB9A, 8,  D_Read, 3, D_Write ;; RES D, 3 Cycles:8        
  1316.         Opcode@ResBit CB9B, 8,  E_Read, 3, E_Write ;; RES E, 3 Cycles:8    
  1317.         Opcode@ResBit CB9C, 8,  H_Read, 3, H_Write ;; RES H, 3 Cycles:8
  1318.         Opcode@ResBit CB9D, 8,  L_Read, 3, L_Write ;; RES L, 3 Cycles:8        
  1319.         Opcode@ResBit CB9E,16,  xHL_Read, 3, xHL_Write ;; RES xHL, 3 Cycles:16      
  1320.         Opcode@ResBit CB9F, 8,  A_Read, 3, A_Write ;; RES A, 3 Cycles:8
  1321.  
  1322.         Opcode@ResBit CBA0, 8,  B_Read, 4, B_Write ;; RES B, 4 Cycles:8
  1323.         Opcode@ResBit CBA1, 8,  C_Read, 4, C_Write ;; RES C, 4 Cycles:8        
  1324.         Opcode@ResBit CBA2, 8,  D_Read, 4, D_Write ;; RES D, 4 Cycles:8        
  1325.         Opcode@ResBit CBA3, 8,  E_Read, 4, E_Write ;; RES E, 4 Cycles:8    
  1326.         Opcode@ResBit CBA4, 8,  H_Read, 4, H_Write ;; RES H, 4 Cycles:8
  1327.         Opcode@ResBit CBA5, 8,  L_Read, 4, L_Write ;; RES L, 4 Cycles:8        
  1328.         Opcode@ResBit CBA6,16,  xHL_Read, 4, xHL_Write ;; RES xHL, 4 Cycles:16      
  1329.         Opcode@ResBit CBA7, 8,  A_Read, 4, A_Write ;; RES A, 4 Cycles:8        
  1330.      
  1331.         Opcode@ResBit CBA8, 8,  B_Read, 5, B_Write ;; RES B, 5 Cycles:8
  1332.         Opcode@ResBit CBA9, 8,  C_Read, 5, C_Write ;; RES C, 5 Cycles:8        
  1333.         Opcode@ResBit CBAA, 8,  D_Read, 5, D_Write ;; RES D, 5 Cycles:8        
  1334.         Opcode@ResBit CBAB, 8,  E_Read, 5, E_Write ;; RES E, 5 Cycles:8    
  1335.         Opcode@ResBit CBAC, 8,  H_Read, 5, H_Write ;; RES H, 5 Cycles:8
  1336.         Opcode@ResBit CBAD, 8,  L_Read, 5, L_Write ;; RES L, 5 Cycles:8        
  1337.         Opcode@ResBit CBAE,16,  xHL_Read, 5, xHL_Write ;; RES xHL, 5 Cycles:16      
  1338.         Opcode@ResBit CBAF, 8,  A_Read, 5, A_Write ;; RES A, 5 Cycles:8
  1339.        
  1340.         Opcode@ResBit CBB0, 8,  B_Read, 6, B_Write ;; RES B, 6 Cycles:8
  1341.         Opcode@ResBit CBB1, 8,  C_Read, 6, C_Write ;; RES C, 6 Cycles:8        
  1342.         Opcode@ResBit CBB2, 8,  D_Read, 6, D_Write ;; RES D, 6 Cycles:8        
  1343.         Opcode@ResBit CBB3, 8,  E_Read, 6, E_Write ;; RES E, 6 Cycles:8    
  1344.         Opcode@ResBit CBB4, 8,  H_Read, 6, H_Write ;; RES H, 6 Cycles:8
  1345.         Opcode@ResBit CBB5, 8,  L_Read, 6, L_Write ;; RES L, 6 Cycles:8        
  1346.         Opcode@ResBit CBB6,16,  xHL_Read, 6, xHL_Write ;; RES xHL, 6 Cycles:16      
  1347.         Opcode@ResBit CBB7, 8,  A_Read, 6, A_Write ;; RES A, 6 Cycles:8        
  1348.      
  1349.         Opcode@ResBit CBB8, 8,  B_Read, 7, B_Write ;; RES B, 7 Cycles:8
  1350.         Opcode@ResBit CBB9, 8,  C_Read, 7, C_Write ;; RES C, 7 Cycles:8        
  1351.         Opcode@ResBit CBBA, 8,  D_Read, 7, D_Write ;; RES D, 7 Cycles:8        
  1352.         Opcode@ResBit CBBB, 8,  E_Read, 7, E_Write ;; RES E, 7 Cycles:8    
  1353.         Opcode@ResBit CBBC, 8,  H_Read, 7, H_Write ;; RES H, 7 Cycles:8
  1354.         Opcode@ResBit CBBD, 8,  L_Read, 7, L_Write ;; RES L, 7 Cycles:8        
  1355.         Opcode@ResBit CBBE,16,  xHL_Read, 7, xHL_Write ;; RES xHL, 7 Cycles:16      
  1356.         Opcode@ResBit CBBF, 8,  A_Read, 7, A_Write ;; RES A, 7 Cycles:8
  1357.  
  1358.         Opcode@SetBit CBC0, 8,  B_Read, 0, B_Write ;; SET B, 0 Cycles:8
  1359.         Opcode@SetBit CBC1, 8,  C_Read, 0, C_Write ;; SET C, 0 Cycles:8        
  1360.         Opcode@SetBit CBC2, 8,  D_Read, 0, D_Write ;; SET D, 0 Cycles:8        
  1361.         Opcode@SetBit CBC3, 8,  E_Read, 0, E_Write ;; SET E, 0 Cycles:8    
  1362.         Opcode@SetBit CBC4, 8,  H_Read, 0, H_Write ;; SET H, 0 Cycles:8
  1363.         Opcode@SetBit CBC5, 8,  L_Read, 0, L_Write ;; SET L, 0 Cycles:8        
  1364.         Opcode@SetBit CBC6,16,  xHL_Read, 0, xHL_Write ;; SET xHL, 0 Cycles:16      
  1365.         Opcode@SetBit CBC7, 8,  A_Read, 0, A_Write ;; SET A, 0 Cycles:8        
  1366.      
  1367.         Opcode@SetBit CBC8, 8,  B_Read, 1, B_Write ;; SET B, 1 Cycles:8
  1368.         Opcode@SetBit CBC9, 8,  C_Read, 1, C_Write ;; SET C, 1 Cycles:8        
  1369.         Opcode@SetBit CBCA, 8,  D_Read, 1, D_Write ;; SET D, 1 Cycles:8        
  1370.         Opcode@SetBit CBCB, 8,  E_Read, 1, E_Write ;; SET E, 1 Cycles:8    
  1371.         Opcode@SetBit CBCC, 8,  H_Read, 1, H_Write ;; SET H, 1 Cycles:8
  1372.         Opcode@SetBit CBCD, 8,  L_Read, 1, L_Write ;; SET L, 1 Cycles:8        
  1373.         Opcode@SetBit CBCE,16,  xHL_Read, 1, xHL_Write ;; SET xHL, 1 Cycles:16      
  1374.         Opcode@SetBit CBCF, 8,  A_Read, 1, A_Write ;; SET A, 1 Cycles:8
  1375.  
  1376.         Opcode@SetBit CBD0, 8,  B_Read, 2, B_Write ;; SET B, 2 Cycles:8
  1377.         Opcode@SetBit CBD1, 8,  C_Read, 2, C_Write ;; SET C, 2 Cycles:8        
  1378.         Opcode@SetBit CBD2, 8,  D_Read, 2, D_Write ;; SET D, 2 Cycles:8        
  1379.         Opcode@SetBit CBD3, 8,  E_Read, 2, E_Write ;; SET E, 2 Cycles:8    
  1380.         Opcode@SetBit CBD4, 8,  H_Read, 2, H_Write ;; SET H, 2 Cycles:8
  1381.         Opcode@SetBit CBD5, 8,  L_Read, 2, L_Write ;; SET L, 2 Cycles:8        
  1382.         Opcode@SetBit CBD6,16,  xHL_Read, 2, xHL_Write ;; SET xHL, 2 Cycles:16      
  1383.         Opcode@SetBit CBD7, 8,  A_Read, 2, A_Write ;; SET A, 2 Cycles:8        
  1384.      
  1385.         Opcode@SetBit CBD8, 8,  B_Read, 3, B_Write ;; SET B, 3 Cycles:8
  1386.         Opcode@SetBit CBD9, 8,  C_Read, 3, C_Write ;; SET C, 3 Cycles:8        
  1387.         Opcode@SetBit CBDA, 8,  D_Read, 3, D_Write ;; SET D, 3 Cycles:8        
  1388.         Opcode@SetBit CBDB, 8,  E_Read, 3, E_Write ;; SET E, 3 Cycles:8    
  1389.         Opcode@SetBit CBDC, 8,  H_Read, 3, H_Write ;; SET H, 3 Cycles:8
  1390.         Opcode@SetBit CBDD, 8,  L_Read, 3, L_Write ;; SET L, 3 Cycles:8        
  1391.         Opcode@SetBit CBDE,16,  xHL_Read, 3, xHL_Write ;; SET xHL, 3 Cycles:16      
  1392.         Opcode@SetBit CBDF, 8,  A_Read, 3, A_Write ;; SET A, 3 Cycles:8
  1393.  
  1394.         Opcode@SetBit CBE0, 8,  B_Read, 4, B_Write ;; SET B, 4 Cycles:8
  1395.         Opcode@SetBit CBE1, 8,  C_Read, 4, C_Write ;; SET C, 4 Cycles:8        
  1396.         Opcode@SetBit CBE2, 8,  D_Read, 4, D_Write ;; SET D, 4 Cycles:8        
  1397.         Opcode@SetBit CBE3, 8,  E_Read, 4, E_Write ;; SET E, 4 Cycles:8    
  1398.         Opcode@SetBit CBE4, 8,  H_Read, 4, H_Write ;; SET H, 4 Cycles:8
  1399.         Opcode@SetBit CBE5, 8,  L_Read, 4, L_Write ;; SET L, 4 Cycles:8        
  1400.         Opcode@SetBit CBE6,16,  xHL_Read, 4, xHL_Write ;; SET xHL, 4 Cycles:16      
  1401.         Opcode@SetBit CBE7, 8,  A_Read, 4, A_Write ;; SET A, 4 Cycles:8        
  1402.      
  1403.         Opcode@SetBit CBE8, 8,  B_Read, 5, B_Write ;; SET B, 5 Cycles:8
  1404.         Opcode@SetBit CBE9, 8,  C_Read, 5, C_Write ;; SET C, 5 Cycles:8        
  1405.         Opcode@SetBit CBEA, 8,  D_Read, 5, D_Write ;; SET D, 5 Cycles:8        
  1406.         Opcode@SetBit CBEB, 8,  E_Read, 5, E_Write ;; SET E, 5 Cycles:8    
  1407.         Opcode@SetBit CBEC, 8,  H_Read, 5, H_Write ;; SET H, 5 Cycles:8
  1408.         Opcode@SetBit CBED, 8,  L_Read, 5, L_Write ;; SET L, 5 Cycles:8        
  1409.         Opcode@SetBit CBEE,16,  xHL_Read, 5, xHL_Write ;; SET xHL, 5 Cycles:16      
  1410.         Opcode@SetBit CBEF, 8,  A_Read, 5, A_Write ;; SET A, 5 Cycles:8
  1411.        
  1412.         Opcode@SetBit CBF0, 8,  B_Read, 6, B_Write ;; SET B, 6 Cycles:8
  1413.         Opcode@SetBit CBF1, 8,  C_Read, 6, C_Write ;; SET C, 6 Cycles:8        
  1414.         Opcode@SetBit CBF2, 8,  D_Read, 6, D_Write ;; SET D, 6 Cycles:8        
  1415.         Opcode@SetBit CBF3, 8,  E_Read, 6, E_Write ;; SET E, 6 Cycles:8    
  1416.         Opcode@SetBit CBF4, 8,  H_Read, 6, H_Write ;; SET H, 6 Cycles:8
  1417.         Opcode@SetBit CBF5, 8,  L_Read, 6, L_Write ;; SET L, 6 Cycles:8        
  1418.         Opcode@SetBit CBF6,16,  xHL_Read, 6, xHL_Write ;; SET xHL, 6 Cycles:16      
  1419.         Opcode@SetBit CBF7, 8,  A_Read, 6, A_Write ;; SET A, 6 Cycles:8        
  1420.      
  1421.         Opcode@SetBit CBF8, 8,  B_Read, 7, B_Write ;; SET B, 7 Cycles:8
  1422.         Opcode@SetBit CBF9, 8,  C_Read, 7, C_Write ;; SET C, 7 Cycles:8        
  1423.         Opcode@SetBit CBFA, 8,  D_Read, 7, D_Write ;; SET D, 7 Cycles:8        
  1424.         Opcode@SetBit CBFB, 8,  E_Read, 7, E_Write ;; SET E, 7 Cycles:8    
  1425.         Opcode@SetBit CBFC, 8,  H_Read, 7, H_Write ;; SET H, 7 Cycles:8
  1426.         Opcode@SetBit CBFD, 8,  L_Read, 7, L_Write ;; SET L, 7 Cycles:8        
  1427.         Opcode@SetBit CBFE,16,  xHL_Read, 7, xHL_Write ;; SET xHL, 7 Cycles:16      
  1428.         Opcode@SetBit CBFF, 8,  A_Read, 7, A_Write ;; SET A, 7 Cycles:8        
  1429. V_EXIT:
  1430.       pop esi
  1431.       pop edi
  1432.       pop ebx
  1433.       ret          
  1434. OPD3:
  1435. OPDB:
  1436. OPDD:
  1437. OPE3:
  1438. OPE4:
  1439. OPEB:
  1440. OPEC:
  1441. OPED:
  1442. OPF4:
  1443. OPFC:
  1444. OPFD: ud2
  1445.       align 16
  1446. OPTAB dd  OP00, OP01, OP02, OP03, OP04, OP05, OP06, OP07, OP08, OP09, OP0A, OP0B, OP0C, OP0D, OP0E, OP0F
  1447.       dd  OP10, OP11, OP12, OP13, OP14, OP15, OP16, OP17, OP18, OP19, OP1A, OP1B, OP1C, OP1D, OP1E, OP1F
  1448.       dd  OP20, OP21, OP22, OP23, OP24, OP25, OP26, OP27, OP28, OP29, OP2A, OP2B, OP2C, OP2D, OP2E, OP2F
  1449.       dd  OP30, OP31, OP32, OP33, OP34, OP35, OP36, OP37, OP38, OP39, OP3A, OP3B, OP3C, OP3D, OP3E, OP3F
  1450.       dd  OP40, OP41, OP42, OP43, OP44, OP45, OP46, OP47, OP48, OP49, OP4A, OP4B, OP4C, OP4D, OP4E, OP4F
  1451.       dd  OP50, OP51, OP52, OP53, OP54, OP55, OP56, OP57, OP58, OP59, OP5A, OP5B, OP5C, OP5D, OP5E, OP5F
  1452.       dd  OP60, OP61, OP62, OP63, OP64, OP65, OP66, OP67, OP68, OP69, OP6A, OP6B, OP6C, OP6D, OP6E, OP6F
  1453.       dd  OP70, OP71, OP72, OP73, OP74, OP75, OP76, OP77, OP78, OP79, OP7A, OP7B, OP7C, OP7D, OP7E, OP7F
  1454.       dd  OP80, OP81, OP82, OP83, OP84, OP85, OP86, OP87, OP88, OP89, OP8A, OP8B, OP8C, OP8D, OP8E, OP8F
  1455.       dd  OP90, OP91, OP92, OP93, OP94, OP95, OP96, OP97, OP98, OP99, OP9A, OP9B, OP9C, OP9D, OP9E, OP9F
  1456.       dd  OPA0, OPA1, OPA2, OPA3, OPA4, OPA5, OPA6, OPA7, OPA8, OPA9, OPAA, OPAB, OPAC, OPAD, OPAE, OPAF
  1457.       dd  OPB0, OPB1, OPB2, OPB3, OPB4, OPB5, OPB6, OPB7, OPB8, OPB9, OPBA, OPBB, OPBC, OPBD, OPBE, OPBF
  1458.       dd  OPC0, OPC1, OPC2, OPC3, OPC4, OPC5, OPC6, OPC7, OPC8, OPC9, OPCA, OPCB, OPCC, OPCD, OPCE, OPCF
  1459.       dd  OPD0, OPD1, OPD2, OPD3, OPD4, OPD5, OPD6, OPD7, OPD8, OPD9, OPDA, OPDB, OPDC, OPDD, OPDE, OPDF
  1460.       dd  OPE0, OPE1, OPE2, OPE3, OPE4, OPE5, OPE6, OPE7, OPE8, OPE9, OPEA, OPEB, OPEC, OPED, OPEE, OPEF
  1461.       dd  OPF0, OPF1, OPF2, OPF3, OPF4, OPF5, OPF6, OPF7, OPF8, OPF9, OPFA, OPFB, OPFC, OPFD, OPFE, OPFF
  1462.       align 16
  1463. CBTAB dd  CB00, CB01, CB02, CB03, CB04, CB05, CB06, CB07, CB08, CB09, CB0A, CB0B, CB0C, CB0D, CB0E, CB0F
  1464.       dd  CB10, CB11, CB12, CB13, CB14, CB15, CB16, CB17, CB18, CB19, CB1A, CB1B, CB1C, CB1D, CB1E, CB1F
  1465.       dd  CB20, CB21, CB22, CB23, CB24, CB25, CB26, CB27, CB28, CB29, CB2A, CB2B, CB2C, CB2D, CB2E, CB2F
  1466.       dd  CB30, CB31, CB32, CB33, CB34, CB35, CB36, CB37, CB38, CB39, CB3A, CB3B, CB3C, CB3D, CB3E, CB3F
  1467.       dd  CB40, CB41, CB42, CB43, CB44, CB45, CB46, CB47, CB48, CB49, CB4A, CB4B, CB4C, CB4D, CB4E, CB4F
  1468.       dd  CB50, CB51, CB52, CB53, CB54, CB55, CB56, CB57, CB58, CB59, CB5A, CB5B, CB5C, CB5D, CB5E, CB5F
  1469.       dd  CB60, CB61, CB62, CB63, CB64, CB65, CB66, CB67, CB68, CB69, CB6A, CB6B, CB6C, CB6D, CB6E, CB6F
  1470.       dd  CB70, CB71, CB72, CB73, CB74, CB75, CB76, CB77, CB78, CB79, CB7A, CB7B, CB7C, CB7D, CB7E, CB7F
  1471.       dd  CB80, CB81, CB82, CB83, CB84, CB85, CB86, CB87, CB88, CB89, CB8A, CB8B, CB8C, CB8D, CB8E, CB8F
  1472.       dd  CB90, CB91, CB92, CB93, CB94, CB95, CB96, CB97, CB98, CB99, CB9A, CB9B, CB9C, CB9D, CB9E, CB9F
  1473.       dd  CBA0, CBA1, CBA2, CBA3, CBA4, CBA5, CBA6, CBA7, CBA8, CBA9, CBAA, CBAB, CBAC, CBAD, CBAE, CBAF
  1474.       dd  CBB0, CBB1, CBB2, CBB3, CBB4, CBB5, CBB6, CBB7, CBB8, CBB9, CBBA, CBBB, CBBC, CBBD, CBBE, CBBF
  1475.       dd  CBC0, CBC1, CBC2, CBC3, CBC4, CBC5, CBC6, CBC7, CBC8, CBC9, CBCA, CBCB, CBCC, CBCD, CBCE, CBCF
  1476.       dd  CBD0, CBD1, CBD2, CBD3, CBD4, CBD5, CBD6, CBD7, CBD8, CBD9, CBDA, CBDB, CBDC, CBDD, CBDE, CBDF
  1477.       dd  CBE0, CBE1, CBE2, CBE3, CBE4, CBE5, CBE6, CBE7, CBE8, CBE9, CBEA, CBEB, CBEC, CBED, CBEE, CBEF
  1478.       dd  CBF0, CBF1, CBF2, CBF3, CBF4, CBF5, CBF6, CBF7, CBF8, CBF9, CBFA, CBFB, CBFC, CBFD, CBFE, CBFF
  1479.        
  1480. cpu_optick endp
  1481.  
  1482.   end
  1483. ;; cpu_optick.asm  (version2 for NASM Assembler)
  1484. ;; Sharp LR35902 Chip Opcode for GameBoy
  1485. ;;
  1486. ;; Copyright (C) 2018 moecmks
  1487. ;; This file is part of KS3578.
  1488. ;;
  1489. ;; do What The Fuck you want to Public License
  1490. ;;
  1491. ;; Version 1.0, March 2000
  1492. ;; Copyright (C) 2000 Banlu Kemiyatorn (]d).
  1493. ;; 136 Nives 7 Jangwattana 14 Laksi Bangkok
  1494. ;; Everyone is permitted to copy and distribute verbatim copies
  1495. ;; of this license document, but changing it is not allowed.
  1496. ;;
  1497. ;; Ok, the purpose of this license is simple
  1498. ;; and you just
  1499. ;;
  1500. ;; DO WHAT THE FUCK YOU WANT TO.
  1501. ;;
  1502. ;; Sharp LR35902 Chip opcode mapper
  1503. ;; http://www.pastraiser.com/cpu/gameboy/gameboy_opcodes.html
  1504. ;; Z80 Chip opcode mapper
  1505. ;; http://clrhome.org/table/
  1506. ;;
  1507.  
  1508. ;; The Fleg Register consists of the following bits:
  1509. ;; 7 6 5 4 3 2 1 0
  1510. ;; Z N H C 0 0 0 0
  1511. Z_FLAG equ 0x80
  1512. N_FLAG equ 0x40
  1513. H_FLAG equ 0x20
  1514. C_FLAG equ 0x10
  1515.  
  1516. %if 1
  1517. extern _gameboy_mmu_read@8  ;; prototype ks_uint8 __stdcall _gameboy_mmu_read (void;;gameboy, ks_uint16 addresss)
  1518. extern _gameboy_mmu_write@12 ;; prototype void __stdcall _gameboy_mmu_write (void;;gameboy, ks_uint16 addresss, ks_uint8 value)
  1519. extern _gameboy_mmu_read_w@8  ;; prototype ks_uint8 __stdcall _gameboy_mmu_read_w (void;;gameboy, ks_uint16 addresss)
  1520. extern _gameboy_mmu_write_w@12 ;; prototype void __stdcall _gameboy_mmu_write_w (void;;gameboy, ks_uint16 addresss, ks_uint8 value)
  1521. %define MmuRead _gameboy_mmu_read@8
  1522. %define MmuReadWord _gameboy_mmu_read_w@8
  1523. %define MmuWrite _gameboy_mmu_write@12
  1524. %define MmuWriteWord _gameboy_mmu_write_w@12
  1525. %endif
  1526.  
  1527. ;;  define union .
  1528. %macro  defREG 2            ; 1:low, 2:hi
  1529.   .%1: resb 1
  1530.   .%2: resb 1
  1531.   .%2%1: equ .%1
  1532. %endmacro
  1533.  
  1534. %macro  defREG2 3           ; 1:low, 2:hi 3:comb another.
  1535.   .%1: resb 1
  1536.   .%2: resb 1
  1537.   .%3: equ .%1
  1538. %endmacro
  1539.  
  1540. struc lr35902                         ; structure definition      
  1541.   defREG F, A
  1542.   defREG C, B
  1543.   defREG E, D
  1544.   defREG L, H
  1545.   defREG2 SP_LO, SP_HI, SP
  1546.   defREG2 PC_LO, PC_HI, PC
  1547.  
  1548.   .IME: resb 1
  1549.   .halt: resd 1
  1550.   .stop: resd 1
  1551.   ._backup: resd 1
  1552.   .key1: resb 1
  1553.   .gameboy: resd 1
  1554. endstruc
  1555.  
  1556. %macro xImm16_WriteReg 2 ;; eax:Imm16 %1 lr35902::reg %2:word or byte
  1557.   movzx ecx, %2 [YG_GP+lr35902.%1]
  1558.   push ecx
  1559.   push eax
  1560.   push dword [YG_GP+lr35902.gameboy]
  1561.   call MmuWriteWord
  1562. %endmacro
  1563. %macro xRegister_Read  1
  1564.   mov ax, word [YG_GP+lr35902.%1]
  1565.   push eax
  1566.   push dword [YG_GP+lr35902.gameboy]
  1567.   call MmuRead
  1568. %endmacro  
  1569. %macro xImm16_WriteRegSP 0
  1570.   movzx ecx, word [YG_GP+lr35902.SP]
  1571.   push ecx
  1572.   push eax
  1573.   push dword [YG_GP+lr35902.gameboy]
  1574.   call MmuWriteWord
  1575. %endmacro
  1576. %macro xImm16_WriteRegA 0
  1577.   movzx ecx, byte [YG_GP+lr35902.A]
  1578.   push ecx
  1579.   push eax
  1580.   push dword [YG_GP+lr35902.gameboy]
  1581.   call MmuWrite
  1582. %endmacro
  1583. %macro xRegister_WriteReg 4
  1584.   ;; eax:Register
  1585.   ;; %1 lr35902::reg
  1586.   ;; %2:word or byte
  1587.   ;; %3 Offset add
  1588.   ;; %4 bit mask 0xFF or 0xFFFF
  1589.   and eax, %4
  1590.   add eax, %3
  1591.   push eax
  1592.   movzx eax, %2 [YG_GP+lr35902.%1]
  1593.   push eax
  1594.   push dword [YG_GP+lr35902.gameboy]
  1595.   call MmuWrite
  1596. %endmacro
  1597. %macro SetCyclesAndRet 1 ;; %1: burning cpu clk.
  1598.   ;; write back PC
  1599.   mov [YG_GP+lr35902.PC], si
  1600.   mov eax, %1
  1601.   jmp V_EXIT
  1602. %endmacro        
  1603. %macro SetCyclesRetP 1  ;; %1: burning cpu clk.
  1604.   ;; write back F
  1605.   mov [YG_GP+lr35902.F], bl
  1606.   SetCyclesAndRet %1
  1607. %endmacro  
  1608.      
  1609. ;;  Register access-read unwind
  1610. %macro B_Read 0
  1611.   mov al, [YG_GP+lr35902.B]
  1612. %endmacro
  1613. %macro C_Read 0
  1614.   mov al, [YG_GP+lr35902.C]
  1615. %endmacro
  1616. %macro D_Read 0
  1617.   mov al, [YG_GP+lr35902.D]
  1618. %endmacro
  1619. %macro E_Read 0
  1620.   mov al, [YG_GP+lr35902.E]
  1621. %endmacro
  1622. %macro H_Read 0
  1623.   mov al, [YG_GP+lr35902.H]
  1624. %endmacro
  1625. %macro L_Read 0
  1626.   mov al, [YG_GP+lr35902.L]
  1627. %endmacro
  1628. %macro A_Read 0
  1629.   mov al, [YG_GP+lr35902.A]
  1630. %endmacro
  1631. %macro F_Read 0
  1632.   mov al, [YG_GP+lr35902.F]
  1633. %endmacro
  1634. %macro BC_Read 0
  1635.   mov ax, [YG_GP+lr35902.BC]
  1636. %endmacro
  1637. %macro DE_Read 0
  1638.   mov ax, [YG_GP+lr35902.DE]
  1639. %endmacro
  1640. %macro HL_Read 0
  1641.   mov ax, [YG_GP+lr35902.HL]
  1642. %endmacro
  1643. %macro AF_Read 0
  1644.   mov ax, [YG_GP+lr35902.AF]
  1645. %endmacro
  1646. %macro SP_Read 0
  1647.   mov ax, [YG_GP+lr35902.SP]
  1648. %endmacro
  1649. %macro xBC_Read 0
  1650.   xRegister_Read BC  
  1651. %endmacro
  1652. %macro xDE_Read 0
  1653.   xRegister_Read DE
  1654. %endmacro
  1655. %macro xHL_Read 0
  1656.   xRegister_Read HL
  1657. %endmacro
  1658. %macro xHL_Read_Inc 0
  1659.   xHL_Read
  1660.   inc word [YG_GP+lr35902.HL]
  1661. %endmacro  
  1662. %macro xHL_Read_Dec 0
  1663.   xHL_Read
  1664.   dec word [YG_GP+lr35902.HL]
  1665. %endmacro
  1666. %macro xAF_Read 0
  1667.   xRegister_Read AF
  1668. %endmacro
  1669. %macro xPC_Read 0
  1670.   xRegister_Read PC
  1671. %endmacro
  1672.  
  1673. ;;  Register access-write unwind
  1674. %macro B_Write 0
  1675.   mov [YG_GP+lr35902.B], al
  1676. %endmacro
  1677. %macro C_Write 0
  1678.   mov [YG_GP+lr35902.C], al
  1679. %endmacro
  1680. %macro D_Write 0
  1681.   mov [YG_GP+lr35902.D], al
  1682. %endmacro
  1683. %macro E_Write 0
  1684.   mov [YG_GP+lr35902.E], al
  1685. %endmacro
  1686. %macro H_Write 0
  1687.   mov [YG_GP+lr35902.H], al
  1688. %endmacro
  1689. %macro L_Write 0
  1690.   mov [YG_GP+lr35902.L], al
  1691. %endmacro
  1692. %macro A_Write 0
  1693.   mov [YG_GP+lr35902.A], al
  1694. %endmacro
  1695. %macro F_Write 0
  1696.   mov [YG_GP+lr35902.F], al
  1697. %endmacro
  1698. %macro BC_Write 0
  1699.   mov [YG_GP+lr35902.BC], ax
  1700. %endmacro
  1701. %macro DE_Write 0
  1702.   mov [YG_GP+lr35902.DE], ax
  1703. %endmacro
  1704. %macro HL_Write 0
  1705.   mov [YG_GP+lr35902.HL], ax
  1706. %endmacro
  1707. %macro AF_Write 0
  1708.   mov [YG_GP+lr35902.AF], ax
  1709. %endmacro
  1710. %macro SP_Write 0
  1711.   mov [YG_GP+lr35902.SP], ax
  1712. %endmacro
  1713. %macro  xBC_Write 0
  1714.   xRegister_WriteReg BC, word, 0, 0xFFFF  
  1715. %endmacro
  1716. %macro xDE_Write 0
  1717.   xRegister_WriteReg DE, word, 0, 0xFFFF
  1718. %endmacro
  1719. %macro xHL_Write 0
  1720.   xRegister_WriteReg HL, word, 0, 0xFFFF
  1721. %endmacro
  1722. %macro xHL_Write_Inc 0
  1723.   xRegister_WriteReg HL, word, 0, 0xFFFF
  1724.   inc word [YG_GP+lr35902.HL]
  1725. %endmacro
  1726. %macro xHL_Write_Dec 0
  1727.   xRegister_WriteReg HL, word, 0, 0xFFFF
  1728.   dec word [YG_GP+lr35902.HL]
  1729. %endmacro
  1730.  
  1731. %macro Imm8_Read 0
  1732.   push    esi
  1733.   push    dword [YG_GP+lr35902.gameboy]
  1734.   call    MmuRead
  1735.   inc     esi
  1736. %endmacro  
  1737. %macro Imm16_Read 0
  1738.   push    esi
  1739.   push    dword [YG_GP+lr35902.gameboy]
  1740.   call    MmuReadWord
  1741.   add     esi, 2
  1742. %endmacro  
  1743. %macro Read_ByxX86SpecRegister  1
  1744.   ;;  %1:x86Register
  1745.   push    %1
  1746.   push    dword [YG_GP+lr35902.gameboy]
  1747.   call    MmuRead
  1748. %endmacro
  1749. %macro Imm8Read_ExpandAddress16 0
  1750.   Imm8_Read
  1751.   and eax, 000FFh
  1752.   add eax, 0FF00h
  1753. %endmacro  
  1754. %macro Imm8_ExpandSignWord 0
  1755.   Imm8_Read
  1756.   movsx eax, al
  1757. %endmacro  
  1758. %macro C_ExpandAddress16 0
  1759.   movzx eax, byte [YG_GP+lr35902.C]
  1760.   add eax, 0FF00h
  1761. %endmacro  
  1762. %macro Imm8Read_ExpandAddress16_Fetch 0
  1763.   Imm8Read_ExpandAddress16
  1764.   Read_ByxX86SpecRegister eax
  1765. %endmacro  
  1766. %macro Imm16Read_Address_Fetch 0
  1767.   Imm16_Read
  1768.   Read_ByxX86SpecRegister eax
  1769. %endmacro  
  1770. %macro C_ExpandAddress16_Fetch 0
  1771.   mov al, [YG_GP+lr35902.C]
  1772.   add eax, 0FF00h
  1773.   Read_ByxX86SpecRegister eax
  1774. %endmacro  
  1775. %macro EmptyMacro 0
  1776. %endmacro
  1777.  
  1778. ;; ld r(xHL), r(xHL)
  1779. %macro lr35902@LD@RxHLToRxHL  4
  1780.  ;; %1 OpCase
  1781.  ;; %2 Cycles_
  1782.  ;; %3 ReadOrExt
  1783.  ;; %4 WriteOrExt
  1784.  %1:
  1785.     %3
  1786.     %4
  1787.     SetCyclesAndRet %2  
  1788. %endmacro
  1789.  
  1790. ;; ld r, imm8/imm16
  1791. %macro lr35902@LD@Imm  4
  1792.  ;; %1 OpCase
  1793.  ;; %2 Immread
  1794.  ;; %3 Cycles_
  1795.  ;; %4 WriteOrExt
  1796.   %1:
  1797.     %2
  1798.     %4
  1799.     SetCyclesAndRet %3
  1800. %endmacro  
  1801.  
  1802. ;; arith/logic main
  1803. %macro OP_Add$c_xHLrToA 1
  1804. ;; %1: atomic_it 0(add) or C_FLAG(adc)
  1805. ;; source value <- eax
  1806.   and eax, 0xFF ;; Value &= 0xFF
  1807.   and YG_PF, %1
  1808.   shr YG_PF, 5 ;; check c-flags
  1809.   movzx edx, byte [YG_GP+lr35902.A]
  1810.   mov ecx, edx ;; temp WORD := A
  1811.   adc ecx, eax ;; temp WORD := A + Value
  1812.   mov [YG_GP+lr35902.A], cl  ;; always write back A.
  1813.   test cl, cl
  1814.   setz YG_PF_8
  1815.   shl YG_PF_8, 7 ;; z flag set  
  1816.   xor dx, ax  
  1817.   mov ax, cx  
  1818.   xor ax, dx  ;; temp WORD:= temp WORD^(A ^Value)
  1819.   and ax, 0x10
  1820.   shl ax, 1
  1821.   or YG_PF, eax   ;; h flag set  
  1822.   shl ch, 4
  1823.   or YG_PF_8, ch  ;; c flag set  
  1824. %endmacro  
  1825.  
  1826. %macro AddWord_ 0
  1827. ;; source <- eax
  1828. ;; target <- always register HL
  1829.  
  1830. ;; clear psb . save old Z
  1831.   and YG_PF, Z_FLAG
  1832.   movzx ecx, word [YG_GP+lr35902.HL]
  1833.   and eax, 0xFFFF
  1834.   lea edx, [eax+ecx]
  1835.   ;; always write back HL.
  1836.   mov word [YG_GP+lr35902.HL], dx
  1837.   xor cx, ax
  1838.   mov ax, dx
  1839.   xor cx, ax
  1840.   and cx, 01000h
  1841.   shl cx, 1
  1842.   or YG_PF_8, ch   ;; h flag set  
  1843.   and edx, 010000h
  1844.   shr edx, 12
  1845.   or YG_PF, edx ;; c flag set  
  1846. %endmacro  
  1847.  
  1848. %macro AddWord2_ 0
  1849. ;; source <- eax
  1850. ;; target <- always register SP
  1851.   movsx eax, al
  1852.   xor YG_PF, YG_PF
  1853.   movzx ecx, word [YG_GP+lr35902.SP]
  1854.   and eax, 0xFFFF
  1855.   lea edx, [eax+ecx]
  1856.   ;; always write back HL.
  1857.   mov word [YG_GP+lr35902.SP], dx
  1858.   xor cx, ax
  1859.   mov ax, dx
  1860.   xor cx, ax
  1861.   and cx, 0x0110 ;; C|H
  1862.   mov YG_PF_8, ch
  1863.   shl YG_PF_8, 4
  1864.   shl cl, 1
  1865.   or YG_PF_8, cl
  1866.   and YG_PF, (H_FLAG| C_FLAG)
  1867. %endmacro
  1868.  
  1869. %macro OP_CmpSub$bc_xHLrToA 2
  1870. ;; %1: atomic_it 0(sub) or C_FLAG(sbc)
  1871. ;; %2: [YG_GP+lr35902.A] || cl for cmp opcode
  1872. ;; source value <- eax
  1873.   and eax, 0xFF ;; Value &= 0xFF
  1874.   and YG_PF, %1
  1875.   shr YG_PF, 5 ;; check c-flags
  1876.   movzx edx, byte [YG_GP+lr35902.A]
  1877.   mov ecx, edx ;; temp WORD := A
  1878.   sbb ecx, eax ;; temp WORD := A - Value
  1879.   mov %2, cl  ;; always write back A.
  1880.   test cl, cl
  1881.   setz YG_PF_8
  1882.   shl YG_PF_8, 7 ;; z flag set  
  1883.   xor dx, ax  
  1884.   mov ax, cx  
  1885.   xor ax, dx  ;; temp WORD:= temp WORD^(A ^Value)
  1886.   and ax, 0x10
  1887.   shl ax, 1
  1888.   or YG_PF, eax    ;; h flag set  
  1889.   and ecx, 0x8000
  1890.   shr ecx, 11
  1891.   or YG_PF, ecx  ;; c flag set  
  1892.   or YG_PF, N_FLAG ;; n flag set  
  1893. %endmacro  
  1894.      
  1895. ;; XOR | OR | AND do unwind base .
  1896. %macro OP_Logic_T 2
  1897. ;; %1: initFlags
  1898. ;; %2: LogicOp
  1899. ;; source <- eax
  1900. ;; target <- always register A
  1901.   mov YG_PF, %1
  1902.   movzx edx, byte [YG_GP+lr35902.A]
  1903.   %2 al, dl
  1904.   ;; always write back A.
  1905.   mov [YG_GP+lr35902.A], al
  1906.   setz al
  1907.   shl eax, 7
  1908.   or YG_PF, eax ;; z flag set  
  1909. %endmacro  
  1910.      
  1911. ;; unwind
  1912. %macro Add_  0
  1913.   OP_Add$c_xHLrToA 0
  1914. %endmacro  
  1915.  
  1916. %macro Adc_ 0
  1917.   OP_Add$c_xHLrToA C_FLAG
  1918. %endmacro  
  1919.  
  1920. %macro Sub_ 0
  1921.   OP_CmpSub$bc_xHLrToA 0, [YG_GP+lr35902.A]
  1922. %endmacro    
  1923.      
  1924. %macro Sbc_ 0
  1925.   OP_CmpSub$bc_xHLrToA C_FLAG, [YG_GP+lr35902.A]
  1926. %endmacro        
  1927.  
  1928. %macro Cmp_ 0
  1929.   OP_CmpSub$bc_xHLrToA 0, cl
  1930. %endmacro  
  1931.      
  1932. %macro And_ 0
  1933.   OP_Logic_T H_FLAG, and
  1934. %endmacro    
  1935.      
  1936. %macro Xor_  0
  1937.   OP_Logic_T 0, xor
  1938. %endmacro        
  1939.  
  1940. %macro Or_ 0
  1941.   OP_Logic_T 0, or
  1942. %endmacro      
  1943.  
  1944. %macro DecWord_  0
  1945.   dec eax
  1946. %endmacro  
  1947.  
  1948. %macro IncWord_  0
  1949.   inc eax
  1950. %endmacro
  1951.  
  1952. %macro Inc_  0 ;; ----------------------- DEC RxHL
  1953. ;; source <- eax
  1954. ;; clear psb . save old C
  1955.   and YG_PF, C_FLAG
  1956.   add al, 1
  1957.   setz dl
  1958.   shl dl, 7
  1959.   or YG_PF, edx ;; z flag set  
  1960.   test eax, 15 ;; 0xNF+1 := 0xC0 (C:= N+1)
  1961.   setz dl
  1962.   shl dl, 5
  1963.   or YG_PF, edx ;; h flag set  
  1964. %endmacro  
  1965.  
  1966. %macro Dec_ 0  ;; ----------------------- INC RxHL
  1967. ;; source <- eax
  1968. ;; clear psb . save old C
  1969.   and YG_PF, C_FLAG
  1970.   sub al, 1
  1971.   setz dl
  1972.   shl dl, 7
  1973.   or YG_PF, edx ;; z flag set  
  1974.   lea ecx, [eax+1]
  1975.   test ecx, 15 ;; 0xN0-1 := 0xCF (C:= N-1)
  1976.   setz dl
  1977.   shl dl, 5
  1978.   or YG_PF, edx ;; h flag set
  1979.   or YG_PF, N_FLAG ;; n flag set
  1980. %endmacro  
  1981.  
  1982. %macro lr35902@JP 3 ;; ------------------------- JMP/Jcc
  1983.  ;; %1 Opcode,
  1984.  ;; %2 Flags
  1985.  ;; %3 OpNOT
  1986.    %1:
  1987.       mov eax, YG_PF
  1988.       and eax, %2
  1989.       xor eax, %3
  1990.       jne %%JP_skip
  1991.       add esi, 2
  1992.       SetCyclesRetP 12
  1993.     %%JP_skip:
  1994.       Imm16_Read
  1995.       mov esi, eax
  1996.       SetCyclesRetP 16
  1997. %endmacro  
  1998.  
  1999. %macro lr35902@Rst 2 ;; ------------------------- Rst
  2000. ;; %1 Opcode
  2001. ;; %2 Vector
  2002.   %1:
  2003.     mov ax, si
  2004.     OP_PushWord
  2005.     mov si, %2
  2006.     SetCyclesAndRet 16
  2007. %endmacro  
  2008.  
  2009. %macro lr35902@JR  3 ;; -------------------------- JMP Short/Jcc Short
  2010. ;; %1 Opcode
  2011. ;; %2 Flags
  2012. ;; %3 OpNOT
  2013.    %1:
  2014.       mov eax, YG_PF
  2015.       and eax, %2
  2016.       xor eax, %3
  2017.       jne %%JR_skip
  2018.       inc esi
  2019.       SetCyclesRetP 8
  2020.     %%JR_skip:
  2021.       Imm8_Read
  2022.       movsx eax, al
  2023.       add esi, eax
  2024.       SetCyclesRetP 12
  2025. %endmacro
  2026.  
  2027. %macro lr35902@CALL   3 ;; ------------------------ sub routine call
  2028. ;; %1 Opcode
  2029. ;; %2 Flags
  2030. ;; %3 OpNOT
  2031.    %1:
  2032.       mov eax, YG_PF
  2033.       and eax, %2
  2034.       xor eax, %3
  2035.       jne %%CALL_Skip
  2036.       add esi, 2
  2037.       SetCyclesRetP 12
  2038.     %%CALL_Skip:
  2039.       lea eax, [YG_PC+2]
  2040.       OP_PushWord
  2041.       Imm16_Read
  2042.       mov esi, eax
  2043.       SetCyclesRetP 24
  2044. %endmacro  
  2045.  
  2046.  
  2047. %macro lr35902@RET 4 ;; --------------------------- sub_call return
  2048. ;; %1 Opcode
  2049. ;; %2 Flags
  2050. ;; %3 OpNOT
  2051. ;; %4 RetHitCycles
  2052.    %1:
  2053.       mov eax, YG_PF
  2054.       and eax, %2
  2055.       xor eax, %3
  2056.       jne %%RET_skip
  2057.       SetCyclesRetP 8
  2058.     %%RET_skip:
  2059.       OP_PopWord
  2060.       mov YG_PC, eax
  2061.       SetCyclesRetP %4
  2062. %endmacro    
  2063.      
  2064. %macro lr35902@RETI 4
  2065.  %1:
  2066.       OP_PopWord
  2067.       mov YG_PC, eax
  2068.       mov byte [YG_GP+lr35902.IME], 1
  2069.       SetCyclesAndRet 16    
  2070. %endmacro  
  2071.  
  2072. %macro OP_PushWord 0  ;; ----------------------- Stack Push Base
  2073. ;; source <- eax
  2074. ;; --SP Push High
  2075. ;; --SP Push Low
  2076.   mov cx, [YG_GP+lr35902.SP]
  2077.   sub cx, 2
  2078.   mov [YG_GP+lr35902.SP], cx
  2079.   push eax
  2080.   push ecx
  2081.   push dword [YG_GP+lr35902.gameboy]
  2082.   call MmuWriteWord
  2083. %endmacro  
  2084.  
  2085. %macro OP_PopWord  0  ;; ----------------------- Stack Pop Base
  2086. ;; target <- eax
  2087. ;; Pop Low ++SP
  2088. ;; Pop High ++SP
  2089.   mov cx, [YG_GP+lr35902.SP]
  2090.   push ecx
  2091.   add cx, 2
  2092.   mov [YG_GP+lr35902.SP], cx
  2093.   push dword [YG_GP+lr35902.gameboy]
  2094.   call MmuReadWord
  2095. %endmacro  
  2096.  
  2097. %macro AF_StackPopStuff  0  ;; -----------------------
  2098.   and eax, 0xFFF0
  2099. %endmacro  
  2100.  
  2101. %macro AF_StackPushStuff  0  ;; -----------------------
  2102. %endmacro  
  2103.  
  2104.  
  2105. %macro lr35902@MainALU 5
  2106.  ;; %1 OpCase
  2107.  ;; %2 Cycles
  2108.  ;; %3 ReadOrExt
  2109.  ;; %4 Op
  2110.  ;; %5 WriteOrExt
  2111.   %1:
  2112.     %3
  2113.     %4
  2114.     %5
  2115.     SetCyclesRetP %2
  2116. %endmacro
  2117.  
  2118. %macro lr35902@MainALUExt  5
  2119.  ;; %1 OpCase
  2120.  ;; %2 Cycles
  2121.  ;; %3 ReadOrExt
  2122.  ;; %4 Op
  2123.  ;; %5 WriteOrExt
  2124.   %1:
  2125.     %3
  2126.     %4
  2127.     %5
  2128.     SetCyclesRetP %2
  2129. %endmacro
  2130.        
  2131. ;; rortoe shift with  
  2132. %macro RLC_ 0
  2133.   rol al, 1
  2134.   setc YG_PF_8
  2135.   shl YG_PF_8, 4
  2136.   test al, al
  2137.   setz dl
  2138.   shl dl, 7
  2139.   or YG_PF_8, dl    
  2140. %endmacro  
  2141. ;; rortoe shift with  
  2142. %macro RRC_ 0
  2143.   ror al, 1
  2144.   setc YG_PF_8
  2145.   shl YG_PF_8, 4
  2146.   test al, al
  2147.   setz dl
  2148.   shl dl, 7
  2149.   or YG_PF_8, dl    
  2150. %endmacro        
  2151. ;; logic shift with carry
  2152. %macro RL_ 0
  2153.   shr YG_PF_8, 5
  2154.   rcl al, 1
  2155.   setc YG_PF_8
  2156.   shl YG_PF_8, 4
  2157.   test al, al
  2158.   setz dl
  2159.   shl dl, 7
  2160.   or YG_PF_8, dl    
  2161. %endmacro  
  2162. ;; logic shift with carry
  2163. %macro RR_ 0
  2164.   shr YG_PF_8, 5
  2165.   rcr al, 1
  2166.   setc YG_PF_8
  2167.   shl YG_PF_8, 4
  2168.   test al, al
  2169.   setz dl
  2170.   shl dl, 7
  2171.   or YG_PF_8, dl    
  2172. %endmacro        
  2173. ;; logic shift    
  2174. %macro RL_N_ 0
  2175.   shl al, 1
  2176.   setc YG_PF_8
  2177.   shl YG_PF_8, 4
  2178.   test al, al
  2179.   setz dl
  2180.   shl dl, 7
  2181.   or YG_PF_8, dl    
  2182. %endmacro  
  2183. ;; logic shift  
  2184. %macro RR_N_ 0
  2185.   shr al, 1
  2186.   setc YG_PF_8
  2187.   shl YG_PF_8, 4
  2188.   test al, al
  2189.   setz dl
  2190.   shl dl, 7
  2191.   or YG_PF_8, dl    
  2192. %endmacro    
  2193. ;; arith shift  save msb
  2194. %macro RRS_N_ 0
  2195.   sar al, 1
  2196.   setc YG_PF_8
  2197.   shl YG_PF_8, 4
  2198.   test al, al
  2199.   setz dl
  2200.   shl dl, 7
  2201.   or YG_PF_8, dl    
  2202. %endmacro      
  2203. ;; swap byte-lo 4bit and byte-hi 4bit
  2204. %macro SWAP_ 0
  2205.   ror al, 4
  2206.   test al, al
  2207.   setz cl
  2208.   shl cl, 7
  2209.   mov YG_PF, ecx
  2210. %endmacro          
  2211.  
  2212. ;;  Set
  2213. %macro lr35902@SetBit 5
  2214.  ;; %1 Opcode
  2215.  ;; %2 Cycles
  2216.  ;; %3 ReadOrExt
  2217.  ;; %4 BitOrder
  2218.  ;; %5 WriteOrExt
  2219.   %1:
  2220.     %3
  2221.     mov ecx, 1
  2222.     shl ecx, %4
  2223.     or eax, ecx
  2224.     %5
  2225.     SetCyclesAndRet %2
  2226. %endmacro  
  2227.  
  2228. %macro lr35902@ResBit 5
  2229.  ;; %1 Opcode
  2230.  ;; %2 Cycles
  2231.  ;; %3 ReadOrExt
  2232.  ;; %4 BitOrder
  2233.  ;; %5 WriteOrExt
  2234.   %1:
  2235.     %3
  2236.     mov ecx, 1
  2237.     shl ecx, %4
  2238.     not ecx
  2239.     and al, cl
  2240.     %5
  2241.     SetCyclesRetP %2
  2242. %endmacro          
  2243.    
  2244. %macro lr35902@TestBit 4
  2245.  ;; %1 Opcode
  2246.  ;; %2 Cycles
  2247.  ;; %3 ReadOrExt
  2248.  ;; %4 BitOrder
  2249.   %1:
  2250.     %3
  2251.     and YG_PF, C_FLAG
  2252.     or YG_PF, H_FLAG
  2253.     mov ecx, 1
  2254.     shl ecx, %4
  2255.     test al, cl
  2256.     setz al
  2257.     shl eax, 7
  2258.     or YG_PF, eax
  2259.     SetCyclesRetP %2
  2260. %endmacro  
  2261.      
  2262.      
  2263.      
  2264.         ;; lr35902@MainStack  OPC1,12, PopWord_, EmptyMacro, BC_Write ;; POP BC  1 Cycles:12
  2265. %macro lr35902@MainStack    5
  2266.  ;; %1 OpCase
  2267.  ;; %2 Cycles
  2268.  ;; %3 ReadOrExt
  2269.  ;; %4 Op
  2270.  ;; %5 WriteOrExt
  2271.   %1:
  2272.     %3
  2273.     %4
  2274.     %5
  2275.     SetCyclesAndRet %2
  2276. %endmacro
  2277.  
  2278.  
  2279. section .text
  2280. global _cpu_optick
  2281. _cpu_optick:
  2282.         push ebx ;U -  save old frame      
  2283.         push edi ;V -  save old frame
  2284.         push esi
  2285.         nop  
  2286.  
  2287. %define YG_PF_8 bl        
  2288. %define YG_PF ebx
  2289. %define YG_PC esi
  2290. %define YG_GP edi
  2291.  
  2292.         ; ebx <- save now P (cpu's PSB reg)
  2293.         ; esi <- save now PC (cpu's EIP reg)
  2294.         ; edi <- save regs root
  2295.         ; eax <- calc temp or final calc out reslt
  2296.         ; ecx <- calc temp
  2297.         ; edx <- calc temp
  2298.        
  2299.         mov YG_GP, [esp+4+12]   ;; fetch CPU struct
  2300.         mov si, [YG_GP+lr35902.PC]
  2301.         mov bl, [YG_GP+lr35902.F]
  2302.        
  2303.         ; Fetch Opcode, PC++
  2304.         push YG_PC
  2305.         push dword [YG_GP+lr35902.gameboy]
  2306.         call MmuRead
  2307.         inc YG_PC
  2308.         add YG_PC, [YG_GP+lr35902._backup]
  2309.         and eax, 255
  2310.         jmp dword [OPTAB+eax*4]
  2311.        
  2312.         lr35902@LD@Imm OP06, Imm8_Read, 8,  B_Write ;; LD B Imm8, 2, Cycles:8
  2313.         lr35902@LD@Imm OP0E, Imm8_Read, 8,  C_Write ;; LD C Imm8, 2, Cycles:8
  2314.         lr35902@LD@Imm OP16, Imm8_Read, 8,  D_Write ;; LD D Imm8, 2, Cycles:8
  2315.         lr35902@LD@Imm OP1E, Imm8_Read, 8,  E_Write ;; LD E Imm8, 2, Cycles:8
  2316.         lr35902@LD@Imm OP26, Imm8_Read, 8,  H_Write ;; LD H Imm8, 2, Cycles:8
  2317.         lr35902@LD@Imm OP2E, Imm8_Read, 8,  L_Write ;; LD L Imm8, 2, Cycles:8
  2318.         lr35902@LD@Imm OP36, Imm8_Read, 12, xHL_Write ;; LD xHL Imm8, 2, Cycles:8
  2319.         lr35902@LD@Imm OP3E, Imm8_Read, 8,  A_Write ;; LD A Imm8, 2, Cycles:8
  2320.      
  2321.         lr35902@LD@Imm OP01, Imm16_Read, 12, BC_Write ;; LD BC Imm16, 3 Cycles:12
  2322.         lr35902@LD@Imm OP11, Imm16_Read, 12, DE_Write ;; LD DE Imm16, 3 Cycles:12    
  2323.         lr35902@LD@Imm OP21, Imm16_Read, 12, HL_Write ;; LD HL Imm16, 3 Cycles:12    
  2324.         lr35902@LD@Imm OP31, Imm16_Read, 12, SP_Write ;; LD SP Imm16, 3 Cycles:12  
  2325.      
  2326.         lr35902@LD@RxHLToRxHL OP40, 4, B_Read, B_Write ;; LD B B, 1 Cycles:4
  2327.         lr35902@LD@RxHLToRxHL OP41, 4, C_Read, B_Write ;; LD B C, 1 Cycles:4
  2328.         lr35902@LD@RxHLToRxHL OP42, 4, D_Read, B_Write ;; LD B D, 1 Cycles:4
  2329.         lr35902@LD@RxHLToRxHL OP43, 4, E_Read, B_Write ;; LD B E, 1 Cycles:4
  2330.         lr35902@LD@RxHLToRxHL OP44, 4, H_Read, B_Write ;; LD B H, 1 Cycles:4
  2331.         lr35902@LD@RxHLToRxHL OP45, 4, L_Read, B_Write ;; LD B L, 1 Cycles:4
  2332.         lr35902@LD@RxHLToRxHL OP46, 8, xHL_Read, B_Write ;; LD B xHL, 1 Cycles:8
  2333.         lr35902@LD@RxHLToRxHL OP47, 4, A_Read, B_Write ;; LD B A, 1 Cycles:4  
  2334.        
  2335.         lr35902@LD@RxHLToRxHL OP48, 4, B_Read, C_Write ;; LD C B, 1 Cycles:4
  2336.         lr35902@LD@RxHLToRxHL OP49, 4, C_Read, C_Write ;; LD C C, 1 Cycles:4
  2337.         lr35902@LD@RxHLToRxHL OP4A, 4, D_Read, C_Write ;; LD C D, 1 Cycles:4
  2338.         lr35902@LD@RxHLToRxHL OP4B, 4, E_Read, C_Write ;; LD C E, 1 Cycles:4
  2339.         lr35902@LD@RxHLToRxHL OP4C, 4, H_Read, C_Write ;; LD C H, 1 Cycles:4
  2340.         lr35902@LD@RxHLToRxHL OP4D, 4, L_Read, C_Write ;; LD C L, 1 Cycles:4
  2341.         lr35902@LD@RxHLToRxHL OP4E, 8, xHL_Read, C_Write ;; LD C xHL, 1 Cycles:8
  2342.         lr35902@LD@RxHLToRxHL OP4F, 4, A_Read, C_Write ;; LD C A, 1 Cycles:4  
  2343.  
  2344.         lr35902@LD@RxHLToRxHL OP50, 4, B_Read, D_Write ;; LD D B, 1 Cycles:4
  2345.         lr35902@LD@RxHLToRxHL OP51, 4, C_Read, D_Write ;; LD D C, 1 Cycles:4
  2346.         lr35902@LD@RxHLToRxHL OP52, 4, D_Read, D_Write ;; LD D D, 1 Cycles:4
  2347.         lr35902@LD@RxHLToRxHL OP53, 4, E_Read, D_Write ;; LD D E, 1 Cycles:4
  2348.         lr35902@LD@RxHLToRxHL OP54, 4, H_Read, D_Write ;; LD D H, 1 Cycles:4
  2349.         lr35902@LD@RxHLToRxHL OP55, 4, L_Read, D_Write ;; LD D L, 1 Cycles:4
  2350.         lr35902@LD@RxHLToRxHL OP56, 8, xHL_Read, D_Write ;; LD D xHL, 1 Cycles:8
  2351.         lr35902@LD@RxHLToRxHL OP57, 4, A_Read, D_Write ;; LD D A, 1 Cycles:4  
  2352.        
  2353.         lr35902@LD@RxHLToRxHL OP58, 4, B_Read, E_Write ;; LD E B, 1 Cycles:4
  2354.         lr35902@LD@RxHLToRxHL OP59, 4, C_Read, E_Write ;; LD E C, 1 Cycles:4
  2355.         lr35902@LD@RxHLToRxHL OP5A, 4, D_Read, E_Write ;; LD E D, 1 Cycles:4
  2356.         lr35902@LD@RxHLToRxHL OP5B, 4, E_Read, E_Write ;; LD E E, 1 Cycles:4
  2357.         lr35902@LD@RxHLToRxHL OP5C, 4, H_Read, E_Write ;; LD E H, 1 Cycles:4
  2358.         lr35902@LD@RxHLToRxHL OP5D, 4, L_Read, E_Write ;; LD E L, 1 Cycles:4
  2359.         lr35902@LD@RxHLToRxHL OP5E, 8, xHL_Read, E_Write ;; LD E xHL, 1 Cycles:8
  2360.         lr35902@LD@RxHLToRxHL OP5F, 4, A_Read, E_Write ;; LD E A, 1 Cycles:4  
  2361.  
  2362.         lr35902@LD@RxHLToRxHL OP60, 4, B_Read, H_Write ;; LD H B, 1 Cycles:4
  2363.         lr35902@LD@RxHLToRxHL OP61, 4, C_Read, H_Write ;; LD H C, 1 Cycles:4
  2364.         lr35902@LD@RxHLToRxHL OP62, 4, D_Read, H_Write ;; LD H D, 1 Cycles:4
  2365.         lr35902@LD@RxHLToRxHL OP63, 4, E_Read, H_Write ;; LD H E, 1 Cycles:4
  2366.         lr35902@LD@RxHLToRxHL OP64, 4, H_Read, H_Write ;; LD H H, 1 Cycles:4
  2367.         lr35902@LD@RxHLToRxHL OP65, 4, L_Read, H_Write ;; LD H L, 1 Cycles:4
  2368.         lr35902@LD@RxHLToRxHL OP66, 8, xHL_Read, H_Write ;; LD H xHL, 1 Cycles:8
  2369.         lr35902@LD@RxHLToRxHL OP67, 4, A_Read, H_Write ;; LD H A, 1 Cycles:4  
  2370.        
  2371.         lr35902@LD@RxHLToRxHL OP68, 4, B_Read, L_Write ;; LD L B, 1 Cycles:4
  2372.         lr35902@LD@RxHLToRxHL OP69, 4, C_Read, L_Write ;; LD L C, 1 Cycles:4
  2373.         lr35902@LD@RxHLToRxHL OP6A, 4, D_Read, L_Write ;; LD L D, 1 Cycles:4
  2374.         lr35902@LD@RxHLToRxHL OP6B, 4, E_Read, L_Write ;; LD L E, 1 Cycles:4
  2375.         lr35902@LD@RxHLToRxHL OP6C, 4, H_Read, L_Write ;; LD L H, 1 Cycles:4
  2376.         lr35902@LD@RxHLToRxHL OP6D, 4, L_Read, L_Write ;; LD L L, 1 Cycles:4
  2377.         lr35902@LD@RxHLToRxHL OP6E, 8, xHL_Read, L_Write ;; LD L xHL, 1 Cycles:8
  2378.         lr35902@LD@RxHLToRxHL OP6F, 4, A_Read, L_Write ;; LD L A, 1 Cycles:4  
  2379.          
  2380.         lr35902@LD@RxHLToRxHL OP70, 8, B_Read, xHL_Write ;; LD xHL B, 1 Cycles:8
  2381.         lr35902@LD@RxHLToRxHL OP71, 8, C_Read, xHL_Write ;; LD xHL C, 1 Cycles:8
  2382.         lr35902@LD@RxHLToRxHL OP72, 8, D_Read, xHL_Write ;; LD xHL D, 1 Cycles:8
  2383.         lr35902@LD@RxHLToRxHL OP73, 8, E_Read, xHL_Write ;; LD xHL E, 1 Cycles:8
  2384.         lr35902@LD@RxHLToRxHL OP74, 8, H_Read, xHL_Write ;; LD xHL H, 1 Cycles:8
  2385.         lr35902@LD@RxHLToRxHL OP75, 8, L_Read, xHL_Write ;; LD xHL L, 1 Cycles:8
  2386.         lr35902@LD@RxHLToRxHL OP02, 8, A_Read, xBC_Write ;; LD xBC A, 1 Cycles:8    
  2387.         lr35902@LD@RxHLToRxHL OP12, 8, A_Read, xDE_Write ;; LD xDE A, 1 Cycles:8    
  2388.         lr35902@LD@RxHLToRxHL OP77, 8, A_Read, xHL_Write ;; LD xHL A, 1 Cycles:8    
  2389.         lr35902@LD@RxHLToRxHL OP22, 8, A_Read, xHL_Write_Inc;; LD xHL++ A, 1 Cycles:8  
  2390.         lr35902@LD@RxHLToRxHL OP32, 8, A_Read, xHL_Write_Dec ;; LD xHL-- A, 1 Cycles:8  
  2391.          
  2392.         lr35902@LD@RxHLToRxHL OP78, 4, B_Read, A_Write ;; LD A B, 1 Cycles:4
  2393.         lr35902@LD@RxHLToRxHL OP79, 4, C_Read, A_Write ;; LD A C, 1 Cycles:4
  2394.         lr35902@LD@RxHLToRxHL OP7A, 4, D_Read, A_Write ;; LD A D, 1 Cycles:4
  2395.         lr35902@LD@RxHLToRxHL OP7B, 4, E_Read, A_Write ;; LD A E, 1 Cycles:4
  2396.         lr35902@LD@RxHLToRxHL OP7C, 4, H_Read, A_Write ;; LD A H, 1 Cycles:4
  2397.         lr35902@LD@RxHLToRxHL OP7D, 4, L_Read, A_Write ;; LD A L, 1 Cycles:4
  2398.         lr35902@LD@RxHLToRxHL OP0A, 8, xBC_Read, A_Write ;; LD A xBC, 1 Cycles:8
  2399.         lr35902@LD@RxHLToRxHL OP1A, 8, xDE_Read, A_Write ;; LD A xDE, 1 Cycles:8
  2400.         lr35902@LD@RxHLToRxHL OP7E, 8, xHL_Read, A_Write ;; LD A xHL, 1 Cycles:8
  2401.         lr35902@LD@RxHLToRxHL OP2A, 8, xHL_Read_Inc, A_Write ;; LD A xHL++, 1 Cycles:8
  2402.         lr35902@LD@RxHLToRxHL OP3A, 8, xHL_Read_Dec, A_Write ;; LD A xHL--, 1 Cycles:8
  2403.         lr35902@LD@RxHLToRxHL OP7F, 4, A_Read, A_Write ;; LD A A, 1 Cycles:4      
  2404.   ;; MISC LD
  2405.         lr35902@LD@RxHLToRxHL OP08,20, Imm16_Read, xImm16_WriteRegSP ;; LD (Imm16) SP, 3 Cycles:20
  2406.         lr35902@LD@RxHLToRxHL OPEA,16, Imm16_Read, xImm16_WriteRegA ;; LD (Imm16) A, 3 Cycles:16
  2407.         lr35902@LD@RxHLToRxHL OPE0,12, Imm8Read_ExpandAddress16, xImm16_WriteRegA ;; LD (Imm8+0FF00h) A, 2 Cycles:12
  2408.         lr35902@LD@RxHLToRxHL OPE2, 8, C_ExpandAddress16, xImm16_WriteRegA ;; LD (C+0FF00h) A, 2 Cycles:8  
  2409.         lr35902@LD@RxHLToRxHL OPF0,12, Imm8Read_ExpandAddress16_Fetch, A_Write ;; LD A, (Imm8+0FF00h)  2 Cycles:12
  2410.         lr35902@LD@RxHLToRxHL OPF2, 8, C_ExpandAddress16_Fetch, A_Write ;; LD A, (C+0FF00h) 2 Cycles:8    
  2411.         lr35902@LD@RxHLToRxHL OPFA,16, Imm16Read_Address_Fetch, A_Write ;; LD A, (Imm16) 3 Cycles:16
  2412.         lr35902@LD@RxHLToRxHL OPF9, 8, HL_Read, SP_Write ;; LD SP HL 1 Cycles:8
  2413.        
  2414.         lr35902@MainALU  OP80, 4, B_Read, Add_, EmptyMacro ;; ADD A, B  1 Cycles:4
  2415.         lr35902@MainALU  OP81, 4, C_Read, Add_, EmptyMacro ;; ADD A, C  1 Cycles:4    
  2416.         lr35902@MainALU  OP82, 4, D_Read, Add_, EmptyMacro ;; ADD A, D  1 Cycles:4
  2417.         lr35902@MainALU  OP83, 4, E_Read, Add_, EmptyMacro ;; ADD A, E  1 Cycles:4      
  2418.         lr35902@MainALU  OP84, 4, H_Read, Add_, EmptyMacro ;; ADD A, H  1 Cycles:4
  2419.         lr35902@MainALU  OP85, 4, L_Read, Add_, EmptyMacro ;; ADD A, L  1 Cycles:4    
  2420.         lr35902@MainALU  OP86, 8, xHL_Read, Add_, EmptyMacro ;; ADD A, xHL  1 Cycles:8
  2421.         lr35902@MainALU  OP87, 4, A_Read, Add_, EmptyMacro ;; ADD A, A  1 Cycles:4  
  2422.         lr35902@MainALU  OPC6, 8, Imm8_Read, Add_, EmptyMacro ;; ADD A, Imm8  2 Cycles:8
  2423.         lr35902@MainALU  OP09, 8, BC_Read, AddWord_, HL_Write ;; ADD HL, BC  1 Cycles:8    
  2424.         lr35902@MainALU  OP19, 8, DE_Read, AddWord_, HL_Write ;; ADD HL, DE  1 Cycles:8    
  2425.         lr35902@MainALU  OP29, 8, HL_Read, AddWord_, HL_Write ;; ADD HL, HL  1 Cycles:8    
  2426.         lr35902@MainALU  OP39, 8, SP_Read, AddWord_, HL_Write ;; ADD HL, SP  1 Cycles:8    
  2427.         lr35902@MainALU  OPE8,16, Imm8_ExpandSignWord, AddWord2_, EmptyMacro ;; ADD SP, SignImm8  2 Cycles:16
  2428.        
  2429.         lr35902@MainALU  OP88, 4, B_Read, Adc_, EmptyMacro ;; ADC A, B  1 Cycles:4
  2430.         lr35902@MainALU  OP89, 4, C_Read, Adc_, EmptyMacro ;; ADC A, C  1 Cycles:4    
  2431.         lr35902@MainALU  OP8A, 4, D_Read, Adc_, EmptyMacro ;; ADC A, D  1 Cycles:4
  2432.         lr35902@MainALU  OP8B, 4, E_Read, Adc_, EmptyMacro ;; ADC A, E  1 Cycles:4      
  2433.         lr35902@MainALU  OP8C, 4, H_Read, Adc_, EmptyMacro ;; ADC A, H  1 Cycles:4
  2434.         lr35902@MainALU  OP8D, 4, L_Read, Adc_, EmptyMacro ;; ADC A, L  1 Cycles:4    
  2435.         lr35902@MainALU  OP8E, 8, xHL_Read, Adc_, EmptyMacro ;; ADC A, xHL  1 Cycles:8
  2436.         lr35902@MainALU  OP8F, 4, A_Read, Adc_, EmptyMacro ;; ADC A, A  1 Cycles:4  
  2437.         lr35902@MainALU  OPCE, 8, Imm8_Read, Adc_, EmptyMacro ;; ADC A, Imm8  2 Cycles:8    
  2438.        
  2439.         lr35902@MainALU  OP03, 8, BC_Read, IncWord_, BC_Write ;; INC BC  Cycles:8
  2440.         lr35902@MainALU  OP13, 8, DE_Read, IncWord_, DE_Write ;; INC DE  Cycles:8
  2441.         lr35902@MainALU  OP23, 8, HL_Read, IncWord_, HL_Write ;; INC HL  Cycles:8
  2442.         lr35902@MainALU  OP33, 8, SP_Read, IncWord_, SP_Write ;; INC SP  Cycles:8
  2443.        
  2444.         lr35902@MainALU  OP04, 4, B_Read, Inc_, B_Write ;; INC B  1 Cycles:4
  2445.         lr35902@MainALU  OP14, 4, D_Read, Inc_, D_Write ;; INC D  1 Cycles:4    
  2446.         lr35902@MainALU  OP24, 4, H_Read, Inc_, H_Write ;; INC H  1 Cycles:4
  2447.         lr35902@MainALU  OP34, 4, xHL_Read, Inc_, xHL_Write ;; INC xHL  1 Cycles:4      
  2448.         lr35902@MainALU  OP0C, 4, C_Read, Inc_, C_Write ;; INC C  1 Cycles:4
  2449.         lr35902@MainALU  OP1C, 4, E_Read, Inc_, E_Write ;; INC E  1 Cycles:4    
  2450.         lr35902@MainALU  OP2C,12, L_Read, Inc_, L_Write ;; INC L  1 Cycles:12
  2451.         lr35902@MainALU  OP3C, 4, A_Read, Inc_, A_Write ;; INC A  1 Cycles:4      
  2452.        
  2453.         lr35902@MainALU  OP90, 4, B_Read, Sub_, EmptyMacro ;; SUB A, B  1 Cycles:4
  2454.         lr35902@MainALU  OP91, 4, C_Read, Sub_, EmptyMacro ;; SUB A, C  1 Cycles:4    
  2455.         lr35902@MainALU  OP92, 4, D_Read, Sub_, EmptyMacro ;; SUB A, D  1 Cycles:4
  2456.         lr35902@MainALU  OP93, 4, E_Read, Sub_, EmptyMacro ;; SUB A, E  1 Cycles:4      
  2457.         lr35902@MainALU  OP94, 4, H_Read, Sub_, EmptyMacro ;; SUB A, H  1 Cycles:4
  2458.         lr35902@MainALU  OP95, 4, L_Read, Sub_, EmptyMacro ;; SUB A, L  1 Cycles:4    
  2459.         lr35902@MainALU  OP96, 8, xHL_Read, Sub_, EmptyMacro ;; SUB A, xHL  1 Cycles:8
  2460.         lr35902@MainALU  OP97, 4, A_Read, Sub_, EmptyMacro ;; SUB A, A  1 Cycles:4  
  2461.         lr35902@MainALU  OPD6, 8, Imm8_Read, Sub_, EmptyMacro ;; SUB A, Imm8  2 Cycles:8
  2462.        
  2463.         lr35902@MainALU  OP98, 4, B_Read, Sbc_, EmptyMacro ;; SBC A, B  1 Cycles:4
  2464.         lr35902@MainALU  OP99, 4, C_Read, Sbc_, EmptyMacro ;; SBC A, C  1 Cycles:4    
  2465.         lr35902@MainALU  OP9A, 4, D_Read, Sbc_, EmptyMacro ;; SBC A, D  1 Cycles:4
  2466.         lr35902@MainALU  OP9B, 4, E_Read, Sbc_, EmptyMacro ;; SBC A, E  1 Cycles:4      
  2467.         lr35902@MainALU  OP9C, 4, H_Read, Sbc_, EmptyMacro ;; SBC A, H  1 Cycles:4
  2468.         lr35902@MainALU  OP9D, 4, L_Read, Sbc_, EmptyMacro ;; SBC A, L  1 Cycles:4    
  2469.         lr35902@MainALU  OP9E, 8, xHL_Read, Sbc_, EmptyMacro ;; SBC A, xHL  1 Cycles:8
  2470.         lr35902@MainALU  OP9F, 4, A_Read, Sbc_, EmptyMacro ;; SBC A, A  1 Cycles:4  
  2471.         lr35902@MainALU  OPDE, 8, Imm8_Read, Sbc_, EmptyMacro ;; SBC A, Imm8  2 Cycles:8
  2472.      
  2473.         lr35902@MainALU  OP0B, 8, BC_Read, DecWord_, BC_Write ;; DEC BC  Cycles:8
  2474.         lr35902@MainALU  OP1B, 8, DE_Read, DecWord_, DE_Write ;; DEC DE  Cycles:8
  2475.         lr35902@MainALU  OP2B, 8, HL_Read, DecWord_, HL_Write ;; DEC HL  Cycles:8
  2476.         lr35902@MainALU  OP3B, 8, SP_Read, DecWord_, SP_Write ;; DEC SP  Cycles:8
  2477.        
  2478.         lr35902@MainALU  OP05, 4, B_Read, Dec_, B_Write ;; DEC B  1 Cycles:4
  2479.         lr35902@MainALU  OP15, 4, D_Read, Dec_, D_Write ;; DEC D  1 Cycles:4    
  2480.         lr35902@MainALU  OP25, 4, H_Read, Dec_, H_Write ;; DEC H  1 Cycles:4
  2481.         lr35902@MainALU  OP35, 4, xHL_Read, Dec_, xHL_Write ;; DEC xHL  1 Cycles:4      
  2482.         lr35902@MainALU  OP0D, 4, C_Read, Dec_, C_Write ;; DEC C  1 Cycles:4
  2483.         lr35902@MainALU  OP1D, 4, E_Read, Dec_, E_Write ;; DEC E  1 Cycles:4    
  2484.         lr35902@MainALU  OP2D,12, L_Read, Dec_, L_Write ;; DEC L  1 Cycles:12
  2485.         lr35902@MainALU  OP3D, 4, A_Read, Dec_, A_Write ;; DEC A  1 Cycles:4  
  2486.        
  2487.         lr35902@MainALU  OPA0, 4, B_Read, And_, EmptyMacro ;; AND A, B  1 Cycles:4
  2488.         lr35902@MainALU  OPA1, 4, C_Read, And_, EmptyMacro ;; AND A, C  1 Cycles:4    
  2489.         lr35902@MainALU  OPA2, 4, D_Read, And_, EmptyMacro ;; AND A, D  1 Cycles:4
  2490.         lr35902@MainALU  OPA3, 4, E_Read, And_, EmptyMacro ;; AND A, E  1 Cycles:4      
  2491.         lr35902@MainALU  OPA4, 4, H_Read, And_, EmptyMacro ;; AND A, H  1 Cycles:4
  2492.         lr35902@MainALU  OPA5, 4, L_Read, And_, EmptyMacro ;; AND A, L  1 Cycles:4    
  2493.         lr35902@MainALU  OPA6, 8, xHL_Read, And_, EmptyMacro ;; AND A, xHL  1 Cycles:8
  2494.         lr35902@MainALU  OPA7, 4, A_Read, And_, EmptyMacro ;; AND A, A  1 Cycles:4  
  2495.         lr35902@MainALU  OPE6, 8, Imm8_Read, And_, EmptyMacro ;; AND A, Imm8  2 Cycles:8
  2496.          
  2497.         lr35902@MainALU  OPA8, 4, B_Read, Xor_, EmptyMacro ;; XOR A, B  1 Cycles:4
  2498.         lr35902@MainALU  OPA9, 4, C_Read, Xor_, EmptyMacro ;; XOR A, C  1 Cycles:4    
  2499.         lr35902@MainALU  OPAA, 4, D_Read, Xor_, EmptyMacro ;; XOR A, D  1 Cycles:4
  2500.         lr35902@MainALU  OPAB, 4, E_Read, Xor_, EmptyMacro ;; XOR A, E  1 Cycles:4      
  2501.         lr35902@MainALU  OPAC, 4, H_Read, Xor_, EmptyMacro ;; XOR A, H  1 Cycles:4
  2502.         lr35902@MainALU  OPAD, 4, L_Read, Xor_, EmptyMacro ;; XOR A, L  1 Cycles:4    
  2503.         lr35902@MainALU  OPAE, 8, xHL_Read, Xor_, EmptyMacro ;; XOR A, xHL  1 Cycles:8
  2504.         lr35902@MainALU  OPAF, 4, A_Read, Xor_, EmptyMacro ;; XOR A, A  1 Cycles:4  
  2505.         lr35902@MainALU  OPEE, 8, Imm8_Read, Xor_, EmptyMacro ;; XOR A, Imm8  2 Cycles:8
  2506.        
  2507.         lr35902@MainALU  OPB0, 4, B_Read, Or_, EmptyMacro ;; OR A, B  1 Cycles:4
  2508.         lr35902@MainALU  OPB1, 4, C_Read, Or_, EmptyMacro ;; OR A, C  1 Cycles:4    
  2509.         lr35902@MainALU  OPB2, 4, D_Read, Or_, EmptyMacro ;; OR A, D  1 Cycles:4
  2510.         lr35902@MainALU  OPB3, 4, E_Read, Or_, EmptyMacro ;; OR A, E  1 Cycles:4      
  2511.         lr35902@MainALU  OPB4, 4, H_Read, Or_, EmptyMacro ;; OR A, H  1 Cycles:4
  2512.         lr35902@MainALU  OPB5, 4, L_Read, Or_, EmptyMacro ;; OR A, L  1 Cycles:4    
  2513.         lr35902@MainALU  OPB6, 8, xHL_Read, Or_, EmptyMacro ;; OR A, xHL  1 Cycles:8
  2514.         lr35902@MainALU  OPB7, 4, A_Read, Or_, EmptyMacro ;; OR A, A  1 Cycles:4  
  2515.         lr35902@MainALU  OPF6, 8, Imm8_Read, Or_, EmptyMacro ;; OR A, Imm8  2 Cycles:8
  2516.        
  2517.         lr35902@MainALU  OPB8, 4, B_Read, Cmp_, EmptyMacro ;; CP A, B  1 Cycles:4
  2518.         lr35902@MainALU  OPB9, 4, C_Read, Cmp_, EmptyMacro ;; CP A, C  1 Cycles:4    
  2519.         lr35902@MainALU  OPBA, 4, D_Read, Cmp_, EmptyMacro ;; CP A, D  1 Cycles:4
  2520.         lr35902@MainALU  OPBB, 4, E_Read, Cmp_, EmptyMacro ;; CP A, E  1 Cycles:4      
  2521.         lr35902@MainALU  OPBC, 4, H_Read, Cmp_, EmptyMacro ;; CP A, H  1 Cycles:4
  2522.         lr35902@MainALU  OPBD, 4, L_Read, Cmp_, EmptyMacro ;; CP A, L  1 Cycles:4    
  2523.         lr35902@MainALU  OPBE, 8, xHL_Read, Cmp_, EmptyMacro ;; CP A, xHL  1 Cycles:8
  2524.         lr35902@MainALU  OPBF, 4, A_Read, Cmp_, EmptyMacro ;; CP A, A  1 Cycles:4  
  2525.         lr35902@MainALU  OPFE, 8, Imm8_Read, Cmp_, EmptyMacro ;; CP A, Imm8  2 Cycles:8
  2526.  
  2527.         lr35902@MainStack  OPC1,12, OP_PopWord, EmptyMacro, BC_Write ;; POP BC  1 Cycles:12
  2528.         lr35902@MainStack  OPD1,12, OP_PopWord, EmptyMacro, DE_Write ;; POP DE  1 Cycles:12    
  2529.         lr35902@MainStack  OPE1,12, OP_PopWord, EmptyMacro, HL_Write ;; POP HL  1 Cycles:12
  2530.         lr35902@MainStack  OPF1,12, OP_PopWord, AF_StackPopStuff, AF_Write ;; POP AF  1 Cycles:12  
  2531.        
  2532.         lr35902@MainStack  OPC5,16, BC_Read, EmptyMacro, OP_PushWord ;; PUSH BC  1 Cycles:16
  2533.         lr35902@MainStack  OPD5,16, DE_Read, EmptyMacro, OP_PushWord ;; PUSH DE  1 Cycles:16    
  2534.         lr35902@MainStack  OPE5,16, HL_Read, EmptyMacro, OP_PushWord ;; PUSH HL  1 Cycles:16
  2535.         lr35902@MainStack  OPF5,16, AF_Read, AF_StackPushStuff, OP_PushWord ;; PUSH AF  1 Cycles:16  
  2536.    
  2537.         lr35902@JP  OPC2,Z_FLAG, Z_FLAG ;; JP NZ
  2538.         lr35902@JP  OPD2,C_FLAG, C_FLAG ;; JP NC
  2539.         lr35902@JP  OPCA,Z_FLAG, 0 ;; JP Z
  2540.         lr35902@JP  OPDA,C_FLAG, 0 ;; JP C  
  2541.         lr35902@JP  OPC3,0, 1 ;; JP A16    
  2542.        
  2543.         lr35902@Rst  OPC7, 000H ;; RST 00H  1 Cycles:16
  2544.         lr35902@Rst  OPD7, 010H ;; RST 10H  1 Cycles:16    
  2545.         lr35902@Rst  OPE7, 020H ;; RST 20H  1 Cycles:16
  2546.         lr35902@Rst  OPF7, 030H ;; RST 30H  1 Cycles:16  
  2547.         lr35902@Rst  OPCF, 008H ;; RST 08H  1 Cycles:16
  2548.         lr35902@Rst  OPDF, 018H ;; RST 18H  1 Cycles:16    
  2549.         lr35902@Rst  OPEF, 028H ;; RST 28H  1 Cycles:16
  2550.         lr35902@Rst  OPFF, 038H ;; RST 38H  1 Cycles:16    
  2551.        
  2552.         lr35902@CALL  OPC4,Z_FLAG, Z_FLAG ;; CALL NZ
  2553.         lr35902@CALL  OPD4,C_FLAG, C_FLAG ;; CALL NC
  2554.         lr35902@CALL  OPCC,Z_FLAG, 0 ;; CALL Z
  2555.         lr35902@CALL  OPDC,C_FLAG, 0 ;; CALL C  
  2556.         lr35902@CALL  OPCD,0, 1 ;; CALL  
  2557.      
  2558.         lr35902@JR  OP20,Z_FLAG, Z_FLAG ;; JR NZ
  2559.         lr35902@JR  OP30,C_FLAG, C_FLAG ;; JR NC
  2560.         lr35902@JR  OP28,Z_FLAG, 0 ;; JR Z
  2561.         lr35902@JR  OP38,C_FLAG, 0 ;; JR C  
  2562.         lr35902@JR  OP18,0, 1 ;; JR R8  
  2563.  
  2564.         lr35902@RET  OPC0,Z_FLAG, Z_FLAG, 20 ;; RET NZ
  2565.         lr35902@RET  OPD0,C_FLAG, C_FLAG, 20 ;; RET NC
  2566.         lr35902@RET  OPC8,Z_FLAG, 0, 20 ;; RET Z
  2567.         lr35902@RET  OPD8,C_FLAG, 0, 20 ;; RET C  
  2568.         lr35902@RET  OPC9,0, 1, 16 ;; RET  
  2569.         lr35902@RETI OPD9,0, 1, 16 ;; RETI
  2570. ;;  MISC
  2571.       OPF8: ;; -------------------------------------------  LD HL SP+Imm8(sign8) 2 Cycles:12
  2572.         Imm8_Read
  2573.         ;; ext sign
  2574.         movsx eax, al
  2575.         movzx ecx, word[YG_GP+lr35902.SP]
  2576.         and eax, 0xFFFF
  2577.         lea edx, [ecx+eax]
  2578.         mov [YG_GP+lr35902.HL], dx ;; write back HL
  2579.         xor ecx, eax
  2580.         xor ecx, edx
  2581.         and cx, 0x0110 ;; C|H
  2582.         mov YG_PF_8, ch
  2583.         shl YG_PF_8, 4
  2584.         shl cl, 1
  2585.         or YG_PF_8, cl
  2586.         and YG_PF, (H_FLAG| C_FLAG)
  2587.         SetCyclesRetP 12
  2588.       OP76:   ; Halt,  not backup PC in my source code ^_^
  2589.         mov dword [YG_GP+lr35902.halt], 1
  2590.         SetCyclesAndRet 4    
  2591.       OP10:   ; Stop, Check CGB speed mode
  2592.         movzx eax, byte [YG_GP+lr35902.key1]
  2593.         test eax, 1
  2594.         je Stop_Skip
  2595.         xor eax, 0x80 ;; switch to "other" speed
  2596.         and eax, 0xFE ;; reset LSB  see gb-programming-manual.pdf::2.6.2 CPU Operating Speed
  2597.                       ;; for simplicity, I will not simulate the huge waste of time brought by handover.
  2598.         mov [YG_GP+lr35902.key1], al
  2599.         add YG_PC, 1 ;; skip one byte (should is 00)      
  2600.         SetCyclesAndRet 0x80000004
  2601.      Stop_Skip:
  2602.         mov dword [YG_GP+lr35902.stop], 1
  2603.         add YG_PC, 1 ;; skip one byte (should is 00)    
  2604.         SetCyclesAndRet 4        
  2605.       OPF3:   ; DI
  2606.         mov byte [YG_GP+lr35902.IME], 0
  2607.         SetCyclesAndRet 4
  2608.       OPFB:   ; EI
  2609.         mov byte [YG_GP+lr35902.IME], 1
  2610.         SetCyclesAndRet 4  
  2611.       OP07:   ; RLCA
  2612.         rol byte [YG_GP+lr35902.A], 1
  2613.         setc YG_PF_8
  2614.         shl YG_PF_8, 4
  2615.         SetCyclesRetP 4
  2616.       OP17:   ; RLA
  2617.         shr YG_PF_8, 5
  2618.         rcl byte [YG_GP+lr35902.A], 1
  2619.         setc YG_PF_8
  2620.         shl YG_PF_8, 4
  2621.         SetCyclesRetP 4    
  2622.       OP0F:   ; RRCA
  2623.         ror byte [YG_GP+lr35902.A], 1
  2624.         setc YG_PF_8
  2625.         shl YG_PF_8, 4
  2626.         SetCyclesRetP 4
  2627.       OP1F:   ; RRA
  2628.         shr YG_PF_8, 5
  2629.         rcr byte [YG_GP+lr35902.A], 1
  2630.         setc YG_PF_8  
  2631.         shl YG_PF_8, 4
  2632.         SetCyclesRetP 4
  2633.       OP27:   ; BCD Adjust  
  2634.         movzx eax, byte [YG_GP+lr35902.A]
  2635.         test YG_PF_8, N_FLAG
  2636.         jne DAS_Proc
  2637.         ;;  DAA.
  2638.         ;;  Check DAA-low
  2639.         test YG_PF, H_FLAG
  2640.         jne DAA_Low
  2641.         mov ecx, eax
  2642.         and ecx, 0x0F
  2643.         cmp ecx, 9
  2644.         jbe DAA_LowSkip
  2645.         DAA_Low:
  2646.           add eax, 6
  2647.           DAA_LowSkip:
  2648.             ;; Check DAA-High
  2649.             test YG_PF, C_FLAG
  2650.             jne DAA_High
  2651.             mov ecx, eax  
  2652.             cmp ecx, 0x9F
  2653.             jbe DAA_HighSkip
  2654.             DAA_High:
  2655.               add eax, 0x60
  2656.               DAA_HighSkip:
  2657.                 ;; Check Z, C
  2658.                 and YG_PF, C_FLAG
  2659.                 mov ecx, eax
  2660.                 and ecx, 0x100
  2661.                 shl ecx, 4
  2662.                 or YG_PF_8, ch
  2663.                 test al, al
  2664.                 setz cl
  2665.                 shl cl, 7
  2666.                 or YG_PF_8, cl ;; z_flag done
  2667.                 mov [YG_GP+lr35902.A], al
  2668.                 SetCyclesRetP 4      
  2669.     DAS_Proc:
  2670.         ;;  DAS
  2671.         ;;  Check DAS-low
  2672.         test YG_PF, H_FLAG
  2673.         je DAS_LowSkip
  2674.         sub eax, 6
  2675.         and eax, 0xFF
  2676.           DAS_LowSkip:
  2677.             ;; Check DAS-High
  2678.             test YG_PF, C_FLAG
  2679.             je DAS_HighSkip
  2680.             sub eax, 0x60
  2681.               DAS_HighSkip:
  2682.                 ;; Check Z, C
  2683.                 and YG_PF, C_FLAG
  2684.                 mov ecx, eax
  2685.                 and ecx, 0x100
  2686.                 shl ecx, 4
  2687.                 or YG_PF_8, ch
  2688.                 test al, al
  2689.                 setz cl
  2690.                 shl cl, 7
  2691.                 or YG_PF_8, cl ;; z_flag done
  2692.                 or YG_PF_8, N_FLAG ;; n_flag done
  2693.                 mov [YG_GP+lr35902.A], al
  2694.                 SetCyclesRetP 4              
  2695.       OP37:   ; SCF
  2696.         and YG_PF, Z_FLAG
  2697.         or YG_PF, C_FLAG  
  2698.         SetCyclesRetP 4    
  2699.       OP2F:   ; CPL  
  2700.         not byte [YG_GP+lr35902.A]
  2701.         or YG_PF, N_FLAG
  2702.         or YG_PF, H_FLAG
  2703.         SetCyclesRetP 4  
  2704.       OP3F:   ; CCF
  2705.         and YG_PF, (Z_FLAG |C_FLAG)
  2706.         xor YG_PF, C_FLAG  
  2707.         SetCyclesRetP 4  
  2708.       OPE9:
  2709.         mov si, [YG_GP+lr35902.HL]
  2710.         SetCyclesAndRet 4    
  2711.       OPCB: ;; DD Perfix(BITS) for Z80/lr35902
  2712.         Imm8_Read
  2713.         and eax, 255
  2714.         jmp dword [CBTAB+eax*4]
  2715.         ;; --------------------------------------------------------------
  2716.         ;; --------------------------------------------------------------
  2717.         ;; --------------------------------------------------------------
  2718.         ;; --------------------------------------------------------------
  2719.         ;; --------------------------------------------------------------
  2720.         ;; Bit Opcode DOne
  2721.         ;; --------------------------------------------------------------
  2722.             lr35902@MainALUExt  CB00, 8, B_Read, RLC_, B_Write      ;; RLC B 2 Cycles:8
  2723.             lr35902@MainALUExt  CB01, 8, C_Read, RLC_, C_Write      ;; RLC C 2 Cycles:8
  2724.             lr35902@MainALUExt  CB02, 8, D_Read, RLC_, D_Write      ;; RLC D 2 Cycles:8
  2725.             lr35902@MainALUExt  CB03, 8, E_Read, RLC_, E_Write      ;; RLC E 2 Cycles:8    
  2726.             lr35902@MainALUExt  CB04, 8, H_Read, RLC_, H_Write      ;; RLC H 2 Cycles:8
  2727.             lr35902@MainALUExt  CB05, 8, L_Read, RLC_, L_Write      ;; RLC L 2 Cycles:8        
  2728.             lr35902@MainALUExt  CB06,16, xHL_Read, RLC_, xHL_Write      ;; RLC xHL 2 Cycles:16
  2729.             lr35902@MainALUExt  CB07, 8, A_Read, RLC_, A_Write      ;; RLC A 2 Cycles:8        
  2730.            
  2731.             lr35902@MainALUExt  CB08, 8, B_Read, RRC_, B_Write      ;; RRC B 2 Cycles:8
  2732.             lr35902@MainALUExt  CB09, 8, C_Read, RRC_, C_Write      ;; RRC C 2 Cycles:8
  2733.             lr35902@MainALUExt  CB0A, 8, D_Read, RRC_, D_Write      ;; RRC D 2 Cycles:8
  2734.             lr35902@MainALUExt  CB0B, 8, E_Read, RRC_, E_Write      ;; RRC E 2 Cycles:8    
  2735.             lr35902@MainALUExt  CB0C, 8, H_Read, RRC_, H_Write      ;; RRC H 2 Cycles:8
  2736.             lr35902@MainALUExt  CB0D, 8, L_Read, RRC_, L_Write      ;; RRC L 2 Cycles:8        
  2737.             lr35902@MainALUExt  CB0E,16, xHL_Read, RRC_, xHL_Write      ;; RRC xHL 2 Cycles:16
  2738.             lr35902@MainALUExt  CB0F, 8, A_Read, RRC_, A_Write      ;; RRC A 2 Cycles:8    
  2739.            
  2740.             lr35902@MainALUExt  CB10, 8, B_Read, RL_, B_Write      ;; RL B 2 Cycles:8
  2741.             lr35902@MainALUExt  CB11, 8, C_Read, RL_, C_Write      ;; RL C 2 Cycles:8
  2742.             lr35902@MainALUExt  CB12, 8, D_Read, RL_, D_Write      ;; RL D 2 Cycles:8
  2743.             lr35902@MainALUExt  CB13, 8, E_Read, RL_, E_Write      ;; RL E 2 Cycles:8    
  2744.             lr35902@MainALUExt  CB14, 8, H_Read, RL_, H_Write      ;; RL H 2 Cycles:8
  2745.             lr35902@MainALUExt  CB15, 8, L_Read, RL_, L_Write      ;; RL L 2 Cycles:8        
  2746.             lr35902@MainALUExt  CB16,16, xHL_Read, RL_, xHL_Write      ;; RL xHL 2 Cycles:16
  2747.             lr35902@MainALUExt  CB17, 8, A_Read, RL_, A_Write      ;; RL A 2 Cycles:8        
  2748.            
  2749.             lr35902@MainALUExt  CB18, 8, B_Read, RR_, B_Write      ;; RR B 2 Cycles:8
  2750.             lr35902@MainALUExt  CB19, 8, C_Read, RR_, C_Write      ;; RR C 2 Cycles:8
  2751.             lr35902@MainALUExt  CB1A, 8, D_Read, RR_, D_Write      ;; RR D 2 Cycles:8
  2752.             lr35902@MainALUExt  CB1B, 8, E_Read, RR_, E_Write      ;; RR E 2 Cycles:8    
  2753.             lr35902@MainALUExt  CB1C, 8, H_Read, RR_, H_Write      ;; RR H 2 Cycles:8
  2754.             lr35902@MainALUExt  CB1D, 8, L_Read, RR_, L_Write      ;; RR L 2 Cycles:8        
  2755.             lr35902@MainALUExt  CB1E,16, xHL_Read, RR_, xHL_Write      ;; RR xHL 2 Cycles:16
  2756.             lr35902@MainALUExt  CB1F, 8, A_Read, RR_, A_Write      ;; RR A 2 Cycles:8            
  2757.            
  2758.             lr35902@MainALUExt  CB20, 8, B_Read, RL_N_, B_Write      ;; SLA B 2 Cycles:8
  2759.             lr35902@MainALUExt  CB21, 8, C_Read, RL_N_, C_Write      ;; SLA C 2 Cycles:8
  2760.             lr35902@MainALUExt  CB22, 8, D_Read, RL_N_, D_Write      ;; SLA D 2 Cycles:8
  2761.             lr35902@MainALUExt  CB23, 8, E_Read, RL_N_, E_Write      ;; SLA E 2 Cycles:8    
  2762.             lr35902@MainALUExt  CB24, 8, H_Read, RL_N_, H_Write      ;; SLA H 2 Cycles:8
  2763.             lr35902@MainALUExt  CB25, 8, L_Read, RL_N_, L_Write      ;; SLA L 2 Cycles:8        
  2764.             lr35902@MainALUExt  CB26,16, xHL_Read, RL_N_, xHL_Write      ;; SLA xHL 2 Cycles:16
  2765.             lr35902@MainALUExt  CB27, 8, A_Read, RL_N_, A_Write      ;; SLA A 2 Cycles:8        
  2766.            
  2767.             lr35902@MainALUExt  CB28, 8, B_Read, RRS_N_, B_Write      ;; SRA B 2 Cycles:8
  2768.             lr35902@MainALUExt  CB29, 8, C_Read, RRS_N_, C_Write      ;; SRA C 2 Cycles:8
  2769.             lr35902@MainALUExt  CB2A, 8, D_Read, RRS_N_, D_Write      ;; SRA D 2 Cycles:8
  2770.             lr35902@MainALUExt  CB2B, 8, E_Read, RRS_N_, E_Write      ;; SRA E 2 Cycles:8    
  2771.             lr35902@MainALUExt  CB2C, 8, H_Read, RRS_N_, H_Write      ;; SRA H 2 Cycles:8
  2772.             lr35902@MainALUExt  CB2D, 8, L_Read, RRS_N_, L_Write      ;; SRA L 2 Cycles:8        
  2773.             lr35902@MainALUExt  CB2E,16, xHL_Read, RRS_N_, xHL_Write      ;; SRA xHL 2 Cycles:16
  2774.             lr35902@MainALUExt  CB2F, 8, A_Read, RRS_N_, A_Write      ;; SRA A 2 Cycles:8      
  2775.            
  2776.             lr35902@MainALUExt  CB30, 8, B_Read, SWAP_, B_Write      ;; SWAP B 2 Cycles:8
  2777.             lr35902@MainALUExt  CB31, 8, C_Read, SWAP_, C_Write      ;; SWAP C 2 Cycles:8
  2778.             lr35902@MainALUExt  CB32, 8, D_Read, SWAP_, D_Write      ;; SWAP D 2 Cycles:8
  2779.             lr35902@MainALUExt  CB33, 8, E_Read, SWAP_, E_Write      ;; SWAP E 2 Cycles:8    
  2780.             lr35902@MainALUExt  CB34, 8, H_Read, SWAP_, H_Write      ;; SWAP H 2 Cycles:8
  2781.             lr35902@MainALUExt  CB35, 8, L_Read, SWAP_, L_Write      ;; SWAP L 2 Cycles:8        
  2782.             lr35902@MainALUExt  CB36,16, xHL_Read, SWAP_, xHL_Write      ;; SWAP xHL 2 Cycles:16
  2783.             lr35902@MainALUExt  CB37, 8, A_Read, SWAP_, A_Write      ;; SWAP A 2 Cycles:8        
  2784.            
  2785.             lr35902@MainALUExt  CB38, 8, B_Read, RR_N_, B_Write      ;; SRL B 2 Cycles:8
  2786.             lr35902@MainALUExt  CB39, 8, C_Read, RR_N_, C_Write      ;; SRL C 2 Cycles:8
  2787.             lr35902@MainALUExt  CB3A, 8, D_Read, RR_N_, D_Write      ;; SRL D 2 Cycles:8
  2788.             lr35902@MainALUExt  CB3B, 8, E_Read, RR_N_, E_Write      ;; SRL E 2 Cycles:8    
  2789.             lr35902@MainALUExt  CB3C, 8, H_Read, RR_N_, H_Write      ;; SRL H 2 Cycles:8
  2790.             lr35902@MainALUExt  CB3D, 8, L_Read, RR_N_, L_Write      ;; SRL L 2 Cycles:8        
  2791.             lr35902@MainALUExt  CB3E,16, xHL_Read, RR_N_, xHL_Write      ;; SRL xHL 2 Cycles:16
  2792.             lr35902@MainALUExt  CB3F, 8, A_Read, RR_N_, A_Write      ;; SRL A 2 Cycles:8        
  2793.            
  2794.             lr35902@TestBit CB40, 8,  B_Read, 0 ;; BIT B, 0 Cycles:8
  2795.             lr35902@TestBit CB41, 8,  C_Read, 0 ;; BIT C, 0 Cycles:8        
  2796.             lr35902@TestBit CB42, 8,  D_Read, 0 ;; BIT D, 0 Cycles:8        
  2797.             lr35902@TestBit CB43, 8,  E_Read, 0 ;; BIT E, 0 Cycles:8    
  2798.             lr35902@TestBit CB44, 8,  H_Read, 0 ;; BIT H, 0 Cycles:8
  2799.             lr35902@TestBit CB45, 8,  L_Read, 0 ;; BIT L, 0 Cycles:8        
  2800.             lr35902@TestBit CB46,16,  xHL_Read, 0 ;; BIT xHL, 0 Cycles:16      
  2801.             lr35902@TestBit CB47, 8,  A_Read, 0 ;; BIT A, 0 Cycles:8        
  2802.          
  2803.             lr35902@TestBit CB48, 8,  B_Read, 1 ;; BIT B, 1 Cycles:8
  2804.             lr35902@TestBit CB49, 8,  C_Read, 1 ;; BIT C, 1 Cycles:8        
  2805.             lr35902@TestBit CB4A, 8,  D_Read, 1 ;; BIT D, 1 Cycles:8        
  2806.             lr35902@TestBit CB4B, 8,  E_Read, 1 ;; BIT E, 1 Cycles:8    
  2807.             lr35902@TestBit CB4C, 8,  H_Read, 1 ;; BIT H, 1 Cycles:8
  2808.             lr35902@TestBit CB4D, 8,  L_Read, 1 ;; BIT L, 1 Cycles:8        
  2809.             lr35902@TestBit CB4E,16,  xHL_Read, 1 ;; BIT xHL, 1 Cycles:16      
  2810.             lr35902@TestBit CB4F, 8,  A_Read, 1 ;; BIT A, 1 Cycles:8
  2811.  
  2812.             lr35902@TestBit CB50, 8,  B_Read, 2 ;; BIT B, 2 Cycles:8
  2813.             lr35902@TestBit CB51, 8,  C_Read, 2 ;; BIT C, 2 Cycles:8        
  2814.             lr35902@TestBit CB52, 8,  D_Read, 2 ;; BIT D, 2 Cycles:8        
  2815.             lr35902@TestBit CB53, 8,  E_Read, 2 ;; BIT E, 2 Cycles:8    
  2816.             lr35902@TestBit CB54, 8,  H_Read, 2 ;; BIT H, 2 Cycles:8
  2817.             lr35902@TestBit CB55, 8,  L_Read, 2 ;; BIT L, 2 Cycles:8        
  2818.             lr35902@TestBit CB56,16,  xHL_Read, 2 ;; BIT xHL, 2 Cycles:16      
  2819.             lr35902@TestBit CB57, 8,  A_Read, 2 ;; BIT A, 2 Cycles:8        
  2820.          
  2821.             lr35902@TestBit CB58, 8,  B_Read, 3 ;; BIT B, 3 Cycles:8
  2822.             lr35902@TestBit CB59, 8,  C_Read, 3 ;; BIT C, 3 Cycles:8        
  2823.             lr35902@TestBit CB5A, 8,  D_Read, 3 ;; BIT D, 3 Cycles:8        
  2824.             lr35902@TestBit CB5B, 8,  E_Read, 3 ;; BIT E, 3 Cycles:8    
  2825.             lr35902@TestBit CB5C, 8,  H_Read, 3 ;; BIT H, 3 Cycles:8
  2826.             lr35902@TestBit CB5D, 8,  L_Read, 3 ;; BIT L, 3 Cycles:8        
  2827.             lr35902@TestBit CB5E,16,  xHL_Read, 3 ;; BIT xHL, 3 Cycles:16      
  2828.             lr35902@TestBit CB5F, 8,  A_Read, 3 ;; BIT A, 3 Cycles:8
  2829.  
  2830.             lr35902@TestBit CB60, 8,  B_Read, 4 ;; BIT B, 4 Cycles:8
  2831.             lr35902@TestBit CB61, 8,  C_Read, 4 ;; BIT C, 4 Cycles:8        
  2832.             lr35902@TestBit CB62, 8,  D_Read, 4 ;; BIT D, 4 Cycles:8        
  2833.             lr35902@TestBit CB63, 8,  E_Read, 4 ;; BIT E, 4 Cycles:8    
  2834.             lr35902@TestBit CB64, 8,  H_Read, 4 ;; BIT H, 4 Cycles:8
  2835.             lr35902@TestBit CB65, 8,  L_Read, 4 ;; BIT L, 4 Cycles:8        
  2836.             lr35902@TestBit CB66,16,  xHL_Read, 4 ;; BITxHLD, 4 Cycles:16      
  2837.             lr35902@TestBit CB67, 8,  A_Read, 4 ;; BIT A, 4 Cycles:8        
  2838.          
  2839.             lr35902@TestBit CB68, 8,  B_Read, 5 ;; BIT B, 5 Cycles:8
  2840.             lr35902@TestBit CB69, 8,  C_Read, 5 ;; BIT C, 5 Cycles:8        
  2841.             lr35902@TestBit CB6A, 8,  D_Read, 5 ;; BIT D, 5 Cycles:8        
  2842.             lr35902@TestBit CB6B, 8,  E_Read, 5 ;; BIT E, 5 Cycles:8    
  2843.             lr35902@TestBit CB6C, 8,  H_Read, 5 ;; BIT H, 5 Cycles:8
  2844.             lr35902@TestBit CB6D, 8,  L_Read, 5 ;; BIT L, 5 Cycles:8        
  2845.             lr35902@TestBit CB6E,16,  xHL_Read, 5 ;; BIT xHL, 5 Cycles:16      
  2846.             lr35902@TestBit CB6F, 8,  A_Read, 5 ;; BIT A, 5 Cycles:8
  2847.            
  2848.             lr35902@TestBit CB70, 8,  B_Read, 6 ;; BIT B, 6 Cycles:8
  2849.             lr35902@TestBit CB71, 8,  C_Read, 6 ;; BIT C, 6 Cycles:8        
  2850.             lr35902@TestBit CB72, 8,  D_Read, 6 ;; BIT D, 6 Cycles:8        
  2851.             lr35902@TestBit CB73, 8,  E_Read, 6 ;; BIT E, 6 Cycles:8    
  2852.             lr35902@TestBit CB74, 8,  H_Read, 6 ;; BIT H, 6 Cycles:8
  2853.             lr35902@TestBit CB75, 8,  L_Read, 6 ;; BIT L, 6 Cycles:8        
  2854.             lr35902@TestBit CB76,16,  xHL_Read, 6 ;; BIT xHL, 6 Cycles:16      
  2855.             lr35902@TestBit CB77, 8,  A_Read, 6 ;; BIT A, 6 Cycles:8        
  2856.          
  2857.             lr35902@TestBit CB78, 8,  B_Read, 7 ;; BIT B, 7 Cycles:8
  2858.             lr35902@TestBit CB79, 8,  C_Read, 7 ;; BIT C, 7 Cycles:8        
  2859.             lr35902@TestBit CB7A, 8,  D_Read, 7 ;; BIT D, 7 Cycles:8        
  2860.             lr35902@TestBit CB7B, 8,  E_Read, 7 ;; BIT E, 7 Cycles:8    
  2861.             lr35902@TestBit CB7C, 8,  H_Read, 7 ;; BIT H, 7 Cycles:8
  2862.             lr35902@TestBit CB7D, 8,  L_Read, 7 ;; BIT L, 7 Cycles:8        
  2863.             lr35902@TestBit CB7E,16,  xHL_Read, 7 ;; BIT xHL, 7 Cycles:16      
  2864.             lr35902@TestBit CB7F, 8,  A_Read, 7 ;; BIT A, 7 Cycles:8
  2865.            
  2866.             lr35902@ResBit CB80, 8,  B_Read, 0, B_Write ;; RES B, 0 Cycles:8
  2867.             lr35902@ResBit CB81, 8,  C_Read, 0, C_Write ;; RES C, 0 Cycles:8        
  2868.             lr35902@ResBit CB82, 8,  D_Read, 0, D_Write ;; RES D, 0 Cycles:8        
  2869.             lr35902@ResBit CB83, 8,  E_Read, 0, E_Write ;; RES E, 0 Cycles:8    
  2870.             lr35902@ResBit CB84, 8,  H_Read, 0, H_Write ;; RES H, 0 Cycles:8
  2871.             lr35902@ResBit CB85, 8,  L_Read, 0, L_Write ;; RES L, 0 Cycles:8        
  2872.             lr35902@ResBit CB86,16,  xHL_Read, 0, xHL_Write ;; RES xHL, 0 Cycles:16      
  2873.             lr35902@ResBit CB87, 8,  A_Read, 0, A_Write ;; RES A, 0 Cycles:8        
  2874.          
  2875.             lr35902@ResBit CB88, 8,  B_Read, 1, B_Write ;; RES B, 1 Cycles:8
  2876.             lr35902@ResBit CB89, 8,  C_Read, 1, C_Write ;; RES C, 1 Cycles:8        
  2877.             lr35902@ResBit CB8A, 8,  D_Read, 1, D_Write ;; RES D, 1 Cycles:8        
  2878.             lr35902@ResBit CB8B, 8,  E_Read, 1, E_Write ;; RES E, 1 Cycles:8    
  2879.             lr35902@ResBit CB8C, 8,  H_Read, 1, H_Write ;; RES H, 1 Cycles:8
  2880.             lr35902@ResBit CB8D, 8,  L_Read, 1, L_Write ;; RES L, 1 Cycles:8        
  2881.             lr35902@ResBit CB8E,16,  xHL_Read, 1, xHL_Write ;; RES xHL, 1 Cycles:16      
  2882.             lr35902@ResBit CB8F, 8,  A_Read, 1, A_Write ;; RES A, 1 Cycles:8
  2883.  
  2884.             lr35902@ResBit CB90, 8,  B_Read, 2, B_Write ;; RES B, 2 Cycles:8
  2885.             lr35902@ResBit CB91, 8,  C_Read, 2, C_Write ;; RES C, 2 Cycles:8        
  2886.             lr35902@ResBit CB92, 8,  D_Read, 2, D_Write ;; RES D, 2 Cycles:8        
  2887.             lr35902@ResBit CB93, 8,  E_Read, 2, E_Write ;; RES E, 2 Cycles:8    
  2888.             lr35902@ResBit CB94, 8,  H_Read, 2, H_Write ;; RES H, 2 Cycles:8
  2889.             lr35902@ResBit CB95, 8,  L_Read, 2, L_Write ;; RES L, 2 Cycles:8        
  2890.             lr35902@ResBit CB96,16,  xHL_Read, 2, xHL_Write ;; RES xHL, 2 Cycles:16      
  2891.             lr35902@ResBit CB97, 8,  A_Read, 2, A_Write ;; RES A, 2 Cycles:8        
  2892.          
  2893.             lr35902@ResBit CB98, 8,  B_Read, 3, B_Write ;; RES B, 3 Cycles:8
  2894.             lr35902@ResBit CB99, 8,  C_Read, 3, C_Write ;; RES C, 3 Cycles:8        
  2895.             lr35902@ResBit CB9A, 8,  D_Read, 3, D_Write ;; RES D, 3 Cycles:8        
  2896.             lr35902@ResBit CB9B, 8,  E_Read, 3, E_Write ;; RES E, 3 Cycles:8    
  2897.             lr35902@ResBit CB9C, 8,  H_Read, 3, H_Write ;; RES H, 3 Cycles:8
  2898.             lr35902@ResBit CB9D, 8,  L_Read, 3, L_Write ;; RES L, 3 Cycles:8        
  2899.             lr35902@ResBit CB9E,16,  xHL_Read, 3, xHL_Write ;; RES xHL, 3 Cycles:16      
  2900.             lr35902@ResBit CB9F, 8,  A_Read, 3, A_Write ;; RES A, 3 Cycles:8
  2901.  
  2902.             lr35902@ResBit CBA0, 8,  B_Read, 4, B_Write ;; RES B, 4 Cycles:8
  2903.             lr35902@ResBit CBA1, 8,  C_Read, 4, C_Write ;; RES C, 4 Cycles:8        
  2904.             lr35902@ResBit CBA2, 8,  D_Read, 4, D_Write ;; RES D, 4 Cycles:8        
  2905.             lr35902@ResBit CBA3, 8,  E_Read, 4, E_Write ;; RES E, 4 Cycles:8    
  2906.             lr35902@ResBit CBA4, 8,  H_Read, 4, H_Write ;; RES H, 4 Cycles:8
  2907.             lr35902@ResBit CBA5, 8,  L_Read, 4, L_Write ;; RES L, 4 Cycles:8        
  2908.             lr35902@ResBit CBA6,16,  xHL_Read, 4, xHL_Write ;; RES xHL, 4 Cycles:16      
  2909.             lr35902@ResBit CBA7, 8,  A_Read, 4, A_Write ;; RES A, 4 Cycles:8        
  2910.          
  2911.             lr35902@ResBit CBA8, 8,  B_Read, 5, B_Write ;; RES B, 5 Cycles:8
  2912.             lr35902@ResBit CBA9, 8,  C_Read, 5, C_Write ;; RES C, 5 Cycles:8        
  2913.             lr35902@ResBit CBAA, 8,  D_Read, 5, D_Write ;; RES D, 5 Cycles:8        
  2914.             lr35902@ResBit CBAB, 8,  E_Read, 5, E_Write ;; RES E, 5 Cycles:8    
  2915.             lr35902@ResBit CBAC, 8,  H_Read, 5, H_Write ;; RES H, 5 Cycles:8
  2916.             lr35902@ResBit CBAD, 8,  L_Read, 5, L_Write ;; RES L, 5 Cycles:8        
  2917.             lr35902@ResBit CBAE,16,  xHL_Read, 5, xHL_Write ;; RES xHL, 5 Cycles:16      
  2918.             lr35902@ResBit CBAF, 8,  A_Read, 5, A_Write ;; RES A, 5 Cycles:8
  2919.            
  2920.             lr35902@ResBit CBB0, 8,  B_Read, 6, B_Write ;; RES B, 6 Cycles:8
  2921.             lr35902@ResBit CBB1, 8,  C_Read, 6, C_Write ;; RES C, 6 Cycles:8        
  2922.             lr35902@ResBit CBB2, 8,  D_Read, 6, D_Write ;; RES D, 6 Cycles:8        
  2923.             lr35902@ResBit CBB3, 8,  E_Read, 6, E_Write ;; RES E, 6 Cycles:8    
  2924.             lr35902@ResBit CBB4, 8,  H_Read, 6, H_Write ;; RES H, 6 Cycles:8
  2925.             lr35902@ResBit CBB5, 8,  L_Read, 6, L_Write ;; RES L, 6 Cycles:8        
  2926.             lr35902@ResBit CBB6,16,  xHL_Read, 6, xHL_Write ;; RES xHL, 6 Cycles:16      
  2927.             lr35902@ResBit CBB7, 8,  A_Read, 6, A_Write ;; RES A, 6 Cycles:8        
  2928.          
  2929.             lr35902@ResBit CBB8, 8,  B_Read, 7, B_Write ;; RES B, 7 Cycles:8
  2930.             lr35902@ResBit CBB9, 8,  C_Read, 7, C_Write ;; RES C, 7 Cycles:8        
  2931.             lr35902@ResBit CBBA, 8,  D_Read, 7, D_Write ;; RES D, 7 Cycles:8        
  2932.             lr35902@ResBit CBBB, 8,  E_Read, 7, E_Write ;; RES E, 7 Cycles:8    
  2933.             lr35902@ResBit CBBC, 8,  H_Read, 7, H_Write ;; RES H, 7 Cycles:8
  2934.             lr35902@ResBit CBBD, 8,  L_Read, 7, L_Write ;; RES L, 7 Cycles:8        
  2935.             lr35902@ResBit CBBE,16,  xHL_Read, 7, xHL_Write ;; RES xHL, 7 Cycles:16      
  2936.             lr35902@ResBit CBBF, 8,  A_Read, 7, A_Write ;; RES A, 7 Cycles:8
  2937.  
  2938.             lr35902@SetBit CBC0, 8,  B_Read, 0, B_Write ;; SET B, 0 Cycles:8
  2939.             lr35902@SetBit CBC1, 8,  C_Read, 0, C_Write ;; SET C, 0 Cycles:8        
  2940.             lr35902@SetBit CBC2, 8,  D_Read, 0, D_Write ;; SET D, 0 Cycles:8        
  2941.             lr35902@SetBit CBC3, 8,  E_Read, 0, E_Write ;; SET E, 0 Cycles:8    
  2942.             lr35902@SetBit CBC4, 8,  H_Read, 0, H_Write ;; SET H, 0 Cycles:8
  2943.             lr35902@SetBit CBC5, 8,  L_Read, 0, L_Write ;; SET L, 0 Cycles:8        
  2944.             lr35902@SetBit CBC6,16,  xHL_Read, 0, xHL_Write ;; SET xHL, 0 Cycles:16      
  2945.             lr35902@SetBit CBC7, 8,  A_Read, 0, A_Write ;; SET A, 0 Cycles:8        
  2946.          
  2947.             lr35902@SetBit CBC8, 8,  B_Read, 1, B_Write ;; SET B, 1 Cycles:8
  2948.             lr35902@SetBit CBC9, 8,  C_Read, 1, C_Write ;; SET C, 1 Cycles:8        
  2949.             lr35902@SetBit CBCA, 8,  D_Read, 1, D_Write ;; SET D, 1 Cycles:8        
  2950.             lr35902@SetBit CBCB, 8,  E_Read, 1, E_Write ;; SET E, 1 Cycles:8    
  2951.             lr35902@SetBit CBCC, 8,  H_Read, 1, H_Write ;; SET H, 1 Cycles:8
  2952.             lr35902@SetBit CBCD, 8,  L_Read, 1, L_Write ;; SET L, 1 Cycles:8        
  2953.             lr35902@SetBit CBCE,16,  xHL_Read, 1, xHL_Write ;; SET xHL, 1 Cycles:16      
  2954.             lr35902@SetBit CBCF, 8,  A_Read, 1, A_Write ;; SET A, 1 Cycles:8
  2955.  
  2956.             lr35902@SetBit CBD0, 8,  B_Read, 2, B_Write ;; SET B, 2 Cycles:8
  2957.             lr35902@SetBit CBD1, 8,  C_Read, 2, C_Write ;; SET C, 2 Cycles:8        
  2958.             lr35902@SetBit CBD2, 8,  D_Read, 2, D_Write ;; SET D, 2 Cycles:8        
  2959.             lr35902@SetBit CBD3, 8,  E_Read, 2, E_Write ;; SET E, 2 Cycles:8    
  2960.             lr35902@SetBit CBD4, 8,  H_Read, 2, H_Write ;; SET H, 2 Cycles:8
  2961.             lr35902@SetBit CBD5, 8,  L_Read, 2, L_Write ;; SET L, 2 Cycles:8        
  2962.             lr35902@SetBit CBD6,16,  xHL_Read, 2, xHL_Write ;; SET xHL, 2 Cycles:16      
  2963.             lr35902@SetBit CBD7, 8,  A_Read, 2, A_Write ;; SET A, 2 Cycles:8        
  2964.          
  2965.             lr35902@SetBit CBD8, 8,  B_Read, 3, B_Write ;; SET B, 3 Cycles:8
  2966.             lr35902@SetBit CBD9, 8,  C_Read, 3, C_Write ;; SET C, 3 Cycles:8        
  2967.             lr35902@SetBit CBDA, 8,  D_Read, 3, D_Write ;; SET D, 3 Cycles:8        
  2968.             lr35902@SetBit CBDB, 8,  E_Read, 3, E_Write ;; SET E, 3 Cycles:8    
  2969.             lr35902@SetBit CBDC, 8,  H_Read, 3, H_Write ;; SET H, 3 Cycles:8
  2970.             lr35902@SetBit CBDD, 8,  L_Read, 3, L_Write ;; SET L, 3 Cycles:8        
  2971.             lr35902@SetBit CBDE,16,  xHL_Read, 3, xHL_Write ;; SET xHL, 3 Cycles:16      
  2972.             lr35902@SetBit CBDF, 8,  A_Read, 3, A_Write ;; SET A, 3 Cycles:8
  2973.  
  2974.             lr35902@SetBit CBE0, 8,  B_Read, 4, B_Write ;; SET B, 4 Cycles:8
  2975.             lr35902@SetBit CBE1, 8,  C_Read, 4, C_Write ;; SET C, 4 Cycles:8        
  2976.             lr35902@SetBit CBE2, 8,  D_Read, 4, D_Write ;; SET D, 4 Cycles:8        
  2977.             lr35902@SetBit CBE3, 8,  E_Read, 4, E_Write ;; SET E, 4 Cycles:8    
  2978.             lr35902@SetBit CBE4, 8,  H_Read, 4, H_Write ;; SET H, 4 Cycles:8
  2979.             lr35902@SetBit CBE5, 8,  L_Read, 4, L_Write ;; SET L, 4 Cycles:8        
  2980.             lr35902@SetBit CBE6,16,  xHL_Read, 4, xHL_Write ;; SET xHL, 4 Cycles:16      
  2981.             lr35902@SetBit CBE7, 8,  A_Read, 4, A_Write ;; SET A, 4 Cycles:8        
  2982.          
  2983.             lr35902@SetBit CBE8, 8,  B_Read, 5, B_Write ;; SET B, 5 Cycles:8
  2984.             lr35902@SetBit CBE9, 8,  C_Read, 5, C_Write ;; SET C, 5 Cycles:8        
  2985.             lr35902@SetBit CBEA, 8,  D_Read, 5, D_Write ;; SET D, 5 Cycles:8        
  2986.             lr35902@SetBit CBEB, 8,  E_Read, 5, E_Write ;; SET E, 5 Cycles:8    
  2987.             lr35902@SetBit CBEC, 8,  H_Read, 5, H_Write ;; SET H, 5 Cycles:8
  2988.             lr35902@SetBit CBED, 8,  L_Read, 5, L_Write ;; SET L, 5 Cycles:8        
  2989.             lr35902@SetBit CBEE,16,  xHL_Read, 5, xHL_Write ;; SET xHL, 5 Cycles:16      
  2990.             lr35902@SetBit CBEF, 8,  A_Read, 5, A_Write ;; SET A, 5 Cycles:8
  2991.            
  2992.             lr35902@SetBit CBF0, 8,  B_Read, 6, B_Write ;; SET B, 6 Cycles:8
  2993.             lr35902@SetBit CBF1, 8,  C_Read, 6, C_Write ;; SET C, 6 Cycles:8        
  2994.             lr35902@SetBit CBF2, 8,  D_Read, 6, D_Write ;; SET D, 6 Cycles:8        
  2995.             lr35902@SetBit CBF3, 8,  E_Read, 6, E_Write ;; SET E, 6 Cycles:8    
  2996.             lr35902@SetBit CBF4, 8,  H_Read, 6, H_Write ;; SET H, 6 Cycles:8
  2997.             lr35902@SetBit CBF5, 8,  L_Read, 6, L_Write ;; SET L, 6 Cycles:8        
  2998.             lr35902@SetBit CBF6,16,  xHL_Read, 6, xHL_Write ;; SET xHL, 6 Cycles:16      
  2999.             lr35902@SetBit CBF7, 8,  A_Read, 6, A_Write ;; SET A, 6 Cycles:8        
  3000.          
  3001.             lr35902@SetBit CBF8, 8,  B_Read, 7, B_Write ;; SET B, 7 Cycles:8
  3002.             lr35902@SetBit CBF9, 8,  C_Read, 7, C_Write ;; SET C, 7 Cycles:8        
  3003.             lr35902@SetBit CBFA, 8,  D_Read, 7, D_Write ;; SET D, 7 Cycles:8        
  3004.             lr35902@SetBit CBFB, 8,  E_Read, 7, E_Write ;; SET E, 7 Cycles:8    
  3005.             lr35902@SetBit CBFC, 8,  H_Read, 7, H_Write ;; SET H, 7 Cycles:8
  3006.             lr35902@SetBit CBFD, 8,  L_Read, 7, L_Write ;; SET L, 7 Cycles:8        
  3007.             lr35902@SetBit CBFE,16,  xHL_Read, 7, xHL_Write ;; SET xHL, 7 Cycles:16      
  3008.             lr35902@SetBit CBFF, 8,  A_Read, 7, A_Write ;; SET A, 7 Cycles:8    
  3009.        
  3010.         ;; --------------------------------------------------------------
  3011.         ;; --------------------------------------------------------------
  3012.         ;; --------------------------------------------------------------
  3013.         ;; --------------------------------------------------------------
  3014.         ;; --------------------------------------------------------------
  3015.         ;; Ub Code for lr35902
  3016.         ;; --------------------------------------------------------------
  3017.        
  3018.       OPDD: ;; DD Perfix(IX) for Z80
  3019.       OPFD: ;; FD Perfix(IY) for Z80
  3020.       OPED: ;; ED Perfix(EXTD) for Z80    
  3021.       OPD3: ;; out (*),a for Z80
  3022.       OPDB: ;; in a,(*) for Z80
  3023.       OPE3: ;; ex (sp),hl for Z80
  3024.       OPE4: ;; call po,** for Z80
  3025.       OPEB: ;; ex de,hl for Z80
  3026.       OPEC: ;; call pe,** for Z80
  3027.       OPF4: ;; call p,** for Z80
  3028.       OPFC: ;; call m,** for Z80
  3029.         int 3
  3030.       OP00: ;; NOP
  3031.         mov [YG_GP+lr35902.PC], si
  3032.         mov eax, 4
  3033. V_EXIT:
  3034.         mov dword [YG_GP+lr35902._backup], 0
  3035.         pop esi
  3036.         pop edi
  3037.         pop ebx
  3038.         ret
  3039.        
  3040.        
  3041.         align 16      
  3042. OPTAB   dd  OP00, OP01, OP02, OP03, OP04, OP05, OP06, OP07, OP08, OP09, OP0A, OP0B, OP0C, OP0D, OP0E, OP0F,\
  3043.             OP10, OP11, OP12, OP13, OP14, OP15, OP16, OP17, OP18, OP19, OP1A, OP1B, OP1C, OP1D, OP1E, OP1F,\
  3044.             OP20, OP21, OP22, OP23, OP24, OP25, OP26, OP27, OP28, OP29, OP2A, OP2B, OP2C, OP2D, OP2E, OP2F,\
  3045.             OP30, OP31, OP32, OP33, OP34, OP35, OP36, OP37, OP38, OP39, OP3A, OP3B, OP3C, OP3D, OP3E, OP3F,\
  3046.             OP40, OP41, OP42, OP43, OP44, OP45, OP46, OP47, OP48, OP49, OP4A, OP4B, OP4C, OP4D, OP4E, OP4F,\
  3047.             OP50, OP51, OP52, OP53, OP54, OP55, OP56, OP57, OP58, OP59, OP5A, OP5B, OP5C, OP5D, OP5E, OP5F,\
  3048.             OP60, OP61, OP62, OP63, OP64, OP65, OP66, OP67, OP68, OP69, OP6A, OP6B, OP6C, OP6D, OP6E, OP6F,\
  3049.             OP70, OP71, OP72, OP73, OP74, OP75, OP76, OP77, OP78, OP79, OP7A, OP7B, OP7C, OP7D, OP7E, OP7F,\
  3050.             OP80, OP81, OP82, OP83, OP84, OP85, OP86, OP87, OP88, OP89, OP8A, OP8B, OP8C, OP8D, OP8E, OP8F,\
  3051.             OP90, OP91, OP92, OP93, OP94, OP95, OP96, OP97, OP98, OP99, OP9A, OP9B, OP9C, OP9D, OP9E, OP9F,\
  3052.             OPA0, OPA1, OPA2, OPA3, OPA4, OPA5, OPA6, OPA7, OPA8, OPA9, OPAA, OPAB, OPAC, OPAD, OPAE, OPAF,\
  3053.             OPB0, OPB1, OPB2, OPB3, OPB4, OPB5, OPB6, OPB7, OPB8, OPB9, OPBA, OPBB, OPBC, OPBD, OPBE, OPBF,\
  3054.             OPC0, OPC1, OPC2, OPC3, OPC4, OPC5, OPC6, OPC7, OPC8, OPC9, OPCA, OPCB, OPCC, OPCD, OPCE, OPCF,\
  3055.             OPD0, OPD1, OPD2, OPD3, OPD4, OPD5, OPD6, OPD7, OPD8, OPD9, OPDA, OPDB, OPDC, OPDD, OPDE, OPDF,\
  3056.             OPE0, OPE1, OPE2, OPE3, OPE4, OPE5, OPE6, OPE7, OPE8, OPE9, OPEA, OPEB, OPEC, OPED, OPEE, OPEF,\
  3057.             OPF0, OPF1, OPF2, OPF3, OPF4, OPF5, OPF6, OPF7, OPF8, OPF9, OPFA, OPFB, OPFC, OPFD, OPFE, OPFF
  3058. CBTAB   dd  CB00, CB01, CB02, CB03, CB04, CB05, CB06, CB07, CB08, CB09, CB0A, CB0B, CB0C, CB0D, CB0E, CB0F,\
  3059.             CB10, CB11, CB12, CB13, CB14, CB15, CB16, CB17, CB18, CB19, CB1A, CB1B, CB1C, CB1D, CB1E, CB1F,\
  3060.             CB20, CB21, CB22, CB23, CB24, CB25, CB26, CB27, CB28, CB29, CB2A, CB2B, CB2C, CB2D, CB2E, CB2F,\
  3061.             CB30, CB31, CB32, CB33, CB34, CB35, CB36, CB37, CB38, CB39, CB3A, CB3B, CB3C, CB3D, CB3E, CB3F,\
  3062.             CB40, CB41, CB42, CB43, CB44, CB45, CB46, CB47, CB48, CB49, CB4A, CB4B, CB4C, CB4D, CB4E, CB4F,\
  3063.             CB50, CB51, CB52, CB53, CB54, CB55, CB56, CB57, CB58, CB59, CB5A, CB5B, CB5C, CB5D, CB5E, CB5F,\
  3064.             CB60, CB61, CB62, CB63, CB64, CB65, CB66, CB67, CB68, CB69, CB6A, CB6B, CB6C, CB6D, CB6E, CB6F,\
  3065.             CB70, CB71, CB72, CB73, CB74, CB75, CB76, CB77, CB78, CB79, CB7A, CB7B, CB7C, CB7D, CB7E, CB7F,\
  3066.             CB80, CB81, CB82, CB83, CB84, CB85, CB86, CB87, CB88, CB89, CB8A, CB8B, CB8C, CB8D, CB8E, CB8F,\
  3067.             CB90, CB91, CB92, CB93, CB94, CB95, CB96, CB97, CB98, CB99, CB9A, CB9B, CB9C, CB9D, CB9E, CB9F,\
  3068.             CBA0, CBA1, CBA2, CBA3, CBA4, CBA5, CBA6, CBA7, CBA8, CBA9, CBAA, CBAB, CBAC, CBAD, CBAE, CBAF,\
  3069.             CBB0, CBB1, CBB2, CBB3, CBB4, CBB5, CBB6, CBB7, CBB8, CBB9, CBBA, CBBB, CBBC, CBBD, CBBE, CBBF,\
  3070.             CBC0, CBC1, CBC2, CBC3, CBC4, CBC5, CBC6, CBC7, CBC8, CBC9, CBCA, CBCB, CBCC, CBCD, CBCE, CBCF,\
  3071.             CBD0, CBD1, CBD2, CBD3, CBD4, CBD5, CBD6, CBD7, CBD8, CBD9, CBDA, CBDB, CBDC, CBDD, CBDE, CBDF,\
  3072.             CBE0, CBE1, CBE2, CBE3, CBE4, CBE5, CBE6, CBE7, CBE8, CBE9, CBEA, CBEB, CBEC, CBED, CBEE, CBEF,\
  3073.             CBF0, CBF1, CBF2, CBF3, CBF4, CBF5, CBF6, CBF7, CBF8, CBF9, CBFA, CBFB, CBFC, CBFD, CBFE, CBFF
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement