Annotation of frontvm/hardware/video.c, revision 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.