// File: /workspace/github_c_makefile_star2_O0/aap[P]pdp11/u_kb11a.c
// Function: update_state
void
update_state(KB11A *kb)
{
	// TODO: tv

	switch(kb->c.rbr.kmx){
	case 0:
		kb->k0mx = 1;
		kb->k1mx = sxt(kb->sv);
		break;
	case 1:
		kb->k0mx = 2;	// TODO: correct?
		kb->k1mx = kb->tv;
		break;
	case 2:
		kb->k0mx = kb->srccon;
		if(kb->c.sr & 0200) kb->k0mx |= 0177400;
		kb->k1mx = kb->c.br & 0377;
		break;
	case 3:
		kb->k0mx = kb->destcon;
		if(kb->c.br & 0200) kb->k0mx |= 0177400;
		kb->k1mx = sxt(kb->c.br) & 0173377;
		break;
	default: assert(0);
	}
	kb->k1mx &= ~1;

	switch(kb->c.rbr.amx){
	case 0: kb->amx = kb->c.dr; break;
	case 1: kb->amx = kb->c.pcb; break;
	case 2: kb->amx = kb->c.sr; break;
	case 3: kb->amx = kb->c.br; break;
	default: assert(0);
	}

	switch(kb->c.rbr.bmx){
	case 0: kb->bmx = kb->k0mx; break;
	case 1: kb->bmx = kb->k1mx; break;
	case 2: kb->bmx = kb->c.sr; break;
	case 3: kb->bmx = kb->c.br; break;
	default: assert(0);
	}

	switch(kb->c.rbr.bax){
	case 0: kb->bamx = kb->c.dr; break;
	case 1: kb->bamx = kb->c.pcb; break;
	case 2: kb->bamx = kb->c.sr; break;
	case 3: kb->bamx = 0; break;	// TODO: EALU
	default: assert(0);
	}

	int shf = kb->c.rbr.shf;
	switch(kb->c.rbr.alu){
	case 0: kb->alu = ~kb->amx&M16; break;
	case 1: kb->alu = kb->bmx; break;
	case 2: kb->alu = kb->amx; break;
	case 3: kb->alu = kb->amx + kb->bmx; break;
	case 4: kb->alu = kb->amx + (kb->amx&(~kb->bmx&M16)); break;
	case 5: kb->alu = kb->amx + kb->amx; break;
	case 6: kb->alu = kb->amx + (~kb->bmx&M16) + 1; break;
	case 7:
		// change shf
		assert(0 && "yikes, not implemented yet");
	default: assert(0);
	}

	switch(shf){
	case 0: kb->shfr = kb->alu<<8 | kb->alu>>8; break;
	case 1: kb->shfr = kb->c.pcb; break;
	case 2: kb->shfr = kb->alu; break;
	// TODO: this is wrong
	case 3: kb->shfr = kb->alu>>1;
assert(0); break;
	default: assert(0);
	}

	switch(kb->c.rbr.ibs){
	case 0: kb->intbus = 0; break;
	case 1: kb->intbus = kb->sw; break;
	case 2: kb->intbus = 0; break;
	case 3: kb->intbus = kb->c.ps; break;
	default: assert(0);
	}

	int wantunibus = kb->c.rbr.bsd==INTR_PAUSE;	// TODO: DDC STOP?
	int wantintbus = kb->c.rbr.ibs&1;	// TODO: SW, KT11, FP
	kb->sel_int = !wantunibus && wantintbus;
	// we don't have fast mem
	kb->sel_mem = !wantunibus && !wantintbus && 0;

	switch(kb->c.rbr.brx<<2 | kb->sel_int<<1 | kb->sel_mem){
	case 0: case 1: case 2: case 3: case 7:
		kb->brmx = kb->shfr;
		break;
	case 4: kb->brmx = kb->unibusd; break;
	case 5: kb->brmx = 0; break;	// membus, we don't have it
	case 6: kb->brmx = kb->intbus; break;
	default: assert(0);
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x60, %rsp
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rax
movl 0x70(%rax), %eax
movq %rax, -0x20(%rbp)
subq $0x3, %rax
ja 0x31ad
movq -0x20(%rbp), %rax
leaq 0x1fd8(%rip), %rcx      # 0x5054
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x8(%rbp), %rax
movw $0x1, 0x20c(%rax)
movq -0x8(%rbp), %rax
movl 0x250(%rax), %eax
movzbl %al, %edi
callq 0x23b0
movw %ax, %cx
movq -0x8(%rbp), %rax
movw %cx, 0x20e(%rax)
jmp 0x31cc
movq -0x8(%rbp), %rax
movw $0x2, 0x20c(%rax)
movq -0x8(%rbp), %rax
movzbl 0x20b(%rax), %eax
movw %ax, %cx
movq -0x8(%rbp), %rax
movw %cx, 0x20e(%rax)
jmp 0x31cc
movq -0x8(%rbp), %rax
movzbl 0x20a(%rax), %eax
movw %ax, %cx
movq -0x8(%rbp), %rax
movw %cx, 0x20c(%rax)
movq -0x8(%rbp), %rax
movzwl 0x6(%rax), %eax
andl $0x80, %eax
cmpl $0x0, %eax
je 0x3125
movq -0x8(%rbp), %rax
movzwl 0x20c(%rax), %ecx
orl $0xff00, %ecx           # imm = 0xFF00
movw %cx, 0x20c(%rax)
movq -0x8(%rbp), %rax
movzwl (%rax), %eax
andl $0xff, %eax
movw %ax, %cx
movq -0x8(%rbp), %rax
movw %cx, 0x20e(%rax)
jmp 0x31cc
movq -0x8(%rbp), %rax
movzbl 0x209(%rax), %eax
movw %ax, %cx
movq -0x8(%rbp), %rax
movw %cx, 0x20c(%rax)
movq -0x8(%rbp), %rax
movzwl (%rax), %eax
andl $0x80, %eax
cmpl $0x0, %eax
je 0x3186
movq -0x8(%rbp), %rax
movzwl 0x20c(%rax), %ecx
orl $0xff00, %ecx           # imm = 0xFF00
movw %cx, 0x20c(%rax)
movq -0x8(%rbp), %rax
movw (%rax), %ax
movzbl %al, %edi
callq 0x23b0
movzwl %ax, %eax
andl $0xf6ff, %eax           # imm = 0xF6FF
movw %ax, %cx
movq -0x8(%rbp), %rax
movw %cx, 0x20e(%rax)
jmp 0x31cc
leaq 0x229c(%rip), %rdi      # 0x5450
leaq 0x2708(%rip), %rsi      # 0x58c3
movl $0x1d7, %edx            # imm = 0x1D7
leaq 0x2706(%rip), %rcx      # 0x58cd
callq 0x2040
movq -0x8(%rbp), %rax
movw 0x20e(%rax), %cx
andw $-0x2, %cx
movw %cx, 0x20e(%rax)
movq -0x8(%rbp), %rax
movl 0x68(%rax), %eax
movq %rax, -0x28(%rbp)
subq $0x3, %rax
ja 0x325a
movq -0x28(%rbp), %rax
leaq 0x1e66(%rip), %rcx      # 0x5064
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x8(%rbp), %rax
movw 0x8(%rax), %cx
movq -0x8(%rbp), %rax
movw %cx, 0x210(%rax)
jmp 0x3279
movq -0x8(%rbp), %rax
movw 0x4(%rax), %cx
movq -0x8(%rbp), %rax
movw %cx, 0x210(%rax)
jmp 0x3279
movq -0x8(%rbp), %rax
movw 0x6(%rax), %cx
movq -0x8(%rbp), %rax
movw %cx, 0x210(%rax)
jmp 0x3279
movq -0x8(%rbp), %rax
movw (%rax), %cx
movq -0x8(%rbp), %rax
movw %cx, 0x210(%rax)
jmp 0x3279
leaq 0x21ef(%rip), %rdi      # 0x5450
leaq 0x265b(%rip), %rsi      # 0x58c3
movl $0x1e0, %edx            # imm = 0x1E0
leaq 0x2659(%rip), %rcx      # 0x58cd
callq 0x2040
movq -0x8(%rbp), %rax
movl 0x6c(%rax), %eax
movq %rax, -0x30(%rbp)
subq $0x3, %rax
ja 0x32f7
movq -0x30(%rbp), %rax
leaq 0x1ddf(%rip), %rcx      # 0x5074
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x8(%rbp), %rax
movw 0x20c(%rax), %cx
movq -0x8(%rbp), %rax
movw %cx, 0x212(%rax)
jmp 0x3316
movq -0x8(%rbp), %rax
movw 0x20e(%rax), %cx
movq -0x8(%rbp), %rax
movw %cx, 0x212(%rax)
jmp 0x3316
movq -0x8(%rbp), %rax
movw 0x6(%rax), %cx
movq -0x8(%rbp), %rax
movw %cx, 0x212(%rax)
jmp 0x3316
movq -0x8(%rbp), %rax
movw (%rax), %cx
movq -0x8(%rbp), %rax
movw %cx, 0x212(%rax)
jmp 0x3316
leaq 0x2152(%rip), %rdi      # 0x5450
leaq 0x25be(%rip), %rsi      # 0x58c3
movl $0x1e8, %edx            # imm = 0x1E8
leaq 0x25bc(%rip), %rcx      # 0x58cd
callq 0x2040
movq -0x8(%rbp), %rax
movl 0x50(%rax), %eax
movq %rax, -0x38(%rbp)
subq $0x3, %rax
ja 0x3389
movq -0x38(%rbp), %rax
leaq 0x1d52(%rip), %rcx      # 0x5084
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x8(%rbp), %rax
movw 0x8(%rax), %cx
movq -0x8(%rbp), %rax
movw %cx, 0x214(%rax)
jmp 0x33a8
movq -0x8(%rbp), %rax
movw 0x4(%rax), %cx
movq -0x8(%rbp), %rax
movw %cx, 0x214(%rax)
jmp 0x33a8
movq -0x8(%rbp), %rax
movw 0x6(%rax), %cx
movq -0x8(%rbp), %rax
movw %cx, 0x214(%rax)
jmp 0x33a8
movq -0x8(%rbp), %rax
movw $0x0, 0x214(%rax)
jmp 0x33a8
leaq 0x20c0(%rip), %rdi      # 0x5450
leaq 0x252c(%rip), %rsi      # 0x58c3
movl $0x1f0, %edx            # imm = 0x1F0
leaq 0x252a(%rip), %rcx      # 0x58cd
callq 0x2040
movq -0x8(%rbp), %rax
movl 0x3c(%rax), %eax
movl %eax, -0xc(%rbp)
movq -0x8(%rbp), %rax
movl 0x74(%rax), %eax
movq %rax, -0x40(%rbp)
subq $0x7, %rax
ja 0x3508
movq -0x40(%rbp), %rax
leaq 0x1cc2(%rip), %rcx      # 0x5094
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x8(%rbp), %rax
movzwl 0x210(%rax), %ecx
xorl $-0x1, %ecx
andl $0xffff, %ecx           # imm = 0xFFFF
movq -0x8(%rbp), %rax
movl %ecx, 0x21c(%rax)
jmp 0x3527
movq -0x8(%rbp), %rax
movzwl 0x212(%rax), %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x21c(%rax)
jmp 0x3527
movq -0x8(%rbp), %rax
movzwl 0x210(%rax), %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x21c(%rax)
jmp 0x3527
movq -0x8(%rbp), %rax
movzwl 0x210(%rax), %ecx
movq -0x8(%rbp), %rax
movzwl 0x212(%rax), %eax
addl %eax, %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x21c(%rax)
jmp 0x3527
movq -0x8(%rbp), %rax
movzwl 0x210(%rax), %ecx
movq -0x8(%rbp), %rax
movzwl 0x210(%rax), %eax
movq -0x8(%rbp), %rdx
movzwl 0x212(%rdx), %edx
xorl $-0x1, %edx
andl $0xffff, %edx           # imm = 0xFFFF
andl %edx, %eax
addl %eax, %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x21c(%rax)
jmp 0x3527
movq -0x8(%rbp), %rax
movzwl 0x210(%rax), %ecx
movq -0x8(%rbp), %rax
movzwl 0x210(%rax), %eax
addl %eax, %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x21c(%rax)
jmp 0x3527
movq -0x8(%rbp), %rax
movzwl 0x210(%rax), %ecx
movq -0x8(%rbp), %rax
movzwl 0x212(%rax), %eax
xorl $-0x1, %eax
andl $0xffff, %eax           # imm = 0xFFFF
addl %eax, %ecx
addl $0x1, %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x21c(%rax)
jmp 0x3527
leaq 0x23f8(%rip), %rdi      # 0x58e8
leaq 0x23cc(%rip), %rsi      # 0x58c3
movl $0x1fe, %edx            # imm = 0x1FE
leaq 0x23ca(%rip), %rcx      # 0x58cd
callq 0x2040
leaq 0x1f41(%rip), %rdi      # 0x5450
leaq 0x23ad(%rip), %rsi      # 0x58c3
movl $0x1ff, %edx            # imm = 0x1FF
leaq 0x23ab(%rip), %rcx      # 0x58cd
callq 0x2040
movl -0xc(%rbp), %eax
movq %rax, -0x48(%rbp)
subq $0x3, %rax
ja 0x35e3
movq -0x48(%rbp), %rax
leaq 0x1b71(%rip), %rcx      # 0x50b4
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x8(%rbp), %rax
movl 0x21c(%rax), %eax
shll $0x8, %eax
movq -0x8(%rbp), %rcx
movl 0x21c(%rcx), %ecx
sarl $0x8, %ecx
orl %ecx, %eax
movw %ax, %cx
movq -0x8(%rbp), %rax
movw %cx, 0x216(%rax)
jmp 0x3602
movq -0x8(%rbp), %rax
movw 0x4(%rax), %cx
movq -0x8(%rbp), %rax
movw %cx, 0x216(%rax)
jmp 0x3602
movq -0x8(%rbp), %rax
movl 0x21c(%rax), %eax
movw %ax, %cx
movq -0x8(%rbp), %rax
movw %cx, 0x216(%rax)
jmp 0x3602
movq -0x8(%rbp), %rax
movl 0x21c(%rax), %eax
sarl %eax
movw %ax, %cx
movq -0x8(%rbp), %rax
movw %cx, 0x216(%rax)
leaq 0x1e85(%rip), %rdi      # 0x5450
leaq 0x22f1(%rip), %rsi      # 0x58c3
movl $0x208, %edx            # imm = 0x208
leaq 0x22ef(%rip), %rcx      # 0x58cd
callq 0x2040
leaq 0x1e66(%rip), %rdi      # 0x5450
leaq 0x22d2(%rip), %rsi      # 0x58c3
movl $0x209, %edx            # imm = 0x209
leaq 0x22d0(%rip), %rcx      # 0x58cd
callq 0x2040
movq -0x8(%rbp), %rax
movl 0x54(%rax), %eax
movq %rax, -0x50(%rbp)
subq $0x3, %rax
ja 0x3677
movq -0x50(%rbp), %rax
leaq 0x1aa6(%rip), %rcx      # 0x50c4
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x8(%rbp), %rax
movw $0x0, 0x24e(%rax)
jmp 0x3696
movq -0x8(%rbp), %rax
movl 0x254(%rax), %eax
movw %ax, %cx
movq -0x8(%rbp), %rax
movw %cx, 0x24e(%rax)
jmp 0x3696
movq -0x8(%rbp), %rax
movw $0x0, 0x24e(%rax)
jmp 0x3696
movq -0x8(%rbp), %rax
movw 0x98(%rax), %cx
movq -0x8(%rbp), %rax
movw %cx, 0x24e(%rax)
jmp 0x3696
leaq 0x1dd2(%rip), %rdi      # 0x5450
leaq 0x223e(%rip), %rsi      # 0x58c3
movl $0x211, %edx            # imm = 0x211
leaq 0x223c(%rip), %rcx      # 0x58cd
callq 0x2040
movq -0x8(%rbp), %rax
cmpl $0x1, 0x4c(%rax)
sete %al
andb $0x1, %al
movzbl %al, %eax
movl %eax, -0x10(%rbp)
movq -0x8(%rbp), %rax
movl 0x54(%rax), %eax
andl $0x1, %eax
movl %eax, -0x14(%rbp)
xorl %eax, %eax
cmpl $0x0, -0x10(%rbp)
movb %al, -0x51(%rbp)
jne 0x36cb
cmpl $0x0, -0x14(%rbp)
setne %al
movb %al, -0x51(%rbp)
movb -0x51(%rbp), %al
andb $0x1, %al
movzbl %al, %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x240(%rax)
xorl %eax, %eax
cmpl $0x0, -0x10(%rbp)
movb %al, -0x52(%rbp)
jne 0x36fa
xorl %eax, %eax
cmpl $0x0, -0x14(%rbp)
movb %al, -0x52(%rbp)
jne 0x36fa
xorl %eax, %eax
movb %al, -0x52(%rbp)
jmp 0x36fa
movb -0x52(%rbp), %al
movzbl %al, %ecx
andl $0x1, %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x244(%rax)
movq -0x8(%rbp), %rcx
movl 0x1c(%rcx), %eax
shll $0x2, %eax
movl 0x240(%rcx), %edx
addl %edx, %edx
orl %edx, %eax
movl 0x244(%rcx), %ecx
orl %ecx, %eax
movl %eax, %ecx
movq %rcx, -0x60(%rbp)
subl $0x7, %eax
ja 0x379f
movq -0x60(%rbp), %rax
leaq 0x1995(%rip), %rcx      # 0x50d4
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x8(%rbp), %rax
movw 0x216(%rax), %cx
movq -0x8(%rbp), %rax
movw %cx, 0x218(%rax)
jmp 0x37be
movq -0x8(%rbp), %rax
movw 0x24c(%rax), %cx
movq -0x8(%rbp), %rax
movw %cx, 0x218(%rax)
jmp 0x37be
movq -0x8(%rbp), %rax
movw $0x0, 0x218(%rax)
jmp 0x37be
movq -0x8(%rbp), %rax
movw 0x24e(%rax), %cx
movq -0x8(%rbp), %rax
movw %cx, 0x218(%rax)
jmp 0x37be
leaq 0x1caa(%rip), %rdi      # 0x5450
leaq 0x2116(%rip), %rsi      # 0x58c3
movl $0x221, %edx            # imm = 0x221
leaq 0x2114(%rip), %rcx      # 0x58cd
callq 0x2040
addq $0x60, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)