LMI:
I think that the assembler language is not important with modern CPUs because most people use C or something like it and don't care if assembler is cryptic or not.
Assembler is not at all cryptic once you've used it for a few minutes. For example, here's the code you would use to copy 256 bytes from address 0x2000 to 0xE000 in 6809 assembler:
;; HOW IT'S CALLED
;; somewhere else, call the subroutine
bsr mv ; call mv (relative branch +127 to -128 bytes)
lbsr mv ; call mv (relative branch, +32767 to -32768 bytes)
jsr mv ; call mv by it's absolute address (non-relocatable)
;; code executes after "mv" is done
;; ACTUAL CODE
;; mv - code to copy 256 bytes from X to Y
mv ldb #0 ; 0 rolls around 256 times back to 0
ldx #$2000 ; source address
ldy #$e000 ; destination address
cp lda ,x+ ; get a source byte into a, auto-increment pointer
sta ,y+ ; write a to destination, auto-increment pointer
decb ; decrement b
bne cp ; unsigned test if b is not equal to 0 then goto "cp"
rts ; return to caller
note "X" and "Y" are 16 bit registers, usually used as pointers. "A" and "B" are 8 bit registers, and can also be used as one 16 bit register called "D" which consists of A (hi byte) and B (lo byte).
There is also the "CC" (condition code) register which indicates negative, zero, overflow, interrupts on or off, etc and "SP" which is the stack pointer, the "U" which is a "user" register (16 bit can be used just like X and Y), the "PC" (program counter) which has the address of the current opcode or operand being executed and "DP" which is "direct page".
Direct page is nice because you can set it to point to any 256 byte block of memory, then all accesses to it only require 8 bits of the address (which doubles the access speed).
For example, if you need to have the fastest possible access to internal SRAM, you set DP to $00 (which is where SRAM is mapped). Then, all accesses to addresses $0000 to $00FF are twice as fast.
Also, sram and ports can be relocated anywhere in the address space if desired. And, I/O ports are addressed the same way as memory (there is no separate "code" and "data" sections or opcodes).
For example, if PORT A is located at address $1000, then you simply write to address $1000 and the bits appear on Port A. Each port and each bit of each port can be set as an input or output (like AVR), but there is no built in pullup facility. If you want the equivalent of "pinMode (X, INPUT_PULLUP)", you have to wire in an actual resistor.
Notice that hex values are denoted with a dollar sign rather than "0x" or "h". In Motorola-speak, hex 4000 is $4000, not 0x4000 or 4000h.
The 6809 supports relative addressing, so it's simple and easy to write code that executes anywhere in the memory space. If you assemble code starting at, say, address $2000, then load it into $C000, it still runs (if you write it as PCR or "Program Counter Relative").
There are different addressing modes. For example:
ldx $8000 ; load X with the 16 bit data at address $8000 and $8001
ldx #$8000 ; load X with the immediate (actual) number "$8000"
ldx [$8000] ; load X with the 16 bit data located at the address pointed to by $8000-$8001
$4000 12 ; $1234 is stored at address $4000
$4001 34
....
....
$8000 40 ; $4000 is stored at address $8000
$8001 00
So if the hex value "$4000" is stored at location $8000-8001 (big endian), and the value "$1234" is stored at location $4000-4001, then the code above does this:
(1) X == $4000
(2) X == $8000
(3) X == $1234
The last one needs to be looked at a few times for the concept to "sink in". 
You can also arbitrarily get data from a pointer with an offset added. For example, if, starting at address $6000 you have a sequence of 0,1,2,3,4..... etc... stored (like this):
[b]$6000 00
$6001 01
$6002 02
....
$60FC 252
$60FD 253
$60FE 254
$60FF 255[/b]
Then point "X" to $6000 by saying "[b]ldx #$6000[/b]
"
the code "[b] lda 34,x[/b]
" loads the value stored at $6022 into "A" (which is 34 decimal). Likewise, hex can be used: "[b] lda $34,x[/b]
" loads "A" with the value stored at $6034 which is hex 34 (decimal 52).
If no prefix is used with a number, it's considered to be decimal. For example "50" is decimal 50, while "$50" is hex 50 (decimal 80).
Wonderful processor... my favorite one actually.