;==============================================================================
; programmemória mutató feltöltése konstans értékkel
; paraméterek :
; - Addr : adatmemória címe (konstans)
ltblptr macro Addr
                movlw   LOW Addr
                movwf   TBLPTRL
                movlw   HIGH Addr
                movwf   TBLPTRH
endm

;==============================================================================
; programmemória mutató mentése egy 16 bites változóba
; paraméterek :
; - tw : 16 bites változó, ahová a mentés történjen
tblptrs macro tw
                movff   TBLPTRL, tw
                movff   TBLPTRH, tw + 1
endm
;==============================================================================
; programmemória mutató betöltése egy 16 bites változóból
; paraméterek :
; - tw : 16 bites változó, ahol a betöltendő mutató található
tblptrl macro tw
                movff   tw, TBLPTRL
                movff   tw + 1, TBLPTRH
endm

;==============================================================================
; adatmemória mutató beállítása egy bájtokat tartalmazó tömb, index-edik elemére
; paraméterek :
; - FszNum = {0, 1, 2} : melyik adatmutatót állítsa be
; - ArrayStart : tömb kezdőcíme (konstans)
; - index : 8 bites változó, amelyik az indexet tartalmazza
; megj: a tömbnek egy lapon belül kell lennie
lfsrb  macro FsrNum, ArrayStart, index
if FsrNum == 0
                lfsr    0, ArrayStart
                movf    index, W
                addwf   FSR0L, f
endif
if FsrNum == 1
                lfsr    1, ArrayStart
                movf    index, W
                addwf   FSR1L, f
endif
if FsrNum == 2
                lfsr    2, ArrayStart
                movf    index, W
                addwf   FSR2L, f
endif
endm

;==============================================================================
; adatmemória mutató beállítása egy szavakat tartalmazó tömb, index-edik elemére
; paraméterek :
; - FszNum = {0, 1, 2} : melyik adatmutatót állítsa be
; - ArrayStart : tömb kezdőcíme (konstans)
; - index : 8 bites változó, amelyik az indexet tartalmazza
; megj: a tömbnek egy lapon belül kell lennie
lfsrw  macro FsrNum, ArrayStart, index
if FsrNum == 0
                lfsr    0, ArrayStart
                bcf     STATUS, C
                rlcf    index, W
                addwf   FSR0L, f
endif
if FsrNum == 1
                lfsr    1, ArrayStart
                bcf     STATUS, C
                rlcf    index, W
                addwf   FSR1L, f
endif
if FsrNum == 2
                lfsr    2, ArrayStart
                bcf     STATUS, C
                rlcf    index, W
                addwf   FSR2L, f
endif
endm

;==============================================================================
; adatmemória mutató mentése egy 16 bites változóba
; paraméterek :
; - FszNum = {0, 1, 2} : melyik adatmutatót állítsa be
; - fw : 16 bites változó, ahová a mentés történjen
fsrs  macro FsrNum, fw
if FsrNum == 0
                movff   FSR0L, fw
                movff   FSR0H, fw + 1
endif
if FsrNum == 1
                movff   FSR1L, fw
                movff   FSR1H, fw + 1
endif
if FsrNum == 2
                movff   FSR2L, fw
                movff   FSR2H, fw + 1
endif
endm

;==============================================================================
; adatmemória mutató betöltése egy 16 bites változóból
; paraméterek :
; - FszNum = {0, 1, 2} : melyik adatmutatót állítsa be
; - fw : 16 bites változó, ahol a betöltendő mutató található
fsrl  macro FsrNum, fw
if FsrNum == 0
                movff   fw, FSR0L
                movff   fw + 1, FSR0H
endif
if FsrNum == 1
                movff   fw, FSR1L
                movff   fw + 1, FSR1H
endif
if FsrNum == 2
                movff   fw, FSR2L
                movff   fw + 1, FSR2H
endif
endm

;==============================================================================
; W-ben található 8 bites bináris számot karakteressé alakítja
; képes előjel nélküli és előjeles számok átalakítására is
; ha a szám nem fér el 'he' karakterhelyen, az elejét csonkolja
; a makro hivatkozás helyén szükséges változók:
; - Num : átmeneti tár a szám tárolásához
; - WTemp : átmeneti tár W regiszter tárolásához
; - ZeroSw : egy bit tárolóhely a kezdő nullák eltüntetéséhez (csak ha ZeroChar != '0')
; - NegSw : egy bit tárolóhely az előjel tárolásához (csak ha NegChar == '-')
; paraméterek :
; - he = {1, 2, 3} : ennyi számjeggyel írja ki
; - ZeroChar : szám elején előforduló nullákat mivel helyettesítse
; - NegChar : ha '-' akkor előjeles számként írja ki
; - WriteProc : karakterkiíró eljárás címe

