;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; HVR
; WERSJA:       4.39 (dla HF-6050)
; INSTRUKCJI:   80
;
; ZMIANY WERSJI
; wersja 3.35 skrócone mnemoniki instrukcji WRIO -> WRI, RDIO -> RDI, INSB -> INS, DSPB -> DSP,
;              WRTXT -> WRT, WRSYS -> WRS, PSHx -> PHx, POPx -> PPx (zaoszczędzone 32 bajt)
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; SYSTEM CONSTANTS
HAVR_VER_H	equ		 4
HAVR_VER_L	equ		 39
ENTRY_POINT	equ		 0x00
FUNC_SEG	equ		 0x80
DATA_SEG	equ		 0xD0
HAVRVERH	equ		 0xED
HAVRVERL	equ		 0xEE
HARDWARE_COMPAT equ		 0xEF
FILE_NAME	equ		 0xF0
HF6050_HW	equ		 0x50
HF6050_6030_HW	equ		 0x80	  ; HF6050 + HF6030
HF6050_6048_HW	equ		 0x98	  ; HF6050 + HF6048
ALL_HW		equ		 0xFF
EXTRA_CODESEG	equ		 0xEC
EXTRA_DATASEG	equ		 0xED
HF6050_MAX_FLA	equ		 0xFFFF

RAMSEG0 	equ		 0x00
RAMSEG1 	equ		 0x01
RAMSEG2 	equ		 0x02
RAMSEG3 	equ		 0x03
RAMSEG4 	equ		 0x04
RAMSEG5 	equ		 0x05
RAMSEG6 	equ		 0x06
RAMSEG7 	equ		 0x07
RAMSEG8 	equ		 0x08
RAMSEG9 	equ		 0x09
RAMSEGA 	equ		 0x0A
RAMSEGB 	equ		 0x0B
RAMSEGC 	equ		 0x0C
RAMSEGD 	equ		 0x0D
RAMSEGE 	equ		 0x0E
RAMSEGF 	equ		 0x0F
RAMSEG10	equ		 0x10


; COMPILATOR DIRECTIVES
macro		ADR	   arg	{ times arg-$ db 0 }
macro		INFO_SECTION	{ times 0xEC-$ db 0
				  db	0		 ; EXTRA CODE SEGMENT
				  db	0		 ; EXTRA DATA SEGMENT
				  db	HAVR_VER_L	 ; VERSION
				  db	HF6050_HW    }	 ; HCC
macro		FILE_END	{ times 0x100-$ db 0 }


; INSTRUCTIONS
macro		START		{ if ($ > 0)
				   display 'START must be at address 0x00 only!',0x0D,0x0A
				  else
				  db	  0xAA
				  end if  }
macro		END		{ db	  0x00	   }
macro		LDA	   arg	{ db	  0x01
				  db	  arg	   }
macro		LDB	   arg	{ db	  0x02
				  db	  arg	   }
macro		LDC	   arg	{ db	  0x03
				  db	  arg	   }
macro		LDD	   arg	{ db	  0x04
				  db	  arg	   }
macro		LDE	   arg	{ db	  0x05
				  db	  arg	   }
macro		PHA		{ db	  0x06	   }
macro		PPA		{ db	  0x07	   }
macro		PHB		{ db	  0x08	   }
macro		PPB		{ db	  0x09	   }
macro		PHC		{ db	  0x0A	   }
macro		PPC		{ db	  0x0B	   }
macro		PHD		{ db	  0x0C	   }
macro		PPD		{ db	  0x0D	   }
macro		PHE		{ db	  0x0E	   }
macro		PPE		{ db	  0x0F	   }
macro		NOP		{ db	  0x10	   }
macro		RPA		{ db	  0x11	   }
macro		RPB		{ db	  0x12	   }
macro		RPC		{ db	  0x13	   }
macro		RPD		{ db	  0x14	   }
macro		WPA		{ db	  0x15	   }
macro		WPB		{ db	  0x16	   }
macro		WPC		{ db	  0x17	   }
macro		WPD		{ db	  0x18	   }
macro		ADD		{ db	  0x19	   }
macro		SUB		{ db	  0x1A	   }
macro		AND		{ db	  0x1B	   }
macro		OR		{ db	  0x1C	   }
macro		XOR		{ db	  0x1D	   }
macro		NEG		{ db	  0x1E	   }
macro		NOT		{ db	  0x1F	   }
macro		LSL		{ db	  0x20	   }
macro		LSR		{ db	  0x21	   }
macro		DEC		{ db	  0x22	   }
macro		INC		{ db	  0x23	   }
macro		INT	   arg	{ db	  0x24
				  db	  arg	   }
macro		I2CRD		{ db	  0x25	   }
macro		I2CIT		{ db	  0x26	   }
macro		I2CST	   arg	{ db	  0x27
				  db	  arg	   }
macro		I2CWR	   arg	{ db	  0x28
				  db	  arg	   }
