; Compiled from the original 100-frame Eblan Games intro. No terminal rendering. FreeStartupSequence3D PROC cmp startupSequence3D, 0 je @F invoke HeapFree, startupSequenceHeap3D, 0, startupSequence3D mov startupSequence3D, 0 @@: ret FreeStartupSequence3D ENDP LoadStartupSequence3D PROC uses ebx esi local count:DWORD cmp startupSequence3D, 0 jne sequence_ready invoke CreateFileA, OFFSET startupSequencePath3D, 80000000h, 1, 0, 3, 80h, 0 cmp eax, -1 je sequence_failed mov ebx, eax invoke ReadFile, ebx, OFFSET startupSequenceHeader3D, 36, ADDR count, 0 test eax, eax jz sequence_close cmp count, 36 jne sequence_close cmp startupSequenceHeader3D, 41474245h jne sequence_close cmp startupSequenceHeader3D[4], 72 jne sequence_close cmp startupSequenceHeader3D[8], 21 jne sequence_close mov eax, startupSequenceHeader3D[12] test eax, eax jz sequence_close cmp eax, 400 ja sequence_close mov edx, startupSequenceHeader3D[16] cmp edx, eax jae sequence_close cmp startupSequenceHeader3D[20], 45 jne sequence_close cmp startupSequenceHeader3D[24], 256 ja sequence_close cmp startupSequenceHeader3D[32], 1 jne sequence_close imul eax, 72 * 21 * 2 add eax, 5120 cmp eax, startupSequenceHeader3D[28] jne sequence_close mov esi, eax invoke GetProcessHeap mov startupSequenceHeap3D, eax invoke HeapAlloc, eax, 0, esi mov startupSequence3D, eax test eax, eax jz sequence_close invoke ReadFile, ebx, startupSequence3D, esi, ADDR count, 0 test eax, eax jz sequence_close cmp count, esi jne sequence_close invoke CloseHandle, ebx sequence_ready: mov eax, 1 ret sequence_close: invoke CloseHandle, ebx call FreeStartupSequence3D sequence_failed: xor eax, eax ret LoadStartupSequence3D ENDP ResolveStartupFrame3D PROC mov eax, startupElapsed3D xor edx, edx mov ecx, 45 div ecx cmp eax, startupSequenceHeader3D[12] jb sequence_frame_ready sub eax, startupSequenceHeader3D[16] mov ecx, startupSequenceHeader3D[12] sub ecx, startupSequenceHeader3D[16] xor edx, edx div ecx mov eax, edx add eax, startupSequenceHeader3D[16] sequence_frame_ready: ret ResolveStartupFrame3D ENDP RenderStartupSequence3D PROC uses ebx esi edi local cell:DWORD, cellX:DWORD, cellY:DWORD, maskRow:DWORD, bits:DWORD, ink:DWORD lea edi, screenBuffer mov eax, 00050809h mov ecx, SCREEN_SIZE rep stosd call ResolveStartupFrame3D imul eax, 72 * 21 * 2 add eax, 5120 add eax, startupSequence3D mov esi, eax mov cell, 0 sequence_cell: movzx eax, WORD PTR [esi] add esi, 2 movzx edx, al test edx, edx jz sequence_next_cell movzx eax, ah mov ecx, startupSequence3D mov eax, [ecx+eax*4] mov ink, eax shl edx, 4 lea ebx, [ecx+edx+1024] mov eax, cell xor edx, edx mov ecx, 72 div ecx shl eax, 4 add eax, 72 mov cellY, eax shl edx, 3 add edx, 32 mov cellX, edx mov maskRow, 0 sequence_glyph_row: mov ecx, maskRow movzx eax, BYTE PTR [ebx+ecx] mov bits, eax mov eax, cellY add eax, ecx imul eax, SCREEN_W add eax, cellX lea edi, [screenBuffer+eax*4] mov ecx, 8 sequence_glyph_pixel: test bits, 80h jz @F mov eax, ink mov [edi], eax @@: shl bits, 1 add edi, 4 dec ecx jnz sequence_glyph_pixel inc maskRow cmp maskRow, 16 jb sequence_glyph_row sequence_next_cell: inc cell cmp cell, 72 * 21 jb sequence_cell ret RenderStartupSequence3D ENDP