// File: /workspace/github_c_makefile_star2_O0/aap[P]rx-0/tx0/mach.c
// Function: cycle
static void
cycle(TX0 *tx)
{
	Word mbr_t;

	if(tx->ss){
		// execute instructions
		tx->mbr = 0;
		if(tx->c == 0){
//printf("cyc0\n"); fflush(stdout);
			tx->prevpc = tx->mar;
			readcore(tx);
			tx->pc = 0;
			tx->ir = tx->mbr>>16;
			tx->pc = tx->mar+1 & ADDRMASK;
			tx->mar = tx->mbr & ADDRMASK;

			switch(tx->ir){
			case 0:
			case 1:
				tx->c = 1;
				break;
			case 2:
				if((tx->ac & 0400000) == 0)
					tx->c = 1;
				break;
			case 3:
				// opr
				// 0.8
				if(tx->mar & 0100000) tx->ac &= 0000777;
				if(tx->mar & 0040000) tx->ac &= 0777000;
				if((tx->mar & 0030000) == 0020000) iostop(tx);
				switch(tx->mar>>9 & 7){
				case 0: break;	// no IO
				case 1: break;	// PETR 1 line
				case 2:		// display
					tx->displaying = 1;
					break;
				case 3: break;	// PETR 3 lines
				case 4:		// FLEXO print
					tx->fl_printing = 1;
					break;
				case 5: break;	// spare
				case 6: break;	// punch
				case 7: break;	// punch + 7th hole
				}
				tx->c = 1;
				break;
			}

			if(tx->sw_stop_c0)
				tx->pbs = 0;
		}else{
//printf("cyc1\n"); fflush(stdout);
			switch(tx->ir){
			case 0:
				// sto
				tx->mbr = tx->ac;
				writecore(tx);
				break;
			case 1:
				// add
				readcore(tx);
				tx->ac ^= tx->mbr;
				tx->ac += (~tx->ac & tx->mbr)<<1;
				if(tx->ac & 01000000) tx->ac += 1;
				tx->ac &= 0777777;
				break;
			case 2:
				// trn - branch not taken
				break;
			case 3:
				// opr
				// 1.1
				if((tx->mar & 0104) == 0004) tx->ac |= tx->tac;
				if((tx->mar & 0104) == 0100) ; // TODO: pen
				// 1.2
				if(tx->mar & 1) tx->mbr |= tx->mar & 2 ? tx->tbr : tx->ac;
				if(tx->mar & 040) tx->ac = ~tx->ac & 0777777;
				// 1.3
				mbr_t = tx->mbr;
				if((tx->mar & 3) == 2) tx->mbr = tx->lr;
				if((tx->mar & 0600) == 0200) tx->lr = mbr_t;
				// 1.4
				if(tx->mar & 020) tx->ac ^= tx->mbr;
				else if((tx->mar & 0600) == 0400)
					tx->ac = tx->ac>>1 | tx->ac&0400000;
				else if((tx->mar & 0600) == 0600)
					tx->ac = (tx->ac>>1 | tx->ac<<17) & 0777777;
				// 1.6
				if((tx->mar & 0030000) == 0030000)
					tx->pbs = 0;	// halt
				// 1.7
				if(tx->mar & 010){
					tx->ac += (~tx->ac & tx->mbr)<<1;
					if(tx->ac & 01000000) tx->ac += 1;
					tx->ac &= 0777777;
				}
				break;
			}
			tx->mar = tx->pc;
			tx->c = 0;

			if(tx->sw_stop_c1)
				tx->pbs = 0;
		}

		// stop machine
		if(tx->pbs == 0)
			tx->ss = 0;
		
	}else{
//printf("idle\n"); fflush(stdout);
//		usleep(1000);
		// idle
		if(tx->ios == 0){
			if(tx->pbs == 0)
				tx->ss = 0;
		}else
			tx->ss = tx->pbs;
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x30, %rsp
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rax
cmpl $0x0, (%rax)
je 0x55c3
movq -0x8(%rbp), %rax
movl $0x0, 0x18(%rax)
movq -0x8(%rbp), %rax
cmpl $0x0, 0xc(%rax)
jne 0x52dc
movq -0x8(%rbp), %rax
movl 0x1c(%rax), %ecx
movl %ecx, 0x24(%rax)
movq -0x8(%rbp), %rdi
callq 0x5b60
movq -0x8(%rbp), %rax
movl $0x0, 0x20(%rax)
movq -0x8(%rbp), %rax
movzwl 0x1a(%rax), %ecx
movl %ecx, 0x28(%rax)
movq -0x8(%rbp), %rax
movl 0x1c(%rax), %ecx
incl %ecx
movzwl %cx, %ecx
movl %ecx, 0x20(%rax)
movq -0x8(%rbp), %rax
movzwl 0x18(%rax), %ecx
movl %ecx, 0x1c(%rax)
movq -0x8(%rbp), %rax
movl 0x28(%rax), %eax
movl %eax, -0x10(%rbp)
subl $0x2, %eax
jb 0x51cd
jmp 0x51b6
movl -0x10(%rbp), %eax
subl $0x2, %eax
je 0x51dd
jmp 0x51c0
movl -0x10(%rbp), %eax
subl $0x3, %eax
je 0x51fe
jmp 0x52bf
movq -0x8(%rbp), %rax
movl $0x1, 0xc(%rax)
jmp 0x52bf
movq -0x8(%rbp), %rax
movl 0x10(%rax), %eax
andl $0x20000, %eax          # imm = 0x20000
cmpl $0x0, %eax
jne 0x51f9
movq -0x8(%rbp), %rax
movl $0x1, 0xc(%rax)
jmp 0x52bf
movq -0x8(%rbp), %rax
movl 0x1c(%rax), %eax
andl $0x8000, %eax           # imm = 0x8000
cmpl $0x0, %eax
je 0x521f
movq -0x8(%rbp), %rax
movl 0x10(%rax), %ecx
andl $0x1ff, %ecx            # imm = 0x1FF
movl %ecx, 0x10(%rax)
movq -0x8(%rbp), %rax
movl 0x1c(%rax), %eax
andl $0x4000, %eax           # imm = 0x4000
cmpl $0x0, %eax
je 0x5240
movq -0x8(%rbp), %rax
movl 0x10(%rax), %ecx
andl $0x3fe00, %ecx          # imm = 0x3FE00
movl %ecx, 0x10(%rax)
movq -0x8(%rbp), %rax
movl 0x1c(%rax), %eax
andl $0x3000, %eax           # imm = 0x3000
cmpl $0x2000, %eax           # imm = 0x2000
jne 0x525c
movq -0x8(%rbp), %rdi
callq 0x5b90
movq -0x8(%rbp), %rax
movl 0x1c(%rax), %eax
shrl $0x9, %eax
andl $0x7, %eax
movl %eax, %ecx
movq %rcx, -0x18(%rbp)
subl $0x7, %eax
ja 0x52b4
movq -0x18(%rbp), %rax
leaq 0x10cd(%rip), %rcx      # 0x634c
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
jmp 0x52b4
jmp 0x52b4
movq -0x8(%rbp), %rax
movl $0x1, 0x4004c(%rax)
jmp 0x52b4
jmp 0x52b4
movq -0x8(%rbp), %rax
movl $0x1, 0x40048(%rax)
jmp 0x52b4
jmp 0x52b4
jmp 0x52b4
jmp 0x52b4
movq -0x8(%rbp), %rax
movl $0x1, 0xc(%rax)
movq -0x8(%rbp), %rax
cmpl $0x0, 0x40034(%rax)
je 0x52d7
movq -0x8(%rbp), %rax
movl $0x0, 0x8(%rax)
jmp 0x55ad
movq -0x8(%rbp), %rax
movl 0x28(%rax), %eax
movq %rax, -0x20(%rbp)
subq $0x3, %rax
ja 0x557a
movq -0x20(%rbp), %rax
leaq 0x1040(%rip), %rcx      # 0x633c
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x8(%rbp), %rax
movl 0x10(%rax), %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x18(%rax)
movq -0x8(%rbp), %rdi
callq 0x5bb0
jmp 0x557a
movq -0x8(%rbp), %rdi
callq 0x5b60
movq -0x8(%rbp), %rax
movl 0x18(%rax), %ecx
movq -0x8(%rbp), %rax
xorl 0x10(%rax), %ecx
movl %ecx, 0x10(%rax)
movq -0x8(%rbp), %rax
movl 0x10(%rax), %ecx
xorl $-0x1, %ecx
movq -0x8(%rbp), %rax
andl 0x18(%rax), %ecx
shll %ecx
movq -0x8(%rbp), %rax
addl 0x10(%rax), %ecx
movl %ecx, 0x10(%rax)
movq -0x8(%rbp), %rax
movl 0x10(%rax), %eax
andl $0x40000, %eax          # imm = 0x40000
cmpl $0x0, %eax
je 0x5376
movq -0x8(%rbp), %rax
movl 0x10(%rax), %ecx
addl $0x1, %ecx
movl %ecx, 0x10(%rax)
movq -0x8(%rbp), %rax
movl 0x10(%rax), %ecx
andl $0x3ffff, %ecx          # imm = 0x3FFFF
movl %ecx, 0x10(%rax)
jmp 0x557a
jmp 0x557a
movq -0x8(%rbp), %rax
movl 0x1c(%rax), %eax
andl $0x44, %eax
cmpl $0x4, %eax
jne 0x53b3
movq -0x8(%rbp), %rax
movl 0x40030(%rax), %ecx
movq -0x8(%rbp), %rax
orl 0x10(%rax), %ecx
movl %ecx, 0x10(%rax)
movq -0x8(%rbp), %rax
movl 0x1c(%rax), %eax
andl $0x44, %eax
cmpl $0x40, %eax
jne 0x53c4
jmp 0x53c4
movq -0x8(%rbp), %rax
movl 0x1c(%rax), %eax
andl $0x1, %eax
cmpl $0x0, %eax
je 0x5408
movq -0x8(%rbp), %rax
movl 0x1c(%rax), %eax
andl $0x2, %eax
cmpl $0x0, %eax
je 0x53f1
movq -0x8(%rbp), %rax
movl 0x4002c(%rax), %eax
movl %eax, -0x24(%rbp)
jmp 0x53fb
movq -0x8(%rbp), %rax
movl 0x10(%rax), %eax
movl %eax, -0x24(%rbp)
movl -0x24(%rbp), %ecx
movq -0x8(%rbp), %rax
orl 0x18(%rax), %ecx
movl %ecx, 0x18(%rax)
movq -0x8(%rbp), %rax
movl 0x1c(%rax), %eax
andl $0x20, %eax
cmpl $0x0, %eax
je 0x542e
movq -0x8(%rbp), %rax
movl 0x10(%rax), %ecx
xorl $-0x1, %ecx
andl $0x3ffff, %ecx          # imm = 0x3FFFF
movq -0x8(%rbp), %rax
movl %ecx, 0x10(%rax)
movq -0x8(%rbp), %rax
movl 0x18(%rax), %eax
movl %eax, -0xc(%rbp)
movq -0x8(%rbp), %rax
movl 0x1c(%rax), %eax
andl $0x3, %eax
cmpl $0x2, %eax
jne 0x5455
movq -0x8(%rbp), %rax
movl 0x14(%rax), %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x18(%rax)
movq -0x8(%rbp), %rax
movl 0x1c(%rax), %eax
andl $0x180, %eax            # imm = 0x180
cmpl $0x80, %eax
jne 0x5472
movl -0xc(%rbp), %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x14(%rax)
movq -0x8(%rbp), %rax
movl 0x1c(%rax), %eax
andl $0x10, %eax
cmpl $0x0, %eax
je 0x5494
movq -0x8(%rbp), %rax
movl 0x18(%rax), %ecx
movq -0x8(%rbp), %rax
xorl 0x10(%rax), %ecx
movl %ecx, 0x10(%rax)
jmp 0x5500
movq -0x8(%rbp), %rax
movl 0x1c(%rax), %eax
andl $0x180, %eax            # imm = 0x180
cmpl $0x100, %eax            # imm = 0x100
jne 0x54c7
movq -0x8(%rbp), %rax
movl 0x10(%rax), %ecx
shrl %ecx
movq -0x8(%rbp), %rax
movl 0x10(%rax), %eax
andl $0x20000, %eax          # imm = 0x20000
orl %eax, %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x10(%rax)
jmp 0x54fe
movq -0x8(%rbp), %rax
movl 0x1c(%rax), %eax
andl $0x180, %eax            # imm = 0x180
cmpl $0x180, %eax            # imm = 0x180
jne 0x54fc
movq -0x8(%rbp), %rax
movl 0x10(%rax), %ecx
shrl %ecx
movq -0x8(%rbp), %rax
movl 0x10(%rax), %eax
shll $0x11, %eax
orl %eax, %ecx
andl $0x3ffff, %ecx          # imm = 0x3FFFF
movq -0x8(%rbp), %rax
movl %ecx, 0x10(%rax)
jmp 0x54fe
jmp 0x5500
movq -0x8(%rbp), %rax
movl 0x1c(%rax), %eax
andl $0x3000, %eax           # imm = 0x3000
cmpl $0x3000, %eax           # imm = 0x3000
jne 0x551e
movq -0x8(%rbp), %rax
movl $0x0, 0x8(%rax)
movq -0x8(%rbp), %rax
movl 0x1c(%rax), %eax
andl $0x8, %eax
cmpl $0x0, %eax
je 0x5578
movq -0x8(%rbp), %rax
movl 0x10(%rax), %ecx
xorl $-0x1, %ecx
movq -0x8(%rbp), %rax
andl 0x18(%rax), %ecx
shll %ecx
movq -0x8(%rbp), %rax
addl 0x10(%rax), %ecx
movl %ecx, 0x10(%rax)
movq -0x8(%rbp), %rax
movl 0x10(%rax), %eax
andl $0x40000, %eax          # imm = 0x40000
cmpl $0x0, %eax
je 0x5568
movq -0x8(%rbp), %rax
movl 0x10(%rax), %ecx
addl $0x1, %ecx
movl %ecx, 0x10(%rax)
movq -0x8(%rbp), %rax
movl 0x10(%rax), %ecx
andl $0x3ffff, %ecx          # imm = 0x3FFFF
movl %ecx, 0x10(%rax)
jmp 0x557a
movq -0x8(%rbp), %rax
movl 0x20(%rax), %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x1c(%rax)
movq -0x8(%rbp), %rax
movl $0x0, 0xc(%rax)
movq -0x8(%rbp), %rax
cmpl $0x0, 0x40038(%rax)
je 0x55ab
movq -0x8(%rbp), %rax
movl $0x0, 0x8(%rax)
jmp 0x55ad
movq -0x8(%rbp), %rax
cmpl $0x0, 0x8(%rax)
jne 0x55c1
movq -0x8(%rbp), %rax
movl $0x0, (%rax)
jmp 0x55f2
movq -0x8(%rbp), %rax
cmpl $0x0, 0x4(%rax)
jne 0x55e3
movq -0x8(%rbp), %rax
cmpl $0x0, 0x8(%rax)
jne 0x55e1
movq -0x8(%rbp), %rax
movl $0x0, (%rax)
jmp 0x55f0
movq -0x8(%rbp), %rax
movl 0x8(%rax), %ecx
movq -0x8(%rbp), %rax
movl %ecx, (%rax)
jmp 0x55f2
addq $0x30, %rsp
popq %rbp
retq
nopl (%rax,%rax)