macro		I2CSP		{ db	  0x29	   }
macro		KBD		{ db	  0x2A	   }
macro		CPBNE arg1,arg2 { db	  0x2B
				  db	  arg1
				  db	  arg2	   }
macro		CALL	   arg	{ db	  0x2C
				  db	  arg	   }
macro		RET		{ db	  0x2D	   }
macro		DBNE	   arg	{ db	  0x2E		  ; = LOOP
				  db	  arg	   }
macro		LOOP	   arg	{ db	  0x2E		  ; = DBNE
				  db	  arg	   }
macro		JMP	   arg	{ db	  0x2F
				  db	  arg	   }
macro		GOTO	   arg	{ if (arg > HF6050_MAX_FLA)
				   display 'Address out of FLASH range!',0x0D,0x0A
				  else
				  db	  0x30
				  db	  (arg SHR 8)
				  db	  (arg AND 0xFF)
				  end if  }
macro		DEL20U		{ db	  0x31	   }
macro		DEL100U 	{ db	  0x32	   }
macro		DEL1M		{ db	  0x33	   }
macro		ST0	    arg { db	  0x34, arg	}     ; adr
macro		DEL10M		{ db	  0x35	   }
macro		DEL40M		{ db	  0x36	   }
macro		DEL100M 	{ db	  0x37	   }
macro		DEL200M 	{ db	  0x38	   }
macro		DEL500M 	{ db	  0x39	   }
macro		DEL1		{ db	  0x3A	   }
macro		DBG		{ db	  0x3B	   }
macro		WRT	    arg { db	  0x3C
				  db	  arg	   }
macro		WRS	    arg { db	  0x3D
				  db	  arg	   }
macro		INS		{ db	  0x3E	   }
macro		DSP		{ db	  0x3F	   }
macro		RDI	    arg { db	  0x40		;
				  db	  arg	   }	; adr
macro		RDI	    arg { db	  0x40, arg	}   ; adr stara wersja - do wycofania
macro		LD0	    arg { db	  0x40, arg	}   ; adr aktualna wersja
macro		WRI    arg1,arg2{ if ((arg1 eq 0x1A) | (arg1 eq 0x1B))
				   display 'HAVR Program Counter cannot be accessed!',0x0D,0x0A
				  else
				  db	  0x41		; adr, data
				  db	  arg1		; adr
				  db	  arg2		; data
				  end if  }
macro		LD	   arg	{ db	  0x42		;
				  db	  arg	   }	; adr
macro		ST	   arg	{ db	  0x43		;
				  db	  arg	   }	; adr
macro		LD2	   arg	{ db	  0x44		;
				  db	  arg	   }	; adr
macro		ST2	   arg	{ db	  0x45		;
				  db	  arg	   }	; adr
macro		LD3	   arg	{ db	  0x46		;
				  db	  arg	   }	; adr
macro		ST3	   arg	{ db	  0x47		;
				  db	  arg	   }	; adr
macro		CPBLO  arg,arg2 { db	  0x48		;
				  db	  arg		; constant
				  db	  arg2	   }	; adr
macro		RPE		{ db	  0x49	   }
macro		RPF		{ db	  0x4A	   }
macro		WPE		{ db	  0x4B	   }
macro		WPF		{ db	  0x4C	   }
macro		LDX    arg,arg2 { db	  0x4D		;
				  db	  arg, arg2}	; adrh, adrl
macro		STX    arg,arg2 { db	  0x4E		;
				  db	  arg, arg2}	; adrh, adrl




; MACROINSTRUCTIONS
macro		CLRA		{ db	  0x01
				  db	  0x00	   }
macro		CLRB		{ db	  0x02
				  db	  0x00	   }
macro		CLRC		{ db	  0x03
				  db	  0x00	   }
macro		CLRD		{ db	  0x04
				  db	  0x00	   }
macro		CLRE		{ db	  0x05
				  db	  0x00	   }
macro		SERA		{ db	  0x01
				  db	  0xFF	   }
macro		SERB		{ db	  0x02
				  db	  0xFF	   }
macro		SERC		{ db	  0x03
				  db	  0xFF	   }
macro		SERD		{ db	  0x04
				  db	  0xFF	   }
macro		SERE		{ db	  0x05
				  db	  0xFF	   }
macro		MOVAB		{ db	  0x08
				  db	  0x07	   }
macro		MOVAC		{ db	  0x0A
				  db	  0x07	   }
macro		MOVAD		{ db	  0x0C
				  db	  0x07	   }
macro		MOVAE		{ db	  0x0E
				  db	  0x07	   }
macro		MOVBA		{ db	  0x06
				  db	  0x09	   }
macro		MOVBC		{ db	  0x0A
				  db	  0x09	   }
macro		MOVBD		{ db	  0x0C
				  db	  0x09	   }
macro		MOVBE		{ db	  0x0E
				  db	  0x09	   }
macro		MOVCA		{ db	  0x06
				  db	  0x0B	   }
macro		MOVCB		{ db	  0x08
				  db	  0x0B	   }
macro		MOVCD		{ db	  0x0C
				  db	  0x0B	   }
