home *** CD-ROM | disk | FTP | other *** search
/ Dream 55 / Amiga_Dream_55.iso / RISCOS / MAGAZINE / NEWS / PCE021.ZIP / Pce021 / Src / cpu / s / branches < prev    next >
Text File  |  1998-02-28  |  3KB  |  192 lines

  1. ;    branches.s
  2. ;    ----------
  3. ;    Branches and other PC altering opcodes
  4.  
  5.  
  6.     GET    hdr.common
  7.     GET    hdr.memory
  8.     GET    hdr.addressing
  9.  
  10.  
  11.     GBLS    offset
  12.     GBLS    brk_val
  13.     GBLS    r_p_temp
  14.  
  15.  
  16. ;    Jump relative to PC
  17.     MACRO
  18.     m_jr
  19.     NEW    offset
  20.     read_byte_fast $offset
  21.     sub    timer, timer, #1 << 16
  22.     add    r_pc, r_pc, $offset, asr #8
  23.     DELETE    offset
  24.     MEND
  25.  
  26. ;    Branch on bit reset
  27.     MACRO
  28.     m_bbri    $bbri_bit, $bbri_byte
  29.     tst    $bbri_byte, #(1 << $bbri_bit) << 24
  30.     addne    r_pc, r_pc, #1 << 16
  31.     bne    Next_Opcode
  32.     m_jr
  33.     MEND
  34. ;    Branch on bit set
  35.     MACRO
  36.     m_bbsi    $bbsi_bit, $bbsi_byte
  37.     tst    $bbsi_byte, #(1 << $bbsi_bit) << 24
  38.     addeq    r_pc, r_pc, #1 << 16
  39.     beq    Next_Opcode
  40.     m_jr
  41.     MEND
  42.  
  43. ;    Branch on flag reset
  44.     MACRO
  45.     m_br    $br_flag
  46.     tst    r_p, #$br_flag
  47.     addne    r_pc, r_pc, #1 << 16
  48.     bne    Next_Opcode
  49.     m_jr
  50.     MEND
  51. ;    Branch on flag set
  52.     MACRO
  53.     m_bs    $bs_flag
  54.     tst    r_p, #$bs_flag
  55.     addeq    r_pc, r_pc, #1 << 16
  56.     beq    Next_Opcode
  57.     m_jr
  58.     MEND
  59.  
  60.  
  61.     AREA    |cpu$$opcodes|, CODE, READONLY
  62.  
  63.  
  64.     IMPORT    Next_Opcode
  65.  
  66.  
  67.     OPCODE_R bbr0, zp, "m_bbri 0,"
  68.     OPCODE_R bbr1, zp, "m_bbri 1,"
  69.     OPCODE_R bbr2, zp, "m_bbri 2,"
  70.     OPCODE_R bbr3, zp, "m_bbri 3,"
  71.     OPCODE_R bbr4, zp, "m_bbri 4,"
  72.     OPCODE_R bbr5, zp, "m_bbri 5,"
  73.     OPCODE_R bbr6, zp, "m_bbri 6,"
  74.     OPCODE_R bbr7, zp, "m_bbri 7,"
  75.  
  76.     OPCODE_R bbs0, zp, "m_bbsi 0,"
  77.     OPCODE_R bbs1, zp, "m_bbsi 1,"
  78.     OPCODE_R bbs2, zp, "m_bbsi 2,"
  79.     OPCODE_R bbs3, zp, "m_bbsi 3,"
  80.     OPCODE_R bbs4, zp, "m_bbsi 4,"
  81.     OPCODE_R bbs5, zp, "m_bbsi 5,"
  82.     OPCODE_R bbs6, zp, "m_bbsi 6,"
  83.     OPCODE_R bbs7, zp, "m_bbsi 7,"
  84.  
  85.     DEF_OPCODE bcs_rg
  86.     m_bs    C_FLAG
  87.     END_OPCODE
  88.     DEF_OPCODE beq_rg
  89.     m_bs    Z_FLAG
  90.     END_OPCODE
  91.     DEF_OPCODE bvs_rg
  92.     m_bs    V_FLAG
  93.     END_OPCODE
  94.     DEF_OPCODE bmi_rg
  95.     m_bs    N_FLAG
  96.     END_OPCODE
  97.     DEF_OPCODE bcc_rg
  98.     m_br    C_FLAG
  99.     END_OPCODE
  100.     DEF_OPCODE bne_rg
  101.     m_br    Z_FLAG
  102.     END_OPCODE
  103.     DEF_OPCODE bvc_rg
  104.     m_br    V_FLAG
  105.     END_OPCODE
  106.     DEF_OPCODE bpl_rg
  107.     m_br    N_FLAG
  108.     END_OPCODE
  109.     DEF_OPCODE bra_rg
  110.     m_jr
  111.     END_OPCODE
  112.  
  113.  
  114. ;    N.B. A BRK instruction cannot be disabled by setting the interrupt disable flag
  115.     DEF_OPCODE brk
  116.     add    r_pc, r_pc, #1 << 16
  117.     write_word_sp r_pc
  118.     write_byte_sp r_p
  119.     NEW    offset
  120.     ldr    $offset, [rmemory, #7 * 4]
  121.     bic    r_p, r_p, #D_FLAG
  122.     add    $offset, $offset, #0xff00
  123.     orr    r_p, r_p, #I_FLAG + B_FLAG            ; disable interrupts, set BRK flag
  124.     bic    r_p, r_p, #0x80 << 16                ; (and hence, clear internal IRQ enable bit)
  125.     ldrb    r_pc, [$offset, #0xf6]
  126.     ldrb    $offset, [$offset, #0xf7]
  127.     mov    r_pc, r_pc, lsl #16
  128.     add    r_pc, r_pc, $offset, lsl #24
  129.     DELETE    offset
  130.     END_OPCODE
  131.  
  132.     DEF_OPCODE bsr
  133.     write_word_sp r_pc
  134.     m_jr
  135.     END_OPCODE
  136.  
  137.  
  138.     DEF_OPCODE jmp_ab
  139.     NEW    offset
  140.     read_word_fast $offset
  141.     mov    r_pc, $offset
  142.     DELETE    offset
  143.     END_OPCODE
  144.  
  145.     DEF_OPCODE jmp_in
  146.     NEW    offset
  147.     read_word_fast $offset
  148.     read_word r_pc, $offset
  149.     DELETE    offset
  150.     END_OPCODE
  151.  
  152.     DEF_OPCODE jmp_ix
  153.     NEW    offset
  154.     read_word_fast $offset
  155.     add    $offset, $offset, r_x, lsr #8
  156.     read_word r_pc, $offset
  157.     DELETE    offset
  158.     END_OPCODE
  159.  
  160.  
  161.     DEF_OPCODE jsr
  162.     NEW    offset
  163.     read_word_fast $offset
  164.     sub    r_pc, r_pc, #1 << 16
  165.     write_word_sp r_pc
  166.     mov    r_pc, $offset
  167.     DELETE    offset
  168.     END_OPCODE
  169.  
  170.  
  171.     DEF_OPCODE rti
  172.     NEW    r_p_temp
  173.     read_byte_sp $r_p_temp
  174.     bic    r_p, r_p, #0xff
  175.     orr    r_p, r_p, $r_p_temp
  176.     bic    r_p, r_p, #T_FLAG        ; *****
  177.     read_word_sp r_pc
  178.     tst    r_p, #I_FLAG                ; check restored I_FLAG
  179.     orreq    r_p, r_p, #0x80 << 16
  180.     bicne    r_p, r_p, #0x80 << 16            ; update internal IRQ enable bit
  181.     add    r_pc, r_pc, #1 << 16
  182.     DELETE    r_p_temp
  183.     END_OPCODE
  184.  
  185.     DEF_OPCODE rts
  186.     read_word_sp r_pc
  187.     add    r_pc, r_pc, #1 << 16
  188.     END_OPCODE
  189.  
  190.  
  191.     END
  192.