You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

43 lines
1.4 KiB

;THIS SUBROUTINE ARRANGES THE 8-BIT ELEMENTS OF A LIST IN ASCENDING
;ORDER. THE STARTING ADDRESS OF THE LIST IS IN LOCATIONS $30 AND
;$31. THE LENGTH OF THE LIST IS IN THE FIRST BYTE OF THE LIST. LOCATION
;$32 IS USED TO HOLD AN EXCHANGE FLAG.
lda #$05
sta $30
sta $33
lda #$A4
sta $34
lda #$07
sta $35
lda #$F6
sta $36
lda #$44
lda $37
SORT8 ldy #$00 ;TURN EXCHANGE FLAG OFF (= 0)
sty $32
lda ($30),Y ;FETCH ELEMENT COUNT
tax ; AND PUT IT INTO X
iny ;POINT TO FIRST ELEMENT IN LIST
dex ;DECREMENT ELEMENT COUNT
NXTEL lda ($30),Y ;FETCH ELEMENT
iny
cmp ($30),Y ;IS IT LARGER THAN THE NEXT ELEMENT?
bcc CHKEND
beq CHKEND
;YES. EXCHANGE ELEMENTS IN MEMORY
pha ; BY SAVING LOW BYTE ON STACK.
lda ($30),Y ; THEN GET HIGH BYTE AND
dey ; STORE IT AT LOW ADDRESS
sta ($30),Y
pla ;PULL LOW BYTE FROM STACK
iny ; AND STORE IT AT HIGH ADDRESS
sta ($30),Y
lda #$FF ;TURN EXCHANGE FLAG ON (= -1)
sta $32
CHKEND dex ;END OF LIST?
bne NXTEL ;NO. FETCH NEXT ELEMENT
bit $32 ;YES. EXCHANGE FLAG STILL OFF?
bmi SORT8 ;NO. GO THROUGH LIST AGAIN
rts ;YES. LIST IS NOW ORDERED