! eax is source
cmp edx,1
jne 2f
- o16 cbw ! needs operand size toggle to convert
- ! from one to two bytes.
- cwde
+ movsxb eax,al
mov edx,4
jmp 1f
2:
.sect .text
.exg:
push edi
- mov esp,edi
+ mov edi,esp
add edi,8
mov ebx,edi
add ebx,ecx
mov eax,(ebx)
xchg eax,(edi)
mov (ebx),eax
+ add edi,4
+ add ebx,4
loop 1b
2:
pop edi
cmp edx,4
.extern .unknown
jne .unknown
- pop ebx ! descriptor address
- pop eax ! index
- pop edx ! array base
+ pop ebx ! descriptor address
+ pop eax ! index
sub eax,(ebx)
mul 8(ebx)
- mov ebx,edx
+ pop ebx ! array base
add ebx,eax
push ecx
ret
mov edx,edi
mov edi,esp
add edi,ecx
- sar ecx,1
+ sar ecx,2
1:
pop eax
or eax,(edi)
.lar4:
! ebx, descriptor address
! eax, index
- pop ecx
- pop edx ! base address
- push ecx
sub eax,(ebx)
mov ecx,8(ebx)
imul ecx
+ pop ebx
+ pop edx ! base address
add edx,eax
sar ecx,1
jnb 1f
xor eax,eax
movb al,(edx)
- pop ebx
push eax
jmp ebx
1:
jnb 1f
xor eax,eax
o16 mov ax,(edx)
- pop ebx
push eax
jmp ebx
1:
- mov edx,esi ! saved esi
- mov eax,8(ebx)
- pop ebx ! return address
+ xchg edx,esi ! saved esi
+ mov eax,ecx
+ sal eax,2
sub esp,eax
mov eax,edi ! save edi
mov edi,esp
mov eax,ecx
sar ecx,1
jnb 1f
- xor eax,eax
- movb al,(edx)
+ movsxb eax,(ebx)
push eax
jmp edx
1:
sar ecx,1
jnb 1f
- xor eax,eax
- o16 mov ax,(edx)
+ movsx eax,(ebx)
push eax
jmp edx
1:
- mov ebx,edx
+ push edx
mov edx,esi
+ mov esi,ebx
+ pop ebx
sub esp,eax
jmp 1f
.define .nop
.extern printd, printc, hol0
-SIO_S = 0xDA
-SIO_D = 0xD8
-RXRDY = 0x02
-
.nop:
mov eax,(hol0)
call printd
-! movb al,' '
-! call printc
-! mov eax,esp
-! call printd
-!1:
-! inb SIO_S
-! andb al,RXRDY
-! jz 1b
-! inb SIO_D
-! call printc
movb al,'\n'
jmp printc
.sar4:
! ebx, descriptor address
! eax, index
- pop ecx
- pop edx ! base address
- push ecx
sub eax,(ebx)
mov ecx,8(ebx)
- push edx
imul ecx
- pop edx
+ pop ebx
+ pop edx ! base address
add edx,eax
sar ecx,1
jnb 1f
- pop ebx
pop eax
movb (edx),al
jmp ebx
1:
sar ecx,1
jnb 1f
- pop ebx
pop eax
o16 mov (edx),ax
jmp ebx
1:
- pop ebx
xchg edi,edx ! edi = base address, edx is saved edi
mov eax,esi
mov esi,esp
push edi
mov ebx,esp
xor edi,edi
- sar ecx,1
+ sar ecx,2
1:
- mov 4(ebx)(edi),edx
+ mov 8(ebx)(edi),edx
add edi,4
loop 1b
!endif
o16 mov (ebx),ax
jmp edx
1:
- mov ebx,edx
+ push edx
mov edx,edi
+ mov edi,ebx
+ pop ebx
jmp 1f
.sti:
! only called with count >> 4
.sect .text
.define .stop
.stop:
- int 3
+ jmp _exit
pop eax
ret
2:
+ push eax
call .stop