home *** CD-ROM | disk | FTP | other *** search
/ FreeWare Collection 3 / FreeSoftwareCollection3pd199x-jp.img / oh_fm / inkyoku / gload.c < prev    next >
Text File  |  1980-01-02  |  2KB  |  122 lines

  1. /*
  2.     graphics image loader & viewer
  3. */
  4. #include <stdio.h>
  5. #include <egb.h>
  6. #include <stdlib.h>
  7. #include "crtc.h"
  8.  
  9. char work[1540] ;
  10.  
  11. ldram(fp,work,sx,sy,wx,wy ) /* VRAMへファイルからロード */
  12. FILE *fp ;
  13. char *work ;
  14. int sx,sy,wx,wy ;
  15. {
  16.     char *bp ;
  17.     int size ;
  18.     char para[16] ;
  19.  
  20.     size = wx * wy * 2 ;
  21.     if( (bp = (char *)malloc( size )) == 0 ) return -1 ;
  22.     fread( bp, 1, size, fp ) ;    
  23.     
  24.     DWORD(para + 0) = (unsigned int)bp ;
  25.     WORD (para + 4) = 0x14 ;
  26.     WORD (para + 6) = sx ;
  27.     WORD (para + 8) = sy ;
  28.     WORD (para +10) = sx + wx - 1 ;
  29.     WORD (para +12) = sy + wy - 1 ;
  30.     EGB_putBlock(work,0,para) ;
  31.  
  32.     free(bp) ;
  33.     return 0 ;
  34. }
  35.  
  36. void padzoom()    /* パッドでスクロール&拡大 */
  37. {
  38.     int p,x ;
  39.     int dsx,dsy,mag = 1 ;
  40.  
  41.     dsx = dsy = 0 ;
  42.     while((( p = getpad( 0 )) & 0xF) != 3 ) {
  43.         if( (p & 0xF) == 0xc ) return ;
  44.         if( !(p & 0x8) ) 
  45.             dsx = ++dsx & 0xFF ;
  46.         if( !(p & 0x4) ) 
  47.             dsx = --dsx & 0xFF ;
  48.         if( !(p & 0x2) )  
  49.             dsy = ++dsy & 0xFF ;
  50.         if( !(p & 0x1) )
  51.             dsy = --dsy & 0xFF ;
  52.         if((p & 0x30) == 0 ) {
  53.             dsx = dsy = 0;
  54.             mag = 1 ;
  55.         } else {
  56.             if(!(p & 0x10) ) { 
  57.                 if( ++mag > 15 ) mag = 15 ;
  58.                 while(!(getpad(0) & 0x10)) ;
  59.             }
  60.             if(!(p & 0x20) ) {
  61.                 if( --mag < 0 ) mag = 0 ;
  62.                 while(!(getpad(0) & 0x20)) ;
  63.             }
  64.         }
  65.         CRTC_ScreenOffset( dsx,dsy ) ;
  66.         CRTC_ZoomScreen( mag, mag ) ;
  67.         for( x = 0 ; x < 0x1000 ;x++ ) ; /* WAIT */
  68.     } 
  69. }
  70.  
  71. CRTC_ScreenOffset( sx,sy )    /* CRTCのFA0,FA1をセット */
  72. int sx,sy ;
  73. {
  74.     int ofs ;
  75.     ofs = (sy << 8) + (sx)  ;
  76.     CRTC( CA_FA0, ofs ) ;
  77.     CRTC( CA_FA1, ofs ) ;
  78. }
  79.  
  80. CRTC_ZoomScreen( wx, wy ) 
  81. int wx,wy ;
  82. {
  83.     int z ;
  84.     z = (wy << 4)+ wx ;
  85.     z = (z  << 8) + z ;
  86.     CRTC( CA_ZOOM,z ) ;
  87. }
  88.  
  89. getpad( port ) /* read pad port */
  90. int port ;
  91. {
  92.     OUTPB( 0x4d6 , 0x3F ) ;
  93.     return( INPB( 0x4d0 + port * 2 ) ) ;
  94. }
  95.  
  96. main(ac,av)
  97. int ac ;
  98. char **av ;
  99. {    
  100.     FILE *fp ;
  101.     long offset ;
  102.  
  103.     offset = 0 ;
  104.  
  105.     if( ac > 2 ) offset = atoi( av[ 2 ] ) ;
  106.     if( (fp = fopen( av[1], "rb" )) == NULL ) return ;
  107.  
  108.     EGB_init( work, 1536 ) ;
  109.     EGB_resolution( work, 0, 10 ) ;
  110.     EGB_resolution( work, 1, 10 ) ;
  111.     EGB_displayPage( work, 0,3 ) ;
  112.     EGB_writePage( work , 0 ) ;
  113.     EGB_displayStart( work, 2, 2, 2 ) ;
  114.     EGB_displayStart( work, 3, 320, 240 ) ;
  115.     
  116.     fseek( fp, offset, SEEK_SET ) ;
  117.     if( ldram(fp,work,0,0,320,240 ) != -1 ) 
  118.         padzoom() ;
  119.     fclose( fp ) ;
  120.     screenterm( work ) ;
  121. }  
  122.