home *** CD-ROM | disk | FTP | other *** search
/ Media Share 9 / MEDIASHARE_09.ISO / progmisc / hellsrc.zip / V.ASM < prev    next >
Assembly Source File  |  1993-11-24  |  14KB  |  453 lines

  1.         .386p
  2. code32  segment para public use32
  3.         assume cs:code32, ds:code32
  4.  
  5. include pmode.inc
  6. include decode0.inc
  7. include file.inc
  8. include flib.inc
  9. include kb.inc
  10. include gs.inc
  11. include gsp669.inc
  12.  
  13. extrn   _p0:near, _p1:near, _p2:near, _p3:near
  14.  
  15. public    _vrtrout, _olomembase, _ohimembase, _vidbitloc, _vidbitloc2, _cpalptr
  16. public  _sel, _vidptr0, _vidptr1, _vidptr2, _vidptr3, _clearpalptr
  17.  
  18. public  _main, _vrtset, _loaddata, _loadmuzik, _slidebytes, _setcpal
  19.  
  20. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  21. ; DATA
  22. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  23. align 4
  24. _vrtrout        dd      _ret
  25. _olomembase     dd      ?               ; old low mem base
  26. _ohimembase     dd      ?               ; old high mem base
  27. _vidptr0        dd      ?               ; ptr to 0a0000h
  28. _vidptr1        dd      ?               ; ptr to 0a4000h
  29. _vidptr2        dd      ?               ; ptr to 0a8000h
  30. _vidptr3        dd      ?               ; ptr to 0ac000h
  31. _clearpalptr    dd      ?               ; ptr to 0c0h buffer of 0
  32. _cpalptr        dd      ?               ; ptr to 300h buffer for current pal
  33.  
  34. _sel            dw      3 dup(?)        ; allocated selectors
  35.  
  36. _vidbitloc      db      1,2,4,8         ; bitplane masks for bit numbers
  37. _vidbitloc2    db    11h,22h,44h,88h ; double bitplane masks
  38.  
  39. l8rmsg          db      'Have a nice life...$'
  40. errmsg0         db      'Please rename this file back to HELL.EXE!!!$'
  41. errmsg1         db      'Then you aint gonna see this demo...$'
  42. errmsg2         db      'Could not find a GUS!!!$'
  43. errmsg3         db      'You must have a GUS with at least 512k!!!$'
  44.  
  45. libfnm          db      'HELL.EXE',0
  46.  
  47. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  48. ; CODE
  49. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  50.  
  51. include modex.rt
  52. include mode60.rt
  53. include pbmodex.rt
  54. include pdosmsg.rt
  55. include psbm.rt
  56. include slidebyt.rt
  57.  
  58. include vrtime.m
  59. include end.m
  60.  
  61. ;═════════════════════════════════════════════════════════════════════════════
  62. ; Exit to DOS, In: EDX -> msg to put
  63. exit:
  64.         call _flcloselib                ; close library file
  65.         call _resetvrt                  ; reset system timer
  66. ;-----------------------------------------------------------------------------
  67. exit1:
  68.         call _gsp669_uninit             ; reset GUS 669 player
  69. ;-----------------------------------------------------------------------------
  70. exit0:
  71.         call _resetkb                   ; reset keyboard handler
  72.         mov v86r_ax,3                   ; text mode
  73.         mov al,10h
  74.         int 33h
  75.         mov edx,ebp
  76.         call _putdosmsg                 ; put message
  77.         jmp _exit
  78.  
  79. ;═════════════════════════════════════════════════════════════════════════════
  80. _main:
  81.         sti
  82.         mov eax,1000h+300h+0c0h         ; allocate some buffers
  83.         call _getlomem
  84.         mov _filebufloc,eax
  85.         mov _decode0ibufptr,eax
  86.         add eax,1000h
  87.         mov _cpalptr,eax
  88.         add eax,300h
  89.         mov _clearpalptr,eax
  90.         mov edi,eax                     ; clear '_clearpalptr' buffer
  91.         xor eax,eax
  92.         mov ecx,0c0h/4
  93.         rep stosd
  94.         mov edi,offset _sel             ; allocate selectors
  95.         mov ecx,3
  96. mainl0:
  97.         call _getselector
  98.         stosw
  99.         loop mainl0
  100.         call _initkb                    ; init keyboard handler
  101.         call _gs_find                   ; find and initialize a GUS
  102.         jnc short mainf0
  103.         call _gs_ask
  104.         mov ebp,offset errmsg1
  105.         jc exit0
  106. mainf0:
  107.         call _gsp669_init               ; init GUS 669 player
  108.         cmp _gusram,2
  109.         mov ebp,offset errmsg3
  110.         jb exit1
  111.         call _gs_test
  112.         mov ebp,offset errmsg2
  113.         jc exit0
  114.         call _initvrt                   ; init timer for vertical retrace
  115.         mov edx,offset libfnm           ; open library file
  116.         call _flopenlib
  117.         mov ebp,offset errmsg0
  118.         jc exit
  119.         call _mode60                    ; 60Hz tweaked mode
  120.         call _vrtset
  121.  
  122.         mov eax,_lomembase              ; store memory base ptrs
  123.         mov _olomembase,eax
  124.         mov eax,_himembase
  125.         mov _ohimembase,eax
  126.         @rlp eax,0a0000h                ; set video ptrs
  127.         mov _vidptr0,eax
  128.         add eax,4000h
  129.         mov _vidptr1,eax
  130.         add eax,4000h
  131.         mov _vidptr2,eax
  132.         add eax,4000h
  133.         mov _vidptr3,eax
  134.  
  135. ;-----------------------------------------------------------------------------
  136.         call _p0                        ; starting part, cross bursts into
  137.                                         ;  flames, title screen, skull speaks,
  138.                                         ;  penagram field transitions in
  139.         call _p1                        ; interfering pentagrams on field,
  140.                                         ;  b/w sinewave sum plasma, mirror
  141.                                         ;  transitions in
  142. ;       call __crapinit
  143.         call _p2                        ; warping faces in mirror, mirror
  144.                                         ;  zooms out
  145. ;       call __crapinit
  146.         call _p3                        ; rotating glass balls, bg falls away
  147.  
  148. ;-----------------------------------------------------------------------------
  149.         call _end                       ; put end piccy
  150.  
  151.         mov ebp,offset l8rmsg
  152.         jmp exit
  153.  
  154. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  155. ; Load compressed data into high memory and allocate it (also realign on 4)
  156. ; In:
  157. ;   EAX - token name of data
  158. ; Out:
  159. ;   EAX -> ptr to data
  160. ;   EDI - ?
  161. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  162. _loaddata:
  163.         call _flopenfile
  164.         mov eax,offset _flreadfile
  165.         mov edi,_himembase
  166.         call _decode0
  167.         call _gethimem
  168.         movzx ebx,al
  169.         dec bl
  170.         and bl,3
  171.         xor bl,3
  172.         add _himembase,ebx
  173.         ret
  174.  
  175. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  176. ; Load muzik into low memory and allocate it
  177. ; In:
  178. ;   EAX - token name of muzik
  179. ; Out:
  180. ;   EAX -> ptr to data
  181. ;   EDX - ?
  182. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  183. _loadmuzik:
  184.         call _gsp669_stop
  185.         call _flopenfile
  186.         mov eax,offset _flreadfile
  187.         mov edx,_olomembase
  188.         mov _lomembase,edx
  189.         call _gsp669_load
  190.         jmp _getlomem
  191.  
  192. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  193. ; Set current palette and update '_cpalptr' buffer
  194. ; In:
  195. ;   AL - first color to set
  196. ;   ECX - number of colors to set
  197. ;   ESI -> RGB color data
  198. ; Out:
  199. ;   EAX,EBX,ECX,DX,ESI,EDI - ?
  200. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  201. _setcpal:
  202.         movzx eax,al
  203.         lea edi,[eax*2+eax]
  204.         add edi,_cpalptr
  205.         lea ecx,[ecx*2+ecx]
  206.         mov ebx,ecx
  207.         mov dx,3c8h
  208.         out dx,al
  209.         inc edx
  210.         rep outsb
  211.         sub esi,ebx
  212.         mov ecx,ebx
  213.         rep movsb
  214.         ret
  215.  
  216.  
  217.  
  218. ; The crap that follows is just code to enter the demo at different points.
  219. ; Used only when I was writing the demo, but might as well leave it in.
  220.  
  221. CRAP            = 0
  222. extrn   ord:dword
  223.  
  224. if CRAP eq 1
  225. ;═════════════════════════════════════════════════════════════════════════════
  226. skullsidepalptr dd      ?               ; skull column palette ptr
  227. skullsidesprptr dd      ?               ; skull side column sprite ptr
  228. trnsptr         dd      ?,?             ; transition video ptrs
  229. trnscount       db      48              ; transition routine loop counter
  230.  
  231. ;-----------------------------------------------------------------------------
  232. p0ir1:
  233.         cld
  234.         push ecx esi edi
  235.         mov esi,trnsptr[0]
  236.         lea edi,[esi+16]
  237.         lea eax,[esi+1]
  238.         mov trnsptr[0],eax
  239.         call p0ir1r0
  240.         mov esi,trnsptr[4]
  241.         lea edi,[esi-16]
  242.         lea eax,[esi-1]
  243.         mov trnsptr[4],eax
  244.         call p0ir1r0
  245.         dec trnscount
  246.         jnz short p0ir1d
  247.         mov _vrtrout,offset _ret
  248. p0ir1d:
  249.         pop edi esi ecx
  250.         ret
  251. ;-----------------------------------------------------------------------------
  252. p0ir1r0:
  253.         mov ecx,25
  254. p0ir1r0l0:
  255. irp temp,<0,1,2,3>
  256.         mov ah,[esi+&temp*80]
  257.         mov [edi+&temp*80],ah
  258. endm
  259.         add edi,80*4
  260.         add esi,80*4
  261.         dec ecx
  262.         jnz p0ir1r0l0
  263.         ret
  264.  
  265. ;─────────────────────────────────────────────────────────────────────────────
  266. __crapinit:
  267.         mov eax,'p02d'
  268.         call _loaddata
  269.         add eax,24f0h
  270.         mov skullsidesprptr,eax
  271.         add eax,3200h
  272.         mov skullsidepalptr,eax
  273.  
  274.         mov esi,skullsidepalptr
  275.         mov ecx,20h
  276.         mov al,40h
  277.         call _setcpal
  278.         mov esi,_clearpalptr
  279.         mov ecx,40h
  280.         xor al,al
  281.         call _setcpal
  282.  
  283.         mov edi,_vidptr0
  284.         mov esi,skullsidesprptr
  285.         mov dx,3c5h
  286.         mov bl,1
  287. l0:
  288.         @outb bl
  289.         mov ecx,200
  290. l1:
  291.         mov eax,[esi]
  292.         mov [edi],eax
  293.         mov [edi+40h],eax
  294.         mov eax,[esi+4]
  295.         mov [edi+4],eax
  296.         mov [edi+44h],eax
  297.         mov eax,[esi+8]
  298.         mov [edi+8],eax
  299.         mov [edi+48h],eax
  300.         mov eax,[esi+12]
  301.         mov [edi+12],eax
  302.         mov [edi+4ch],eax
  303.         add esi,16
  304.         add edi,80
  305.         loop l1
  306.         sub edi,80*200
  307.         shl bl,1
  308.         and bl,0fh
  309.         jnz l0
  310.  
  311.         @outb 0fh
  312.         mov dl,0ceh
  313.         @outw 4105h
  314.  
  315.         mov eax,_vidptr0
  316.         add eax,80*100
  317.         mov trnsptr[0],eax
  318.         add eax,79-80*100
  319.         mov trnsptr[4],eax
  320.         mov _vrtrout,offset p0ir1
  321.  
  322.         mov eax,_ohimembase
  323.         mov _himembase,eax
  324.         ret
  325. endif
  326.  
  327. if CRAP eq 2
  328. ;═════════════════════════════════════════════════════════════════════════════
  329. mirrorpal       db      0, 0, 0, 3, 1, 0, 7, 4, 1, 12, 7, 2, 16, 9, 3, 20
  330.                 db      12, 4, 24, 15, 5, 29, 17, 7, 33, 20, 8, 37, 23, 9, 41, 25
  331.                 db      10, 46, 28, 11, 50, 31, 12, 54, 33, 13, 58, 36, 14, 63, 39, 16
  332.                 db      6, 0, 12, 6, 0, 12, 6, 0, 12, 6, 0, 12, 6, 0, 12, 6
  333.                 db      0, 12, 6, 0, 12, 6, 0, 12, 0, 0, 6, 0, 0, 7, 0, 0
  334.                 db      8, 0, 0, 10, 0, 0, 11, 0, 0, 13, 0, 0, 14, 0, 0, 16
  335.                 db      17, 0, 26, 17, 0, 26, 17, 0, 26, 17, 0, 26, 17, 0, 26, 17
  336.                 db      0, 26, 17, 0, 26, 17, 0, 26
  337.  
  338. ;═════════════════════════════════════════════════════════════════════════════
  339. p1ir4:                                  ; transition, slide to mirror palette
  340.         cld
  341.         push bx ecx esi edi
  342.         mov dx,3c8h
  343.         @outb 0
  344.         mov edi,_cpalptr
  345.         mov esi,edi
  346.         mov ecx,28h*3
  347.         inc edx
  348.         rep outsb
  349.         mov esi,offset mirrorpal
  350.         mov cl,28h*3
  351.         mov bl,1
  352.         call _slidebytes
  353.         jnc short p1ir4d
  354.         mov _vrtrout,offset _ret
  355. p1ir4d:
  356.         pop edi esi ecx bx
  357.         ret
  358.  
  359. ;─────────────────────────────────────────────────────────────────────────────
  360. __crapinit:
  361.         mov eax,'muz2'                  ; load up next muzik
  362.         call _loadmuzik
  363.         cli
  364.         call _gsp669_play               ; start muzik playing
  365.         mov ord,4
  366.         sti
  367.  
  368.         mov edi,_vidptr2                ; clean up pages 2 and 3
  369.         mov dx,3c5h
  370.         @outb 0fh
  371.         mov ecx,2000h
  372.         xor eax,eax
  373.         rep stosd
  374.  
  375.         mov edi,_cpalptr                ; set up b/w palette
  376.         mov esi,edi
  377.         mov ecx,20h
  378.         xor edx,edx
  379.         mov ebx,2f2f2f2fh
  380.         xor eax,eax
  381. p1i1l0:
  382.         stosd
  383.         stosd
  384.         stosd
  385.         stosd
  386.         stosd
  387.         stosd
  388.         xchg ebx,eax
  389.         xchg edx,ebx
  390.         loop p1i1l0
  391.         mov ecx,100h
  392.         xor al,al
  393.         call _setcpal
  394.  
  395.         mov dx,3d4h                     ; set page 2
  396.         @outw 800ch
  397.  
  398.         mov eax,'p11d'                  ; load and put transition bg pic
  399.         call _loaddata
  400.  
  401.         mov edi,_vidptr2                ; put mirror bitmap to pages 2 and 3
  402.         add edi,80*21
  403.         mov esi,eax
  404.         mov ebx,80*168
  405.         call _pbmodex
  406.         mov edi,_vidptr3
  407.         add edi,80*21
  408.         call _pbmodex
  409.  
  410.         mov eax,_ohimembase             ; clean up high memory base ptr
  411.         mov _himembase,eax
  412.         mov _vrtrout,offset p1ir4       ; set transition retrace routine
  413.  
  414.         ret
  415. endif
  416.  
  417. if CRAP eq 3
  418. ;─────────────────────────────────────────────────────────────────────────────
  419. __crapinit:
  420.         mov eax,'muz2'                  ; load up next muzik
  421.         call _loadmuzik
  422.         cli
  423.         call _gsp669_play               ; start muzik playing
  424.         mov ord,8
  425.         sti
  426.  
  427.         mov eax,'p20d'                  ; load and allocate data
  428.         call _loaddata
  429.         mov ebp,eax
  430.  
  431.         lea esi,[ebp+97696]             ; put mirror pic to pages 0 and 1
  432.         mov ebx,80*200
  433.         mov edi,_vidptr0
  434.         call _pbmodex
  435.         mov edi,_vidptr1
  436.         call _pbmodex
  437.  
  438.         lea esi,[ebp+209923]
  439.         mov ecx,40h
  440.         mov al,20h
  441.         call _setcpal
  442.  
  443.         mov dx,3d4h                     ; set page 0
  444.         @outw 0ch
  445.  
  446.         ret
  447. endif
  448.  
  449.  
  450. code32  ends
  451.         end
  452.  
  453.