.386
.model flat,stdcall
option casemap:none

.CODE
; =========================================================
; Входная строка преобразуется из формата Base64 в ASCII
; ---------------------------------------------------------
; Параметры:
;  ESI - Указатель на начало входной строки.
; Возвращаемое значание:
;  EDI - Указатель на конец расшифрованной строки.
;  (Регистры EAX и EDX не сохраняются!)
; =========================================================
_b64_decode PROC SYSCALL
     mov edi,esi
     xor edx,edx
     ; Переводим из печатного ASCII в двоичный формат (0 - 63)
@L:  mov al,[esi]
     test al,al
     jz @R
     inc esi
     sub al,'A'
     cmp al,26
     jb @F
     sub al,6
     cmp al,52
     jb @F
     add al,90
     cmp al,62
     je @F
     sub al,3
     cmp al,63
     je @F
     sub al,12
     cmp al,62
     jb @F
     xor eax,eax
@@:  mov [edi],al
     inc edx
     inc edi
     cmp edx,4
     jl @L
     sub edi,4
     mov eax,[edi]
     ; Компактуем байты (4 -> 3)
     shl al,2
     mov dl,ah
     shr ah,4
     and ah,3
     or al,ah
     mov [edi],al ; Байт №1
     inc edi
     shr eax,8
     shl dl,4
     xchg al,dl
     mov dl,ah
     shr ah,2
     and ah,15
     or al,ah
     mov [edi],al ; Байт №2
     inc edi
     shr eax,8
     shl dl,6
     xchg al,dl
     and ah,63
     or al,ah
     mov [edi],al ; Байт №3
     inc edi
     xor edx,edx
     jmp @L
@R:  sub edi,edx
     ret
_b64_decode ENDP

END