home *** CD-ROM | disk | FTP | other *** search
/ Media Share 9 / MEDIASHARE_09.ISO / progmisc / hellsrc.zip / P0.ASM < prev    next >
Assembly Source File  |  1993-10-26  |  26KB  |  912 lines

  1.         .386p
  2. code32  segment para public use32
  3.         assume cs:code32, ds:code32
  4.  
  5. include pmode.inc
  6. include gsp669.inc
  7. include vect3.inc
  8. include kb.inc
  9. include v.inc
  10.  
  11. public  _p0
  12.  
  13. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  14. ; DATA
  15. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  16. align 4
  17. CROSSPRLEN      = 40960
  18. TITLESPRLEN     = 48640
  19. FIRENUM         = 2000h                 ; must be perfect 2^x integer
  20. MORPHNUM        = 4167h                 ; coded around this number
  21. MORPHPRECALC    = 16e8h
  22. SKULLMASKLEN    = 912
  23. SKULLJAWSPRLEN  = 7776
  24. SKULLSCRIPTLEN  = 300h
  25. SKULLSIDELEN    = 3200h
  26.  
  27. MUZLOC4         = 0100h
  28. MUZLOC0         = 0200h
  29. MUZLOC1         = 0300h
  30. MUZLOC2         = 0400h
  31. MUZLOC3         = 0500h
  32. MUZLOC5         = 0600h
  33.  
  34. dpalptr0        dd      ?               ; cross palette ptr
  35. dpalptr1        dd      ?               ; fire palette ptr
  36. dpalptr2        dd      ?               ; title palette ptr
  37. dpalptr3        dd      ?               ; skull palette ptr
  38. skullsidepalptr dd      ?               ; skull column palette ptr
  39. crosssprptr     dd      ?               ; cross sprite ptr
  40. titlesprptr     dd      ?               ; title sprite ptr
  41. titletxtsprptr  dd      ?               ; initial 'Welcome to...' sprite ptr
  42. skulljawsprptr  dd      ?               ; skull jaw sprite ptr
  43. skullmaskptr    dd      ?               ; skull overlap mask
  44. skullscriptptr  dd      ?               ; skull mouth movements script
  45. skullsidesprptr dd      ?               ; skull side column sprite ptr
  46.  
  47. fireptr         dd      ?               ; fire data ptr
  48. firerelptr0     dd      ?               ; fire cross release locs ptr
  49. firerelptr1     dd      ?               ; fire pentagram release locs ptr
  50.  
  51. morphptr        dd      ?               ; morph data ptr
  52. morphobufptr    dd      ?,?             ; morph pixel clear buffer ptrs
  53. morphstblptr    dd      ?               ; morph scale table ptr
  54.  
  55. skullvidbufptr  dd      ?               ; ptr to skull jaw buffer
  56. skullsideptr    dd      ?               ; ptr to column to put on sides
  57.  
  58. convdeltaptr    dd      ?               ; ptr to convection 2 wave sum deltas
  59. convsinewaveptr dd      ?               ; ptr to sine wave for convection calc
  60.  
  61. p0m0fptbl       dd      p0m0fp0,p0m0fp1,p0m0fp2,p0m0fp3
  62. p0m0rout        dd      p0m0r0          ; routine jumped to after every p0m0
  63.  
  64. trnsptr         dd      ?,?             ; transition video ptrs
  65.  
  66. firerelindex    dw      0               ; fire release next index
  67. morphloopcntr   dw      ?               ; morph put loop counter
  68.  
  69. vrtcntr         db      0, 0            ;                                    |
  70. ovrtcntr        db      0, 0            ;                                    |
  71.  
  72. morphindex      db      0               ; morph index
  73. morphpagetbl    db      80h,0c0h        ; table for morph pages
  74. fireconvindex   db      0               ; fire convection starting index
  75. fireconvwave    db      0,0,0,0         ; fire convection wave locations
  76. firepagetbl     db      0c0h,80h        ; table for fire pages
  77. firepageindex   db      0               ; current page index
  78.  
  79. trnscount       db      48              ; transition routine loop counter
  80.  
  81. skullburnpal    db      63,63,0, 63,32,0, 63,0,0, 43,0,0, 23,0,0, 0,0,0
  82. xddtbl          db      -4,-4,-3,-2,-1,0,1,2,3,4,4
  83. yddtbl          db      -8,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,2
  84.  
  85. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  86. ; CODE
  87. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  88.  
  89. ;═════════════════════════════════════════════════════════════════════════════
  90. p0ir1:                                  ; transition to next part IRQ routine
  91.         cld
  92.         push ecx esi edi
  93.         mov esi,trnsptr[0]
  94.         lea edi,[esi+16]
  95.         lea eax,[esi+1]
  96.         mov trnsptr[0],eax
  97.         call p0ir1r0
  98.         mov esi,trnsptr[4]
  99.         lea edi,[esi-16]
  100.         lea eax,[esi-1]
  101.         mov trnsptr[4],eax
  102.         call p0ir1r0
  103.         dec trnscount
  104.         jnz short p0ir1d
  105.         mov _vrtrout,offset _ret
  106. p0ir1d:
  107.         pop edi esi ecx
  108.         ret
  109. ;-----------------------------------------------------------------------------
  110. p0ir1r0:                                ; copy a section of vidmem
  111.         mov ecx,25
  112. p0ir1r0l0:
  113. irp temp,<0,1,2,3>
  114.         mov ah,[esi+&temp*80]
  115.         mov [edi+&temp*80],ah
  116. endm
  117.         add edi,80*4
  118.         add esi,80*4
  119.         dec ecx
  120.         jnz p0ir1r0l0
  121.         ret
  122.  
  123. ;═════════════════════════════════════════════════════════════════════════════
  124. p0ir0:                                  ; IRQ routine to set first 64 colors
  125.         cld
  126.         push ecx esi
  127.         mov dx,3c8h
  128.         xor al,al
  129.         out dx,al
  130.         mov esi,_cpalptr
  131.         inc edx
  132.         mov ecx,64*3
  133.         rep outsb
  134.         inc word ptr vrtcntr
  135.         pop esi ecx
  136.         ret
  137.  
  138. ;═════════════════════════════════════════════════════════════════════════════
  139. _p0:
  140.         mov eax,'p00d'                  ; load and allocate data
  141.         call _loaddata
  142.         mov dpalptr0,eax
  143.         add eax,64*3
  144.         mov dpalptr1,eax
  145.         add eax,64*3
  146.         mov dpalptr2,eax
  147.         add eax,64*3
  148.         mov crosssprptr,eax
  149.         add eax,CROSSPRLEN
  150.         mov titlesprptr,eax
  151.         add eax,TITLESPRLEN
  152.         mov firerelptr0,eax
  153.         add eax,FIRENUM*2
  154.         mov firerelptr1,eax
  155.         add eax,FIRENUM*2
  156.         mov convsinewaveptr,eax
  157.         add eax,256
  158.         mov titletxtsprptr,eax
  159.  
  160.         mov eax,FIRENUM*6+20000h+10000h
  161.         call _gethimem
  162.         mov fireptr,eax
  163.         add eax,FIRENUM*6
  164.         mov dword ptr [p0m0l1m0-4],eax
  165.         add eax,20000h
  166.         mov convdeltaptr,eax
  167.  
  168.         mov eax,'muz0'                  ; load up first muzik
  169.         call _loadmuzik
  170.  
  171.         mov edi,_cpalptr                ; set current pal
  172.         xor eax,eax
  173.         mov ecx,16*3
  174.         rep stosd
  175.         mov _vrtrout,offset p0ir0       ; set palette setting IRQ routine
  176.  
  177.         mov dx,3d4h                     ; set CRTC to high byte of page
  178.         @outb 0ch
  179.  
  180.         mov edi,dword ptr [p0m0l1m0-4]  ; set up fire dot location xlat tbl
  181.         mov edx,8080h
  182. p0i0l0:
  183.         movzx ebx,dh
  184.         xor bl,80h
  185.         imul ebx,320
  186. p0i0l1:
  187.         movsx eax,dl
  188.         lea eax,[eax+ebx+160]
  189.         shr eax,2
  190.         mov [edi+edx*2],ax
  191.         inc dl
  192.         jno p0i0l1
  193.         inc dh
  194.         jno p0i0l0
  195.  
  196.         mov ebp,fireptr                 ; set up initial fire data
  197.         lea edi,[ebp+((FIRENUM-1)*6)]
  198.         xor esi,esi
  199.         mov ecx,FIRENUM/63
  200.         mov ebx,0fd000000h
  201.         xor al,al
  202. p0i0l2:
  203.         mov edx,firerelptr0
  204.         mov bx,[edx+esi]
  205.         add si,2
  206.         and si,(FIRENUM-1)*2
  207.         inc eax
  208.         mov edx,edi
  209. p0i0l3:
  210.         mov [edx],ebx
  211.         mov [edx+4],al
  212.         sub edx,(FIRENUM/63)*6
  213.         cmp edx,ebp
  214.         jae p0i0l3
  215.         add al,12
  216.         and al,63
  217.         sub edi,6
  218.         loop p0i0l2
  219.  
  220.         mov edi,convdeltaptr            ; set up convection delta table
  221.         mov esi,convsinewaveptr
  222.         xor ecx,ecx
  223.         xor ebx,ebx
  224. p0i0l4:
  225.         mov al,[esi+ebx]
  226.         add al,[esi+ecx]
  227.         cmp al,42
  228.         setae al
  229.         shl al,1
  230.         stosb
  231.         inc bl
  232.         jnz p0i0l4
  233.         inc cl
  234.         jnz p0i0l4
  235.  
  236. waitl0:                                 ; wait for clear pal
  237.         cmp vrtcntr,0
  238.         je waitl0
  239.  
  240. ;─────────────────────────────────────────────────────────────────────────────
  241.         mov ebx,80*56                   ; put initial 'Welcome to...'
  242.         mov esi,titletxtsprptr
  243.         mov edi,_vidptr0
  244.         add edi,80*87
  245.         call _pbmodex
  246.  
  247.         call _gsp669_play               ; start muzik playing
  248.  
  249.         mov esi,dpalptr1                ; fade text in
  250.         mov al,1
  251. waitl3:
  252.         call p0slidepal
  253.         jnc waitl3
  254.  
  255. ;-----------------------------------------------------------------------------
  256. muzwaitl2:                              ; wait for muzik meta point
  257.         cmp _muzloc,MUZLOC4
  258.         jb muzwaitl2
  259. ;-----------------------------------------------------------------------------
  260.  
  261.         mov esi,_clearpalptr            ; fade text out
  262.         mov al,1
  263. waitl5:
  264.         call p0slidepal
  265.         jnc waitl5
  266.  
  267.         mov ebx,80*128                  ; put cross and title pics to vidmem
  268.         mov esi,crosssprptr
  269.         mov edi,_vidptr0
  270.         add edi,80*62
  271.         call _pbmodex
  272.         mov ebx,80*152
  273.         mov esi,titlesprptr
  274.         mov edi,_vidptr1
  275.         add edi,80*35
  276.         call _pbmodex
  277.  
  278.         mov esi,dpalptr0                ; fade cross in
  279.         mov al,1
  280. waitl1:
  281.         call p0slidepal
  282.         jnc waitl1
  283.  
  284. ;-----------------------------------------------------------------------------
  285. muzwaitl0:
  286.         cmp _muzloc,MUZLOC0
  287.         jb muzwaitl0
  288. ;-----------------------------------------------------------------------------
  289.  
  290.         mov edi,_cpalptr                ; set all white palette
  291.         mov eax,3f3f3f3fh
  292.         mov ecx,16*3
  293.         rep stosd
  294.  
  295.         mov al,vrtcntr                  ; ready retrace counter for fade
  296.         mov ovrtcntr,al
  297.  
  298. ;─────────────────────────────────────────────────────────────────────────────
  299. ; Main fire loop
  300. p0m0:
  301.         movzx eax,firepageindex         ; flip page index and get ptrs
  302.         mov ebp,_vidptr2[eax*4]
  303.         xor al,1
  304.         mov firepageindex,al
  305.  
  306.         lea edi,[ebp+6]                 ; clear old fire dots
  307.         mov dx,3c5h
  308.         @outb 0fh
  309.         xor ecx,ecx
  310.         mov bl,50
  311.         xor eax,eax
  312. p0m0l0:
  313. rept 4
  314.         mov cl,11h
  315.         rep stosd
  316.         add edi,0ch
  317. endm
  318.         dec bl
  319.         jnz p0m0l0
  320.  
  321.         mov esi,fireptr                 ; put all fire dots
  322.         mov edi,FIRENUM
  323. p0m0l1:
  324.         mov ax,[esi]
  325.         mov bx,[esi+2]
  326.         mov cl,[esi+4]
  327.         dec cl
  328.         jz p0m0l1r0
  329. p0m0l1r0r:
  330.         add al,bl
  331.         jo p0m0l1r0
  332.         add ah,bh
  333.         jo p0m0l1r0
  334.         mov [esi+4],cl
  335.         mov [esi],ax
  336.         movzx ebx,word ptr [eax*2+2beaddedh]
  337. p0m0l1m0:
  338.         add ebx,ebp
  339.         and eax,3
  340.         jmp p0m0fptbl[eax*4]
  341. p0m0fpr:
  342.         add esi,6
  343.         dec edi
  344.         jnz p0m0l1
  345.  
  346.         add fireconvwave[0],17          ; move convection waves
  347.         add fireconvwave[1],27
  348.         add fireconvwave[2],11
  349.         add fireconvwave[3],19
  350.  
  351.         movzx eax,fireconvindex         ; apply convection currents
  352.         inc eax
  353.         and al,3
  354.         mov fireconvindex,al
  355.         lea eax,[eax*2+eax]
  356.         lea esi,[esi+eax*2-FIRENUM*6]
  357.         mov edi,convdeltaptr
  358.         mov ebp,FIRENUM/4
  359. p0m0l2:
  360.         mov dx,[esi]
  361.         mov cx,word ptr fireconvwave[0]
  362.         add cl,dl
  363.         add ch,dl
  364.         add ch,dh
  365.         mov al,[edi+ecx]
  366.         movsx ebx,byte ptr [esi+2]
  367.         mov bl,xddtbl[eax+ebx+4]
  368.         mov [esi+2],bl
  369.         mov cx,word ptr fireconvwave[2]
  370.         add cl,dh
  371.         add ch,dh
  372.         add ch,dl
  373.         mov al,[edi+ecx]
  374.         movsx ebx,byte ptr [esi+3]
  375.         mov bl,yddtbl[eax+ebx+8]
  376.         mov [esi+3],bl
  377.         add esi,24
  378.         dec ebp
  379.         jnz p0m0l2
  380.  
  381.         mov al,ovrtcntr                 ; wait past 2 retraces and calc rate
  382. p0m0l3:
  383.         mov ah,vrtcntr
  384.         cmp al,ah
  385.         je p0m0l3
  386.         mov ovrtcntr,ah
  387.         sub ah,al
  388.         inc ah
  389.  
  390.         mov dx,3d5h                     ; set next displayed page
  391.         movzx ebx,firepageindex
  392.         @outb firepagetbl[ebx]
  393.  
  394.         mov al,ah
  395.         jmp p0m0rout                    ; do approptiate routiune
  396.  
  397. ;─────────────────────────────────────────────────────────────────────────────
  398. p0i1:
  399.         mov esi,dpalptr2                ; fade title pic in
  400.         mov al,1
  401. waitl2:
  402.         call p0slidepal
  403.         jnc waitl2
  404.  
  405.         mov eax,_ohimembase             ; load and allocate next data
  406.         mov _himembase,eax
  407.         mov eax,'p01d'
  408.         call _loaddata
  409.         mov dpalptr3,eax
  410.         add eax,64*3
  411.         mov morphptr,eax
  412.  
  413.         mov eax,MORPHNUM*2*2+639*2*128
  414.         call _gethimem
  415.         mov morphobufptr[0],eax
  416.         add eax,MORPHNUM*2
  417.         mov morphobufptr[4],eax
  418.         add eax,MORPHNUM*2
  419.         mov morphstblptr,eax
  420.  
  421.         mov edi,_vidptr0                ; clear pages 0, 2, and 3
  422.         mov dx,3c5h
  423.         @outb 0fh
  424.         mov ecx,1000h
  425.         xor eax,eax
  426.         rep stosd
  427.         add edi,4000h
  428.         mov ecx,2000h
  429.         rep stosd
  430.  
  431.         mov edi,morphstblptr            ; calculate scale table
  432.         xor ebx,ebx
  433. p0i1l0:
  434.         mov ecx,-319
  435.         inc ebx
  436. p0i1l1:
  437.         mov eax,ebx
  438.         imul eax,ecx
  439.         sar eax,7
  440.         stosw
  441.         inc ecx
  442.         cmp ecx,320
  443.         jl p0i1l1
  444.         cmp bl,80h
  445.         jb p0i1l0
  446.  
  447.         mov edi,morphobufptr[0]         ; set up title pic fade to palette
  448.         mov esi,edi
  449.         mov dword ptr [edi],0
  450.         add edi,3
  451.         mov al,63
  452.         mov ecx,63*3
  453.         rep stosb
  454.         mov ecx,MORPHNUM-16*3           ; clear rest of morph buffers
  455.         xor eax,eax
  456.         rep stosd
  457.  
  458. ;-----------------------------------------------------------------------------
  459. muzwaitl1:                              ; wait for muzik meta point
  460.         cmp _muzloc,MUZLOC3
  461.         jb muzwaitl1
  462. ;-----------------------------------------------------------------------------
  463.  
  464.         mov al,1                        ; slide to single skull color palette
  465. waitl6:
  466.         call p0slidepal
  467.         jnc waitl6
  468.  
  469.         mov dword ptr vrtcntr,0         ; set up for proper pal shift
  470.  
  471. ;─────────────────────────────────────────────────────────────────────────────
  472. ; Title to skull morph main loop
  473. p0m1:
  474.         movzx eax,morphindex            ; inc morph index and get ptrs
  475.         xor al,1
  476.         mov morphindex,al
  477.         mov ebp,_vidptr2[eax*4]
  478.  
  479.         mov esi,morphobufptr[eax*4]     ; erase old morph pixels
  480.         mov edi,esi
  481.         mov dx,3c5h
  482.         @outb 0fh
  483.         mov ecx,MORPHNUM/18
  484.         xor bl,bl
  485. p0m1l0:
  486. irp temp,<0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17>
  487.         mov ax,[esi+&temp*2]
  488.         mov byte ptr [ebp+eax],bl
  489. endm
  490.         add esi,36
  491.         dec ecx
  492.         jnz p0m1l0
  493.         mov ax,[esi]
  494.         mov byte ptr [ebp+eax],bl
  495.         mov ax,[esi+2]
  496.         mov byte ptr [ebp+eax],bl
  497.         mov ax,[esi+4]
  498.         mov byte ptr [ebp+eax],bl
  499.  
  500.         mov ax,word ptr vrtcntr         ; put frame of morph pixels
  501.         or ah,ah
  502.         jnz p0i2
  503.         shr al,1
  504.         push ax
  505.         call p0m1r0
  506.  
  507.         mov dx,3d5h                     ; set next displayed page
  508.         movzx ebx,morphindex
  509.         @outb morphpagetbl[ebx]
  510.         mov al,vrtcntr
  511.         mov ovrtcntr,al
  512.  
  513.         mov esi,dpalptr3                ; slide to skull palette
  514.         pop ax
  515.         xchg ovrtcntr[1],al
  516.         sub al,ovrtcntr[1]
  517.         neg al
  518.         call p0slidepal
  519.  
  520.         jmp p0m1
  521.  
  522. ;─────────────────────────────────────────────────────────────────────────────
  523. p0i2:
  524.         mov esi,dpalptr3                ; set destination palette for sure
  525.         mov edi,_cpalptr
  526.         mov ecx,16*3
  527.         rep movsd
  528.  
  529.         mov ebp,_vidptr0                ; put full skull to page 0
  530.         mov edi,morphobufptr[0]
  531.         mov eax,7fh
  532.         call p0m1r0
  533.  
  534.         mov dx,3d5h                     ; flip to page 0
  535.         @outb 0
  536.  
  537.         mov eax,_ohimembase             ; load and allocate next data
  538.         mov _himembase,eax
  539.         mov eax,'p02d'
  540.         call _loaddata
  541.         mov skullmaskptr,eax
  542.         add eax,SKULLMASKLEN
  543.         mov skulljawsprptr,eax
  544.         add eax,SKULLJAWSPRLEN
  545.         mov skullscriptptr,eax
  546.         add eax,SKULLSCRIPTLEN
  547.         mov skullsidesprptr,eax
  548.         add eax,SKULLSIDELEN
  549.         mov skullsidepalptr,eax
  550.  
  551.         mov esi,skullsidepalptr         ; set side column palette
  552.         mov ecx,20h
  553.         mov al,40h
  554.         mov ah,vrtcntr                  ; change pal on vertical retrace
  555. waitl7:
  556.         cmp ah,vrtcntr
  557.         je waitl7
  558.         call _setcpal
  559.  
  560.         mov edi,_vidptr1                ; clear pages 1, 2, and 3
  561.         mov dx,3c5h
  562.         @outb 0fh
  563.         mov ecx,3000h
  564.         xor eax,eax
  565.         rep stosd
  566.  
  567.         mov edi,_vidptr0                ; put skull side column to vidmem
  568.         add edi,0ed28h
  569.         mov skullsideptr,edi
  570.         mov esi,skullsidesprptr
  571.         mov al,1
  572. p0i2l3:
  573.         out dx,al
  574.         mov ecx,0320h
  575.         rep movsd
  576.         sub edi,0c80h
  577.         shl al,1
  578.         and al,0fh
  579.         jnz p0i2l3
  580.  
  581.         mov edi,_vidptr0                ; put 23 heights of skull jaw
  582.         add edi,3e80h
  583.         mov skullvidbufptr,edi
  584.         mov ebx,58*24
  585.         mov ebp,23
  586. p0i2l0:
  587.         mov esi,skulljawsprptr
  588.         add esi,81*24
  589.         sub esi,ebx
  590.         @outb 1
  591.         mov ecx,ebx
  592.         rep movsb
  593.         add esi,81*24
  594.         sub esi,ebx
  595.         sub edi,ebx
  596.         @outb 2
  597.         mov ecx,ebx
  598.         rep movsb
  599.         add esi,81*24
  600.         sub esi,ebx
  601.         sub edi,ebx
  602.         @outb 4
  603.         mov ecx,ebx
  604.         rep movsb
  605.         add esi,81*24
  606.         sub esi,ebx
  607.         sub edi,ebx
  608.         @outb 8
  609.         mov ecx,ebx
  610.         rep movsb
  611.         sub edi,ebx
  612.         add edi,81*24
  613.         add ebx,24
  614.         dec ebp
  615.         jnz p0i2l0
  616.  
  617.         mov dl,0ceh                     ; write mode 1, vid->vid copy
  618.         @outw 4105h
  619.  
  620.         mov edi,skullvidbufptr          ; put skull on top of jaw
  621.         mov dl,0c5h
  622.         mov bh,23
  623. p0i2l1:
  624.         mov ebp,skullmaskptr
  625.         mov esi,_vidptr0
  626.         add esi,245ah
  627.         mov bl,38
  628. p0i2l1l0:
  629.         mov ecx,24
  630. p0i2l1l1:
  631.         mov al,[ebp]
  632.         out dx,al
  633.         movsb
  634.         inc ebp
  635.         loop p0i2l1l1
  636.         add esi,56
  637.         dec bl
  638.         jnz p0i2l1l0
  639.         add edi,43*24
  640.         dec bh
  641.         jnz p0i2l1
  642.  
  643.         @outb 0fh                       ; full vidmem bitmask
  644.  
  645. ;-----------------------------------------------------------------------------
  646. muzwaitl3:                              ; wait for muzik meta point
  647.         cmp _muzloc,MUZLOC5
  648.         jb muzwaitl3
  649. ;-----------------------------------------------------------------------------
  650.  
  651.         mov eax,'muz1'                  ; load 'Woe to you... ' voice
  652.         call _loadmuzik
  653.  
  654.         call _gsp669_play               ; start voice
  655.  
  656. ;─────────────────────────────────────────────────────────────────────────────
  657. ; Skull speech main loop
  658. p0m2:
  659.         mov al,vrtcntr                  ; wait for vertical retrace
  660. p0m2l0:
  661.         cmp al,vrtcntr
  662.         je p0m2l0
  663.  
  664.         mov esi,skullscriptptr          ; put skull jaw according to muz loc
  665.         movzx eax,_muzloc
  666.         cmp ah,0ch
  667.         jae short p0i3
  668.         shl al,2
  669.         shr eax,2
  670.         movzx esi,byte ptr [esi+eax]
  671.         imul esi,798h
  672.         add esi,skullvidbufptr
  673.         mov edi,_vidptr0
  674.         add edi,245ah
  675.         mov al,81
  676. p0m2l1:
  677.         mov ecx,24
  678.         rep movsb
  679.         add edi,56
  680.         dec al
  681.         jnz p0m2l1
  682.  
  683.         call p0m2r0
  684.  
  685.         jmp p0m2
  686.  
  687. ;─────────────────────────────────────────────────────────────────────────────
  688. p0i3:
  689.         mov ebp,69
  690.         mov edx,_cpalptr
  691.         mov bl,12
  692. p0i3l0:
  693.         mov bh,4
  694. p0i3l0l0:
  695.         lea edi,[ebp*2+ebp]             ; slide skull palette towards burn
  696.         lea edi,[edi+edx-6*3]
  697.         mov esi,offset skullburnpal
  698.         mov ecx,18
  699.         call _slidebytes
  700.         mov word ptr [edx],0
  701.         mov byte ptr [edx+2],0
  702.  
  703.         call p0m2r0
  704.  
  705.         mov al,vrtcntr                  ; wait for vertical retrace
  706. p0i3l0l1:
  707.         cmp al,vrtcntr
  708.         je p0i3l0l1
  709.  
  710.         dec bh
  711.         jnz p0i3l0l0
  712.         sub edi,3
  713.         dec ebp
  714.         jnz p0i3l0
  715.  
  716.         mov eax,_vidptr0                ; set up transition retrace routine
  717.         add eax,80*100
  718.         mov trnsptr[0],eax
  719.         add eax,79-80*100
  720.         mov trnsptr[4],eax
  721.         mov _vrtrout,offset p0ir1
  722.  
  723.         call _gsp669_stop               ; shut off muzik
  724.         mov eax,_ohimembase             ; clean up high memory base ptr
  725.         mov _himembase,eax
  726.  
  727.         ret
  728.  
  729. ;─────────────────────────────────────────────────────────────────────────────
  730. p0m0l1r0:                               ; new fire dot
  731.         movzx eax,firerelindex
  732.         add ax,2
  733.         and ax,(FIRENUM-1)*2
  734.         mov firerelindex,ax
  735.         add eax,firerelptr0
  736.         movzx eax,word ptr [eax]
  737.         mov bx,0fd00h
  738.         mov [esi+2],bx
  739.         mov cl,63
  740.         jmp p0m0l1r0r
  741.  
  742. ;─────────────────────────────────────────────────────────────────────────────
  743. p0m0fp0:                                ; put fire dot mod 0
  744.         @outb 1
  745.         mov [ebx],cl
  746.         sub cl,10h
  747.         jc p0m0fpr
  748.         mov [ebx-80],cl
  749.         mov [ebx+80],cl
  750.         @outb 8
  751.         mov [ebx-1],cl
  752.         @outb 2
  753.         mov [ebx],cl
  754.         jmp p0m0fpr
  755. ;-----------------------------------------------------------------------------
  756. p0m0fp1:                                ; put fire dot mod 1
  757.         @outb 2
  758.         mov [ebx],cl
  759.         sub cl,10h
  760.         jc p0m0fpr
  761.         mov [ebx-80],cl
  762.         mov [ebx+80],cl
  763.         @outb 5
  764.         mov [ebx],cl
  765.         jmp p0m0fpr
  766. ;-----------------------------------------------------------------------------
  767. p0m0fp2:                                ; put fire dot mod 2
  768.         @outb 4
  769.         mov [ebx],cl
  770.         sub cl,10h
  771.         jc p0m0fpr
  772.         mov [ebx-80],cl
  773.         mov [ebx+80],cl
  774.         @outb 10
  775.         mov [ebx],cl
  776.         jmp p0m0fpr
  777. ;-----------------------------------------------------------------------------
  778. p0m0fp3:                                ; put fire dot mod 3
  779.         @outb 8
  780.         mov [ebx],cl
  781.         sub cl,10h
  782.         jc p0m0fpr
  783.         mov [ebx-80],cl
  784.         mov [ebx+80],cl
  785.         @outb 1
  786.         mov [ebx+1],cl
  787.         @outb 4
  788.         mov [ebx],cl
  789.         jmp p0m0fpr
  790.  
  791. ;─────────────────────────────────────────────────────────────────────────────
  792. p0m0r0:                                 ; just slide to fire palette
  793.         mov esi,dpalptr1
  794.         call p0slidepal
  795.         jnc p0m0
  796.         mov p0m0rout,offset p0m0r1
  797.         jmp p0m0
  798. ;-----------------------------------------------------------------------------
  799. p0m0r1:                                 ; wait for music to reach meta point
  800.         mov bl,vrtcntr
  801.         cmp bl,ovrtcntr
  802.         je p0m0r1
  803.         mov ovrtcntr,bl
  804.         cmp _muzloc,MUZLOC1
  805.         jb p0m0
  806.         mov eax,firerelptr1
  807.         mov firerelptr0,eax
  808.         mov p0m0rout,offset p0m0r2
  809.         jmp p0m0
  810. ;-----------------------------------------------------------------------------
  811. p0m0r2:                                 ; wait for music to reach meta point
  812.         mov bl,vrtcntr
  813.         cmp bl,ovrtcntr
  814.         je p0m0r2
  815.         mov ovrtcntr,bl
  816.         cmp _muzloc,MUZLOC2
  817.         jb p0m0
  818.  
  819.         mov edi,_cpalptr                ; set all white palette
  820.         mov eax,3f3f3f3fh
  821.         mov ecx,16*3
  822.         rep stosd
  823.  
  824.         @outb 40h                       ; set title page
  825.  
  826.         jmp p0i1                        ; go to title pic
  827.  
  828. ;─────────────────────────────────────────────────────────────────────────────
  829. p0m1r0:                                 ; draw morph pixels
  830.         imul eax,639*2
  831.         add eax,morphstblptr
  832.         add eax,319*2
  833.         mov dword ptr [p0m1r0l0m0-4],eax
  834.         mov dword ptr [p0m1r0l0m1-4],eax
  835.         mov esi,morphptr
  836.         mov ecx,MORPHNUM
  837.         jmp short $+2
  838. p0m1r0l0:
  839.         movsx edx,word ptr [esi]
  840.         movzx edx,word ptr [edx*2+2beaddedh]
  841. p0m1r0l0m0:
  842.         add dx,[esi+2]
  843.         movsx ebx,word ptr [esi+4]
  844.         movzx ebx,byte ptr [ebx*2+2beaddedh]
  845. p0m1r0l0m1:
  846.         add bl,[esi+6]
  847.         movzx eax,dl
  848.         and al,3
  849.         shr edx,2
  850.         lea ebx,[ebx*4+ebx]
  851.         lea ebx,[ebx*4]
  852.         lea ebx,[ebx*4+edx]
  853.         mov dx,3c5h
  854.         @outb _vidbitloc[eax]
  855.         mov al,[esi+7]
  856.         mov [ebp+ebx],al
  857.         mov [edi],bx
  858.         add edi,2
  859.         add esi,8
  860.         dec ecx
  861.         jnz p0m1r0l0
  862.         ret
  863.  
  864. ;─────────────────────────────────────────────────────────────────────────────
  865. p0m2r0:                                 ; put part of column growing on side
  866.         movzx eax,_muzloc
  867.         shl al,2
  868.         shr eax,4
  869.         sub al,18h
  870.         jc _ret
  871.         cmp al,0c7h
  872.         ja _ret
  873.         xor edi,edi
  874.         call p0m2r0r0
  875.         sub al,0c7h
  876.         neg al
  877.         mov edi,40h
  878. p0m2r0r0:
  879.         lea esi,[eax*4]
  880.         lea esi,[esi*4]
  881.         lea edi,[edi+esi*4]
  882.         lea edi,[edi+esi]
  883.         add edi,_vidptr0
  884.         add esi,skullsideptr
  885.         mov ecx,16
  886.         rep movsb
  887.         ret
  888.  
  889. ;─────────────────────────────────────────────────────────────────────────────
  890. ; Slide current palette towards destination and wait for retrace if necessary
  891. ; In:
  892. ;   AL - max value to change each color by
  893. ;   ESI -> destination palette
  894. ; Out:
  895. ;   CF=1 - finished sliding
  896. ;   CF=0 - not finished, at least one change made
  897. ;   BL,ECX,EDI - ?
  898. p0slidepal:
  899.         mov bl,vrtcntr
  900.         cmp bl,ovrtcntr
  901.         je p0slidepal
  902.         mov ovrtcntr,bl
  903.         mov bl,al
  904.         mov ecx,64*3
  905.         mov edi,_cpalptr
  906.         call _slidebytes
  907.         ret
  908.  
  909. code32  ends
  910.         end
  911.  
  912.