ack/mach/mantra/int/mloop1
1984-07-23 11:49:00 +00:00

365 lines
14 KiB
Plaintext

!-------------------------------------------------------------------------------
! Main loop of the interpreter starts here
!----------------------------------------------------------------------------
loop: move.l #0,d0
move.b (a3)+,d0 !opcode in d0
add.w d0,d0 !opcode to index in table
add.w d0,d0
#if prof
move.l profile,a0
lea timeinf,a5
move.l 0(a5,d0),d1 !get operation time
add.l d1,(a0)
#endif
#if opfreq
lea counttab,a5
add.l #1,0(a5,d0)
#endif
jmp dispat(pc,d0) !jump to branch to the operation
!---------------------------------------------------------------------------
! the BRANCH LIST follows
!--------------------------------------------------------------------------
dispat:
bra loc_0 ; bra loc_1 ; bra loc_2 ; bra loc_3
bra loc_4 ; bra loc_5 ; bra loc_6 ; bra loc_7
bra loc_8 ; bra loc_9 ; bra loc_10 ; bra loc_11
bra loc_12 ; bra loc_13 ; bra loc_14 ; bra loc_15
bra loc_16 ; bra loc_17 ; bra loc_18 ; bra loc_19
bra loc_20 ; bra loc_21 ; bra loc_22 ; bra loc_23
bra loc_24 ; bra loc_25 ; bra loc_26 ; bra loc_27
bra loc_28 ; bra loc_29 ; bra loc_30 ; bra loc_31
bra loc_32 ; bra loc_33 ; bra aar_1W ; bra adf_s0
bra adi_1W ; bra adi_2W ; bra adp_l ; bra adp_1
bra adp_2 ; bra adp_s0 ; bra adp_s_1 ; bra ads_1W
bra and_1W ; bra asp_1W ; bra asp_2W ; bra asp_3W
bra asp_4W ; bra asp_5W ; bra asp_w0 ; bra beq_l
bra beq_s0 ; bra bge_s0 ; bra bgt_s0 ; bra ble_s0
bra blm_s0 ; bra blt_s0 ; bra bne_s0 ; bra bra_l
bra bra_s_1 ; bra bra_s_2 ; bra bra_s0 ; bra bra_s1
bra cal_1 ; bra cal_2 ; bra cal_3 ; bra cal_4
bra cal_5 ; bra cal_6 ; bra cal_7 ; bra cal_8
bra cal_9 ; bra cal_10 ; bra cal_11 ; bra cal_12
bra cal_13 ; bra cal_14 ; bra cal_15 ; bra cal_16
bra cal_17 ; bra cal_18 ; bra cal_19 ; bra cal_20
bra cal_21 ; bra cal_22 ; bra cal_23 ; bra cal_24
bra cal_25 ; bra cal_26 ; bra cal_27 ; bra cal_28
bra cal_s0 ; bra cff_z ; bra cif_z ; bra cii_z
bra cmf_s0 ; bra cmi_1W ; bra cmi_2W ; bra cmp_z
bra cms_s0 ; bra csa_1W ; bra csb_1W ; bra dec_z
bra dee_w0 ; bra del_w_1 ; bra dup_1W ; bra dvf_s0
bra dvi_1W ; bra fil_l ; bra inc_z ; bra ine_lw
bra ine_w0 ; bra inl__1W ; bra inl__2W ; bra inl__3W
bra inl_w_1 ; bra inn_s0 ; bra ior_1W ; bra ior_s0
bra lae_l ; bra lae_w0 ; bra lae_w1 ; bra lae_w2
bra lae_w3 ; bra lae_w4 ; bra lae_w5 ; bra lae_w6
bra lal_p ; bra lal_n ; bra lal_0 ; bra lal__1
bra lal_w0 ; bra lal_w_1 ; bra lal_w_2 ; bra lar_1W
bra ldc_0 ; bra lde_lw ; bra lde_w0 ; bra ldl_0
bra ldl_w_1 ; bra lfr_1W ; bra lfr_2W ; bra lfr_s0
bra lil_w_1 ; bra lil_w0 ; bra lil_0 ; bra lil_1W
bra lin_l ; bra lin_s0 ; bra lni_z ; bra loc_l
bra loc__1 ; bra loc_s0 ; bra loc_s_1 ; bra loe_lw
bra loe_w0 ; bra loe_w1 ; bra loe_w2 ; bra loe_w3
bra loe_w4 ; bra lof_l ; bra lof_1W ; bra lof_2W
bra lof_3W ; bra lof_4W ; bra lof_s0 ; bra loi_l
bra loi_1 ; bra loi_1W ; bra loi_2W ; bra loi_3W
bra loi_4W ; bra loi_s0 ; bra lol_pw ; bra lol_nw
bra lol_0 ; bra lol_1W ; bra lol_2W ; bra lol_3W
bra lol__1W ; bra lol__2W ; bra lol__3W ; bra lol__4W
bra lol__5W ; bra lol__6W ; bra lol__7W ; bra lol__8W
bra lol_w0 ; bra lol_w_1 ; bra lxa_1 ; bra lxl_1
bra lxl_2 ; bra mlf_s0 ; bra mli_1W ; bra mli_2W
bra rck_1W ; bra ret_0 ; bra ret_1W ; bra ret_s0
bra rmi_1W ; bra sar_1W ; bra sbf_s0 ; bra sbi_1W
bra sbi_2W ; bra sdl_w_1 ; bra set_s0 ; bra sil_w_1
bra sil_w0 ; bra sli_1W ; bra ste_lw ; bra ste_w0
bra ste_w1 ; bra ste_w2 ; bra stf_l ; bra stf_1W
bra stf_2W ; bra stf_s0 ; bra sti_1 ; bra sti_1W
bra sti_2W ; bra sti_3W ; bra sti_4W ; bra sti_s0
bra stl_pw ; bra stl_nw ; bra stl_0 ; bra stl_1W
bra stl__1W ; bra stl__2W ; bra stl__3W ; bra stl__4W
bra stl__5W ; bra stl_w_1 ; bra teq_z ; bra tgt_z
bra tlt_z ; bra tne_z ; bra zeq_l ; bra zeq_s0
bra zeq_s1 ; bra zer_s0 ; bra zge_s0 ; bra zgt_s0
bra zle_s0 ; bra zlt_s0 ; bra zne_s0 ; bra zne_s_1
bra zre_lw ; bra zre_w0 ; bra zrl__1W ; bra zrl__2W
bra zrl_w_1 ; bra zrl_nw
.errnz .-dispat-1016
!-----------------------------------------------------------------------------
! Two byte opcodes come here for decoding of second byte
!----------------------------------------------------------------------------
escape1:
move.l #0,d0
bra 1f
bra escape2
1: move.b (a3)+,d0 !second byte ,extended opcode
add.w d0,d0 !make index of address
add.w d0,d0
cmp.w #640,d0 !check for range
bhi e_illins !jump to ill instruction procedure
#if prof
lea timeinf1,a5
move.l 0(a5,d0),d1
add.l d1,(a0)
#endif
#if opfreq
lea counttab+1024,a5
add.l #1,0(a5,d0)
#endif
jmp dispae1(pc,d0) !jump to the operation
!------------------------------------------------------------------------------
! now dispatch table for escaped opcodes
!------------------------------------------------------------------------------
dispae1: !dispatch escaped opcodes 1
bra aar_l ; bra aar_z ; bra adf_l ; bra adf_z
bra adi_l ; bra adi_z ; bra ads_l ; bra ads_z
bra adu_l ; bra adu_z ; bra and_l ; bra and_z
bra asp_lw ; bra ass_l ; bra ass_z ; bra bge_l
bra bgt_l ; bra ble_l ; bra blm_l ; bra bls_l
bra bls_z ; bra blt_l ; bra bne_l ; bra cai_z
bra cal_l ; bra cfi_z ; bra cfu_z ; bra ciu_z
bra cmf_l ; bra cmf_z ; bra cmi_l ; bra cmi_z
bra cms_l ; bra cms_z ; bra cmu_l ; bra cmu_z
bra com_l ; bra com_z ; bra csa_l ; bra csa_z
bra csb_l ; bra csb_z ; bra cuf_z ; bra cui_z
bra cuu_z ; bra dee_lw ; bra del_pw ; bra del_nw
bra dup_l ; bra dus_l ; bra dus_z ; bra dvf_l
bra dvf_z ; bra dvi_l ; bra dvi_z ; bra dvu_l
bra dvu_z ; bra fef_l ; bra fef_z ; bra fif_l
bra fif_z ; bra inl_pw ; bra inl_nw ; bra inn_l
bra inn_z ; bra ior_l ; bra ior_z ; bra lar_l
bra lar_z ; bra ldc_l ; bra ldf_l ; bra ldl_pw
bra ldl_nw ; bra lfr_l ; bra lil_pw ; bra lil_nw
bra lim_z ; bra los_l ; bra los_z ; bra lor_s0
bra lpi_l ; bra lxa_l ; bra lxl_l ; bra mlf_l
bra mlf_z ; bra mli_l ; bra mli_z ; bra mlu_l
bra mlu_z ; bra mon_z ; bra ngf_l ; bra ngf_z
bra ngi_l ; bra ngi_z ; bra nop_z ; bra rck_l
bra rck_z ; bra ret_l ; bra rmi_l ; bra rmi_z
bra rmu_l ; bra rmu_z ; bra rol_l ; bra rol_z
bra ror_l ; bra ror_z ; bra rtt_z ; bra sar_l
bra sar_z ; bra sbf_l ; bra sbf_z ; bra sbi_l
bra sbi_z ; bra sbs_l ; bra sbs_z ; bra sbu_l
bra sbu_z ; bra sde_l ; bra sdf_l ; bra sdl_pw
bra sdl_nw ; bra set_l ; bra set_z ; bra sig_z
bra sil_pw ; bra sil_nw ; bra sim_z ; bra sli_l
bra sli_z ; bra slu_l ; bra slu_z ; bra sri_l
bra sri_z ; bra sru_l ; bra sru_z ; bra sti_l
bra sts_l ; bra sts_z ; bra str_s0 ; bra tge_z
bra tle_z ; bra trp_z ; bra xor_l ; bra xor_z
bra zer_l ; bra zer_z ; bra zge_l ; bra zgt_l
bra zle_l ; bra zlt_l ; bra zne_l ; bra zrf_l
bra zrf_z ; bra zrl_pw ; bra dch_z ; bra exg_s0
bra exg_l ; bra exg_z ; bra lpb_z ; bra gto_l
.errnz .-dispae1-640
!----------------------------------------------------------------------------
escape2:
move.l #0,d0
move.b (a3)+,d0 !opcode
sub.l #4,sp
move.b (a3)+,(sp)
move.b (a3)+,1(sp)
move.b (a3)+,2(sp)
move.b (a3)+,3(sp)
add.w d0,d0
add.w d0,d0
cmp.w #220,d0
bhi e_illins
#if prof
lea timeinf2,a5
move.l 0(a5,d0),d1
add.l d1,(a0)
#endif
#if opfreq
lea counttab+1664,a5
add.l #1,0(a5,d0)
#endif
jmp dispae2(pc,d0)
!---------------------------------------------------------------------------
! BRANCH TABLE FOR SECOND ESCAPED OPCODES
!---------------------------------------------------------------------------
dispae2:
bra ldc_q ; bra lae_q ; bra lal_qp ; bra lal_qn
bra lde_qw ; bra ldf_q ; bra ldl_qpw ; bra ldl_qnw
bra lil_qpw ; bra lil_qnw ; bra loc_q ; bra loe_qw
bra lof_q ; bra lol_qpw ; bra lol_qnw ; bra lpi_q
bra adp_q ; bra asp_qw ; bra beq_q ; bra bge_q
bra bgt_q ; bra ble_q ; bra blm_q ; bra blt_q
bra bne_q ; bra bra_q ; bra cal_q ; bra dee_qw
bra del_qpw ; bra del_qnw ; bra fil_q ; bra gto_q
bra ine_qw ; bra inl_qpw ; bra inl_qnw ; bra lin_q
bra sde_q ; bra sdf_q ; bra sdl_qpw ; bra sdl_qnw
bra sil_qpw ; bra sil_qnw ; bra ste_qw ; bra stf_q
bra stl_qpw ; bra stl_qnw ; bra zeq_q ; bra zge_q
bra zgt_q ; bra zle_q ; bra zlt_q ; bra zne_q
bra zre_qw ; bra zrl_qpw ; bra zrl_qnw
.errnz .-dispae2-220
!------------------------------------------------------------------------------
! timeinf tables, first the unescaped opcodes
! these tables are parallel to the tables dispat , dispae1 and dispae2
! Each entry contains a reasonable estimate of
! the number of processor state cycles needed to
! execute that instruction. The exact amount cannot be
! supplied, since this can depend rather heavily on the
! size of the object in set, array case instructions etc.
! The table timeinf also contains, added to each entry,
! the number of processor state cycles needed to find the instruction.
! This number is currently 22.Also the number of processor state
! cycles to return from the instruction is included.
! The number is computed for
! the case that all check and runinf options are off.
!------------------------------------------------------------------------------
#if prof
.data
timeinf:
.long 33 ; .long 35 ; .long 35 ; .long 35
.long 35 ; .long 35 ; .long 35 ; .long 35
.long 35 ; .long 35 ; .long 35 ; .long 35
.long 35 ; .long 35 ; .long 35 ; .long 35
.long 35 ; .long 35 ; .long 35 ; .long 35
.long 35 ; .long 35 ; .long 35 ; .long 35
.long 35 ; .long 35 ; .long 35 ; .long 35
.long 35 ; .long 35 ; .long 35 ; .long 35
.long 35 ; .long 35 ; .long 127 ; .long 00
.long 36 ; .long 42 ; .long 56 ; .long 40
.long 40 ; .long 42 ; .long 42 ; .long 42
.long 36 ; .long 39 ; .long 39 ; .long 39
.long 39 ; .long 39 ; .long 41 ; .long 67
.long 48 ; .long 48 ; .long 48 ; .long 48
.long 97 ; .long 48 ; .long 48 ; .long 55
.long 45 ; .long 45 ; .long 36 ; .long 43
.long 211 ; .long 211 ; .long 211 ; .long 211
.long 211 ; .long 211 ; .long 211 ; .long 211
.long 211 ; .long 211 ; .long 211 ; .long 211
.long 211 ; .long 211 ; .long 211 ; .long 211
.long 211 ; .long 211 ; .long 211 ; .long 211
.long 211 ; .long 211 ; .long 211 ; .long 211
.long 211 ; .long 211 ; .long 211 ; .long 211
.long 213 ; .long 00 ; .long 00 ; .long 66
.long 00 ; .long 50 ; .long 54 ; .long 54
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
timeinf1:
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
timeinf2:
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00
#endif
.text