home *** CD-ROM | disk | FTP | other *** search
/ Il CD di internet / CD.iso / SOURCE / EXTRA-ST / CPM-80-E / CPM-0.2 / CPM-0 / cpm-0.2 / code.s < prev    next >
Encoding:
Text File  |  1994-06-21  |  18.2 KB  |  763 lines

  1. /*****************************************************************************/
  2. /*                                         */
  3. /*                                         */
  4. /*    CP/M emulator version 0.1                         */
  5. /*                                         */
  6. /*    written by Michael Bischoff (mbi@mo.math.nat.tu-bs.de)             */
  7. /*    June-1994                                 */
  8. /*                                         */
  9. /*    This file is distributed under the GNU COPYRIGHT             */
  10. /*    see COPYRIGHT.GNU for Copyright details                     */
  11. /*                                         */
  12. /*                                         */
  13. /*****************************************************************************/
  14. #define        NALIGN    2    /* 2, 3, or 4 (4 is 1% faster than 2) */
  15.  
  16. /* comment: PC (stored in %esi) is incremented as 32-bit counter (faster!),
  17.             therefore a fall-through to addresses after 64 KB is
  18.         possible. We catch such programs with a couple of HALTs
  19.         stored after 64 KB.
  20.         A similar problem is accessing word data at 0xffff! */
  21.  
  22. #define EXIT    exitemu    /* illegal opcodes for 8080 */
  23. #define GETIXOFF movsbl (%ebp,%esi),%edi;incl %esi;addl _z80regs+32,%edi
  24. #define GETIYOFF movsbl (%ebp,%esi),%edi;incl %esi;addl _z80regs+36,%edi
  25. #define IX     _z80regs+32
  26. #define IY     _z80regs+36
  27.  
  28.  
  29.         .data
  30.         .align 2
  31. jumptab:    .long op00, op01, op02, op03, op04, op05, op06, op07
  32.         .long op08, op09, op0a, op0b, op0c, op0d, op0e, op0f
  33.         .long op10, op11, op12, op13, op14, op15, op16, op17
  34.         .long op18, op19, op1a, op1b, op1c, op1d, op1e, op1f
  35.         .long op20, op21, op22, op23, op24, op25, op26, op27
  36.         .long op28, op29, op2a, op2b, op2c, op2d, op2e, op2f
  37.         .long op30, op31, op32, op33, op34, op35, op36, op37
  38.         .long op38, op39, op3a, op3b, op3c, op3d, op3e, op3f
  39.         /* load commands: op00 are NOPs */
  40.         .long op00, op41, op42, op43, op44, op45, op46, op47
  41.         .long op48, op00, op4a, op4b, op4c, op4d, op4e, op4f
  42.         .long op50, op51, op00, op53, op54, op55, op56, op57
  43.         .long op58, op59, op5a, op00, op5c, op5d, op5e, op5f
  44.         .long op60, op61, op62, op63, op00, op65, op66, op67
  45.         .long op68, op69, op6a, op6b, op6c, op00, op6e, op6f
  46.         .long op70, op71, op72, op73, op74, op75, EXIT, op77
  47.         .long op78, op79, op7a, op7b, op7c, op7d, op7e, op00
  48.  
  49.         .long op80, op81, op82, op83, op84, op85, op86, op87
  50.         .long op88, op89, op8a, op8b, op8c, op8d, op8e, op8f
  51.         .long op90, op91, op92, op93, op94, op95, op96, op97
  52.         .long op98, op99, op9a, op9b, op9c, op9d, op9e, op9f
  53.         .long opa0, opa1, opa2, opa3, opa4, opa5, opa6, opa7
  54.         .long opa8, opa9, opaa, opab, opac, opad, opae, opaf
  55.         .long opb0, opb1, opb2, opb3, opb4, opb5, opb6, opb7
  56.         .long opb8, opb9, opba, opbb, opbc, opbd, opbe, opbf
  57.  
  58.         .long opc0, opc1, opc2, opc3, opc4, opc5, opc6, opc7
  59.         .long opc8, opc9, opca, opcb, opcc, opcd, opce, opcf
  60.         .long opd0, opd1, opd2, opd3, opd4, opd5, opd6, opd7
  61.         .long opd8, opd9, opda, EXIT, opdc, opdd, opde, opdf
  62.         .long ope0, ope1, ope2, ope3, ope4, ope5, ope6, ope7
  63.         .long ope8, ope9, opea, opeb, opec, oped, opee, opef
  64.         .long opf0, opf1, opf2, opf3, opf4, opf5, opf6, opf7
  65.         .long opf8, opf9, opfa, opfb, opfc, opfd, opfe, opff
  66.  
  67. jumptab3:    .long cb00, cb01, cb02, cb03, cb04, cb05, cb06, cb07
  68.         .long cb08, cb09, cb0a, cb0b, cb0c, cb0d, cb0e, cb0f
  69.         .long cb10, cb11, cb12, cb13, cb14, cb15, cb16, cb17
  70.         .long cb18, cb19, cb1a, cb1b, cb1c, cb1d, cb1e, cb1f
  71.         .long cb20, cb21, cb22, cb23, cb24, cb25, cb26, cb27
  72.         .long cb28, cb29, cb2a, cb2b, cb2c, cb2d, cb2e, cb2f
  73.         .long EXIT2,EXIT2,EXIT2,EXIT2,EXIT2,EXIT2,EXIT2,EXIT2
  74.         .long cb38, cb39, cb3a, cb3b, cb3c, cb3d, cb3e, cb3f
  75.  
  76.         .long cb40, cb41, cb42, cb43, cb44, cb45, cb46, cb47
  77.         .long cb48, cb49, cb4a, cb4b, cb4c, cb4d, cb4e, cb4f
  78.         .long cb50, cb51, cb52, cb53, cb54, cb55, cb56, cb57
  79.         .long cb58, cb59, cb5a, cb5b, cb5c, cb5d, cb5e, cb5f
  80.         .long cb60, cb61, cb62, cb63, cb64, cb65, cb66, cb67
  81.         .long cb68, cb69, cb6a, cb6b, cb6c, cb65, cb6e, cb6f
  82.         .long cb70, cb71, cb72, cb73, cb74, cb75, cb76, cb77
  83.         .long cb78, cb79, cb7a, cb7b, cb7c, cb7d, cb7e, cb7f
  84.  
  85.         .long cb80, cb81, cb82, cb83, cb84, cb85, cb86, cb87
  86.         .long cb88, cb89, cb8a, cb8b, cb8c, cb8d, cb8e, cb8f
  87.         .long cb90, cb91, cb92, cb93, cb94, cb95, cb96, cb97
  88.         .long cb98, cb99, cb9a, cb9b, cb9c, cb9d, cb9e, cb9f
  89.         .long cba0, cba1, cba2, cba3, cba4, cba5, cba6, cba7
  90.         .long cba8, cba9, cbaa, cbab, cbac, cbad, cbae, cbaf
  91.         .long cbb0, cbb1, cbb2, cbb3, cbb4, cbb5, cbb6, cbb7
  92.         .long cbb8, cbb9, cbba, cbbb, cbbc, cbbd, cbbe, cbbf
  93.  
  94.         .long cbc0, cbc1, cbc2, cbc3, cbc4, cbc5, cbc6, cbc7
  95.         .long cbc8, cbc9, cbca, cbcb, cbcc, cbcd, cbce, cbcf
  96.         .long cbd0, cbd1, cbd2, cbd3, cbd4, cbd5, cbd6, cbd7
  97.         .long cbd8, cbd9, cbda, cbdb, cbdc, cbdd, cbde, cbdf
  98.         .long cbe0, cbe1, cbe2, cbe3, cbe4, cbe5, cbe6, cbe7
  99.         .long cbe8, cbe9, cbea, cbeb, cbec, cbed, cbee, cbef
  100.         .long cbf0, cbf1, cbf2, cbf3, cbf4, cbf5, cbf6, cbf7
  101.         .long cbf8, cbf9, cbfa, cbfb, cbfc, cbfd, cbfe, cbff
  102.  
  103.         .text
  104. #define opcode(n)    .align NALIGN,0x90
  105.  
  106. /* the registers have the following contents: 
  107.     esi = pc
  108.     ebp = sp    nope, _z80mem!
  109.     ecx = bc
  110.     edx = de
  111.     ebx = hl
  112.     eax = af
  113.     edi = temporary storage
  114.    the other registers are kept in memory
  115. */
  116.  
  117. #define        inc8mac(reg)       /* increment 8 Bit Register */\
  118.         andb $0x29,%ah;    /* clear all but carry & untrusted flags */\
  119.         incb reg;        \
  120.         jmp setincdec_386
  121. #define        dec8mac(reg)       /* increment 8 Bit Register */\
  122.         andb $0x29,%ah;    /* clear all but carry & untrusted flags */\
  123.         orb $2,%ah;        \
  124.         decb reg;        \
  125.         jmp setincdec_386
  126.  
  127.         .align 4,0x90
  128. EXIT2:          decl %esi
  129.                 jmp exitemu
  130.  
  131.         opcode(0x00)        /* NOP */
  132. op00:        dispatch
  133.  
  134.         opcode(0x01)        /* LD BC,nnnn */
  135. op01:        movzwl (%esi,%ebp,1),%ecx
  136.         incl %esi
  137.         incl %esi
  138.         dispatch
  139.  
  140.         opcode (0x02)        /* LD (BC),A */
  141. op02:           movb %al,(%ebp,%ecx,1)
  142.         dispatch
  143.  
  144.         opcode (0x03)        /* INC BC */
  145. op03:           incw %cx
  146.         dispatch
  147.  
  148.         opcode (0x04)        /* INC B */
  149. op04:           inc8mac(%ch)
  150.  
  151.         opcode (0x05)        /* DEC B */
  152. op05:           dec8mac(%ch)
  153.  
  154.         opcode (0x06)        /* LD B,nn */
  155. op06:           movb (%esi,%ebp),%ch
  156.         incl %esi
  157.         dispatch
  158.  
  159.         opcode (0x07)        /* RLCA */
  160. op07:           andb $0xec,%ah
  161.         rolb $1,%al
  162.         adcb $0,%ah
  163.         dispatch
  164.  
  165.         opcode (0x08)        /* EX AF,AF' */
  166. op08:           xchgl _z80regs+52,%eax
  167.         dispatch
  168.  
  169.         opcode (0x09)        /* ADD HL,BC */
  170. op09:           andb $0xec,%ah        /* clear some Flags      ### H noch falsch */
  171.         addw %cx,%bx
  172.         adcb $0,%ah        /* set carry flag if necessary (8 Byte) */
  173.         dispatch
  174.  
  175.         opcode (0x0a)        /* LD A,(BC) */
  176. op0a:           movb (%ebp,%ecx,1),%al
  177.         dispatch
  178.  
  179.         opcode (0x0b)        /* DEC BC */
  180. op0b:           decw %cx
  181.         dispatch
  182.  
  183.         opcode (0x0c)        /* INC C */
  184. op0c:           inc8mac(%cl)
  185.  
  186.         opcode (0x0d)        /* DEC C */
  187. op0d:           dec8mac(%cl)
  188.  
  189.         opcode (0x0e)        /* LD C,nn */
  190. op0e:           movb (%esi,%ebp),%cl
  191.         incl %esi
  192.         dispatch
  193.  
  194.         opcode (0x0f)        /* RRCA */
  195. op0f:           andb $0xec,%ah
  196.         rorb $1,%al
  197.         adcb $0,%ah
  198.         dispatch
  199.  
  200.         opcode (0x10)        /* DJNZ disp */
  201. op10:        decb %ch
  202.         jnz op18        /* to JR disp */
  203.         incl %esi
  204.         dispatch
  205.  
  206.         opcode (0x11)        /* LD DE,nnnn */
  207. op11:           movzwl (%esi,%ebp),%edx
  208.         incl %esi
  209.         incl %esi
  210.         dispatch
  211.  
  212.         opcode (0x12)        /* LD (DE),A */
  213. op12:           movb %al,(%ebp,%edx)
  214.         dispatch
  215.  
  216.         opcode (0x13)        /* INC DE */
  217. op13:           incw %dx
  218.         dispatch
  219.  
  220.         opcode (0x14)        /* INC D */
  221. op14:           inc8mac(%dh)
  222.  
  223.         opcode (0x15)        /* DEC D */
  224. op15:           dec8mac(%dh)
  225.  
  226.         opcode (0x16)        /* LD D,nn */
  227. op16:           movb (%esi,%ebp),%dh
  228.         incl %esi
  229.         dispatch
  230.  
  231.         opcode (0x17)        /* RLA */
  232. op17:           sahf
  233.         rclb $1,%al
  234.         xchg %eax,%edi
  235.         lahf
  236.         andl $0x0100,%eax
  237.         andl $0xecff,%edi
  238.         orl %edi,%eax
  239.         dispatch
  240.  
  241.         opcode (0x18)        /* JR disp */
  242. op18:        movsbl (%esi,%ebp),%edi
  243.         incl %esi
  244.         addl %edi,%esi        /* BEWARE! check range 0-xffff */
  245.         andl $0xffff,%esi
  246.         dispatch
  247.  
  248.         opcode (0x19)        /* ADD HL,DE */
  249. op19:           andb $0xec,%ah        /* clear some Flags  ### H noch falsch */
  250.         addw %dx,%bx
  251.         adc $0,%ah
  252.         dispatch
  253.  
  254.         opcode (0x1a)        /* LD A,(DE) */
  255. op1a:           movb (%edx,%ebp),%al
  256.         dispatch
  257.  
  258.         opcode (0x1b)        /* DEC DE */
  259. op1b:           decw %dx
  260.         dispatch
  261.  
  262.         opcode (0x1c)        /* INC E */
  263. op1c:           inc8mac(%dl)
  264.  
  265.         opcode (0x1d)        /* DEC E */
  266. op1d:           dec8mac(%dl)
  267.  
  268.         opcode (0x1e)        /* LD E,nn */
  269. op1e:           movb (%esi,%ebp),%dl
  270.         incl %esi
  271.         dispatch
  272.  
  273.         opcode (0x1f)        /* RRA */
  274. op1f:            sahf
  275.         rcrb $1,%al
  276.         xchg %eax,%edi
  277.         lahf
  278.         andl $0x0100h,%eax
  279.         andl $0xecffh,%edi
  280.         orl %edi,%eax
  281.         dispatch
  282.  
  283.         opcode (0x20)        /* JR NZ,disp */
  284. op20:           sahf
  285.         jnz op18
  286.         incl %esi
  287.         dispatch
  288.  
  289.         opcode (0x21)        /* LD HL,nnnn */
  290. op21:           movw (%esi,%ebp),%bx
  291.         incl %esi
  292.         incl %esi
  293.         dispatch
  294.  
  295.         opcode (0x22)           /* LD (nnnn),HL */
  296. op22:        movzwl (%esi,%ebp),%edi
  297.         movw %bx,(%edi,%ebp)
  298.         incl %esi
  299.         incl %esi
  300.         dispatch
  301.  
  302.         opcode (0x23)        /* INC HL */
  303. op23:           incw %bx
  304.         dispatch
  305.  
  306.         opcode (0x24)           /* INC H */
  307. op24:        inc8mac(%bh)
  308.         dispatch
  309.  
  310.         opcode (0x25)            /* DEC H */
  311. op25:        dec8mac(%bh)
  312.         dispatch
  313.  
  314.         opcode (0x26)        /* LD H,nn */
  315. op26:        movb (%esi,%ebp),%bh
  316.         incl %esi
  317.         dispatch
  318.  
  319.         opcode (0x27)        /* DAA */
  320. op27:        test $2,%ah
  321.         jnz addsub
  322.         sahf
  323.         daa
  324.         jmp afterdaa
  325. addsub:         sahf
  326.         das
  327. afterdaa:       movl %eax,%edi
  328.                 lahf
  329.                 andl $0x0200,%edi
  330.                 andb $0xd5,%ah
  331.                 orl %edi,%eax
  332.                 dispatch
  333.  
  334.         opcode (0x28)         /* JR Z,disp */
  335. op28:        sahf
  336.         jz op18
  337.         incl %esi
  338.         dispatch
  339.  
  340.         opcode (0x29)        /* ADD HL,HL */
  341. op29:           andb $0xec,%ah        /* clear some Flags  ### H noch falsch */
  342.         addw %bx,%bx
  343.         adc $0,%ah
  344.         dispatch
  345.  
  346.         opcode (0x2a)        /* LD HL,(nnnn) */
  347. op2a:           movzwl (%esi,%ebp),%edi
  348.         movw (%edi,%ebp),%bx
  349.         incl %esi
  350.         incl %esi
  351.         dispatch
  352.  
  353.         opcode (0x2b)        /* DEC HL */
  354. op2b:           decw %bx
  355.         dispatch
  356.  
  357.         opcode (0x2c)        /* INC L */
  358. op2c:           inc8mac(%bl)
  359.  
  360.         opcode (0x2d)        /* DEC L */
  361. op2d:           dec8mac(%bl)
  362.  
  363.         opcode (0x2e)        /* LD L,nn */
  364. op2e:           movb (%esi,%ebp),%bl
  365.         incl %esi
  366.         dispatch
  367.  
  368.         opcode (0x1f)        /* CPL */
  369. op2f:        notb %al
  370.         orb $0x12,%ah
  371.         dispatch
  372.  
  373.  
  374.         opcode (0x30)        /* JR NC,disp */
  375. op30:           sahf
  376.         jnc op18
  377.         incl %esi
  378.         dispatch
  379.  
  380.         opcode (0x31)        /* LD SP,nnnn */
  381. op31:           movzwl (%esi,%ebp),%edi
  382.         movl %edi,_z80regs+4
  383.         incl %esi
  384.         incl %esi
  385.         dispatch
  386.  
  387.         opcode (0x32)           /* LD (nnnn),A */
  388. op32:        movzwl (%esi,%ebp),%edi
  389.         movb %al,(%edi,%ebp)
  390.         incl %esi
  391.         incl %esi
  392.         dispatch
  393.  
  394.         opcode (0x33)        /* INC SP */
  395. op33:           incw _z80regs+4
  396.         dispatch
  397.  
  398.         opcode (0x34)           /* INC (HL) */
  399. op34:        inc8mac((%ebp,%ebx))
  400.         dispatch
  401.  
  402.         opcode (0x35)            /* DEC (HL) */
  403. op35:        dec8mac((%ebp,%ebx))
  404.         dispatch
  405.  
  406.         opcode (0x36)        /* LD (HL),nn */
  407. op36:        xchgl %edi,%eax
  408.         movb (%esi,%ebp),%al
  409.         movb %al,(%ebx,%ebp)
  410.         xchgl %edi,%eax
  411.         incl %esi
  412.         dispatch
  413.  
  414.         opcode (0x37)        /* SCF */
  415. op37:        andb $0xec,%ah
  416.         orb $1,%ah
  417.         dispatch
  418.  
  419.         opcode (0x38)         /* JR C,disp */
  420. op38:        sahf
  421.         jc op18
  422.         incl %esi
  423.         dispatch
  424.  
  425.         opcode (0x39)        /* ADD HL,SP */
  426. op39:           andb $0xec,%ah        /* clear some Flags  ### H noch falsch */
  427.         addw _z80regs+4,%bx
  428.         adc $0,%ah
  429.         dispatch
  430.  
  431.         opcode (0x3a)        /* LD A,(nnnn) */
  432. op3a:           movzwl (%esi,%ebp),%edi
  433.         movb (%edi,%ebp),%al
  434.         incl %esi
  435.         incl %esi
  436.         dispatch
  437.  
  438.         opcode (0x3b)        /* DEC SP */
  439. op3b:           decw _z80regs+4
  440.         dispatch
  441.  
  442.         opcode (0x3c)        /* INC A */
  443. op3c:           inc8mac(%al)
  444.  
  445.         opcode (0x3d)        /* DEC A */
  446. op3d:           dec8mac(%al)
  447.  
  448.         opcode (0x3e)        /* LD A,nn */
  449. op3e:           movb (%esi,%ebp),%al
  450.         incl %esi
  451.         dispatch
  452.  
  453.         opcode (0x3f)        /* CCF */
  454. op3f:        andb $0xed,%ah
  455.         xorb $1,%ah        /*  ### H noch falsch */
  456.                     /* H sollte Wert des alten Carry haben */
  457.         dispatch
  458.  
  459. setincdec_386:  xchg %eax,%edi
  460.         lahf
  461.         seto %al
  462.         shlb $2,%al
  463.         andb $0xd0,%ah        /* S,Z,H */
  464.         orb %al,%ah
  465.         xorb %al,%al
  466.         orl %edi,%eax
  467.         dispatch
  468.  
  469. #include "loads.s"
  470.  
  471. setaddadc:      movl %eax,%edi
  472.                 lahf
  473.                 seto %al
  474.                 shlb $2,%al
  475.                 andb $0xd1,%ah
  476.                 orb %al,%ah
  477.                 andl $0x2ff,%edi
  478.                 xorb %al,%al
  479.                 orl %edi,%eax
  480.                 dispatch
  481.  
  482.         /* Opcodes 0xc0 - 0xff */
  483.  
  484.                 opcode (0xc1)        /* POP BC */
  485. opc1:        movl _z80regs+4,%edi
  486.                 movw (%edi,%ebp),%cx
  487.         jmp dopop
  488.  
  489.                 opcode (0xd1)        /* POP DE */
  490. opd1:        movl _z80regs+4,%edi
  491.                 movw (%edi,%ebp),%dx
  492.         jmp dopop
  493.  
  494.                 opcode (0xe1)        /* POP HL */
  495. ope1:        movl _z80regs+4,%edi
  496.                 movw (%edi,%ebp),%bx
  497.         jmp dopop
  498.  
  499.                 opcode (0xf1)        /* POP AF */
  500. opf1:        movl _z80regs+4,%edi
  501.                 movw (%edi,%ebp),%ax
  502.         xchg %al,%ah
  503.         jmp dopop
  504.  
  505.                 opcode (0xc3)        /* JP add16 */
  506. opc3:        movzwl (%ebp,%esi),%esi
  507.                 dispatch
  508.  
  509.                 opcode (0xc5)        /* PUSH BC */
  510. opc5:        movl _z80regs+4,%edi
  511.         decw %di
  512.         decw %di
  513.         movw %cx,(%ebp,%edi)
  514.         movl %edi,_z80regs+4
  515.         dispatch
  516.  
  517.                 opcode (0xd5)        /* PUSH DE */
  518. opd5:        movl _z80regs+4,%edi
  519.         decw %di
  520.         decw %di
  521.         movw %dx,(%ebp,%edi)
  522.         movl %edi,_z80regs+4
  523.         dispatch
  524.  
  525.                 opcode (0xe5)        /* PUSH HL */
  526. ope5:        movl _z80regs+4,%edi
  527.         decw %di
  528.         decw %di
  529.         movw %bx,(%ebp,%edi)
  530.         movl %edi,_z80regs+4
  531.         dispatch
  532.  
  533.                 opcode (0xf5)        /* PUSH AF */
  534. opf5:        movl _z80regs+4,%edi
  535.         decw %di
  536.         decw %di
  537.         xchg %al,%ah
  538.         movw %ax,(%ebp,%edi)
  539.         xchg %al,%ah
  540.         movl %edi,_z80regs+4
  541.         dispatch
  542.  
  543.  
  544.                 opcode (0xc7)        /* RST 00h */
  545. opc7:           xorl %edi,%edi
  546.                 jmp docall_di
  547.  
  548.                 opcode (0xc9)        /* RET */
  549. opc9:        movl _z80regs+4,%edi
  550.         movzwl (%ebp,%edi),%esi
  551. dopop:        incl %edi
  552.         incl %edi
  553.         movl %edi,_z80regs+4
  554.         dispatch
  555.  
  556.                 opcode (0xcd)        /* CALL add16 */
  557. opcd:        movzwl (%ebp,%esi),%edi
  558.           incl %esi
  559.         incl %esi
  560. docall_di:    /* push esi to stack (return address) */
  561.         pushl %edi
  562.         movl _z80regs+4,%edi
  563.         decw %di
  564.         decw %di
  565.         movw %si,(%ebp,%edi)
  566.         movl %edi,_z80regs+4
  567.         popl %esi
  568.         dispatch
  569.  
  570.                 opcode (0xc6)         /* ADD A,nn */
  571. opc6:           andb $0xd5,%ah
  572.                 addb (%esi,%ebp),%al
  573.                 jmp setaddadc2
  574.         
  575.                 opcode (0xce)        /* ADC A,nn */
  576. opce:           andb $0xd5,%ah
  577.                 sahf
  578.                 adcb (%ebp,%esi),%al
  579.                 jmp setaddadc2
  580.  
  581.                 opcode (0xd6)        /* SUB nn */
  582. opd6:           orb $2,%ah
  583.                 subb (%esi,%ebp),%al
  584.                 jmp setaddadc2
  585.  
  586.                 opcode (0xde)        /* SBC A,nn */
  587. opde:           orb $2,%ah
  588.                 sahf
  589.                 sbbb (%esi,%ebp),%al
  590.                 jmp setaddadc2
  591.  
  592.                 opcode (0xe6)         /* AND nn */
  593. ope6:           andb (%esi,%ebp),%al
  594.                 lahf
  595.                 incl %esi
  596.                 orb $0x10,%ah
  597.                 andb $0xd4,%ah
  598.         dispatch
  599.  
  600.                 opcode (0xee)        /* XOR nn */
  601. opee:           xorb (%esi,%ebp),%al
  602.                 lahf
  603.                 and $0xc4,%ah
  604.                 incl %esi
  605.                 dispatch
  606.  
  607.                 opcode (0xf6)          /* OR nn */
  608. opf6:           orb (%ebp,%esi),%al
  609.                 lahf
  610.                 incl %esi
  611.                 andb $0xc4,%ah
  612.                 dispatch
  613.  
  614.                 opcode (0xfe)        /* CP nn */
  615. opfe:           orb $2,%ah
  616.                 cmpb (%ebp,%esi),%al
  617.                 jmp setaddadc2
  618.  
  619.                 opcode (0xd9)        /* EXX */
  620. opd9:             xchgl %ecx,_z80regs+40
  621.                 xchgl %edx,_z80regs+44
  622.                 xchgl %ebx,_z80regs+48
  623.                 dispatch
  624.  
  625.                 opcode (0xe3)            /* EX (SP),HL */
  626. ope3:        movl _z80regs+4,%edi
  627.                 xchgw (%edi,%ebp),%bx
  628.             dispatch
  629.  
  630.                 opcode (0xe9)        /* JP (HL) */
  631. ope9:           movl %ebx,%esi
  632.                 dispatch
  633.  
  634.                 opcode (0xeb)        /* EX DE,HL */
  635. opeb:           xchgl %ebx,%edx
  636.                 dispatch
  637.  
  638.                 opcode (0xf3)        /* DI */
  639. opf3:           movl $0x101,_z80regs+56    /* only set Interrupt Flip-flops */
  640.                 dispatch
  641.  
  642.                 opcode (0xf9)        /* LD SP,HL */
  643. opf9:            movl %ebx,_z80regs+4
  644.                 dispatch
  645.  
  646.                 opcode (0xfb)        /* EI */
  647. opfb:           movl $0,_z80regs+56    /* only set Interrupt Flip-flops */
  648.         dispatch
  649.         
  650.                 opcode (0xed)        /* z80-commands */
  651. oped:        movzbl (%esi,%ebp),%edi
  652.         inc %esi
  653.         sall $2,%edi
  654.         jmp jumptab2(%edi)
  655.  
  656.                 opcode (0xcb)        /* z80 */
  657. opcb:        movzbl (%esi,%ebp),%edi
  658.         inc %esi
  659.         sall $2,%edi
  660.         pushl jumptab3(%edi)
  661.         movl %ebx,%edi        /* ordinary HL */
  662.         ret
  663.  
  664.                 opcode (0xcb)        /* z80 */
  665. ixcb:        GETIXOFF        /* IX + offset, offset before opcode!!! */
  666.         pushl %edi
  667.         movzbl (%esi,%ebp),%edi
  668.         inc %esi
  669.         sall $2,%edi
  670.         movl jumptab3(%edi),%edi
  671.         xchg %edi,(%esp)
  672.         ret
  673.  
  674.                 opcode (0xcb)        /* z80 */
  675. iycb:        GETIYOFF        /* IY + offset */
  676.         pushl %edi
  677.         movzbl (%esi,%ebp),%edi
  678.         inc %esi
  679.         sall $2,%edi
  680.         movl jumptab3(%edi),%edi
  681.         xchg %edi,(%esp)
  682.         ret
  683.  
  684. setaddadc2:     movl %eax,%edi
  685.                 lahf
  686.                 seto %al
  687.                 shlb $2,%al
  688.                 andb $0xd1,%ah
  689.                 orb %al,%ah
  690.                 andl $0x2ff,%edi
  691.                 xorb %al,%al
  692.                 orl %edi,%eax
  693.                 incl %esi
  694.                 dispatch
  695.  
  696. setbit:         xchg %eax,%edi
  697.                 lahf
  698.                 andl $0x4000,%eax
  699.                 orl $0x100,%eax
  700.                 andl $0xbdff,%edi
  701.                 orl %edi,%eax
  702.                 dispatch
  703.  
  704.  
  705. /* extended Z80-commands: ix, iy prefix */
  706.  
  707.         opcode (0xdd)
  708. opdd:        movzbl (%esi,%ebp),%edi
  709.         inc %esi
  710.         sall $2,%edi
  711.         jmp jumptabix(%edi)
  712.  
  713.         opcode (0xfd)
  714. opfd:        movzbl (%esi,%ebp),%edi
  715.         inc %esi
  716.         sall $2,%edi
  717.         jmp jumptabiy(%edi)
  718.  
  719. /* out command: if no hardware access allowed, or if port != 0x61, */
  720. /* trap this opcode and enter debugger */
  721.         opcode (0xd3)
  722. opd3:        movl _hardware_access,%edi
  723.         orl %edi,%edi
  724.         jz EXIT            /* trap => no access allowed */
  725.         xchgl %edx,%edi
  726.         xorl %edx,%edx
  727.         movb (%esi,%ebp),%dl    /* port */
  728.         cmpb $0x61,%dl
  729.         jnz EXIT        /* trap => not the speaker port */
  730.         pushl %eax
  731.         inc %esi
  732.         rolb $1,%al
  733.         andb $2,%al
  734.         movb %al,%ah
  735.         inb %dx,%al
  736.         andb $0xfc,%al
  737.         orb %ah,%al
  738.         outb %al,%dx
  739.         popl %eax
  740.         xchgl %edx,%edi
  741.         dispatch
  742.  
  743. set_SZV:    /* this code is used after the z80-rotate commands */
  744.         /* these set the s,z,p/v and carry flags, but the */
  745.         /* 80386 counterpart only affect the carry-flag, */
  746.         /* similar to the z80 rla command */
  747.         xchgl %edi,%eax
  748.         /* di is a copy of eax, carry-flag is set, al is data */
  749.         lahf        /* get c flag into ah */
  750.         orb %al,%al    /* set s,z,p/v flags */
  751.         movb %ah,%al    /* c => al */
  752.         lahf
  753.         andb $1,%al    /* c */
  754.         andb $0xc4,%ah
  755.         orb %al,%ah    /* ah = flags */
  756.         xorb %al,%al    /* al = 0 */
  757.         andl $0x28ff,%edi    /* preserve undocumented flags */
  758.         orl %edi,%eax    /* eax = A; flags H and N flags are zero */
  759.         dispatch
  760.  
  761. #include "codeix.s"
  762. #include "codeiy.s"
  763.