96 lines
6.3 KiB
Plaintext
96 lines
6.3 KiB
Plaintext
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 addr" 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
|