title Hamming Korrektur name ('HAMTEST') ext fsend,fempf OS equ 0000h BDOS equ 0005h TPATOP equ BDOS+1 .conout equ 2 .rdline equ 10 null equ 00h lf equ 0ah cr equ 0dh MAXCHR equ 16 ld sp,(TPATOP) ; Stack laden txtloop: call rdline ; Text einlesen jp nc,OS ; Ende, wenn Zeile leer call codetext ; Text "versenden" und "empfangen" jr txtloop ; ; Text "versenden" und "empfangen" ; codetext: ld hl,$txt ; Zeiger auf Text HammTxt: ld a,(hl) ; Zeichen holen or a ; Test ob Ende ret z ; Ja push hl push hl ld (o$chr),a ; Originalzeichen speichern call fsend ; Hamming-Byte berechnen pop hl push af ; Hamming-Byte retten ld a,(hl) ; Zeichen holen inc a ; Fehler einbauen ld (d$chr),a ; Speichern ld c,a pop af call fempf ; Zeichen wiederherstellen ld (h$chr),a ; Resultat speichern sbc a,a ; Bei Carry liegt Fehler vor xor 0ffh add a,'!' ; Leer- oder Ausrufungszeichen ld (k$chr),a call result ; Ergebnis ausgeben pop hl inc hl jr HammTxt ; ; Resultatszeile ; o$chr: db 'x - ' d$chr: db 'x - ' h$chr: db 'x ' k$chr: db '! [' bits: db '0 Bit(s)]' db cr,lf,null ; ; Ergebnis ausgeben ; result: ld hl,o$chr ld a,(d$chr) xor (hl) ; Anzahl verschiedener Bits ausgeben ld ix,bits ld (ix),'0' ; Null voreinstellen ld b,7 ; Anzahl Bits getbdif: rra ; Test ob Bit gesetzt jr nc,nobit ; Nein inc (ix) ; Bitzaehler erhoehen nobit: djnz getbdif call string ; Dann Ergebnis ausgeben ret ; ; Zeichenkette auf Konsole ausgeben ; string: ld a,(hl) or a ; Test Ende ret z ; Ja call conout ; Sonst Ausgabe inc hl jr string ; ; Zeile von Tastatur einlesen ; ; Bei vorhandenen Zeichen wird Carry gesetzt ; rdline: ld hl,what call string ; Anzeige, dass Eingabe benoetigt wird ld de,txt ld c,.rdline call BDOS ; Text einlesen ld a,(txt+1) or a ; Test ob Zeichen vorhanden ret z ; Nein ld c,a ld b,0 ld hl,$txt add hl,bc ld (hl),b ; Textende angeben call nl ; Zeilenvorschub scf ; Anzeige vorhandener Zeichen ret ; what: db 'Texteingabe max ' db '0' + MAXCHR / 10 db '0' + MAXCHR MOD 10 db ' Zeichen (leer fuer Ende):' db cr,lf,null ; ; Neue Zeile ausgeben ; nl: ld a,cr call conout ld a,lf ; ; Zeichen im Akku ausgeben ; conout: push af push bc push de push hl ld e,a ld c,.conout call BDOS ; Ausgabe pop hl pop de pop bc pop af ret ; ; Zeichenpuffer ; txt: db MAXCHR+1 ds 1 $txt: ds MAXCHR+1 end