so I have this working procedure that is basically like function 09h of int 21h except it terminates at 00h, and it uses 01h-04h as control characters that determine the style of the text.

I wrote it in the main procedure of a test program to get it working, and then I put it in its own procedure in a larger program. When I run it from the larger program, I get this error:

"title: 16 bit MS-DOS Subsystem

Command Prompt - cmp
NTVDM has encountered a System Error
Access is denied.
Choose 'Close' to terminate the application
Close | Ignore"

I can't really ignore it. Anyways, I narrowed the cause of this error down to a procedure without a "RET" statement. But it has a return statement at the end. If I just put RET in the procedure, it runs, if I put all of the code back into the test program (main procedure), it runs. So I'm thinking maybe there's a maximum size for a procedure that is called? It is quite long, I haven't tried to slim it down at all, I'm not sure if I really can. Anyway, here's the procedure:

Code:
outp proc
		
	push cx
	push bx
	xor cx,cx
	xor bx,bx
nexch:  mov si,dx
	push dx
	add si,cx
	push cx
	mov al,[si]
	cmp al,00h
	jnz nndpr
	jmp endpr
nndpr:  cmp al,0dh				;LINE FEED
	jnz not0d
	mov ah,03h
	int 10h
	cmp dh,24d
	jz scwin
	inc dh
	mov ah,02h
	int 10h
	jmp gnext
scwin:  mov ax,0601h
	xor cx,cx
	mov dh,24d
	mov dl,79d
	mov bl,attrWHT
	int 10h
	jmp gnext
not0d:  cmp al,0ah				;CARRIAGE RETURN
	jnz not0a
	mov ah,03h
	int 10h
	mov dl,00h
	mov ah,02h
	int 10h
	jmp gnext
not0a:  cmp al,01h				;WHITE
	jnz not01
	mov bl,attrWHT
	mov attrCUR,bl
	jmp gnext
not01:  cmp al,02h				;GREEN
	jnz not02
	mov bl,attrGRN
	mov attrCUR,bl
	jmp gnext
not02:  cmp al,03h				;YELLOW
	jnz not03
	mov bl,attrHLT
	mov attrCUR,bl
	jmp gnext
not03:  cmp al,04h				;EDIT/HEADER
	jnz not04
	mov bl,attrEDT
	mov attrCUR,bl
	jmp gnext
not04:  mov ah,09h
	mov bl,attrCUR
	mov cx,01h
	int 10h
	mov ah,03h
	int 10h
	inc dl
	mov ah,02h
	int 10h
gnext:  pop cx
	pop dx
	inc cx
	jmp nexch
endpr:	pop bx
	pop cx
	ret
I'm using TASM, and the model of the program is small... I tried making it "Large" and "Huge" to see how that would affect it but it said there was a problem with my call statement in the main procedure (Forward reference needs override). Has anyone run into something similar to this? How can I fix it and make it work?

Oh, and I tried doing something like this:

Code:
outp proc

	jmp strprc
endprc: ret
strprc: ...
	...
	...
	...
	jmp endprc

outp endp
the procedure did its job but it wouldn't return afterward, the cursor just sat there blinking and I couldn't input anything (text, ctrl-c, etc)