home *** CD-ROM | disk | FTP | other *** search
/ Media Share 9 / MEDIASHARE_09.ISO / progmisc / hellsrc.zip / P2.ASM < prev    next >
Assembly Source File  |  1993-10-26  |  19KB  |  665 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  _p2
  12.  
  13. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  14. ; DATA
  15. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  16. align 4
  17. FACESSPRLEN     = 256*200
  18. FACESLOCLEN     = 148*2*4
  19. FACESPALLEN     = 10h*3
  20. HIGHLIGHTSPRLEN = 12227
  21. MIRRORPICLEN    = 320*200
  22. MIRRORPICPALLEN = 40h*3
  23. MIRRORPICTBLLEN = 112*200*2
  24. MIRRORSPRLEN    = 214*168
  25.  
  26. MUZLOC0         = 0800h
  27.  
  28. p2m0sv0         equ byte ptr [esp]
  29. p2m0sv1         equ byte ptr [esp+1]
  30. p2m0sv2         equ byte ptr [esp+2]
  31. p2m0sv3         equ byte ptr [esp+3]
  32. p2m0sv4         equ byte ptr [esp+4]
  33. p2m0sv5         equ byte ptr [esp+5]
  34. p2m0sv6         equ byte ptr [esp+6]
  35. P2M0SVL0        = 8
  36.  
  37. p2m1sv0         equ dword ptr [esp]
  38. p2m1sv1         equ byte ptr [esp+4]
  39. P2M1SVL0        = 8
  40.  
  41. dpalptr0        dd      ?               ; 2 pieces of mirror palette
  42. facessprptr     dd      ?               ; moaning faces bitmap ptr
  43. faceslocptr     dd      ?               ; ptr to raster offset and len table
  44. facesoffptrl    dd      ?               ; load ptr to pixel offset table
  45. facesdeltaptrl  dd      ?               ; load ptr to delta table for offsets
  46. facesoffptr     dd      ?               ; ptr to pixel offset table
  47. facesdeltaptr   dd      ?               ; ptr to delta table for offset table
  48. facesdeltaptr2  dd      ?               ; delta table sum/mod 4
  49. facesmisctbl0   dd      ?               ; misc calc optimization table
  50. highlightsprptr dd      ?               ; highlight compiled sprite ptr
  51.  
  52. mirrorxpalptr   dd      ?               ; faces to mirror pic transition pal
  53. mirrorpicptr    dd      ?               ; ptr to pic in mirror
  54. mirrorpicpalptr dd      ?               ; ptr to pal for mirror pic
  55. mirrorpictblptr dd      ?               ; ptr to table for mirror pic edges
  56. mirrorsprptr    dd      ?               ; ptr to mirror sprite for scaling
  57. mirrorpicctbl   dd      ?               ; running mirror zoom table ptr
  58. mirrorpicptbl   dd      ?,?             ; old mirror zoom table for both pages
  59.  
  60. p2m0seqrout     dd      p2m0sr0         ; sequence routine for faces in mirror
  61. p2m0rout0       dd      35h dup(?)      ; entry/exit points to raster put code
  62. p2m0rout1       label   dword           ; entry points to offseting routine
  63. irp temp,<26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0>
  64.                 dd      p2m0r1+&temp*3
  65. endm
  66.  
  67. mirrorzoomloc   dw      34h,14h         ; Y and X location of zooming mirror
  68. mirrorzoomlen   dw      0d8h,0aah       ; Y and X size of zooming mirror
  69.  
  70. facesoffwave    db      0,0             ; starting locations of offset waves
  71. facesdeltawave  db      0,0             ; starting locations of delta waves
  72.  
  73. vrtcntr         db      0               ;                                    |
  74. ovrtcntr        db      0               ;                                    |
  75. vrttime         db      1               ; vertical retraces per frame
  76.  
  77. facespageindex  db      1               ; warping faces page index
  78. facespagetbl    db      80h,0c0h        ; warping faces page offset table
  79.  
  80. faceswaveloc    db      0               ; wave inc table wave location
  81. facesoffwave0   db      1,2,1,2,2,1,2,2
  82. facesoffwave1   db      1,1,1,1,1,2,1,1
  83. facesdeltawave0 db      2,1,2,1,1,1,2,1
  84. facesdeltawave1 db      2,2,2,2,2,3,2,2
  85.  
  86. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  87. ; CODE
  88. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  89.  
  90. ;═════════════════════════════════════════════════════════════════════════════
  91. p2m0r0:
  92.         mov bl,[ecx]
  93.         mov al,[esi+ebx+2beaddedh]
  94. p2m0r0m0:
  95.         mov [edi+2bh],al
  96. p2m0r0m1:
  97.         add cl,[edx]
  98.         inc edx
  99. P2M0ROUT0LEN=$-p2m0r0
  100.  
  101. ;═════════════════════════════════════════════════════════════════════════════
  102. p2ir1:                                  ; only increment retrace timer
  103.         inc vrtcntr
  104.         ret
  105.  
  106. ;═════════════════════════════════════════════════════════════════════════════
  107. p2ir0:                                  ; slide to faces palette
  108.         cld
  109.         push bx ecx esi edi
  110.         mov edi,_cpalptr
  111.         add edi,10h*3
  112.         mov esi,edi
  113.         mov dx,3c8h
  114.         @outb 10h
  115.         inc edx
  116.         mov ecx,8*3
  117.         rep outsb
  118.         add esi,8*3
  119.         dec edx
  120.         @outb 20h
  121.         inc edx
  122.         mov cl,8*3
  123.         rep outsb
  124.         mov esi,dpalptr0
  125.         mov cl,8*3
  126.         mov bl,1
  127.         call _slidebytes
  128.         setc bh
  129.         add edi,10h*3
  130.         add esi,8*3
  131.         call _slidebytes
  132.         adc bh,0
  133.         cmp bh,2
  134.         jb short p2ir0f0
  135.         mov _vrtrout,offset p2ir1
  136. p2ir0f0:
  137.         inc vrtcntr
  138.         pop edi esi ecx bx
  139.         ret
  140.  
  141. ;═════════════════════════════════════════════════════════════════════════════
  142. p2ir2:                                  ; slide faces to transition pal
  143.         cld
  144.         push bx ecx esi edi
  145.         mov edi,_cpalptr
  146.         add edi,10h*3
  147.         mov esi,edi
  148.         mov dx,3c8h
  149.         @outb 10h
  150.         inc edx
  151.         mov ecx,8*3
  152.         rep outsb
  153.         add esi,8*3
  154.         dec edx
  155.         @outb 20h
  156.         inc edx
  157.         mov cl,8*3
  158.         rep outsb
  159.         mov esi,mirrorxpalptr
  160.         mov cl,8*3
  161.         mov bl,1
  162.         call _slidebytes
  163.         setc bh
  164.         add edi,10h*3
  165.         call _slidebytes
  166.         adc bh,0
  167.         cmp bh,2
  168.         jb short p2ir2f0
  169.         mov _vrtrout,offset p2ir1
  170. p2ir2f0:
  171.         inc vrtcntr
  172.         pop edi esi ecx bx
  173.         ret
  174.  
  175. ;═════════════════════════════════════════════════════════════════════════════
  176. p2ir3:                                  ; slide to mirror pic palette
  177.         cld
  178.         push bx ecx esi edi
  179.         mov edi,_cpalptr
  180.         add edi,20h*3
  181.         mov esi,edi
  182.         mov dx,3c8h
  183.         @outb 20h
  184.         inc edx
  185.         mov ecx,MIRRORPICPALLEN
  186.         rep outsb
  187.         mov esi,mirrorpicpalptr
  188.         mov ecx,MIRRORPICPALLEN
  189.         mov bl,1
  190.         call _slidebytes
  191.         jnc short p2ir3f0
  192.         mov _vrtrout,offset p2ir1
  193. p2ir3f0:
  194.         pop edi esi ecx bx
  195.         ret
  196.  
  197. ;═════════════════════════════════════════════════════════════════════════════
  198. _p2:
  199.         mov eax,'p20d'                  ; load and allocate data
  200.         call _loaddata
  201.         mov facessprptr,eax
  202.         add eax,FACESSPRLEN
  203.         mov faceslocptr,eax
  204.         add eax,FACESLOCLEN
  205.         mov facesdeltaptrl,eax
  206.         add eax,100h
  207.         mov facesoffptrl,eax
  208.         add eax,100h
  209.         mov mirrorpictblptr,eax
  210.         mov mirrorpicctbl,eax
  211.         mov mirrorpicptbl[0],eax
  212.         mov mirrorpicptbl[4],eax
  213.         add eax,MIRRORPICTBLLEN
  214.         mov mirrorpicptr,eax
  215.         add eax,MIRRORPICLEN
  216.         mov mirrorsprptr,eax
  217.         add eax,MIRRORSPRLEN
  218.         mov highlightsprptr,eax
  219.         add eax,HIGHLIGHTSPRLEN
  220.         mov dpalptr0,eax
  221.         add eax,FACESPALLEN
  222.         mov mirrorpicpalptr,eax
  223.  
  224.         add _himembase,0ffh             ; align high mem base on 256 bytes
  225.         mov byte ptr _himembase,0
  226.  
  227.         mov eax,100h*2+128*4+400h+P2M0ROUT0LEN*35h+MIRRORPICPALLEN
  228.         call _gethimem
  229.         mov facesoffptr,eax
  230.         add eax,100h
  231.         mov facesdeltaptr,eax
  232.         add eax,100h
  233.         mov facesdeltaptr2,eax
  234.         add eax,128*4
  235.         mov facesmisctbl0,eax
  236.         add eax,400h
  237.         mov p2m0rout0,eax
  238.         add eax,P2M0ROUT0LEN*35h
  239.         mov mirrorxpalptr,eax
  240.  
  241.         mov edi,facesoffptr             ; copy tables to 256 aligned buffers
  242.         mov esi,facesoffptrl
  243.         mov ecx,40h
  244.         rep movsd
  245.         mov edi,facesdeltaptr
  246.         mov esi,facesdeltaptrl
  247.         mov ecx,40h
  248.         rep movsd
  249.  
  250.         mov edi,facesdeltaptr2          ; build sum/mod 4 delta table
  251.         mov edx,facesdeltaptr
  252.         mov bh,4
  253. p2i0l0:
  254.         mov esi,edi
  255.         mov bl,40h
  256. p2i0l0l0:
  257.         mov al,[edx]
  258.         inc dl
  259.         add al,[edx]
  260.         inc dl
  261.         add al,[edx]
  262.         inc dl
  263.         add al,[edx]
  264.         inc dl
  265.         stosb
  266.         dec bl
  267.         jnz p2i0l0l0
  268.         mov ecx,10h
  269.         rep movsd
  270.         inc edx
  271.         dec bh
  272.         jnz p2i0l0
  273.  
  274.         mov ebp,offset p2m0rout0        ; build put code
  275.         mov edi,[ebp]
  276.         xor ebx,ebx
  277. p2i0l1:
  278.         mov [ebp],edi
  279.         mov esi,offset p2m0r0
  280.         lea eax,[ebx*4]
  281.         mov dword ptr p2m0r0m0[-4],eax
  282.         mov byte ptr p2m0r0m1[-1],bl
  283.         mov ecx,P2M0ROUT0LEN
  284.         rep movsb
  285.         add ebp,4
  286.         inc ebx
  287.         cmp bl,35h
  288.         jb p2i0l1
  289.  
  290.         mov edi,facesmisctbl0           ; set up misc calc table
  291.         mov dword ptr p2m0l0l0m0[-4],edi
  292.         xor edx,edx
  293.         mov ecx,facesdeltaptr2
  294. p2i0l2:
  295.         mov ebx,edx
  296.         mov eax,edx
  297.         and al,3
  298.         shl eax,7
  299.         shr ebx,2
  300.         add eax,ebx
  301.         add eax,ecx
  302.         stosd
  303.         inc dl
  304.         jnz p2i0l2
  305.  
  306.         mov edi,mirrorxpalptr           ; set up faces to pic transition pal
  307.         mov ecx,MIRRORPICPALLEN/3
  308. p2i0l3:
  309.         mov word ptr [edi],3f3fh
  310.         mov byte ptr [edi+2],0
  311.         add edi,3
  312.         loop p2i0l3
  313.  
  314.         mov dx,3ceh                     ; set read plane select index
  315.         @outb 4
  316.  
  317. waitl0:
  318.         cmp _vrtrout,offset _ret        ; wait for transition to end
  319.         jne waitl0
  320.  
  321.         mov _vrtrout,offset p2ir1       ; just a timer tick routine
  322.  
  323.         mov esi,mirrorxpalptr           ; set part of faces/pic transition pal
  324.         mov ecx,MIRRORPICPALLEN/3-8
  325.         mov al,28h
  326. waitl2:
  327.         cmp vrtcntr,0
  328.         je waitl2
  329.         call _setcpal
  330.  
  331. ;═════════════════════════════════════════════════════════════════════════════
  332. ; Warping moaning faces in mirror
  333. p2m0:
  334.         movzx edx,faceswaveloc          ; move wave starting points
  335.         movzx ecx,vrttime
  336.         mov bx,word ptr facesdeltawave
  337.         mov ax,word ptr facesoffwave
  338. p2m0l1:
  339.         add al,facesoffwave0[edx]
  340.         add ah,facesoffwave1[edx]
  341.         add bl,facesdeltawave0[edx]
  342.         add bh,facesdeltawave1[edx]
  343.         inc edx
  344.         and dl,7
  345.         dec ecx
  346.         jnz p2m0l1
  347.         mov faceswaveloc,dl
  348.         mov word ptr facesdeltawave,bx
  349.         mov word ptr facesoffwave,ax
  350.  
  351.         sub esp,P2M0SVL0                ; put warping moaning faces to screen
  352.         mov ebp,faceslocptr
  353.         movzx eax,facespageindex
  354.         mov edi,_vidptr2[eax*4]
  355.         add edi,80*37+14
  356.         mov esi,facessprptr
  357.         xor ebx,ebx
  358.         mov al,22h
  359.         mov p2m0sv4,0
  360.         mov p2m0sv5,0
  361. p2m0l0:
  362.         mov dx,3c5h
  363.         out dx,al
  364.         mov p2m0sv3,al
  365.  
  366.         movzx edx,facesdeltawave[1]
  367.         movzx ecx,facesoffwave[1]
  368.  
  369.         mov al,facesoffwave[0]
  370.         add al,p2m0sv5
  371.         mov p2m0sv6,al
  372.         mov p2m0sv2,148
  373. p2m0l0l0:
  374.         add edx,facesdeltaptr
  375.         add ecx,facesoffptr
  376.         mov bh,[ecx]
  377.         add cl,[edx]
  378.         inc dl
  379.         mov p2m0sv0,dl
  380.         mov p2m0sv1,cl
  381.  
  382.         movzx edx,facesdeltawave[0]
  383.         add dl,p2m0sv4
  384.         mov edx,[edx*4+2beaddedh]
  385. p2m0l0l0m0:
  386.         movzx ecx,p2m0sv6
  387.         add ecx,facesoffptr
  388.  
  389.         movzx eax,byte ptr [ebp+1]
  390.         mov eax,p2m0rout0[eax*4]
  391.         mov byte ptr [eax],0c3h
  392.         movzx eax,byte ptr [ebp]
  393.         call p2m0rout1[eax*4]
  394.         movzx eax,byte ptr [ebp+1]
  395.         mov eax,p2m0rout0[eax*4]
  396.         mov byte ptr [eax],8ah
  397.  
  398.         add ebp,2
  399.         add edi,80
  400.         add esi,256
  401.         movzx edx,p2m0sv0
  402.         movzx ecx,p2m0sv1
  403.         add p2m0sv6,3
  404.         dec p2m0sv2
  405.         jnz p2m0l0l0
  406.  
  407.         mov al,p2m0sv3
  408.         rol al,1
  409.         cmc
  410.         sbb edi,80*148-1
  411.         sub esi,256*148-1
  412.  
  413.         movzx edx,facesdeltawave[0]
  414.         mov ah,p2m0sv4
  415.         add dl,ah
  416.         inc ah
  417.         mov p2m0sv4,ah
  418.         add edx,facesdeltaptr
  419.         mov ah,[edx]
  420.         add p2m0sv5,ah
  421.  
  422.         cmp al,22h
  423.         jne p2m0l0
  424.         add esp,P2M0SVL0
  425.  
  426.         mov ebp,80*141                  ; put highlight over faces
  427.         movzx eax,facespageindex
  428.         mov edi,_vidptr2[eax*4]
  429.         add edi,80*37+19h
  430.         mov esi,80
  431.         mov dh,3
  432.         mov cx,11h
  433.         mov bx,3030h
  434.         call highlightsprptr
  435.  
  436.         mov dx,3d5h                     ; set new page
  437.         movzx ebx,facespageindex
  438.         @outb facespagetbl[ebx]
  439.         xor bl,1
  440.         mov facespageindex,bl
  441.  
  442.         mov al,vrtcntr                  ; wait for a vertical retrace
  443. waitl1:
  444.         cmp al,vrtcntr
  445.         je waitl1
  446.         mov al,vrtcntr                  ; time retraces per frame
  447.         mov ah,ovrtcntr
  448.         mov ovrtcntr,al
  449.         sub al,ah
  450.         mov vrttime,al
  451.  
  452.         jmp p2m0seqrout
  453.  
  454. ;─────────────────────────────────────────────────────────────────────────────
  455. p2m0sr0:                                ; set palette slide to faces palette
  456.         mov _vrtrout,offset p2ir0
  457.         mov p2m0seqrout,offset p2m0sr1
  458.         jmp p2m0
  459. ;-----------------------------------------------------------------------------
  460. p2m0sr1:                                ; wait for muzik meta point
  461.         cmp _muzloc,MUZLOC0
  462.         jb p2m0
  463.         mov _vrtrout,offset p2ir2
  464.         mov p2m0seqrout,offset p2m0sr2
  465.         jmp p2m0
  466. ;-----------------------------------------------------------------------------
  467. p2m0sr2:                                ; wait for palette phade to end
  468.         cmp _vrtrout,offset p2ir2
  469.         je p2m0
  470.  
  471. ;═════════════════════════════════════════════════════════════════════════════
  472. p2i1:
  473.         mov ebx,80*200                  ; put mirror pic to pages 0 and 1
  474.         mov esi,mirrorpicptr
  475.         mov edi,_vidptr0
  476.         call _pbmodex
  477.         mov edi,_vidptr1
  478.         call _pbmodex
  479.  
  480.         mov edi,_vidptr2                ; put pic in mirror on pages 2 and 3
  481.         call p2i1r0
  482.         mov edi,_vidptr3
  483.         call p2i1r0
  484.  
  485.         mov _vrtrout,offset p2ir3       ; set slide to mirror pic pal rout
  486.  
  487.         mov edx,0a8000h                 ; set up selectors for zoom routine
  488.         mov ax,_sel[0]
  489.         call _setselector
  490.         mov edx,0ac000h
  491.         mov ax,_sel[2]
  492.         call _setselector
  493.         @php edx,mirrorsprptr
  494.         mov ax,_sel[4]
  495.         call _setselector
  496.  
  497. waitl3:                                 ; wait for palette slide to end
  498.         cmp _vrtrout,offset p2ir3
  499.         je waitl3
  500.  
  501.         mov word ptr vrtcntr,0          ; set up for mirror zoom
  502.         mov vrttime,1
  503.  
  504. ;═════════════════════════════════════════════════════════════════════════════
  505. ; Zoom mirror out
  506. p2m1:
  507.         sub esp,P2M1SVL0                ; put pieces of pic revealed
  508.         mov dx,3c5h
  509.         @outb 0fh
  510.         mov dl,0ceh
  511.         @outw 4105h
  512.         mov ebp,mirrorpicctbl
  513.         movzx eax,vrttime
  514.         imul eax,400
  515.         add ebp,eax
  516.         mov mirrorpicctbl,ebp
  517.         movzx eax,facespageindex
  518.         mov edx,_vidptr2[eax*4]
  519.         mov esi,_vidptr1
  520.         mov ebx,ebp
  521.         xchg ebx,mirrorpicptbl[eax*4]
  522.         xor ecx,ecx
  523.         mov eax,200
  524. p2m1l0:
  525.         mov p2m1sv1,al
  526.         mov al,[ebp]
  527.         cmp al,-1
  528.         je short p2m1l0c
  529.  
  530.         mov p2m1sv0,esi
  531.         lea edi,[edx+eax]
  532.         add esi,eax
  533.         mov cl,[ebx]
  534.         cmp cl,-1
  535.         je short p2m1l0f0
  536.         sub cl,al
  537.         add cl,2
  538.         rep movsb
  539.         mov esi,p2m1sv0
  540.         mov al,[ebx+1]
  541.         dec eax
  542.         lea edi,[edx+eax]
  543.         add esi,eax
  544.         mov cl,[ebp+1]
  545.         inc ecx
  546.         sub cl,al
  547.         rep movsb
  548.  
  549.         jmp short p2m1l0c2
  550. p2m1l0f0:
  551.         mov cl,[ebp+1]
  552.         inc ecx
  553.         sub cl,al
  554.         rep movsb
  555. p2m1l0c2:
  556.         mov esi,p2m1sv0
  557. p2m1l0c:
  558.         mov al,p2m1sv1
  559.         add esi,80
  560.         add edx,80
  561.         add ebp,2
  562.         add ebx,2
  563.         dec al
  564.         jnz p2m1l0
  565.         mov dx,3cfh
  566.         @outb 40h
  567.         add esp,P2M1SVL0
  568.  
  569.         movzx eax,facespageindex        ; put scaled mirror
  570.         mov es,_sel[eax*2]
  571.         xor edi,edi
  572.         xor esi,esi
  573.         mov ecx,dword ptr mirrorzoomlen
  574.         mov ebx,0a800d6h
  575.         mov eax,dword ptr mirrorzoomloc
  576.         mov ds,_sel[4]
  577.         call _psbm
  578.         mov ax,cs:_seldata
  579.         mov es,ax
  580.         mov ds,ax
  581.  
  582.         mov dx,3d5h                     ; set new page
  583.         movzx ebx,facespageindex
  584.         @outb facespagetbl[ebx]
  585.         xor bl,1
  586.         mov facespageindex,bl
  587.  
  588.         mov al,vrtcntr                  ; wait for a vertical retrace
  589. waitl4:
  590.         cmp al,vrtcntr
  591.         je waitl4
  592.         mov al,vrtcntr                  ; time retraces per frame
  593.         mov ah,ovrtcntr
  594.         mov ovrtcntr,al
  595.         sub al,ah
  596.         mov vrttime,al
  597.  
  598.         movzx eax,al                    ; increase zoom level
  599.         sub mirrorzoomloc[0],ax
  600.         sub mirrorzoomloc[2],ax
  601.         lea eax,[eax*2]
  602.         add mirrorzoomlen[0],ax
  603.         add mirrorzoomlen[2],ax
  604.  
  605.         cmp mirrorzoomloc[0],-59
  606.         jg p2m1
  607.  
  608. ;-----------------------------------------------------------------------------
  609.         mov dx,3d5h                     ; set page 0
  610.         @outb 0
  611.  
  612.         mov eax,_ohimembase             ; clean up high memory base ptr
  613.         mov _himembase,eax
  614.         mov _vrtrout,offset _ret        ; clear retrace routine
  615.  
  616.         ret
  617.  
  618. ;─────────────────────────────────────────────────────────────────────────────
  619. p2m0r1:                                 ; increment to visible table part
  620.         db 26 dup(2,0ah,42h)    ; add cl,[edx], inc edx
  621.         jmp p2m0rout0[eax*4]
  622.  
  623. ;─────────────────────────────────────────────────────────────────────────────
  624. p2i1r0:                                 ; put part of pic in mirror
  625.         mov ebp,faceslocptr
  626.         add edi,80*37+14
  627.         mov esi,mirrorpicptr
  628.         add esi,80*200+80*37+14
  629.         mov dx,3c5h
  630.         xor ecx,ecx
  631.         xor ebx,ebx
  632.         mov al,22h
  633. p2i1r0l0:
  634.         out dx,al
  635.         mov ah,148
  636.         push esi edi
  637. p2i1r0l0l0:
  638.         push esi edi
  639.         mov bl,[ebp]
  640.         mov cl,[ebp+1]
  641.         add edi,ebx
  642.         add esi,ebx
  643.         sub cl,bl
  644.         rep movsb
  645.         pop edi esi
  646.         add ebp,2
  647.         add edi,80
  648.         add esi,80
  649.         dec ah
  650.         jnz p2i1r0l0l0
  651.         pop edi esi
  652.         add esi,80*200
  653.         rol al,1
  654.         jnc short p2i1l0c
  655.         inc edi
  656.         sub esi,80*200*4-1
  657. p2i1l0c:
  658.         cmp al,22h
  659.         jne p2i1r0l0
  660.         ret
  661.  
  662. code32  ends
  663.         end
  664.  
  665.