	GET	Desk.sh.FnNames
	
	AREA	|C$code|, CODE, READONLY
	
	
OS_EnterOS	EQU	0x16
	
	; The BufferManager routine we call needs to be in a privaleged mode, 
	; as it directly accesses buffer space.
	
	MACRO
	EnsureSVC1
	MOV	r5, pc
	TST	r5, #3
	SWIEQ	OS_EnterOS
	MEND
	
	MACRO
	EnsureSVC2
	TEQP	r5, #0
	MOV	r0, r0
	MEND
	
	
	
	
	Desk_ASMacros_EXTERNALFUNCTION	Desk_OSBuffer_InsertByte
		; On entry, regs are:		r0=osbuffer, r1=byte.
		; For call to service, need:	r0=0, r1=id, r2=byte, r12=pw.
		; Could use r3 as a temporary and avoid stacking r4, but this way
		; all of the routines are vaguely similar.
	STMFD	sp!, { r4, r5, lr}
	
	MOV	r4, r0
	
	EnsureSVC1
	
	LDR	r12, [r4, #8]
	MOV	r2, r1
	LDR	r1, [r4, #0]
	MOV	r0, #0
	
	MOV	lr, pc
	LDR	pc, [r4, #4]
	MOVCC	r0, #0
	MOVCS	r0, #1
	
	EnsureSVC2
	
	LDMFD	sp!, { r4, r5, pc}^
	
	
	
	
	Desk_ASMacros_EXTERNALFUNCTION	Desk_OSBuffer_InsertBlock
		; On entry, regs are:		r0=osbuffer, r1=data, r2=numbytes
		; For call to service, need:	r0=1, r1=id, r2=data, r3=numbytes, r12=pw.
	STMFD	sp!, { r4, r5, lr}
	MOV	r4, r0
	
	EnsureSVC1
	
	LDR	r12, [r4, #8]
	MOV	r3, r2
	MOV	r2, r1
	LDR	r1, [ r4, #0]
	MOV	r0, #1
	
	MOV	lr, pc
	LDR	pc, [ r4, #4]
	MOV	r0, r3
	
	EnsureSVC2
	
	LDMFD	sp!, { r4, r5, pc}^
	
	
	
	
	Desk_ASMacros_EXTERNALFUNCTION	Desk_OSBuffer_RemoveByte
		; On entry, regs are:		r0=osbuffer
		; For call to service, need:	r0=2, r1=id, r12=pw
	
	STMFD	sp!, { r4, r5, lr}
	MOV	r4, r0
	
	EnsureSVC1
	
	LDR	r12, [r4, #8]
	LDR	r1, [ r4, #0]
	MOV	r0, #2
	
	MOV	lr, pc
	LDR	pc, [ r4, #4]
	
	MOVCC	r0, r2
	MOVCS	r0, #-1
	
	EnsureSVC2
	
	LDMFD	sp!, { r4, r5, pc}^
	
	
	
	Desk_ASMacros_EXTERNALFUNCTION	Desk_OSBuffer_RemoveBlock
		; On entry, regs are:		r0=osbuffer, r1=buffer, r2=numbytes
		; For call to service, need:	r0=3, r1=id, r2=buffer, r3=numbytes
	STMFD	sp!, { r4, r5, lr}
	MOV	r4, r0
	
	EnsureSVC1
	
	LDR	r12, [r4, #8]
	MOV	r3, r2
	MOV	r2, r1
	LDR	r1, [ r4, #0]
	MOV	r0, #3
	
	MOV	lr, pc
	LDR	pc, [ r4, #4]
	
	MOV	r0, r3
	
	EnsureSVC2
	
	LDMFD	sp!, { r4, r5, pc}^
	
	
	
	END