WriteByte  macro  he, ZeroChar, NegChar, WriteProc
LOCAL  l100loop, l100end, l10loop, l10end
LOCAL  n100, n10, n1

                movwf   Num
; előjeles szám esetén
if NegChar == '-'
LOCAL Plus
                bcf     NegSw                     ; pozitív szám
                btfss   Num, 7                    ; pozitív ?
                bra     Plus                      ; igen
                negf    Num
                bsf     NegSw                     ; negatív szám
Plus
endif

if ZeroChar != '0'
                bcf     ZeroSw
endif

if NegChar == '-' & ZeroChar == '0'
                movlw   NegChar
                btfss   NegSw
                movlw   ' '
                rcall   WriteProc
endif

; százasok
if he >= 3
                movlw   '0'
                movwf   WTemp
endif
l100loop        movlw   .100
                subwf   Num, f
                bnc     l100end
if he >= 3
                incf    WTemp, f
  if ZeroChar != '0'
    if NegChar == '-'
                btfsc   ZeroSw
                bra     n100
                movlw   ' '
                btfsc   NegSw
                movlw   NegChar
                rcall   WriteProc
    n100
    endif
                bsf     ZeroSw
  endif
endif
                bra     l100loop
                
l100end         movlw   .100
                addwf   Num, f

if he >= 3
  if ZeroChar != '0'
                movf    WTemp, W
                btfss   ZeroSw
                movlw   ZeroChar
                rcall   WriteProc
  else
                movf    WTemp, W
                rcall   WriteProc
  endif
endif

; tizesek
if he >= 2
                movlw   '0'
                movwf   WTemp
endif
l10loop         movlw   .10
                subwf   Num, f
                bnc     l10end
if he >= 2
                incf    WTemp, f
  if ZeroChar != '0'
    if NegChar == '-'
                btfsc   ZeroSw
                bra     n10
                movlw   ' '
                btfsc   NegSw
                movlw   NegChar
                rcall   WriteProc
    n10
    endif
                bsf     ZeroSw
  endif
endif
                bra     l10loop
                
l10end          movlw   .10
                addwf   Num, f
if he >= 1
  if ZeroChar != '0'
                movf    WTemp, W
                btfss   ZeroSw
                movlw   ZeroChar
                rcall   WriteProc
  else
                movf    WTemp, W
                rcall   WriteProc
  endif
endif

if NegChar == '-'
                btfsc   ZeroSw
                bra     n1
                movlw   ' '
                btfsc   NegSw
                movlw   NegChar
                rcall   WriteProc
n1
endif
; egyesek
                movlw   '0'
                addwf   Num, W
                rcall   WriteProc
endm

;==============================================================================
; Num változóban levő 16 bites bináris számot karakteressé alakítja
; képes előjel nélküli és előjeles számok átalakítására is
; ha a szám nem fér el 'he' karakterhelyen, az elejét csonkolja
; a makro hivatkozás helyén szükséges változók:
; - Num : változó a 16 bites szám tárolásához, az átalakítandó számot is ide kell tenni
; - WTemp : átmeneti tár W regiszter tárolásához
; - ZeroSw : egy bit tárolóhely a kezdő nullák eltüntetéséhez (csak ha ZeroChar != '0')
; - NegSw : egy bit tárolóhely az előjel tárolásához (csak ha NegChar == '-')
; paraméterek :
; - he = {3, 4, 5} : ennyi számjeggyel írja ki
; - ZeroChar : szám elején előforduló nullákat mivel helyettesítse
; - NegChar : ha '-' akkor előjeles számként írja ki
; - WriteProc : karakterkiíró eljárás

WriteWord  macro  he, ZeroChar, NegChar, WriteProc
LOCAL  l10000loop, l10000end, l1000loop, l1000end, l100loop, l100end, l10loop, l10end
LOCAL  n10000, n1000, n100, n10, n1

; előjeles szám esetén
if NegChar == '-'
LOCAL Plus
                bcf     NegSw                     ; pozitív szám
                btfss   Num + 1, 7                ; pozitív ?
                bra     Plus                      ; igen

                comf    Num + 1, f
                negf    Num
                btfsc   STATUS, C
                incf    Num + 1, f
                bsf     NegSw                     ; negatív szám
