Annotation of frontvm/hardware/video.c, revision 1.1.1.1

1.1       root        1: /*
                      2:   Hatari - video.c
                      3: 
                      4:   This file is distributed under the GNU Public License, version 2 or at
                      5:   your option any later version. Read the file gpl.txt for details.
                      6: 
                      7:   Video hardware handling. This code handling all to do with the video chip. So, we handle
                      8:   VBLs, HBLs, copying the ST screen to a buffer to simulate the TV raster trace, border
                      9:   removal, palette changes per HBL, the 'video address pointer' etc...
                     10: */
                     11: 
                     12: #include <SDL.h>
                     13: 
                     14: #include "main.h"
                     15: #include "decode.h"
                     16: #include "configuration.h"
                     17: #include "int.h"
                     18: #include "keymap.h"
                     19: #include "m68000.h"
                     20: #include "memAlloc.h"
                     21: #include "screen.h"
                     22: #include "shortcut.h"
                     23: #include "stMemory.h"
                     24: #include "video.h"
                     25: #include "hatari-glue.h"
                     26: 
                     27: long VideoAddress;                              /* Address of video display in ST screen space */
                     28: unsigned long VideoBase;                        /* Base address in ST Ram for screen(read on each VBL) */
                     29: unsigned char *VideoRaster;                      /* Pointer to Video raster, after VideoBase in PC address space. Use to copy data on HBL */
                     30: int SyncHandler_Value;                          /* Value to pass to 'Video_SyncHandler_xxxx' functions */
                     31: int nScreenRefreshRate = 50;                    /* 50 or 60 Hz in color, 70 Hz in mono */
                     32: 
                     33: 
                     34: /*-----------------------------------------------------------------------*/
                     35: /*
                     36:   Reset video chip
                     37: */
                     38: void Video_Reset(void)
                     39: {
                     40:   /* Reset addresses */
                     41:   VideoBase = 0L;
                     42:   VideoRaster = STRam;
                     43: }
                     44: 
                     45: /*-----------------------------------------------------------------------*/
                     46: /*
                     47:   Read Video address pointer(from current cycle count), and return 24-bit address in 'ebx'
                     48: */
                     49: unsigned long Video_ReadAddress(void)
                     50: {
                     51:   VideoAddress = VideoBase;
                     52:   return( VideoAddress );
                     53: }
                     54: 
                     55: /*
                     56:  * 68k prog must call host screen_draw in its vblank.
                     57:  */
                     58: void Video_InterruptHandler_VBL(void)
                     59: {
                     60:   /* Clear any key presses which are due to be de-bounced (held for one ST frame) */
                     61:   Keymap_DebounceAllKeys();
                     62:   /* Check 'Function' keys, so if press F12 we update screen correctly to Window! */
                     63:   ShortCut_CheckKeys();
                     64: 
                     65:   MakeSR();
                     66:   if ((4>FIND_IPL) && (4 > intlev ()))     /* Vertical blank, level 4! */
                     67:   {
                     68:     ExceptionVector = EXCEPTION_VBLANK;
                     69:     M68000_Exception();        /* VBL interrupt */
                     70:   }
                     71:   else
                     72:   {
                     73:     /* Higher priority interrupt is currently being executed(eg MFP). Set VBL to occur later */
                     74:     if (!Int_InterruptActive(INTERRUPT_VIDEO_VBL_PENDING))
                     75:       Int_AddAbsoluteInterrupt(100,INTERRUPT_VIDEO_VBL_PENDING);
                     76:   }
                     77: 
                     78:   /* And handle any messages, check for quit message */
                     79:   Main_EventHandler();         /* Process messages, set 'bQuitProgram' if user tries to quit */
                     80:   /* Pass NULL interrupt function to quit cleanly */
                     81:   if (bQuitProgram) Int_AddAbsoluteInterrupt(4, 0L);
                     82: }
                     83: 
                     84: 
                     85: /*-----------------------------------------------------------------------*/
                     86: /*
                     87:   This doesn't make sense... I always thought if a 68000 interrupt, eg the VBL, occurs while a
                     88:   higher priority interrupt was in service the interrupt was ignored. This does not seem to be
                     89:   the case. This really needs checking on a real ST, but I have noticed some menu discs run
                     90:   sound routines from the MFP timers which overlap the VBL, yet the VBL still occurs...
                     91: */
                     92: void Video_InterruptHandler_VBL_Pending(void)
                     93: {
                     94:   /* Remove this interrupt from list and re-order */
                     95:   Int_AcknowledgeInterrupt();
                     96: 
                     97:   MakeSR();
                     98:   /* Check if can execute VBL */
                     99:   if ((4>FIND_IPL) && (4 > intlev ()))     /* Vertical blank, level 4! */
                    100:   {
                    101:     ExceptionVector = EXCEPTION_VBLANK;
                    102:     M68000_Exception();        /* VBL interrupt */
                    103:   }
                    104:   else
                    105:     Int_AddAbsoluteInterrupt(100,INTERRUPT_VIDEO_VBL_PENDING);
                    106: }
                    107: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.