; BEDLAM v0.7 ; LKS 1995. ; Create: 18\Jun\1995 ; I'm well aware that I don't have a book named after me. ; (Fat and Frantic - Hier soir, ma femme vacuumait ma tete) ; Password for this ZIP is ABBIE. .MODEL large .STACK 8192 .DATA .CODE .386 JUMPS ; Segment storage. _zero_seg dw 0000h _psp_seg dw 0000h _code_seg dw 0000h _data_seg dw 0000h _stack_seg dw 0000h _alloc_seg dw 0000h ; 192k allocated (split into 3 x 64k) _scr_seg dw 0000h _sprite_seg dw 0000h _level_seg dw 0000h _intro_seg dw 0000h _text_seg dw 0B800h _graph_seg dw 0A000h ; Memory allocation. _code_size dw 0000h ; Size of shrunk CS. _free_size dw 0000h ; Free memory after shrink. ; Interrupt vectors. _int1C_off dw 0000h ; Old timer interrupt. _int1C_seg dw 0000h _int09_off dw 0000h ; Old keyboard interrupt. _int09_seg dw 0000h ; File handling. _fname db 'BEDLAM.BED ', 00h _handle dw 0000h ; Misc. _random dw 4 dup (0000h) _editflag dw 0 _devflag dw -1 .STARTUP start: mov _psp_seg, es mov _code_seg, cs mov _data_seg, ds mov _stack_seg, ss call logon call main call logoff .EXIT ;---- LOGON -------------------------------------------------------------------; ;---- Logon. logon: ; 80x50 text mode. mov ax, 3 int 10h mov ax, 1112h xor bx, bx int 10h ; Print logon message. mov es, _text_seg xor di, di call printc db 255, 19h, ' þ ', 255, 1Fh, 'Bedlam v0.7 + Editor', 255, 19h, ' þ ', 255, 1Fh, ' LKS 1995', 255, 19h, ' þ ', 255, 1Eh, 'Setting up resources.. ', 255, 19h, ' þ ', 00h call print db 0Dh, 0Ah, 0Ah, 00h ; Parse parameters. ; call param ; If in edit mode, check mouse driver loaded. cmp _editflag, 0 je logon_noedit call print db 'þ Initializing mouse driver.', 0Dh, 0Ah, 0Ah, 00h xor ax, ax int 33h cmp ax, -1 je logon_noedit ; Error with mouse. call print db 'ERROR - Cannot find Microsoft compatible mouse driver.', 0Dh, 0Ah, 00h .EXIT logon_noedit: ; Shrink memory. call print db 'þ Setting up memory', 0Dh, 0Ah, 0Ah db ' Shrinking CS:', 0Dh, 0Ah db ' CS = ', 00h mov cx, 1004h mov dx, cs call printnum call print db 'h', 0Dh, 0Ah, ' Size = ', 00h mov bx, _stack_seg sub bx, _psp_seg mov ax, sp add ax, 15 shr ax, 4 add bx, ax mov cx, 1004h mov _code_size, bx mov dx, bx call printnum call print db 'h', 0Dh, 0Ah, 0Ah, 00h mov ah, 4Ah mov es, _psp_seg int 21h jnc logon_csok call print db 0Dh, 0Ah, 'þ ERROR - Cannot shrink CS.', 0Dh, 0Ah, 00h .EXIT logon_csok: call print db ' Allocating buffers:', 0Dh, 0Ah db ' FreeMem = ', 00h mov ah, 48h mov bx, 0FFFFh int 21h mov _free_size, bx mov cx, 1004h mov dx, _free_size call printnum call print db 'h', 0Dh, 0Ah, 00h cmp _free_size, 3283h jae logon_freememok call print db 0Dh, 0Ah, 'þ ERROR - Cannot allocate 202k buffers.', 0Dh, 0Ah, 00h .EXIT logon_freememok: ; Allocate buffers. mov ah, 48h mov bx, 3280h int 21h mov _alloc_seg, ax mov _scr_seg, ax add ax, 1000h mov _sprite_seg, ax add ax, 1000h mov _level_seg, ax add ax, 1000h mov _intro_seg, ax call print db ' ScreenBuf = ', 00h mov cx, 1004h mov dx, _scr_seg call printnum call print db 'h', 0Dh, 0Ah, ' SpriteSeg = ', 00h mov dx, _sprite_seg call printnum call print db 'h', 0Dh, 0Ah, ' LevelSeg = ', 00h mov dx, _level_seg call printnum call print db 'h', 0Dh, 0Ah, ' IntroSeg = ', 00h mov dx, _intro_seg call printnum call print db 'h', 0Dh, 0Ah, 0Ah, 00h ; Load data file. call print db 'þ Loading BEDLAM.BED', 0Dh, 0Ah, 0Ah, 00h ; Open file. mov ax, 3D00h mov dx, offset _fname mov ds, _code_seg int 21h jnc logon_fileok call print db 'þ ERROR - Cannot find default data file.', 0Dh, 0Ah db ' make sure it is in current directory.', 0Dh, 0Ah, 00h .EXIT logon_fileok: mov _handle, ax ; Read palette. mov ah, 3Fh mov bx, _handle mov cx, 768 mov dx, offset _game_pal mov ds, _code_seg int 21h jc logon_read1err cmp ax, 768 jne logon_read1err ; Read sprites. mov ah, 3Fh mov bx, _handle mov cx, 8000h xor dx, dx mov ds, _sprite_seg int 21h jc logon_read1err cmp ax, 8000h je logon_read1ok logon_read1err: call print db 'þ ERROR - Cannot read the sprite data in this file.', 0Dh, 0Ah, 00h .EXIT logon_read1ok: ; Read levels. mov ah, 3Fh mov bx, _handle mov cx, 8000h xor dx, dx mov ds, _level_seg int 21h jc logon_read2err cmp ax, 8000h jne logon_read2err mov ah, 3Fh mov bx, _handle mov cx, 8000h mov dx, 8000h mov ds, _level_seg int 21h jc logon_read2err cmp ax, 8000h je logon_read2ok logon_read2err: call print db 'þ ERROR - Cannot read the level data in this file.', 0Dh, 0Ah, 00h .EXIT logon_read2ok: ; Close file mov ah, 3Eh mov bx, _handle int 21h ; Set up interrupt hooks. call print db 'þ Hooking interrupts', 0Dh, 0Ah, 0Ah, 00h mov ax, 351Ch int 21h mov _int1C_off, bx mov _int1C_seg, es mov ax, 3509h int 21h mov _int09_off, bx mov _int09_seg, es call print db ' INT 1Ch - System timer IRQ: OldVect = ', 00h mov cx, 1004h mov dx, _int1C_seg call printnum call print db 'h:', 00h mov dx, _int1C_off call printnum call print db 'h', 0Dh, 0Ah db ' NewVect = ', 00h mov dx, cs call printnum call print db 'h:', 00h mov dx, offset cs: timer call printnum call print db 'h', 0Dh, 0Ah, 0Ah, 00h call print db ' INT 09h - Keyboard IRQ: OldVect = ', 00h mov cx, 1004h mov dx, _int09_seg call printnum call print db 'h:', 00h mov dx, _int09_off call printnum call print db 'h', 0Dh, 0Ah db ' NewVect = ', 00h mov dx, cs call printnum call print db 'h:', 00h mov dx, offset cs: kbd call printnum call print db 'h', 0Dh, 0Ah, 00h ; Pause for keypress. call print db 0Ah, 'þ Press a key..', 00h mov ah, 7 int 21h cmp al, 27 jne logon_notesc call logoff .EXIT logon_notesc: mov ax, 251Ch mov dx, offset cs: timer mov ds, _code_seg int 21h mov ax, 2509h mov dx, offset cs: kbd mov ds, _code_seg int 21h ; Graphics mode. mov ax, 13h int 10h ; Set palette. mov ax, 1012h xor bx, bx mov cx, 256 mov dx, offset cs: _game_pal mov es, _code_seg int 10h ; Clear screen buffer. mov es, _scr_seg xor edi, edi mov ecx, 16000 xor eax, eax rep stosd ; Level parameter. mov es, _psp_seg cmp byte ptr es: [80h], 2 jb logon_noparam mov al, es: [82h] sub al, 'A' and al, 15 mov cs: _levelno, al logon_noparam: ; Level data. mov bl, cs: _levelno xor bh, bh mov al, cs: _level_startx_[bx] mov cs: _level_startx[bx], al mov al, cs: _level_starty_[bx] mov cs: _level_starty, al mov al, cs: _level_width_[bx] mov cs: _level_width, al mov al, cs: _level_height_[bx] mov cs: _level_height, al mov al, cs: _level_time_[bx] mov cs: _level_time, al mov al, cs: _level_dias_[bx] mov cs: _level_dias, al mov al, cs: _level_points_[bx] mov cs: _level_points, al ret ;---- LOGOFF ------------------------------------------------------------------; ;---- Logoff. logoff: ; Free memory mov ah, 49h mov es, _alloc_seg int 21h ; Unhook interrupts. mov ax, 251Ch mov dx, _int1C_off mov ds, _int1C_seg int 21h mov ax, 2509h mov dx, _int09_off mov ds, _int09_seg int 21h ; Clear screen. mov ax, 3 int 10h mov ax, 1112h xor bx, bx int 10h ret ;---- INTERRUPT HANDLERS ------------------------------------------------------; ;---- Int 1Ch _timer_in db 00h _timer_proc dw offset cs: timer_null ; Address of timer procedure. timer: cmp _timer_in, 0 jne timer_end mov _timer_in, 1 push bx mov bx, _timer_proc sub cs: _random, bx rol cs: _random, 3 cmp word ptr cs: [bx], 9090h jne timer_noproc call bx timer_noproc: pop bx ; Randomize. push bx add cs: _random[0], 128Ah sbb cs: _random[2], 8B12h xor cs: _random[4], 2761h adc cs: _random[6], 72F7h mov bx, cs: _random[0] xor cs: _random[1], bx sbb cs: _random[3], bx xor cs: _random[5], bx rol cs: _random[6], 1 add bx, cs: _random[6] adc bx, 3897h add cs: _random[4], bx xor bx, cs: _random[4] sbb bx, 9781h add cs: _random[2], bx ror dword ptr cs: _random[1], 3 xor bx, cs: _random[1] add bx, cs: _random[5] sbb cs: _random[0], bx pop bx mov _timer_in, 0 timer_end: push _int1C_seg push _int1C_off retf ; Null timer proc. timer_null: nop nop ret ;---- Int 09h ; Keyboard IRQ. _kbd_keys db 80h dup (00h) _KBD_ESC equ _kbd_keys[01h] _KBD_UP equ _kbd_keys[48h] _KBD_DOWN equ _kbd_keys[50h] _KBD_LEFT equ _kbd_keys[4Bh] _KBD_RIGHT equ _kbd_keys[4Dh] _KBD_FIRE equ _kbd_keys[1Dh] _KBD_RSHIFT equ _kbd_keys[36h] _KBD_SPACE equ _kbd_keys[39h] newint09: kbd: push ax push bx ; Store keypress or keyrelease. in al, 60h xor bh, bh mov bl, al test al, 80h jz kbd_press ; Key released. and bl, 7Fh mov _kbd_keys[bx], 0 jmp kbd_after kbd_press: ; Key pressed. mov _kbd_keys[bx], -1 kbd_after: add cs: _random[1], ax sbb cs: _random[3], ax pop bx pop ax cli push ax mov al, 20h out 20h, al pop ax iret ;---- MAIN --------------------------------------------------------------------; ;---- Main. main: cmp _editflag, 0 je main_noteditor call edit jmp main_end main_noteditor: main_loop: call intro cmp ax, -1 je main_end call game jmp main_loop main_end: ret ;---- EDIT --------------------------------------------------------------------; ; Bedlam Editor GUI. ; Mouse info. _mouse_b dw 0000h _mouse_x dw 0000h _mouse_y dw 0000h _mouse_xold dw 0000h _mouse_yold dw 0000h ; Window structures. _worder dw 32, 0, 64 _window_x1: _charwin_x1 dw 10 _window_y1: _charwin_y1 dw 13 _window_x2: _charwin_x2 dw 277 _window_y2: _charwin_y2 dw 162 _window_off1: _charwin_off1 dw 10+13*320 _window_off2: _charwin_off2 dw 277+162*320 _window_w: _charwin_w dw 268 _window_h: _charwin_h dw 150 _window_proc: _charwin_proc dw offset cs: charwin_proc _window_len: _charwin_len db 10 _window_title: _charwin_title db 'CHARACTERS...' _mapwin_x1 dw 20 _mapwin_y1 dw 26 _mapwin_x2 dw 287 _mapwin_y2 dw 183 _mapwin_off1 dw 20+26*320 _mapwin_off2 dw 287+183*320 _mapwin_w dw 268 _mapwin_h dw 158 _mapwin_proc dw offset cs: mapwin_proc _mapwin_len db 3 _mapwin_title db 'MAP..........' _editwin_x1 dw 0 _editwin_y1 dw 0 _editwin_x2 dw 214 _editwin_y2 dw 177 _editwin_off1 dw 0+0*320 _editwin_off2 dw 214+177*320 _editwin_w dw 215 _editwin_h dw 178 _editwin_proc dw offset cs: editwin_proc _editwin_len db 3 _editwin_title db 'SPRITE EDITOR' ;---- Edit. edit: call edit_logon call edit_main call edit_logoff ret ;---- Edit_Logon. edit_logon: ; Copy level into buffer. push es push ds push ax push ecx push esi push edi cld mov ds, _level_seg mov es, _code_seg xor esi, esi xor edi, edi xor al, al mov ah, cs: _levelno shl ah, 4 mov si, ax mov di, offset _level xor ecx, ecx mov cx, 64*64/4 rep movsd pop edi pop esi pop ecx pop ax pop ds pop es ; Create background bitmap. mov es, _intro_seg xor si, si xor edi, edi mov di, 2 mov dx, 100 edit_logon_yloop: mov cx, 25 edit_logon_xloop: mov ah, cs: _intro_back[si] mov al, ah and al, 3 ror ah, 2 mov es: [di], al mov al, ah and al, 3 ror ah, 2 mov es: [di+1], al mov al, ah and al, 3 ror ah, 2 mov es: [di+2], al mov al, ah and al, 3 ror ah, 2 mov es: [di+3], al add dword ptr es: [di], 19191919h inc si add di, 4 loop edit_logon_xloop add di, 2 dec dx jnz edit_logon_yloop ; Limit mouse. call mouse_limitscreen ret ;---- Edit_Logoff. edit_logoff: ret ;---- Edit_Main. edit_main: ; Draw screen. mov es, _scr_seg call edit_redraw call mouse_get call mouse_draw call update ; Wait for mouse event. edit_main_loop: call edit_redraw call mouse_get test _mouse_b, 1 jnz edit_main_lbutton test _mouse_b, 2 jnz edit_main_rbutton call mouse_draw call update cmp _KBD_ESC, 0 je edit_main_loop ret ; Left mouse button event. edit_main_lbutton: push ax push cx push dx push bx ; Check which window the mouse is in. mov ax, 10h mov cx, _mouse_x mov dx, _mouse_y ; Test top window first. mov bx, _worder[0] cmp cx, word ptr _window_x1[bx] jb edit_main_lbutton_notwin1 cmp cx, word ptr _window_x2[bx] ja edit_main_lbutton_notwin1 cmp dx, word ptr _window_y1[bx] jb edit_main_lbutton_notwin1 cmp dx, word ptr _window_y2[bx] ja edit_main_lbutton_notwin1 sub cx, word ptr _window_x1[bx] sub dx, word ptr _window_y1[bx] mov bx, word ptr _window_proc[bx] cmp word ptr cs: [bx], 9090h jne edit_main_lbutton_error call bx jmp edit_main_lbutton_end edit_main_lbutton_notwin1: ; Test middle window. mov bx, _worder[2] cmp cx, word ptr _window_x1[bx] jb edit_main_lbutton_notwin2 cmp cx, word ptr _window_x2[bx] ja edit_main_lbutton_notwin2 cmp dx, word ptr _window_y1[bx] jb edit_main_lbutton_notwin2 cmp dx, word ptr _window_y2[bx] ja edit_main_lbutton_notwin2 sub cx, word ptr _window_x1[bx] sub dx, word ptr _window_y1[bx] mov bx, word ptr _window_proc[bx] cmp word ptr cs: [bx], 9090h jne edit_main_lbutton_error call bx jmp edit_main_lbutton_end edit_main_lbutton_notwin2: ; Test bottom window. mov bx, _worder[4] cmp cx, word ptr _window_x1[bx] jb edit_main_lbutton_notwin3 cmp cx, word ptr _window_x2[bx] ja edit_main_lbutton_notwin3 cmp dx, word ptr _window_y1[bx] jb edit_main_lbutton_notwin3 cmp dx, word ptr _window_y2[bx] ja edit_main_lbutton_notwin3 sub cx, word ptr _window_x1[bx] sub dx, word ptr _window_y1[bx] mov bx, word ptr _window_proc[bx] cmp word ptr cs: [bx], 9090h jne edit_main_lbutton_error call bx jmp edit_main_lbutton_end edit_main_lbutton_notwin3: ; The background has been clicked on. call mouse_undo call mouse_get call mouse_draw call update edit_main_lbutton_error: edit_main_lbutton_end: pop bx pop dx pop cx pop ax call mouse_draw call update jmp edit_main_loop ; Right mouse button event. edit_main_rbutton: jmp edit_main_loop ;---- Edit_Redraw. ; Draws the whole screen (except for mouse pointer). edit_redraw: push ax push bx ; Draw background. call edit_back ; Draw windows in right order. mov bx, _worder[4] mov bx, word ptr _window_proc[bx] cmp word ptr cs: [bx], 9090h jne edit_redraw_error xor ax, ax call bx mov bx, _worder[2] mov bx, word ptr _window_proc[bx] cmp word ptr cs: [bx], 9090h jne edit_redraw_error xor ax, ax call bx mov bx, _worder[0] mov bx, word ptr _window_proc[bx] cmp word ptr cs: [bx], 9090h jne edit_redraw_error xor ax, ax call bx edit_redraw_error: pop bx pop ax ret ;---- CharWin. ----------------------------------------------------------------; charwin_proc: nop nop cmp ax, 00h ; Redraw? je charwin_draw cmp ax, 10h ; LButton pressed? je charwin_ldown ; cmp ax, 11h ; LButton released? ; je charwin_lup ; cmp ax, 20h ; RButton pressed? ; je charwin_rdown ; cmp ax, 21h ; RButton released? ; je charwin_rup ret ;---- CharWin_LDown. ; Left mouse button pressed. charwin_ldown: push ax push cx push dx push bx push es ; If within title bar then drag window. cmp cx, 11 jb charwin_ldown_nodrag mov ax, _charwin_w sub ax, 12 cmp cx, ax ja charwin_ldown_nodrag cmp dx, 1 jb charwin_ldown_nodrag cmp dx, 9 ja charwin_ldown_nodrag ; Limit mouse. push dx mov ax, 0007h mov dx, cx add dx, 320 add cx, cx sub dx, _charwin_w add dx, dx int 33h mov ax, 0008h pop dx mov cx, dx add dx, dx add cx, 200 sub cx, _charwin_h add cx, cx int 33h ; Drag window. mov es, _scr_seg charwin_ldown_dragloop: call mouse_get mov cx, _mouse_x mov dx, _mouse_y sub cx, _mouse_xold sub dx, _mouse_yold add _charwin_x1, cx add _charwin_y1, dx add _charwin_x2, cx add _charwin_y2, dx mov ax, 320 mul _charwin_y1 add ax, _charwin_x1 mov _charwin_off1, ax mov ax, 320 mul _charwin_y2 add ax, _charwin_x2 mov _charwin_off2, ax call edit_redraw call mouse_draw call update test _mouse_b, 1 jnz charwin_ldown_dragloop call mouse_limitscreen jmp charwin_ldown_end charwin_ldown_nodrag: ; Move to front. cmp _worder[4], 0 jne charwin_ldown_nosort1 mov ax, _worder[2] mov _worder[4], ax mov _worder[2], 0 charwin_ldown_nosort1: cmp _worder[2], 0 jne charwin_ldown_nosort2 mov ax, _worder[0] mov _worder[2], ax mov _worder, 0 charwin_ldown_nosort2: charwin_ldown_end: pop es pop bx pop dx pop cx pop ax ret ;---- CharWin_Draw. charwin_draw: ; Title bar. mov bx, 0 call edit_title ; Horizontal scroll. mov di, _charwin_off2 sub di, _charwin_w sub di, 320*10-1 call edit_button add di, 320+11 mov cx, _charwin_w sub cx, 33 mov dx, 9 mov al, 7 call edit_rect mov di, _charwin_off2 sub di, 10*320+20 call edit_button add di, 10 call edit_button ; Draw characters. mov di, _charwin_off1 add di, 10*320 mov cx, _charwin_w sub cx, 10 mov dx, _charwin_h sub dx, 20 mov al, 0 call edit_frame mov di, _charwin_off1 add di, 1+11*320 xor si, si mov ds, _sprite_seg mov dl, 16 edit_charwin_xloop: push si push di mov ax, _charwin_h sub ax, 22 mov dh, al edit_charwin_yloop: mov eax, [si] mov ebx, [si+4] mov es: [di], eax mov es: [di+4], ebx mov eax, [si+8] mov ebx, [si+12] mov es: [di+8], eax mov es: [di+12], ebx add di, 320 add si, 16 dec dh jnz edit_charwin_yloop pop di pop si add di, 16 add si, 16*16*8 dec dl jnz edit_charwin_xloop ret ;---- MapWin. -----------------------------------------------------------------; _mapwin_chars db 00h, 00h, 00h, 00h ; Space. db 00h, 00h, 00h, 00h db 00h, 00h, 00h, 00h db 00h, 00h, 00h, 00h db 29h, 29h, 27h, 28h ; Earth. db 2Ah, 29h, 28h, 29h db 29h, 28h, 28h, 27h db 26h, 27h, 28h, 28h db 00h, 00h, 4Dh, 00h ; Diamond. db 00h, 4Dh, 46h, 4Dh db 4Dh, 46h, 46h, 46h db 00h, 4Dh, 46h, 4Dh db 00h, 00h, 16h, 00h ; NewDia. db 00h, 16h, 10h, 16h db 16h, 10h, 10h, 10h db 00h, 16h, 10h, 16h db 4Dh, 00h, 4Dh, 00h ; Bat. db 4Dh, 46h, 4Dh, 46h db 4Dh, 46h, 46h, 46h db 00h, 46h, 00h, 46h db 0AAh,0AAh,0AAh, 00h ; Spirit. db 0AAh, 93h, 93h, 93h db 0AAh, 93h, 94h, 93h db 0AAh, 93h, 93h, 93h db 00h, 1Ch, 1Bh, 1Ch ; Rock. db 1Ch, 1Ah, 18h, 1Ah db 1Bh, 18h, 17h, 18h db 1Ch, 1Ah, 18h, 1Ah db 12h, 15h, 12h, 15h ; Wall. db 15h, 12h, 10h, 12h db 12h, 15h, 12h, 15h db 10h, 12h, 15h, 12h db 15h, 15h, 15h, 15h ; Magic. db 13h, 10h, 10h, 13h db 10h, 13h, 13h, 10h db 15h, 15h, 15h, 15h db 00h, 00h, 00h, 00h ; Bang. db 00h, 23h, 23h, 00h db 00h, 23h, 23h, 00h db 00h, 00h, 00h, 00h db 6Bh, 68h, 68h, 6Bh ; Mould. db 68h, 6Bh, 6Bh, 68h db 68h, 6Bh, 6Bh, 68h db 6Bh, 68h, 68h, 6Bh db 6Ah, 6Ch, 6Ah, 6Ch ; Solid. db 6Ch, 6Eh, 6Ch, 6Eh db 6Ah, 6Ch, 6Ah, 6Ch db 6Ch, 6Eh, 6Ch, 6Eh db 6Ch, 6Ch, 6Ch, 6Ch ; Door. db 6Ch, 00h, 00h, 6Ch db 6Ch, 00h, 00h, 6Ch db 6Ch, 6Ch, 6Ch, 6Ch db 6Ah, 6Bh, 6Dh, 6Eh ; RSolid. db 6Eh, 6Dh, 6Bh, 6Ah db 6Ah, 6Bh, 6Dh, 6Eh db 6Eh, 6Dh, 6Bh, 6Ah db 6Ah, 6Ah, 6Ah, 00h ; Start. db 6Ah, 6Ah, 00h, 6Ah db 6Ah, 00h, 6Ah, 6Ah db 00h, 6Ah, 6Ah, 6Ah db 00h, 26h, 26h, 00h ; Man. db 26h, 6Ch, 6Ch, 26h db 00h, 6Ch, 6Ch, 00h db 26h, 00h, 00h, 26h ;---- MapWin_Proc. mapwin_proc: nop nop cmp ax, 00h ; Redraw? je mapwin_draw cmp ax, 10h ; LButton pressed? je mapwin_ldown ; cmp ax, 11h ; LButton released? ; je mapwin_lup ; cmp ax, 20h ; RButton pressed? ; je mapwin_rdown ; cmp ax, 21h ; RButton released? ; je mapwin_rup ret ;---- MapWin_LDown. ; Left mouse button pressed. mapwin_ldown: push ax push cx push dx push bx push es ; If within title bar then drag window. cmp cx, 11 jb mapwin_ldown_nodrag mov ax, _mapwin_w sub ax, 12 cmp cx, ax ja mapwin_ldown_nodrag cmp dx, 1 jb mapwin_ldown_nodrag cmp dx, 9 ja mapwin_ldown_nodrag ; Limit mouse. push dx mov ax, 0007h mov dx, cx add dx, 320 add cx, cx sub dx, _mapwin_w add dx, dx int 33h mov ax, 0008h pop dx mov cx, dx add dx, dx add cx, 200 sub cx, _mapwin_h add cx, cx int 33h ; Drag window. mov es, _scr_seg mapwin_ldown_dragloop: call mouse_get mov cx, _mouse_x mov dx, _mouse_y sub cx, _mouse_xold sub dx, _mouse_yold add _mapwin_x1, cx add _mapwin_y1, dx add _mapwin_x2, cx add _mapwin_y2, dx mov ax, 320 mul _mapwin_y1 add ax, _mapwin_x1 mov _mapwin_off1, ax mov ax, 320 mul _mapwin_y2 add ax, _mapwin_x2 mov _mapwin_off2, ax call edit_redraw call mouse_draw call update test _mouse_b, 1 jnz mapwin_ldown_dragloop call mouse_limitscreen jmp mapwin_ldown_end mapwin_ldown_nodrag: ; Move to front. cmp _worder[4], 32 jne mapwin_ldown_nosort1 mov ax, _worder[2] mov _worder[4], ax mov _worder[2], 32 mapwin_ldown_nosort1: cmp _worder[2], 32 jne mapwin_ldown_nosort2 mov ax, _worder[0] mov _worder[2], ax mov _worder, 32 mapwin_ldown_nosort2: mapwin_ldown_end: pop es pop bx pop dx pop cx pop ax ret ;---- MapWin_Draw. mapwin_draw: push eax push cx push dx push di mov bx, 32 call edit_title ; Info bar. mov di, _mapwin_off1 add di, 10*320 mov cx, 53 mov dx, 11 call edit_box add di, 52 mov ax, 2 call edit_button add di, 10 mov ax, 3 call edit_button ; Map. mov cx, _mapwin_w mov dx, _mapwin_h mov di, _mapwin_off1 sub cx, 10 sub dx, 20 add di, 20*320 mov al, 0 call edit_frame shr cx, 2 shr dx, 2 xor si, si mov di, _mapwin_off1 add di, 320*21+1 mapwin_draw_yloop: push di push cx mapwin_draw_xloop: mov bl, cs: _level[si] xor bh, bh and bl, 0F0h mov eax, dword ptr _mapwin_chars[bx] mov es: [di], eax mov eax, dword ptr _mapwin_chars[bx+4] mov es: [di+320], eax mov eax, dword ptr _mapwin_chars[bx+8] mov es: [di+320*2], eax mov eax, dword ptr _mapwin_chars[bx+12] mov es: [di+320*3], eax inc si add di, 4 loop mapwin_draw_xloop pop cx pop di add di, 320*4 dec dx jnz mapwin_draw_yloop call game_move pop di pop dx pop cx pop eax ret ;---- EditWin. ----------------------------------------------------------------; ;---- EditWin_Proc. editwin_proc: nop nop cmp ax, 00h ; Redraw? je editwin_draw cmp ax, 10h ; LButton pressed? je editwin_ldown ; cmp ax, 11h ; LButton released? ; je editwin_lup ; cmp ax, 20h ; RButton pressed? ; je editwin_rdown ; cmp ax, 21h ; RButton released? ; je editwin_rup ret ;---- EditWin_LDown. ; Left mouse button pressed. editwin_ldown: push ax push cx push dx push bx push es ; If within title bar then drag window. cmp cx, 11 jb editwin_ldown_nodrag mov ax, _editwin_w sub ax, 12 cmp cx, ax ja editwin_ldown_nodrag cmp dx, 1 jb editwin_ldown_nodrag cmp dx, 9 ja editwin_ldown_nodrag ; Limit mouse. push dx mov ax, 0007h mov dx, cx add dx, 320 add cx, cx sub dx, _editwin_w add dx, dx int 33h mov ax, 0008h pop dx mov cx, dx add dx, dx add cx, 200 sub cx, _editwin_h add cx, cx int 33h ; Drag window. mov es, _scr_seg editwin_ldown_dragloop: call mouse_get mov cx, _mouse_x mov dx, _mouse_y sub cx, _mouse_xold sub dx, _mouse_yold add _editwin_x1, cx add _editwin_y1, dx add _editwin_x2, cx add _editwin_y2, dx mov ax, 320 mul _editwin_y1 add ax, _editwin_x1 mov _editwin_off1, ax mov ax, 320 mul _editwin_y2 add ax, _editwin_x2 mov _editwin_off2, ax call edit_redraw call mouse_draw call update test _mouse_b, 1 jnz editwin_ldown_dragloop call mouse_limitscreen jmp editwin_ldown_end editwin_ldown_nodrag: ; Move to front. cmp _worder[4], 64 jne editwin_ldown_nosort1 mov ax, _worder[2] mov _worder[4], ax mov _worder[2], 64 editwin_ldown_nosort1: cmp _worder[2], 64 jne editwin_ldown_nosort2 mov ax, _worder[0] mov _worder[2], ax mov _worder, 64 editwin_ldown_nosort2: editwin_ldown_end: pop es pop bx pop dx pop cx pop ax ret ;---- EditWin_Draw. editwin_draw: push ax push cx push dx push di mov bx, 64 call edit_title mov cx, _editwin_w mov dx, _editwin_h mov di, _editwin_off1 sub dx, 10 add di, 10*320 call edit_box pop di pop dx pop cx pop ax ret ;---- Mouse routines. ---------------------------------------------------------; _mouse_offs dw 0000h _mouse_and db 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 db 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 db 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1 db 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1 db 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1 db 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1 db 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1 db 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1 db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1 db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1 db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1 db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1 db 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1 db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1 db 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, -1, -1, -1 db -1, 0, -1, -1, -1, 0, 0, 0, 0, 0, 0, -1, -1 db -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, -1, -1 db -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1 db -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, -1, -1, -1 _mouse_xor db 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0 db 0h,0Fh, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0 db 0h,0Fh,0Fh, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0 db 0h,0Fh,28h,0Fh, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0 db 0h,0Fh,28h,28h,0Fh, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0 db 0h,0Fh,29h,2Bh,28h,0Fh, 0h, 0h, 0h, 0h, 0h, 0h, 0 db 0h,0Fh,2Ah,2Bh,2Ch,28h,0Fh, 0h, 0h, 0h, 0h, 0h, 0 db 0h,0Fh,29h,2Ah,2Bh,2Dh,29h,0Fh, 0h, 0h, 0h, 0h, 0 db 0h,0Fh,28h,29h,2Ah,2Bh,2Ch,2Ah,0Fh, 0h, 0h, 0h, 0 db 0h,0Fh,28h,28h,29h,2Ah,2Ch,2Dh,2Ah,0Fh, 0h, 0h, 0 db 0h,0Fh,27h,22h,27h,29h,2Ah,2Bh,2Ah,2Ah,0Fh, 0h, 0 db 0h,0Fh,27h,27h,28h,28h,29h,2Ah,0Fh,0Fh,0Fh,0Fh, 0 db 0h,0Fh,27h,28h,28h,29h,29h,0Fh, 0h, 0h, 0h, 0h, 0 db 0h,0Fh,27h,0Fh,0Fh,29h,2Ah,0Fh, 0h, 0h, 0h, 0h, 0 db 0h,0Fh,0Fh, 0h, 0h,0Fh,2Ah,29h,0Fh, 0h, 0h, 0h, 0 db 0h,0Fh, 0h, 0h, 0h,0Fh,28h,2Ah,0Fh, 0h, 0h, 0h, 0 db 0h, 0h, 0h, 0h, 0h, 0h,0Fh,29h,2Ah,0Fh, 0h, 0h, 0 db 0h, 0h, 0h, 0h, 0h, 0h,0Fh,29h,28h,0Fh, 0h, 0h, 0 db 0h, 0h, 0h, 0h, 0h, 0h, 0h,0Fh,0Fh, 0h, 0h, 0h, 0 db 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0 _mouse_add db 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0 db 0h,01h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0 db 0h,01h,01h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0 db 0h,01h,01h,01h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0 db 0h,01h,01h,01h,01h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0 db 0h,01h,01h,01h,01h,01h, 0h, 0h, 0h, 0h, 0h, 0h, 0 db 0h,01h,01h,01h,01h,01h,01h, 0h, 0h, 0h, 0h, 0h, 0 db 0h,01h,01h,01h,01h,01h,01h,01h, 0h, 0h, 0h, 0h, 0 db 0h,01h,01h,01h,01h,01h,01h,01h,01h, 0h, 0h, 0h, 0 db 0h,01h,01h,01h,01h,01h,01h,01h,01h,01h, 0h, 0h, 0 db 0h,01h,01h,01h,01h,01h,01h,01h,01h,01h,01h, 0h, 0 db 0h,01h,01h,01h,01h,01h,01h,01h,01h,01h,01h,01h, 0 db 0h,01h,01h,01h,01h,01h,01h,01h, 0h, 0h, 0h, 0h, 0 db 0h,01h,01h,01h,01h,01h,01h,01h, 0h, 0h, 0h, 0h, 0 db 0h,01h,01h, 0h, 0h,01h,01h,01h,01h, 0h, 0h, 0h, 0 db 0h,01h, 0h, 0h, 0h,01h,01h,01h,01h, 0h, 0h, 0h, 0 db 0h, 0h, 0h, 0h, 0h, 0h,01h,01h,01h,01h, 0h, 0h, 0 db 0h, 0h, 0h, 0h, 0h, 0h,01h,01h,01h,01h, 0h, 0h, 0 db 0h, 0h, 0h, 0h, 0h, 0h, 0h,01h,01h, 0h, 0h, 0h, 0 db 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0 _mouse_under db 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0 db 0h,01h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0 db 0h,01h,01h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0 db 0h,01h,01h,01h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0 db 0h,01h,01h,01h,01h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0 db 0h,01h,01h,01h,01h,01h, 0h, 0h, 0h, 0h, 0h, 0h, 0 db 0h,01h,01h,01h,01h,01h,01h, 0h, 0h, 0h, 0h, 0h, 0 db 0h,01h,01h,01h,01h,01h,01h,01h, 0h, 0h, 0h, 0h, 0 db 0h,01h,01h,01h,01h,01h,01h,01h,01h, 0h, 0h, 0h, 0 db 0h,01h,01h,01h,01h,01h,01h,01h,01h,01h, 0h, 0h, 0 db 0h,01h,01h,01h,01h,01h,01h,01h,01h,01h,01h, 0h, 0 db 0h,01h,01h,01h,01h,01h,01h,01h,01h,01h,01h,01h, 0 db 0h,01h,01h,01h,01h,01h,01h,01h, 0h, 0h, 0h, 0h, 0 db 0h,01h,01h,01h,01h,01h,01h,01h, 0h, 0h, 0h, 0h, 0 db 0h,01h,01h, 0h, 0h,01h,01h,01h,01h, 0h, 0h, 0h, 0 db 0h,01h, 0h, 0h, 0h,01h,01h,01h,01h, 0h, 0h, 0h, 0 db 0h, 0h, 0h, 0h, 0h, 0h,01h,01h,01h,01h, 0h, 0h, 0 db 0h, 0h, 0h, 0h, 0h, 0h,01h,01h,01h,01h, 0h, 0h, 0 db 0h, 0h, 0h, 0h, 0h, 0h, 0h,01h,01h, 0h, 0h, 0h, 0 db 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0h, 0 ;---- Mouse_Get. ; Gets mouse co-ordinates and button status. mouse_get: push ax push cx push dx push bx mov cx, _mouse_x mov dx, _mouse_y mov _mouse_xold, cx mov _mouse_yold, dx mov ax, 0003h int 33h shr cx, 1 shr dx, 1 mov _mouse_b, bx mov _mouse_x, cx mov _mouse_y, dx pop bx pop dx pop cx pop ax ret ;---- Mouse_Undo. ; Removes pointer and replaces whatever was covered by it. Uses _mouse_offs, ; which is set by the drawing routine, so if _mouse_x etc. have been changed ; the pointer will still be removed in the right place. mouse_undo: push eax push ebx push cx push si push di xor si, si mov di, _mouse_offs mov cx, 20 mouse_undo_loop: mov eax, dword ptr _mouse_under[si] mov ebx, dword ptr _mouse_under[si+4] mov es: [di], eax mov es: [di+4], ebx mov eax, dword ptr _mouse_under[si+8] mov bl, byte ptr _mouse_under[si+12] mov es: [di+8], eax mov es: [di+12], bl add si, 13 add di, 320 ; Clip to bottom of screen. cmp di, 64000 jae mouse_undo_end loop mouse_undo_loop mouse_undo_end: pop di pop si pop cx pop ebx pop eax ret ;---- Mouse_Draw. ; Displays mouse pointer according to _mouse_x etc. and stores the rectangle ; of pixels under it. mouse_draw: push eax push ebx push cx push dx push si push di mov dx, _mouse_y mov ax, 320 mul dx add ax, _mouse_x mov di, ax mov _mouse_offs, di xor si, si mov cx, 20 mouse_draw_loop: ; Get pixels underneath. mov eax, es: [di] mov ebx, es: [di+4] mov dword ptr _mouse_under[si], eax mov dword ptr _mouse_under[si+4], ebx mov eax, es: [di+8] mov bl, es: [di+12] mov dword ptr _mouse_under[si+8], eax mov byte ptr _mouse_under[si+12], bl ; And mask. mov eax, dword ptr _mouse_and[si] mov ebx, dword ptr _mouse_and[si+4] and es: [di], eax and es: [di+4], ebx mov eax, dword ptr _mouse_and[si+8] mov bl, byte ptr _mouse_and[si+12] and es: [di+8], eax and es: [di+12], bl ; Xor mask. mov eax, dword ptr _mouse_xor[si] mov ebx, dword ptr _mouse_xor[si+4] xor es: [di], eax xor es: [di+4], ebx mov eax, dword ptr _mouse_xor[si+8] mov bl, byte ptr _mouse_xor[si+12] xor es: [di+8], eax xor es: [di+12], bl ; Shadow. ; mov eax, dword ptr _mouse_add[si] ; mov ebx, dword ptr _mouse_add[si+4] ; add es: [di+320*8+8], eax ; add es: [di+320*8+8+4], ebx ; mov eax, dword ptr _mouse_add[si+8] ; mov bl, byte ptr _mouse_add[si+12] ; add es: [di++320*8+8+8], eax ; add es: [di++320*8+8+12], bl add si, 13 add di, 320 cmp di, 64000 jae mouse_draw_end loop mouse_draw_loop mouse_draw_end: pop di pop si pop dx pop cx pop ebx pop eax ret ;---- Mouse_LimitScreen. ; Sets the mouse limits to the whole screen. mouse_limitscreen: push ax push cx push dx mov ax, 0007h mov cx, 2 mov dx, 318*2 int 33h mov ax, 0008h mov cx, 2 mov dx, 198*2 int 33h pop dx pop cx pop ax ret ;---- Editor graphics. --------------------------------------------------------; ;---- Edit_Title. ; Draws a title bar with Close and Under buttons. ; Inputs: ; BX - Window structure (0, 32 or 64). ; ES - Output buffer. edit_title: push ax push cx push dx mov di, word ptr _window_off1[bx] mov ax, 0 call edit_button add di, 10 mov cx, word ptr _window_w[bx] mov dx, 11 sub cx, 20 call edit_box add di, word ptr _window_w[bx] sub di, 21 mov ax, 1 call edit_button pop dx pop cx pop ax ret ;---- Edit_Button. ; Button bitmaps. _edit_buttons db 48h, 48h, 48h, 48h, 48h, 48h, 48h, 48h, 4Bh ; Close. db 48h, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Eh db 48h, 4Bh, 0h, 0h, 4Bh, 0h, 0h, 4Bh, 4Eh db 48h, 4Bh, 0h, 0h, 0h, 0h, 0h, 4Bh, 4Eh db 48h, 4Bh, 4Bh, 0h, 4Bh, 0h, 4Bh, 4Bh, 4Eh db 48h, 4Bh, 0h, 0h, 0h, 0h, 0h, 4Bh, 4Eh db 48h, 4Bh, 0h, 0h, 4Bh, 0h, 0h, 4Bh, 4Eh db 48h, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Eh db 4Bh, 4Eh, 4Eh, 4Eh, 4Eh, 4Eh, 4Eh, 4Eh, 4Eh db 48h, 48h, 48h, 48h, 48h, 48h, 48h, 48h, 4Bh ; Under. db 48h, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Eh db 48h, 4Bh, 0h, 0h, 0h, 4Bh, 4Bh, 4Bh, 4Eh db 48h, 4Bh, 0h, 0h, 0h, 0h, 0h, 4Bh, 4Eh db 48h, 4Bh, 0h, 0h, 4Bh, 4Bh, 0h, 4Bh, 4Eh db 48h, 4Bh, 4Bh, 0h, 4Bh, 4Bh, 0h, 4Bh, 4Eh db 48h, 4Bh, 4Bh, 0h, 0h, 0h, 0h, 4Bh, 4Eh db 48h, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Eh db 4Bh, 4Eh, 4Eh, 4Eh, 4Eh, 4Eh, 4Eh, 4Eh, 4Eh db 48h, 48h, 48h, 48h, 48h, 48h, 48h, 48h, 4Bh ; Left. db 48h, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Eh db 48h, 4Bh, 4Bh, 4Bh, 0h, 4Bh, 4Bh, 4Bh, 4Eh db 48h, 4Bh, 4Bh, 0h, 0h, 0h, 0h, 4Bh, 4Eh db 48h, 4Bh, 0h, 0h, 0h, 0h, 0h, 4Bh, 4Eh db 48h, 4Bh, 4Bh, 0h, 0h, 0h, 0h, 4Bh, 4Eh db 48h, 4Bh, 4Bh, 4Bh, 0h, 4Bh, 4Bh, 4Bh, 4Eh db 48h, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Eh db 4Bh, 4Eh, 4Eh, 4Eh, 4Eh, 4Eh, 4Eh, 4Eh, 4Eh db 48h, 48h, 48h, 48h, 48h, 48h, 48h, 48h, 4Bh ; Right. db 48h, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Eh db 48h, 4Bh, 4Bh, 4Bh, 0h, 4Bh, 4Bh, 4Bh, 4Eh db 48h, 4Bh, 0h, 0h, 0h, 0h, 4Bh, 4Bh, 4Eh db 48h, 4Bh, 0h, 0h, 0h, 0h, 0h, 4Bh, 4Eh db 48h, 4Bh, 0h, 0h, 0h, 0h, 4Bh, 4Bh, 4Eh db 48h, 4Bh, 4Bh, 4Bh, 0h, 4Bh, 4Bh, 4Bh, 4Eh db 48h, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Eh db 4Bh, 4Eh, 4Eh, 4Eh, 4Eh, 4Eh, 4Eh, 4Eh, 4Eh db 48h, 48h, 48h, 48h, 48h, 48h, 48h, 48h, 4Bh ; Up. db 48h, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Eh db 48h, 4Bh, 4Bh, 4Bh, 0h, 4Bh, 4Bh, 4Bh, 4Eh db 48h, 4Bh, 4Bh, 0h, 0h, 0h, 4Bh, 4Bh, 4Eh db 48h, 4Bh, 0h, 0h, 0h, 0h, 0h, 4Bh, 4Eh db 48h, 4Bh, 4Bh, 0h, 0h, 0h, 4Bh, 4Bh, 4Eh db 48h, 4Bh, 4Bh, 0h, 0h, 0h, 4Bh, 4Bh, 4Eh db 48h, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Eh db 4Bh, 4Eh, 4Eh, 4Eh, 4Eh, 4Eh, 4Eh, 4Eh, 4Eh db 48h, 48h, 48h, 48h, 48h, 48h, 48h, 48h, 4Bh ; Down. db 48h, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Eh db 48h, 4Bh, 4Bh, 0h, 0h, 0h, 4Bh, 4Bh, 4Eh db 48h, 4Bh, 4Bh, 0h, 0h, 0h, 4Bh, 4Bh, 4Eh db 48h, 4Bh, 0h, 0h, 0h, 0h, 0h, 4Bh, 4Eh db 48h, 4Bh, 4Bh, 0h, 0h, 0h, 4Bh, 4Bh, 4Eh db 48h, 4Bh, 4Bh, 4Bh, 0h, 4Bh, 4Bh, 4Bh, 4Eh db 48h, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Eh db 4Bh, 4Eh, 4Eh, 4Eh, 4Eh, 4Eh, 4Eh, 4Eh, 4Eh db 48h, 48h, 48h, 48h, 48h, 48h, 48h, 48h, 4Bh ; Resize. db 48h, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Eh db 48h, 4Bh, 0h, 0h, 0h, 4Bh, 0h, 4Bh, 4Eh db 48h, 4Bh, 0h, 4Bh, 0h, 4Bh, 4Bh, 4Bh, 4Eh db 48h, 4Bh, 0h, 0h, 0h, 4Bh, 0h, 4Bh, 4Eh db 48h, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Eh db 48h, 4Bh, 0h, 4Bh, 0h, 4Bh, 0h, 4Bh, 4Eh db 48h, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Eh db 4Bh, 4Eh, 4Eh, 4Eh, 4Eh, 4Eh, 4Eh, 4Eh, 4Eh db 48h, 48h, 48h, 48h, 48h, 48h, 48h, 48h, 4Bh ; Blank. db 48h, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Eh db 48h, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Eh db 48h, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Eh db 48h, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Eh db 48h, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Eh db 48h, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Eh db 48h, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Bh, 4Eh db 4Bh, 4Eh, 4Eh, 4Eh, 4Eh, 4Eh, 4Eh, 4Eh, 4Eh ; ES:DI - offset, AX - button number. edit_button: push eax push cx push bx push si push di add di, 321 mov bx, 81 mul bx mov si, ax mov cx, 9 edit_button_loop: mov eax, dword ptr _edit_buttons[si] mov es: [di], eax mov eax, dword ptr _edit_buttons[si+4] mov es: [di+4], eax mov al, byte ptr _edit_buttons[si+8] mov es: [di+8], al add si, 9 add di, 320 loop edit_button_loop pop di mov cx, 11 mov dx, 11 mov al, 0 call edit_frame pop si pop bx pop cx pop eax ret ;---- Edit_HBar. ; ES:DI - offset, CX - width. _edit_hbar_width dw 0000h edit_hbar: push ax push bx push cx push dx push di mov _edit_hbar_width, cx mov dx, 11 mov al, 0 call edit_frame add di, 321 sub cx, 2 mov dl, 9 mov al, 8 call edit_rect mov dx, 1 dec cx mov al, 15 call edit_rect mov cx, 1 mov dx, 8 call edit_rect add di, _edit_hbar_width add di, 317 mov al, 7 call edit_rect mov cx, _edit_hbar_width sub cx, 3 sub di, cx add di, 1+320*7 mov dx, 1 call edit_rect pop di pop dx pop cx pop bx pop ax ret ;---- Edit_VBar. edit_vbar: ret ;---- Edit_Back. ; Draw tiled background. edit_back: mov ds, _intro_seg mov si, 2 xor di, di mov dx, 100 edit_yback: push si push di mov eax, [si] mov es: [di+300], eax mov es: [di+32300], eax mov eax, [si+4] mov es: [di+304], eax mov es: [di+32304], eax mov eax, [si+8] mov es: [di+308], eax mov es: [di+32308], eax mov eax, [si+12] mov es: [di+312], eax mov es: [di+32312], eax mov eax, [si+16] mov es: [di+316], eax mov es: [di+32316], eax mov cx, 25 edit_xback: mov eax, [si] mov es: [di], eax mov es: [di+100], eax mov es: [di+200], eax mov es: [di+32000], eax mov es: [di+32100], eax mov es: [di+32200], eax mov [si-1], eax add si, 4 add di, 4 loop edit_xback pop di pop si mov al, [si-1] mov [si+99], al add di, 320 add si, 102 dec dx jnz edit_yback ret ;---- Edit_Box. ; Draws a raised box. ; CX - Width of box. ; DX - Height of box. ; ES:DI - Destination. _edit_box_offs dw 0000h _edit_box_w dw 0000h _edit_box_h dw 0000h edit_box: push ax push cx push dx push di mov _edit_box_offs, di mov _edit_box_w, cx mov _edit_box_h, dx mov al, 0 call edit_frame add di, 321 sub cx, 2 sub dx, 2 mov al, 8 call edit_rect dec cx mov dx, 1 mov al, 15 call edit_rect mov cx, 1 mov dx, _edit_box_h sub dx, 3 call edit_rect mov ax, 320 mul _edit_box_h sub ax, 319 mov di, _edit_box_offs add di, ax mov cx, _edit_box_w mov dx, 1 sub di, 319 sub cx, 3 mov al, 7 call edit_rect mov di, _edit_box_offs mov cx, 1 add di, _edit_box_w mov dx, _edit_box_h add di, 638 sub dx, 3 call edit_rect pop di pop dx pop cx pop ax ret ;---- Edit_Frame. ; ES:DI - Offset, CX*DX size, AL colour. edit_frame: push ax push bx push cx push dx push di mov bx, cx dec bx edit_frame_vertloop: mov es: [di], al mov es: [di+bx], al add di, 320 dec dx jnz edit_frame_vertloop pop di pop dx push dx push di push ax mov bx, dx mov ax, 320 dec bx mul bx mov bx, ax pop ax edit_frame_horizloop: mov es: [di], al mov es: [di+bx], al inc di loop edit_frame_horizloop pop di pop dx pop cx pop bx pop ax ret ;---- Edit_Rect. ; ES:DI - Offset, rectangle CX by DX pixels. AL - colour. edit_rect: cmp dx, 0 je edit_rect_end jcxz edit_rect_end push eax push cx push dx push di mov ah, al ror eax, 8 mov ah, al ror eax, 8 mov ah, al edit_rect_loop: push cx push di shr cx, 1 jnc edit_rect_nobyte stosb jcxz edit_rect_next edit_rect_nobyte: shr cx, 1 jnc edit_rect_noword stosw jcxz edit_rect_next edit_rect_noword: rep stosd edit_rect_next: ; rep stosb pop di pop cx add di, 320 dec dx jnz edit_rect_loop pop di pop dx pop cx pop eax edit_rect_end: ret ;---- INTRO -------------------------------------------------------------------; ; Background bitmap (4 colours). _intro_back db 230, 153, 123, 119, 190, 122, 106, 86, 150, 157, 167, 254, 107, 86, 191, 239, 103, 151, 153, 101, 166, 102, 87, 106, 90 db 234, 254, 187, 119, 175, 122, 254, 251, 238, 158, 166, 90, 245, 187, 86, 150, 166, 247, 238, 106, 170, 122, 231, 170, 154 db 170, 85, 85, 102, 102, 117, 94, 149, 217, 221, 238, 255, 107, 85, 187, 255, 183, 167, 153, 165, 255, 127, 167, 169, 174 db 234, 170, 170, 251, 191, 127, 175, 234, 237, 157, 153, 85, 181, 187, 119, 103, 102, 231, 221, 169, 87, 101, 231, 234, 222 db 250, 186, 170, 103, 102, 102, 103, 171, 221, 173, 251, 191, 107, 103, 118, 119, 251, 235, 221, 249, 183, 123, 247, 250, 238 db 165, 101, 170, 102, 118, 102, 102, 230, 222, 93, 102, 85, 183, 183, 106, 119, 86, 213, 221, 121, 101, 103, 167, 165, 153 db 169, 169, 170, 255, 123, 187, 187, 251, 238, 238, 238, 255, 103, 102, 170, 118, 255, 239, 221, 126, 251, 251, 167, 169, 157 db 234, 255, 255, 87, 117, 102, 102, 166, 153, 153, 153, 85, 230, 175, 170, 106, 86, 213, 157, 85, 102, 85, 230, 186, 154 db 234, 169, 170, 250, 122, 191, 171, 171, 221, 221, 254, 175, 167, 150, 255, 187, 239, 255, 237, 187, 255, 191, 251, 126, 171 db 234, 157, 170, 86, 105, 86, 166, 166, 222, 157, 85, 218, 231, 171, 87, 102, 151, 149, 93, 101, 86, 85, 86, 101, 183 db 235, 221, 85, 186, 186, 191, 171, 171, 218, 157, 191, 155, 165, 150, 183, 183, 251, 254, 237, 255, 255, 191, 251, 127, 119 db 230, 221, 169, 86, 122, 86, 167, 166, 234, 157, 86, 219, 191, 167, 103, 103, 87, 153, 93, 85, 85, 85, 102, 101, 119 db 234, 221, 253, 255, 191, 255, 167, 235, 170, 157, 190, 155, 85, 247, 251, 183, 247, 255, 237, 255, 255, 187, 251, 127, 103 db 235, 221, 93, 149, 106, 85, 165, 230, 173, 158, 90, 219, 191, 102, 101, 101, 103, 149, 89, 85, 85, 101, 119, 101, 166 db 251, 221, 238, 255, 170, 255, 187, 251, 238, 159, 250, 155, 101, 187, 123, 251, 251, 239, 254, 255, 191, 251, 187, 107, 234 db 86, 157, 85, 149, 106, 85, 101, 118, 85, 153, 123, 149, 122, 119, 118, 118, 102, 149, 86, 85, 86, 102, 85, 250, 191 db 251, 238, 255, 255, 170, 175, 170, 123, 239, 223, 123, 174, 191, 187, 127, 123, 119, 187, 183, 187, 187, 187, 255, 103, 150 db 150, 89, 85, 85, 85, 153, 170, 119, 151, 150, 85, 154, 86, 149, 85, 119, 118, 106, 167, 166, 107, 119, 171, 118, 167 db 246, 190, 255, 255, 191, 175, 191, 119, 235, 235, 171, 234, 250, 255, 254, 103, 171, 222, 234, 173, 86, 102, 150, 118, 166 db 170, 101, 87, 85, 101, 103, 103, 119, 151, 150, 230, 175, 105, 149, 85, 181, 170, 157, 217, 169, 187, 251, 239, 182, 170 db 170, 121, 235, 238, 123, 119, 119, 119, 235, 235, 167, 153, 238, 255, 170, 171, 170, 158, 254, 170, 87, 182, 218, 166, 186 db 170, 122, 151, 153, 182, 183, 183, 119, 151, 150, 230, 223, 154, 149, 181, 182, 189, 239, 95, 169, 230, 126, 213, 170, 186 db 170, 127, 187, 238, 103, 101, 101, 117, 235, 251, 167, 217, 237, 254, 190, 126, 94, 89, 217, 170, 182, 106, 255, 218, 171 db 170, 90, 90, 154, 246, 251, 251, 123, 150, 85, 230, 223, 157, 89, 149, 93, 175, 154, 222, 169, 126, 119, 171, 154, 169 db 170, 170, 155, 234, 119, 118, 118, 182, 175, 255, 167, 217, 221, 238, 255, 173, 90, 171, 239, 186, 158, 122, 150, 153, 154 db 169, 170, 166, 170, 118, 119, 119, 103, 149, 86, 230, 223, 238, 238, 101, 105, 158, 183, 154, 165, 170, 170, 239, 157, 170 db 154, 170, 169, 186, 119, 123, 123, 251, 171, 174, 166, 153, 85, 149, 105, 106, 238, 187, 218, 185, 105, 183, 218, 157, 175 db 170, 229, 170, 126, 119, 86, 86, 87, 166, 174, 234, 159, 238, 254, 254, 234, 90, 85, 169, 109, 171, 122, 213, 157, 235 db 174, 186, 170, 171, 119, 255, 191, 183, 167, 174, 170, 217, 218, 93, 85, 249, 233, 255, 255, 155, 231, 110, 255, 237, 171 db 234, 110, 234, 102, 117, 87, 102, 119, 251, 159, 234, 223, 173, 237, 191, 190, 233, 101, 102, 166, 167, 85, 86, 89, 170 db 90, 169, 155, 250, 127, 183, 102, 118, 86, 153, 170, 217, 221, 90, 85, 159, 254, 106, 119, 231, 251, 191, 255, 254, 171 db 149, 170, 166, 122, 85, 103, 251, 191, 255, 159, 234, 239, 238, 238, 238, 218, 85, 165, 118, 231, 85, 89, 150, 93, 170 db 233, 171, 169, 106, 255, 183, 102, 101, 85, 153, 95, 153, 153, 149, 153, 222, 254, 235, 106, 231, 253, 158, 234, 157, 91 db 254, 229, 170, 106, 86, 102, 187, 123, 255, 223, 151, 222, 157, 169, 175, 234, 149, 229, 173, 235, 157, 157, 250, 157, 150 db 111, 185, 170, 238, 254, 251, 187, 119, 87, 233, 165, 222, 153, 238, 171, 170, 233, 233, 174, 215, 221, 157, 170, 157, 234 db 90, 110, 170, 154, 89, 102, 102, 118, 166, 110, 233, 158, 233, 154, 90, 170, 233, 234, 85, 247, 238, 174, 255, 158, 254 db 150, 175, 175, 187, 251, 119, 119, 103, 250, 94, 238, 153, 174, 234, 155, 170, 169, 250, 253, 183, 170, 106, 87, 213, 175 db 165, 102, 87, 102, 102, 118, 119, 166, 191, 217, 222, 233, 170, 166, 218, 254, 174, 150, 89, 102, 85, 85, 247, 239, 170 db 169, 122, 231, 238, 238, 119, 103, 250, 171, 254, 238, 169, 170, 250, 155, 93, 153, 255, 253, 247, 255, 191, 167, 217, 105 db 170, 122, 167, 153, 153, 118, 166, 191, 170, 153, 153, 173, 170, 109, 234, 175, 234, 151, 89, 182, 170, 106, 167, 218, 93 db 170, 122, 231, 170, 170, 103, 170, 86, 85, 153, 153, 173, 170, 158, 86, 106, 234, 229, 190, 167, 153, 89, 167, 230, 173 db 254, 127, 231, 234, 170, 183, 187, 187, 186, 187, 187, 174, 106, 222, 174, 86, 234, 233, 89, 235, 221, 157, 167, 235, 93 db 94, 85, 231, 234, 169, 119, 119, 183, 126, 119, 183, 175, 170, 238, 238, 191, 250, 234, 153, 214, 157, 153, 231, 234, 173 db 222, 191, 251, 234, 254, 119, 119, 119, 105, 119, 119, 169, 181, 154, 153, 89, 106, 165, 185, 239, 237, 255, 167, 218, 93 db 222, 101, 151, 154, 85, 101, 102, 102, 106, 102, 102, 110, 121, 171, 221, 157, 250, 171, 123, 219, 93, 85, 166, 230, 173 db 239, 122, 231, 214, 253, 191, 255, 251, 239, 239, 187, 94, 122, 183, 154, 153, 171, 181, 183, 235, 221, 255, 167, 235, 93 db 170, 117, 231, 165, 173, 90, 171, 181, 214, 214, 101, 154, 106, 102, 187, 187, 231, 190, 123, 85, 157, 85, 229, 234, 173 db 106, 121, 167, 233, 174, 150, 107, 185, 229, 165, 169, 254, 255, 186, 102, 102, 167, 101, 166, 255, 222, 255, 255, 238, 94 db 122, 186, 167, 238, 173, 165, 91, 122, 169, 169, 170, 90, 85, 105, 255, 174, 246, 127, 103, 85, 157, 85, 85, 85, 150 db 191, 106, 229, 222, 109, 169, 151, 106, 170, 170, 170, 255, 175, 171, 90, 157, 122, 85, 246, 255, 222, 255, 255, 191, 251 db 85, 169, 254, 238, 93, 170, 166, 170, 170, 170, 170, 86, 149, 246, 159, 175, 187, 255, 123, 85, 157, 85, 85, 101, 86 db 255, 175, 95, 85, 153, 170, 170, 170, 170, 170, 234, 255, 186, 106, 153, 86, 103, 149, 182, 255, 222, 255, 255, 187, 255 db 153, 153, 154, 170, 254, 175, 255, 250, 235, 235, 170, 85, 105, 255, 238, 191, 251, 175, 101, 85, 221, 153, 153, 166, 153 db 221, 237, 159, 170, 174, 150, 107, 185, 229, 165, 249, 175, 171, 87, 89, 106, 87, 217, 238, 255, 223, 221, 221, 230, 221 db 217, 89, 217, 238, 174, 165, 91, 122, 169, 169, 106, 149, 246, 187, 170, 90, 230, 218, 221, 85, 213, 221, 157, 166, 153 db 238, 190, 158, 153, 109, 169, 151, 106, 170, 170, 254, 186, 106, 86, 238, 238, 238, 249, 238, 237, 238, 221, 153, 251, 238 db 157, 165, 238, 255, 94, 170, 166, 170, 170, 170, 90, 105, 250, 187, 154, 89, 217, 126, 149, 221, 217, 157, 185, 150, 153 db 238, 123, 105, 85, 153, 170, 170, 170, 170, 170, 175, 235, 126, 101, 170, 254, 238, 101, 255, 157, 233, 153, 190, 255, 237 db 89, 181, 123, 170, 254, 171, 191, 250, 234, 170, 150, 230, 105, 186, 191, 94, 153, 121, 150, 153, 238, 254, 111, 149, 217 db 190, 123, 117, 238, 174, 165, 91, 122, 169, 233, 186, 238, 125, 122, 101, 222, 255, 191, 255, 233, 158, 85, 169, 255, 237 db 85, 182, 126, 154, 109, 169, 151, 106, 170, 170, 105, 222, 169, 127, 186, 223, 85, 85, 149, 237, 221, 170, 106, 149, 157 db 187, 123, 169, 255, 94, 170, 166, 170, 170, 170, 235, 222, 105, 85, 106, 213, 249, 251, 255, 153, 217, 170, 106, 234, 237 db 101, 118, 191, 85, 153, 170, 170, 170, 170, 170, 230, 221, 169, 171, 255, 255, 121, 122, 149, 254, 255, 250, 255, 239, 89 db 239, 126, 150, 233, 254, 170, 175, 186, 170, 186, 254, 238, 170, 166, 154, 153, 121, 86, 170, 102, 150, 86, 85, 217, 254 db 217, 93, 254, 169, 109, 169, 151, 106, 170, 106, 90, 85, 229, 175, 222, 221, 185, 175, 171, 118, 231, 229, 191, 223, 85 db 222, 157, 154, 254, 94, 170, 166, 170, 170, 171, 174, 191, 170, 149, 154, 153, 121, 213, 187, 106, 167, 233, 85, 218, 249 db 157, 157, 250, 86, 153, 170, 170, 170, 170, 230, 239, 87, 250, 191, 254, 255, 186, 171, 102, 170, 231, 255, 238, 223, 125 db 222, 154, 106, 166, 190, 170, 171, 187, 170, 170, 85, 166, 106, 85, 94, 150, 121, 165, 182, 255, 231, 149, 149, 217, 89 db 223, 233, 234, 251, 94, 170, 230, 119, 171, 234, 255, 187, 254, 255, 238, 231, 185, 170, 106, 85, 229, 237, 250, 223, 254 db 149, 233, 170, 89, 153, 170, 250, 118, 183, 170, 85, 86, 90, 85, 89, 230, 121, 169, 250, 255, 255, 153, 101, 149, 85 db 238, 238, 170, 239, 174, 170, 190, 186, 187, 239, 255, 171, 255, 255, 187, 251, 185, 191, 123, 89, 150, 237, 251, 239, 238 db 153, 217, 150, 86, 153, 171, 170, 102, 102, 153, 86, 150, 86, 85, 101, 86, 105, 85, 123, 158, 231, 217, 101, 153, 153 db 255, 234, 165, 254, 170, 183, 170, 118, 103, 222, 167, 166, 250, 191, 170, 250, 191, 191, 86, 154, 230, 254, 238, 239, 255 db 153, 169, 169, 90, 185, 103, 171, 118, 166, 158, 182, 250, 123, 101, 191, 106, 101, 87, 254, 255, 239, 153, 149, 89, 86 db 218, 169, 171, 250, 106, 183, 182, 102, 238, 239, 123, 123, 118, 122, 103, 187, 187, 251, 174, 89, 217, 221, 190, 159, 246 db 170, 233, 171, 106, 185, 123, 107, 186, 158, 85, 102, 182, 119, 122, 123, 102, 118, 85, 153, 217, 218, 157, 85, 150, 190 db 166, 170, 150, 234, 122, 102, 183, 191, 239, 191, 103, 107, 181, 127, 86, 255, 127, 251, 255, 249, 253, 237, 255, 255, 175 db 165, 234, 170, 170, 121, 126, 119, 86, 102, 102, 167, 167, 106, 85, 170, 87, 85, 103, 85, 173, 89, 153, 153, 153, 165 db 169, 234, 158, 171, 191, 94, 119, 171, 119, 119, 166, 166, 250, 191, 170, 247, 255, 183, 187, 219, 189, 239, 217, 217, 105 db 234, 171, 149, 166, 150, 237, 119, 171, 102, 102, 170, 235, 123, 101, 175, 103, 85, 118, 119, 231, 109, 155, 173, 173, 249 db 250, 170, 171, 171, 235, 93, 117, 171, 186, 170, 171, 230, 118, 122, 155, 247, 191, 103, 102, 234, 89, 214, 222, 222, 190 db 182, 218, 234, 234, 250, 173, 187, 171, 190, 238, 235, 175, 181, 127, 150, 102, 101, 247, 191, 234, 253, 255, 238, 238, 174 db 165, 214, 221, 237, 93, 93, 102, 106, 105, 153, 150, 149, 106, 85, 170, 187, 123, 102, 85, 170, 157, 149, 149, 149, 165 db 169, 230, 221, 89, 237, 223, 170, 91, 106, 170, 166, 187, 250, 191, 170, 119, 183, 251, 187, 171, 221, 185, 186, 186, 106 db 170, 251, 222, 238, 94, 217, 173, 151, 171, 170, 170, 102, 123, 101, 251, 119, 102, 101, 101, 246, 223, 105, 102, 102, 246 db 170, 86, 149, 153, 173, 223, 157, 166, 230, 238, 191, 175, 182, 127, 102, 182, 255, 187, 187, 123, 213, 237, 238, 238, 190 db 165, 255, 255, 222, 110, 219, 157, 186, 235, 157, 85, 150, 106, 86, 174, 103, 89, 101, 118, 118, 234, 153, 153, 153, 169 db 174, 86, 149, 157, 109, 150, 237, 127, 251, 237, 191, 191, 250, 187, 175, 247, 223, 175, 123, 187, 239, 185, 187, 187, 191 db 149, 238, 238, 217, 110, 175, 90, 85, 151, 89, 101, 86, 106, 86, 90, 102, 153, 150, 119, 167, 149, 169, 170, 170, 166 db 250, 154, 221, 173, 109, 218, 170, 171, 166, 185, 123, 255, 251, 187, 222, 239, 222, 251, 187, 235, 238, 171, 153, 153, 189 db 165, 173, 218, 221, 90, 239, 238, 234, 255, 127, 123, 86, 101, 86, 158, 213, 157, 86, 149, 217, 149, 250, 255, 191, 170 db 249, 221, 234, 221, 189, 154, 153, 154, 85, 101, 103, 255, 250, 187, 154, 235, 221, 187, 174, 221, 238, 103, 89, 165, 186 db 169, 221, 173, 221, 89, 223, 157, 166, 235, 106, 118, 86, 105, 86, 191, 247, 158, 86, 154, 222, 149, 117, 222, 127, 185 db 250, 238, 238, 159, 189, 218, 153, 255, 251, 253, 127, 191, 250, 187, 86, 166, 217, 171, 191, 218, 238, 107, 154, 86, 190 db 101, 85, 85, 213, 175, 158, 173, 87, 149, 93, 85, 86, 107, 86, 238, 174, 157, 150, 86, 234, 149, 182, 170, 171, 170 db 254, 238, 238, 174, 86, 153, 239, 247, 239, 153, 171, 175, 246, 167, 223, 173, 154, 231, 255, 170, 169, 103, 171, 151, 191 db 149, 221, 221, 153, 187, 186, 90, 102, 213, 233, 171, 214, 107, 250, 219, 173, 191, 166, 89, 169, 255, 167, 182, 187, 90 db 234, 221, 157, 185, 87, 190, 218, 235, 239, 249, 170, 171, 245, 87, 218, 109, 150, 250, 239, 235, 86, 166, 122, 87, 154 db 234, 221, 153, 123, 167, 175, 170, 150, 213, 105, 86, 246, 107, 166, 218, 93, 167, 106, 102, 181, 169, 167, 122, 166, 174 db 235, 157, 185, 119, 182, 102, 245, 187, 239, 173, 167, 106, 245, 187, 154, 153, 183, 251, 187, 127, 171, 187, 127, 186, 175 _intro_block dd 013131312h, 013131313h, 013131313h, 013131313h dd 013131213h, 013131313h, 013131313h, 013131313h dd 013121313h, 013131313h, 013131313h, 013131313h dd 012131313h, 013131313h, 013131313h, 013131313h dd 013131313h, 011121211h, 012121212h, 012121112h dd 013131313h, 015151512h, 015141515h, 014151515h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161511h, 016161616h, 016161616h dd 013131313h, 016161411h, 016161616h, 016161616h dd 013131313h, 016161412h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161412h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 013131313h, 013131313h, 013131313h dd 013131313h, 013131313h, 013131313h, 013131313h dd 013131313h, 013131313h, 013131313h, 013131313h dd 013131313h, 013131313h, 013131313h, 013131313h dd 012121212h, 012111212h, 011121212h, 012121212h dd 015151414h, 015151515h, 015151515h, 015151414h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 013131313h, 013131313h, 013131313h, 016131313h dd 013131313h, 013131313h, 013131313h, 019161313h dd 013131313h, 013131313h, 013131313h, 019191613h dd 013131313h, 013131313h, 013131313h, 019191916h dd 012121212h, 012121111h, 015121212h, 019191919h dd 015151514h, 014151515h, 018151414h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 017151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018141616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 017151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 013131313h, 013131313h, 013131313h, 013131313h dd 013131313h, 013131313h, 013131313h, 013131313h dd 013131313h, 013131313h, 013131313h, 013131313h dd 013131313h, 013131313h, 013131313h, 013131313h dd 011111212h, 012111212h, 012121212h, 011121112h dd 015151515h, 014151415h, 015151515h, 014151515h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 015151616h, 014141515h dd 016161616h, 016161616h, 018151616h, 018181718h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018141616h, 019191919h dd 016161616h, 016161616h, 017141616h, 019191919h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161511h, 016161616h, 016161616h dd 013131313h, 016161411h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 012121212h, 016161512h, 016161616h, 016161616h dd 015141515h, 016161515h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 015151414h, 016161515h, 016161616h, 016161616h dd 018181818h, 016161515h, 016161616h, 016161616h dd 016191919h, 016161512h, 016161616h, 016161616h dd 013161919h, 016161512h, 016161616h, 016161616h dd 013131619h, 016161511h, 016161616h, 016161616h dd 013131316h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161512h, 015141315h, 016161616h dd 013131313h, 016161512h, 018161613h, 016161616h dd 013131313h, 016161412h, 019161614h, 016161617h dd 013131313h, 016161412h, 018191815h, 016161717h dd 013131313h, 016161512h, 017171616h, 016171717h dd 013131313h, 016161512h, 017161616h, 016171717h dd 013131313h, 016161512h, 016161616h, 016161717h dd 013131313h, 016161511h, 016161616h, 016161616h dd 013131313h, 016161512h, 015141315h, 016161616h dd 013131313h, 016161412h, 018161613h, 016161616h dd 013131313h, 016161512h, 019161614h, 016161617h dd 013131313h, 016161512h, 018191815h, 016161717h dd 013131313h, 016161512h, 017171616h, 016171717h dd 013131313h, 016161512h, 017161616h, 016171717h dd 013131313h, 016161512h, 016161616h, 016161717h dd 013131313h, 016161511h, 016161616h, 016161616h dd 013131313h, 016161411h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161412h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161412h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161511h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 018141616h, 019191919h dd 016161616h, 016161616h, 018141616h, 019191919h dd 016161616h, 016161616h, 018141616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 017141616h, 019191919h dd 016161616h, 016161616h, 017151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018141616h, 019191919h dd 016161616h, 016161616h, 018141616h, 019191919h dd 016161616h, 016161616h, 017141616h, 019191919h dd 016161616h, 016161616h, 017151616h, 019191919h dd 016161616h, 016161616h, 017151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 016191919h dd 016161616h, 016161616h, 018151616h, 013161919h dd 016161616h, 016161616h, 018151616h, 013131619h dd 016161616h, 016161616h, 018151616h, 013131316h dd 016161616h, 016161616h, 015151616h, 011121212h dd 016161616h, 016161616h, 015151616h, 014151415h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 015141616h, 015141515h dd 016161616h, 016161616h, 017141616h, 018181818h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 013131313h, 013131313h, 013131313h, 013131313h dd 013131313h, 013131313h, 013131313h, 013131313h dd 013131313h, 013131313h, 013131313h, 013131313h dd 013131313h, 013131313h, 013131313h, 013131313h dd 012121211h, 011121212h, 012121211h, 012121212h dd 015151515h, 015141415h, 015151515h, 015151515h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 015151515h, 015141414h, 014151514h, 015151514h dd 018181818h, 018181717h, 017181818h, 018181818h dd 019191919h, 019191919h, 019191919h, 019191919h dd 019191919h, 019191919h, 019191919h, 019191919h dd 019191919h, 019191919h, 019191919h, 019191919h dd 019191919h, 019191919h, 019191919h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 013151616h, 016161615h, 018151616h, 019191919h dd 015131616h, 016161816h, 018151616h, 019191919h dd 016151616h, 016171917h, 018141616h, 019191919h dd 018161616h, 017171819h, 018141616h, 019191919h dd 016161616h, 017171717h, 017151617h, 019191919h dd 016161616h, 017171716h, 017151617h, 019191919h dd 016161616h, 017171616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 013151616h, 016161615h, 018151616h, 019191919h dd 015131616h, 016161816h, 018151616h, 019191919h dd 016151616h, 016171917h, 017151616h, 019191919h dd 018161616h, 017171819h, 017151616h, 019191919h dd 016161616h, 017171717h, 017141617h, 019191919h dd 016161616h, 017171716h, 018141617h, 019191919h dd 016161616h, 017171616h, 018151616h, 019191919h dd 013131313h, 016161511h, 016161616h, 016161616h dd 013131313h, 016161511h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161412h, 016161616h, 016161616h dd 013131313h, 016161412h, 016161616h, 016161616h dd 013131313h, 016161412h, 016161616h, 016161616h dd 013131313h, 016161412h, 016161616h, 016161616h dd 013131313h, 014151511h, 015151514h, 015151515h dd 012131313h, 018181815h, 018181818h, 017171818h dd 016121313h, 019191918h, 019191919h, 019191919h dd 018161313h, 019191919h, 019191919h, 019191919h dd 019191613h, 019191919h, 019191919h, 019191919h dd 019191816h, 019191919h, 019191919h, 019191919h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 015141414h, 015151515h, 014151515h, 015151514h dd 018181817h, 018181818h, 018181817h, 018171818h dd 019191919h, 019191919h, 019191919h, 019191919h dd 019191919h, 019191919h, 019191919h, 019191919h dd 019191919h, 019191919h, 019191919h, 019191919h dd 019191919h, 019191919h, 019191919h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 015151515h, 014151515h, 018141515h, 019191919h dd 018181818h, 018181818h, 017171818h, 019191919h dd 019191919h, 019191919h, 019191919h, 019191919h dd 019191919h, 019191919h, 019191919h, 019191919h dd 019191919h, 019191919h, 019191919h, 019191919h dd 019191919h, 019191919h, 019191919h, 019191919h dd 016161616h, 016161616h, 017141616h, 016191919h dd 016161616h, 016161616h, 017151616h, 013161919h dd 016161616h, 016161616h, 018151616h, 013131619h dd 016161616h, 016161616h, 018151616h, 013131316h dd 016161616h, 016161616h, 015151616h, 011111212h dd 016161616h, 016161616h, 015151616h, 014151515h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 015141515h, 014151515h, 014141414h, 015151515h dd 017171818h, 017171818h, 018181817h, 018181718h dd 019191919h, 019191919h, 019191919h, 019191919h dd 019191919h, 019191919h, 019191919h, 019191919h dd 019191919h, 019191919h, 019191919h, 019191919h dd 019191919h, 019191919h, 019191919h, 019191919h dd 013131313h, 013131313h, 013131313h, 016131313h dd 013131313h, 013131313h, 013131313h, 019161313h dd 013131313h, 013131313h, 013131313h, 019191613h dd 013131313h, 013131313h, 013131313h, 019191916h dd 012121212h, 011121212h, 015121212h, 019191919h dd 015151414h, 015141515h, 018151515h, 019191919h dd 016161616h, 016161616h, 018141616h, 019191919h dd 016161616h, 016161616h, 017141616h, 019191919h dd 016161616h, 016161616h, 017151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 015151515h, 015151515h, 018141414h, 019191919h dd 018181818h, 018181817h, 017171717h, 019191919h dd 019191919h, 019191919h, 019191919h, 019191919h dd 019191919h, 019191919h, 019191919h, 019191919h dd 019191919h, 019191919h, 019191919h, 019191919h dd 019191919h, 019191919h, 019191919h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 017181616h, 017171717h, 019161717h, 01A1A1A1Ah dd 016171616h, 016161616h, 018151616h, 019191919h dd 016171616h, 016161616h, 018151616h, 019191919h dd 016171616h, 015151416h, 017141515h, 018181818h dd 016171616h, 016161516h, 018151616h, 019191919h dd 016171616h, 016161516h, 018151616h, 019191919h dd 016171616h, 016161516h, 018151616h, 019191919h dd 016171616h, 016161516h, 018151616h, 01919191Ah dd 015161515h, 014151415h, 018151514h, 01919191Ah dd 018191818h, 018181718h, 01A181718h, 0191A191Bh dd 0191A1919h, 019191819h, 019191919h, 0191A1A1Ah dd 0191A1919h, 019191819h, 019191919h, 0191A1A19h dd 0191A1919h, 019191819h, 019191919h, 01A1A1919h dd 0191A1919h, 019191819h, 019191919h, 01A1A1A19h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 01A000000h dd 00h, 00h, 00h, 013151A00h dd 00h, 00h, 00h, 013131318h dd 00h, 00h, 016000000h, 013131313h dd 00h, 00h, 013151A00h, 013131313h dd 00h, 00h, 01213151Ah, 013131313h dd 00h, 01A000000h, 012121316h, 014131312h dd 00h, 0151A0000h, 012111112h, 016151312h dd 00h, 013150000h, 012111012h, 016161513h dd 00h, 012131600h, 013121210h, 016161615h dd 00h, 010121318h, 015131211h, 016161616h dd 01A000000h, 011111213h, 016151312h, 017161616h dd 015000000h, 012121213h, 016161513h, 017161716h dd 0131A0000h, 013131313h, 016161514h, 017171616h dd 00h, 015171A00h, 013131314h, 013131313h dd 015171A00h, 013131314h, 013131313h, 013131313h dd 013131314h, 013131313h, 013131313h, 013131313h dd 013131313h, 013131313h, 013131313h, 013131313h dd 013131313h, 013131313h, 012121212h, 012121211h dd 013131313h, 015141212h, 014151515h, 015151514h dd 014121213h, 016161515h, 016161616h, 016161616h dd 016151412h, 016161616h, 016161616h, 016161616h dd 016161615h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 015151616h dd 016161616h, 016161616h, 016161616h, 018171516h dd 016161616h, 016161616h, 016161616h, 019191815h dd 016161616h, 016161616h, 015161616h, 019191917h dd 016161618h, 016161616h, 016161616h, 019191918h dd 013131313h, 013131313h, 013131313h, 013131313h dd 013131313h, 013131313h, 013131313h, 013131313h dd 013131313h, 013131313h, 013131313h, 013131313h dd 013131313h, 013131313h, 013131313h, 013131313h dd 011111212h, 012121211h, 012121212h, 011121212h dd 015141414h, 015151515h, 015151515h, 015151415h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 015151616h, 015151515h, 016151515h, 016161616h dd 018181817h, 018181818h, 017171818h, 016151516h dd 019191919h, 019191919h, 019191919h, 015171819h dd 019191919h, 019191919h, 019191919h, 017181819h dd 019191919h, 019191919h, 019191919h, 017171818h dd 019191919h, 019191919h, 018191919h, 016171718h dd 013131313h, 013131313h, 013131313h, 013131313h dd 013131313h, 013131313h, 013131313h, 013131313h dd 013131313h, 013131313h, 013131313h, 013131313h dd 013131313h, 013131313h, 013131313h, 013131313h dd 012121212h, 012121212h, 012121212h, 012121112h dd 015151515h, 014141515h, 015151515h, 015151515h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 015151515h, 015151515h, 015151515h, 016161616h dd 018181818h, 018181818h, 017171818h, 016161515h dd 019191919h, 019191919h, 019191919h, 015161718h dd 019191919h, 019191919h, 019191919h, 016181819h dd 019191919h, 019191919h, 019191919h, 017171818h dd 019191919h, 019191919h, 018191919h, 016171718h dd 013131313h, 014131313h, 01A1715h, 00h dd 013131313h, 013131313h, 014131313h, 01A1715h dd 013131313h, 013131313h, 013131313h, 014131313h dd 013131313h, 013131313h, 013131313h, 013131313h dd 011121212h, 012121212h, 013131312h, 013131313h dd 015141415h, 015151514h, 012121315h, 013131313h dd 016161616h, 016161616h, 014161616h, 013131313h dd 016161616h, 016161616h, 016161616h, 012141515h dd 016161616h, 016161616h, 016161616h, 015151616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161615h, 016161616h, 016161616h, 016161616h dd 016161515h, 016161616h, 016161617h, 016161616h dd 016151416h, 016161616h, 016161516h, 016161616h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 01Ah, 00h, 00h, 00h dd 01A1513h, 00h, 00h, 00h dd 018131313h, 00h, 00h, 00h dd 014131313h, 016h, 00h, 00h dd 014141313h, 01A1514h, 00h, 00h dd 014141413h, 01A151515h, 00h, 00h dd 015141313h, 016161515h, 01Ah, 00h dd 015151415h, 016161615h, 01A17h, 00h dd 015151616h, 017161616h, 01A1717h, 00h dd 015161616h, 017171616h, 0181817h, 00h dd 016161616h, 017171715h, 019181818h, 00h dd 016161616h, 018171516h, 019191818h, 01Ah dd 016161616h, 018161616h, 019191918h, 019h dd 016161616h, 017151616h, 019191919h, 01A19h dd 013140000h, 012131313h, 016161615h, 019181616h dd 013131A00h, 015131313h, 016161616h, 015161716h dd 013131700h, 015121313h, 017161616h, 016161616h dd 013131500h, 016141313h, 016161616h, 016161615h dd 013131400h, 016151213h, 016161616h, 016161616h dd 01313131Ah, 016151213h, 016161616h, 016161616h dd 013131317h, 016161413h, 016161616h, 016161616h dd 013131315h, 016161512h, 016161616h, 016161616h dd 013131314h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 016161519h, 016161616h, 017151616h, 019191919h dd 015151417h, 016161616h, 018141616h, 019191919h dd 016161515h, 016161616h, 018151616h, 019191919h dd 016161615h, 016161616h, 018141616h, 019191919h dd 016161616h, 016161616h, 018141616h, 019191919h dd 016161616h, 016161616h, 017151616h, 019191919h dd 016161616h, 016161616h, 017151616h, 019191919h dd 016161616h, 016161616h, 017151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 017141616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 017151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 01A19h, 00h, 0181A0000h, 016161717h dd 01Ah, 00h, 00h, 016161619h dd 00h, 00h, 00h, 015161900h dd 00h, 00h, 00h, 015180000h dd 00h, 00h, 00h, 015000000h dd 00h, 00h, 00h, 018000000h dd 00h, 00h, 00h, 01A000000h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 0181A0000h, 016161717h dd 00h, 00h, 00h, 016161619h dd 00h, 00h, 00h, 015161900h dd 00h, 00h, 00h, 015180000h dd 00h, 00h, 00h, 015000000h dd 00h, 00h, 00h, 018000000h dd 00h, 00h, 00h, 01A000000h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 015131516h, 016161616h, 016161616h, 016161616h dd 014141515h, 016161616h, 016161616h, 016161616h dd 013141415h, 016161615h, 016161616h, 016161616h dd 013131414h, 016161614h, 016161616h, 016161616h dd 013131314h, 016161613h, 016161616h, 016161616h dd 013131313h, 016161612h, 016161616h, 016161616h dd 013131313h, 016161613h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161412h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 017161616h dd 013131313h, 016161511h, 016161616h, 016161616h dd 013131313h, 016161510h, 016161616h, 016161616h dd 013131313h, 016161511h, 016161616h, 016161616h dd 016161616h, 015161616h, 019191918h, 01919h dd 016161616h, 016161616h, 019191916h, 01A1919h dd 016161616h, 016161616h, 019191815h, 01A1919h dd 016161616h, 016161616h, 019191616h, 0191919h dd 016161616h, 016161616h, 019191516h, 0191919h dd 016161616h, 016161616h, 019181516h, 01A191919h dd 016161616h, 016161616h, 019171616h, 01A191919h dd 016161616h, 016161616h, 019171616h, 01A191919h dd 016161616h, 016161616h, 019161616h, 019191919h dd 016161616h, 016161616h, 019151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161617h, 016161717h, 018151616h, 019191919h dd 016161718h, 016161516h, 017151616h, 019191919h dd 016151515h, 016161616h, 018141616h, 019191919h dd 016161616h, 016161616h, 018141616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 01A000000h dd 00h, 00h, 00h, 018000000h dd 00h, 00h, 00h, 015000000h dd 00h, 00h, 00h, 014190000h dd 00h, 00h, 00h, 013141A00h dd 00h, 00h, 00h, 013131419h dd 00h, 00h, 015181A00h, 013131313h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161512h, 015171716h, 016161616h dd 013131313h, 017161512h, 015141616h, 016161616h dd 013131313h, 016161512h, 016161615h, 016161616h dd 013131313h, 015161512h, 016161616h, 016161616h dd 014131313h, 016161513h, 016161616h, 016161617h dd 013131315h, 016161411h, 016161616h, 016161516h dd 014131313h, 016161513h, 016161616h, 016161616h dd 012111313h, 018171713h, 016151518h, 016161616h dd 012131313h, 015151514h, 017181816h, 016161717h dd 012131313h, 016161615h, 015151515h, 015151415h dd 014121313h, 016161616h, 016161616h, 016161515h dd 015121313h, 016161616h, 016161616h, 016161616h dd 016141313h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018161616h, 01A191919h dd 016161616h, 016161616h, 019171616h, 01A191919h dd 016161616h, 016161616h, 019181616h, 01A191919h dd 016161616h, 016161616h, 019181516h, 0191919h dd 016161616h, 016161616h, 019191716h, 0191919h dd 016161616h, 016161616h, 019191815h, 01A1919h dd 016161616h, 016161616h, 019191917h, 01919h dd 016161616h, 015161616h, 019191918h, 01919h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 01A000000h dd 00h, 00h, 00h, 018000000h dd 00h, 00h, 00h, 015000000h dd 00h, 00h, 00h, 013190000h dd 00h, 00h, 00h, 013131A00h dd 00h, 00h, 00h, 013131319h dd 00h, 00h, 015181A00h, 013131313h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161412h, 016161616h, 016161616h dd 013131313h, 016161511h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161613h, 016161616h, 016161616h dd 012131313h, 016161614h, 016161616h, 016161616h dd 012131313h, 016161615h, 016161616h, 016161616h dd 014121313h, 016161616h, 016161616h, 016161616h dd 015101313h, 016161616h, 016161616h, 016161616h dd 016141313h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 017151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018141616h, 019191919h dd 016161616h, 016161616h, 018141616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 019171516h, 019191919h dd 016161616h, 016161616h, 019171516h, 019191919h dd 016161616h, 016161616h, 019181516h, 01A191919h dd 016161616h, 016161616h, 019191516h, 01A191919h dd 016161616h, 016161616h, 019191616h, 0191919h dd 016161616h, 016161616h, 019191715h, 0191919h dd 016171817h, 016161616h, 019191915h, 01919h dd 015161516h, 016171617h, 0191A1917h, 01919h dd 013131313h, 013131313h, 013131313h, 013131313h dd 013131313h, 013131313h, 013131313h, 012131313h dd 013131313h, 013131313h, 013131313h, 014121213h dd 013131313h, 013131313h, 012121313h, 016151412h dd 012121212h, 012121212h, 015141312h, 016161615h dd 015151515h, 015151515h, 016161615h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 015151515h, 015151515h, 015151515h, 015151515h dd 018181818h, 018181818h, 018181818h, 018181818h dd 019191919h, 019191919h, 019191919h, 019191919h dd 019191919h, 019191919h, 019191919h, 019191919h dd 019191919h, 019191919h, 019191919h, 019191919h dd 019191919h, 019191919h, 019191919h, 019191919h dd 016151212h, 016161616h, 016161616h, 016161616h dd 016161513h, 016161616h, 016161616h, 016161616h dd 016161615h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 015161616h dd 016161616h, 016161616h, 016161616h, 018171516h dd 016161616h, 016161616h, 016151616h, 019191817h dd 015151515h, 015151515h, 019191817h, 019191919h dd 018181818h, 019191918h, 019191919h, 019191919h dd 019191919h, 019191919h, 019191919h, 019191919h dd 019191919h, 019191919h, 019191919h, 019191919h dd 019191919h, 019191919h, 019191919h, 01A19h dd 019191919h, 019191919h, 01A1A1Ah, 00h dd 016161616h, 017161616h, 019191919h, 01A19h dd 016161616h, 018161616h, 019191919h, 019h dd 016161616h, 019181516h, 019191919h, 00h dd 016161616h, 019191815h, 01A191919h, 00h dd 015161616h, 019191918h, 0191919h, 00h dd 018151616h, 019191919h, 01919h, 00h dd 019181616h, 019191919h, 019h, 00h dd 019191818h, 019191919h, 00h, 00h dd 019191919h, 0191919h, 00h, 00h dd 019191919h, 01919h, 00h, 00h dd 019191919h, 019h, 00h, 00h dd 01A191919h, 00h, 00h, 00h dd 01919h, 00h, 00h, 00h dd 01Ah, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 013131313h, 013131313h, 013131313h, 013131313h dd 013131313h, 013131313h, 013131313h, 013131313h dd 013131313h, 013131313h, 013131313h, 013121313h dd 013131313h, 013131313h, 013131313h, 016151312h dd 012121212h, 012121212h, 014131212h, 016161615h dd 015151515h, 015151515h, 016161615h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 014141415h, 015151515h, 015151515h, 016161615h dd 017181818h, 018181717h, 017171818h, 016151515h dd 019191919h, 019191919h, 019191919h, 015161819h dd 019191919h, 019191919h, 019191919h, 016181819h dd 019191919h, 019191919h, 019191919h, 017171818h dd 019191919h, 019191919h, 018191919h, 016171718h dd 016151213h, 016161616h, 016161616h, 016161616h dd 016161412h, 016161616h, 016161616h, 016161616h dd 016161615h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 015161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 016161616h, 016161616h dd 016161615h, 016161616h, 016161616h, 016161616h dd 016161516h, 016161616h, 016161616h, 016161616h dd 016151516h, 016161616h, 016161616h, 016161616h dd 015161616h, 017161615h, 01A1A1A1Ah, 01Ah dd 016161616h, 017141616h, 01A191818h, 01Ah dd 016161616h, 019181516h, 018181819h, 00h dd 016161616h, 019191715h, 01A181919h, 00h dd 015161616h, 019191918h, 0191919h, 00h dd 018151616h, 019191919h, 01919h, 00h dd 019181516h, 019191919h, 019h, 00h dd 019191815h, 019191919h, 00h, 00h dd 019191715h, 019191919h, 00h, 00h dd 019181516h, 019191919h, 019h, 00h dd 018151616h, 019191919h, 01919h, 00h dd 015161616h, 019191918h, 0191919h, 00h dd 016161616h, 019191815h, 01A191919h, 00h dd 016161616h, 019181516h, 019191919h, 00h dd 016161616h, 018151616h, 019191919h, 019h dd 016161616h, 016151616h, 019191918h, 019h dd 016161616h, 015161616h, 019191918h, 013161919h dd 016161616h, 016161616h, 019191917h, 013131619h dd 016161616h, 017161616h, 019191816h, 013131316h dd 016161616h, 016161616h, 016181717h, 013131313h dd 016161616h, 017161616h, 012151517h, 012101112h dd 016161616h, 017171616h, 015151515h, 015151515h dd 016161616h, 015171816h, 016151615h, 016161616h dd 016161616h, 016141618h, 016161616h, 016161616h dd 017161616h, 016161415h, 016161616h, 016161616h dd 015161616h, 016161616h, 016161616h, 016161616h dd 016161616h, 016161616h, 015151616h, 014151515h dd 016161616h, 016161616h, 018151616h, 018181818h dd 016161616h, 016161616h, 018141616h, 019191919h dd 016161616h, 016161616h, 017141616h, 019191919h dd 016161616h, 016161616h, 017151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 013131313h, 016161512h, 016151616h, 016161616h dd 013131313h, 016161412h, 016141616h, 016161616h dd 013131313h, 016161412h, 016121716h, 016161616h dd 013131313h, 016161412h, 016141616h, 016161616h dd 013131313h, 016161412h, 016151716h, 017161616h dd 013131313h, 016161412h, 015141916h, 017161616h dd 013131313h, 016161411h, 015111916h, 016161616h dd 013131313h, 016161511h, 015121716h, 017161616h dd 013131313h, 016161512h, 014131817h, 017161616h dd 013131313h, 016161512h, 015141917h, 017161616h dd 013131313h, 015151512h, 014141717h, 017151515h dd 012131313h, 018181815h, 01718191Ah, 01A181818h dd 016121313h, 019191919h, 01813191Ch, 01B191919h dd 01A161313h, 019191919h, 018191A1Bh, 01A191919h dd 0191A1613h, 01A191919h, 018171A1Bh, 01A191919h dd 019191916h, 01B1A1919h, 018171A1Fh, 01B1A1919h dd 016161617h, 015161616h, 018151616h, 016191919h dd 016161417h, 014171616h, 018151616h, 013161919h dd 016161318h, 013181616h, 018151615h, 013131619h dd 016161119h, 0141A1716h, 018151615h, 013131316h dd 016161418h, 014191716h, 015151616h, 012101212h dd 016161417h, 014181616h, 015151615h, 015151515h dd 016161218h, 010181616h, 016161614h, 016161616h dd 016151418h, 014191616h, 016161514h, 016161616h dd 016151417h, 0151A1616h, 016161614h, 016161616h dd 016151517h, 015191716h, 016161613h, 016161616h dd 015141316h, 014171615h, 015151412h, 015151415h dd 018171718h, 0191A1818h, 018181718h, 017171818h dd 01918171Ah, 0181B1919h, 019191718h, 019191919h dd 01918121Bh, 0191B1A19h, 019191717h, 019191919h dd 01917161Ah, 0191B1A1Ah, 019181719h, 019191919h dd 019181B1Fh, 01B1F1B1Ah, 018171917h, 019191919h dd 00h, 00h, 0181A0000h, 016161717h dd 00h, 00h, 00h, 016161619h dd 00h, 00h, 00h, 015161900h dd 00h, 00h, 00h, 015180000h dd 00h, 00h, 00h, 015000000h dd 00h, 00h, 00h, 018000000h dd 00h, 00h, 00h, 01A000000h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 016131516h, 016161616h, 016161616h, 016161616h dd 014141515h, 016161616h, 016161616h, 016161616h dd 013141415h, 016161615h, 016161616h, 016161616h dd 012131414h, 016161615h, 016161616h, 016161616h dd 013131314h, 016161614h, 016161616h, 016161616h dd 013131313h, 016161514h, 016161616h, 016161616h dd 013131313h, 016161513h, 016161616h, 016161616h dd 013131313h, 016161512h, 016171616h, 016161616h dd 013131313h, 016161512h, 015161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 018161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161511h, 016161616h, 016161616h dd 013131313h, 016161412h, 016161616h, 016161616h dd 013131313h, 016161412h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 013131313h, 016161512h, 016161616h, 016161616h dd 016161616h, 015161616h, 019191917h, 01919h dd 016161616h, 016161616h, 019191815h, 01919h dd 016161616h, 016161616h, 019191716h, 0191919h dd 016161616h, 016161616h, 019191516h, 0191919h dd 016161616h, 016161616h, 019181516h, 01A191919h dd 016161616h, 016161616h, 019171616h, 01A191919h dd 016161616h, 016161616h, 018161616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161617h, 016161616h, 018141616h, 019191919h dd 016161517h, 016161616h, 018141616h, 019191919h dd 016161412h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018141616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 018151616h, 019191919h dd 016161616h, 016161616h, 017141616h, 019191919h _intro_title_y dw 8320 dw 8320 dw 8640 dw 8960 dw 9280 dw 9280 dw 9600 dw 9920 dw 10240 dw 10560 dw 10560 dw 10880 dw 11200 dw 11200 dw 11520 dw 11840 dw 11840 dw 12160 dw 12480 dw 12480 dw 12800 dw 12800 dw 13120 dw 13120 dw 13440 dw 13440 dw 13760 dw 13760 dw 14080 dw 14080 dw 14080 dw 14080 dw 14400 dw 14400 dw 14400 dw 14400 dw 14400 dw 14400 dw 14400 dw 14400 dw 14400 dw 14400 dw 14400 dw 14400 dw 14400 dw 14400 dw 14400 dw 14400 dw 14080 dw 14080 dw 14080 dw 13760 dw 13760 dw 13760 dw 13440 dw 13440 dw 13120 dw 13120 dw 12800 dw 12800 dw 12480 dw 12160 dw 12160 dw 11840 dw 11520 dw 11520 dw 11200 dw 10880 dw 10880 dw 10560 dw 10240 dw 9920 dw 9920 dw 9600 dw 9280 dw 8960 dw 8640 dw 8640 dw 8320 dw 8000 dw 7680 dw 7680 dw 7360 dw 7040 dw 6720 dw 6400 dw 6400 dw 6080 dw 5760 dw 5440 dw 5440 dw 5120 dw 4800 dw 4800 dw 4480 dw 4160 dw 4160 dw 3840 dw 3520 dw 3520 dw 3200 dw 3200 dw 2880 dw 2880 dw 2560 dw 2560 dw 2560 dw 2240 dw 2240 dw 2240 dw 1920 dw 1920 dw 1920 dw 1920 dw 1920 dw 1920 dw 1920 dw 1920 dw 1920 dw 1920 dw 1920 dw 1920 dw 1920 dw 1920 dw 1920 dw 1920 dw 2240 dw 2240 dw 2240 dw 2240 dw 2560 dw 2560 dw 2880 dw 2880 dw 3200 dw 3200 dw 3520 dw 3520 dw 3840 dw 3840 dw 4160 dw 4480 dw 4480 dw 4800 dw 5120 dw 5120 dw 5440 dw 5760 dw 5760 dw 6080 dw 6400 dw 6720 dw 7040 dw 7040 dw 7360 dw 7680 dw 8000 dw -1 ; B E D L A M _intro_title db 0, 0, 0, 0, 0, 1, 4,11,11,11,22,23,24, 0, 1, 4,11,11,11,17, 0, 0, 0, 1, 4,11,11,11,22,23,24, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 1, 4,11,11,11,22,23,24, 0,19,20,21,23,24, 0, 0, 0, 0, 0, 0, 0, 0, 0 db 0, 0, 0, 0, 0, 7, 9, 0, 0, 0,28,29,30, 0, 7, 9, 0, 0, 0, 0, 0, 0, 0, 7, 9, 0, 0, 0,28,29,30, 0, 7, 9, 0, 0, 0, 0, 0, 0, 0, 7, 9, 0, 0, 0,28,29,30, 0,25,26,27,29,43,22,23,24, 0, 0, 0, 0, 0, 0 db 0, 0, 0, 0, 0, 7, 9, 0, 0, 0, 0, 7, 9, 0, 7, 9, 0, 0, 0, 0, 0, 0, 0, 7, 9, 0, 0, 0, 0, 7, 9, 0, 7, 9, 0, 0, 0, 0, 0, 0, 0, 7, 9, 0, 0, 0, 0, 7, 9, 0, 7, 9, 0, 7, 9,28,29,30, 0, 0, 0, 0, 0, 0 db 0, 0, 0, 0, 0, 7, 9, 0, 0, 0,31,32,33, 0, 7, 9, 0, 0, 0, 0, 0, 0, 0, 7, 9, 0, 0, 0, 0, 7, 9, 0, 7, 9, 0, 0, 0, 0, 0, 0, 0, 7, 9, 0, 0, 0, 0, 7, 9, 0, 7, 9, 0, 7, 9, 0, 7, 9, 0, 0, 0, 0, 0, 0 db 0, 0, 0, 0, 0, 7,10,11,11,11,40,41,42, 0, 7,10,11,11,11,11,17, 0, 0, 7, 9, 0, 0, 0, 0, 7, 9, 0, 7, 9, 0, 0, 0, 0, 0, 0, 0, 7,10,11,11,11,11, 5, 9, 0, 7, 9, 0, 7, 9, 0, 6,12, 0, 0, 0, 0, 0, 0 db 0, 0, 0, 0, 0, 7, 9, 0, 0, 0,46,47,48, 0, 7, 9, 0, 0, 0, 0, 0, 0, 0, 7, 9, 0, 0, 0, 0, 7, 9, 0, 7, 9, 0, 0, 0, 0, 0, 0, 0, 7, 9, 0, 0, 0, 0, 7, 9, 0, 7, 9, 0, 7, 9, 0, 7, 9, 0, 0, 0, 0, 0, 0 db 0, 0, 0, 0, 0, 7, 9, 0, 0, 0, 0, 7, 9, 0, 7, 9, 0, 0, 0, 0, 0, 0, 0, 7, 9, 0, 0, 0, 0, 7, 9, 0, 7, 9, 0, 0, 0, 0, 0, 0, 0, 7, 9, 0, 0, 0, 0, 7, 9, 0, 7, 9, 0, 7, 9, 0, 7, 9, 0, 0, 0, 0, 0, 0 db 0, 0, 0, 0, 0, 7, 9, 0, 0, 0,31,32,33, 0, 7, 9, 0, 0, 0, 0, 0, 0, 0, 7, 9, 0, 0, 0,31,32,33, 0, 7, 9, 0, 0, 0, 0, 0, 0, 0, 7, 9, 0, 0, 0, 0, 7, 9, 0, 7, 9, 0, 7, 9, 0, 7, 9, 0, 0, 0, 0, 0, 0 db 0, 0, 0, 0, 0,44,45,11,11,11,37,38,39, 0,13,16,11,11,11,11,11,17, 0,13,16,11,11,11,37,38,39, 0,13,16,11,11,11,11,11,17, 0,13,15, 0, 0, 0, 0,13,15, 0,13,15, 0,13,15, 0,13,18, 0, 0, 0, 0, 0, 0 _intro_title_off dw 0000h _intro_title_ptr dw 0000h _intro_title_yptr dw 0000h ;---- Intro. intro: call intro_logon call intro_main call intro_logoff ret ;---- Intro_Logon. intro_logon: mov es, _intro_seg xor si, si xor edi, edi mov di, 2 mov dx, 100 intro_logon_yloop: mov cx, 25 intro_logon_xloop: mov ah, cs: _intro_back[si] mov al, ah and al, 3 ror ah, 2 mov es: [di], al mov al, ah and al, 3 ror ah, 2 mov es: [di+1], al mov al, ah and al, 3 ror ah, 2 mov es: [di+2], al mov al, ah and al, 3 ror ah, 2 mov es: [di+3], al add dword ptr es: [di], 19191919h inc si add di, 4 loop intro_logon_xloop add di, 2 dec dx jnz intro_logon_yloop ; Sort out masks and shadows. mov ds, _sprite_seg mov es, _graph_seg xor bx, bx mov cx, 16*16*6*8 intro_logon_maskloop: mov al, byte ptr _intro_block[bx] mov dx, 00FFh cmp al, 0 je intro_logon_maskok mov dx, 0100h intro_logon_maskok: mov [bx+32000], dl mov [bx+48000], dh inc bx loop intro_logon_maskloop ret ;---- Intro_Main. intro_main: ; mov _timer_proc, offset cs: intro_timer ; Wait for escape to be released. intro_esc: call intro_timer ; cmp _KBD_ESC, 0 jne intro_esc ; Intro loop. intro_loop: call intro_timer ; cmp _KBD_ESC, 0 jne intro_exit cmp _KBD_SPACE, 0 je intro_loop intro_end: mov _timer_proc, offset timer_null xor ax, ax ret intro_exit: mov _timer_proc, offset timer_null mov ax, -1 ret ;---- Intro_Logoff. intro_logoff: pushf popf ret ;---- Intro_Timer. intro_timer: nop nop push ds push es push eax push ecx push dx push ebx push si push di ; Blit on background. mov ds, _intro_seg mov es, _scr_seg mov si, 2 mov di, 10 mov dx, 100 intro_yback: push si push di mov cx, 25 intro_xback: mov eax, [si] mov es: [di], eax mov es: [di+100], eax mov es: [di+200], eax mov es: [di+32000], eax mov es: [di+32100], eax mov es: [di+32200], eax mov [si-1], eax add si, 4 add di, 4 loop intro_xback pop di pop si mov al, [si-1] mov [si+99], al add di, 320 add si, 102 dec dx jnz intro_yback ; Big text. mov ds, _sprite_seg mov bx, _intro_title_ptr and bx, 63 mov dh, 9 mov di, _intro_title_yptr ;28*320+4 mov di, _intro_title_y[di] add di, 4 sub di, _intro_title_off intro_ytitle: push bx mov cx, 20 intro_xtitle: mov al, _intro_title[bx] cmp al, 0 je intro_nextblock ; Is this a block which has a mask? cmp al, 19 jae intro_notsquare ; Draw square block. push di push bx mov bh, al xor bl, bl dec bh mov dl, 16 intro_square: mov eax, _intro_block[bx] mov es: [di], eax mov eax, _intro_block[bx+4] mov es: [di+4], eax mov eax, _intro_block[bx+8] mov es: [di+8], eax mov eax, _intro_block[bx+12] mov es: [di+12], eax add bx, 16 add di, 320 dec dl jnz intro_square pop bx pop di ; Square shadow. mov eax, 01010101h add es: [di+320* 8+16], eax add es: [di+320* 9+16], eax add es: [di+320*10+16], eax add es: [di+320*11+16], eax add es: [di+320* 8+20], eax add es: [di+320* 9+20], eax add es: [di+320*10+20], eax add es: [di+320*11+20], eax add es: [di+320*12+16], eax add es: [di+320*13+16], eax add es: [di+320*14+16], eax add es: [di+320*15+16], eax add es: [di+320*12+20], eax add es: [di+320*13+20], eax add es: [di+320*14+20], eax add es: [di+320*15+20], eax add es: [di+320*16+16], eax add es: [di+320*17+16], eax add es: [di+320*18+16], eax add es: [di+320*19+16], eax add es: [di+320*16+20], eax add es: [di+320*17+20], eax add es: [di+320*18+20], eax add es: [di+320*19+20], eax add es: [di+320*20+16], eax add es: [di+320*21+16], eax add es: [di+320*22+16], eax add es: [di+320*23+16], eax add es: [di+320*20+20], eax add es: [di+320*21+20], eax add es: [di+320*22+20], eax add es: [di+320*23+20], eax add es: [di+320*16+ 8], eax add es: [di+320*17+ 8], eax add es: [di+320*18+ 8], eax add es: [di+320*19+ 8], eax add es: [di+320*16+12], eax add es: [di+320*17+12], eax add es: [di+320*18+12], eax add es: [di+320*19+12], eax add es: [di+320*20+ 8], eax add es: [di+320*21+ 8], eax add es: [di+320*22+ 8], eax add es: [di+320*23+ 8], eax add es: [di+320*20+12], eax add es: [di+320*21+12], eax add es: [di+320*22+12], eax add es: [di+320*23+12], eax jmp intro_nextblock intro_notsquare: ; Unsquare block. push di push bx mov bh, al xor bl, bl dec bh mov dl, 16 intro_nonsquare: mov eax, [bx+48000] add es: [di+4+320*4+321*4], eax mov eax, [bx+32000] and es: [di], eax mov eax, _intro_block[bx] xor es: [di], eax mov eax, [bx+48004] add es: [di+8+320*4+321*4], eax mov eax, [bx+32004] and es: [di+4], eax mov eax, _intro_block[bx+4] xor es: [di+4], eax mov eax, [bx+48008] add es: [di+12+320*4+321*4], eax mov eax, [bx+32008] and es: [di+8], eax mov eax, _intro_block[bx+8] xor es: [di+8], eax mov eax, [bx+48012] add es: [di+16+320*4+321*4], eax mov eax, [bx+32012] and es: [di+12], eax mov eax, _intro_block[bx+12] xor es: [di+12], eax add bx, 16 add di, 320 dec dl jnz intro_nonsquare pop bx pop di intro_nextblock: mov ax, bx and ax, -64 inc bx add di, 16 and bx, 63 or bx, ax loop intro_xtitle pop bx add bx, 64 add di, 320*15 dec dh jnz intro_ytitle add _intro_title_off, 2 test _intro_title_off, -16 jz intro_nomove inc _intro_title_ptr and _intro_title_off, 15 and _intro_title_ptr, 63 intro_nomove: mov di, _intro_title_yptr add di, 2 cmp _intro_title_y[di], -1 jne intro_titleyok xor di, di intro_titleyok: and di, 511 mov _intro_title_yptr, di ; Clear lines down edge. xor eax, eax xor di, di mov cx, 200 intro_border: mov es: [di], eax mov es: [di+4], eax mov es: [di+8], ax mov es: [di+310], eax mov es: [di+314], eax mov es: [di+318], ax add di, 320 loop intro_border call update pop di pop si pop ebx pop dx pop ecx pop eax pop es pop ds ret ;---- GAME --------------------------------------------------------------------; _levelno db 00h _score dd 0000h _player_x db 00h _player_y db 00h _player_off dw 0000h _corner_x db 20 _corner_y db 12 _corner_tx db 00h _corner_ty db 00h _corner_off dw (20)+64*(12) _gameover db 00h _playerok db 00h _leveldone db 00h _timeout db 00h _pause db 00h _game_pal db 256 dup (00h, 00h, 00h) _sprite_table dd 01010100h,01010101h,01010101h,01010101h ; Space. dd 0B0A0908h,0F0E0D0Ch,0B0A0908h,0F0E0D0Ch ; Earth. dd 40404040h,40404040H,40404040h,40404040h ; Diamond. dd 4B4B4B4Bh,4F4E4D4Ch,4F4E4D4Ch,4F4E4D4Ch ; Newdia. dd 10101010h,10101010h,10101010h,10101010h ; Bat. dd 18181818h,18181818h,18181818h,18181818h ; Spirit. dd 30313233h,34353637h,30313233h,34353637h ; Rock. dd 20202020h,20202020h,6E665E56h,6F675F57h ; Wall. dd 23222120h,27262524h,23222120h,27262524h ; Magic. dd 04030201h,04030201h,04030201h,04030201h ; Bang. dd 2E2E2F2Fh,2C2C2D2Dh,2A2A2B2Bh,28282929h ; Mould. dd 38383838h,38383838h,38383838h,38383838h ; Solid. dd 06060606h,07070707h,06060606h,07070707h ; Door. dd 3B3A3938h,3F3E3D3Ch,3B3A3938h,3F3E3D3Ch ; RSolid. dd 06060606h,07070707h,06060606h,07070707h ; Start. dd 50505050h,50505050h,50505050h,50505050h ; Man. ; A B C D E F G H. ; I J K L M N O P. _level_startx_ db 2, 4, 3, 39, 1, 30, 37, 1 db 8, 14, 27, 15, 24, 17, 49, 37 _level_starty_ db 5, 11, 4, 33, 1, 33, 30, 2 db 13, 21, 40, 15, 1, 12, 5, 10 _level_width_ db 35, 58, 44, 41, 33, 64, 64, 20 db 51, 38, 64, 32, 43, 26, 207, 42 _level_height_ db 28, 28, 40, 35, 21, 64, 64, 12 db 36, 31, 64, 31, 30, 28, 64, 56 _level_minx_ db 0, 0, 0, 0, 0, 0, 0, 0 db 0, 0, 0, 0, 0, 0, 0, 22 _level_miny_ db 0, 0, 0, 0, 0, 0, 0, 0 db 0, 0, 0, 0, 0, 0, 0, 8 _level_time_ db 180, 150, 210, 120, 120, 240, 240, 10 db 150, 240, -1, 200, 150, 120, 240, 240 _level_dias_ db 20, 36, 36, 20, 6, 24, 18, 5 db 80, 90, 50, 9, 60, 40, 76, 33 _level_points_ db 13, 15, 18, 35, 55, 17, 25, 32 db 5, 7, 179, 21, 8, 10, 7, 79 _level_startx db 2 _level_starty db 5 _level_width db 35 _level_height db 28 _level_minx db 00h _level_miny db 00h _level_time db 20 _level_dias db 20 _level_points db 157 db 64 dup (00h) _level db 64*64 dup (00h) _level_flags db 64*64 dup (00h) db 64 dup (00h) ;---- Game. game: call game_logon call game_main call game_logoff ret ;---- Game_Logon. game_logon: ; Randomize sozzle buffer. xor bx, bx game_logon_makesozzle: mov cs: _game_sozzle_buf[bx], bl inc bx cmp bx, 240 jne game_logon_makesozzle xor si, si xor bx, bx game_logon_shuffle: in al, 40h add ah, ah xor ah, al sub ah, cs: _game_sozzle_buf[bx] cmp ah, 240 jae game_logon_noshuffle mov bl, ah mov al, cs: _game_sozzle_buf[si] xchg al, cs: _game_sozzle_buf[bx] mov cs: _game_sozzle_buf[si], al game_logon_noshuffle: inc si cmp si, 240 jne game_logon_shuffle ; Sort out sprite masks. mov ds, _sprite_seg xor si, si mov cx, 32000 game_logon_maskloop: mov al, [si] cmp al, 0 mov al, -1 je game_logon_maskok mov al, 0 game_logon_maskok: mov [si+32000], al inc si loop game_logon_maskloop ; Set up game variables. mov _score, 0 mov _gameover, 0 ret ;---- Game_Logoff. game_logoff: ret ;---- Game_Main. game_main: mov _timer_proc, offset cs: game_start game_loop: cmp _KBD_ESC, 0 jne game_end cmp _gameover, 0 je game_loop game_end: mov _timer_proc, offset timer_null ret ;---- GAME TIMER PROCEDURES. _game_sozzle_buf db 240 dup (00h) _game_sozzle_frame db 00h _game_sozzle_block db 0D0h ;---- Game_Start. ; The start of the game loop. game_start: nop nop mov _game_sozzle_frame, 0 mov _timer_proc, offset cs: game_start_proc ; Set player data. push ax push bx mov _timeout, 0 mov _playerok, 1 mov _leveldone, 0 mov bl, _levelno xor bh, bh mov al, _level_startx_[bx] mov _level_startx, al mov al, _level_starty_[bx] mov _level_starty, al mov al, _level_width_[bx] mov _level_width, al mov al, _level_height_[bx] mov _level_height, al mov al, _level_minx_[bx] mov _level_minx, al mov al, _level_miny_[bx] mov _level_miny, al mov al, _level_time_[bx] mov _level_time, al mov al, _level_dias_[bx] mov _level_dias, al mov al, _level_points_[bx] mov _level_points, al mov al, _level_startx mov ah, _level_starty mov _player_x, al mov _player_y, ah mov bl, ah xor bh, bh xor ah, ah shl bx, 6 or ax, bx mov _player_off, ax mov _corner_x, 20 mov _corner_y, 12 mov _corner_off, 20+64*12 mov al, _player_x mov ah, _player_y sub al, 9 sub ah, 5 mov _corner_tx, al mov _corner_ty, ah pop bx pop ax ; Copy level into buffer. push es push ds push ax push ecx push esi push edi cld mov ds, _level_seg mov es, _code_seg xor esi, esi xor edi, edi xor al, al mov ah, _levelno shl ah, 4 mov si, ax mov di, offset _level xor ecx, ecx mov cx, 64*64/4 rep movsd pop edi pop esi pop ecx pop ax pop ds pop es game_start_proc: nop nop call game_sozzleframe call game_status cmp _KBD_RSHIFT, 0 je game_start_nomap call game_map game_start_nomap: call update add _game_sozzle_frame, 5 cmp _game_sozzle_frame, 240 jna game_start_ok mov _game_sozzle_frame, 255 mov _timer_proc, offset cs: game_play game_start_ok: ret ;---- Game_Play. ; Moves the game on a frame. _game_play_time db 00h _game_play_bar db 00h game_play: nop nop inc _game_play_time cmp _game_play_time, 18 jb game_play_timeok mov _game_play_time, 0 cmp _level_time, 0 je game_play_timeout dec _level_time jmp game_play_timeok game_play_timeout: mov _timeout, 1 game_play_timeok: call game_move call game_frame ; If last diamond just collected, flash white. cmp _leveldone, 1 je game_play_noflash cmp _level_dias, 0 jne game_play_noflash push es push edi push eax push ecx mov es, _scr_seg xor ecx, ecx xor edi, edi mov cx, 16000 mov eax, 0F0F0F0Fh rep stosd mov _leveldone, 1 pop ecx pop eax pop edi pop es game_play_noflash: ; Print status or message. inc _game_play_bar cmp _playerok, 0 jne game_play_status cmp _KBD_SPACE, 0 je game_play_lifeoverok mov _timer_proc, offset cs: game_finish game_play_lifeoverok: test _game_play_bar, 32 jz game_play_status cmp _timeout, 0 je game_play_dead call game_timeout jmp game_play_nostatus game_play_dead: call game_gameover jmp game_play_nostatus game_play_status: call game_status game_play_nostatus: cmp _KBD_RSHIFT, 0 je game_play_nomap call game_map game_play_nomap: call update ret ;---- Game_Finish. _game_finish_pause db 00h game_finish: nop nop mov _game_sozzle_frame, 240 mov _timer_proc, offset cs: game_finish_proc mov _game_finish_pause, 18*2 game_finish_proc: nop nop call game_sozzleframe call game_status call update sub _game_sozzle_frame, 5 cmp _game_sozzle_frame, 4 ja game_finish_ok mov _game_sozzle_frame, 0 mov _timer_proc, offset cs: game_finish_pause game_finish_ok: ret game_finish_pause: nop nop call game_sozzleframe call game_status call update dec _game_finish_pause jnz game_finish_pause_ok mov _timer_proc, offset cs: game_start game_finish_pause_ok: ret ;---- GAME MISC ROUTINNES. game_move: cmp _timeout, 0 mov _playerok, 0 je game_move_timeok ret game_move_timeok: push ds push es push eax push ecx push dx push si push edi ; Clear moved flags. mov es, _code_seg xor edi, edi xor ecx, ecx mov di, offset cs: _level_flags mov cx, 64*64/4 xor eax, eax rep stosd mov _playerok, 0 ; Move each character in turn. mov ds, _code_seg xor si, si mov dh, 64 game_move_y: mov dl, 64 game_move_x: cmp _level_flags[si], 0 jne game_move_no mov al, _level[si] cmp al, 10h jb move_space_ cmp al, 20h jb move_earth_ cmp al, 30h jb move_diamond_ cmp al, 40h jb move_newdia_ cmp al, 50h jb move_bat_ cmp al, 60h jb move_spirit_ cmp al, 70h jb move_rock_ cmp al, 80h jb move_wall_ cmp al, 90h jb move_magic_ cmp al, 0A0h jb move_bang_ cmp al, 0B0h jb move_mould_ cmp al, 0C0h jb move_solid_ cmp al, 0D0h jb move_door_ cmp al, 0E0h jb move_rsolid_ cmp al, 0F0h jb move_start_ jmp move_man_ game_move_ok: game_move_no: inc si dec dl jnz game_move_x dec dh jnz game_move_y pop edi pop si pop dx pop ecx pop eax pop es pop ds ret ;---- Individual move routines. ; Branches. move_space_: jmp move_space move_earth_: jmp move_earth move_diamond_: jmp move_diamond move_newdia_: jmp move_newdia move_bat_: jmp move_bat move_spirit_: jmp move_spirit move_rock_: jmp move_rock move_wall_: jmp move_wall move_magic_: jmp move_magic move_bang_: jmp move_bang move_mould_: jmp move_mould move_solid_: jmp move_solid move_door_: jmp move_door move_rsolid_: jmp move_rsolid move_start_: jmp move_start move_man_: jmp move_man ; These characters don't seem to do much. move_space: move_earth: move_wall: move_solid: move_rsolid: jmp game_move_ok ; Move door. move_door: push ax cmp _leveldone, 0 je move_door_no inc al and al, 0Fh or al, 0C0h mov _level[si], al move_door_no: pop ax jmp game_move_ok ; Characters not yet programmed. move_magic: move_mould: jmp game_move_ok ; Move newdia. move_newdia: mov _level[si], 20h jmp game_move_ok push ax mov al, _level[si] inc al and al, 3 jz move_newdia_diamond or al, 30h mov _level[si], al pop ax jmp game_move_ok move_newdia_diamond: mov _level[si], 20h pop ax jmp game_move_ok ; Move bang. move_bang: push ax mov al, _level[si] cmp al, 9Ch jne move_bang_notman mov _playerok, 1 move_bang_notman: mov ah, al inc al and ah, 0FCh and al, 3 jz move_bang_gone or al, ah mov _level[si], al pop ax jmp game_move_ok move_bang_gone: cmp ah, 9Ch je move_bang_man mov byte ptr _level[si], 0 pop ax jmp game_move_ok move_bang_man: mov _level[si], 0F0h pop ax jmp game_move_ok ; Move start. move_start: mov _playerok, 1 mov _game_play_bar, 0 push ax mov al, _level[si] inc al and al, 0Fh or al, 0E0h cmp al, 0E0h jne move_start_ok mov al, 9Ch move_start_ok: mov _level[si], al pop ax jmp game_move_ok ; Move fallers. move_diamond: move_rock: push ax push si push di ; Is there a gap below? test _level[si+64], 0F0h jnz move_rock_nofall lea di, [si+64] jmp move_rock_move move_rock_nofall: mov ah, _level[si+64] and ah, 0F0h cmp ah, 20h je move_rock_slip cmp ah, 60h je move_rock_slip cmp ah, 70h je move_rock_slip cmp ah, 0A0h je move_rock_slip jmp move_rock_noslip move_rock_slip: test _level[si+1], 0F0h jnz move_rock_noright test _level[si+65], 0F0h jnz move_rock_noright lea di, [si+1] jmp move_rock_move move_rock_noright: test _level[si-1], 0F0h jnz move_rock_noleft test _level[si+63], 0F0h jnz move_rock_noleft lea di, [si-1] jmp move_rock_move move_rock_noleft: move_rock_noslip: test _level[si], 8 jnz move_rock_falling and _level[si], 0F7h pop di pop si pop ax jmp game_move_ok move_rock_falling: and _level[si], 0F7h sub si, 64 jmp move_rock_hits move_rock_move: cmp si, di je move_rock_end or _level[si], 8 test al, 8 jz move_rock_end or al, 8 mov _level[si], 0 mov _level[di], al mov _level_flags[di], 8 ; Check for hits if falling (not slipping). sub di, 64 cmp di, si jne move_rock_end move_rock_hits: mov ah, _level[si+128] and ah, 0F0h cmp ah, 40h je move_rock_hitbat cmp ah, 50h je move_rock_hitspirit cmp ah, 0F0h je move_rock_hitman move_rock_end: pop di pop si pop ax jmp game_move_ok move_rock_hitbat: mov ah, 30h lea di, [si+128] call move_detonate jmp move_rock_end move_rock_hitspirit: move_rock_hitman: mov ah, 90h lea di, [si+128] call move_detonate jmp move_rock_end ; Move bat. _bat_dir dw 64, 1, -64, -1, 64, 1, -64, -1 move_bat: push ax push bx push di mov bl, al and bl, 03h xor bh, bh add bl, bl ; Is there anything to it's left (relative to it's direction)? mov di, si add di, _bat_dir[bx+6] test _level[di], 0F0h jnz move_bat_notleft ; If there is nothing left, go that way. mov bl, al mov ah, al add bl, 3 and ah, 0F0h and bl, 3 mov _level[si], 0 or ah, bl mov _level_flags[di], 1 mov _level[di], ah jmp move_bat_touch move_bat_notleft: ; There is something on the left to follow round. ; Check if there is anything forward. mov di, si add di, _bat_dir[bx] test _level[di], 0F0h jnz move_bat_noforward mov _level[si], 0 mov _level_flags[di], 1 mov _level[di], al jmp move_bat_touch move_bat_noforward: ; Forward blocked so turn right. mov di, si add di, _bat_dir[bx+2] mov bl, al mov ah, al inc bl and ah, 0F0h and bl, 3 or ah, bl mov _level[si], ah move_bat_touch: mov ah, _level[si-64] and ah, 0F0h cmp ah, 0A0h je move_bat_detonate cmp ah, 0F0h je move_bat_detonate mov ah, _level[si+64] and ah, 0F0h cmp ah, 0A0h je move_bat_detonate cmp ah, 0F0h je move_bat_detonate mov ah, _level[si-1] and ah, 0F0h cmp ah, 0A0h je move_bat_detonate cmp ah, 0F0h je move_bat_detonate mov ah, _level[si+1] and ah, 0F0h cmp ah, 0A0h je move_bat_detonate cmp ah, 0F0h je move_bat_detonate pop di pop bx pop ax jmp game_move_ok move_bat_detonate: mov ah, 30h mov di, si call move_detonate pop di pop bx pop ax jmp game_move_ok ; Move spirit. _spirit_dir dw 64, -1, -64, 1, 64, -1, -64, 1 move_spirit: push ax push bx push di mov bl, al and bl, 03h xor bh, bh add bl, bl ; Is there anything to it's left (relative to it's direction)? mov di, si add di, _spirit_dir[bx+6] test _level[di], 0F0h jnz move_spirit_notleft ; If there is nothing left, go that way. mov bl, al mov ah, al add bl, 3 and ah, 0F0h and bl, 3 mov _level[si], 0 or ah, bl mov _level_flags[di], 1 mov _level[di], ah jmp move_spirit_touch move_spirit_notleft: ; There is something on the left to follow round. ; Check if there is anything forward. mov di, si add di, _spirit_dir[bx] test _level[di], 0F0h jnz move_spirit_noforward mov _level[si], 0 mov _level_flags[di], 1 mov _level[di], al jmp move_spirit_touch move_spirit_noforward: ; Forward blocked so turn right. mov di, si add di, _spirit_dir[bx+2] mov bl, al mov ah, al inc bl and ah, 0F0h and bl, 3 or ah, bl mov _level[si], ah move_spirit_touch: mov ah, _level[si-64] and ah, 0F0h cmp ah, 0A0h je move_spirit_detonate cmp ah, 0F0h je move_spirit_detonate mov ah, _level[si+64] and ah, 0F0h cmp ah, 0A0h je move_spirit_detonate cmp ah, 0F0h je move_spirit_detonate mov ah, _level[si-1] and ah, 0F0h cmp ah, 0A0h je move_spirit_detonate cmp ah, 0F0h je move_spirit_detonate mov ah, _level[si+1] and ah, 0F0h cmp ah, 0A0h je move_spirit_detonate cmp ah, 0F0h je move_spirit_detonate pop di pop bx pop ax jmp game_move_ok move_spirit_detonate: mov ah, 90h mov di, si call move_detonate pop di pop bx pop ax jmp game_move_ok ; Move man. _move_man_left db 58h, 59h, 5Ah, 5Bh, 5Ch, 5Dh, 5Bh, 5Ah, 59h, -1 _move_man_right db 60h, 61h, 62h, 63h, 64h, 65h, 64h, 63h, 62h, -1 _move_man_ptr dw offset _move_man_right _move_man_dir dw offset _move_man_right _move_man_push db 00h move_man: push ax mov _playerok, 1 mov _game_play_bar, 0 inc _move_man_push and _move_man_push, 0Fh mov _level[si], 0F0h ; Up? xor al, al cmp _KBD_UP, 0 je move_man_noup mov _level[si], 0F1h cmp _level[si-64], 30h jnb move_man_noup mov al, _level[si-64] mov cs: _game_man_frame, offset cs: _game_man_anim cmp _KBD_FIRE, 0 je move_man_up_nofire mov _level[si-64], 90h mov _level_flags[si-64], 1 jmp move_man_after move_man_up_nofire: dec _player_y sub _player_off, 64 mov _level[si], 0 mov _level[si-64], 0F1h mov _level_flags[si-64], 1 jmp move_man_after move_man_noup: ; Down? cmp _KBD_DOWN, 0 je move_man_nodown mov _level[si], 0F1h cmp _level[si+64], 30h jnb move_man_nodown mov al, _level[si+64] mov cs: _game_man_frame, offset cs: _game_man_anim cmp _KBD_FIRE, 0 je move_man_down_nofire mov _level[si+64], 90h mov _level_flags[si+64], 1 jmp move_man_after move_man_down_nofire: inc _player_y add _player_off, 64 mov _level[si], 0 mov _level[si+64], 0F1h mov _level_flags[si+64], 1 jmp move_man_after move_man_nodown: ; Left? cmp _KBD_LEFT, 0 je move_man_noleft mov _level[si], 0F1h cmp _move_man_dir, offset _move_man_left je move_man_leftok mov _move_man_dir, offset _move_man_left mov _move_man_ptr, offset _move_man_left move_man_leftok: mov ah, _level[si-1] and ah, 0F0h cmp ah, 60h jne move_man_noleftpush cmp _move_man_push, 0 jne move_man_noleftpush test _level[si-2], 0F0h jnz move_man_noleftpush mov ah, _level[si-1] mov _level[si-2], ah mov _level[si-1], 0 move_man_noleftpush: cmp _level[si-1], 30h jnb move_man_noleft mov al, _level[si-1] mov cs: _game_man_frame, offset cs: _game_man_anim cmp _KBD_FIRE, 0 je move_man_left_nofire mov _level[si-1], 90h mov _level_flags[si-1], 1 jmp move_man_after move_man_left_nofire: dec _player_x dec _player_off mov _level[si], 0 mov _level[si-1], 0F1h mov _level_flags[si-1], 1 jmp move_man_after move_man_noleft: ; Right? cmp _KBD_RIGHT, 0 je move_man_noright mov ah, _level[si+1] and ah, 0F0h cmp ah, 60h jne move_man_norightpush cmp _move_man_push, 0 jne move_man_norightpush test _level[si+2], 0F0h jnz move_man_norightpush mov ah, _level[si+1] mov _level[si+2], ah mov _level[si+1], 0 move_man_norightpush: mov _level[si], 0F1h cmp _move_man_dir, offset _move_man_right je move_man_rightok mov _move_man_dir, offset _move_man_right mov _move_man_ptr, offset _move_man_right move_man_rightok: cmp _level[si+1], 30h jnb move_man_noright mov al, _level[si+1] mov cs: _game_man_frame, offset cs: _game_man_anim cmp _KBD_FIRE, 0 je move_man_right_nofire mov _level[si+1], 90h mov _level_flags[si+1], 1 jmp move_man_after move_man_right_nofire: inc _player_x inc _player_off mov _level[si], 0 mov _level[si+1], 0F1h mov _level_flags[si+1], 1 jmp move_man_after move_man_noright: move_man_after: and al, 0F0h cmp al, 20h jne move_man_notdia xor ah, ah mov al, _level_points add word ptr _score, ax adc word ptr _score[4], 0 cmp _level_dias, 0 je move_man_notdia dec _level_dias move_man_notdia: pop ax jmp game_move_ok ;---- Move_Detonate. move_detonate: push di sub di, 65 call move_detonate_put inc di call move_detonate_put inc di call move_detonate_put add di, 62 call move_detonate_put inc di call move_detonate_put inc di call move_detonate_put add di, 62 call move_detonate_put inc di call move_detonate_put inc di call move_detonate_put pop di ret move_detonate_put: push ax mov al, _level[di] and al, 0F0h cmp al, 0B0h je move_detonate_put_end cmp al, 0C0h je move_detonate_put_end cmp al, 0D0h je move_detonate_put_end mov _level[di], ah mov _level_flags[di], 1 move_detonate_put_end: pop ax ret ;---- BEDLAM GRAPHICS ROUTINES ------------------------------------------------; ;---- Game_Rotate _game_man_anim db 36 dup (50h), 51h, 52h, 53h, 52h, 51h db 4 dup (50h, 50h, 54h, 54h), 9 dup (55h) db 6 dup (50h), 4 dup (55h) db 4 dup (50h, 50h, 54h, 54h), 51h, 52h, 53h, 52h, 51h, 50h db -1 _game_man_frame dw offset _game_man_anim ; Rotate sprites. game_rotate: push ax push bx ; Man. mov bx, _game_man_frame mov al, cs: [bx] inc bx cmp al, -1 jne game_rotate_manok mov bx, offset cs: _game_man_anim mov al, cs: [bx] game_rotate_manok: mov _game_man_frame, bx mov byte ptr _sprite_table[0F0h], al mov bx, _move_man_ptr mov al, cs: [bx] inc bx cmp al, -1 jne move_man_frameok mov bx, _move_man_dir mov al, cs: [bx] move_man_frameok: mov _move_man_ptr, bx mov byte ptr _sprite_table[0F1h], al ; Diamond. mov al, byte ptr _sprite_table[20h] mov bx, 20h inc al cmp al, 4Ah jna game_rotate_diaok mov al, 40h game_rotate_diaok: mov ah, al call game_rotate_put ; Others. mov ah, 10h mov bx, 40h call game_rotate_one mov ah, 18h mov bx, 50h call game_rotate_one mov ah, 20h mov bx, 80h call game_rotate_one mov ah, 38h mov bx, 0D0h call game_rotate_one pop bx pop ax ret game_rotate_one: mov al, byte ptr _sprite_table[bx] inc al and al, 7 or al, ah mov ah, al game_rotate_put: mov word ptr _sprite_table[bx], ax mov word ptr _sprite_table[bx+2], ax mov word ptr _sprite_table[bx+4], ax mov word ptr _sprite_table[bx+6], ax mov word ptr _sprite_table[bx+8], ax mov word ptr _sprite_table[bx+10], ax mov word ptr _sprite_table[bx+12], ax mov word ptr _sprite_table[bx+14], ax ret ;---- Game_Scroll. game_scroll: push ax ; Sort out tx and ty. cmp _corner_tx, 245 jna game_scroll_txok mov _corner_tx, 0 game_scroll_txok: cmp _corner_ty, 245 jna game_scroll_tyok mov _corner_ty, 0 game_scroll_tyok: ; Horizontal movement. mov al, _corner_x cmp al, _corner_tx je game_scroll_nohoriz jb game_scroll_right mov al, _level_minx cmp _corner_x, al je game_scroll_nohoriz dec _corner_x dec _corner_off call game_back_left ; call game_back_left ; call game_back_left jmp game_scroll_nohoriz game_scroll_right: mov ah, _level_width sub ah, 20 cmp _corner_x, ah jae game_scroll_nohoriz inc _corner_x inc _corner_off call game_back_right ; call game_back_right ; call game_back_right game_scroll_nohoriz: ; Vertical movement. mov al, _corner_y cmp al, _corner_ty je game_scroll_novert jl game_scroll_down mov al, _level_miny cmp _corner_y, al je game_scroll_novert dec _corner_y sub _corner_off, 64 call game_back_up ; call game_back_up ; call game_back_up jmp game_scroll_novert game_scroll_down: mov ah, _level_height sub ah, 12 cmp _corner_y, ah jge game_scroll_novert inc _corner_y add _corner_off, 64 call game_back_down ; call game_back_down ; call game_back_down game_scroll_novert: ; Scroll if necessary. mov al, _player_x sub al, _corner_x cmp al, 4 jb game_scroll_manleft cmp al, 14 jb game_scroll_afterhoriz mov al, _player_x sub al, 9 mov _corner_tx, al jmp game_scroll_afterhoriz game_scroll_manleft: mov al, _player_x sub al, 8 mov _corner_tx, al game_scroll_afterhoriz: mov al, _player_y sub al, _corner_y cmp al, 4 jl game_scroll_manup cmp al, 8 jl game_scroll_aftervert mov al, _player_y sub al, 5 mov _corner_ty, al jmp game_scroll_aftervert game_scroll_manup: mov al, _player_y sub al, 6 mov _corner_ty, al game_scroll_aftervert: pop ax ret game_back_up: push ds push es push cx push si push di mov ds, _code_seg mov es, _code_seg cld mov cx, 32 mov si, offset cs: _game_back_data + 32*31 mov di, offset cs: _game_back_data + 32*32 game_back_up_loop: push cx mov cx, 16 rep movsw pop cx sub si, 64 sub di, 64 loop game_back_up_loop mov si, offset cs: _game_back_data + 32*32 mov di, offset cs: _game_back_data mov cx, 16 rep movsw pop di pop si pop cx pop es pop ds ret game_back_down: push ds push es push cx push si push di mov ds, _code_seg mov es, _code_seg cld mov si, offset cs: _game_back_data mov di, offset cs: _game_back_data + 32*32 mov cx, 16 rep movsw mov cx, 32 mov si, offset cs: _game_back_data + 32 mov di, offset cs: _game_back_data game_back_down_loop: push cx mov cx, 16 rep movsw pop cx loop game_back_down_loop pop di pop si pop cx pop es pop ds ret game_back_right: push ds push es push cx push si push di cld mov ds, _code_seg mov es, _code_seg mov si, offset cs: _game_back_data mov di, offset cs: _game_back_data mov cx, 32 game_back_right_loop: push cx lodsb mov cx, 31 rep movsb stosb pop cx loop game_back_right_loop pop di pop si pop cx pop es pop ds ret game_back_left: push ds push es push cx push si push di cld mov ds, _code_seg mov es, _code_seg mov si, offset cs: _game_back_data+31 mov cx, 32 game_back_left_loop: push cx mov ch, [si] mov cl, 31 game_back_left_xloop: mov al, [si-1] mov [si], al dec si dec cl jnz game_back_left_xloop mov [si], ch add si, 63 pop cx loop game_back_left_loop pop di pop si pop cx pop es pop ds ret ;---- Game_SozzleFrame. game_sozzleframe: push es push ds push ax push bx push dx push si push di call game_scroll ; Rotate animated sprites. call game_rotate mov ds, _code_seg mov es, _scr_seg call game_back xor bx, bx mov dh, 12 mov si, _corner_off add si, offset _level mov di, 0 game_sozzleframe_ysozzle: mov dl, 20 push di game_sozzleframe_xsozzle: mov al, _game_sozzle_buf[bx] cmp al, _game_sozzle_frame jae game_sozzleframe_block mov al, [si] call blit jmp game_sozzleframe_next game_sozzleframe_block: mov al, _game_sozzle_block call blit game_sozzleframe_next: inc bx inc si add di, 16 dec dl jnz game_sozzleframe_xsozzle pop di add di, 320*16 add si, 64-20 dec dh jnz game_sozzleframe_ysozzle inc _game_sozzle_block and _game_sozzle_block, 7 or _game_sozzle_block, 0D0h pop di pop si pop dx pop bx pop ax pop ds pop es ret ;---- Game_Frame. game_frame: push es push ds push ax push bx push dx push si push di call game_scroll ; Rotate animated sprites. call game_rotate mov ds, _code_seg mov es, _scr_seg call game_back xor bx, bx mov dh, 12 mov si, _corner_off add si, offset _level mov di, 0 game_frame_y: mov dl, 20 push si push di game_frame_x: mov al, [si] call blit inc bx inc si add di, 16 dec dl jnz game_frame_x pop di pop si add di, 320*16 add si, 64 dec dh jnz game_frame_y pop di pop si pop dx pop bx pop ax pop ds pop es ret ;---- Game_Back. _game_back_data dd 00h, 01D1D1D1Ch, 01E1D1D1Dh, 00h dd 00h, 00h, 00h, 00h dd 00h, 01D1D1D1Ch, 01E1D1D1Dh, 00h dd 00h, 00h, 00h, 00h dd 00h, 01D1D1D1Ch, 01E1D1D1Dh, 00h dd 00h, 00h, 00h, 00h dd 01C1C1C1Ch, 01D1D1D1Ch, 01D1D1D1Dh, 01C1C1C1Ch dd 01C1C1C1Ch, 01C1C1C1Ch, 01C1C1C1Ch, 01C1C1C1Ch dd 01D1D1D1Dh, 01D1D1D1Dh, 01D1D1D1Dh, 01D1D1D1Dh dd 01D1D1D1Dh, 01D1D1D1Dh, 01D1D1D1Dh, 01D1D1D1Dh dd 01D1D1D1Dh, 01F1D1D1Dh, 01D1D1D1Eh, 01D1D1D1Dh dd 01D1D1D1Dh, 01D1D1D1Dh, 01D1D1D1Dh, 01D1D1D1Dh dd 01D1D1D1Dh, 01F1D1Dh, 01D1D1C00h, 01D1D1D1Dh dd 01D1D1D1Dh, 01D1D1D1Dh, 01D1D1D1Dh, 01D1D1D1Dh dd 01D1D1D1Dh, 01E1D1Dh, 01D1D1B00h, 01D1D1D1Dh dd 01D1D1D1Dh, 01D1D1D1Dh, 01D1D1D1Dh, 01D1D1D1Dh dd 01D1D1D1Dh, 01C1D1D1Dh, 01D1D1D1Bh, 01D1D1D1Dh dd 01D1D1D1Dh, 01D1D1D1Dh, 01D1D1D1Dh, 01D1D1D1Dh dd 01D1D1D1Dh, 01D1D1D1Dh, 01D1D1D1Dh, 01D1D1D1Dh dd 01D1D1D1Dh, 01D1D1D1Dh, 01D1D1D1Dh, 01D1D1D1Dh dd 01E1E1E1Eh, 01D1D1D1Dh, 01E1D1D1Dh, 01E1E1E1Eh dd 01E1E1E1Eh, 01E1E1E1Eh, 01E1E1E1Eh, 01E1E1E1Eh dd 00h, 01D1D1D1Ch, 01E1D1D1Dh, 00h dd 00h, 00h, 00h, 00h dd 00h, 01D1D1D1Ch, 01E1D1D1Dh, 00h dd 00h, 00h, 00h, 00h dd 00h, 01D1D1D1Ch, 01E1D1D1Dh, 00h dd 00h, 00h, 00h, 00h dd 00h, 01D1D1D1Ch, 01E1D1D1Dh, 00h dd 00h, 00h, 00h, 00h dd 00h, 01D1D1D1Ch, 01E1D1D1Dh, 00h dd 00h, 00h, 00h, 00h dd 00h, 01D1D1D1Ch, 01E1D1D1Dh, 00h dd 00h, 00h, 00h, 00h dd 00h, 01D1D1D1Ch, 01E1D1D1Dh, 00h dd 00h, 00h, 00h, 00h dd 00h, 01D1D1D1Ch, 01E1D1D1Dh, 00h dd 00h, 00h, 00h, 00h dd 00h, 01D1D1D1Ch, 01E1D1D1Dh, 00h dd 00h, 00h, 00h, 00h dd 00h, 01D1D1D1Ch, 01E1D1D1Dh, 00h dd 00h, 00h, 00h, 00h dd 00h, 01D1D1D1Ch, 01E1D1D1Dh, 00h dd 00h, 00h, 00h, 00h dd 00h, 01D1D1D1Ch, 01E1D1D1Dh, 00h dd 00h, 00h, 00h, 00h dd 00h, 01D1D1D1Ch, 01E1D1D1Dh, 00h dd 00h, 00h, 00h, 00h dd 00h, 01D1D1D1Ch, 01E1D1D1Dh, 00h dd 00h, 00h, 00h, 00h dd 00h, 01D1D1D1Ch, 01E1D1D1Dh, 00h dd 00h, 00h, 00h, 00h dd 00h, 01D1D1D1Ch, 01E1D1D1Dh, 00h dd 00h, 00h, 00h, 00h dd 00h, 01D1D1D1Ch, 01E1D1D1Dh, 00h dd 00h, 00h, 00h, 00h dd 00h, 01D1D1D1Ch, 01E1D1D1Dh, 00h dd 00h, 00h, 00h, 00h dd 00h, 01D1D1D1Ch, 01E1D1D1Dh, 00h dd 00h, 00h, 00h, 00h dd 00h, 01D1D1D1Ch, 01E1D1D1Dh, 00h dd 00h, 00h, 00h, 00h dd 00h, 01D1D1D1Ch, 01E1D1D1Dh, 00h dd 00h, 00h, 00h, 00h dd 8 dup (00000000h) game_back: push ds push ax push cx push dx push esi push edi cld mov ds, _code_seg xor esi, esi xor edi, edi mov dh, 6 game_back_yloop: push di mov dl, 10 game_back_xloop: mov si, offset cs: _game_back_data push di mov al, 32 game_back_yblit: mov cx, 8 rep movsd add di, 320-32 dec al jnz game_back_yblit pop di add di, 32 dec dl jnz game_back_xloop pop di add di, 320*32 dec dh jnz game_back_yloop pop edi pop esi pop dx pop cx pop ax pop ds ret ;---- Game_Status. _game_digits dd 0FFFFFF00h, 0FFFFh, 0FFh, 0FF0000h dd 0FFh, 0FFFF00h, 0FFh, 0FF00FFh dd 0FF0000FFh, 0FF0000h, 0FF00FFh, 0FF0000h dd 0FFFFh, 0FF0000h, 0FFh, 0FF0000h dd 0FFFFFF00h, 0FFFFh, 00h, 00h dd 0FF000000h, 00h, 0FFFF0000h, 00h dd 0FF00FF00h, 00h, 0FF0000FFh, 00h dd 0FF000000h, 00h, 0FF000000h, 00h dd 0FF000000h, 00h, 0FF000000h, 00h dd 0FFFFFFFFh, 0FFFFFFh, 00h, 00h dd 0FFFFFF00h, 0FFFFh, 0FFh, 0FF0000h dd 00h, 0FF0000h, 00h, 0FF00h dd 00h, 0FFh, 0FF000000h, 00h dd 0FF0000h, 00h, 0FF00h, 00h dd 0FFFFFFFFh, 0FFFFFFh, 00h, 00h dd 0FFFFFFFFh, 0FFFFFFh, 00h, 0FF00h dd 00h, 0FFh, 0FF000000h, 00h dd 00h, 0FFh, 00h, 0FF00h dd 00h, 0FF0000h, 0FFh, 0FF0000h dd 0FFFFFF00h, 0FFFFh, 00h, 00h dd 00h, 0FF00h, 00h, 0FFFFh dd 0FF000000h, 0FF00h, 0FF0000h, 0FF00h dd 0FF00h, 0FF00h, 0FFFFFFFFh, 0FFFFFFh dd 00h, 0FF00h, 00h, 0FF00h dd 00h, 0FF00h, 00h, 00h dd 0FFFFFFFFh, 0FFFFFFh, 0FFh, 00h dd 0FFh, 00h, 0FFFFFFFFh, 0FFFFh dd 00h, 0FF0000h, 00h, 0FF0000h dd 00h, 0FF0000h, 0FFh, 0FF0000h dd 0FFFFFF00h, 0FFFFh, 00h, 00h dd 0FFFFFF00h, 0FFFFh, 0FFh, 0FF0000h dd 0FFh, 00h, 0FFFFFFFFh, 0FFFFh dd 0FFh, 0FF0000h, 0FFh, 0FF0000h dd 0FFh, 0FF0000h, 0FFh, 0FF0000h dd 0FFFFFF00h, 0FFFFh, 00h, 00h dd 0FFFFFFFFh, 0FFFFFFh, 00h, 0FF0000h dd 00h, 0FF0000h, 00h, 0FF00h dd 00h, 0FFh, 0FF000000h, 00h dd 0FF000000h, 00h, 0FF000000h, 00h dd 0FF000000h, 00h, 00h, 00h dd 0FFFFFF00h, 0FFFFh, 0FFh, 0FF0000h dd 0FFh, 0FF0000h, 0FFh, 0FF0000h dd 0FFFFFF00h, 0FFFFh, 0FFh, 0FF0000h dd 0FFh, 0FF0000h, 0FFh, 0FF0000h dd 0FFFFFF00h, 0FFFFh, 00h, 00h dd 0FFFFFF00h, 0FFFFh, 0FFh, 0FF0000h dd 0FFh, 0FF0000h, 0FFh, 0FF0000h dd 0FFFFFF00h, 0FFFFFFh, 00h, 0FF0000h dd 00h, 0FF0000h, 0FFh, 0FF0000h dd 0FFFFFF00h, 0FFFFh, 00h, 00h dd 00h, 049h, 048000000h, 049B9h dd 034470000h, 04A0D23h, 048484700h, 04B0D2334h dd 068687948h, 023344857h, 087874900h, 04B576879h dd 0944A0000h, 04B7987h, 04B000000h, 04BA8h dd 00h, 04Ah, 00h, 00h dd 0FFFF0000h, 0FFFFFFh, 0FF00h, 0FF000000h dd 0FF00h, 00h, 0FF00h, 00h dd 0FF00h, 0FFFFFFFFh, 0FF00h, 0FF000000h dd 0FF00h, 0FF000000h, 0FF00h, 0FF000000h dd 0FFFF0000h, 0FFFFFFh, 00h, 00h dd 0FFFF0000h, 0FFFFFFh, 0FF00h, 0FF000000h dd 0FF00h, 0FF000000h, 0FF00h, 0FF000000h dd 0FFFFFF00h, 0FFFFFFFFh, 0FF00h, 0FF000000h dd 0FF00h, 0FF000000h, 0FF00h, 0FF000000h dd 0FF00h, 0FF000000h, 00h, 00h dd 0FF00h, 0FF000000h, 0FFFF00h, 0FFFF0000h dd 0FF00FF00h, 0FF00FF00h, 0FF00h, 0FF0000FFh dd 0FF00h, 0FF000000h, 0FF00h, 0FF000000h dd 0FF00h, 0FF000000h, 0FF00h, 0FF000000h dd 0FF00h, 0FF000000h, 00h, 00h dd 0FFFFFF00h, 0FFFFFFFFh, 0FF00h, 00h dd 0FF00h, 00h, 0FF00h, 00h dd 0FFFFFF00h, 0FFFFh, 0FF00h, 00h dd 0FF00h, 00h, 0FF00h, 00h dd 0FFFFFF00h, 0FFFFFFFFh, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 0FFFF0000h, 0FFFFFFh, 0FF00h, 0FF000000h dd 0FF00h, 0FF000000h, 0FF00h, 0FF000000h dd 0FF00h, 0FF000000h, 0FF00h, 0FF000000h dd 0FF00h, 0FF000000h, 0FF00h, 0FF000000h dd 0FFFF0000h, 0FFFFFFh, 00h, 00h dd 0FF00h, 0FF000000h, 0FF00h, 0FF000000h dd 0FF00h, 0FF000000h, 0FF00h, 0FF000000h dd 0FF00h, 0FF000000h, 0FF00h, 0FF000000h dd 0FF0000h, 0FF0000h, 0FF000000h, 0FF00h dd 00h, 0FFh, 00h, 00h dd 0FFFFFF00h, 0FFFFFFh, 0FF00h, 0FF000000h dd 0FF00h, 0FF000000h, 0FF00h, 0FF000000h dd 0FFFFFF00h, 0FFFFFFh, 0FF00h, 0FFh dd 0FF00h, 0FF00h, 0FF00h, 0FF0000h dd 0FF00h, 0FF000000h, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 0FFFF0000h, 0FFFFFFh, 00h, 00h dd 00h, 00h, 00h, 00h dd 00h, 00h, 00h, 00h dd 0FFFFFF00h, 0FFFFFFh, 0FF00h, 0FF000000h dd 0FF00h, 0FF000000h, 0FF00h, 0FF000000h dd 0FFFFFF00h, 0FFFFFFh, 0FF00h, 00h dd 0FF00h, 00h, 0FF00h, 00h dd 0FF00h, 00h, 00h, 00h dd 0FFFF0000h, 0FFFFFFh, 0FF00h, 0FF000000h dd 0FF00h, 00h, 0FF00h, 00h dd 0FFFF0000h, 0FFFFFFh, 00h, 0FF000000h dd 00h, 0FF000000h, 0FF00h, 0FF000000h dd 0FFFF0000h, 0FFFFFFh, 00h, 00h dd 0FFFF0000h, 0FFFFFFh, 0FF00h, 0FF000000h dd 0FF00h, 00h, 0FF00h, 00h dd 0FF00h, 00h, 0FF00h, 00h dd 0FF00h, 00h, 0FF00h, 0FF000000h dd 0FFFF0000h, 0FFFFFFh, 00h, 00h dd 0FFFFFF00h, 0FFFFFFFFh, 00h, 0FFh dd 00h, 0FFh, 00h, 0FFh dd 00h, 0FFh, 00h, 0FFh dd 00h, 0FFh, 00h, 0FFh dd 00h, 0FFh, 00h, 00h dd 0FFFF0000h, 0FFFFFFh, 00h, 0FFh dd 00h, 0FFh, 00h, 0FFh dd 00h, 0FFh, 00h, 0FFh dd 00h, 0FFh, 00h, 0FFh dd 0FFFF0000h, 0FFFFFFh, 00h, 00h dd 0FF00h, 0FF000000h, 0FF00h, 0FF000000h dd 0FF00h, 0FF000000h, 0FF00h, 0FF000000h dd 0FF00h, 0FF000000h, 0FF00h, 0FF000000h dd 0FF00h, 0FF000000h, 0FF00h, 0FF000000h dd 0FFFF0000h, 0FFFFFFh, 00h, 00h game_status: push es push eax push cx push edx push ebx push si push di mov es, _scr_seg mov di, 64000-8*320 mov cx, 320*8/2 xor ax, ax rep stosw mov di, (160-18*8/2)+190*320 ; Score per diamond. mov al, _level_points call game_3digit ; Diamond icon. mov al, 10 call game_digit mov byte ptr es: [di+323], 0 mov byte ptr es: [di+325], 0 mov byte ptr es: [di+4], 0 mov al, byte ptr es: [di+7+4*320] mov byte ptr es: [di+8+5*320], al add di, 10 ; Number of diamonds left. mov al, _level_dias call game_3digit ; Score. mov eax, _score mov ebx, 10 mov cx, 6 game_status_scorecalc: xor edx, edx div ebx push dx loop game_status_scorecalc mov cx, 6 game_status_scoreblit: pop ax add di, 8 call game_digit loop game_status_scoreblit add di, 8 ; Time. add di, 8 mov al, _level_time call game_3digit pop di pop si pop ebx pop edx pop cx pop eax pop es ret game_3digit: mov dl, 10 xor ah, ah div dl push ax xor ah, ah div dl push ax xor ah, ah div dl mov al, ah call game_digit add di, 8 pop ax mov al, ah call game_digit add di, 8 pop ax mov al, ah call game_digit add di, 8 ret ; G A M E . O V E R . - . P R E S S . S P A C E _game_gameover db 11,12,13,14,15,16,17,14,18,15,19,15,20,18,14,21,21,15,21,20,12,22,14,-1 game_gameover: push es push ax push cx push bx push di mov es, _scr_seg mov di, 64000-8*320 mov cx, 320*8/2 xor ax, ax rep stosw xor bx, bx mov cx, 23 mov di, (160-23*8/2)+190*320 game_gameover_loop: mov al, _game_gameover[bx] call game_digit inc bx add di, 8 loop game_gameover_loop pop di pop bx pop cx pop ax pop es ret ; T I M E . O U T . - . P R E S S . S P A C E _game_timeout db 23,24,13,14,15,16,25,23,15,19,15,20,18,14,21,21,15,21,20,12,22,14,-1 game_timeout: push es push ax push cx push bx push di mov es, _scr_seg mov di, 64000-8*320 mov cx, 320*8/2 xor ax, ax rep stosw xor bx, bx mov cx, 22 mov di, (160-22*8/2)+190*320 game_timeout_loop: mov al, _game_timeout[bx] call game_digit inc bx add di, 8 loop game_timeout_loop pop di pop bx pop cx pop ax pop es ret game_digit: push eax push cx push dx push ebx push si push di mov dx, 80 xor ah, ah mul dx mov si, ax add si, offset _game_digits ; Shadow. mov eax, cs: [si] mov ebx, cs: [si+4] not eax not ebx and es: [di], eax and es: [di+4], ebx mov eax, cs: [si+8] mov ebx, cs: [si+12] not eax not ebx and es: [di+320], eax and es: [di+324], ebx ; Digit. mov cx, 10 game_digit_loop: mov eax, cs: [si] mov ebx, cs: [si+4] or es: [di+320], eax or es: [di+324], ebx add si, 8 add di, 320 loop game_digit_loop pop di pop si pop ebx pop dx pop cx pop eax ret ;---- Game_Map. game_map: push es push ax push cx push bx push di mov es, _scr_seg mov bx, offset _level mov di, (320-64)+(200-64)*320 mov ch, 64 game_map_yloop: mov cl, 64 game_map_xloop: mov al, cs: [bx] cmp al, 0 je game_map_ok mov al, -1 game_map_ok: stosb inc bx dec cl jnz game_map_xloop add di, 320-64 dec ch jnz game_map_yloop pop di pop bx pop cx pop ax pop es ret ;---- Update. ; Copies SCR_SEG onto screen. update: push ax push dx mov dx, 3DAh update_vrt: in al, dx test al, 8 jz update_vrt pop dx pop ax push ds push es push ecx push esi push edi mov ds, _scr_seg mov es, _graph_seg xor esi, esi xor edi, edi mov ecx, 16000 cld rep movsd pop edi pop esi pop ecx pop es pop ds ret ;---- Blit. ; AL - Character. ; ES:DI - Destination. blit: push ds push es push eax push ebx push cx push si push di ; Convert character to sprite number then to offset. xor ah, ah mov si, ax mov ah, byte ptr _sprite_table[si] xor al, al mov si, ax ; Blit sprite. mov ds, _sprite_seg mov es, _scr_seg mov ah, al mov cx, 16 blit_loop: ; AND mask. mov eax, [si+32000] mov ebx, [si+32004] and es: [di], eax and es: [di+4], ebx mov eax, [si+32008] mov ebx, [si+32012] and es: [di+8], eax and es: [di+12], ebx ; XOR mask. mov eax, [si] mov ebx, [si+4] xor es: [di], eax xor es: [di+4], ebx mov eax, [si+8] mov ebx, [si+12] xor es: [di+8], eax xor es: [di+12], ebx add si, 16 add di, 320 loop blit_loop pop di pop si pop cx pop ebx pop eax pop es pop ds ret ;---- EDITOR ------------------------------------------------------------------; ;---- Editor. editor: call editor_logon call editor_main call editor_logoff ret ;---- Editor_Logon. editor_logon: ret ;---- Editor_Main. editor_main: ret ;---- Editor_Logoff. editor_logoff: ret ;---- LIBRARY ROUTINES v0.2 ---------------------------------------------------; ;---- GetKey ; Returns key pressed in AL, or zero in AL and scan code in AH or zero in AX if ; no key in buffer. getkey: mov ah, 0Bh int 21h cmp al, 0FFh je getkey_get xor ax, ax ret getkey_get: mov ah, 7 int 21h cmp al, 0 je getkey_ext xor ah, ah ret getkey_ext: mov ah, 7 int 21h mov ah, al xor al, al ret ;---- PrintC ; AH = attribute ; CS:IP = string ; ES:DI = destination _printc_si dw 0000h printc: mov _printc_si, si pop si push ax printc_loop: mov al, cs: [si] inc si or al, al je printc_end cmp al, 255 jne printc_notattr mov ah, cs: [si] inc si jmp printc_loop printc_notattr: stosw jmp printc_loop printc_end: pop ax push si mov si, _printc_si ret ;---- Print ; CS:IP = text. _print_si dw 0000h print: mov _print_si, si pop si push ax print_loop: mov al, cs: [si] inc si or al, al je print_end int 29h jmp print_loop print_end: pop ax push si mov si, _print_si ret ;---- PrintNumC ; AH = attribute ; CH = base ; CL = digits ; EDX = Number ; ES:DI = destination _printnumc_table db '0123456789ABCDEF' _printnumc_attr db 00h _printnumc_len db 00h _printnumc_base db 00h printnumc: ; Valiate input. cmp ch, 0 je printnumc_end cmp ch, 16 ja printnumc_end cmp cl, 0 je printnumc_end cmp cl, 8 ja printnumc_end push eax push ecx push edx push ebx mov _printnumc_attr, ah mov _printnumc_len, cl mov _printnumc_base, ch xor ch, ch mov eax, edx printnumc_calc: xor ebx, ebx mov bl, _printnumc_base xor edx, edx div ebx xor bh, bh mov bl, dl mov dh, _printnumc_attr mov dl, _printnumc_table[bx] push dx loop printnumc_calc mov cl, _printnumc_len printnumc_print: pop ax stosw loop printnumc_print pop ebx pop edx pop ecx pop eax printnumc_end: ret ;---- PrintNum ; CH = base ; CL = digits ; EDX = Number _printnum_table db '0123456789ABCDEF' _printnum_len db 00h _printnum_base db 00h printnum: ; Valiate input. cmp ch, 0 je printnum_end cmp ch, 16 ja printnum_end cmp cl, 0 je printnum_end cmp cl, 8 ja printnum_end push eax push ecx push edx push ebx mov _printnum_len, cl mov _printnum_base, ch xor ch, ch mov eax, edx printnum_calc: xor ebx, ebx mov bl, _printnum_base xor edx, edx div ebx xor bh, bh mov bl, dl xor dh, dh mov dl, _printnum_table[bx] push dx loop printnum_calc mov cl, _printnum_len printnum_print: pop ax int 29h loop printnum_print pop ebx pop edx pop ecx pop eax printnum_end: ret ;---- END OF CODE -------------------------------------------------------------; END