130 likes | 279 Views
Outline Binary to BCD Matrix Addition Ones Count String Compare Sector Map Raster Graphics Subroutine Calls Goal Understand instruction usage Reading Microprocessor Systems Design, Clements, Ch. 2-3. 680XX Program Examples. D0.B contains binary value D0.W contains 3-digit BCD result
E N D
Outline Binary to BCD Matrix Addition Ones Count String Compare Sector Map Raster Graphics Subroutine Calls Goal Understand instruction usage Reading Microprocessor Systems Design, Clements, Ch. 2-3 680XX Program Examples
D0.B contains binary value D0.W contains 3-digit BCD result CLR.L D1 Clear D1 for 32-bit dividend MOVE.B D0,D1 Copy source to D1 DIVU.W #&100,D1 Get 100s digit in D1(0:15) MOVE.W D1,D0 Save digit in D0(0:3) SWAP D1 Move remainder to D1(0:15) AND.L #$FFFF,D1 Clear MSW of D1 DIVU #&10,D1 Get 10s digit in D1(0:15) LSL.W #&4,D0 Shift 100s digit one place OR.W D1,D0 Insert 10s digit in D0 LSL.W #&4,D0 Shift digits one place SWAP D1 Move remainder to D1(0:15) OR.W D1,D0 Insert 1s digit into LSN Binary to BCD Conversion
11001100 (204) to 0010 0000 0100 CLR.L D1 D0 = 000000CC, D1 = 00000000 MOVE.B D0,D1 D0 = 000000CC, D1 = 000000CC DIVU.W #&100,D1 D0 = 000000CC, D1 = 00040002 MOVE.W D1,D0 D0 = 00000002, D1 = 00040002 SWAP D1 D0 = 00000002, D1 = 00020004 AND.L #$FFFF,D1 D0 = 00000002, D1 = 00000004 DIVU #&10,D1 D0 = 00000002, D1 = 00040000 LSL.W #&4,D0 D0 = 00000020, D1 = 00040000 OR.W D1,D0 D0 = 00000020, D1 = 00040000 LSL.W #&4,D0 D0 = 00000200, D1 = 00040000 SWAP D1 D0 = 00000200, D1 = 00000004 OR.W D1,D0 D0 = 00000204, D1 = 00000004 Conversion Example
C = A + B, A, B, C are m x n matrices store matrix by rows - row order a1,1 stored at A, ai,j stored at A+(i-1)n+j-1 MOVEA.L #A,A0 A0 is base of matrix A MOVEA.L #B,A1 A1 is base of matrix B MOVEA.L #C,A2 A2 is base of matrix C CLR.W D2 Clear element offset MOVE.W #m,D0 D0 is row counter L2 MOVE.W $n,D1 D1 is column counter L1 MOVE.B (A0,D2.W),D6 Get element from A ADD.B (A1,D2.W),D6 Add element from B MOVE.B D6,(A2,D2.W) Store sum in C ADDQ.W #&1,D2 Increment element pointer SUB.W #&1,D1 Repeat for n columns BNE L1 SUB.W #&1,D0 Repeat for m rows BNE L2 Matrix Addition
Subroutine to count number of 1s in byte D0.B - input/output register D1 - one’s counter (not modified) D2 - pointer to bit of D0 to be tested (not modified) ONE_CNT MOVEM.L D1-D2,-(A7) Save D1 and D2 CLR.B D1 Clear 1’s counter MOVEQ #$7,D2 D2 points to MSB NXT_BIT BTST D2,D0 Test D2th bit of D0 BEQ.S LP_TST Do nothing if 0 ADDQ.B #$1,D1 Else incr 1’s cnt LP_TST SUBQ.B #$1,D2 Decr bit pointer BGE NXT_BIT Repeat until done MOVE.B D1,D0 Put count in D0 MOVEM.L (A7)+,D1-D2 Restore D1 and D2 RTS Return One’s Count
Usage MOVE.B <data>,D0 Avoid by having data in D0 JSR ONE_CNT Jump to subroutine MOVE.B D0,<dest> Avoid by using result in D0 note that D1 and D2 are saved and restored by subroutine to/from stack Alternative use BSR, let assembler compute offset use global register allocation to avoid stack save/restore use register windows to avoid stack save/restore - SPARC One’s Count
Compare strings S1 and S2 of length n return 1 if S1 > S2, 0 if S1 == S2, -1 if S1 < S2 A0 points to S1, A1 points to S2, n in D0, result in D0 SUBQ #$1,D0 D0 is byte counter L1 CMPM.B (A0)+,(A1)+ Compare characters BLT LT S1 < S2 BGT GT S1 > S2 DBRA D0,L1 Repeat until done CLR.L D0 D0 = 0 RTS Return LT MOVEQ #$-1,D0 D0 = -1 RTS Return GT MOVEQ #$1,D0 D0 = 1 RTS Return DBRA == DBF - condition always false, so loop String Compare
Disk of 2048 256-byte sectors (512KB) sector map - vector of 2048 bits (64 longwords) 1 bit per sector bit is 1 if sector is free, 0 if sector is used find first free sector and claim it CLR.L D0 Initial bit offset D0 = 0 LEA MAP,A0 A0 points to sector bitmap MOVE.W #&63,D7 Up to 64 fields to test L1 BFFFO (A0){D0:32},D0 If free sector found, Z=0 and D0 = offset from A0 DBNE D7,L1 Decr D7 until Z=0 or end BEQ FULL Disk full BFCLR (A0){D0:1} Claim sector, D0 = sector Sector Map
Copy 15x15 block from (x1,y1) to (x2,y2) e.g. bitmapped character set Raster Graphics 0,0 Store display in row order x1,y1 x2,y2 1023,767
A - origin of bitmap D0 - x1, D1 - y1, D2 - x2, D3 - y2 MV LEA A,A0 A0 = base address of bitmap MULU.L #&128,D1 D1 = src row offset MULU.L #&128,D3 D3 = dest row offset MOVEQ #&14,D4 15 lines to move L1 BFEXTU (A0,D1.L){D0.L:15},D5 Copy line to D5 BFINS D5,(A0,D3.L){D2.L:15} Copy into image LEA 128(A0),A0 Update pointer by a line DBRA D4,L1 Repeat until all lines moved RTS Return Raster Graphics
Call with BSR, JSR, return with RTS, RTD, RTR RTD if deallocating stack frame, RTR if restoring CCR Pass parameters by value put data in data registers save previous data on stack if necessary example MOVE.L D0,-(SP) MOVE.L <ea>,D0 BSR SUBR Pass parameters by reference put address in address registers save previous addresses on stack if necessary example MOVE.L A0,-(SP) LEA $002000,A0 BSR SUBR Subroutine Calls
Pass via stack data and references example PEA TEXT_ST Push text starting addr PEA TEXT_END Push text ending addr PEA STR_ST Push string starting addr PEA STR_END Push string ending addr BSR STR_MT Call subroutine LEA 16(SP),SP Pop stack ... STR_MT LEA 4(SP),A0 Parameter ptr in A0 MOVEM.L A3-A6,-(SP) Save registers MOVEM.L (A0)+,A3-A6 Get params off stack ... MOVEM.L (SP)+,A3-A6 Restore registers RTS Return Subroutine Calls
Subroutine Calls Stack Return Address SP after BSR STR_END ptr SP before BSR A0 after LEA 4(SP),A0 Memory STR_ST ptr A0 after MOVEM TEXT_END ptr TEXT_ST ptr String A3 SP initial value A4 ... A5 A6 Text