EDA 451 - Digital och Datorteknik 29-21, Arbetsbok för MC12 CPU12 Reference Guide Ur innehållet: Historik Översikt, single-chip-computer DG256 Programmerarens bild (Exempel) 1 Instruktionsuppsättning ISA Instruction Set Architecture Vilka operationer kan utföras? Instruktionsgrupper Hur lagras operanderna förutom i minnet? Korttidslagring Hur nås operander i minnet? Adresseringssätt Vilka typer/storlekar av operander kan hanteras? Generella/speciella register, registerstorlek 2 1
Instruktionsgrupper EXEMPEL: Motorola (Freescale) MC68X/Coldfire Data movement Program (Flow) control Integer arithmetic Floating-point arithmetic Logical operations Bit manipulation System control Cache maintenance PowerPC Load/Store Program (Flow) control Integer arithmetic Floating-point arithmetic Processor control Synchronization Miscellanous Motorola (Freescale) Load/Store Data movement Program (Flow) control Integer arithmetic Logical operations Bit manipulation System control FLEX Load/Store Data movement Program (Flow) control Integer arithmetic/test Logical operations Shift/rotate Stack operations 3 Korttidslagring, Stack/Ackumulator/Register Exempel: Kodning av operationen A = B + C Stack PUSH B PUSH C ADD POP A Exempel: B55, HP3/7 Ackumulator LOAD ADD STORE Exempel: PDP8, R652 FLEX B C A Register LOAD LOAD ADD STORE Dessutom existerar mellanting av dessa. Exempel (CISC): IBM36, DEC PDP11/VAX MC68x Intel Pentium Mest namnkunnigt exempel: Intel 886 (-186/-286/-386/-486) R1,B R2,C R3,R1,R2 A,R3 Exempel (RISC): PowerPC, MIPS, SPARC 4 2
Register programmerarens bild Stackmaskiner: Har som regel inga synliga register Ackumulatormaskiner: Har oftast flera register men med dedikerad användning: Exempel: Ackumulator, Indexregister Registermaskiner: Generellt användbara register. Exempel: Dataregister, Adressregister, Flyttalsregister 5 EXEMPEL - Registermaskiner PowerPC Zilog Z8 Motorola (Freescale) MC68X/Coldfire 6 3
EXEMPEL Ackumulator Intel 8xx 88/885 886 8386 7 ACCUMULATOR 15 8 7 B C D E H L B C 15 STACK POINTER PROGRAM COUNTER INCREMENTER/DECREMENTER 15 AH BH CH DH 15 15 8 7 A X B X C X D X SP BP SI DI IP AL BL CL DL ACCUMULATOR BASE ACCUMULATOR ACCUMULATOR STACK POINTER BASE POINTER SOURCE INDEX DESTINATION INDEX INSTRUCTION POINTER 31 16 15 8 7 AH A X AL 31 16 15 BH CH DH B X C X D X SI DI BP SP IP BL CL DL EAX EBX ECX EDX ESI EDI EBP ESP EIP FLAGS H FLAGS L STATUS FLAGS FLAGS EFLAGS 15 CS DS SS ES CODE SEGMENT DATA SEGMENT STACK SEGMENT EXTRA SEGMENT 15 CS SS DS ES FS CODE STACK DATA GS 7 EXEMPEL - Ackumulator IX 7 ACCA 7 ACCB 15 15 PC 15 5 H Motorola 68 SP I N Z V C ACCUMULATOR A ACCUMULATOR B INDEX REGISTER PROGRAM COUNTER STACK POINTER CONDITION CODES REGISTER 7 A 7 15 8 7 PCH Y PCL 15 7 1 Rockwell 652 7 X S ACCUMULATOR A INDEX REGISTER Y INDEX REGISTER X PROGRAM COUNTER STACK POINTER N V 1 B D I Z C PROCESSOR STATUS REG P 15 A Motorola 68HC12 8 7 D 15 X 15 15 SP 15 7 Y PC S X H B I N Z V C 7 A 7 B 7 X 7 PC 7 SP 3 8-BIT ACCUMULATORS A AND B OR 16-BIT DOUBLE ACCUMULATOR D INDEX REGISTER X INDEX REGISTER Y STACK POINTER PROGRAM COUNTER CONDITION CODES REGISTER FLEX ACCUMULATOR A ACCUMULATOR B INDEX REGISTER PROGRAM COUNTER STACK POINTER N Z V C CONDITION CODES REGISTER 8 4
Programmerarens bild datatyper/storlek char (8) short int (16) long int (32) long int (64) floating point (IEEE) pointers Coldfire V1 X X X 32 bit PowerPC X X X X X 886 X X 16/2 bit 8386 X X X 32 bit 68HC12 X X 16/2 bit FLEX X 8 bit 9 Historik 68HC12SX 68HC12 68HC12S 68 681 689 68HC11 1974 1978 1982 1986 199 1994 1998 22 26 1 5
Freescale 68HCS12 HCS12 adressrum, IO och minne CPU12, klockor och räknare Random Access - Minne RWM, FLASH, EEPROM Periferienheter Parallell Input/Output: Seriell kommunikation AD PWM 11 HCS12DG256, blockdiagram 12 6
HCS12DG256, core 13 HCS12DG256, core Spänningsregulatorer (flera olika spänningar används internt) Background Debug Mode för test/avlusning En kristall utgör bas för alla klockfrekvenser i systemet Realtidsklocka och andra klockfunktioner Programmerbara funktioner Vi återkommer till detta i Maskinorienterad Programmering 14 7
Primärminne Icke flyktigt minne Upp till 256 Kbyte i minnesbankar 48 kb utan användning av bankar 4 kb EEPROM Flyktigt minne 12 kb RAM 15 EXEMPEL, linjärt adressrum FFFF FLASH 4 3FFF 1 FFF 4 3FF RWM ( RAM ) Synlig del av EEPROM MCHCS12 Interna register 16 8
EXEMPEL, bankat adressrum FFFF FLASH C BFFF 3 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D Bankat FLASH Dx256 8 7FFF FLASH 4 3FFF 1 FFF 4 3FF RWM ( RAM ) Synlig del EEPROM MCHCS12 Interna register 17 EXEMPEL, i laborationsdator MC12 FFFF C BFFF FLASH (monitor/debugger) 3 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D Bankat FLASH Dx256 8 7FFF 4 3C8 1 FFF 4 3FF FLASH (monitor/debugger) RWM ( RAM ) Externt IO-gränssnitt MCHCS12 Interna register Minne tillgängligt för användarprogram 18 9
Periferikretsar i HCS12DG256 AD Analog till Digital omvandling ECT- Räknarkretsar för noggrann tidmätning SCI Asynkron seriekommunikation Parallell In-Utmatning PWM Pulsbreddsmodulering Etc 19 HCS12DG256, core Centralenhet CPU12 2 1
Registeruppsättning CPU12 15 8 7 A B D 15 X 15 Y 15 SP 15 PC 7 S X H I N Z V C 8-BIT ACCUMULATORS A AND B OR 16-BIT DOUBLE ACCUMULATOR D INDEX REGISTER X INDEX REGISTER Y STACK POINTER PROGRAM COUNTER CONDITION CODES REGISTER 21 Adresseringssätt Vi känner igen de flesta adresseringssätten i från FLEX. Indexerade adresseringssätt kan även användas med register X,Y och SP ibland också med PC (PC-relativt) Nytt här är också Indirekt adressering 22 11
Inherent Maskinkod för instruktionen Cykel för cykel beskrivning Flaggpåverkan 23 Omedelbar (Immediate) 8-bit/16-bit opr8i, 8-bitars konstant om 8-bitars register Opr16i, 16-bitars konstant om 16-bitars register 24 12
Direkt (Direct Page) Absolut (Extented) opr16a, kan adressera hela adressintervallet -FFFF opr8a, kan enbart adressera intervallet -FF, anger minst signifikant byte av adressen 25 PC-relativ ( BRANCH -instruktioner) 8-bitars offset (-128..127) 9-bitars offset (-256..255) 16-bitars offset (-32768..32767) 26 13
Indexerade adresseringssätt: Register relativ, konstant offset Basregister kan vara något av: X,Y,SP,PC EXEMPEL: LDAA 5,X STAA 2,Y LDAA sym,pc Observera, ingen syntaktisk skillnad. STA off,sp Assemblator väljer effektivast kodning Specialfall: n,pcr LDAA sym,pcr Antag PC pekar på nästa instruktion. Operanden är här PC-sym, jfr offsetberäkning för BRA -instruktioner 27 Indexerade adresseringssätt: Auto pre- increment/decrement Auto post- increment/decrement Basregister kan vara något av: X,Y,SP EXEMPEL: LDAA 1,-X STAA 4,Y- STAB 8,+SP LDAB 7,SP+ 28 14
Indexerade adresseringssätt: Register relativ, offset i ackumulator Basregister kan vara något av: X,Y,SP,PC EXEMPEL: LDAA A,X STAA B,Y STAB D,SP LDAB D,PC 29 Indexerade adresseringssätt: Indirekt EXEMPEL: LDAA STAA STAB LDAB [D,X] [sym,pcr] [2,SP] [D,Y] 3 15
Instruktionsgrupper LOAD-instruktioner LDAA Load A (M) A LDAB Load B (M) B LDD Load D (M:M+1) 1 A:B LDS Load SP (M:M+1) 1 SP H :SP L LDX Load index register X (M:M+1) 1 X H :X L LDY Load index register Y (M:M+1) 1 Y H :Y L LEAS Load effective address into SP Effective address SP LEAX Load effective address into X Effective address X LEAY Load effective address into Y Effective address Y STORE-instruktioner STAA Store A (A) M STAB Store B (B) M STD Store D (A) M, (B) M+1 STS Store SP SP H :SP L M:M+1 STX Store X X H :X L M:M+1 STY Store Y Y H :Y L M:M+1 MOVE-instruktioner MOVB Move byte (8 bitar) (M 1 ) M 2 MOVW Move word (8 bitar) (M:M+1) 1 M:M+1 2 31 Instruktioner för kopiering av registerinnehåll TAB Transfer A to B (A) B anm: Ekv. Med TFR A,B TAP Transfer A to CCR (A) CCR anm: Ekv. Med TFR A,CCR TBA Transfer B to A (B) A TFR Transfer register to register (A,B,CCR,D,X,Y eller SP) (A,B,CCR,D,X,Y eller SP) TPA Transfer CCR to A (CCR) A anm: Ekv. Med TFR CCR,A TSX Transfer SP to X (SP) X anm: Ekv. Med TFR SP,X TSY Transfer SP to Y (SP) Y anm: Ekv. Med TFR SP,Y TXS Transfer X to SP (X) SP anm: Ekv. Med TFR X,SP TYS Transfer Y to SP anm: Ekv. Med TFR Y,SP (Y) SP Instruktioner för växling av registerinnehåll EXG Exchange register to register (A,B,CCR,D,X,Y eller SP) (A,B,CCR,D,X,Y eller SP) XGDX Exchange D with X (D) (X) anm: Ekv. Med EXG D,X - EXG X,D XGDY Exchange D with Y anm: Ekv. Med EXG D,Y - EXG Y,D (D) (Y) Instruktion för teckenutvidgning SEX Teckenutvidga 8 bitars operand (A,B,CCR) (D,X,Y eller SP) Använd denna Övriga finns här av kompatibilitetsskäl Använd denna Övriga finns här av kompatibilitetsskäl 32 16
Ovillkorlig programflödeskontroll BSR Anrop av subrutin. SP-2 SP PC-relativ operand RetAdrL:RetAdrH M (SP) :M (SP+1) Adress PC BRA Hopp till adress. Adress PC PC-relativ operand CALL Anrop av subrutin SP-2 SP Absolut operand (2 bitar) Anm: Användes vid RetAdrL:RetAdrH M (SP) :M (SP+1) programflödesändring mellan Subrutinadress PC olika minnesbankar ($8- SP-1 SP $BFFF) (PPAGE) M (SP) PAGE PPAGE Subrutinadress PC JMP Hopp till address. Absolut operand Subrutinadress PC JSR RTC RTS Anrop av subrutin Absolut operand Återvänd från subrutin. Returadress från STACK och PPAGE Återvänd från subrutin. Returadress från STACK SP-2 SP RetAdrL:RetAdrH M (SP) :M (SP+1) Subrutinadress PC M (SP) (PPAGE) SP+1 SP M (SP) :M (SP+1) PC H :PC L SP+2 SP M (SP) :M (SP+1) PC H :PC L SP+2 SP 33 EXEMPEL - Modularisering ORG $1 main: JSR init main_loop:jsr read JSR --- BRA main_loop init: --- RTS read: --- RTS 34 17
Instruktioner för addition ABA Addera B till A (A)+(B) A ABX Addera B till X (X)+(B) X anm: Ekv. med LEAX B,X ABY Addera B till Y (Y)+(B) Y anm: Ekv. med LEAY B,Y ADCA Addition med carry till A (A)+(M)+C A ADCB Addition med carry till B (B)+(M)+C B ADDA Addition till A (A)+(M) A ADDB Addition till B (B)+(M) B ADDD Addition till D (A:B) (D)+(M:M+1) D INC Incrementera i minnet (M)+$1 M INCA Inkrementera A (A)+ $1 A INCB Inkrementera B (B)+ $1 B INS Inkrementera SP (SP)+ $1 SP anm: Ekv. med LEAS 1,SP INX Inkrementera X (X)+ $1 X anm: Ekv. med LEAX 1,X INY Inkrementera Y anm: Ekv. med LEAY 1,Y (Y)+ $1 Y Instruktioner för subtraktion SBA Subtrahera B från A (A)-(B) A SBCA Subtrahera med borrow från A (A)-(M)-C A SBCB Subtrahera med borrow från B (B)-(M)-C B SUBA Subtrahera från A (A)-(M) A SUBB Subtrahera från B (B)-(M) B SUBD Subtrahera från D (A:B) (D)-(M:M+1) D DEC Dekrementera i minnet (M)-$1 M DECA Dekrementera A (A)- $1 A DECB Dekrementera B (B)- $1 B DES Dekrementera SP (SP)- $1 SP anm: Ekv. med LEAS -1,SP DEX Dekrementera X (X)- $1 X anm: Ekv. med LEAX -1,X DEY Dekrementera Y anm: Ekv. med LEAY -1,Y (Y)- $1 Y 35 Instruktioner för logiska operationer ANDA Bitvis och A med minnesinnehåll (A) (M) A ANDB Bitvis och A med minnesinnehåll (B) (M) B ANDCC Bitvis och CC med minnesinnehåll (CCR) (M) CCR EORA Bitvis exklusivt eller A med (A) (M) A minnesinnehåll EORB Bitvis exklusivt eller B med (B) (M) B minnesinnehåll ORAA Bitvis eller A med minnesinnehåll (A)+(M) A ORAB Bitvis eller B med minnesinnehåll (B)+(M) B ORCC Bitvis eller CCR med minnesinnehåll (CCR)+(M) CCR Unära operationer CLC Nollställ carryflaggan i CCR C CLI Nollställ avbrottsmask i CCR I CLR Nollställ minnesinnehåll $ M CLRA Nollställ A $ A CLRB Nollställ B $ B CLV Nollställ overflowflaggan I CCR V COM Ettkomplementera minnesinnehåll $FF-(M) M COMA Ettkomplementera A $FF-(A) A COMB Ettkomplementera B $FF-(B) A NEG Tvåkomplementera minnesinnehåll $-(M) M NEGA Tvåkomplementera A $-(A) A NEGB Tvåkomplementera B $-(B) B EXEMPEL: Nollställ bit 7-bit 4 på adress $3 LDAB $3 ANDB #%1111 STAB $3 EXEMPEL: Ettställ bit 7 och bit på adress $3 LDAB $3 ORAB #%11 STAB $3 EXEMPEL: Invertera bit 2 och bit1 på adress $3 LDAB $3 EORB #%11 STAB $3 36 18
Logiska skiftoperationer LSL Logiskt vänsterskift i minnet LSLA Logiskt vänsterskift A C b7 LSLB Logiskt vänsterskift B LSLD Logiskt vänsterskift D b C b7 A b b7 B b LSR LSRA LSRB Logiskt högerskift i minnet Logiskt högerskift A Logiskt högerskift B b7 b C LSRD Logiskt högerskift D b7 A b b7 B b C Exempel på användning: Multiplikation med 2, tal utan tecken. Division med 2, tal utan tecken. 37 Aritmetiska skiftoperationer ASL Aritmetiskt vänsterskift i minnet (ekv. med LSL) ASLA Aritmetiskt vänsterskift A C b7 (ekv. med LSLA) ASLB Aritmetiskt vänsterskift B (ekv. med LSLB) ASLD Aritmetiskt vänsterskift D (ekv. med LSLD) b C b7 A b b7 B b ASR ASRA ASRB Aritmetiskt högerskift i minnet Aritmetiskt högerskift A Aritmetiskt högerskift B b7 b C Exempel på användning, högerskift: Division med 2, tal med tecken. 38 19
Instruktioner för rotation (carry-skift) ROL Rotation vänster via carry i minnet ROLA Rotation vänster via carry A ROLB Rotation vänster via carry B C b 7 ROR Rotation höger via carry i minnet RORA Rotation höger via carry A RORB Rotation höger via carry B b 7 b b C EXEMPEL: Skifta ett 32-bitars tal på adress $3, 1 steg åt höger LSR $3 ROR $31 ROR $32 ROR $33 Exempel på användning: Skiftoperationer på tal större än 8 bitar. 39 Instruktioner för jämförelser och test CBA Jämför B med A (A)-(B) CMPA Jämför A med minne (A)-(M) CMPB Jämför B med minne (B)-(M) CPD Jämför D med minne (A:B)-(M:M+1) CPS Jämför SP med minne (SP)-(M:M+1) CPX Jämför X med minne (X)-(M:M+1) CPY Jämför Y med minne (Y)-(M:M+1) TST Testa minnesinnehåll (M)-$ TSTA Testa register A (A)-$ TSTB Testa register B (B)-$ 4 2
Villkorlig programflödeskontroll Mnemonic Funktion Villkor Enkla flaggtest BCS Hopp om carry C=1 BCC Hopp om ICKE carry C= BEQ Hopp om zero Z=1 BNE Hopp om ICKE zero Z= BMI Hopp om negative N=1 BPL Hopp om ICKE negative N= BVS Hopp om overflow V=1 BVC Hopp om ICKE overflow V= Test av tal utan tecken BHI Villkor: R>M C + Z = BHS Villkor: R M C= BLO Villkor: R<M C=1 BLS Villkor: R M C + Z = 1 Test av tal med tecken BGT Villkor: R>M Z + ( N V ) = BGE Villkor: R M N V = BLT Villkor: R<M N V = 1 BLE Villkor: R M Z + ( N V ) = 1 41 Instruktioner för räknande programslingor Mnemonic Funktion Villkor DBEQ Dekrementera innehåll i register. (register) 1 register Hoppa om resultatet =. (register: A,B,D,X,Y,SP) om(register)=; hoppa ; annars: nästa instruktion DBNE Dekrementera innehåll i register. (register) 1 register Hoppa om resultatet. om(register) ; hoppa ; (register: A,B,D,X,Y,SP) annars: nästa instruktion IBEQ Inkrementera innehåll i register. (register) + 1 register Hoppa om resultatet =. (register: A,B,D,X,Y,SP) om(register)=; hoppa ; annars: nästa instruktion IBNE Inkrementera innehåll i register. (register) + 1 register Hoppa om resultatet. om(register) ; hoppa ; (register: A,B,D,X,Y,SP) annars: nästa instruktion TBEQ Testa innehåll i register. Hoppa om resultatet =. (register: A,B,D,X,Y,SP) om(register)=; hoppa ; annars: nästa instruktion TBNE Testa innehåll i register. Hoppa om resultatet. (register: A,B,D,X,Y,SP) om(register) ; hoppa ; annars: nästa instruktion 42 21
If Kontrollstrukturer If( Villkor ) then if( Villkor ) then else end Then End Villkor JA Satser if(villkor) { Satser; } NEJ If Then Else End Villkor JA Satser 1 Satser 2 NEJ if(villkor) { Satser1; }else{ Satser2; } while( Villkor ) loop While Then End Villkor JA Satser NEJ while(villkor) { Satser; } loop until( Villkor ) LOOP UNTIL NEJ Satser Sista? JA do{ Satser; } while(villkor); 43 If () {} If Then End Villkor JA Satser NEJ if (DipSwitch!= ) HexDisp = Dipswitch; Rättfram kodning DipSwitch EQU $6 HexDisp EQU $4 TST BNE BRA DipSwitch assign end assign LDAB DipSwitch STAB HexDisp end: BNE Hopp om ICKE zero Z= BEQ Hopp om zero Z=1 44 22
If () {} If NEJ Villkor JA Then Satser End Bättre kodning DipSwitch EQU $6 HexDisp EQU $4 TST BEQ DipSwitch end if (DipSwitch!= ) HexDisp = Dipswitch; end: LDAB STAB DipSwitch HexDisp BNE Hopp om ICKE zero Z= BEQ Hopp om zero Z=1 45 If () {} else { } If Then Else End Villkor JA Satser 1 Satser 2 NEJ if (DipSwitch == ) HexDisp = 1; else HexDisp = ; DipSwitch EQU $6 HexDisp EQU $4 LDAB DipSwitch TSTB BEQ not_else LDAB # STAB HexDisp BRA end not_else: LDAB #1 STAB HexDisp end: BEQ Hopp om zero Z=1 46 23
If () {} else { } DipSwitch EQU $6 HexDisp EQU $4 If Then Else End Villkor JA Satser 1 Satser 2 NEJ if (DipSwitch == ) HexDisp = 1; else HexDisp = ; LDAB DipSwitch TSTB BNE else LDAB #1 STAB HexDisp BRA end else: LDAB # STAB HexDisp end: BNE Hopp om ICKE zero Z= 47 If () {} else { } If Then Else End Villkor JA Satser 1 Satser 2 NEJ if (DipSwitch >= 5) HexDisp = 1; else HexDisp = ; DipSwitch EQU $6 HexDisp EQU $4 LDAB DipSwitch CMPB #5 BHS then LDAB # STAB HexDisp BRA end then: LDAB #1 STAB HexDisp end: Test av tal utan tecken BHS Villkor: R M C= Test av tal med tecken BGE Villkor: R M N V = 48 24
while () {} While Then End Villkor JA Satser 1 NEJ while (DipSwitch!= ) HexDisp = 1; HexDisp = ; DipSwitch EQU $6 HexDisp EQU $4 while: end_while: LDAB DipSwitch TSTB BEQ end_while LDAB #1 STAB HexDisp BRA while LDAB # STAB HexDisp BEQ Hopp om zero Z=1 49 while () {} While Then End Villkor JA Satser 1 NEJ Delay( unsigned int count ) { while (count > ) count = count - 1; } Delay: LDD count Delay_loop: NOP NOP Delay_end: SUBD #1 BHI Delay_loop RTS Test av tal utan tecken BHI Villkor: R>M C + Z = Test av tal med tecken BGT Villkor: R>M Z + ( N V ) = 5 25
Fördröjning Delay( unsigned int count ) { while (count > ) count = count - 1; } Parameter count finns i register D vid anrop. Anm. count= är EJ TILLÅTET. ; Subrutin 'Delay' Delay: NOP Delay_loop: NOP NOP SUBD #1 BHI Delay_loop RTS instruktion NOP 1 NOP NOP SUBD #1 BHI antal ggr. count count count count ( taken ) BHI 1 (not taken) RTS 1 = NOP ( 1 + 2 count) + SUBD#1 ( count ) + BHI T ( count-1 ) + BHI NT ( 1 ) + RTS ( 1 ) =? 51 = NOP ( 1 + 2 count) + SUBD#1 ( count ) + BHI T ( count ) + BHI NT ( 1 ) + RTS ( 1 ) =? (exekveringstider, dvs antal cykler, fås ur handboken) instruktion NOP 1 SUBD #1 2 BHI 3/1 RTS 5 # cykler = 1 ( 1 + 2 count) + 2 ( count ) + 3 ( count-1 ) + 1 ( 1 ) + 5 ( 1 ) = 7 count + 4 52 26
Minimal/maximal fördröjning vid olika klockfrekvenser MC12 Frekvens/ cykeltid 4 MHz/ 25 ns. 8 MHz/ 125 ns. 16 MHz/ 62,5 ns. 25 MHz/ 4 ns. Min. ( count = 1) 11 cykler Max. ( count = $FFFF) 458749 cykler 2,75 s 115 ms 1,375 s 57,34 ms 687,5 ns 28,67 ms 44 ns 18,35 ms 53 Exempel: Bestäm count för 1 ms fördröjning i ett MC12-system Lösning: MC12 Frekvens/ cykeltid 8 MHz/ 125 ns. Min. ( count = 1) 11 cykler Max. ( count = $FFFF) 458749 cykler 1,375 s 57,34 ms (7count (7count count 4)125ns 4)125ns 1 125 7 Uppskatta motsvarande fördröjning i simulatorn 1ms 1 ns 4 11428 Tar c:a 14 sekunder 54 27
Om längre fördröjningar krävs måste Delay -funktionen utföra fler instruktioner i varje slinga, exempelvis genom anrop av följande rutin: ; ; subrutin ADelay' ADelay: BSR ADelay1 ADelay1: BSR ADelay2 ADelay2: RTS Hur många bytes kod motsvarar rutinen? Hur många klockcyklers fördröjning ger den? 55 do {} while () LOOP UNTIL NEJ Satser Sista? JA do { HexDisp = ; }while (DipSwitch >= 1); DipSwitch EQU $6 HexDisp EQU $4 do: MOVB #,HexDisp LDAB DipSwitch CMPB #1 BHS do Test av tal utan tecken BHS Villkor: R M C= 56 28
EXEMPEL memcopy( from, to, size ) Kan (informellt) kodas memcopy: LDAB size LDX from LDY to memcopy_loop: memcopy_end: TSTB BEQ LDAA STAA DECB BRA RTS memcopy_end 1,X+ 1,Y+ memcopy_loop 57 EXEMPEL memcopy1( from, to, size ) Kan (informellt) kodas memcopy1: LDAB size LDX from LDY to memcopy1_loop: memcopy1_end: TSTB BEQ MOVB DECB BRA RTS memcopy1_end 1,X+,1,Y+ memcopy1_loop 58 29
EXEMPEL memcopy2( from, to, size ) Kan (informellt) kodas memcopy2: LDAB size LDX from LDY to memcopy2_loop: SUBB #1 BMI memcopy2_end MOVB B,X,B,Y BRA memcopy2_loop memcopy2_end: RTS 59 EXEMPEL memcopy3( from, to, size ) Kan (informellt) kodas memcopy3: LDAB size LDX from LDY to memcopy3_loop: MOVB 1,X+,1,Y+ DBNE B,memcopy3_loop memcopy3_end: RTS vad händer om size är, vid anrop??? 6 3
EXEMPEL memcopy( from, to, size ) En effektiv implementering. memcopy: LDAB size BEQ memcopy_end LDX from LDY to memcopy_loop: MOVB 1,X+,1,Y+ DBNE B,memcopy_loop memcopy_end: RTS 61 31