Subversion Repositories Kolibri OS

Rev

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

  1. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  2. *                                                                           *
  3. *                         Copyright 2003  VaStaNi                           *
  4. *                             vastani@ukr.net                               *
  5. *                   >>>- SIMPLY - QUICKLY - SHORTLY -<<<                    *
  6. *                                                                           *
  7. *                    About Player Notes for Speaker PC.                     *
  8. *                  ( PLAYNOTE.INC v.1.1  for  MENUET OS )                   *
  9. *                                                                           *
  10. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  11.  
  12.                               --- ATTACH ---
  13.  
  14. >>> Insert string: include "PLAYNOTE.INC"  in list file KERNEL32.INC
  15. .........
  16. ......... .........      .............................
  17. ......... .........      .............................
  18. ......... .........      .............................
  19.  
  20. ; sound
  21.  
  22. include "SB16.INC"     ; playback for Sound Blaster 16
  23. include "PLAYNOTE.INC" ; player Note for Speaker PC
  24.  
  25. .........
  26. ......... .........      .............................
  27. ......... .........      .............................
  28.  
  29.  
  30.  
  31. >>> Insert line --->>>   call  playNote   --->>>  in procedure irq0
  32.  
  33.     ( listing file SYS32.INC for KERNEL.ASM )
  34.  
  35.         ....  ....
  36.         ....  ....
  37.         ....  ....
  38.  
  39.      no_error_in_previous_process:
  40.  
  41.         mov    edi,[0x3000]
  42.         imul   edi,8
  43.         mov    [edi+gdts+ tss0 +5], word 01010000b *256 +11101001b
  44.  
  45.         inc   dword [0xfdf0]
  46.  
  47.         mov   eax,[0xfdf0]
  48.  
  49.         call  playNote           ; <<<--- INSERT THIS LINE !!!!!!!!!!
  50.  
  51.         cmp   eax,[next_usage_update]
  52.         jb    nocounter
  53.         add   eax,100
  54.         mov   [next_usage_update],eax
  55.         call  updatecputimes
  56.  
  57.       nocounter:
  58.         ....  ....
  59.         ....  ....
  60.         ....  ....
  61.  
  62.  
  63.  
  64. >>> file SB16.INC have this label...
  65.    ....  ....
  66.    ....  ....
  67.    ....  ....
  68.  
  69.  no_SB16_data_format:
  70.  
  71.    ret
  72.  
  73. >>> I suggest add this code for subfunction #55 function #55 OS (player notes)
  74.    ....  ....
  75.    ....  ....
  76.    ....  ....
  77.  
  78.  no_SB16_data_format:
  79.    cmp   eax, edi                      ; this is subfunction #55 ?
  80.     jne  retFunc55                     ; if no then return.
  81.    movzx eax, byte [countDelayNote]
  82.    or    al, al                        ; player is busy ?
  83.     jnz  retFunc55                     ; return counter delay Note
  84.    mov   eax, [0x3010]
  85.    mov   eax, [eax+0x10]               ; address application im memory
  86.    add   eax, edx                      ; add offset Delay-Note string
  87.    mov   [memAdrNote], eax
  88.    xor   eax, eax                      ; Ok!  EAX = 0
  89.  retFunc55:
  90.    mov   [esp+36], eax                 ; return value EAX for application
  91.    ret
  92.  
  93. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  94.  
  95.                                --- USE ---
  96.  
  97. >>> Example use in your programs:
  98.         ....  ....
  99.         ....  ....
  100.         ....  ....
  101.         mov   eax, 55            ; OS function #55
  102.         mov   ebx, eax           ; EBX = 55 for subfunction Play Note
  103.         mov   esi, MyMusic_1     ; ESI = head string Delay-Note code
  104.         int   0x40               ; start play
  105.         ....  ....
  106.         ....  ....
  107.         ....  ....
  108.  
  109.  
  110. >>> Very simply OS use. Only put dword adress head string in [memAdrNote]
  111.  
  112.         ....  ....
  113.         mov   [memAdrNote], dword MyMusic_1  ; IRQ0 -> start play!!!
  114.         ....  ....
  115.  
  116. !!! Example OS use for send: error tone, ring signal, disconnect hardware...
  117. !!! Saund Card may be OFF, but Speaker PC always IS ON !!!
  118.  
  119.  
  120. .....          ..  ..
  121. .....          ..  ..
  122. MyMusic_1      db  .., .., .., .., .., 0   ; string Delay-Note code for MUSIC
  123. ...            ..  ..
  124. ......         ..  ..
  125.  
  126. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  127.  
  128.                      --- CODE DELAY & NOTEs ---
  129.  
  130. >>> Format Delay-Note string:
  131.  
  132.     1. Free style play Tone
  133.  
  134.                db  1..0x80       ; !!! only (1..0x80) byte for Delay Tone
  135.                db  1..0xFF       ; lower byte (counter for period oscillate)
  136.                db  1..0xFF       ; upper byte (counter for period oscillate)
  137.                ..  ..        \
  138.                ..  ..          > 3 bytes for 1 TONE !!!
  139.                ..  ..        /
  140.                db  0             ; THE END Play!
  141.  
  142.     2. Musical style play Note
  143.  
  144.                db  0x81..0xFE    ; !!! 0x80 + byte (1..0x7E) for Delay Note
  145.                db  1..0xFF       ; PACK CODE (number Note & number Octave)
  146.                ..  ..         \
  147.                ..  ..         /  2 bytes for 1 Note in 1 Octave !!!
  148.                db  0             ; THE END Play!
  149.  
  150.  
  151.  
  152.                              -=  DELAY CODE  =-
  153.  
  154.            ÚÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÉÍÍ  1  Í»ÉÍÍ  2  Í»
  155.            ³¤«¨â¥«ì­®á⨳ DELAY NOTE ³ DELAY º  DELAY ºº  DELAY º
  156.            ³    Ž’     ³    mSec    ³ IRQ 0 º  CODE  ºº  CODE  º
  157.            ÃÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÌÍÍÍÍÍÍÍ͹ÌÍÍÍÍÍÍÍ͹
  158.            ³   楫 ï    ³    2000    ³       º  0xC8  ºº absent º
  159.            ÃÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄ´       ÇÄÄÄÄÄÄÄĶÇÄÄÄÄÄÄÄĶ
  160.            ³    1/2     ³    1000    ³       º  0x64  ºº  0xE4  º
  161.            ÃÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄ´       ÇÄÄÄÄÄÄÄĶÇÄÄÄÄÄÄÄĶ
  162.            ³    1/4     ³    500     ³       º  0x32  ºº  0xB2  º
  163.            ÃÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄ´  10   ºÄÄÄÄÄÄÄĶºÄÄÄÄÄÄÄĶ
  164.            ³    1/8     ³    250     ³  mSec º  0x19  ºº  0x99  º
  165.            ÃÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄ´       ÇÄÄÄÄÄÄÄĶÇÄÄÄÄÄÄÄĶ
  166.            ³    1/16    ³    125     ³       º  0xC   ºº  0x8C  º
  167.            ÃÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄ´       ºÄÄÄÄÄÄÄĶºÄÄÄÄÄÄÄĶ
  168.            ³    1/32    ³    62.5    ³       º  6     ºº  0x86  º
  169.            ÃÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄ´       ÇÄÄÄÄÄÄÄĶÇÄÄÄÄÄÄÄĶ
  170.            ³    1/64    ³    31.25   ³       º  3     ºº  0x83  º
  171.            ÀÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÈÍÍÍÍÍÍÍͼÈÍÍÍÍÍÍÍͼ
  172.  
  173.  
  174.                               -=  PACK  CODE  =-
  175.  
  176.   !!!!!  IF  PACK CODE = 0xFF  THEN  PAUSE = DELAY CODE  !!!!!
  177.  
  178.  ÚÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÉÍÍÍÍÍÍÍÍÍÍ»  ÚÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÂÄÄÄÄÄÄÉÍÍÍÍÍÍÍÍÍÍ»
  179.  ³   ’ˆ›    ³number³ code ºupper CODEº  ³ Ž’›      ³type³numberºlower CODEº
  180.  ³   ŽŠ’€‚   ³OCTAVE³numberºBit7..Bit4º  ³ ŽŠ’€‚›    ³NOTE³ NOTE ºBit3..Bit0º
  181.  ÃÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÅÄÄÄÄÄÄÌÍÍÍÍÍÍÍÍÍ͹  ÃÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÅÄÄÄÄÄÄÌÍÍÍÍÍÍÍÍÍ͹
  182.  ³ª®­âப⠢ ³  -3  ³  0   º   0000   º  ³ „Ž        ³ C  ³  1   º   0001   º
  183.  ÃÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÅÄÄÄÄÄÄÌÄÄÄÄÄÄÄÄÄĶ  ÃÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÅÄÄÄÄÄÄ×ÄÄÄÄÄÄÄÄÄĶ
  184.  ³ ¡®«ìè ï   ³  -2  ³  1   º   0001   º  ³ „Ž ¡¥¬®«ì ³ C# ³  2   º   0010   º
  185.  ÃÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÅÄÄÄÄÄÄÇÄÄÄÄÄÄÄÄÄĶ  ÃÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÅÄÄÄÄÄÄ×ÄÄÄÄÄÄÄÄÄĶ
  186.  ³ ¬ « ï     ³  -1  ³  2   º   0010   º  ³ …        ³ D  ³  3   º   0011   º
  187.  ÃÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÅÄÄÄÄÄĺÄÄÄÄÄÄÄÄÄĶ  ÃÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÅÄÄÄÄÄÄ×ÄÄÄÄÄÄÄÄÄĶ
  188.  ³ ¯¥à¢ ï    ³  1   ³  3   º   0011   º  ³ … ¡¥¬®«ì ³ D# ³  4   º   0100   º
  189.  ÃÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÅÄÄÄÄÄÄÇÄÄÄÄÄÄÄÄÄĶ  ÃÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÅÄÄÄÄÄÄ×ÄÄÄÄÄÄÄÄÄĶ
  190.  ³ ¢â®à ï    ³  2   ³  4   º   0100   º  ³ Œˆ        ³ E  ³  5   º   0101   º
  191.  ÃÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÅÄÄÄÄÄĺÄÄÄÄÄÄÄÄÄĶ  ÃÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÅÄÄÄÄÄÄ×ÄÄÄÄÄÄÄÄÄĶ
  192.  ³ âà¥âìï    ³  3   ³  5   º   0101   º  ³ ”€        ³ F  ³  6   º   0110   º
  193.  ÃÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÅÄÄÄÄÄÄÇÄÄÄÄÄÄÄÄÄĶ  ÃÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÅÄÄÄÄÄÄ×ÄÄÄÄÄÄÄÄÄĶ
  194.  ³ ç¥â¢¥àâ ï ³  4   ³  6   º   0110   º  ³ ”€ ¡¥¬®«ì ³ F# ³  7   º   0111   º
  195.  ÀÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÈÍÍÍÍÍÍÍÍÍͼ  ÃÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÅÄÄÄÄÄÄ×ÄÄÄÄÄÄÄÄÄĶ
  196.                                          ³ ‘Ž‹œ      ³ G  ³  8   º   1000   º
  197.                                          ÃÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÅÄÄÄÄÄÄ×ÄÄÄÄÄÄÄÄÄĶ
  198.                                          ³‘Ž‹œ ¡¥¬®«ì³ G# ³  9   º   1001   º
  199.                                          ÃÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÅÄÄÄÄÄÄ×ÄÄÄÄÄÄÄÄÄĶ
  200.                                          ³ ‹Ÿ        ³ A  ³  10  º   1010   º
  201.                                          ÃÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÅÄÄÄÄÄÄ×ÄÄÄÄÄÄÄÄÄĶ
  202.                                          ³ ‹Ÿ ¡¥¬®«ì ³ A# ³  11  º   1011   º
  203.                                          ÃÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÅÄÄÄÄÄÄ×ÄÄÄÄÄÄÄÄÄĶ
  204.                                          ³ ‘ˆ        ³ B  ³  12  º   1100   º
  205.                                          ÀÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÁÄÄÄÄÄÄÈÍÍÍÍÍÍÍÍÍͼ
  206.  
  207.        PACK CODE = (number Note)  AND  ((code number Octave) SHL 4)
  208.     or
  209.        PACK CODE = (number Note)  AND  ((code number Octave) * 16)
  210.  
  211.  
  212.                            -=  PERIOD OSCILLATE  =-
  213.  
  214.                         counter = 1193180 / FREQUENCY;
  215.                          (WORD)             (sound Hz)
  216.  
  217. ÚÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÂÄÄÄÄÄÄÉÍÍÍÍÍÍÍÍÍ          ÍÍÍÍÍÍ»
  218. ³   ’ˆ     ³number³ code ³ Ž’›      ³type³numberºfrequency           PACK º
  219. ³   ŽŠ’€‚›  ³OCTAVE³number³ 1© Ž‘’€‚› ³NOTE³ NOTE ºsound Hz            CODE º
  220. ÃÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÅÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÅÄÄÄÄÄÄÌÍÍÍÍÍÍÍÍÍ          ÍÍÍÍÍ͹
  221. ³           ³      ³      ³ „Ž        ³ C  ³  1   º 523,251   --       0x31 º
  222. ³           ³      ³      ÃÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÅÄÄÄÄÄÄ×ÄÄÄÄÄÄÄÄÄ    |     ÄÄÄÄÄĶ
  223. ³           ³      ³      ³ „Ž ¡¥¬®«ì ³ C# ³  2   º 554,365   --|--    0x32 º
  224. ³           ³      ³      ÃÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÅÄÄÄÄÄÄ×ÄÄÄÄÄÄÄÄÄ    |  |  ÄÄÄÄÄĶ
  225. ³           ³      ³      ³ …        ³ D  ³  3   º 587,33      |  |   0x33 º
  226. ³           ³      ³      ÃÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÅÄÄÄÄÄÄ×ÄÄÄÄÄÄÄÄÄ    |  |  ÄÄÄÄÄĶ
  227. ³           ³      ³      ³ … ¡¥¬®«ì ³ D# ³  4   º 622,254     |  |   0x34 º
  228. ³           ³      ³      ÃÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÅÄÄÄÄÄÄ×ÄÄÄÄÄÄÄÄÄ    |  |  ÄÄÄÄÄĶ
  229. ³           ³      ³      ³ Œˆ        ³ E  ³  5   º 659,255     |  |   0x35 º
  230. ³           ³      ³      ÃÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÅÄÄÄÄÄÄ×ÄÄÄÄÄÄÄÄÄ    |  |  ÄÄÄÄÄĶ
  231. ³           ³      ³      ³ ”€        ³ F  ³  6   º 698,456     |  |   0x36 º
  232. ³   ¯¥à¢ ï  ³  1   ³  3   ÃÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÅÄÄÄÄÄÄ×ÄÄÄÄÄÄÄÄÄ    |  |  ÄÄÄÄÄĶ
  233. ³ ( first   ³      ³      ³ ”€ ¡¥¬®«ì ³ F# ³  7   º 739,989     |  |   0x37 º
  234. ³  octave ) ³      ³      ÃÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÅÄÄÄÄÄÄ×ÄÄÄÄÄÄÄÄÄ    |  |  ÄÄÄÄÄĶ
  235. ³           ³      ³      ³ ‘Ž‹œ      ³ G  ³  8   º 783,991            0x38 º
  236. ³           ³      ³      ÃÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÅÄÄÄÄÄÄ×ÄÄÄÄÄÄÄÄÄ    x 2   ÄÄÄÄÄĶ
  237. ³           ³      ³      ³‘Ž‹œ ¡¥¬®«ì³ G# ³  9   º 830,609            0x39 º
  238. ³           ³      ³      ÃÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÅÄÄÄÄÄÄ×ÄÄÄÄÄÄÄÄÄ    |  |  ÄÄÄÄÄĶ
  239. ³           ³      ³      ³ ‹Ÿ        ³ A  ³  10  º 880         |  |   0x3A º
  240. ³           ³      ³      ÃÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÅÄÄÄÄÄÄ×ÄÄÄÄÄÄÄÄÄ    |  |  ÄÄÄÄÄĶ
  241. ³           ³      ³      ³ ‹Ÿ ¡¥¬®«ì ³ A# ³  11  º 932,328     |  |   0x3B º
  242. ³           ³      ³      ÃÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÅÄÄÄÄÄÄ×ÄÄÄÄÄÄÄÄÄ    |  |  ÄÄÄÄÄĶ
  243. ³           ³      ³      ³ ‘ˆ        ³ B  ³  12  º 987,767     |  |   0x3C º
  244. ÃÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÅÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÅÄÄÄÄÄÄÌÍÍÍÍÍÍÍÍÍ    |  |  ÍÍÍÍÍ͹
  245. ³   ¢â®à ï  ³  2   ³  4   ³ „Ž        ³ ‘  ³  1   º1046,502   <-   |   0x41 º
  246.     ......     ..     ..    ...         ..    ..   .... ...   <----
  247.  
  248. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  249.  
  250.                           --- EXAMPLE MUSIC ---
  251.  
  252. à¨¬¥à ¬ã§¨æ¨à®¢ ­¨ï ¯® ­®â ¬ ¬¥«®¤¨¨ ˆ.Š à­¥«îª  "ƒ®à¨â ®ç £..."
  253.                                               ª 䨫ì¬ã " ­¤¨â᪨© ¥â¥à¡ãà£"
  254. MyMusic_1:
  255. db 0xe4,0x35, 0x99,0x33, 0x99,0x31, 0x99,0x33, 0xe4,0x35, 0x99,0x35, 0x99,0x36
  256. db 0x99,0x38, 0x99,0x3a, 0xe4,0x36, 0xe4,0x36, 0xb2,0xff, 0xe4,0x33, 0x99,0x31
  257. db 0x99,0x2c, 0x99,0x31, 0xe4,0x33, 0xb2,0x33, 0x99,0x35, 0x99,0x36, 0xe4,0x35
  258. db 0xe4,0x35, 0xb2,0xff, 0x99,0x35, 0x99,0x36, 0xe4,0x33, 0x99,0x35, 0x99,0x36
  259. db 0xb2,0x33, 0x99,0x35, 0x99,0x36, 0xb2,0x33, 0x99,0x35, 0x99,0x36, 0xe4,0x39
  260. db 0xe4,0x39, 0xb2,0xff, 0x99,0x35, 0x99,0x36, 0xe4,0x33, 0x99,0x35, 0x99,0x36
  261. db 0xb2,0x33, 0x99,0x35, 0x99,0x36, 0xb2,0x33, 0x99,0x35, 0x99,0x36, 0xe4,0x35
  262. db 0xe4,0x35, 0
  263.  
  264.  
  265. MyMusic_2:
  266. db 0x90,0x31, 0x90,0x33, 0x90,0x35, 0x90,0x36, 0xA0,0xFF, 0xA0,0x06, 0x90,0xFF
  267. db 0xA0,0x06, 0x90,0xFF, 0x90,0x33, 0x90,0x35, 0x90,0x37, 0x90,0x38, 0xA0,0xFF
  268. db 0xA0,0x18, 0x90,0xFF, 0xA0,0x18, 0x90,0xFF, 0x90,0x33, 0x90,0x35, 0x90,0x37
  269. db 0x90,0x38, 0xA0,0xFF, 0x90,0x33, 0x90,0x35, 0x90,0x37, 0x90,0x38, 0xA0,0xFF
  270. db 0x90,0x31, 0x90,0x33, 0x90,0x35, 0x90,0x36, 0xA0,0xFF, 0xA0,0x16, 0x90,0xFF
  271. db 0xA0,0x16, 0
  272.  
  273.  
  274. MyMusic_3:
  275. db 0x99,0x31, 0xB2,0x36, 0x99,0x3A, 0xB2,0x36, 0x99,0x33, 0xB2,0x28, 0xBC,0x38
  276. db 0
  277.  
  278.                                <<<<<<< >>>>>>>
  279. |>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  !GOOD LUCK!  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<|
  280.                                <<<<<<< >>>>>>>
  281.  
  282.  
  283.  
  284.  
  285.  
  286.  
  287.  
  288.  
  289.  
  290.  
  291.  
  292.  
  293.  
  294.