.export	_getkey
	.export	_system_menu

_getkey:
	sts.l	pr, @-r15
	mov.l	r12, @-r15
	mov.l	r13, @-r15

	; Getting some free space and storing stack addresses for later.
	add	#-4, r15
	mov	r15, r12	; column
	add	#-4, r15
	mov	r15, r13	; row
	add	#-4, r15
	mov	r15, r1		; keycode

	mov	r12, r4		; column
	mov	r13, r5		; row
	mov	#0, r6		; type_of_waiting
	mov	#0, r7		; timeout_period

	; Pushing the following arguments to the stack. (in order !)
	mov.l	r1, @-r15	; keycode
	mov	#1, r2
	mov.l	r2, @-r15	; menu

	; Calling subfunction.
	mov.l	syscall_table, r1
	mov.l	getkeywait, r0
	jsr	@r1
	nop

	; Retrieving keycode.
	mov.l	@r12, r0
	shll8	r0
	mov.l	@r13, r1
	or	r1, r0
	add	#20, r15

	; Returning.
	mov.l	@r15+, r13
	mov.l	@r15+, r12
	lds.l	@r15+, pr
	rts
	nop



_system_menu:
	sts.l	pr, @-r15
	add	#-4, r15

	; Putting the matrix code in the key buffer.

	mov	r15, r4
	mov.w	matrixcode_menu, r2
	mov.w	r2, @r4
	mov.l	syscall_table, r1
	mov.l	putmatrixcode, r0
	jsr	@r1
	nop

	; Calling getkeywait().

	mov	r15, r4
	add	#-4, r15
	mov	r15, r5
	add	#-4, r15
	mov	r15, r1

	mov	#2, r6
	mov	#0, r7
	mov.l	r1, @-r15
	mov	#0, r2
	mov.l	r2, @-r15

	mov.l	syscall_table, r1
	mov.l	getkeywait, r0
	jsr	@r1
	nop

	add	#20, r15
	lds.l	@r15+, pr
	rts
	nop


	.align	4

syscall_table:
	.data.l	h'80010070
getkeywait:
	.data.l	h'0247
getkey:
	.data.l	h'090f
putmatrixcode:
	.data.l	h'024f
putkeycode:
	.data.l	h'0910
keycode_menu:
	.data.l	d'30003
matrixcode_menu:
	.data.w	h'0308

	.end