; gnoGsos.s — GS/OS calls from inside a GNO/ME process.
;
; GNO patches GS/OS entry $E100A8 to its interceptor (OurGSOS in
; kern/gno/gsos.asm), which reads the call number + parameter-block
; pointer from the 6 INLINE bytes after the JSL and bumps the return
; address +6 to skip them:
;
;     jsl  $E100A8
;     dc   i2 callNum        ; 2 bytes
;     dc   i4 pBlockPtr      ; 4 bytes (bank : offset)
;     <-- OurGSOS returns here
;
; The plain stack-based form (callNum in X, pBlock pushed) that bare
; GS/OS accepts does NOT work under GNO.  We self-modify the inline
; callNum + pBlock operands, then dispatch.
;
; __gnoGsosCall(void *pBlock, unsigned short callNum) -> u16 error
;   C ABI: arg0 (pBlock ptr32) in A:X (A=offset, X=bank); arg1
;   (callNum i16) at (4,s).  Returns the GS/OS error in A (0 = OK).

	.text
	.globl __gnoGsosCall
__gnoGsosCall:
	rep #0x30
	sta __gnoPBlock          ; inline pBlock offset (low 16)
	txa
	sta __gnoPBlock+2        ; inline pBlock bank+pad (X = bank : pad)
	lda 4, s                 ; callNum from the stack
	sta __gnoCallNum         ; inline callNum
	lda 0xb4                 ; restore GNO's per-process DP
	tcd
	jsl 0xe100a8
__gnoCallNum:
	.word 0                  ; patched: GS/OS call number
__gnoPBlock:
	.long 0                  ; patched: param-block pointer
	; --- OurGSOS returns here (return addr bumped +6) ---
	tay                      ; Y = error (survives DP change)
	lda #0
	tcd                      ; DP := 0 for the C caller
	tya
	rtl
