-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSorowanie.a51
99 lines (85 loc) · 3.59 KB
/
Sorowanie.a51
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
;---------------------------------------------------------------------
; Sortowanie babelkowe tablicy w pamieci wewnetrznej
; by Gorka Mateusz
;---------------------------------------------------------------------
ORG 0
mov DPTR, #test_data ; address poczatkowy danych
mov R0, #30h ; address poczatkowy tablicy
lcall copy_data
mov R0, #30h ; address poczatkowy tablicy
mov R2, #11 ; dlugosc tablicy
lcall bubble_sort_iram
sjmp $
;---------------------------------------------------------------------
; Kopiowanie danych z pamieci programu (CODE) do pamieci IRAM
; Dane CODE: pierwszy bajt - licznik danych, kolejne bajty - dane
; Input: DPTR - address poczatkowy bloku danych (CODE)
; R0 - address poczatkowy (IRAM)
;---------------------------------------------------------------------
copy_data:
clr A ; R1 - dlugosc
movc A, @A+DPTR ; ...
jz no_copy ; jesli zerwoa dlugosc: wyjdz
mov R1, A ; ...
cp_loop:
inc DPTR ; ++code
clr A ; kopiowanie
movc A, @A+DPTR ; ...
mov @R0, A ; ...
inc R0 ; ++ iram
djnz R1, cp_loop ; petla
no_copy:
ret
;---------------------------------------------------------------------
; Sortowanie babelkowe (rosnaco) w pamieci wewnetrznej (IRAM)
; Input: R0 - address poczatkowy tablicy
; R2 - dlugosc tablicy
;---------------------------------------------------------------------
; bubblesort:
; do
; swapped <- false
; for j = 0 to size-1 do:
; if arr[i] > arr[i+1]
; swap arr[j], arr[j+1]
; swapped <- true
; end if
; end for
; size--
; while swapped = false
; end
;---------------------------------------------------------------------
bubble_sort_iram:
cjne R2, #2, neq0 ; Wyjatek: dlugosc < 2
neq0: jc no_sort ; ...
dec R2 ; dlugosc-1
bbbl_loop:
clr F0 ; swapped = false
mov A, R2 ; R3 - tymczasowa dlugosc-1
mov R3, A ; ...
mov A, R0 ; R1 - tymczasowy address elem.
mov R1, A ; ...
swap_loop:
mov A, @R1 ; pobranie danych
inc R1 ; ...
mov B, @R1 ; ...
cjne A, B, neq1 ;
jmp no_swap ; arr[i] = arr[i+1]
neq1: jc no_swap ; arr[i] < arr[i+1]
mov @R1, A ; zamiana
dec R1 ; ...
mov @R1, B ; ...
inc R1 ; ...
setb F0 ; swapped = true
no_swap:
djnz R3, swap_loop ; petla swap
dec R2 ; dlugosc-- (ostatni element jest juz posortowany)
jb F0, bbbl_loop ; patla bbbl
no_sort:
ret
;---------------------------------------------------------------------
; Dane testowe:
;---------------------------------------------------------------------
test_data:
DB 11 ; Dlugosc
DB 6, 5, 3, 7, 4, 2, 0, 1, 9, 8, 4 ; Ciag liczb
END