   list p=16f819, r=hex
#include p16f819.inc

; Symulacja przerzutnika RS z bramek NAND zapisywanego poziomem 0:
; RB0 – wejście przerzutnika  ~R (ang. Reset) aktywne po podaniu 0,
; RB1 – wejście przerzutnika  ~S (ang. Set) aktywne po podaniu 0,
; RA0 – wyjście przerzutnika Q,
; RA1 – wyjście przerzutnika ~Q.


; Jeśli zdefiniowana stala Internal_osc, to konfiguracja z wewnętrznym oscylatorem RC,
; w przeciwnym razie użyj zewnętrznego rezonatora kwarcowego w trybie XT
#define Internal_osc

#ifdef Internal_osc
__config _CP_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _INTRC_IO
#else
__config _CP_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC
#endif

; Definicje adresów zmiennych
wyj_Q_nieQ          equ 0x20


; Inicjalizacja portów

#ifdef Internal_osc
   banksel OSCCON            ; bank 1
   movlw   0x40
   iorwf   OSCCON,f          ; ustaw taktowanie wewnętrznego zegara RC na 1 MHz
#endif

   banksel ADCON1            ; bank 1
   movlw   0x06
   movwF   ADCON1            ; ustaw linie RA0...RA5 jako cyfrowe

   ; OPTION_REG w banku 1
   bcf  OPTION_REG, NOT_RBPU ; włącz rezystory do +5V plusa w porcie B

   ; TRISA i TRISB w banku 1
   movlw   b'11111100'
   movwf   TRISA             ; RA0 i RA1 jako wyjścia, reszta portu B jako wejścia
   movlw   0xFF
   movwf   TRISB             ; wszystkie linie portu A ustaw jako wejścia

   banksel PORTA             ; bank 0
   movlw   b'01'
   movwf   wyj_Q_nieQ
   movwf   PORTA             ; Ustaw początkowy stan wyjść RA0 (Q) i RA1 (nieQ)

main_loop
   ; W pętli wszystkie adresy w banku 0

   ;Przepisz bity nr 0 i 1 do W z odwróceniem ich kolejności
   clrw
   btfsc   wyj_Q_nieQ,0      ; jeśli ustawiony bit 0,
   iorlw   b'10'             ;   to ustaw bit 1 w rej. W
   btfsc   wyj_Q_nieQ,1      ; jeśli ustawiony bit 1,
   iorlw   b'01'             ;   to ustaw bit 0 w rej. W
   
   ; Symulacja dwóch bramek NAND w przerzutniku RS
   ;    Q := NOT(nieR AND nieQ),
   ; nieQ := NOT(nieS AND Q),
   ; gdzie nieR i nieS sa bitami odpowiednio 0 i 1 odczytanymi z PORTB
   andwf   PORTB, W
   xorlw   b'11'             ; zaneguj tylko bity nr 0 i 1
   ; wynik w rej. W
   
   movwf wyj_Q_nieQ          ; Zachowaj wynik dla następnego obiegu pętli
   movwf PORTA               ; Ustaw wyjścia RA0 (Q) i RA1 (nieQ)

   goto    main_loop

   end