.nlist .enabl lc,crf .mcall .exit .macro arggen a,b,c,d,e,f,g,h,i,j,k,l,m,n .if nb a .word a arggen b,c,d,e,f,g,h,i,j,k,l,m,n .iff .mexit .endc .endm arggen .macro print arg .if df arg .globl writec jsr r5, writec arg .iff .list .ERROR Undefined argument (arg) in PRINT .nlist .endc .endm print .macro accept no,arg .if df arg .if gt no .globl readc jsr r5, readc .word no,arg .iff .list .ERROR Illegal argument (no) in ACCEPT .nlist .endc .iff .list .ERROR Undefined argument (arg) in ACCEPT .nlist .endc .endm accept .macro readln a,b,c,d,e,f,g,h,i,j,k,l,m,n .narg $no$ .if gt $no$ .globl readd jsr r5, readd .word $no$ arggen a,b,c,d,e,f,g,h,i,j,k,l.m,n .iff .list .ERROR READLN must have an argument .nlist .endc .endm readln .macro writeln a,b,c,d,e,f,g,h,i,j,k,l,m,n .narg $no$ .if gt $no$ .globl writed jsr %5, writed .word $no$ arggen a,b,c,d,e,f,g,h,i,j,k,l,m,n .iff .list .ERROR Writeln Must have an argument .nlist .endc .endm writeln .list .TITLE BUBBLESORT ;## 1 # 0 ## .TITLE BUBBLESORT .GLOBL WRITED,WRITEC,READD,EXIT ;## 2 # 0 ## .GLOBL WRITED,WRITEC,READD,EXIT ; This example SUPERMAC program will perform a simple ; bubble sort. The variable COUNT indicates how many ; values to sort. ; Program declarations K: .BLKW 1 ;## 10 # 0 ## .BLKW 1 OUT: .BLKW 1 ;## 11 # 0 ## .BLKW 1 TMP: .BLKW 1 ;## 12 # 0 ## .BLKW 1 NM: .BLKW 1 ;## 13 # 0 ## .BLKW 1 COUNT: .BLKW 1 ;## 14 # 0 ## .BLKW 1 FLAG: .BLKW 1 ;## 15 # 0 ## .BLKW 1 NUM: .BLKW 100. ;## 16 # 0 ## .BLKW 100. MESS0:.ASCII/ PLEASE INPUT EACH OF YOUR VALUES FOLLOWED BY A/ .ASCIZ/ FOR EACH OF THE NUMBERS./ <15><12><7><7> MESS1:.ASCIZ/ HOW MANY ELEMENTS DO YOU WISH TO SORT? / <15><12><7><7> MESS2:.ASCIZ/ THE SORTED NUMBERS ARE AS FOLLOW ... / <15><12> .EVEN ;## 21 # 0 ## .EVEN ; The actual program now begins BEGIN: PRINT MESS1 ;## 26 # 0 ## PRINT MESS1 READLN COUNT ;## 27 # 0 ## READLN COUNT PRINT MESS0 ;## 28 # 0 ## PRINT MESS0 mov #NUM,R0 ;## 29 # 0 ## LET R0 := #NUM mov #1,K ;## 30 # 0 ## FOR K := #1 TO COUNT ll$1: READLN NM ;## 31 # 1 ## READLN NM mov NM,(R0)+ ;## 32 # 1 ## LET (R0)+ := NM inc K ;## 33 # 0 ## END cmp K,COUNT ble .+4 br .+6 jmp ll$1 ll$2: ; The above code reads in the values to be sorted. clr FLAG ;## 36 # 0 ## LET FLAG := #0 mov #COUNT,R3 ;## 37 # 0 ## LET R3 := #COUNT mov (R3),R3 ;## 38 # 0 ## LET R3 := (R3) - #1 dec R3 ll$3: ;## 39 # 0 ## WHILE FLAG = #0 DO cmp FLAG,#0 bEQ ll$6 jmp ll$5 ll$5: jmp ll$4 ll$6: mov #NUM,R0 ;## 40 # 1 ## LET R0 := #NUM mov #1,FLAG ;## 41 # 1 ## LET FLAG := #1; Set up conditions, now perform sort .... mov #1,K ;## 42 # 1 ## FOR K := #1 TO R3 ll$7: mov R0,R1 ;## 43 # 2 ## LET R1 := R0 + #2 add #2,R1 cmp (R0),(R1) ;## 44 # 2 ## IF (R0) > (R1) THEN bGT ll$10 jmp ll$9 ll$10: mov (R0),TMP ;## 45 # 3 ## LET TMP := (R0) mov (R1),(R0) ;## 46 # 3 ## LET (R0) := (R1) mov TMP,(R1) ;## 47 # 3 ## LET (R1) := TMP clr FLAG ;## 48 # 3 ## LET FLAG := #0 ll$9: ;## 49 # 2 ## FI add #2,R0 ;## 50 # 2 ## LET R0 := R0 + #2 inc K ;## 51 # 1 ## END; of the for loop cmp K,R3 ble .+4 br .+6 jmp ll$7 ll$8: jmp ll$3 ;## 52 # 0 ## END; of the while loop ll$4: ; Finally, output the results PRINT MESS2 ;## 56 # 0 ## PRINT MESS2 mov #NUM,R1 ;## 57 # 0 ## LET R1 := #NUM inc R3 ;## 58 # 0 ## LET R3 := R3 + #1 mov #1,K ;## 59 # 0 ## FOR K := #1 TO R3 ll$11: mov (R1)+,OUT ;## 60 # 1 ## LET OUT := (R1)+ WRITELN OUT ;## 61 # 1 ## WRITELN OUT inc K ;## 62 # 0 ## END cmp K,R3 ble .+4 br .+6 jmp ll$11 ll$12: .EXIT ;## 63 # 0 ## .EXIT ;## 64 # 0 ## .END BEGIN ;SUPERMAC error(s) detected: 0 ; 1 0 0 0 14 0 4 0 0 1 ; 71 0 1 49 4 1 1 7 44 12 ; 0 16 0 3 0 49 0 0 167 0 ; 0 0 0 0 17 0 0 0 56 49 ; 4 4 0 0 2 1 2 0 0 0 ; 0 0 0 0 0 0 0 0 0 0 ; 0 0 0 0 0 0 0 0 0 0 ; 0 0 0 0 0 0 .END BEGIN