This variation of the Base64 encodeing sytem is slightly cheaper to code than the standard due to the rearranging of the values used.
| 6 bit input value | ASCII character range produced | gap |
| 0...9 | "0"..."9" | 30h, 48d, '0' |
| 10...35 | "A"..."Z" | 7, 'A'-':' |
| 36...61 | "a"..."z" | 6, 'a'-'[' |
| 62 | "+" | -80d, -50h, '+'-'{' |
| 63 | "?" | 20d, 14h, '?'-',' |
Encode 3 bytes into 4 bytes consisting of only the characters 0...9, A...Z, a...z, and +
Entry:
lodsd
dec esi
mov edx,eax
mov ecx,4
.Repeat
and al, 00111111y
add al, ('0')
.If al > '9'
add al, ('A' - ':')
.If al > 'Z'
add al, ('a' - '[')
.If al > 'z'
.if al > 'z'+1
mov al, '?'
.else
mov al, '+'
.EndIf
.EndIf
.EndIf
.EndIf
stosb
shr edx, 6
mov al,dl
.Untilcxz
Decode
get value .if al < 'a' .if al < 'A' .if al < '0' .if al == '+' mov al, 62 .else stc breakpoint .endif .elseif al > '9' .if al == '?' mov al, 63 .else stc breakpoint .endif .else ;0...9 sub al, '0' .endif .elseif al > 'Z' stc breakpoint .else ;A...Z sub al, 'A' - 10 .endif .elseif al > 'z' stc breakpoint .else ;a...z sub al, 'a' - 36 .EndIf
Better?
sub al, '0'
.if Carry?
.if al == '+' - '0'
mov al, 62
.else
breakpoint ;invalid character in Mime input stream
.endif
.else
.if al > 9
sub al, 'A' - ':' ; if it was A, now its 10
.if Carry?
.if al == '?' - ('A' - '0')
mov al, 63
.else
breakpoint ;invalid character in Mime input stream
.endif
.else
.if al > 9 + 26
sub al, 'a' - '[' ; if it was a, now its 36
.if al > 9 + 26 + 26
breakpoint ;invalid character in Mime input stream
.endif
.endif
.endif
.endif
.endif