Plus
endif

if ZeroChar != '0'
                bcf     ZeroSw
endif

; ha előjeles és kezdőnullák is vannak, akkor előjel kiírása
if NegChar == '-' & ZeroChar == '0'
                movlw   NegChar                   ; negatív számnál ezt
                btfss   NegSw
                movlw   ' '                       ; pozitív számnál ezt
                rcall   WriteProc
endif

; tízezresek
if he >= 5
                movlw   '0'
                movwf   WTemp
endif
l10000loop      movlw   LOW .10000
                subwf   Num, f
                movlw   HIGH .10000
                subwfb  Num + 1, f
                bnc     l10000end
if he >= 5
                incf    WTemp, f
  if ZeroChar != '0'
    if NegChar == '-'
                btfsc   ZeroSw
                bra     n10000
                movlw   ' '
                btfsc   NegSw
                movlw   NegChar
                rcall   WriteProc
    n10000
    endif
                bsf     ZeroSw
  endif
endif
                bra     l10000loop
                
l10000end       movlw   LOW .10000
                addwf   Num, f
                movlw   HIGH .10000
                addwfc  Num + 1, f

if he >= 5
  if ZeroChar != '0'
                movf    WTemp, W
                btfss   ZeroSw
                movlw   ZeroChar
                rcall   WriteProc
  else
                movf    WTemp, W
                rcall   WriteProc
  endif
endif

; ezresek
if he >= 4
                movlw   '0'
                movwf   WTemp
endif
l1000loop       movlw   LOW .1000
                subwf   Num, f
                movlw   HIGH .1000
                subwfb  Num + 1, f
                bnc     l1000end
if he >= 4
                incf    WTemp, f
  if ZeroChar != '0'
    if NegChar == '-'
                btfsc   ZeroSw
                bra     n1000
                movlw   ' '
                btfsc   NegSw
                movlw   NegChar
                rcall   WriteProc
    n1000
    endif
                bsf     ZeroSw
  endif
endif
                bra     l1000loop
                
l1000end        movlw   LOW .1000
                addwf   Num, f
                movlw   HIGH .1000
                addwfc  Num + 1, f

if he >= 4
  if ZeroChar != '0'
                movf    WTemp, W
                btfss   ZeroSw
                movlw   ZeroChar
                rcall   WriteProc
  else
                movf    WTemp, W
                rcall   WriteProc
  endif
endif

; százasok
if he >= 3
                movlw   '0'
                movwf   WTemp
endif
l100loop        movlw   LOW .100
                subwf   Num, f
                movlw   HIGH .100
                subwfb  Num + 1, f
                bnc     l100end
if he >= 3
                incf    WTemp, f
  if ZeroChar != '0'
    if NegChar == '-'
                btfsc   ZeroSw
                bra     n100
                movlw   ' '
                btfsc   NegSw
                movlw   NegChar
                rcall   WriteProc
    n100
    endif
                bsf     ZeroSw
  endif
endif
                bra     l100loop
                
l100end         movlw   LOW .100
                addwf   Num, f
                movlw   HIGH .100
                addwfc  Num + 1, f

if he >= 3
  if ZeroChar != '0'
                movf    WTemp, W
                btfss   ZeroSw
                movlw   ZeroChar
                rcall   WriteProc
  else
                movf    WTemp, W
                rcall   WriteProc
  endif
endif

; tizesek
if he >= 2
                movlw   '0'
                movwf   WTemp
endif
l10loop         movlw   .10
                subwf   Num, f
                bnc     l10end
if he >= 2
                incf    WTemp, f
  if ZeroChar != '0'
    if NegChar == '-'
                btfsc   ZeroSw
                bra     n10
                movlw   ' '
                btfsc   NegSw
                movlw   NegChar
                rcall   WriteProc
    n10
    endif
                bsf     ZeroSw
  endif
endif
                bra     l10loop
                
l10end          movlw   .10
                addwf   Num, f

if he >= 1
  if ZeroChar != '0'
                movf    WTemp, W
                btfss   ZeroSw
                movlw   ZeroChar
                rcall   WriteProc
  else
                movf    WTemp, W
                rcall   WriteProc
endif
endif

if NegChar == '-'
                btfsc   ZeroSw
                bra     n1
                movlw   ' '
                btfsc   NegSw
                movlw   NegChar
                rcall   WriteProc
n1
endif
                movlw   '0'
                addwf   Num, W
                rcall   WriteProc
endm
