home *** CD-ROM | disk | FTP | other *** search
/ Dream 55 / Amiga_Dream_55.iso / RISCOS / MAGAZINE / NEWS / PCE021.ZIP / Pce021 / Src / cpu / s / arithmetic next >
Text File  |  1998-06-24  |  3KB  |  172 lines

  1. ;    arithmetic.s
  2. ;    ------------
  3. ;    Arithmetic opcodes
  4.  
  5.  
  6.     GET    hdr.common
  7.     GET    hdr.memory
  8.     GET    hdr.addressing
  9.  
  10.  
  11.     GBLS    data1
  12.     GBLS    data2
  13.     GBLS    byte
  14.  
  15.  
  16. ;    Add with carry
  17.     MACRO
  18.     m_adc    $reg
  19.     NEW    data1
  20.     NEW    data2
  21.     ROUT
  22.     tst    r_p, #D_FLAG
  23.     beq    %ft10                ; not decimal mode
  24.     tst    r_p, r_p, lsr #1        ; ARM C flag = Hu6280 C flag
  25.     and    $data1, r_a, #0x0f000000
  26.     mov    $data1, $data1, lsr #24
  27.     and    $data2, $reg, #0x0f000000
  28.     adc    $data1, $data1, $data2, lsr #24
  29.     cmp    $data1, #10
  30.     subcs    $data1, $data1, #10
  31.     mov    r_a, r_a, lsr #28
  32.     adc    $data2, r_a, $reg, lsr #28
  33.     cmp    $data2, #10
  34.     subcs    $data2, $data2, #10
  35.     bic    r_p, r_p, #N_FLAG + C_FLAG + Z_FLAG
  36.     orrcs    r_p, r_p, #C_FLAG
  37.     mov    r_a, $data2, lsl #28
  38.     orrs    r_a, r_a, $data1, lsl #24
  39.     orreq    r_p, r_p, #Z_FLAG
  40.     b    %ft20
  41. 10
  42.     tst    r_p, r_p, lsr #1        ; ARM C flag = Hu6280 C flag
  43.     mvn    r_a, r_a            ; r_a = NOT(r_a)
  44.     eor    r_a, r_a, #0xff000000        ; xxffffff so that carry is effective
  45.     adcs    r_a, r_a, $reg
  46.     bic    r_p, r_p, #N_FLAG + V_FLAG + Z_FLAG + C_FLAG
  47.     orrcs    r_p, r_p, #C_FLAG
  48.     orrvs    r_p, r_p, #V_FLAG
  49.     orrmi    r_p, r_p, #N_FLAG
  50.     andnes    r_a, r_a, #0xff000000
  51.     orreq    r_p, r_p, #Z_FLAG
  52. 20
  53.     DELETE    data1
  54.     DELETE    data2
  55.     MEND
  56.  
  57. ;    Subtract with carry
  58.     MACRO
  59.     m_sbc    $reg
  60.     NEW    data1
  61.     NEW    data2
  62.     ROUT
  63.     tst    r_p, #D_FLAG
  64.     beq    %ft10                ; not decimal mode
  65.     tst    r_p, r_p, lsr #1        ; ARM C flag = Hu6280 C flag
  66.     and    $data1, r_a, #0x0f000000
  67.     mov    $data1, $data1, lsr #24
  68.     and    $data2, $reg, #0x0f000000
  69.     sbcs    $data1, $data1, $data2, lsr #24
  70.     addcc    $data1, $data1, #10
  71.     mov    r_a, r_a, lsr #28
  72.     sbcs    $data2, r_a, $reg, lsr #28
  73.     addcc    $data2, $data2, #10
  74.     bic    r_p, r_p, #N_FLAG + C_FLAG + Z_FLAG
  75.     orrcs    r_p, r_p, #C_FLAG
  76.     mov    r_a, $data2, lsl #28
  77.     orrs    r_a, r_a, $data1, lsl #24
  78.     orreq    r_p, r_p, #Z_FLAG
  79.     b    %ft20
  80. 10
  81.     tst    r_p, r_p, lsr #1        ; ARM C flag = Hu6280 C flag
  82.     sbcs    r_a, r_a, $reg
  83.     bic    r_p, r_p, #N_FLAG + V_FLAG + Z_FLAG + C_FLAG
  84.     orrcs    r_p, r_p, #C_FLAG
  85.     orrvs    r_p, r_p, #V_FLAG
  86.     orrmi    r_p, r_p, #N_FLAG
  87.     andnes    r_a, r_a, #0xff000000
  88.     orreq    r_p, r_p, #Z_FLAG
  89. 20
  90.     DELETE    data1
  91.     DELETE    data2
  92.     MEND
  93.  
  94. ;    Increment byte by one
  95.     MACRO
  96.     m_inc    $reg
  97.     adds    $reg, $reg, #1 << 24
  98.     bic    r_p, r_p, #N_FLAG + Z_FLAG
  99.     orreq    r_p, r_p, #Z_FLAG
  100.     orrmi    r_p, r_p, #N_FLAG
  101.     MEND
  102. ;    Decrement byte by one
  103.     MACRO
  104.     m_dec    $reg
  105.     subs    $reg, $reg, #1 << 24
  106.     bic    r_p, r_p, #N_FLAG + Z_FLAG
  107.     orreq    r_p, r_p, #Z_FLAG
  108.     orrmi    r_p, r_p, #N_FLAG
  109.     MEND
  110.  
  111.  
  112.     AREA    |cpu$$opcodes|, CODE, READONLY
  113.  
  114.  
  115.     IMPORT    Read_Register
  116.     IMPORT    Write_Register
  117.     IMPORT    Next_Opcode
  118.  
  119.  
  120.     OPCODE_R adc, im, m_adc
  121.     OPCODE_R adc, zp, m_adc
  122.     OPCODE_R adc, zx, m_adc
  123.     OPCODE_R adc, in, m_adc
  124.     OPCODE_R adc, ix, m_adc
  125.     OPCODE_R adc, iy, m_adc
  126.     OPCODE_R adc, ab, m_adc
  127.     OPCODE_R adc, ax, m_adc
  128.     OPCODE_R adc, ay, m_adc
  129.  
  130.     OPCODE_R sbc, im, m_sbc
  131.     OPCODE_R sbc, zp, m_sbc
  132.     OPCODE_R sbc, zx, m_sbc
  133.     OPCODE_R sbc, in, m_sbc
  134.     OPCODE_R sbc, ix, m_sbc
  135.     OPCODE_R sbc, iy, m_sbc
  136.     OPCODE_R sbc, ab, m_sbc
  137.     OPCODE_R sbc, ax, m_sbc
  138.     OPCODE_R sbc, ay, m_sbc
  139.  
  140.     OPCODE_RW inc, zp, m_inc
  141.     OPCODE_RW inc, zx, m_inc
  142.     OPCODE_RW inc, ab, m_inc
  143.     OPCODE_RW inc, ax, m_inc
  144.     DEF_OPCODE inc_rg
  145.     m_inc    r_a
  146.     END_OPCODE
  147.  
  148.     OPCODE_RW dec, zp, m_dec
  149.     OPCODE_RW dec, zx, m_dec
  150.     OPCODE_RW dec, ab, m_dec
  151.     OPCODE_RW dec, ax, m_dec
  152.     DEF_OPCODE dec_rg
  153.     m_dec    r_a
  154.     END_OPCODE
  155.  
  156.     DEF_OPCODE inx_rg
  157.     m_inc    r_x
  158.     END_OPCODE
  159.     DEF_OPCODE dex_rg
  160.     m_dec    r_x
  161.     END_OPCODE
  162.  
  163.     DEF_OPCODE iny_rg
  164.     m_inc    r_y
  165.     END_OPCODE
  166.     DEF_OPCODE dey_rg
  167.     m_dec    r_y
  168.     END_OPCODE
  169.  
  170.  
  171.     END
  172.