!Emulator written by Deian Stefan !LGP30 code written by Mohammed Billoo .begin BASE .equ 0x3fffc0 !Starting point of the memory mapped region COUT .equ 0x0 !0xffff0000 Console Data Port COSTAT .equ 0x4 !0xffff0004 Console Status Port. CIN .equ 0x8 !0xffff0008 Keyboard Data Port CICTL .equ 0xc !0xffff000c Keyboard Control Port LGP_INSTRUCTIONS .equ 3500 LGP_START .equ 3600 .org 2048 PROCESS_INSTRUCTION: !---------------------------------------------------------------------------------------- sll %r30,2,%r1 !%r30 is PC ld LGP_START+%r1,%r31 !%r31 is IR srl %r31,26,%r15 and %r15,0xFC,%r15 !make sure that bit 12,13 are 0 add %r15, LGP_INSTRUCTIONS-4,%r15 !SWI-like implementation parsing jmpl %r15+4,%r0 B: and %r31,0x7FF,%r1 !%r1=11bit MM addr sll %r1,2,%r1 !conver LGP to ARC "MM mode" add %r1,LGP_START, %r1 !add offset ld %r1,%r29 !ACC = %r29 = MM[addr] ba END_PROCESS_INSTRUCTION Y: and %r31,0x7FF,%r1 !%r1=11bit MM addr sll %r1,2,%r1 !conver LGP to ARC "MM mode" add %r1,LGP_START, %r1 !add offset ld %r1,%r2 !%r2 = MM[addr] andn %r2,0x7FF,%r2 !clear bits 0-11 of %r2=MM[addr] and %r29,0x7FF,%r3 !clear all but 0-11 of ACC or %r2,%r3,%r2 st %r2,%r1 !MM[addr](11 downto 0) = ACC(11 downto 0) ba END_PROCESS_INSTRUCTION R: and %r31,0x7FF,%r1 !%r1=11bit MM addr sll %r1,2,%r1 !conver LGP to ARC "MM mode" add %r1,LGP_START, %r1 !add offset add %r30,1,%r2 !%r2 = PC+1 subcc %r2, 0xFFF, %r0 !security: PC is 12bits, but PC+1 can be > 12 bpos END_EMULATOR !not a good idea to start writing from 0 st %r2,%r1 !MM[addr]=PC+1 (11 downto 0) ba END_PROCESS_INSTRUCTION I: !ACC = input ASCII char sethi BASE, %r4 I_WAIT: ldub [%r4 + CICTL], %r1 !loop until a character andcc %r1, 0x80, %r1 !is received be I_WAIT ldub [%r4 + CIN], %r29 !ACC = input ASCII char ba END_PROCESS_INSTRUCTION D: !signed restoring integer division and %r31,0x7FF,%r1 !%r1=11bit MM addr sll %r1,2,%r1 !conver LGP to ARC "MM mode" add %r1,LGP_START, %r1 !add offset ld %r1,%r3 !%r3 = MM[addr] = M and %r5,%r0,%r5 orcc %r3,%r0,%r0 be D_ARG_INVALID bpos D_ARG_OK_1 sub %r0,%r3,%r3 !2's complement if negative or %r0,0x1,%r5 D_ARG_OK_1: orcc %r29,%r0,%r0 be D_ARG_ZERO bpos D_ARGS_OK sub %r0,%r29,%r29 xor %r5,0x1,%r5 D_ARGS_OK: and %r0,%r0,%r1 !%r1 = A, %r29 = Q or %r0,31,%r4 !%r4 = num of bits ba D_LOOP D_ARG_INVALID: or %r0,0xBAD,%r29 ba END_EMULATOR D_ARG_ZERO: or %r0,0x0,%r29 ba END_PROCESS_INSTRUCTION D_LOOP: orcc %r1,%r0,%r1 bpos D_A_SIGN_0 sll %r1,1,%r1 !1<