|
|
Tom Morton
#define __Dpoo 0x24 .align 4 jtab: .long bad_jmp .long bad_jmp .long bad_jmp .long bad_jmp .long bad_jmp .long bad_jmp .long bad_jmp .long bad_jmp .long bad_jmp .long bad_jmp .long bad_jmp .long bad_jmp .long bad_jmp .long bad_jmp .long __l1c jumptable: cmpl $0x1c,%eax jg bad_jmp2 shrl $1,%eax jmp *jtab(,%eax,4) .section .rodata bad_jmp_str: .string "Error. Bad jump target: $%x at line %d.\n" .text bad_jmp: shll $1,%eax bad_jmp2: pushl line_no pushl %eax pushl $bad_jmp_str call printf addl $8,%esp call abort #define MEM_SIZE 0x110000 #define PROC_STATE 64 #define MemBase STData+PROC_STATE .data .comm STData,MEM_SIZE+PROC_STATE .comm X,4 .comm N,4 .comm Z,4 .comm V,4 .comm C,4 .comm bX,4 .comm bN,4 .comm bZ,4 .comm bV,4 .comm bC,4 .comm rdest,4 .comm exceptions_pending_mask,4 .comm exceptions_pending_nums,32 .comm exception_handlers,4*32 .comm line_no,4 debugstr: .string "$%x $%x $%x $%x $%x $%x $%x $%x*$%x $%x $%x $%x $%x $%x $%x $%x:%d\n" .global STRam STRam: .long STData+PROC_STATE .section .rodata bin_filename: .string "test.s.bin" open_mode: .string "r" dreg_fmt: .string "D%d = $%08x " areg_fmt: .string "A%d = $%08x\n" cr: .string "\n" cc_names: .string "XNZVC" hex_fmt: .string "$%02x " illegal_fmt: .string "Illegal instruction at line %d.\n" .text .globl SetZFlag SetZFlag: movl 4(%esp),%eax movb %al,Z ret .globl GetXFlag GetXFlag: movl X,%eax ret .globl GetZFlag GetZFlag: movl Z,%eax ret .globl GetCFlag GetCFlag: movl C,%eax ret .globl GetNFlag GetNFlag: movl N,%eax ret .globl GetVFlag GetVFlag: movl V,%eax ret .globl DumpRegs DumpRegs: pushl %ebp pushl %ebx pushl %ecx pushl %esi movl $STData,%ebx xorl %eax,%eax 1: pushl %eax pushl (%ebx,%eax,4) pushl %eax pushl $dreg_fmt call printf addl $12,%esp movl (%esp),%eax pushl 8*4(%ebx,%eax,4) pushl %eax pushl $areg_fmt call printf addl $12,%esp popl %eax inc %eax cmpl $8,%eax jl 1b movb X,%al movl $0,%ecx call print_scat movb N,%al movl $1,%ecx call print_scat movb Z,%al movl $2,%ecx call print_scat movb V,%al movl $3,%ecx call print_scat movb C,%al movl $4,%ecx call print_scat pushl $cr call printf addl $4,%esp movl $STData+PROC_STATE,%esi movl $MEM_SIZE,%ebx 1: movzbl (%esi),%eax pushl %eax pushl $hex_fmt call printf addl $8,%esp inc %esi dec %ebx testl $15,%ebx jz 3f 2: testl %ebx,%ebx jnz 1b popl %esi popl %ecx popl %ebx popl %ebp ret 3: pushl $cr call printf addl $4,%esp jmp 2b print_scat: xorl %ebx,%ebx cmpb %al,%bl jz 1f movb cc_names(%ecx),%al pushl %eax call putchar addl $4,%esp 1: ret .globl FlagException FlagException: movl 4(%esp),%eax btsl %eax,exceptions_pending_mask incb exceptions_pending_nums(%eax) ret .globl MemReadByte MemReadByte: movl 4(%esp),%eax movsbl STData+PROC_STATE(%eax),%eax ret .globl MemReadWord MemReadWord: movl 4(%esp),%eax movswl STData+PROC_STATE(%eax),%eax xchg %al,%ah ret .globl MemReadLong MemReadLong: movl 4(%esp),%eax movl STData+PROC_STATE(%eax),%eax bswap %eax ret .globl MemWriteByte MemWriteByte: movl 4(%esp),%eax movl 8(%esp),%edx movb %dl,STData+PROC_STATE(%eax) ret .globl MemWriteWord MemWriteWord: movl 8(%esp),%edx movl 4(%esp),%eax xchg %dl,%dh movw %dx,STData+PROC_STATE(%eax) ret .globl MemWriteLong MemWriteLong: movl 8(%esp),%edx movl 4(%esp),%eax bswap %edx movl %edx,STData+PROC_STATE(%eax) ret .globl GetReg GetReg: movl 4(%esp),%eax movl STData(,%eax,4),%eax ret .globl SetReg SetReg: movl 4(%esp),%eax movl 8(%esp),%edx movl %edx,STData(,%eax,4) ret .globl Init680x0 Init680x0: pushl %esi pushl %ebx pushl $open_mode pushl $bin_filename call fopen movl %eax, %ebx popl %eax xorl %eax, %eax testl %ebx, %ebx popl %edx je 1f pushl $2 pushl $0 pushl %ebx call fseek pushl %ebx call ftell pushl $0 movl %eax, %esi pushl $0 pushl %ebx call fseek addl $28, %esp xorl %eax, %eax cmpl $MEM_SIZE, %esi jge 1f pushl %ebx pushl %esi pushl $1 pushl $STData+PROC_STATE call fread pushl %ebx call fclose movl $1, %eax addl $20, %esp 1: popl %ebx popl %esi ret .globl Start680x0 Start680x0: pushl %ebp pushl %esi pushl %edi pushl %edx pushl %ecx pushl %ebx movl $STData+PROC_STATE,%ebp __l1c: movl $1, line_no movl $0,%eax /* 0x1e */ movl $2, line_no movw __Dpoo(%ebp),%bx rorw $8,%bx addw %bx,%ax sets N seto V setc C setz Z setc X movl %eax,-64(%ebp) popl %ebx popl %ecx popl %edx popl %edi popl %esi popl %ebp ret handle_exception: movl rdest,%ebx testl %ebx,%ebx jnz jumptable movl %eax,rdest movl exceptions_pending_mask,%edx xorl %ecx,%ecx 1: btl %ecx,%edx jnc 2f movl $exception_handlers,%ebx movb exceptions_pending_nums(%ecx),%al decb %al jnz 3f btrl %ecx,exceptions_pending_mask 3: movb %al,exceptions_pending_nums(%ecx) movl (%ebx,%ecx,4),%eax movb X,%bh movb N,%bl movb Z,%ch movb V,%cl movb C,%dh movb %bh,bX movb %bl,bN movb %ch,bZ movb %cl,bV movb %dh,bC jmp jumptable 2: inc %ecx cmpl $32,%ecx jl 1b movl rdest,%eax movl $0,rdest jmp jumptable
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.