; Sortieren eines n-stelligen Feldes

; code

; Lade Feldlänge,
; speichere FL-1 in RegB
lxi b, len
; Vergleich: Länge = 0? -> Abbruch
cpi 00h
jz ende

;mov b, a
dcr b

; Initialisiere swapFlag in RegC
mvi c, 00h

; Initialiere Zähler i in RegD,
; ii in RegE
mov d, b

loop0:
  mvi e, 00h ; Zähler ii = 0
  mvi c, 00h ; swapFlag zurücksetzen
  lxi hl, dat ; Datenpointer in RegHL an Anfang setzen
  loop1:
    ; Lade Felder
    mov a, m ; Lade Inhalt von Adr in hl -> RegA
    inx hl ; Inkrementiere Zeiger in RegHL

    ; Vergleiche HL mit RegA
    cmp m
    jnc noSwap

      ; Swap
      mov c, a
      mov a, m
      mov m, c

      dcx hl
      mov m, a
      inx hl

      ; swapFlag setzen
      mvi c, 01h

    noSwap:
    
    ; ii inkrementieren, Verleich mit FL-1
    ; Bei Ungleichheit nächstes Feld
    inr e
    mov a, b
    cmp e
  jnz loop1

  ;SwapFlag prüfen, wenn gesetzt -> fertig.
  mvi a, 00h
  cmp c
  jz ende

  dcr d
jnz loop0

ende: 

hlt

; Variablen
org 100h

; Feldlänge
len: db 01h

; Feld
dat: db 03h, 12h, 61h, 40h, 02h
; dat: db 03h, 04h, 05h, 06h, 07h

end