; Check for balanced []s ()s {}s <>s

	use16
	org 100h

; Init stack.
	mov bx, mystack

	mov si, ex1
	call isbal
	mov dx, good
	jc @f
	mov dx, bad
@@:	mov ah, 09h
	int 21h
	mov si, ex2
	call isbal
	mov dx, good
	jc @f
	mov dx, bad
@@:	mov ah, 09h
	int 21h
	ret

; Check for balanced []s ()s {}s <>s even nested.
; In expressions like this: {[ + 7 * (8 + 4)] * <7 + 1>}
isbal:
.nxt:	lodsb
	cmp al, 0
	jz .end
	call isopen
	jnc @f
	call pushit
	jmp .nxt
@@:	call isclose
	jnc .nxt
	call popit
	jnc .bad
	call issame
	je .nxt
.bad:	clc
	ret
.end:	call popit
	cmc
	ret

isopen:
	mov di, opener
.nxt:	mov ah, [di]
	inc di
	cmp ah, 0
	jz .end
	cmp ah, al
	jne .nxt
	stc
	ret
.end:
	clc
	ret

isclose:
	mov di, closer
	jmp isopen.nxt

issame:
	cmp ah, '('
	jne @f
	cmp al, ')'
	ret
@@:	cmp ah, '<'
	jne @f
	cmp al, '>'
	ret
@@:	cmp ah, '{'
	jne @f
	cmp al, '}'
	ret
@@:	cmp ah, '['
	jne @f
	cmp al, ']'
	ret
@@:	jmp isbal.bad

pushit:
	mov [bx], al
	inc bx
	ret

popit:
	dec bx
	cmp bx, mystack
	jb .err
	mov ah, [bx]
	stc
	ret
.err:	clc
	ret


opener db '(<{[',0
closer db ')>}]',0
good db 'Good.',13,10,'$'
bad  db 'Bad.',13,10,'$'
ex1 db '{[1 + 7 * (8 + 4)] * <7 + 1>}',0
ex2 db '{<[1 + 7 * (8 + 4)] * <7 + 1)}',0

mystack:
