THE MOTOROLA 68000 INSTRUCTIONS EXPLAINED


;Motorola MC680000 instructions	explained
;dec 94 by Henrik Stolpe

;PROGRAM CONTROL

;Bcc
;villkorligt hopp
;se vidare fil "cc", conditional branch

;DBcc
;decrement branch conditionally
;samma som Bcc,men raknar ner kall reg
;anvands for slingor
r1:
clr	d0
clr	d0
move	#5,d0			;lagg 2 id 0
loop:
cmp	#1,d0			;jamfor 2 med d0
dbeq	d0,loop			;samma rakna ner d0,hoppa till loop
move	#1,d1			;visa att det funker
rts

;Scc
;set according to condition
;samma som Bcc,men satter hela byten till 1 om cond=true och till 0 om cond=fal.
;endast byte

;BRA,JMP
;hoppa ovillkorligt
;ex.BRA routine

;BSR,JSR
;hoppa till subrutin,aterhoppsadressen sparas pa stacken,RTS hoppar tillbaka
;BSR	routine

;CHK
;se TRAPV
;jamfor ett register mot grans,om storre ,eller mindre an 0 utloses 
;exception och hopar till rutin i $018 
;endast word,ej an direkt

;RTE
;hoppar tillbaka fran exception

;RTR
;hoppar tillbaka o laddar flaggorna

;RTS
;hoppar tillbak fran subrutin

;TRAP
;vaktor till rutin for exception 16st
;anvands for rutiner som skall exekveras vid speciella handelser
;ex.felmed.,eller for att enkelt hoppa till supervisor laget 
r2:
initiering:			;assemblera och j r2
move.l	#trap0,$80		;satter vektor till trap0 rutin
rts

traptest:				;j traptest
trap	#0			;utfor rutinen i $80
rts

trap0:				;traprutin
clr	d0
move	#2,d0			;visa att det funkar
rte				;return from exception



;TRAPV
;om V flaggan ar satt uloses exception TRAPV
;hoppar till rutin i $01c
r3:
move.l	#trapv,$01c		;satt vektor till trapv rutin
rts

trapvtest:
move	#2,ccr			;satt V i CCR
trapv				;om V=1 ulos exception
rts

trapv:				;trapv rutin				
clr	d0
move	#1,d0			;visa att det funkar
rte				;return from exception




;Motorola MC680000 instructions explained
;dec 94 by Henrik Stolpe

;CONDITION CODE REGISTER

;villkors koderna uppfylls eller inte beroende pa flaggornas tillstand
;flaggorna finns CCR som ar den undre byten i SR=status registret
;olika flaggor satts som resultat av operationer
;man kan aven satta enskilda flaggor i CCR med "move.b varde,CCR" 

;bit 0	C 	Carry		minnessiffra vid log.op,spill
;bit 1  V	Overflow	tecken andrat,spill fran bit 6 till 7
;bit 2	Z	Zero		resultat av op=0  (ex.CMP) 
;bit 3  N	Negative	resultat = negativt,msb=1
;bit 4  X	Extended	som C fast vid aritmetiska op
;bit 5-7	Oanvanda



;CC     CONDITION		CCR CONDITION=TRUE

;T	True, alltid		-				
;F	False,aldrig		-
;HI	Higher			C=0 & Z=0
;LS	Lower or same		C=1 or Z=1
;CC,HS	Higher or same		C=0
;CS,LO	Lower			C=1
;NE	Not equal		Z=0
;EQ	Equal			Z=1
;VC	Overflow clear		V=0
;VS	Owerflow set		V=1
;PL	Plus			N=0	
;MI	Minus			N=1
;GE	Greater or equal	N=1 & V=1/or N=0 & V=0 
;LT	Less than		N=1 & V=0/or N=0 & V=1
;GT	Greather than		N=1 & V=1 & Z=0/or N=0 & V=0 & Z=0 
;LE	Less or equal		Z=1/or N=1 & V=0/or N=0 & V=1


;OPERATORS

;Bcc 
;hoppar om cc villkor ar uppfyllda i CCR (status registrets und.byte)
;Bcc 	rutin


;DBcc
;hoppar om cc villkor ar uppfyllda i CCR (status registrets und.byte)
;raknar ner ett specifierat register,areg eller dreg
;DBcc reg,rutin

;Scc
;satter en byte till 1 om cc villkor ar uppfyllda och till 0 om inte
;endast byte
;Scc	reg

r:

wait:
btst	#6,$bfe001		;testa v.musknapp,resultai Z
bne	wait			;ej nedtryckt Z=0 hoppa wait
beq	ja			;nedtryckt Z=1 hoppa ja

ja:
clr	d0
move	#1,d0
rts

r1:
clr	d0
clr	d1
move	#4,d0
move	#5,d1
sub	d1,d0			;4-5 = negativt n=1 
bmi	negativt		;hoppa om negativt
rts

negativt:
clr	d2
move	#1,d2
rts



;Motorola MC680000 instructions explained
;dec 94 by Henrik Stolpe

;DATA FLYTTNINGS FUNKTIONER

;MOVE

;flyttar konst.,adresser,areg,dreg till adresser,areg,dreg,sr,sp
;for alla varianter se fil "adress"
;ex nedan 
r:
clr	d0
move	#1000,d0
;move	d1,d0
;move	d0,a0
;move	d0,(a0)
;move	sr,d0				;priv.
;move	d0,sr				;priv.
;move	d0,ccr
;move	usp,d0				;priv.
;move	d0,usp				;priv.
rts

;MOVEQ
;flyttar snabbt data med varde mellan 1-8
r2:
clr	d0
moveq	#8,d0
rts

;MOVEA
;flyttar till adress 
r3:
movea	#1000,a0
rts


;MOVEP
;flyttar till periferikretsadress
r4:
;movep	(a0),periferikretsadress
rts

;EXG
;byt innehall i tva reg
r5:
clr	d0
clr	d1
move	#1,d0
move	#2,d1
exg	d0,d1
rts


;LEA
;ladda en effektiv adress i adressreg
r6:
mus = $bfe001
lea	mus,a0
rts

;LINK
;innehall i a1 laggs pa stacken,pekaren kopieras till a1
;offsetten adderas till stackpekaren
;negativ offset reserverar bytes i stacken
;UNLK frislapper arean
r7:
clr	d0
link	a1,#-2
move	#1,(sp)
move	(sp),d0
unlk	a1
rts

;PEA
;lagger adress pa stacken
r8:
adress:
	dc.w	10	
pea	adress
rts


;SWAP
;byter byt halvor i ett reg
;endast word
r9:
clr d0
move	#%0000000100000000,d0
swap	d0
rts


;Motorola MC680000 instructions explained
;dec 94 by Henrik Stolpe

;ARITHMETIC INTEGER OPERATORS

;ADD
;adderar kalla och dest
r:
clr 	d0
clr	d1
move	#1,d0
move	#1,d1
add	d0,d1				;adderar d0 till d1
rts


;ADDA
;samma som ADD fast till adressreg
r1:
;exemple
clr	d0
clr	d1
move	#1,d0
move	#$1000,a0			;lagg adress $1000 i a0
move	#1,(a0)				;lagg 1 i adressen
add	d0,(a0)				;addera d0 till adress i a0
move	(a0),d1				;visa inehall i $1000
rts




;ADDQ
;adderar snabbt en konstant mellan 1-8
r2:
clr	d0
addq	#8,d0
rts

;ADDX
;samma som ADD fast X flaggan finns med i resultatet
r3:
clr	d0
clr	d1
clr	d2
move	#1,d2
move	#16,ccr			;satt X flaggan
addx	d2,d1				;addera d2+X till d1
rts


;CLR
;nollstaller operanden

;CMP
;jamfor tva operander,satter Z om samma (resultat=0)
r4:
clr	d0
move	#5,d0	
cmp	#5,d0			;samma,satter Z
rts

;CMPA
;samma som CMP fast dest=areg 

;CMPM
;samma som CMP fast mellan 2 op i minnet

;DIVS,DIVU
;delar dest.l med kallop,resultatet finns i dest. laga ord
;endast word som kalla
r5:
clr	d0
clr	d1
move	#8,d0 				;lagger 8 i d0
move.l	#%00000000000000100000000000000000,d1 ;och 2 i d1
divs	d0,d1				;dividera ovre ordet
rts

;EXT
;utvidgning till dubbel bredd
;ej byte

;MULS,MULU
;multiplikation,mult. kallop med dest.op,resultat i dest.laga ord
;endast word som kalla
r6:
clr	d0
clr	d1
move	#2,d0
move	#3,d1
muls	d0,d1
rts

;NEG
;negation av operanden
;NEGX samma som NEG men X flaggan ar med i negationen
r7:
clr.l	d0
move	#%1111111111111111,d0			;fyll d0
neg	d0				;negera till 1
rts

;SUB
;subtraherar kallop fran destop
r8:
clr	d0
clr	d1
move	#4,d0
move	#1,d1
sub	d1,d0				;subtrahera resultat =3
rts

;SUBA
;samma som SUB men dest=areg

