home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / Libraries / Z80 emulator / 68K version / cmd_DAA.c < prev    next >
Encoding:
Text File  |  1995-11-01  |  6.0 KB  |  309 lines  |  [TEXT/CWIE]

  1.  
  2. //    Emulation des DAA-Befehls
  3. //    ------------------------
  4.  
  5. cmd_daa:
  6.  
  7.     do_info_daa
  8.  
  9. // check for (ir+n) operand
  10.     move.b    -4(ip),d0
  11.     cmp.b    #0xFD,d0
  12.     beq.s    daaIY
  13.     cmp.b    #0xDD,d0
  14.     bne.s    daa00
  15. // possibly (IX+n)
  16.     move.b    -2(ip),core    // offset
  17.     ext.w    core
  18.     add.w    IX,core
  19.     bra.s    daaXY
  20. // possibly (IY+n)
  21. daaIY:    move.b    -2(ip),core    // offset
  22.     ext.w    core
  23.     add.w    IY,core
  24. daaXY:    move.l    core,a0
  25.     move.b    (a0),db        // operand of (ir+n) operation
  26.     move.b    -3(ip),d0        // (hl) opcode
  27.     cmp.b    #0x86,d0
  28.     beq    add_daa        // add a,(ir+n)
  29.     cmp.b    #0x8E,d0
  30.     beq    adc_daa        // adc a,(ir+n)
  31.     cmp.b    #0x96,d0
  32.     beq    sub_daa        // sub a,(ir+n)
  33.     cmp.b    #0x9E,d0
  34.     beq    sbc_daa        // sbc a,(ir+n)
  35. //    bra    daa00        // invane...
  36.  
  37.  
  38. // get previous instruction and do first opcode check
  39. daa00:    move.b    -2(ip),db        // previous instr. / operand of prev. instr.
  40.     bpl.s    daa30        // 0x00....0x7F:  neg,cpl,inc,dec only
  41.     cmp.b    #0xa0,db
  42.     bge    daaXX        // 0xA0....0xFF: no apropriate instructions
  43.  
  44. // perform DAA correction on previous instruction
  45.     sub.b    #0x80,db    
  46. //    lea    daa_tab(db.l*2),a0
  47.     lea    daa_tab(db.l),a0
  48.     adda.l    db,a0
  49.     adda.w    (a0),a0
  50.     jmp    (a0)
  51.     
  52. daa_tab:    dc.w    daa80,    daa81,    daa82,    daa83,    daa84,    daa85,    daa86,    daa87
  53.     dc.w    daa88,    daa89,    daa8a,    daa8b,    daa8c,    daa8d,    daa8e,    daa8f
  54.     dc.w    daa90,    daa91,    daa92,    daa93,    daa94,    daa95,    daa96,    daa97
  55.     dc.w    daa98,    daa99,    daa9a,    daa9b,    daa9c,    daa9d,    daa9e,    daa9f
  56.     
  57.  
  58. // -----    neg a  •  cpl a  •  inc a  •  dec a -------------------------------------------
  59. //    separate dispatcher to save space ...
  60.  
  61. daa30:    cmp.b    #0x2f,db
  62.     beq.s    daa2f
  63.     cmp.b    #0x3c,db
  64.     beq.s    daa3c
  65.     cmp.b    #0x3d,db
  66.     beq.s    daa3d
  67.     cmp.b    #0x44,db
  68.     beq.s    daa44
  69. //    bra    daaXX
  70.  
  71.  
  72. // -----    No proper instruction code at location ip-2 --------------------------------
  73. //    assume it's an operand to instruction at location ip-3
  74.  
  75. daaXX:    move.b    -3(ip),d0        // get opcode
  76.     move.b    -2(ip),db        // operand
  77.     cmp.b    #0xC6,d0
  78.     beq    add_daa        // add a,n
  79.     cmp.b    #0xCE,d0
  80.     beq    adc_daa        // adc a,n
  81.     cmp.b    #0xD6,d0
  82.     beq    sub_daa        // sub a,n
  83.     cmp.b    #0xDE,d0
  84.     beq    sbc_daa        // sbc a,n
  85.     bra    exit_illinstr1    // unable to perform DAA correction!
  86.  
  87.  
  88. daa2f:    // cpl a
  89.     not.b    a        // zurück
  90.     moveq    #1,d0
  91.     lsr    #1,d0        // Z setzen, X setzen
  92.     nbcd.b    a        //  BCD operation durchführen
  93.     bra.s    daaxit
  94.     
  95. daa3c:    //  inc a        
  96.     subq.b    #1,a        // zurück
  97.     moveq    #1,d1        // BCD: 1
  98.     sub    d0,d0        // clear Z und X
  99.     abcd.b    d1,a        // BCD Operation
  100.     bra.s    daaxit
  101.     
  102. daa3d:    //  dec a        
  103.     addq.b    #1,a        // zurück
  104.     moveq    #1,d1        // BCD: 1
  105.     sub    d0,d0        // clear Z und X
  106.     sbcd.b    d1,a        // BCD Operation
  107.     bra.s    daaxit
  108.  
  109. daa44:    //  0xED44:  neg a
  110.     cmp.b    #0xED,-3(ip)
  111.     bne.s    daaXX
  112.     neg.b    a        //  binär operation rückgängig machen
  113.     sub    d0,d0        //  Z setzen, X löschen
  114.     nbcd.b    a        //  BCD operation durchführen
  115.     bra.s    daaxit
  116.  
  117.  
  118. // -----    add a,r -------------------------------------------------------
  119. //     Das Register wird wieder abgezogen und dann mit abcd addiert
  120.     
  121. daa80:    // add a,b        
  122.     move.b    RB,db
  123. add_daa:    sub.b    db,a        // zurück
  124.     sub    d0,d0        // clear Z und X
  125.     abcd.b    db,a        // BCD again
  126. // exit with flag register update
  127. daaxit:    move    ccr,f        // flags from last operation
  128. daaxit2:    bclr    #1,f        // assume: PO
  129.     btst    #1,(logflags,a.w)
  130.     beq    nxtcmnd        // PO
  131.     bset    #1,f        // PE
  132.     m_next
  133.         
  134. daa81:    // add a,c
  135.     move.b    RC,db
  136.     bra.s    add_daa
  137.     
  138. daa82:    // add a,d
  139.     move.b    RD,db
  140.     bra.s    add_daa
  141.     
  142. daa83:    // add a,e
  143.     move.b    RE,db
  144.     bra.s    add_daa
  145.     
  146. daa84:    // add a,h
  147.     move.b    RH,db
  148.     bra.s    add_daa
  149.     
  150. daa85:    // add a,l
  151.     move.b    RL,db
  152.     bra.s    add_daa
  153.     
  154. daa86:    // add a,(hl)
  155.     movea.l    AHL,a0
  156.     move.b    (a0),db
  157.     bra.s    add_daa
  158.     
  159. daa87:    // add a,a
  160.     lsr.b    #1,f        // altes Bit 7 -> X
  161.     roxr.b    #1,a        // X -> Bit 7 
  162.     sub    d0,d0        // Z setzen, X löschen
  163.     abcd.b    a,a        // BCD again
  164.     bra.s    daaxit
  165.  
  166.  
  167. // -----    adc a,r  -----------------------------------------------------
  168. //    Das Register wird wieder subtrahiert und nachher mit abcd erneut addiert
  169. //    Falls die untere Ziffer von Register a nicht $0 ist, wird dazu vorher
  170. //    Register a decrementiert und das X Flag gesetzt
  171.  
  172. daa88:    // adc a,b
  173.     move.b    RB,db
  174. adc_daa:    sub.b    db,a
  175.     moveq    #0x0f,d0
  176.     and.b    a,d0        // lower digit
  177.     beq.s    adc0        // ziffer ist 0 -> don't dec & no CY
  178.     subq.b    #1,a        // dec a
  179.     moveq    #1,d0        // -> set CY
  180. adc0:    lsr.b    #1,d0        // Z setzen, X setzen/löschen
  181.     abcd.b    db,a        // BCD again
  182.     bra.s    daaxit
  183.     
  184. daa89:    // adc a,c
  185.     move.b    RC,db
  186.     bra.s    adc_daa
  187.     
  188. daa8a:    // adc a,d
  189.     move.b    RC,db
  190.     bra.s    adc_daa
  191.     
  192. daa8b:    // adc a,e
  193.     move.b    RC,db
  194.     bra.s    adc_daa
  195.     
  196. daa8c:    // adc a,h
  197.     move.b    RC,db
  198.     bra.s    adc_daa
  199.     
  200. daa8d:    // adc a,l
  201.     move.b    RC,db
  202.     bra.s    adc_daa
  203.     
  204. daa8e:    // adc a,(hl)
  205.     movea.l    AHL,a0
  206.     move.b    (a0),db
  207.     bra.s    adc_daa
  208.     
  209. daa8f:    // adc a,a
  210.     lsr.b    #1,f        // altes Bit 7 -> X
  211.     roxr.b    #1,a        // X -> Bit 7   und   Bit 0 == altes CY -> X
  212.     cmp    d0,d0        // Z setzen und X bewahren
  213.     abcd.b    a,a        // BCD again
  214.     bra    daaxit
  215.  
  216.  
  217. // -----    sub a,r  ----------------------------------------------------
  218. //    Das Register wird wieder addiert und dann mit sbcd subtrahiert
  219.     
  220. daa90:    // sub a,b
  221.     move.b    RB,db
  222. sub_daa:    add.b    db,a        // zurück
  223.     sub    d0,d0        // clear Z und X
  224.     sbcd.b    db,a        // BCD again
  225.     bra    daaxit
  226.     
  227. daa91:    // sub a,c
  228.     move.b    RC,db
  229.     bra.s    sub_daa
  230.     
  231. daa92:    // sub a,d
  232.     move.b    RD,db
  233.     bra.s    sub_daa
  234.     
  235. daa93:    // sub a,e
  236.     move.b    RE,db
  237.     bra.s    sub_daa
  238.     
  239. daa94:    // sub a,h
  240.     move.b    RH,db
  241.     bra.s    sub_daa
  242.     
  243. daa95:    // sub a,l
  244.     move.b    RL,db
  245.     bra.s    sub_daa
  246.     
  247. daa96:    // sub a,(hl)
  248.     movea.l    AHL,a0
  249.     move.b    (a0),db
  250.     bra.s    sub_daa
  251.     
  252. daa97:    // sub a,a
  253.     bra    daaxit2        // macht keinen unterschied !
  254.  
  255.  
  256. // -----    sbc a,r  ----------------------------------------------------
  257. //    Das Register wird wieder addiert und dann mit sbcd subtrahiert
  258.  
  259. daa98:    // sbc a,b
  260.     move.b    RB,db
  261. sbc_daa:    add.b    db,a        // zurück
  262.     moveq    #0x0f,d0
  263.     and.b    a,d0
  264.     beq.s    sbc0        // SBCD mit CY=1
  265.     moveq    #0,d0
  266.     bra.s    sbc1        // SBCD mit CY=0        
  267. sbc0:    addq.b    #1,a    
  268.     moveq    #1,d0
  269. sbc1:    lsr.b    #1,d0        // Z setzen und X setzen/löschen
  270.     sbcd    db,a
  271.     bra    daaxit
  272.  
  273. daa99:    // sbc a,c
  274.     move.b    RC,db
  275.     bra.s    sbc_daa
  276.     
  277. daa9a:    // sbc a,d
  278.     move.b    RD,db
  279.     bra.s    sbc_daa
  280.     
  281. daa9b:    // sbc a,e
  282.     move.b    RE,db
  283.     bra.s    sbc_daa
  284.     
  285. daa9c:    // sbc a,h
  286.     move.b    RH,db
  287.     bra.s    sbc_daa
  288.     
  289. daa9d:    // sbc a,l
  290.     move.b    RL,db
  291.     bra.s    sbc_daa
  292.     
  293. daa9e:    // sbc a,(hl)
  294.     movea.l    AHL,a0
  295.     move.b    (a0),db
  296.     bra.s    sbc_daa
  297.     
  298. daa9f:    // sbc a,a
  299.     tst.b    a
  300.     beq    daaxit2        // null ist null
  301.     move.b    #0x99,a
  302.     bra    daaxit
  303.  
  304.  
  305.  
  306.  
  307.  
  308.  
  309.