macro		MOVCE		{ db	  0x0E
				  db	  0x0B	   }
macro		MOVDA		{ db	  0x06
				  db	  0x0D	   }
macro		MOVDB		{ db	  0x08
				  db	  0x0D	   }
macro		MOVDC		{ db	  0x0A
				  db	  0x0D	   }
macro		MOVDE		{ db	  0x0E
				  db	  0x0D	   }
macro		MOVEA		{ db	  0x06
				  db	  0x0F	   }
macro		MOVEB		{ db	  0x08
				  db	  0x0F	   }
macro		MOVEC		{ db	  0x0A
				  db	  0x0F	   }
macro		MOVED		{ db	  0x0C
				  db	  0x0F	   }
macro		POPALL		{ db	  0x0F
				  db	  0x0D
				  db	  0x0B
				  db	  0x09
				  db	  0x07	   }
macro		PUSHALL 	{ db	  0x06
				  db	  0x08
				  db	  0x0A
				  db	  0x0C
				  db	  0x0E	   }
macro		SPI0	    arg { db	  0x01
				  db	  arg
				  db	  0x24
				  db	  0x30	   }
macro		SPI3	    arg { db	  0x01
				  db	  arg
				  db	  0x24
				  db	  0x31	   }
macro		ADC0		{ db	  0x24
				  db	  0xA0	   }
macro		ADC1		{ db	  0x24
				  db	  0xA1	   }
macro		ADC2		{ db	  0x24
				  db	  0xA2	   }
macro		ADC3		{ db	  0x24
				  db	  0xA3	   }
macro		ADC4		{ db	  0x24
				  db	  0xA4	   }
macro		ADC5		{ db	  0x24
				  db	  0xA5	   }
macro		ADC6		{ db	  0x24
				  db	  0xA6	   }
macro		ADC7		{ db	  0x24
				  db	  0xA7	   }
macro		XCHGAB		{ db	  0x06
				  db	  0x08
				  db	  0x07
				  db	  0x09	   }
macro		XCHGAC		{ db	  0x06
				  db	  0x0A
				  db	  0x07
				  db	  0x0B	   }
macro		XCHGAD		{ db	  0x06
				  db	  0x0C
				  db	  0x07
				  db	  0x0D	   }
macro		XCHGAE		{ db	  0x06
				  db	  0x0E
				  db	  0x07
				  db	  0x0F	   }
macro		XCHGBA		{ db	  0x06
				  db	  0x08
				  db	  0x07
				  db	  0x09	   }
macro		XCHGBC		{ db	  0x08
				  db	  0x0A
				  db	  0x09
				  db	  0x0B	   }
macro		XCHGBD		{ db	  0x08
				  db	  0x0C
				  db	  0x09
				  db	  0x0D	   }
macro		XCHGBE		{ db	  0x08
				  db	  0x0E
				  db	  0x09
				  db	  0x0F	   }
macro		XCHGCA		{ db	  0x06
				  db	  0x0A
				  db	  0x07
				  db	  0x0B	   }
macro		XCHGCB		{ db	  0x08
				  db	  0x0A
				  db	  0x09
				  db	  0x0B	   }
macro		XCHGCD		{ db	  0x0A
				  db	  0x0C
				  db	  0x0B
				  db	  0x0D	   }
macro		XCHGCE		{ db	  0x0A
				  db	  0x0E
				  db	  0x0B
				  db	  0x0F	   }
macro		XCHGDA		{ db	  0x06
				  db	  0x0C
				  db	  0x07
				  db	  0x0D	   }
macro		XCHGDB		{ db	  0x08
				  db	  0x0C
				  db	  0x09
				  db	  0x0D	   }
macro		XCHGDC		{ db	  0x0A
				  db	  0x0C
				  db	  0x0B
				  db	  0x0D	   }
macro		XCHGDE		{ db	  0x0C
				  db	  0x0E
				  db	  0x0D
				  db	  0x0F	   }
macro		XCHGEA		{ db	  0x06
				  db	  0x0E
				  db	  0x07
				  db	  0x0F	   }
macro		XCHGEB		{ db	  0x08
				  db	  0x0E
				  db	  0x09
				  db	  0x0F	   }
macro		XCHGEC		{ db	  0x0A
				  db	  0x0E
				  db	  0x0B
				  db	  0x0F	   }
macro		XCHGED		{ db	  0x0C
				  db	  0x0E
				  db	  0x0D
				  db	  0x0F	   }

; BŁĘDY - INSTRUKCJE ZAREZERWOWANE - FASM PRZYDZIELA KODY 80x86
macro		INSB		{ display 'INSB: reserved instruction',0x0D,0x0A }
macro		POP		{ display 'POP: reserved instruction',0x0D,0x0A }
macro		POPA		{ display 'POPA: reserved instruction',0x0D,0x0A }
macro		PUSH		{ display 'PUSH: reserved instruction',0x0D,0x0A }
macro		PUSHA		{ display 'PUSHA: reserved instruction',0x0D,0x0A }




