                    00001           ;TPicSim6
                    00002           ;Programm zum Test des 16F84-Simulators.
                    00003           ;Es werden die Byte-orientieren File-Register-Befehle im 
                    00004           ;Zusammenhang mit der indirekten Adressierung geprüft
                    00005           ;
                    00006           ;(c) St. Lehmann
                    00007           ;Ersterstellung: 23.03.2016
                    00008           
                    00009           ;Hinweis:
                    00010           ;Bei der indirekten Adressierung werden die Register "IND" oder auch als
                    00011           ;"indirect" bezeichnet und das Register FSR (File Select Register)
                    00012           ;benutzt. Dabei beinhaltet das FSR-Register die Zieladresse in die etwas
                    00013           ;geschrieben oder von der etwas gelesen werden soll. Der eigentliche 
                    00014           ;Zugriff erfolgt über das Ansprechen der Registeradresse 0 (IND). Der PIC
                    00015           ;ersetzt in dem Falle die Adresse 0 durch die Adresse im FSR-Register.
                    00016           ;Da die Adresse im FSR-Register 8-Bit umfasst, die Adresse bei der direkten
                    00017           ;Adressierung jedoch nur 7 Bit, kann man durch die indirekte Adressierung
                    00018           ;auch auf Bank 1 zugreifen ohne das RP0-Bit zu setzen.
                    00019           ;
                    00020           ;Bei diesen Befehlen entscheidet das d-Bit (Destination), ob das Ergebnis
                    00021           ;dieser Operation ins W- oder File-Register geschrieben wird. Wird im
                    00022           ;Assemblercode der Befehl mit ",W" geschrieben, bedeutet dies, dass das
                    00023           ;d-Bit 0 ist und das Ergebnis ins W-Register kommt. Fehlt ",W" ist das 
                    00024           ;d-Bit 1 und das Ergebnis wird ins Fileregister geschrieben.
                    00025           ;
                    00026           list c=132          ;Zeilenlänge im LST auf 132 Zeichen setzen
                    00027           
                    00028           ;Definition einiger Symbole
                    00029           ;zuerst Hardware-Register
                    00030           indirect equ 00h
                    00031           status   equ 03h
                    00032           fsr      equ 04h
                    00033           ra       equ 05h
                    00034           rb       equ 06h
                    00035           
                    00036           ;für den Benutzer frei verwendbare Register
                    00037           wert1    equ 0ch             ;Variable Nr.1
                    00038           wert2    equ 0dh             ;Variable Nr.2
                    00039           ergeb    equ 0eh             ;Variable Nr.3
                    00040           
                    00041           ;Definition des Prozessors
                    00042           device 16F84
                    00043             
                    00044           ;Festlegen des Codebeginns
                    00045           org 0
                    00046  loop     
0000 3020           00047           movlw 20h           ;in W steht nun 20h, DC=?, C=?, Z=?
0001 008C           00048           movwf wert1         ;diesen Wert abspeichern, DC=?, C=?, Z=?
0002 3010           00049           movlw 10h           ;W = 10h, DC=?, C=?, Z=?
0003 0084           00050           movwf fsr           ;W=10h, FSR=10h, wert1=20h, wert2=?? , DC=?, C=?, Z=?
0004 008D           00051           movwf wert2         ;W=10h, FSR=10h, wert1=20h, wert2=10h, DC=?, C=?, Z=?
0005 080C           00052           movf wert1,w        ;W=20h
                    00053           ;der Speicherbereich von 10h bis 1Fh wird mit Zahlen 20h, 21h, etc. gefüllt
                    00054  loop1      
0006 0080           00055           movwf indirect      ;W=20h, FSR=10h, F10=20h
0007 3E01           00056           addlw 1             ;W=20h, 21h, 22h, etc
0008 0A84           00057           incf fsr            ;FSR=11h, 12h, etc
0009 0B8D           00058           decfsz wert2
000A 2806           00059           goto loop1
                    00060             
000B 301F           00061           movlw 1fh           ;FSR-Zeiger wieder auf Anfang stellen
000C 0084           00062           movwf fsr
000D 30F0           00063           movlw 0f0h
000E 008D           00064           movwf wert2
000F 0100           00065           clrw
                    00066  loop2    
0010 0700           00067           addwf indirect,w
0011 0384           00068           decf fsr
0012 0F8D           00069           incfsz wert2
0013 2810           00070           goto loop2
                    00071           ;im W-Register muss 78h stehen
0014 008D           00072           movwf wert2
0015 0A84           00073           incf fsr
0016 0C80           00074           rrf indirect        ;F10=10h
0017 0A80           00075           incf indirect       ;F10=11h
0018 0C80           00076           rrf indirect        ;F10=08h, C=1
0019 1780           00077           bsf indirect,7      ;F10=88h
001A 1003           00078           bcf status,0        ;C=0                             
001B 0D80           00079           rlf indirect        ;F10=10h, C=1
001C 0A84           00080           incf fsr            ;fsr=11h
001D 0D80           00081           rlf indirect        ;F11=43h, C=0
001E 0E80           00082           swapf indirect      ;F11=34h
001F 0680           00083           xorwf indirect      ;F11=4Ch
0020 1A80           00084           btfsc indirect,5
0021 2800           00085           goto loop
0022 1D00           00086           btfss indirect,2
0023 2800           00087           goto loop
0024 1980           00088           btfsc indirect,3
0025 2827           00089           goto ende
0026 2800           00090           goto loop
                    00091           
                    00092  ende     
0027 2827           00093           goto ende           ;Endlosschleife, verhindert Nirwana
                    00094           
                    00095             
