Subversion Repositories pentevo

Rev

Blame | Last modification | View Log | Download | RSS feed | ?url?

  1. #include "std.h"
  2.  
  3. #include "emul.h"
  4. #include "vars.h"
  5. #include "memory.h"
  6. #include "draw.h"
  7. #include "atm.h"
  8.  
  9. #include "funcs.h"      //NEDOREPO
  10.  
  11. //=============================================================================
  12. static void atm_memswap()
  13. {
  14.     // Єръюх °єёЄтр, ўЄю ¤Єю урЇэю яхЁхъшф√трхЄ 2 ьхЄЁр ярь Єш
  15.     // р эх яхЁхяєЄ√трхЄ ёЁрэ√х сшЄ√
  16.     //    яюЄюь сєфхЄ ъєўр сруют ё фхсрухЁюь, сЁ ърьш шЄф...
  17.     //-------------------------------------------------------------------------
  18.     if (!conf.atm.mem_swap)
  19.         return;
  20.     //-------------------------------------------------------------------------
  21.     // swap memory address bits A5-A7 and A8-A10
  22.     for (unsigned start_page = 0; start_page < conf.ramsize*1024; start_page += 2048)
  23.     {
  24.         unsigned char buffer[2048], *bank = memory + start_page;
  25.         //---------------------------------------------------------------------
  26.         for (unsigned addr = 0; addr < 2048; addr++)
  27.             buffer[addr] = bank[(addr & 0x1F) + ((addr >> 3) & 0xE0) + ((addr << 3) & 0x700)];
  28.         //---------------------------------------------------------------------
  29.         memcpy(bank, buffer, 2048);
  30.     }
  31.     //-------------------------------------------------------------------------
  32. }
  33. //=============================================================================
  34.  
  35.  
  36. //=============================================================================
  37. static void AtmApplySideEffectsWhenChangeVideomode(unsigned char val)
  38. {
  39.     int NewVideoMode = (val & 7);
  40.     int OldVideoMode = (comp.pFF77 & 7);
  41.  
  42.     // ╩юэёЄрэЄ√ ьюцэю чрфрЄ№ ц╕ёЄъю, яюЄюьє ўЄю ьхцфє ьюфхы ьш └╥╠2 юэш эх ьхэ ■Єё .
  43.     const int tScanlineWidth = 224;
  44.     const int tScreenWidth = 320/2;
  45.     const int tEachBorderWidth = (tScanlineWidth - tScreenWidth)/2;
  46.     const int iLinesAboveBorder = 56;
  47.  
  48.     int iRayLine = cpu.t / tScanlineWidth;
  49.     int iRayOffset = cpu.t % tScanlineWidth;
  50. /*    
  51.     static int iLastLine = 0;
  52.     if ( iLastLine > iRayLine )
  53.     {
  54.         printf("\nNew Frame Begin\n");
  55.         __debugbreak();
  56.     }
  57.     iLastLine = iRayLine;
  58.     printf("%d->%d %d %d\n", OldVideoMode, NewVideoMode, iRayLine, iRayOffset);
  59. */
  60.     //-------------------------------------------------------------------------
  61.     if ((OldVideoMode == 3) || (NewVideoMode == 3))
  62.     {
  63.         // ╧хЁхъы■ўхэшх шч/т sinclair Ёхцшь эх шьххЄ яюыхчэ√ї яюсюўэ√ї ¤ЇЇхъЄют
  64.         // (яю ёыютрь AlCo фрцх ёшэїЁр ёсштрхЄё )
  65.         for (unsigned y = 0; y < 200; y++)
  66.         {
  67.             AtmVideoCtrl.Scanlines[y+56].VideoMode = NewVideoMode;
  68.             AtmVideoCtrl.Scanlines[y+56].Offset = int(((y & ~7U) << 3) + 0x01C0);
  69.         }
  70.         return;
  71.     }
  72.     //-------------------------------------------------------------------------
  73.     if ((OldVideoMode != 6) && (NewVideoMode != 6))
  74.     {
  75.         // ═рё шэЄхЁхёє■Є Єюы№ъю яхЁхъы■ўхэш  ьхцфє ЄхъёЄют√ь Ёхцшьюь ш Ёрё°шЁхээ√ьш уЁрЇшўхёъшьш.
  76.         // ╥хъёЄютюую Ёхцшьр эхЄ эш фю, эш яюёых яхЁхъы■ўхэш .
  77.         // ╤ыхфютрЄхы№эю, эхЄ ш яюсюўэ√ї ¤ЇЇхъЄют.
  78.        
  79.         //---------------------------------------------------------------------
  80.         // ╨рёяЁюёЄЁрэ хь эют√щ тшфхюЁхцшь эр эхюЄЁшёютрээ√х ёърэышэшш
  81.         if (iRayOffset >= tEachBorderWidth)
  82.             ++iRayLine;
  83.         //---------------------------------------------------------------------
  84.         while (iRayLine < 256)
  85.         {
  86.             AtmVideoCtrl.Scanlines[iRayLine++].VideoMode = NewVideoMode;
  87.         }
  88. //      printf("%d->%d SKIPPED!\n",  OldVideoMode, NewVideoMode);
  89.         return;
  90.     }
  91.     //-------------------------------------------------------------------------
  92.     //
  93.     // ╥хЁьшэюыюуш  ш ъюэёЄрэЄ√:
  94.     // ▌ъЁрэ ёюфхЁцшЄ 312 ёърэышэшщ, яю 224ЄръЄр (noturbo) т ърцфющ.
  95.     //
  96.     //  "ёЄЁюър" - ьырф°шх 3 сшЄр эюьхЁр юЄЁшёют√трхьющ тшфхюъюэЄЁюыыхЁюь (ыєўюь) ёърэышэшш
  97.     //  "рфЁхё"  - Єхъє∙шщ рфЁхё т тшфхюярь Єш, ё ъюЄюЁюую т√сшЁрхЄ срщЄ√ тшфхюъюэЄЁюыыхЁ
  98.     //             рфЁхё ьхэ хЄё  ё уЁрэєы ЁэюёЄ№■ +8 шыш +64
  99.     //  "¤ъЁрэ"  - ЁрёЄЁютр  ърЁЄшэър. ╤ю тёхї ёЄюЁюэ юъЁєцхэр "сюЁф■Ёюь".
  100.     //             ╨рчьхЁ√ сюЁф■Ёр:
  101.     //                 ётхЁїє ш ёэшчє юЄ ЁрёЄЁр: 56 ёърэышэшщ
  102.     //                 ёыхтр ш ёяЁртр юЄ ЁрёЄЁр: 32 ЄръЄр (64 яшъёхы ).
  103.     //
  104.     //  +64 яЁюшёїюфшЄ, ъюуфр CROW 1->0, Єю хёЄ№:
  105.     //      ышсю т ЄхъёЄьюфх яЁш яхЁхїюфх ёю ёЄЁюъш 7 эр ёЄЁюъє 0,
  106.     //      ышсю яЁш яхЁхъы■ўхэшш ЄхъёЄьюф->уЁрЇшър яЁш рфЁхёх A5=0,
  107.     //      ышсю яЁш яхЁхъы■ўхэшш уЁрЇшър->ЄхъёЄьюф яЁш рфЁхёх A5=1 ш ёЄЁюъх 0..3
  108.     //
  109.     //  +8 яЁюшёїюфшЄ эр ЁрёЄЁх т ъюэЎх 64-сыюър яшъёхыхщ (ърцф√х 32ЄръЄр) эхчртшёшью юЄ Ёхцшьр
  110.     //  (┬└╞═╬: +8 эх чртЁряыхэ√ тэєЄЁш A3..A5 р яЁюшчтюф Є ўхёЄэюх ёыюцхэшх ё рфЁхёюь.)
  111.     //
  112.     //  ёсЁюё A3..A5 (эръюяыхээ√ї +8) яЁюшёїюфшЄ, ъюуфр RCOL 1->0, Єю хёЄ№:
  113.     //      ышсю т ЄхъёЄьюфх яЁш яхЁхїюфх ё ЁрёЄЁр эр сюЁф■Ё,
  114.     //      ышсю эр сюЁф■Ёх яЁш яхЁхъы■ўхэшш уЁрЇшър->ЄхъёЄьюф
  115.     //
  116.     //-------------------------------------------------------------------------
  117.  
  118.     //-------------------------------------------------------------------------
  119.     if (iRayLine >= 256)
  120.     {
  121.         return;
  122.     }
  123.     //-------------------------------------------------------------------------
  124.     // ╧юыєўшь юЇЇёхЄ Єхъє∙хщ ёърэышэшш (ЇръЄшўхёъш тшфхюрфЁхё х╕ эрўрыр)
  125.     int Offset = AtmVideoCtrl.Scanlines[iRayLine].Offset;
  126.  
  127.     // ┬√ўшёышь Ёхры№э√щ тшфхюрфЁхё, ё єў╕Єюь шэъЁхьхэЄют яЁш юЄЁшёютъх ЁрёЄЁр.
  128.     // ╥ръцх юяЁхфхышь, ъєфр яЁшьхэ хь +64 шэъЁхьхэЄ√ яЁш яхЁхъы■ўхэшш тшфхюЁхцшьр:
  129.     //     - ┼ёыш ыєў эр сюЁф■Ёх ётхЁїє юЄ ЁрёЄЁр шыш эр сюЁф■Ёх ёыхтр юЄ ЁрёЄЁр
  130.     //         - шчьхэ хь юЇЇёхЄ фы  Єхъє∙хщ ёърэышэшш
  131.     //     - ┼ёыш ыєў эр ЁрёЄЁх шыш эр сюЁф■Ёх ёяЁртр юЄ ЁрёЄЁр
  132.     //         - шчьхэ хь юЇЇёхЄ фы  ёыхфє■∙хщ ёърэышэшш
  133.     //-------------------------------------------------------------------------
  134.     if ( iRayLine < iLinesAboveBorder || iRayOffset < tEachBorderWidth )
  135.     {
  136.         // ╦єў эр сюЁф■Ёх. ╦шсю ётхЁїє юЄ ЁрёЄЁр, ышсю ёыхтр юЄ ЁрёЄЁр.
  137.         // ┬ёх шчьхэхэш  яЁшьхэ хь ъ Єхъє∙хщ ёърэышэшш.
  138.  
  139.         //---------------------------------------------------------------------
  140.         // ╬сЁрсюЄрхь яхЁхъы■ўхэшх тшфхюЁхцшьр.
  141.         if ( NewVideoMode == 6 )
  142.         {
  143.             //-----------------------------------------------------------------
  144.             // ╧хЁхъы■ўхэшх ┬ ЄхъёЄют√щ Ёхцшь.
  145.             //-----------------------------------------------------------------
  146.             if (    (Offset & 32) &&    //< яЁютхЁър єёыютш  "яЁш рфЁхёх A5=1"
  147.                     (iRayLine & 7) < 4  //< яЁютхЁър єёыютш  "т ёЄЁюъх 0..3"
  148.              )
  149.             {
  150.             //  printf("CASE-1: 0x%.4x Incremented (+64) on line %d\n", Offset, iRayLine);
  151.                 Offset += 64;
  152.                 AtmVideoCtrl.Scanlines[iRayLine].Offset = Offset;
  153.             }
  154.             //-----------------------------------------------------------------
  155.             AtmVideoCtrl.Scanlines[iRayLine].VideoMode = NewVideoMode;
  156.             //-----------------------------------------------------------------
  157.             // ╧юёых яЁюїюфр тёхї Єюўхъ ЁрёЄЁр Єхъє∙хщ ёърэышэшш т ЄхъёЄютюь Ёхцшьх сєфєЄ ёсЁю°хэ√ A3..A5
  158.             Offset &= (~0x38);  // ╤сЁюё A3..A5
  159.             // printf("CASE-1a, reset A3..A5: 0x%.4x\n", Offset);
  160.             //-----------------------------------------------------------------
  161.             // ╨рёёў╕Є тшфхюрфЁхёют фы  эшцыхцр∙шї ёърэышэшщ
  162.             while (++iRayLine < 256)
  163.             {
  164.                 //-------------------------------------------------------------
  165.                 if ( 0 == (iRayLine & 7))
  166.                 {
  167.                     Offset += 64;
  168.                 }
  169.                 //-------------------------------------------------------------
  170.                 AtmVideoCtrl.Scanlines[iRayLine].Offset = Offset;
  171.                 AtmVideoCtrl.Scanlines[iRayLine].VideoMode = NewVideoMode;
  172.             }
  173.         } //if ( NewVideoMode == 6 )
  174.         //---------------------------------------------------------------------
  175.         else
  176.         {
  177.             //-----------------------------------------------------------------
  178.             // ╧хЁхъы■ўхэшх ╚╟ ЄхъёЄютюую Ёхцшьр.
  179.             //-----------------------------------------------------------------
  180.             if ( 0 == (Offset & 32) )   //< яЁютхЁър єёыютш  "яЁш рфЁхёх A5=0"
  181.             {
  182.             //  printf("CASE-2: 0x%.4x Incremented (+64) on line %d\n", Offset, iRayLine);
  183.                 Offset += 64;
  184.                 AtmVideoCtrl.Scanlines[iRayLine].Offset = Offset;
  185.             }
  186.             //-----------------------------------------------------------------
  187.             AtmVideoCtrl.Scanlines[iRayLine].VideoMode = NewVideoMode;
  188.             //-----------------------------------------------------------------
  189.             // ╨рёёў╕Є тшфхюрфЁхёют фы  эшцыхцр∙шї ёърэышэшщ
  190.             while (++iRayLine < 256)
  191.             {
  192.                 AtmVideoCtrl.Scanlines[iRayLine].Offset = Offset;
  193.                 AtmVideoCtrl.Scanlines[iRayLine].VideoMode = NewVideoMode;
  194.             }
  195.             //-----------------------------------------------------------------
  196.         }
  197.     } // if ( iRayLine < iLinesAboveBorder || iRayOffset < tEachBorderWidth )
  198.     //-------------------------------------------------------------------------
  199.     else
  200.     {
  201.         // ╦єў ЁшёєхЄ ЁрёЄЁ, ышсю сюЁф■Ё ёяЁртр юЄ ЁрёЄЁр.
  202.  
  203.         // ┬√ўшёы хь Єхъє∙хх чэрўхэшх тшфхюрфЁхёр
  204.  
  205.         //---------------------------------------------------------------------
  206.         // ╧Ёшсрты хь ъ тшфхюрфЁхёє тёх +64 шэъЁхьхэЄ√,
  207.         // ёфхырээ√х т їюфх юЄЁшёютъш ЁрёЄЁр фрээющ ёърэышэшш
  208.         if (iRayLine == AtmVideoCtrl.CurrentRayLine)
  209.         {
  210.             Offset += AtmVideoCtrl.IncCounter_InRaster;
  211.         }
  212.         //---------------------------------------------------------------------
  213.         else
  214.         {
  215.             // ╤ў╕Єўшъ шэъЁхьхэЄют єёЄрЁхы (Є.ъ. эръЁєўхэ эр ёърэышэш■ юЄышўэє■ юЄ Єхъє∙хщ)
  216.             // ╚эшЎшрышчшЁєхь хую фы  Єхъє∙хщ ёърэышэшш.
  217.             AtmVideoCtrl.CurrentRayLine = iRayLine;
  218.             AtmVideoCtrl.IncCounter_InRaster = 0;
  219.             AtmVideoCtrl.IncCounter_InBorder = 0;
  220.         }
  221.         //---------------------------------------------------------------------
  222.        
  223.         // ╧Ёшсрты хь ъ тшфхюрфЁхёє тёх +8 шэъЁхьхэЄ√, яЁюшчю°хф°шх яЁш юЄЁшёютъх ЁрёЄЁр
  224.         bool bRayInRaster = iRayOffset < (tScreenWidth + tEachBorderWidth);
  225.        
  226.         int iScanlineRemainder = 0;     //< ╤ъюы№ъю +8 шэъЁхьхэЄют х∙╕ сєфхЄ ёфхырэю фю ъюэЎр ёърэышэшш
  227.                                         //  (Є.х. єцх яюёых яхЁхъы■ўхэш  тшфхюЁхцшьр)
  228.         //---------------------------------------------------------------------
  229.         if ( bRayInRaster )
  230.         {
  231.             // ╦єў ЁшёєхЄ ЁрёЄЁ.
  232.             // ╧Ёшсрты хь ъ Єхъє∙хьє тшфхюрфЁхёє ёЄюы№ъю +8,
  233.             // ёъюы№ъю с√ыю яюыэюёЄ№■ юЄЁшёютрээ√ї 64яшъёхы№э√ї сыюър.
  234.             int iIncValue = 8 * ((iRayOffset-tEachBorderWidth)/32);
  235.             iScanlineRemainder = 40 - iIncValue;
  236.             // printf("CASE-4: 0x%.4x Incremented (+%d) on line %d\n", Offset, iIncValue, iRayLine);
  237.             Offset += iIncValue;
  238.         }
  239.         //---------------------------------------------------------------------
  240.         else
  241.         {
  242.             // ╬ЄЁшёютър ЁрёЄЁр ыєўюь чртхЁ°хэр.
  243.             // ╥.х. тёх 5- Є№ 64-яшъёхы№э√ї сыюър с√ыш яЁющфхэ√. ╧Ёшсрты хь ъ рфЁхёє +40.
  244.             // printf("CASE-5: 0x%.4x Incremented (+40) on line %d\n", Offset, iRayLine);
  245.             Offset += 40;
  246.  
  247.             // ┼ёыш яЁхф√фє∙шь Ёхцшьюь с√ы ЄхъёЄют√щ Ёхцшь,
  248.             // ╥ю яЁш яхЁхїюфх ё ЁрёЄЁр эр сюЁф■Ё фюыцэ√ с√Є№ ёсЁю°хэ√ A3..A5
  249.             //-----------------------------------------------------------------
  250.             if (OldVideoMode == 6)
  251.             {
  252.                 Offset &= (~0x38); // ╤сЁюё A3..A5
  253.                 // printf("CASE-5a, reset A3..A5: 0x%.4x\n", Offset);
  254.             }
  255.         }
  256.         //---------------------------------------------------------------------
  257.         // ╧Ёшсрты хь ъ тшфхюрфЁхёє тёх +64 шэъЁхьхэЄ√,
  258.         // ёфхырээ√х т їюфх юЄЁшёютъш сюЁф■Ёр чр ЁрёЄЁюь фрээющ ёърэышэшш
  259.         Offset += AtmVideoCtrl.IncCounter_InBorder;
  260.  
  261.         // ╥хъє∙хх чэрўхэшх тшфхюрфЁхёр т√ўшёыхэю.
  262.         // ╬сЁрсрЄ√трхь яхЁхъы■ўхэшх тшфхюЁхцшьр.
  263.         int OffsetInc = 0;
  264.         //---------------------------------------------------------------------
  265.         if ( NewVideoMode == 6 )
  266.         {
  267.             // ╧хЁхъы■ўхэшх ┬ ЄхъёЄют√щ Ёхцшь.
  268.             //-----------------------------------------------------------------
  269.             if (    (Offset & 32)  &&   //< яЁютхЁър єёыютш  "яЁш рфЁхёх A5=1"
  270.                     (iRayLine & 7) < 4  //< яЁютхЁър єёыютш  "т ёЄЁюъх 0..3"
  271.               )
  272.             {
  273.                 OffsetInc = 64;
  274.                 // printf("CASE-6: 0x%.4x Incremented (+64) on line %d\n", Offset, iRayLine);
  275.                 Offset += OffsetInc;
  276.             }
  277.             //-----------------------------------------------------------------
  278.             // ╨рёёў╕Є тшфхюрфЁхёют фы  эшцыхцр∙шї ёърэышэшщ
  279.             Offset += iScanlineRemainder;
  280.             //-----------------------------------------------------------------
  281.             while (++iRayLine < 256)
  282.             {
  283.                 //-------------------------------------------------------------
  284.                 if ( 0 == (iRayLine & 7))
  285.                     Offset += 64;
  286.                 //-------------------------------------------------------------
  287.                 AtmVideoCtrl.Scanlines[iRayLine].Offset = Offset;
  288.                 AtmVideoCtrl.Scanlines[iRayLine].VideoMode = NewVideoMode;
  289.             }
  290.             //-----------------------------------------------------------------
  291.         } // if ( NewVideoMode == 6 )
  292.         //---------------------------------------------------------------------
  293.         else
  294.         {
  295.             // ╧хЁхъы■ўхэшх ╚╟ ЄхъёЄютюую Ёхцшьр.
  296.             //-----------------------------------------------------------------
  297.             if ( 0 == (Offset & 32) ) //< яЁютхЁър єёыютш  "яЁш рфЁхёх A5=0"
  298.             {
  299.                 OffsetInc = 64;
  300.                 // printf("CASE-7: 0x%.4x Incremented (+64) on line %d\n", Offset, iRayLine);
  301.                 Offset += OffsetInc;
  302.             }
  303.             //-----------------------------------------------------------------
  304.             // ╨рёёў╕Є тшфхюрфЁхёют фы  эшцыхцр∙шї ёърэышэшщ
  305.             Offset += iScanlineRemainder;
  306.             //-----------------------------------------------------------------
  307.             while (++iRayLine < 256)
  308.             {
  309.                 AtmVideoCtrl.Scanlines[iRayLine].Offset = Offset;
  310.                 AtmVideoCtrl.Scanlines[iRayLine].VideoMode = NewVideoMode;
  311.                 Offset += 40;
  312.             }
  313.             //-----------------------------------------------------------------
  314.         }
  315.         //---------------------------------------------------------------------
  316.         // чряюьшэрхь ёфхырээ√щ шэъЁхьхэЄ эр ёыєўрщ,
  317.         // хёыш шї сєфхЄ эхёъюы№ъю т їюфх юЄЁшёютъш Єхъє∙хщ ёърэышэшш.
  318.         if ( bRayInRaster )
  319.         {
  320.             AtmVideoCtrl.IncCounter_InRaster += OffsetInc;
  321.         }
  322.         //---------------------------------------------------------------------
  323.         else
  324.         {
  325.             AtmVideoCtrl.IncCounter_InBorder += OffsetInc;
  326.         }
  327.         //---------------------------------------------------------------------
  328.     }
  329. }
  330. //=============================================================================
  331.  
  332.  
  333. //=============================================================================
  334. void set_atm_FF77(unsigned port, unsigned char val)
  335. {
  336.     //-------------------------------------------------------------------------
  337.     if ((comp.pFF77 ^ val) & 1)
  338.         atm_memswap();  // 𪤤ью срур swap memory address bits A5-A7 and A8-A10
  339.     //-------------------------------------------------------------------------
  340.     if ((comp.pFF77 & 7) ^ (val & 7))
  341.     {
  342.         // ╧ЁюшёїюфшЄ яхЁхъы■ўхэшх тшфхюЁхцшьр
  343.         AtmApplySideEffectsWhenChangeVideomode(val);
  344.     }
  345.     //-------------------------------------------------------------------------
  346.     comp.pFF77 = val;
  347.     comp.aFF77 = port;
  348.     cpu.int_gate = (comp.pFF77 & 0x20) != false;
  349.     set_banks();
  350. }
  351. //=============================================================================
  352.  
  353.  
  354. //=============================================================================
  355. void set_atm_aFE(unsigned char addr)
  356. {
  357.     unsigned char old_aFE = comp.aFE;
  358.     comp.aFE = addr;
  359.     //-------------------------------------------------------------------------
  360.     if ((addr ^ old_aFE) & 0x40) atm_memswap(); // 𪤤ью срур swap memory address bits A5-A7 and A8-A10
  361.     if ((addr ^ old_aFE) & 0x80) set_banks();
  362.     //-------------------------------------------------------------------------
  363. }
  364. //=============================================================================
  365.  
  366. static u8 atm_pal[0x10] = { 0 };
  367. //static u16 atm3_pal[0x10] = { 0 };
  368.  
  369. //void atm_writepal(unsigned char val)
  370.  
  371. //=============================================================================
  372. void atm_writepal(unsigned port, unsigned char val)
  373. {
  374.     assert(comp.border_attr < 0x10);
  375.     atm_pal[comp.border_attr] = val;
  376.  
  377.     // ╧ЁхюсЁрчютрэшх ярышЄЁ√ т ЇюЁьрЄ ULA+
  378.     u8 PalIdx = ((comp.border_attr & 8) << 1) | (comp.border_attr & 7);
  379.     comp.comp_pal[PalIdx + 0*8] =
  380.     comp.comp_pal[PalIdx + 1*8] =
  381.     comp.comp_pal[PalIdx + 3*8] =
  382.     comp.comp_pal[PalIdx + 5*8] = u8(t.atm_pal_map[val]);
  383.     temp.comp_pal_changed = 1; //to call pixel_tables()
  384.  
  385. // ╤▐─└ ═└─╬ ┬█╩╦▐╫└╥┼╦▄?
  386. //added by Alone Coder 04.12.2021:      //NEDOREPO
  387.     comp.atm3_pal[comp.border_attr] = (val & 0xFF) + (port & 0xFF00); //%grbG11RB(low), %grbG11RB(high), inverted
  388.     // transform with current settings
  389.        
  390. }
  391. //=============================================================================
  392.  
  393.  
  394. //=============================================================================
  395. u8 atm_readpal()
  396. {
  397.    return atm_pal[comp.border_attr];
  398. }
  399. //=============================================================================
  400.  
  401.  
  402. //=============================================================================
  403. // ъюяшЁрёЄш 
  404. //=============================================================================
  405. //inline
  406. unsigned char atm450_z(unsigned t)
  407. {
  408.     // PAL hardware gives 3 zeros in secret short time intervals
  409.     //     ўх х∙х чр PAL hardware ???
  410.     //-------------------------------------------------------------------------
  411.     // NORMAL SPEED mode
  412.     if (conf.frame < 80000)
  413.     {
  414.         if ((unsigned)(t-7200) < 40 || (unsigned)(t-7284) < 40 || (unsigned)(t-7326) < 40)
  415.             return 0;
  416.     }
  417.     //-------------------------------------------------------------------------
  418.     // TURBO mode       ???????? o_O
  419.     else
  420.     {
  421.         if ((unsigned)(t-21514) < 40 || (unsigned)(t-21703) < 80 || (unsigned)(t-21808) < 40)
  422.             return 0;
  423.     }
  424.     //-------------------------------------------------------------------------
  425.     return 0x80;
  426. }
  427. //=============================================================================
  428. //inline
  429. unsigned char atm620_z(unsigned t)              //[NS]
  430. {
  431.     // фы  чряєёър MSX-DOS
  432.     //-------------------------------------------------------------------------
  433.     if (        ((unsigned)(t) >= 0)    &&              // яЁхфяюыюцхэшх эр юёэютх ъюфр яЁютхЁъш
  434.                 ((unsigned)(t) < 1024)                  // тючьюцэю Єрь тююс∙х ьхрэфЁ
  435.         )
  436.     {
  437.         //printf("t %d = 0\n",t);
  438.         return 0;
  439.     }
  440.     //-------------------------------------------------------------------------
  441.     //printf("t %d = 1\n",t);
  442.     return 0x20;
  443. }
  444. //=============================================================================
  445.  
  446.  
  447.  
  448.  
  449.