Thats a wierd bit of code, I have no idea why some things are being done, I have a feeling whoever wrote that code also is learning how to do it!!
Doing as Peter says may be better if your unsure, if all the data is together then it may be better, if the data is all over the place then indirect addressing is a must.
The bit you wannt to know, indirect addressing. The method here is using AR1 to hold the indirect address, the data format is already set up by the fact that it uses T DBW, this tells the system its a dataword format and uses the open DB.
T DBW[AR1, P#0.0]
AR1 = the data word and P#0.0 is the OFFSET. This method is good if you had multiple words to write to and you just calculate the first word.
For example you want to wrote to DBW 4, 6 and 8, you would insert the offset for the first word into AR1 (I'll explain that bit later on) and then you could access the words in successive instructions such as T DBW[AR1, P#0.0], then T DBW[AR1, P#2.0] and finally T DBW[AR1, P#4.0]. The P# is a pointer offset and in the example it offsets by 0, 2 bytes and 4 bytes.
In your code he does not do this, so he could have coded simpler.
AR1 = address register 1, this is the address pointer.
AR1 was loaded with a byte address, the way the programmer did this was to load a 'M Byte' and SLW4, this means he is restricting the address to between 0 and 15 (Its doubled later on, so between 0 to 30 in words).
To explain what he's doing, the pointer takes the format BYTE ADDRESS.BIT ADDRESS, it is two words long. The format of the bits in the two words are:
mmmmmmmm 00000yyy yyyyyyyy yyyyybbb
where m = memory area (this is not used in the example it is directly programmed as DBW, therefore data block area).
0 = unused
y = byte address
b = bit address
If MW254 held the value 12, then by shifting MB255 (the LSB) he moves the bits left 3, as the right 3 bits are the bit address, then a further left 1 (multiply by 2), therefore the address he would be pointing to would be '24' not '12'.
So T DBW[AR1, P#0.0], would transfer the data to dataword 24.
Now the code!!!!
1. He uses a MW254, when MB255 would have been suffice (note the instruction INC is a byte instruction and would leave MB254 (MSB) unchanged.
2. T DBW[AR1, P#0.0] could have been simpler, if he had stored the address in a double word, say created a DWORD TEMP flag (call it 'ADDRESS', then instead of LAR1, could have had T #ADDRESS, followed by T DBW[#ADDRESS].
3. I have no idea why he saves and restores the STW in between each move.
4. What does he use #conv_akku1 for, he loads data in and never uses it! #conv_akku2 only is transferred into your DW! [and akku2 is only the address pointer?]
How he gets the address in the first place, the contents of DB244.DBW2 is multuplied by 3 and added by 20, therefore the first word will always be 20 minimum (if DBW2 = 0).
In this case as well, the same words (DBW34, DBW36 and DBW38) are always written into words pointed to by the AR1 offsets.
Hope this helps.