; modified by: PJ, jirikp1, now 79b, absolutely 8086 compatible :) ; correspond with works setting! ; modified from: Tomas Skala, skalat2, Ct9:15, Uloha 2, 69b, verze pro 8086 .model tiny .data chars db ' (h) ' ; PJ: special data .code org 100h start: xor CX, CX xor DI, DI jmp short bfirst ; PJ: jmp -> no space char Write: ; vypis HEX cisla v zavorkach z SI jcxz null ; pokud neni v bufferu zadne cislo k tisknuti skoc na beg: (null vynuluje registry pri startu) mov si, offset chars ; PJ: some buf operations lodsb int 29h rpt: lodsb Wloop: int 29h rol DI, CL ; chceme horni ctyri bity, zarotujeme si je uplne vespod mov AX, DI ; nechceme znicit SI, pracovat budeme tedy s AX and AL, 0fh ; a pouze se spodnimi 4mi bity daa ; pokud AL>09 => AL:=AL+6 add AL, -10h ; jestlize je AL>=10h (daa pricetlo 6), je nutne pricist 1 => tento radek plni carry adc AL, 40h ; pricti 30h + 10h (z pred. radku) + c shr ch, 1 ; PJ: first loop level jnz Wloop ; opakuj 4x pro 4cislice (popate se sice provede vypocet, ale nevypise se) shr bl, 1 ; PJ: second loop level ... 3x jnz rpt null: xor DI, DI xor CX, CX beg: pop AX ; obnoveni posledniho stisknuteho znaku int 29h bfirst: mov AH, 08h ; cekani na zmacknuti klavesy int 21h cmp AL, 27 ; jestlize ESC => ukonci program jz konec push AX ; uloz klavesu pro pozdejsi vytisknuti sub AL, '0' mov BX, 10 cmp AL, BL ; pokud byla v AL cislice ('0'..'9'), pak cmp naplni Carry jnc Write ; pokud neni, zkus vypsat buffer cbw ; je potreba vynulovat AH (AL=<0,9> => AH=00) xchg AX, DI ; 4 radky = SI:=SI*10+AL mul BX add DI, AX mov CX, 1004h ; PJ: for wloop jmp short beg konec: ret end start