kolibrios-fun/programs/develop/h2d2b/trunk/h2d2b.asm

255 lines
5.3 KiB
NASM
Raw Normal View History

;; hex2dec2bin 0.2 by Alexei Ershov ;;
;; 16.11.2006 ;;
use32 ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 32-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
org 0x0 ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD>
db 'MENUET01' ; 8-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> MenuetOS
dd 0x01 ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1)
dd START ; <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dd I_END ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dd 0x1000 ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dd 0x1000 ; <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
dd 0x0 ; <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
dd 0x0 ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
include 'MACROS.INC' ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!
START:
red:
call draw_window
still:
mcall 10 ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 10 - <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
cmp eax,1 ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ?
je red ; <20><><EFBFBD><EFBFBD> <20><> - <20><> <20><><EFBFBD><EFBFBD><EFBFBD> red
cmp eax,2 ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ?
je key ; <20><><EFBFBD><EFBFBD> <20><> - <20><> key
cmp eax,3 ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ?
je button ; <20><><EFBFBD><EFBFBD> <20><> - <20><> button
jmp still ; <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
;---------------------------------------------------------------------
key: ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
mov eax, 2
int 0x40
mov edi, [index]
cmp edi, string1
jz no_back
cmp ah, 8
jnz no_back
dec edi
mov byte [edi], ' '
mov [index], edi
call Draw_String
jmp still
no_back:
cmp ah, 13
jz read_str
cmp edi, string1_end
jae still
mov al, ah
stosb
mov [index], edi
call Draw_String
jmp still ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
read_str:
dec edi
mov esi, string1
call GetBase
xor ecx, ecx
inc ecx ; ecx = 1
make_bin:
xor eax, eax
next_digit:
xor edx, edx
cmp edi, esi
jb .done
mov dl, [edi]
cmp dl, '-'
jne @f
neg eax
jmp .done
@@:
cmp dl, 'F'
jbe @f
and dl, 11011111b
@@:
sub dl, '0'
cmp dl, 9
jbe @f
sub dl, 'A'-'9'-1
@@:
cmp dl, bl
jb @f
; <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
jmp .done
@@:
push ecx
xchg eax, ecx
mul edx ; edx:eax = eax * edx
add ecx, eax
pop eax
mul ebx
xchg eax, ecx
dec edi
jmp next_digit
.done:
mov [num], eax ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
xor eax, eax
mov al, ' '
mov edi, string1
mov [index], edi
mov ecx, string1_end-string1
rep stosb ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
jmp red
;---------------------------------------------------------------------
button:
mcall 17 ; 17 - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
cmp ah, 1 ; <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1,
jne @f
mcall -1
@@:
cmp ah, 2
jne @f
shl [num], 1
jmp red
@@:
cmp ah, 3
jne @f
shr [num], 1
jmp red
@@:
cmp ah, 4
jne still
sar [num], 1
jmp red
;------------------------------------------------
draw_window:
;------------------------------------------------
mcall 12, 1
mcall 0, 200*65536+300, 200*65536+175, 0x13AABBCC,,header
mcall 8, 15 *65536+ 38, 90*65536+ 15, 2, 0x6688DD ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> shl
mcall , ,110*65536+ 15, , ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> sal
mcall , (300-53)*65536+ 38, 90*65536+ 15, 3, ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> shr
mcall , ,110*65536+ 15, 4, ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> sar
mcall 4, 15*65536+30, 0x80000000, binstr,
mcall , 15*65536+44, , decstr,
mcall , 15*65536+58, ,sdecstr,
mcall , 15*65536+72, , hexstr,
mcall , 15*65536+150, , numstr,
mcall , 25*65536+93,0x10000000,shlstr,3
mcall , (300-43)*65536+93, , shrstr,
mcall , 25*65536+113, , salstr,
mcall , (300-43)*65536+113, , sarstr,
mov ecx, [num]
mcall 47, 8*65536+256,,240*65536+72,0 ; 16-<2D><><EFBFBD>
mcall , 10*65536, ,228*65536+44, ; 10-<2D><><EFBFBD>
mcall , 8*65536+512,,240*65536+30, ; 2-<2D><><EFBFBD>
ror ecx, 8
mcall , ,,(240-56)*65536+30,
ror ecx, 8
mcall , ,,(240-56*2)*65536+30,
ror ecx, 8
mcall , ,,(240-56*3)*65536+30,
ror ecx, 8
mov [minus], '+'
jnc @f
mov [minus], '-'
neg ecx
@@:
mcall , 10*65536,,228*65536+58, ; 10-<2D><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
mcall 4, 222*65536+58, 0, minus, 1
mcall 38, 15*65536+300-15, 137*65536+137, 0x006688DD
call Draw_String
mcall 12, 2 ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 12: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
ret
;-------------------------------------------------
Draw_String:
;-------------------------------------------------
mcall 4, 60*65536+150, 0x40A40473, \
string1,string1_end-string1,0x00AABBCC
ret
;-------------------------------------------------
GetBase:
;-------------------------------------------------
mov ebx, 10
cmp edi, esi
jb .done
mov al, [edi]
cmp al, 'H'
jbe @f
and al, 11011111b
@@:
cmp al, 'H'
jne @f
mov ebx, 16
dec edi
jmp .done
@@:
cmp al, 'D'
jne @f
mov ebx, 10
dec edi
jmp .done
@@:
cmp al, 'B'
jne .done
mov ebx, 2
dec edi
.done:
ret
;-------------------------------------------------
string1:
db 34 dup(' ')
string1_end:
index dd string1
num dd 0
header db 'hex2dec2bin 0.2',0
minus db '-'
numstr db 'Number:',0
hexstr db 'hex:',0
binstr db 'bin:',0
decstr db 'dec:',0
sdecstr db 'signed dec:',0
shlstr db 'shl'
salstr db 'sal'
shrstr db 'shr'
sarstr db 'sar'
I_END: ; <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>