;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; CALCULATOR 8BIT 9 OPERACJI
;
; wersja 2 z CARRY
; tested
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
include 'HAVR_INS30.ASM'

ADR	 ENTRY_POINT

	 START
_MENU:
	 KBD
	 PHA
	 INT	BEEP		; KBD nie ma beepu
	 PPA
	 CPBNE	'A',M2		; AND
	 JMP	AND_PROC
M2:
	 CPBNE	'C',M3		; NOT
	 JMP	COM_PROC
M3:
	 CPBNE	'D',M4		; ADD
	 JMP	ADD_PROC
M4:
	 CPBNE	'N',M5		; NEG
	 JMP	NEG_PROC
M5:
	 CPBNE	'O',M6		; OR
	 JMP	OR_PROC
M6:
	 CPBNE	'S',M7		; SUB
	 JMP	SUB_PROC
M7:
	 CPBNE	'X',M8		; XOR
	 JMP	XOR_PROC
M8:
	 CPBNE	'L',M9		; LSL
	 JMP	LSL_PROC
M9:
	 CPBNE	'R',M10 	; LSR
	 JMP	LSR_PROC
M10:
	 CALL	 DSP_EQ_SIGN	 ; ?
	 JMP	 _MENU


AND_PROC:
	WRT	_and
	INS
	PHA
	INS
	PPB
	AND
	JMP	COMMON

COM_PROC:
	WRT	_com
	INS
	NOT
	JMP	COMMON

ADD_PROC:
	WRT	_add
	INS
	PHA
	INS
	PPB
	ADD
	JMP	COMMON

NEG_PROC:
	WRT	_neg
	INS
	NEG
	JMP	COMMON

OR_PROC:
	WRT	_or
	INS
	PHA
	INS
	PPB
	OR
	JMP	COMMON

SUB_PROC:
	WRT	_sub
	INS
	PHA
	INS
	PHA		       ; szyk odwrotny bo odejmowanie jest nieprzemienne
	PPB
	PPA
	SUB
	JMP	COMMON

XOR_PROC:
	WRT	_xor
	INS
	PHA
	INS
	PPB
	XOR
	JMP	COMMON

LSL_PROC:
	WRT	_lsl
	INS
	LSL
	JMP	COMMON

LSR_PROC:
	WRT	_lsr
	INS
	LSR

COMMON:
	PHA
	CALL	DSP_EQ_SIGN
	PPA
	DSP
	LD0	0	; SREG
	LDB	1
	AND
	CPBNE	1, NO_CY
	WRT	_cy
NO_CY:
	END


DSP_EQ_SIGN:
	WRT	_eq
	RET

DSP_QM_SIGN:
	WRT	_qm
	RET



dsp_prog_name:
	WRT   FILE_NAME
	RET


_eq:	db '=',0
_qm:	db '?',0
_and:	db 'AND',0
_add:	db 'ADD',0
_com:	db 'COM',0
_neg:	db 'NEG',0
_or:	db 'OR',0
_sub:	db 'SUB',0
_xor:	db 'XOR',0
_lsl:	db 'LSL',0
_lsr:	db 'LSR',0
_cy:	db ' C',0


	INFO_SECTION

ADR	FILE_NAME
	db 'CALCULATOR',0

	FILE_END

