home *** CD-ROM | disk | FTP | other *** search
/ The Unsorted BBS Collection / thegreatunsorted.tar / thegreatunsorted / programming / asm_programming / WCIMIT.ZIP / NEWS6.ASM < prev    next >
Assembly Source File  |  1993-06-04  |  9KB  |  461 lines

  1.     DOSSEG
  2.     .MODEL SMALL
  3.     .STACK 200h
  4.     .CODE
  5.     .386
  6.     ASSUME CS:@CODE, DS:@CODE
  7.     Ideal
  8. ────────────────────────────────────────────────────────────────────────────
  9. Include "Modex.Inc"
  10. ────────────────────────────────────────────────────────────────────────────
  11. ;upon entry:    Decompressit => loads .CMP image and decompresses it...
  12. ;
  13. ;*  DS:DX = pointer to filename
  14. ;*  AX != 0, image fitted to AX wide window
  15. ;*  AX == 0, image decompressed using [Xsize] for width
  16. ;*  [FileSeg] and [Destination] must both have valid segmnet values
  17. ;
  18. ;upon EXIT:
  19. ;
  20. ;*  AX=0 if no error, 1 means error
  21. ;*  Stuff in [FileSeg] is destoryed
  22. ;*  Decompressed image is in [Destination] segment
  23. ;*  Palette is at CmpPal
  24.  
  25.     GLOBAL  DeCompressIt:NEAR
  26.     GLOBAL  FileSeg:WORD, Destination:WORD, CmpPal:BYTE
  27.  
  28. CMPName db  "logo.cmp",0
  29. ────────────────────────────────────────────────────────────────────────────
  30. SCRW        =   160
  31. PGWD        =   SCRW/4
  32. ThePages    dw  80*SCRW, 80*SCRW+PGWD, 80*SCRW+PGWD*2, 80*SCRW+PGWD*3
  33. BASEOff     =   80*Scrw
  34. CurOff      dw  0
  35. DestOff     dw  0
  36. PAGEHEIGHT  =   400-110
  37. LogoLoc     dw  SCRW/2, SCRW/2+SCRW*20,SCRW/2+SCRW*40, SCRW/2+SCRW*60
  38. LogoHeight  =   20
  39. SplitScreen =   400-81
  40. CurLoc      db  128
  41.  
  42. Page1       =   0
  43. Page2       =   PGWD*1*4
  44. Page3       =   PGWD*2*4
  45. Page4       =   PGWD*3*4
  46.  
  47. MoveIndex   dw  0
  48. MaxIndex    =   35
  49.  
  50. MoveDirection db 0  ;0= none 1=left 2=right
  51.  
  52. MoveDist    dw  1,2,3,3,4,4,4,5,5,5,5,6,6,6,6,6,  6,6,6
  53.             dw  6,6,6,6,6,5,5,5,5,4,4,4,3,3,2,1
  54. ────────────────────────────────────────────────────────────────────────────
  55.     ;di= offset to fill at, al what to fill with
  56. PROC FillPage
  57.     pusha
  58.     push    es
  59.     mov     es,[cs:VGAseg]
  60.     
  61.     add     di,105*SCRW
  62.     push    ax
  63.  
  64.     mov     ah,0
  65.     @Set_write_mode
  66.     mov     ah,1111b
  67.     @Set_Write_Plane
  68.  
  69.     pop     ax
  70.  
  71.     mov     dx,PAGEHEIGHT
  72. @@woop:
  73.     mov     cx,PGWD
  74.     rep     stosb
  75.     add     di,SCRW-PGWD
  76.     dec     dx
  77.     jne     @@Woop
  78.     pop     es
  79.     popa
  80.     ret
  81. ENDP
  82.  
  83.     ;di = ptr to dest
  84.     ;si = ptr to source
  85. PROC CopyBlocks
  86.     pusha
  87.     push    es ds
  88.     mov     ax,[cs:VGAseg]
  89.     mov     es,ax
  90.     mov     ds,ax
  91.  
  92.     @FullVertWait
  93.  
  94.     mov     ah,1
  95.     @Set_Write_Mode
  96.  
  97.     mov     ax,105*SCRW
  98.     add     si,ax
  99.     add     di,ax
  100.  
  101.     mov     dx,PageHeight
  102. @@Loop:
  103.     mov     cx,SCRW/2
  104.     rep     movsb
  105.     add     di,SCRW/2
  106.     add     si,SCRW/2
  107.     dec     dx
  108.     jne     @@Loop
  109.  
  110.     @FullVertWait
  111.  
  112.     pop     ds es
  113.     popa
  114.     ret
  115. ENDP
  116.  
  117. PROC CopyLogo
  118.     pusha
  119.     push    ds es
  120.     mov     ax,[cs:VGAseg]
  121.     mov     es,ax
  122.     mov     ds,ax
  123.  
  124.     mov     ah,1
  125.     @Set_WRite_Mode
  126.     mov     ah,1111b
  127.     @Set_Write_Plane
  128.  
  129.     mov     bx,[cs:CurOff]
  130.     mov     di,bx
  131.     shr     di,2
  132.     add     di,BaseOff
  133.     and     bx,11b
  134.     add     bx,bx
  135.     mov     si,[cs:LogoLoc+bx]
  136.     cld
  137.     mov     dx,LogoHeight
  138. @@Cploop:
  139.     mov     cx,SCRW/2
  140.     rep     movsb
  141.     mov     al,[si-Scrw/2]
  142.     mov     [di],al
  143.     add     di,SCRW/2
  144.     add     si,SCRW/2
  145.     dec     dx
  146.     jne     @@CPloop
  147.     
  148.     pop     es ds
  149.     popa
  150.     ret
  151. ENDP
  152.  
  153. PROC PutImagesOnVGA
  154.     pusha
  155.     push    fs es ds
  156.     mov     ax,cs
  157.     mov     ds,ax
  158.     mov     es,[VGAseg]
  159.     mov     fs,[Destination]
  160.  
  161.     mov        ah,0
  162.     @Set_Write_mode
  163.  
  164.     xor     cx,cx
  165. @@TopLoop:
  166.     mov     si,cx
  167.     add     si,80*320
  168.     mov     di,SCRW/2
  169.     mov     bp,LogoHeight*4
  170.     mov     ah,1
  171.     shl     ah,cl
  172.     @Set_Write_plane
  173. @@loop:
  174.     mov     bx,SCRW/2
  175. @@NoLop:
  176.     mov     al,[fs:si]    
  177.     mov     [es:di],al
  178.     inc     di
  179.     add     si,4
  180.     dec     bx
  181.     jne     @@NoLop
  182.  
  183.     add     di,SCRW/2
  184.     dec     bp
  185.     jne     @@Loop
  186.  
  187.     inc     cl
  188.     cmp     cl,4
  189.     jb      @@TopLoop
  190.  
  191.     xor     cx,cx
  192. @@TopLoop2:
  193.     mov     si,cx
  194.     mov     di,0
  195.     mov     bp,80
  196.     mov     ah,1
  197.     shl     ah,cl
  198.     @Set_Write_plane
  199. @@loop2:
  200.     mov     bx,SCRW/2
  201. @@NoLop2:
  202.     mov     al,[fs:si]    
  203.     mov     [es:di],al
  204.     inc     di
  205.     add     si,4
  206.     dec     bx
  207.     jne     @@NoLop2
  208.  
  209.     add     di,SCRW/2
  210.     dec     bp
  211.     jne     @@Loop2
  212.  
  213.     inc     cl
  214.     cmp     cl,4
  215.     jb      @@TopLoop2
  216.  
  217.     pop     ds es fs
  218.     popa
  219.     ret
  220. ENDP
  221.  
  222. PROC FixUpScreen
  223.     pusha
  224.  
  225.     @FullVertWait
  226.     mov     cx,LogoHeight/4
  227.     mov     dx,3dah         ;wait until scan line > height of logo
  228. @@WaitForVR:
  229.     in      al,dx
  230.     and     al,1000b
  231.     jz      @@WaitforVR
  232. @@WaitForVREnd:
  233.     in      al,dx
  234.     and     al,1000b
  235.     jnz     @@WaitforVREnd
  236. @@WaitferHR:
  237.     in      al,dx
  238.     and     al,1001b
  239.     cmp     al,1
  240.     jne     @@WaitFerHR
  241. @@WaitForHRend:
  242.     in      al,dx
  243.     and     al,1001b
  244.     jne     @@WAitForHRend
  245.     dec     cx
  246.     jne     @@WaitferHR
  247.     
  248.     mov     cx,[cs:CurOff]
  249.     mov     bx,cx
  250.     shr     bx,2
  251.     add     bx,BaseOff
  252.     @Set_Start_Offset
  253.     and     cl,11b
  254.     mov     ah,cl
  255.     add     ah,ah
  256.     @Set_HPP
  257.     call    CopyLogo
  258.     @FullVertWait
  259.  
  260.     popa
  261.     ret
  262. ENDP
  263.  
  264. ────────────────────────────────────────────────────────────────────────────
  265. START:
  266.     mov     ax,cs
  267.     mov     ds,ax
  268.  
  269.     mov     ax,ss
  270.     add     ax,20h
  271.     mov     [Destination],ax
  272.     add     ax,1000h
  273.     mov     [FileSeg],ax
  274.     xor     ax,ax
  275.     mov     dx,offset CMPname
  276.     call    Decompressit
  277.     
  278.     @SetModeX m320x400x256, SCRW*4
  279.     
  280.     mov     ax,0
  281.     mov     cx,256
  282.     mov     si,offset CmpPal
  283.     @WritePalette
  284.  
  285.     @Set_PPC
  286.     call    PutImagesOnVGA
  287.  
  288.     mov     ah,1111b
  289.     @Set_Write_Plane
  290.  
  291.     mov     al,[CurLoc]
  292.     inc     al
  293.     mov     di,Page1/4
  294.     call    FillPage
  295.     mov     al,[CurLoc]
  296.     add     al,2
  297.     mov     di,Page2/4
  298.     call    FillPage
  299.     call    CopyLogo
  300.     
  301.     mov     bx,SplitScreen
  302.     @Set_Split
  303.     mov     bx,BaseOff+Page1/4
  304.     @Set_Start_Offset
  305. @@mainLoop:
  306.     mov     si,[MoveIndex]
  307.     add     si,si
  308.     inc     [MoveIndex]
  309.  
  310.     mov     bx,[CurOff]
  311.     cmp     bx,[DestOff]
  312.     je      @@NoMove
  313.     jl      @@Increase
  314.  
  315.     sub     bx,[MoveDist + si]
  316.     mov     [CurOff],bx
  317.     jmp     Short @@MoveIt
  318.  
  319. @@Increase:
  320.     add     bx,[MoveDist + si]
  321.     mov     [CurOff],bx
  322.  
  323. @@MoveIt:
  324.     mov     cx,LogoHeight/4
  325.     mov     dx,3dah         ;wait until scan line > height of logo
  326. @@WaitForVR:
  327.     in      al,dx
  328.     and     al,1000b
  329.     jz      @@WaitforVR
  330. @@WaitForVREnd:
  331.     in      al,dx
  332.     and     al,1000b
  333.     jnz     @@WaitforVREnd
  334.  
  335. @@WaitferHR:
  336.     in      al,dx
  337.     and     al,1001b
  338.     cmp     al,1
  339.     jne     @@WaitFerHR
  340. @@WaitForHRend:
  341.     in      al,dx
  342.     and     al,1001b
  343.     jne     @@WAitForHRend
  344.     dec     cx
  345.     jne     @@WaitferHR
  346.     
  347.     mov     cx,[CurOff]
  348.     mov     bx,cx
  349.     shr     bx,2
  350.     add     bx,BaseOff
  351.     @Set_Start_Offset
  352.     and     cl,11b
  353.     mov     ah,cl
  354.     add     ah,ah
  355.     @Set_HPP
  356.     call    CopyLogo
  357.     jmp     short @@DiDmove
  358. @@NoMove:
  359.     mov     [MoveIndex],0
  360. @@DidMove:
  361.     
  362.     mov     ah,1
  363.     int     16h
  364.     jz      @@MainLoop
  365.     mov     ah,0
  366.     int     16h
  367.     cmp     al,27
  368.     je      @@ByeBYe
  369.  
  370.     cmp     ah,75
  371.     jne     @@NotLeft
  372.     mov     ax,[CurOff]
  373.     cmp     ax,Page1
  374.     je      @@DoLeft1
  375.     cmp     ax,Page2
  376.     je      @@DoLeft2
  377.     cmp     ax,Page3
  378.     je      @@DoLeft3
  379.     jmp     @@MainLoop
  380. @@DoLeft1:
  381.     mov     si,Page1/4
  382.     mov     di,Page3/4
  383.     mov     [CurOff],Page3
  384.     call    CopyBlocks          ;move every thing over
  385.     @FullVertWait
  386.     call    FixUpScreen    
  387. @@DoLeft3:
  388.     mov     di,Page2/4
  389.     mov     al,[CurLoc]
  390.     call    FillPage
  391.     dec     [CurLoc]
  392.  
  393.     mov     [DestOff],Page2
  394.     mov     [MoveIndex],0
  395.     jmp     @@MainLoop
  396. @@DoLeft2:
  397.     mov     di,Page1/4
  398.     mov     al,[CurLoc]
  399.     call    FillPage
  400.     dec     [CurLoc]
  401.     mov     [DestOff],Page1
  402.     mov     [MoveIndex],0
  403.     jmp     @@MainLoop
  404.  
  405. @@NotLeft:
  406.     cmp     ah,77
  407.     jne     @@NotRight
  408.     mov     [MoveDirection],2
  409.     mov     ax,[CurOff]
  410.     cmp     ax,Page1
  411.     je      @@DoRight1
  412.     cmp     ax,Page2
  413.     je      @@DoRight2
  414.     cmp     ax,Page3
  415.     je      @@DoRight3
  416.     jmp     @@MainLoop
  417. @@DoRight1:
  418.     mov     di,Page3/4
  419.     mov     al,[CurLoc]
  420.     add     al,3
  421.     call    FillPage
  422.     inc     [CurLoc]
  423.     mov     [DestOff],Page2
  424.     mov     [MoveIndex],0
  425.     jmp     @@MainLoop
  426. @@DoRight2:
  427.     mov     di,Page4/4
  428.     mov     al,[CurLoc]
  429.     add     al,3
  430.     call    FillPage
  431.     inc     [CurLoc]
  432.     mov     [DestOff],Page3
  433.     mov     [MoveIndex],0
  434.     jmp     @@MainLoop
  435. @@DoRight3:
  436.     mov     si,Page3/4
  437.     mov     di,Page1/4
  438.     mov     [CurOff],Page1
  439.     call    CopyBlocks          ;move every thing over
  440.     @FullVertWait
  441.     call    FixUpScreen    
  442.  
  443.     mov     di,page3/4
  444.     mov     al,[CurLoc]
  445.     add     al,3
  446.     call    FillPage
  447.     inc     [CurLoc]
  448.  
  449.     mov     [DestOff],Page2
  450.     mov     [MoveIndex],0
  451.     jmp     @@MainLoop
  452.  
  453. @@NotRight:
  454.     jmp     @@MainLoop
  455. @@ByebYe:
  456.     mov     ax,3
  457.     int     10h
  458.     mov     ah,4ch
  459.     int     21h
  460. END START
  461.