;SUBI
;samma som SUB men kallop=konstant

;SUBQ
;snabb subtraktion med en konstant mellan 1-8

;SUBX
;samma som SUB men X flaggan laggs till kallop
r9:
clr	d0
clr	d1
move	#4,d0
move	#1,d1
move	#16,ccr
subx	d1,d0
rts

;TST
;testar en op,om op=0 satts Z,om msb=1 satts N
r10:
clr	d0
move	#0,d0			;ingenting i d0
tst	d0			;testa,resultat 0=Z	
rts



;Motorola MC680000 instructions explained
;dec 94 by Henrik Stolpe


;LOGISKA OPERATORER



;AND
;logisk AND pa tva op,resultat i op2,satter Z om resultatet ar noll
;ej ad direkt
;ANDI samma som AND fast endast konstant som kall operand
;op1=1 och op2=1 ger resultat 1 annars 0
r:
clr	d0
clr	d1
move	#%00001001,d0		
move	#%00010000,d1		
and	d0,d1			;resultat=0 satter Z
rts



;OR
;logisk OR pa tva op,resultat i op2,satter Z om resultatet ar noll
;ej ad direkt
;ORI samma som OR fast endast konstant som kall operand
;op1=0 och op2=0 ger  resultat 0  annars 1
r1:
clr	d0
clr	d1
move	#%00000000,d0		
move	#%00000000,d1		
or	d0,d1			;resultat=0 satter Z			
rts

;EOR
;logisk EOR pa tva op,resultat i op2,satter Z om resultatet ar noll
;ej ad direkt
;op1=op2 ger resultat 0 om olika resultat 1 
;EORI samma som EOR fast endast konstant som kall operand
r2:
clr	d0
clr	d1
move	#%00000011,d0			
move	#%00000011,d1				
eor	d0,d1			;resultat=0 i d1, satter Z
rts


;NOT
;inverterar en operand	satter Z om resultatet ar noll
;ej ad direkt
r3:
clr	d0
move	#%1111111111111111,d0	;fyll d0
not	d0			;invertera resultat=0,satter Z
rts

;TAS
;testar en byte och satter bit 7
;satter N om msb=1,satter Z om op var 0
;ej ad direkt
r4:
clr	d0
clr	d1
move	#%10000000,d0		;msb=1
move	d0,d1			;lagg d0 i d1
tas	d1			;testa..,msb=1 satter N
rts



;Motorola MC680000 instructions explained
;dec 94 by Henrik Stolpe

;BIT OPERATORER,MANIPULERAR ENSKILDA BITAR	



;BTST
;testar om en bit ar satt,satter Z om bit ar 0
;ej word
r:
clr	d0
clr	d1
move	#%00000001,d0		;satter bit 0
btst	#0,d0			;testar om bit 0 ar 0
bne	ja			;nej den ar satt,  hoppa
rts


ja:
move	#1,d1
rts


;BSET
;satter en bit
;ej word
r1:
clr	d0
move	#%00000000,d0		;lagger tom byte i d0
bset	#0,d0			;satter bit 0
rts


;BCHG
;andrar en bit (byter status)
;ej word
r2:
clr	d0
move	#%00000011,d0		;satter bit 0 o 1,(hx)=3
bchg	#0,d0			;andrarbit 0,(hx)=2
rts



;BCLR
;nollar bit
;ej word
r3:
clr	d0
move	#%00000001,d0		;satter bit 0
bclr	#0,d0			;nollar bit 0
rts



;SKIFT OCH ROTATIONS OPERATORER



;LSL,LSR
;skiftar logiskt v/h och fyller pa med en nolla
r4:
clr	d0
move	#%0000000000000011,d0	;lagger (hx)=3 i d0
lsl	#1,d0			;skiftar ordet v 1 bit (hx)=6
rts


;ROXL,ROXR
;roterar v/h och knuffar ut sista biten 
;fyller pa med nolla i andra endan
;den utknuffade biten lagras i X flaggan
r6:
clr	d0
clr	d1
move	#%1000000000000001,d0	;bit 15 (hx)=800,bit 0 (hx)=1 satts
roxl	#1,d0			;bit 15 knuffas ut,fyller pa med 0
roxr	#1,d1 			;bit lagrad i X flagga rot. in i d1
rts


;ASL,ASR
;samma som LSL,LSR men sparar msb  dar +/- tecken kan finnas
r7:
clr	d0
move	#%0000000000000001,d0	;sattr bit 0 (hx)=1
asr	#1,d0			;rot h satter bit 15
;SR= N=1,Z=0,V=0,C=1,X=1
rts
 
;end of file