Annotation of previous/src/video.c, revision 1.1.1.1

1.1       root        1: /*
                      2:   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: */
                      8: const char Video_fileid[] = "Hatari video.c : " __DATE__ " " __TIME__;
                      9: 
                     10: #include <SDL_endian.h>
                     11: 
                     12: #include "main.h"
                     13: #include "configuration.h"
                     14: #include "cycles.h"
                     15: #include "cycInt.h"
                     16: #include "ioMem.h"
                     17: #include "m68000.h"
                     18: #include "memorySnapShot.h"
                     19: #include "screen.h"
                     20: #include "screenSnapShot.h"
                     21: #include "shortcut.h"
                     22: #include "nextMemory.h"
                     23: #include "video.h"
                     24: #include "avi_record.h"
                     25: 
                     26: 
                     27: /*--------------------------------------------------------------*/
                     28: /* Local functions prototypes                                   */
                     29: /*--------------------------------------------------------------*/
                     30: 
                     31: static void    Video_SetSystemTimings ( void );
                     32: 
                     33: static Uint32  Video_CalculateAddress ( void );
                     34: static int     Video_GetMMUStartCycle ( int DisplayStartCycle );
                     35: static void    Video_WriteToShifter ( Uint8 Res );
                     36: static void    Video_Sync_SetDefaultStartEnd ( Uint8 Freq , int HblCounterVideo , int LineCycles );
                     37: 
                     38: static int     Video_HBL_GetPos ( void );
                     39: static void    Video_EndHBL ( void );
                     40: static void    Video_StartHBL ( void );
                     41: 
                     42: static void    Video_StoreFirstLinePalette(void);
                     43: static void    Video_StoreResolution(int y);
                     44: static void    Video_CopyScreenLineMono(void);
                     45: static void    Video_CopyScreenLineColor(void);
                     46: static void    Video_CopyVDIScreen(void);
                     47: static void    Video_SetHBLPaletteMaskPointers(void);
                     48: 
                     49: static void    Video_UpdateTTPalette(int bpp);
                     50: static void    Video_DrawScreen(void);
                     51: 
                     52: static void    Video_ResetShifterTimings(void);
                     53: static void    Video_InitShifterLines(void);
                     54: static void    Video_ClearOnVBL(void);
                     55: 
                     56: static void    Video_AddInterrupt ( int Pos , interrupt_id Handler );
                     57: static void    Video_AddInterruptHBL ( int Pos );
                     58: 
                     59: static void    Video_ColorReg_WriteWord(Uint32 addr);
                     60: 
                     61: int nScanlinesPerFrame = 400;                   /* Number of scan lines per frame */
                     62: int nCyclesPerLine = 512;
                     63: 
                     64: /*-----------------------------------------------------------------------*/
                     65: /**
                     66:  * Save/Restore snapshot of local variables('MemorySnapShot_Store' handles type)
                     67:  */
                     68: void Video_MemorySnapShot_Capture(bool bSave)
                     69: {
                     70: }
                     71: 
                     72: 
                     73: /*-----------------------------------------------------------------------*/
                     74: /**
                     75:  * Reset video chip
                     76:  */
                     77: void Video_Reset(void)
                     78: {
                     79:        Video_StartInterrupts(0);
                     80: }
                     81: 
                     82: 
                     83: /*-----------------------------------------------------------------------*/
                     84: /**
                     85:  * Reset the GLUE chip responsible for generating the H/V sync signals.
                     86:  * When the 68000 RESET instruction is called, frequency and resolution
                     87:  * should be reset to 0.
                     88:  */
                     89: void Video_Reset_Glue(void)
                     90: {
                     91: }
                     92: 
                     93: 
                     94: /*-----------------------------------------------------------------------*/
                     95: /*
                     96:  * Set specific video timings, depending on the system being emulated.
                     97:  */
                     98: static void    Video_SetSystemTimings(void)
                     99: {
                    100:        Video_StartInterrupts(0);
                    101: }
                    102: 
                    103: 
                    104: /*-----------------------------------------------------------------------*/
                    105: /**
                    106:  * Convert the elapsed number of cycles since the start of the VBL
                    107:  * into the corresponding HBL number and the cycle position in the current
                    108:  * HBL. We use the starting cycle position of the closest HBL to compute
                    109:  * the cycle position on the line (this allows to mix lines with different
                    110:  * values for nCyclesPerLine).
                    111:  * We can have 2 cases on the limit where the real video line count can be
                    112:  * different from nHBL :
                    113:  * - when reading video address between cycle 0 and 12, LineCycle will be <0,
                    114:  *   so we need to use the data from line nHBL-1
                    115:  * - if LineCycle >= nCyclesPerLine, this means the HBL int was not processed
                    116:  *   yet, so the video line number is in fact nHBL+1
                    117:  */
                    118: 
                    119: void   Video_ConvertPosition ( int FrameCycles , int *pHBL , int *pLineCycles )
                    120: {
                    121: }
                    122: 
                    123: 
                    124: void   Video_GetPosition ( int *pFrameCycles , int *pHBL , int *pLineCycles )
                    125: {
                    126: }
                    127: 
                    128: 
                    129: void   Video_GetPosition_OnWriteAccess ( int *pFrameCycles , int *pHBL , int *pLineCycles )
                    130: {
                    131: }
                    132: 
                    133: 
                    134: void   Video_GetPosition_OnReadAccess ( int *pFrameCycles , int *pHBL , int *pLineCycles )
                    135: {
                    136: }
                    137: 
                    138: 
                    139: /*-----------------------------------------------------------------------*/
                    140: /**
                    141:  * Calculate and return video address pointer.
                    142:  */
                    143: static Uint32 Video_CalculateAddress ( void )
                    144: {
                    145:        return 0;
                    146: }
                    147: 
                    148: 
                    149: /*-----------------------------------------------------------------------*/
                    150: /**
                    151:  * Calculate the cycle where the STF/STE's MMU starts reading
                    152:  * data to send them to the shifter.
                    153:  * On STE, if hscroll is used, prefetch will cause this position to
                    154:  * happen 16 cycles earlier.
                    155:  * This function should use the same logic as in Video_CalculateAddress.
                    156:  * NOTE : this function is not completly accurate, as even when there's
                    157:  * no hscroll (on STF) the mmu starts reading 16 cycles before display starts.
                    158:  * But it's good enough to emulate writing to ff8205/07/09 on STE.
                    159:  */
                    160: static int Video_GetMMUStartCycle ( int DisplayStartCycle )
                    161: {
                    162:        return 0;
                    163: }
                    164: 
                    165: 
                    166: /*-----------------------------------------------------------------------*/
                    167: /**
                    168:  * Write to VideoShifter (0xff8260), resolution bits
                    169:  */
                    170: static void Video_WriteToShifter ( Uint8 Res )
                    171: {
                    172: }
                    173: 
                    174: 
                    175: 
                    176: /*-----------------------------------------------------------------------*/
                    177: /**
                    178:  * Set some default values for DisplayStartCycle/DisplayEndCycle
                    179:  * when changing frequency in lo/med res (testing orders are important
                    180:  * because the line can already have some borders changed).
                    181:  * This is necessary as some freq changes can modify start/end
                    182:  * even if they're not made at the exact borders' positions.
                    183:  * These values will be modified later if some borders are changed.
                    184:  */
                    185: static void    Video_Sync_SetDefaultStartEnd ( Uint8 Freq , int HblCounterVideo , int LineCycles )
                    186: {
                    187: }
                    188: 
                    189: 
                    190: /*-----------------------------------------------------------------------*/
                    191: /**
                    192:  * Write to VideoSync (0xff820a), Hz setting
                    193:  */
                    194: void Video_Sync_WriteByte ( void )
                    195: {
                    196: }
                    197: 
                    198: 
                    199: /*-----------------------------------------------------------------------*/
                    200: /**
                    201:  * Compute the cycle position where the HBL should happen on each line.
                    202:  * In low/med res, the position depends on the video frequency (50/60 Hz)
                    203:  * In high res, the position is always the same.
                    204:  * This position also gives the number of CPU cycles per video line.
                    205:  */
                    206: static int Video_HBL_GetPos ( void )
                    207: {
                    208:        return 0;
                    209: }
                    210: 
                    211: 
                    212: /*-----------------------------------------------------------------------*/
                    213: /**
                    214:  * Compute the cycle position where the timer B should happen on each
                    215:  * visible line.
                    216:  * We compute Timer B position for the given LineNumber, using start/end
                    217:  * display cycles from ShifterLines[ LineNumber ].
                    218:  * The position depends on the start of line / end of line positions
                    219:  * (which depend on the current frequency / border tricks) and
                    220:  * on the value of the bit 3 in the MFP's AER.
                    221:  * If bit is 0, timer B will count end of line events (usual case),
                    222:  * but if bit is 1, timer B will count start of line events (eg Seven Gates Of Jambala)
                    223:  */
                    224: int Video_TimerB_GetPos ( int LineNumber )
                    225: {
                    226:        return 0;
                    227: }
                    228: 
                    229: 
                    230: /*-----------------------------------------------------------------------*/
                    231: /**
                    232:  * HBL interrupt : this occurs at the end of every line, on cycle 512 (in 50 Hz)
                    233:  * It takes 56 cycles to handle the 68000's exception.
                    234:  */
                    235: void Video_InterruptHandler_HBL ( void )
                    236: {
                    237: }
                    238: 
                    239: 
                    240: /*-----------------------------------------------------------------------*/
                    241: /**
                    242:  * Check at end of each HBL to see if any Shifter hardware tricks have been attempted
                    243:  * and copy the line to the screen buffer.
                    244:  * This is the place to check if top/bottom border were removed, as well as if some
                    245:  * left/right border changes were not validated before.
                    246:  * NOTE : the tests must be made with nHBL in ascending order.
                    247:  */
                    248: static void Video_EndHBL(void)
                    249: {
                    250: }
                    251: 
                    252: 
                    253: /*-----------------------------------------------------------------------*/
                    254: /**
                    255:  * Set default values for the next HBL, depending on the current res/freq.
                    256:  * We set the number of cycles per line, as well as some default values
                    257:  * for display start/end cycle.
                    258:  */
                    259: static void Video_StartHBL(void)
                    260: {
                    261: }
                    262: 
                    263: 
                    264: /*-----------------------------------------------------------------------*/
                    265: /**
                    266:  * End Of Line interrupt
                    267:  * This interrupt is started on cycle position 404 in 50 Hz and on cycle
                    268:  * position 400 in 60 Hz. 50 Hz display ends at cycle 376 and 60 Hz displays
                    269:  * ends at cycle 372. This means the EndLine interrupt happens 28 cycles
                    270:  * after DisplayEndCycle.
                    271:  * Note that if bit 3 of MFP AER is 1, then timer B will count start of line
                    272:  * instead of end of line (at cycle 52+28 or 56+28)
                    273:  */
                    274: void Video_InterruptHandler_EndLine(void)
                    275: {
                    276: }
                    277: 
                    278: 
                    279: 
                    280: 
                    281: /*-----------------------------------------------------------------------*/
                    282: /**
                    283:  * Store whole palette on first line so have reference to work from
                    284:  */
                    285: static void Video_StoreFirstLinePalette(void)
                    286: {
                    287: }
                    288: 
                    289: 
                    290: /*-----------------------------------------------------------------------*/
                    291: /**
                    292:  * Store resolution on each line (used to test if mixed low/medium resolutions)
                    293:  */
                    294: static void Video_StoreResolution(int y)
                    295: {
                    296: }
                    297: 
                    298: 
                    299: /*-----------------------------------------------------------------------*/
                    300: /**
                    301:  * Copy one line of monochrome screen into buffer for conversion later.
                    302:  */
                    303: static void Video_CopyScreenLineMono(void)
                    304: {
                    305: }
                    306: 
                    307: 
                    308: /*-----------------------------------------------------------------------*/
                    309: /**
                    310:  * Copy one line of color screen into buffer for conversion later.
                    311:  * Possible lines may be top/bottom border, and/or left/right borders.
                    312:  */
                    313: static void Video_CopyScreenLineColor(void)
                    314: {
                    315: }
                    316: 
                    317: 
                    318: /*-----------------------------------------------------------------------*/
                    319: /**
                    320:  * Copy extended GEM resolution screen
                    321:  */
                    322: static void Video_CopyVDIScreen(void)
                    323: {
                    324: }
                    325: 
                    326: 
                    327: /*-----------------------------------------------------------------------*/
                    328: /**
                    329:  * Clear raster line table to store changes in palette/resolution on a line
                    330:  * basic. Called once on VBL interrupt.
                    331:  */
                    332: void Video_SetScreenRasters(void)
                    333: {
                    334: }
                    335: 
                    336: 
                    337: /*-----------------------------------------------------------------------*/
                    338: /**
                    339:  * Set pointers to HBLPalette tables to store correct colours/resolutions
                    340:  */
                    341: static void Video_SetHBLPaletteMaskPointers(void)
                    342: {
                    343: }
                    344: 
                    345: 
                    346: /*-----------------------------------------------------------------------*/
                    347: /**
                    348:  * Set video shifter timing variables according to screen refresh rate.
                    349:  * Note: The following equation must be satisfied for correct timings:
                    350:  *
                    351:  *   nCyclesPerLine * nScanlinesPerFrame * nScreenRefreshRate = 8 MHz
                    352:  */
                    353: static void Video_ResetShifterTimings(void)
                    354: {
                    355: }
                    356: 
                    357: 
                    358: /*-----------------------------------------------------------------------*/
                    359: /**
                    360:  * Clear the array indicating the state of each video line.
                    361:  */
                    362: static void Video_InitShifterLines ( void )
                    363: {
                    364: }
                    365: 
                    366: 
                    367: /*-----------------------------------------------------------------------*/
                    368: /**
                    369:  * Called on VBL, set registers ready for frame
                    370:  */
                    371: static void Video_ClearOnVBL(void)
                    372: {
                    373: }
                    374: 
                    375: 
                    376: /*-----------------------------------------------------------------------*/
                    377: /**
                    378:  * Get width, height and bpp according to TT-Resolution
                    379:  */
                    380: void Video_GetTTRes(int *width, int *height, int *bpp)
                    381: {
                    382: }
                    383: 
                    384: 
                    385: /*-----------------------------------------------------------------------*/
                    386: /**
                    387:  * Convert TT palette to SDL palette
                    388:  */
                    389: static void Video_UpdateTTPalette(int bpp)
                    390: {
                    391: }
                    392: 
                    393: 
                    394: /*-----------------------------------------------------------------------*/
                    395: /**
                    396:  * Update TT palette and blit TT screen using VIDEL code.
                    397:  * @return  true if the screen contents changed
                    398:  */
                    399: bool Video_RenderTTScreen(void)
                    400: {
                    401:        return true;
                    402: }
                    403: 
                    404: 
                    405: /*-----------------------------------------------------------------------*/
                    406: /**
                    407:  * Draw screen (either with ST/STE shifter drawing functions or with
                    408:  * Videl drawing functions)
                    409:  */
                    410: static void Video_DrawScreen(void)
                    411: {
                    412: //        memcpy(pNEXTScreen, NEXTVideo, (1024*768)/8);
                    413: Screen_Draw();
                    414: }
                    415: 
                    416: 
                    417: /*-----------------------------------------------------------------------*/
                    418: /**
                    419:  * Start HBL, Timer B and VBL interrupts.
                    420:  */
                    421: 
                    422: 
                    423: /**
                    424:  * Start HBL or Timer B interrupt at position Pos. If position Pos was
                    425:  * already reached, then the interrupt is set on the next line.
                    426:  */
                    427: 
                    428: static void Video_AddInterrupt ( int Pos , interrupt_id Handler )
                    429: {
                    430: }
                    431: 
                    432: 
                    433: static void Video_AddInterruptHBL ( int Pos )
                    434: {
                    435: }
                    436: 
                    437: 
                    438: void Video_AddInterruptTimerB ( int Pos )
                    439: {
                    440: }
                    441: 
                    442: 
                    443: /**
                    444:  * Add some video interrupts to handle the first HBL and the first Timer B
                    445:  */
                    446: void Video_StartInterrupts ( int PendingCyclesOver )
                    447: {
                    448:        int CyclesPerVBL;
                    449:        
                    450:         CyclesPerVBL = CYCLES_PER_FRAME;
                    451:         CycInt_AddRelativeInterrupt(CyclesPerVBL, INT_CPU_CYCLE, INTERRUPT_VIDEO_VBL);
                    452: }
                    453: 
                    454: 
                    455: /*-----------------------------------------------------------------------*/
                    456: /**
                    457:  * VBL interrupt : set new interrupts, draw screen, generate sound,
                    458:  * reset counters, ...
                    459:  */
                    460: void Video_InterruptHandler_VBL ( void )
                    461: {
                    462:        CycInt_AcknowledgeInterrupt();
                    463:        Video_DrawScreen();
                    464:         Main_EventHandler();
                    465:         CycInt_AddRelativeInterrupt(CYCLES_PER_FRAME, INT_CPU_CYCLE, INTERRUPT_VIDEO_VBL);
                    466: }
                    467: 
                    468: 
                    469: /*-----------------------------------------------------------------------*/
                    470: /**
                    471:  * Write to video address base high, med and low register (0xff8201/03/0d).
                    472:  * On STE, when a program writes to high or med registers, base low register
                    473:  * is reset to zero.
                    474:  */
                    475: void Video_ScreenBaseSTE_WriteByte(void)
                    476: {
                    477: }
                    478: 
                    479: /*-----------------------------------------------------------------------*/
                    480: /**
                    481:  * Read video address counter and update ff8205/07/09
                    482:  */
                    483: void Video_ScreenCounter_ReadByte(void)
                    484: {
                    485: }
                    486: 
                    487: /*-----------------------------------------------------------------------*/
                    488: /**
                    489:  */
                    490: void Video_ScreenCounter_WriteByte(void)
                    491: {
                    492: }
                    493: 
                    494: /*-----------------------------------------------------------------------*/
                    495: /**
                    496:  * Read video sync register (0xff820a)
                    497:  */
                    498: void Video_Sync_ReadByte(void)
                    499: {
                    500: }
                    501: 
                    502: /*-----------------------------------------------------------------------*/
                    503: /**
                    504:  * Read video base address low byte (0xff820d). A plain ST can only store
                    505:  * screen addresses rounded to 256 bytes (i.e. no lower byte).
                    506:  */
                    507: void Video_BaseLow_ReadByte(void)
                    508: {
                    509: }
                    510: 
                    511: /*-----------------------------------------------------------------------*/
                    512: /**
                    513:  * Read video line width register (0xff820f)
                    514:  */
                    515: void Video_LineWidth_ReadByte(void)
                    516: {
                    517: }
                    518: 
                    519: /*-----------------------------------------------------------------------*/
                    520: /**
                    521:  * Read video shifter mode register (0xff8260)
                    522:  */
                    523: void Video_ShifterMode_ReadByte(void)
                    524: {
                    525: }
                    526: 
                    527: /*-----------------------------------------------------------------------*/
                    528: /**
                    529:  * Read horizontal scroll register (0xff8265)
                    530:  */
                    531: void Video_HorScroll_Read(void)
                    532: {
                    533: }
                    534: 
                    535: /*-----------------------------------------------------------------------*/
                    536: /**
                    537:  * Write video line width register (0xff820f) - STE only.
                    538:  * Content of LineWidth is added to the shifter counter when display is
                    539:  * turned off (start of the right border, usually at cycle 376)
                    540:  */
                    541: void Video_LineWidth_WriteByte(void)
                    542: {
                    543: }
                    544: 
                    545: /*-----------------------------------------------------------------------*/
                    546: /**
                    547:  */
                    548: static void Video_ColorReg_WriteWord(Uint32 addr)
                    549: {
                    550: }
                    551: 
                    552: void Video_Color0_WriteWord(void)
                    553: {
                    554: }
                    555: 
                    556: void Video_Color1_WriteWord(void)
                    557: {
                    558: }
                    559: 
                    560: void Video_Color2_WriteWord(void)
                    561: {
                    562: }
                    563: 
                    564: void Video_Color3_WriteWord(void)
                    565: {
                    566: }
                    567: 
                    568: void Video_Color4_WriteWord(void)
                    569: {
                    570: }
                    571: 
                    572: void Video_Color5_WriteWord(void)
                    573: {
                    574: }
                    575: 
                    576: void Video_Color6_WriteWord(void)
                    577: {
                    578: }
                    579: 
                    580: void Video_Color7_WriteWord(void)
                    581: {
                    582: }
                    583: 
                    584: void Video_Color8_WriteWord(void)
                    585: {
                    586: }
                    587: 
                    588: void Video_Color9_WriteWord(void)
                    589: {
                    590: }
                    591: 
                    592: void Video_Color10_WriteWord(void)
                    593: {
                    594: }
                    595: 
                    596: void Video_Color11_WriteWord(void)
                    597: {
                    598: }
                    599: 
                    600: void Video_Color12_WriteWord(void)
                    601: {
                    602: }
                    603: 
                    604: void Video_Color13_WriteWord(void)
                    605: {
                    606: }
                    607: 
                    608: void Video_Color14_WriteWord(void)
                    609: {
                    610: }
                    611: 
                    612: void Video_Color15_WriteWord(void)
                    613: {
                    614: }
                    615: 
                    616: 
                    617: /*-----------------------------------------------------------------------*/
                    618: /**
                    619:  * Write video shifter mode register (0xff8260)
                    620:  */
                    621: void Video_ShifterMode_WriteByte(void)
                    622: {
                    623: }
                    624: 
                    625: /*-----------------------------------------------------------------------*/
                    626: /**
                    627:  */
                    628: 
                    629: void Video_HorScroll_Write_8264(void)
                    630: {
                    631: }
                    632: 
                    633: void Video_HorScroll_Write_8265(void)
                    634: {
                    635: }
                    636: 
                    637: void Video_HorScroll_Write(void)
                    638: {
                    639: }
                    640: 
                    641: /*-----------------------------------------------------------------------*/
                    642: /**
                    643:  * Write to TT shifter mode register (0xff8262)
                    644:  */
                    645: void Video_TTShiftMode_WriteWord(void)
                    646: {
                    647: }
                    648: 
                    649: /*-----------------------------------------------------------------------*/
                    650: /**
                    651:  * Write to TT color register (0xff8400)
                    652:  */
                    653: void Video_TTColorRegs_WriteWord(void)
                    654: {
                    655: }
                    656: 
                    657: /*-----------------------------------------------------------------------*/
                    658: /**
                    659:  * Write to ST color register on TT (0xff8240)
                    660:  */
                    661: void Video_TTColorSTRegs_WriteWord(void)
                    662: {
                    663: }

unix.superglobalmegacorp.com

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