It's kind of funny thinking that I started off learning Basic from an Oric-1 Manual, and then got an Amstrad and started learning Z80 machine code without any help from school at all.
In fact the only language that almost made me give up coding was 6502 machine code. Have you ever tried writing in a language that has no registers larger than one byte? Simply working out a relative address was a nightmare 
you mean code like 10111011111100... 
Noy quite, but knowledge of Binary was pretty much a must, Boolean Flags really took up 1 bit of memory then and you could only access them as whole bytes, so you learned how you rotate your bits in public

Basically, it was assembly code, but the assemblers that were available back then were utter nightmares to use compared to modern ones, you had to do 'Grey Box' Testing, which, is sort of halfway between Black Box and White Box testing, it basically means 'I have a vague idea what should happen when this routine runs, but I'll find out how close it is when I run it, and fix it accordingly'.
It sort of looked like:-
LDA &FE
STA &BB00
LDA &00
STA &BB01
JSR (&BB00)
END.
That was, quite literally, the only way to call a referenced subroutine, now, a cookie for who knows what address a 6502 machine could would try to jump to?