// File: /workspace/github_c_makefile_star2_O0/mrdudz[P]run6502/run6502.c
// Function: osword
int osword(M6502 *mpu, word address, byte data)
{
  byte *params= mpu->memory + mpu->registers->x + (mpu->registers->y << 8);

  switch (mpu->registers->a)
    {
    case 0x00: /* input line */
      /* On entry: XY+0,1=>string area,
       *	   XY+2=maximum line length,
       *	   XY+3=minimum acceptable ASCII value,
       *	   XY+4=maximum acceptable ASCII value.
       * On exit:  Y is the line length (excluding CR),
       *	   C is set if Escape terminated input.
       */
      {
	word  offset= params[0] + (params[1] << 8);
	byte *buffer= mpu->memory + offset;
	byte  length= params[2], minVal= params[3], maxVal= params[4], b= 0;
	if (!fgets(buffer, length, stdin))
	  {
	    putchar('\n');
	    exit(0);
	  }
	for (b= 0;  b < length;  ++b)
	  if ((buffer[b] < minVal) || (buffer[b] > maxVal) || ('\n' == buffer[b]))
	    break;
	buffer[b]= 13;
	mpu->registers->y= b;
	mpu->registers->p &= 0xFE;
	break;
      }

    default:
      {
	char state[64];
	M6502_dump(mpu, state);
	fflush(stdout);
	fprintf(stderr, "\nOSWORD %s\n", state);
	fail("ABORT");
      }
      break;
    }
  
  rts;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x80, %rsp
movb %dl, %al
movw %si, %cx
movq %rdi, -0x8(%rbp)
movw %cx, -0xa(%rbp)
movb %al, -0xb(%rbp)
movq -0x8(%rbp), %rax
movq (%rax), %rcx
movq 0x8(%rax), %rax
movzbl 0x1(%rcx), %edx
addq %rdx, %rax
movzbl 0x2(%rcx), %ecx
shll $0x8, %ecx
addq %rcx, %rax
movq %rax, -0x18(%rbp)
movq -0x8(%rbp), %rax
movq (%rax), %rax
movb (%rax), %al
testb %al, %al
jne 0x1526
jmp 0x141e
movq -0x18(%rbp), %rax
movzbl (%rax), %eax
movq -0x18(%rbp), %rcx
movzbl 0x1(%rcx), %ecx
shll $0x8, %ecx
addl %ecx, %eax
movw %ax, -0x1a(%rbp)
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movzwl -0x1a(%rbp), %ecx
movslq %ecx, %rcx
addq %rcx, %rax
movq %rax, -0x28(%rbp)
movq -0x18(%rbp), %rax
movb 0x2(%rax), %al
movb %al, -0x29(%rbp)
movq -0x18(%rbp), %rax
movb 0x3(%rax), %al
movb %al, -0x2a(%rbp)
movq -0x18(%rbp), %rax
movb 0x4(%rax), %al
movb %al, -0x2b(%rbp)
movb $0x0, -0x2c(%rbp)
movq -0x28(%rbp), %rdi
movzbl -0x29(%rbp), %esi
movq 0x16b5b(%rip), %rax     # 0x17fd8
movq (%rax), %rdx
callq 0x10e0
cmpq $0x0, %rax
jne 0x149c
movl $0xa, %edi
callq 0x1040
xorl %edi, %edi
callq 0x11a0
movb $0x0, -0x2c(%rbp)
movzbl -0x2c(%rbp), %eax
movzbl -0x29(%rbp), %ecx
cmpl %ecx, %eax
jge 0x14f7
movq -0x28(%rbp), %rax
movzbl -0x2c(%rbp), %ecx
movzbl (%rax,%rcx), %eax
movzbl -0x2a(%rbp), %ecx
cmpl %ecx, %eax
jl 0x14e9
movq -0x28(%rbp), %rax
movzbl -0x2c(%rbp), %ecx
movzbl (%rax,%rcx), %eax
movzbl -0x2b(%rbp), %ecx
cmpl %ecx, %eax
jg 0x14e9
movq -0x28(%rbp), %rax
movzbl -0x2c(%rbp), %ecx
movzbl (%rax,%rcx), %ecx
movl $0xa, %eax
cmpl %ecx, %eax
jne 0x14eb
jmp 0x14f7
jmp 0x14ed
movb -0x2c(%rbp), %al
addb $0x1, %al
movb %al, -0x2c(%rbp)
jmp 0x14a0
movq -0x28(%rbp), %rax
movzbl -0x2c(%rbp), %ecx
movb $0xd, (%rax,%rcx)
movb -0x2c(%rbp), %cl
movq -0x8(%rbp), %rax
movq (%rax), %rax
movb %cl, 0x2(%rax)
movq -0x8(%rbp), %rax
movq (%rax), %rax
movzbl 0x3(%rax), %ecx
andl $0xfe, %ecx
movb %cl, 0x3(%rax)
jmp 0x156c
movq -0x8(%rbp), %rdi
leaq -0x70(%rbp), %rsi
callq 0x7570
movq 0x16a96(%rip), %rax     # 0x17fd0
movq (%rax), %rdi
callq 0x1150
movq 0x16aaf(%rip), %rax     # 0x17ff8
movq (%rax), %rdi
leaq -0x70(%rbp), %rdx
leaq 0x13aad(%rip), %rsi     # 0x15004
movb $0x0, %al
callq 0x1120
leaq 0x13aab(%rip), %rdi     # 0x15010
movb $0x0, %al
callq 0x12d0
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq -0x8(%rbp), %rcx
movq (%rcx), %rdx
movb 0x4(%rdx), %cl
addb $0x1, %cl
movb %cl, 0x4(%rdx)
movzbl %cl, %ecx
addl $0x100, %ecx            # imm = 0x100
movslq %ecx, %rcx
movzbl (%rax,%rcx), %eax
movw %ax, -0x72(%rbp)
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq -0x8(%rbp), %rcx
movq (%rcx), %rdx
movb 0x4(%rdx), %cl
addb $0x1, %cl
movb %cl, 0x4(%rdx)
movzbl %cl, %ecx
addl $0x100, %ecx            # imm = 0x100
movslq %ecx, %rcx
movzbl (%rax,%rcx), %ecx
shll $0x8, %ecx
movzwl -0x72(%rbp), %eax
orl %ecx, %eax
movw %ax, -0x72(%rbp)
movzwl -0x72(%rbp), %eax
addl $0x1, %eax
addq $0x80, %rsp
popq %rbp
retq
nopl (%rax)