File:  [Tom Morton FrontierVM] / frontvm / as68k / test.s.S
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 17:57:48 2018 UTC (8 years, 3 months ago) by root
Branches: frontvm, MAIN
CVS tags: frontvm3-20060613, frontvm2-20061120, HEAD
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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.