Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /********************************************************************************/
  2. /*                                                                              */
  3. /* CZ80 CB opcode include source file                                           */
  4. /* C Z80 emulator version 0.91                                                  */
  5. /* Copyright 2004-2005 Stephane Dallongeville                                   */
  6. /*                                                                              */
  7. /********************************************************************************/
  8.  
  9. #if CZ80_USE_JUMPTABLE
  10.     goto *JumpTableCB[Opcode];
  11. #else
  12. switch (Opcode)
  13. {
  14. #endif
  15.  
  16.     OPCB(0x00): // RLC  B
  17.     OPCB(0x01): // RLC  C
  18.     OPCB(0x02): // RLC  D
  19.     OPCB(0x03): // RLC  E
  20.     OPCB(0x04): // RLC  H
  21.     OPCB(0x05): // RLC  L
  22.     OPCB(0x07): // RLC  A
  23.     {
  24.         uint8_t src = zR8(Opcode);
  25.        
  26.         zR8(Opcode) = (src << 1) | (src >> 7);
  27.         zF = SZXYP[zR8(Opcode)] | (src >> 7);
  28.         RET(4 + 4)
  29.     }
  30.  
  31.     OPCB(0x06): // RLC  (HL)
  32.     {
  33.         uint16_t adr;
  34.         uint8_t src;
  35.         uint8_t res;
  36.  
  37.         PRE_IO
  38.         adr = zHL;
  39.         READ_BYTE(adr, src)
  40.         res = ((src << 1) | (src >> 7)) & 0xFF;
  41.         zF = SZXYP[res] | (src >> 7);
  42.         WRITE_BYTE(adr, res)
  43.         POST_IO
  44.         RET(11 + 4)
  45.     }
  46.  
  47.  
  48.     OPCB(0x08): // RRC  B
  49.     OPCB(0x09): // RRC  C
  50.     OPCB(0x0a): // RRC  D
  51.     OPCB(0x0b): // RRC  E
  52.     OPCB(0x0c): // RRC  H
  53.     OPCB(0x0d): // RRC  L
  54.     OPCB(0x0f): // RRC  A
  55.     {
  56.         uint8_t src = zR8(Opcode & 7);
  57.  
  58.         zR8(Opcode & 7) = (src >> 1) | (src << 7);
  59.         zF = SZXYP[zR8(Opcode & 7)] | (src & CZ80_CF);
  60.         RET(4 + 4)
  61.     }
  62.  
  63.     OPCB(0x0e): // RRC  (HL)
  64.     {
  65.         uint16_t adr;
  66.         uint8_t src;
  67.         uint8_t res;
  68.  
  69.         PRE_IO
  70.         adr = zHL;
  71.         READ_BYTE(adr, src)
  72.         res = ((src >> 1) | (src << 7)) & 0xFF;
  73.         zF = SZXYP[res] | (src & CZ80_CF);
  74.         WRITE_BYTE(adr, res)
  75.         POST_IO
  76.         RET(11 + 4)
  77.     }
  78.  
  79.  
  80.     OPCB(0x10): // RL   B
  81.     OPCB(0x11): // RL   C
  82.     OPCB(0x12): // RL   D
  83.     OPCB(0x13): // RL   E
  84.     OPCB(0x14): // RL   H
  85.     OPCB(0x15): // RL   L
  86.     OPCB(0x17): // RL   A
  87.     {
  88.         uint8_t src = zR8(Opcode & 7);
  89.  
  90.         zR8(Opcode & 7) = (src << 1) | (zF & CZ80_CF);
  91.         zF = SZXYP[zR8(Opcode & 7)] | (src >> 7);
  92.     }
  93.     RET(4 + 4)
  94.  
  95.     OPCB(0x16): // RL   (HL)
  96.     {
  97.         uint16_t adr;
  98.         uint8_t src;
  99.         uint8_t res;
  100.  
  101.         PRE_IO
  102.         adr = zHL;
  103.         READ_BYTE(adr, src)
  104.         res = ((src << 1) | (zF & CZ80_CF)) & 0xFF;
  105.         zF = SZXYP[res] | (src >> 7);
  106.         WRITE_BYTE(adr, res)
  107.         POST_IO
  108.         RET(11 + 4)
  109.     }
  110.  
  111.  
  112.     OPCB(0x18): // RR   B
  113.     OPCB(0x19): // RR   C
  114.     OPCB(0x1a): // RR   D
  115.     OPCB(0x1b): // RR   E
  116.     OPCB(0x1c): // RR   H
  117.     OPCB(0x1d): // RR   L
  118.     OPCB(0x1f): // RR   A
  119.     {
  120.         uint8_t src = zR8(Opcode & 7);
  121.  
  122.         zR8(Opcode & 7) = (src >> 1) | (zF << 7);
  123.         zF = SZXYP[zR8(Opcode & 7)] | (src & CZ80_CF);
  124.     }
  125.     RET(4 + 4)
  126.  
  127.     OPCB(0x1e): // RR   (HL)
  128.     {
  129.         uint16_t adr;
  130.         uint8_t src;
  131.         uint8_t res;
  132.  
  133.         PRE_IO
  134.         adr = zHL;
  135.         READ_BYTE(adr, src)
  136.         res = ((src >> 1) | (zF << 7)) & 0xFF;
  137.         zF = SZXYP[res] | (src & CZ80_CF);
  138.         WRITE_BYTE(adr, res)
  139.         POST_IO
  140.         RET(11 + 4)
  141.     }
  142.  
  143.  
  144.     OPCB(0x20): // SLA  B
  145.     OPCB(0x21): // SLA  C
  146.     OPCB(0x22): // SLA  D
  147.     OPCB(0x23): // SLA  E
  148.     OPCB(0x24): // SLA  H
  149.     OPCB(0x25): // SLA  L
  150.     OPCB(0x27): // SLA  A
  151.     {
  152.         uint8_t src = zR8(Opcode & 7);
  153.  
  154.         zR8(Opcode & 7) = src << 1;
  155.         zF = SZXYP[zR8(Opcode & 7)] | (src >> 7);
  156.     }
  157.     RET(4 + 4)
  158.  
  159.     OPCB(0x26): // SLA  (HL)
  160.     {
  161.         uint16_t adr;
  162.         uint8_t src;
  163.         uint8_t res;
  164.  
  165.         PRE_IO
  166.         adr = zHL;
  167.         READ_BYTE(adr, src)
  168.         res = (src << 1) & 0xFF;
  169.         zF = SZXYP[res] | (src >> 7);
  170.         WRITE_BYTE(adr, res)
  171.         POST_IO
  172.         RET(11 + 4)
  173.     }
  174.  
  175.  
  176.     OPCB(0x28): // SRA  B
  177.     OPCB(0x29): // SRA  C
  178.     OPCB(0x2a): // SRA  D
  179.     OPCB(0x2b): // SRA  E
  180.     OPCB(0x2c): // SRA  H
  181.     OPCB(0x2d): // SRA  L
  182.     OPCB(0x2f): // SRA  A
  183.     {
  184.         int8_t src = zR8(Opcode & 7);
  185.  
  186.         zR8(Opcode & 7) = src >> 1;
  187.         zF = SZXYP[zR8(Opcode & 7)] | (src & CZ80_CF);
  188.     }
  189.     RET(4 + 4)
  190.  
  191.     OPCB(0x2e): // SRA  (HL)
  192.     {
  193.         uint16_t adr;
  194.         uint8_t src;
  195.         uint8_t res;
  196.  
  197.         PRE_IO
  198.         adr = zHL;
  199.         READ_BYTE(adr, src)
  200.         res = (uint8_t)(((int8_t)(src)) >> 1);
  201.         zF = SZXYP[res] | (src & CZ80_CF);
  202.         WRITE_BYTE(adr, res)
  203.         POST_IO
  204.         RET(11 + 4)
  205.     }
  206.  
  207.  
  208.     OPCB(0x30): // SLL  B
  209.     OPCB(0x31): // SLL  C
  210.     OPCB(0x32): // SLL  D
  211.     OPCB(0x33): // SLL  E
  212.     OPCB(0x34): // SLL  H
  213.     OPCB(0x35): // SLL  L
  214.     OPCB(0x37): // SLL  A
  215.     {
  216.         uint8_t src = zR8(Opcode & 7);
  217.  
  218.         zR8(Opcode & 7) = (src << 1) | 1;
  219.         zF = SZXYP[zR8(Opcode & 7)] | (src >> 7);
  220.     }
  221.     RET(4 + 4)
  222.  
  223.     OPCB(0x36): // SLL  (HL)
  224.     {
  225.         uint16_t adr;
  226.         uint8_t src;
  227.         uint8_t res;
  228.  
  229.         PRE_IO
  230.         adr = zHL;
  231.         READ_BYTE(adr, src)
  232.         res = ((src << 1) | 1) & 0xFF;
  233.         zF = SZXYP[res] | (src >> 7);
  234.         WRITE_BYTE(adr, res)
  235.         POST_IO
  236.         RET(11 + 4)
  237.     }
  238.  
  239.  
  240.     OPCB(0x38): // SRL  B
  241.     OPCB(0x39): // SRL  C
  242.     OPCB(0x3a): // SRL  D
  243.     OPCB(0x3b): // SRL  E
  244.     OPCB(0x3c): // SRL  H
  245.     OPCB(0x3d): // SRL  L
  246.     OPCB(0x3f): // SRL  A
  247.     {
  248.         uint8_t src = zR8(Opcode & 7);
  249.  
  250.         zR8(Opcode & 7) = src >> 1;
  251.         zF = SZXYP[zR8(Opcode & 7)] | (src & CZ80_CF);
  252.     }
  253.     RET(4 + 4)
  254.  
  255.     OPCB(0x3e): // SRL  (HL)
  256.     {
  257.         uint16_t adr;
  258.         uint8_t src;
  259.         uint8_t res;
  260.  
  261.         PRE_IO
  262.         adr = zHL;
  263.         READ_BYTE(adr, src)
  264.         res = src >> 1;
  265.         zF = SZXYP[res] | (src & CZ80_CF);
  266.         WRITE_BYTE(adr, res)
  267.         POST_IO
  268.         RET(11 + 4)
  269.     }
  270.  
  271.  
  272.     OPCB(0x40): // BIT  0,B
  273.     OPCB(0x41): // BIT  0,C
  274.     OPCB(0x42): // BIT  0,D
  275.     OPCB(0x43): // BIT  0,E
  276.     OPCB(0x44): // BIT  0,H
  277.     OPCB(0x45): // BIT  0,L
  278.     OPCB(0x47): // BIT  0,A
  279.    
  280.     OPCB(0x48): // BIT  1,B
  281.     OPCB(0x49): // BIT  1,C
  282.     OPCB(0x4a): // BIT  1,D
  283.     OPCB(0x4b): // BIT  1,E
  284.     OPCB(0x4c): // BIT  1,H
  285.     OPCB(0x4d): // BIT  1,L
  286.     OPCB(0x4f): // BIT  1,A
  287.    
  288.     OPCB(0x50): // BIT  2,B
  289.     OPCB(0x51): // BIT  2,C
  290.     OPCB(0x52): // BIT  2,D
  291.     OPCB(0x53): // BIT  2,E
  292.     OPCB(0x54): // BIT  2,H
  293.     OPCB(0x55): // BIT  2,L
  294.     OPCB(0x57): // BIT  2,A
  295.    
  296.     OPCB(0x58): // BIT  3,B
  297.     OPCB(0x59): // BIT  3,C
  298.     OPCB(0x5a): // BIT  3,D
  299.     OPCB(0x5b): // BIT  3,E
  300.     OPCB(0x5c): // BIT  3,H
  301.     OPCB(0x5d): // BIT  3,L
  302.     OPCB(0x5f): // BIT  3,A
  303.    
  304.     OPCB(0x60): // BIT  4,B
  305.     OPCB(0x61): // BIT  4,C
  306.     OPCB(0x62): // BIT  4,D
  307.     OPCB(0x63): // BIT  4,E
  308.     OPCB(0x64): // BIT  4,H
  309.     OPCB(0x65): // BIT  4,L
  310.     OPCB(0x67): // BIT  4,A
  311.    
  312.     OPCB(0x68): // BIT  5,B
  313.     OPCB(0x69): // BIT  5,C
  314.     OPCB(0x6a): // BIT  5,D
  315.     OPCB(0x6b): // BIT  5,E
  316.     OPCB(0x6c): // BIT  5,H
  317.     OPCB(0x6d): // BIT  5,L
  318.     OPCB(0x6f): // BIT  5,A
  319.    
  320.     OPCB(0x70): // BIT  6,B
  321.     OPCB(0x71): // BIT  6,C
  322.     OPCB(0x72): // BIT  6,D
  323.     OPCB(0x73): // BIT  6,E
  324.     OPCB(0x74): // BIT  6,H
  325.     OPCB(0x75): // BIT  6,L
  326.     OPCB(0x77): // BIT  6,A
  327.    
  328.     OPCB(0x78): // BIT  7,B
  329.     OPCB(0x79): // BIT  7,C
  330.     OPCB(0x7a): // BIT  7,D
  331.     OPCB(0x7b): // BIT  7,E
  332.     OPCB(0x7c): // BIT  7,H
  333.     OPCB(0x7d): // BIT  7,L
  334.     OPCB(0x7f): // BIT  7,A
  335.     {
  336.         zF = (zF & CZ80_CF) | CZ80_HF |
  337.             SZXY_BIT[zR8(Opcode & 7) & (1 << ((Opcode >> 3) & 7))];
  338.     }
  339.     RET(4 + 4)
  340.  
  341.     OPCB(0x46): // BIT  0,(HL)
  342.     OPCB(0x4e): // BIT  1,(HL)
  343.     OPCB(0x56): // BIT  2,(HL)
  344.     OPCB(0x5e): // BIT  3,(HL)
  345.     OPCB(0x66): // BIT  4,(HL)
  346.     OPCB(0x6e): // BIT  5,(HL)
  347.     OPCB(0x76): // BIT  6,(HL)
  348.     OPCB(0x7e): // BIT  7,(HL)
  349.     {
  350.         uint8_t src;
  351.         uint8_t bitm;
  352.  
  353.         PRE_IO
  354.         bitm = 1 << ((Opcode >> 3) & 7);
  355.         READ_BYTE(zHL, src)
  356.         zF = (zF & CZ80_CF) | CZ80_HF | SZXY_BIT[src & bitm];
  357.         POST_IO
  358.         RET(8 + 4)
  359.     }
  360.  
  361.  
  362.     OPCB(0x80): // RES  0,B
  363.     OPCB(0x81): // RES  0,C
  364.     OPCB(0x82): // RES  0,D
  365.     OPCB(0x83): // RES  0,E
  366.     OPCB(0x84): // RES  0,H
  367.     OPCB(0x85): // RES  0,L
  368.     OPCB(0x87): // RES  0,A
  369.  
  370.     OPCB(0x88): // RES  1,B
  371.     OPCB(0x89): // RES  1,C
  372.     OPCB(0x8a): // RES  1,D
  373.     OPCB(0x8b): // RES  1,E
  374.     OPCB(0x8c): // RES  1,H
  375.     OPCB(0x8d): // RES  1,L
  376.     OPCB(0x8f): // RES  1,A
  377.  
  378.     OPCB(0x90): // RES  2,B
  379.     OPCB(0x91): // RES  2,C
  380.     OPCB(0x92): // RES  2,D
  381.     OPCB(0x93): // RES  2,E
  382.     OPCB(0x94): // RES  2,H
  383.     OPCB(0x95): // RES  2,L
  384.     OPCB(0x97): // RES  2,A
  385.  
  386.     OPCB(0x98): // RES  3,B
  387.     OPCB(0x99): // RES  3,C
  388.     OPCB(0x9a): // RES  3,D
  389.     OPCB(0x9b): // RES  3,E
  390.     OPCB(0x9c): // RES  3,H
  391.     OPCB(0x9d): // RES  3,L
  392.     OPCB(0x9f): // RES  3,A
  393.  
  394.     OPCB(0xa0): // RES  4,B
  395.     OPCB(0xa1): // RES  4,C
  396.     OPCB(0xa2): // RES  4,D
  397.     OPCB(0xa3): // RES  4,E
  398.     OPCB(0xa4): // RES  4,H
  399.     OPCB(0xa5): // RES  4,L
  400.     OPCB(0xa7): // RES  4,A
  401.  
  402.     OPCB(0xa8): // RES  5,B
  403.     OPCB(0xa9): // RES  5,C
  404.     OPCB(0xaa): // RES  5,D
  405.     OPCB(0xab): // RES  5,E
  406.     OPCB(0xac): // RES  5,H
  407.     OPCB(0xad): // RES  5,L
  408.     OPCB(0xaf): // RES  5,A
  409.  
  410.     OPCB(0xb0): // RES  6,B
  411.     OPCB(0xb1): // RES  6,C
  412.     OPCB(0xb2): // RES  6,D
  413.     OPCB(0xb3): // RES  6,E
  414.     OPCB(0xb4): // RES  6,H
  415.     OPCB(0xb5): // RES  6,L
  416.     OPCB(0xb7): // RES  6,A
  417.  
  418.     OPCB(0xb8): // RES  7,B
  419.     OPCB(0xb9): // RES  7,C
  420.     OPCB(0xba): // RES  7,D
  421.     OPCB(0xbb): // RES  7,E
  422.     OPCB(0xbc): // RES  7,H
  423.     OPCB(0xbd): // RES  7,L
  424.     OPCB(0xbf): // RES  7,A
  425.     {
  426.         zR8(Opcode & 7) &= ~(1 << ((Opcode >> 3) & 7));
  427.     }
  428.     RET(4 + 4)
  429.  
  430.     OPCB(0x86): // RES  0,(HL)
  431.     OPCB(0x8e): // RES  1,(HL)
  432.     OPCB(0x96): // RES  2,(HL)
  433.     OPCB(0x9e): // RES  3,(HL)
  434.     OPCB(0xa6): // RES  4,(HL)
  435.     OPCB(0xae): // RES  5,(HL)
  436.     OPCB(0xb6): // RES  6,(HL)
  437.     OPCB(0xbe): // RES  7,(HL)
  438.     {
  439.         uint16_t adr;
  440.         uint8_t res;
  441.         uint8_t bitm;
  442.  
  443.         PRE_IO
  444.         adr = zHL;
  445.         bitm = ~(1 << ((Opcode >> 3) & 7));
  446.         READ_BYTE(adr, res)
  447.         res &= bitm;
  448.         WRITE_BYTE(adr, res)
  449.         POST_IO
  450.         RET(11 + 4)
  451.     }
  452.  
  453.  
  454.     OPCB(0xc0): // SET  0,B
  455.     OPCB(0xc1): // SET  0,C
  456.     OPCB(0xc2): // SET  0,D
  457.     OPCB(0xc3): // SET  0,E
  458.     OPCB(0xc4): // SET  0,H
  459.     OPCB(0xc5): // SET  0,L
  460.     OPCB(0xc7): // SET  0,A
  461.  
  462.     OPCB(0xc8): // SET  1,B
  463.     OPCB(0xc9): // SET  1,C
  464.     OPCB(0xca): // SET  1,D
  465.     OPCB(0xcb): // SET  1,E
  466.     OPCB(0xcc): // SET  1,H
  467.     OPCB(0xcd): // SET  1,L
  468.     OPCB(0xcf): // SET  1,A
  469.  
  470.     OPCB(0xd0): // SET  2,B
  471.     OPCB(0xd1): // SET  2,C
  472.     OPCB(0xd2): // SET  2,D
  473.     OPCB(0xd3): // SET  2,E
  474.     OPCB(0xd4): // SET  2,H
  475.     OPCB(0xd5): // SET  2,L
  476.     OPCB(0xd7): // SET  2,A
  477.  
  478.     OPCB(0xd8): // SET  3,B
  479.     OPCB(0xd9): // SET  3,C
  480.     OPCB(0xda): // SET  3,D
  481.     OPCB(0xdb): // SET  3,E
  482.     OPCB(0xdc): // SET  3,H
  483.     OPCB(0xdd): // SET  3,L
  484.     OPCB(0xdf): // SET  3,A
  485.  
  486.     OPCB(0xe0): // SET  4,B
  487.     OPCB(0xe1): // SET  4,C
  488.     OPCB(0xe2): // SET  4,D
  489.     OPCB(0xe3): // SET  4,E
  490.     OPCB(0xe4): // SET  4,H
  491.     OPCB(0xe5): // SET  4,L
  492.     OPCB(0xe7): // SET  4,A
  493.  
  494.     OPCB(0xe8): // SET  5,B
  495.     OPCB(0xe9): // SET  5,C
  496.     OPCB(0xea): // SET  5,D
  497.     OPCB(0xeb): // SET  5,E
  498.     OPCB(0xec): // SET  5,H
  499.     OPCB(0xed): // SET  5,L
  500.     OPCB(0xef): // SET  5,A
  501.  
  502.     OPCB(0xf0): // SET  6,B
  503.     OPCB(0xf1): // SET  6,C
  504.     OPCB(0xf2): // SET  6,D
  505.     OPCB(0xf3): // SET  6,E
  506.     OPCB(0xf4): // SET  6,H
  507.     OPCB(0xf5): // SET  6,L
  508.     OPCB(0xf7): // SET  6,A
  509.  
  510.     OPCB(0xf8): // SET  7,B
  511.     OPCB(0xf9): // SET  7,C
  512.     OPCB(0xfa): // SET  7,D
  513.     OPCB(0xfb): // SET  7,E
  514.     OPCB(0xfc): // SET  7,H
  515.     OPCB(0xfd): // SET  7,L
  516.     OPCB(0xff): // SET  7,A
  517.     {
  518.         zR8(Opcode & 7) |= 1 << ((Opcode >> 3) & 7);
  519.     }
  520.     RET(4 + 4)
  521.  
  522.     OPCB(0xc6): // SET  0,(HL)
  523.     OPCB(0xce): // SET  1,(HL)
  524.     OPCB(0xd6): // SET  2,(HL)
  525.     OPCB(0xde): // SET  3,(HL)
  526.     OPCB(0xe6): // SET  4,(HL)
  527.     OPCB(0xee): // SET  5,(HL)
  528.     OPCB(0xf6): // SET  6,(HL)
  529.     OPCB(0xfe): // SET  7,(HL)
  530.     {
  531.         uint16_t adr;
  532.         uint8_t res;
  533.         uint8_t bitm;
  534.  
  535.         PRE_IO
  536.         adr = zHL;
  537.         bitm = 1 << ((Opcode >> 3) & 7);
  538.         READ_BYTE(adr, res)
  539.         res |= bitm;
  540.         WRITE_BYTE(adr, res)
  541.         POST_IO
  542.         RET(11 + 4)
  543.     }
  544.    
  545. #if CZ80_USE_JUMPTABLE
  546. #else
  547. }
  548. #endif
  549.  
  550.