Subversion Repositories Kolibri OS

Rev

Rev 3930 | Rev 6270 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;
  2. ;   pipes kolibri
  3. ;   v1.21
  4. ;   2006 by Mario Birkner
  5. ;
  6. ;   l.mod. 27.08.06/15:11
  7. ;
  8. ;   Compile with FASM
  9. ;
  10. format binary as ""
  11.  
  12. bgcolor  equ  0x0074744A      ;thx
  13. fgcolor  equ  0x00E7C750      ;to
  14. fg2color equ  0x00E0B0A0      ;colorref
  15. fg3color equ  0x007F7F55
  16. btcolor  equ  0x005B6200
  17.  
  18. include '..\..\macros.inc'
  19. include 'lang.inc'
  20. ; fetch the UTF-8 character in string+offs to char
  21. ; common part for all encodings: translate pseudographics
  22. ; Pseudographics for the boot screen:
  23. ; 0x2500 -> 0xC4, 0x2502 -> 0xB3, 0x250C -> 0xDA, 0x2510 -> 0xBF,
  24. ; 0x2514 -> 0xC0, 0x2518 -> 0xD9, 0x252C -> 0xC2, 0x2534 -> 0xC1, 0x2551 -> 0xBA
  25. macro fetch_utf8_char string, offs, char, graph
  26. { local first_byte, b
  27.   virtual at 0
  28.     db string
  29.     if offs >= $
  30.       char = -1
  31.     else
  32.       ; fetch first byte
  33.       load first_byte byte from offs
  34.       if first_byte < 0x80
  35.         char = first_byte
  36.         offs = offs + 1
  37.       else if first_byte < 0xC0
  38.         .err Invalid UTF-8 string
  39.       else if first_byte < 0xE0
  40.         char = first_byte and 0x1F
  41.         load b byte from offs + 1
  42.         char = (char shl 6) + (b and 0x3F)
  43.         offs = offs + 2
  44.       else if first_byte < 0xF0
  45.         char = first_byte and 0xF
  46.         load b byte from offs + 1
  47.         char = (char shl 6) + (b and 0x3F)
  48.         load b byte from offs + 2
  49.         char = (char shl 6) + (b and 0x3F)
  50.         offs = offs + 3
  51.       else if first_byte < 0xF8
  52.         char = first_byte and 0x7
  53.         load b byte from offs + 1
  54.         char = (char shl 6) + (b and 0x3F)
  55.         load b byte from offs + 2
  56.         char = (char shl 6) + (b and 0x3F)
  57.         load b byte from offs + 3
  58.         char = (char shl 6) + (b and 0x3F)
  59.         offs = offs + 4
  60.       else
  61.         .err Invalid UTF-8 string
  62.       end if
  63.     end if
  64.   end virtual
  65.   if char = 0x2500
  66.     graph = 0xC4
  67.   else if char = 0x2502
  68.     graph = 0xB3
  69.   else if char = 0x250C
  70.     graph = 0xDA
  71.   else if char = 0x2510
  72.     graph = 0xBF
  73.   else if char = 0x2514
  74.     graph = 0xC0
  75.   else if char = 0x2518
  76.     graph = 0xD9
  77.   else if char = 0x252C
  78.     graph = 0xC2
  79.   else if char = 0x2534
  80.     graph = 0xC1
  81.   else if char = 0x2551
  82.     graph = 0xBA
  83.   else
  84.     graph = 0
  85.   end if
  86. }
  87. ; Latin-1 encoding
  88. ; 0x00-0xFF - trivial map
  89. macro latin1 [arg]
  90. { local offs, char, graph
  91.   offs = 0
  92.   while 1
  93.     fetch_utf8_char arg, offs, char, graph
  94.     if char = -1
  95.       break
  96.     end if
  97.     if graph
  98.       db graph
  99.     else if char < 0x100
  100.       db char
  101.     else
  102.       .err Failed to convert to Latin-1
  103.     end if
  104.   end while
  105. }
  106. use32
  107.  
  108.                org    0x0
  109.  
  110.                db     'MENUET01'              ; 8 byte id
  111.                dd     0x01                    ; header version
  112.                dd     START                   ; start of code
  113.                dd     I_END                   ; size of image
  114.                dd     0x100000                ; memory for app
  115.                dd     0x7fff0                 ; esp
  116.                dd     0x0 , 0x0               ; I_Param , I_Icon
  117.  
  118. START:                          ; start of execution
  119.      jmp red
  120.  
  121. still:
  122.     mcall 10            ; wait here for event
  123.     cmp  eax,1                  ; redraw request ?
  124.      je  red
  125.     cmp  eax,2                  ; key in buffer ?
  126.      je  key
  127.     cmp  eax,3                  ; button in buffer ?
  128.      je  button
  129.     jmp  still
  130.  
  131.   red:                          ; redraw
  132.     call draw_window
  133.     call draw_board
  134.     call draw_message
  135.     jmp  still
  136.  
  137.   key:                          ; key
  138.     mcall 2                     ; just read it and ignore
  139.     jmp  still
  140.   button:                       ; button
  141.     call get_input
  142.     jmp  still
  143.  
  144.  
  145.  
  146. get_input:
  147. pusha
  148.     mcall 17                    ; get id
  149.  
  150.     cmp  ah,1                   ; button id=1 ?
  151.     jne  .noclose
  152.     mcall -1                    ; close this program
  153.   .noclose:
  154.     cmp  ah,4
  155.     jne  .moderate
  156.     mov  [diffic],1
  157.     jmp  .enddiffic
  158.    .moderate:
  159.     cmp  ah,3
  160.     jne  .easy
  161.     mov  [diffic],3
  162.     jmp  .enddiffic
  163.    .easy:
  164.     cmp  ah,2
  165.     jne  .board
  166.     mov  [diffic],5
  167.    .enddiffic:
  168.     mov  [score],0
  169.     mov  [speed],40
  170.     mov  [level],1
  171.     mov  [stat],0
  172.     mov  [time],0
  173.     call draw_window
  174.     call scramble_board
  175.     call draw_board
  176.     call countdown
  177.     call wassermarsch
  178.     jmp  .getno
  179.   .board:
  180.     cmp  [stat],2
  181.     jge  .getno
  182.     shr  eax,8                  ; -> 24bit id
  183.     cmp  eax,10
  184.     jle  .getno
  185.     cmp  eax,150
  186.     jg   .getno
  187.     sub  eax,10
  188.     mov  edi,eax
  189.     add   edi,map
  190.     cmp   [edi], byte 1
  191.     jg    .nogerade
  192.     xor   byte [edi], 1
  193.     call  draw_board
  194.     jmp   .getno
  195.   .nogerade:
  196.     cmp   [edi], byte 6
  197.     jge   .getno
  198.     cmp   [edi], byte 5
  199.     jne   .rota
  200.     sub   byte [edi],4
  201.   .rota:
  202.     inc   byte [edi]
  203.     call  draw_board
  204.   .getno:
  205. popa
  206. ret
  207. ;//// end of event detection
  208. get_direction:              ;Setzt Richtungs-Konstanten
  209. pusha                       ;IN:
  210. mov eax,[esp+28]            ;eax  -  Richtung IN
  211. mov ebx,[esp+16]            ;ebx  -  Teilchen (Map-Wert)
  212. cmp ebx,0                   ;OUT:
  213. jne .no0                    ;eax  -  Richtung OUT
  214.   cmp eax,14
  215.   jne .o0
  216.   jmp .setout
  217.   .o0:
  218.   cmp eax,-14
  219.   jne .col
  220.   jmp .setout
  221. .no0:
  222. cmp ebx,1
  223. jne .no1
  224.   cmp eax,1
  225.   jne .o1
  226.   jmp .setout
  227.   .o1:
  228.   cmp eax,-1
  229.   jne .col
  230.   jmp .setout
  231. .no1:
  232. cmp ebx,2
  233. jne .no2
  234.   cmp eax,14
  235.   jne .o2
  236.   sub eax,13
  237.   jmp .setout
  238.  .o2:
  239.   cmp eax,-1
  240.   jne .col
  241.   sub eax,13
  242.   jmp .setout
  243. .no2:
  244. cmp ebx,3
  245. jne .no3
  246.   cmp eax,-14
  247.   jne .o3
  248.   add eax,15
  249.   jmp .setout
  250.  .o3:
  251.   cmp eax,-1
  252.   jne .col
  253.   add eax,15
  254.   jmp .setout
  255. .no3:
  256. cmp ebx,4
  257. jne .no4
  258.   cmp eax,-14
  259.   jne .o4
  260.   add eax,13
  261.   jmp .setout
  262.  .o4:
  263.   cmp eax,1
  264.   jne .col
  265.   add eax,13
  266.   jmp .setout
  267. .no4:
  268. cmp ebx,5
  269. jne .no5
  270.   cmp eax,14
  271.   jne .o5
  272.   sub eax,15
  273.   jmp .setout
  274.  .o5:
  275.   cmp eax,1
  276.   jne .col
  277.   sub eax,15
  278.   jmp .setout
  279. .no5:
  280. cmp ebx,6
  281. jne .no6
  282.   jmp .setout
  283. .no6:
  284. cmp ebx,7
  285. jne .no7
  286.   mov eax,14
  287.   jmp .setout
  288. .no7:
  289. cmp ebx,8
  290. jne .no8
  291.   cmp eax,14
  292.   jne .col
  293.   mov [stat],1
  294.   jmp .setout
  295. .no8:
  296. cmp ebx,16        ; cross 2x
  297. jne .col
  298.   add [score],10  ; + 10 bonus points
  299.   jmp .setout
  300. .col:
  301. xor eax,eax
  302. .setout:
  303. xor ebx,ebx
  304. mov [esp+28],eax
  305. mov [esp+16],ebx
  306. popa
  307. ret
  308.  
  309. countdown:
  310. pusha
  311. xor  eax,eax
  312. mov  al,[diffic]
  313. imul eax,10
  314. mov  [time],eax
  315. .udown:
  316. call show_score
  317. mov  ecx,10
  318. .down:
  319. mov  eax,5
  320. mov  ebx,10
  321. mcall
  322. mov  eax,11
  323. mcall
  324. cmp  eax,1
  325. jne  .nored
  326. call draw_window
  327. call draw_board
  328. jmp  .nothing
  329. .nored:
  330. cmp  eax,3
  331. jne  .nothing
  332. call get_input
  333. .nothing:
  334. cmp  [stat],0         ;bugfix 210806
  335. jnz  .exitsub         ;bugfix 210806
  336. dec  ecx
  337. jnz  .down
  338. dec  [time]
  339. jnz   .udown
  340. .exitsub:             ;bugfix 210806
  341. popa
  342. ret
  343.  
  344. wassermarsch:
  345. pusha
  346.    .restart:
  347.      mov  esi,map+16          ;start position
  348.      mov  eax, 14             ;start-richtung
  349.    .findway:
  350.      movzx ebx, byte [esi]
  351.      call  get_direction
  352.      test  eax,eax
  353.      jz   .collision
  354.      push  eax
  355.       xor   eax,eax
  356.       mov   al,6
  357.       sub   al,[diffic]
  358.       add   [score],eax          ;points/item = 6 - difficulty
  359.       mov   ecx,dword [speed]
  360.       add   byte [esi],10
  361.       .down:
  362.       mov   eax,5
  363.       mov   ebx,2
  364.       mcall
  365.       mov   eax,11
  366.       mcall
  367.       cmp   eax,1
  368.       jne   .nored
  369.       call  draw_window
  370.       .nored:
  371.       cmp   eax,3
  372.       jne   .noevnt
  373.       call  get_input
  374.       .noevnt:
  375.       dec   ecx
  376.       jnz   .down
  377.      pop   eax
  378.  
  379.      add   esi,eax
  380.      call  draw_board
  381.      call  show_score
  382.      jmp   .findway
  383.    .collision:
  384.     cmp [stat],1
  385.     jne .loose
  386.     call draw_message
  387.     mov   eax,5
  388.     mov   ebx,500
  389.     mcall
  390.     mov [stat],0
  391.     inc [level]
  392.     cmp [speed],6                ;waterflowdelay < 6 ?
  393.     jle .skipsub
  394.     sub [speed],2
  395.    .skipsub:
  396.     call draw_window
  397.     call scramble_board
  398.     call draw_board
  399.     call countdown
  400.     jmp  .restart
  401.    .loose:
  402.     mov  [stat],2
  403.     call draw_message
  404. popa
  405. ret
  406.  
  407. show_score:
  408. pusha
  409. mov  eax,13                      ;clear time and score area
  410. mov  ebx,50 shl 16 +15
  411. mov  ecx,395 shl 16 +15
  412. mov  edx,bgcolor
  413. mcall
  414. if lang eq et
  415. add  ebx,60 shl 16 + 30
  416. else
  417. add  ebx,60 shl 16 + 20
  418. end if
  419. mcall
  420. add  ebx,80 shl 16
  421. mcall
  422. mov  eax,47
  423. mov  ebx,0x20000
  424. mov  ecx,[time]
  425. mov  edx,50*65536+398
  426. mov  esi,fg2color
  427. mcall
  428. mov  ebx,0x50000
  429. mov  ecx,[score]
  430. if lang eq et
  431. add  edx,70 shl 16
  432. else
  433. add  edx,60 shl 16
  434. end if
  435. mcall
  436. mov  ebx,0x20000
  437. mov  ecx,[level]
  438. add  edx,80 shl 16
  439. mcall
  440.  
  441. popa
  442. ret
  443.  
  444.  
  445.  
  446. scramble_board:
  447. pusha
  448. mov edi,map+16 ;startpunkt
  449. mov eax,7      ;wieder-
  450. stosb          ;herstellen
  451.  
  452. mov ebx, 0x00000007  ;modul         m max-wert
  453. .loop_through:
  454. mov   esi,edi
  455. lodsb
  456. cmp   eax, 9
  457.  je   .skip
  458. inc   eax
  459. xor   edx, edx
  460. div   ebx           ;modulo -> edx
  461. mov   eax, edx
  462. cmp   eax,6
  463. jne   .skip
  464. dec   [half]
  465. movzx eax, byte [half]
  466. jnz   .skip
  467. mov   [half], byte 7
  468. .skip:
  469. stosb
  470. cmp edi,map+125 ;endpunkt erhalten
  471. jge .exit
  472. jmp .loop_through
  473. .exit:
  474. mov  eax,8
  475. stosb
  476. popa
  477. ret
  478.  
  479.  
  480. gen_image:
  481. pusha
  482.     xor   ebx,ebx          ;default: kein wasser
  483.     movzx eax,byte [map]   ;erstes byte der map lesen (position)
  484.     inc   byte [map]       ;position inkrementieren
  485.     add   eax,map          ;zur position die map-adresse addieren
  486.     movzx  esi,byte [eax]
  487.     cmp   esi,10
  488.     jl    .nowater
  489.     sub   esi,10          ;map-werte+10 sind mit wasser gefuellt
  490.     mov   ebx,1
  491.     cmp   esi,16
  492.     jne   .nowater
  493.     sub   esi,10
  494.  .nowater:
  495.    imul  esi,3072         ;mapwert * 32*32*3 = image-adresse
  496.     add  esi,images
  497.     mov  edi,0x10000
  498.     mov  ecx,32*32*3
  499.  .gendd:                  ;RGB-Image im Speicher generieren
  500.     mov   eax,dword [esi] ;byte aus imagemap lesen
  501.     shl   eax,8
  502.     shr   eax,8
  503.     cmp   ebx,0
  504.     jz    .nowcolor
  505.     mov   ebx,eax
  506.     cmp   ebx,0x00B0B5B0
  507.     jne   .nog1
  508.     jmp   .wcolor
  509.  .nog1:
  510.     cmp   ebx,0x00A0A5A0
  511.     jne   .nog2
  512.     jmp   .wcolor
  513.  .nog2:
  514.     cmp   ebx,0x00909590
  515.     jne   .nog3
  516.     jmp   .wcolor
  517.  .nog3:
  518.     cmp   ebx,0x00808580
  519.     jne   .nog4
  520.     jmp   .wcolor
  521.  .nog4:
  522.     cmp   ebx,0x00707570
  523.     jne   .nowcolor
  524.     jmp   .wcolor
  525.  .wcolor:
  526.     add   eax,0x40
  527.  .nowcolor:
  528.     add  esi,3
  529.     stosd
  530.     dec  edi
  531.     loop .gendd
  532. popa
  533. ret
  534.  
  535.  
  536.  
  537. ;   *********************************************
  538. ;   *******  WINDOW DEFINITIONS AND DRAW ********
  539. ;   *********************************************
  540. draw_message:
  541. pusha
  542.     cmp  [stat],0
  543.         je .nomessage
  544.     mov  eax,13
  545.     mov  ebx,146 shl 16 + 200
  546.     mov  ecx,190 shl 16 + 40
  547.     mov  edx,0x0
  548.     mcall
  549.     add  ebx,2 shl 16 - 4
  550.     add  ecx,2 shl 16 - 4
  551.     mov  edx,fgcolor
  552.     mcall
  553.  
  554.         cmp  [stat],3
  555.         jne .stat1
  556.     mov   eax,4
  557.     mov   ebx,174 shl 16 +206
  558.     mov   edx,lbl_start_a_new_game+1
  559.     movzx esi,byte [lbl_start_a_new_game]
  560.     mov   ecx,btcolor
  561.     add   ecx,0x10000000
  562.     mcall
  563.     jmp .nomessage
  564.  
  565.   .stat1:      
  566.     cmp   [stat],1
  567.      je   .winmessage
  568.     mov   eax,4
  569.     mov   ebx,186 shl 16 +200
  570.     mov   edx,lbl_gameover+1
  571.     movzx esi,byte [lbl_gameover]
  572.     mov   ecx,btcolor
  573.     add   ecx,0x10000000
  574.     mcall
  575.     add   ebx,8 shl 16 +17
  576.     mov   edx,lbl_yscore+1
  577.     movzx esi,byte [lbl_yscore]
  578.     mov   ecx,btcolor
  579.     mcall
  580.     mov   esi,ecx       ;color
  581.     mov   edx,ebx       ;pos
  582.     add   edx,80 shl 16
  583.     mov   ebx,0x50000    ;type
  584.     mov   ecx,[score]    ;inp
  585.     mov   eax,47
  586.     mcall
  587.     jmp   .nomessage
  588.    .winmessage:
  589.     mov   eax,4
  590.     mov   ebx,152 shl 16 +200
  591.     mov   edx,lbl_win+1
  592.     movzx esi,byte [lbl_win]
  593.     mov   ecx,btcolor
  594.     add   ecx,0x10000000
  595.     mcall
  596.     mov   ebx,152 shl 16 +217
  597.     add   edx,esi
  598.     mov   ecx,btcolor
  599.     mcall
  600.    .nomessage:
  601. popa
  602. ret
  603.  
  604. draw_board:
  605. pusha
  606.  mov  ebx,15*65536+32
  607.  mov  ecx,50*65536+32
  608.  mov  edx,15*65536+50            ;Spielfeldposition
  609.  mov  esi,10                      ;Spielfeldgroesse Y
  610.  .vloop:
  611.   mov  edi,14                    ;Spielfeldgroesse X
  612.   .hloop:
  613.     call gen_image
  614.     push edx
  615.     mov  eax,8
  616.     movsx edx, byte [map]
  617.     add  edx,9              ;button-id = map-pos + 10;gen_image inkrements
  618.     add  edx,0x80000000     ;first delete previous button
  619.         mcall
  620.     sub  edx,0x30000000     ;first delete previous button
  621.     mcall
  622.     pop  edx
  623.     push ebx
  624.     push ecx
  625.     mov  eax,7
  626.     mov  ebx,0x10000
  627.     mov  ecx,32 shl 16 +32
  628.     mcall
  629.     pop  ecx
  630.     pop  ebx
  631.     add  edx,33 shl 16
  632.     add  ebx,33 shl 16
  633.     dec  edi
  634.     jnz  .hloop
  635.   sub  edx,14*(33 shl 16)        ;Spielfeldgroesse X
  636.   sub  ebx,14*(33 shl 16)
  637.   add  edx,33
  638.   add  ecx,33 shl 16
  639.   dec  esi
  640.   jnz  .vloop
  641.   mov  [map], byte 1             ;Map-Position zuruecksetzen
  642. popa
  643. ret
  644.  
  645.  
  646. draw_window:
  647. pusha
  648.  
  649.     mcall 12,1
  650.        
  651.     mov  eax,0                     ; function 0 : define and draw window
  652.     mov  ebx,100*65536+492         ; [x start] *65536 + [x size]
  653.     mov  ecx,100*65536+420         ; [y start] *65536 + [y size]
  654.     mov  edx,bgcolor               ; color of work area RRGGBB,8->color gl
  655.     or   edx,0x14000000
  656.     mov  edi,title
  657.     mcall
  658.  
  659.     mov   eax,8
  660.     mov   ebx,84*65536+72
  661.     mov   ecx,28*65536+15
  662.     mov   edx,2
  663.     mov   esi,btcolor
  664.     mcall
  665.     add   ebx,76 shl 16
  666.     inc   edx
  667.     mcall
  668.     add   ebx,76 shl 16
  669.     inc   edx
  670.     mcall
  671.  
  672.     mov   eax,4
  673.     mov   ebx,26 shl 16 +32
  674.     mov   ecx,fgcolor
  675.     mov   edx,lbl_toolbar+1
  676.     movsx esi, byte [lbl_toolbar]
  677.     mcall
  678.     mov   ebx,18 shl 16 +398
  679.     mov   edx,lbl_score+1
  680.     movsx esi, byte [lbl_score]
  681.     mcall
  682.     mov   ebx,340 shl 16 +405
  683.     mov   ecx,fg3color
  684.     mov   edx,lbl_copy+1
  685.     movsx esi,byte [lbl_copy]
  686.     mcall
  687.  
  688.     mcall 12,2
  689.  
  690.     popa
  691.     ret
  692.  
  693.  
  694. ; DATA AREA
  695. if lang eq et
  696. title  db  'Torud',0
  697. lbl_gameover:
  698.      db 19
  699.      latin1 'M ä n g   L ä b i !'
  700. lbl_start_a_new_game:
  701.      db 21
  702.      latin1 'Alusta enne uut mängu'
  703. lbl_win:
  704.      db 32
  705.      latin1 '          T u b l i !           '
  706.      latin1 '          Lähme edasi!          '
  707. lbl_yscore:
  708.      db 12
  709.      latin1 'Sinu tulemus:'
  710. lbl_toolbar:
  711.      db 43
  712.      latin1 'Uus mäng:     Lihtne     Keskmine     Raske'
  713. lbl_copy:
  714.      db 24
  715.      latin1 'v1.21 2006,Mario Birkner'
  716. lbl_score:
  717.      db 28
  718.      latin1   'Aeg:    Tulemus:       Tase:'
  719. else
  720. title  db   'Pipes',0
  721. lbl_gameover:
  722.      db 19
  723.      db 'G a m e   O v e r !'
  724. lbl_start_a_new_game:
  725.      db 22
  726.      db 'Start a new game first'
  727. lbl_win:
  728.      db 32
  729.      db '          G r e a t !           '
  730.      db "       Let's keep going!        "
  731. lbl_yscore:
  732.      db 11
  733.      db 'Your Score:'
  734. lbl_toolbar:
  735.      db 43
  736.      db 'New Game:     Easy       Moderate      Hard'
  737. lbl_copy:
  738.      db 24
  739.      db 'v1.21 2006,Mario Birkner'
  740. lbl_score:
  741.      db 28
  742.      db   'Time:    Score:       Level:'
  743. end if
  744. stat    db 3  ;0=gameplay 1=won 2-lost 3=stopped
  745. speed   db 0
  746. time    dd 0
  747. diffic  db 0  ;1=hard 3=moderate 5=easy 8=dedicated to Wildwest - try it out!
  748. score   dd 0
  749. level   dd 1
  750. half    db 1  ;reduces the random-crosses
  751.  
  752. map:       ;14*10 blocks + position
  753.      db 1  ;<- act. position
  754.      db 9,9,9,9,9,9,9,9,9,9,9,9,9,9
  755.      db 9,7,1,3,2,0,1,1,0,3,4,4,3,9
  756.      db 9,5,0,2,2,1,3,0,3,1,1,6,4,9
  757.      db 9,4,0,4,6,0,3,3,2,6,0,1,2,9
  758.      db 9,3,0,1,2,4,6,4,5,1,2,4,1,9
  759.      db 9,5,3,2,6,3,2,1,2,1,2,6,0,9
  760.      db 9,4,0,2,3,0,4,1,2,3,2,3,4,9
  761.      db 9,2,0,4,5,6,3,1,3,0,4,1,0,9
  762.      db 9,1,0,3,5,4,2,2,4,1,6,0,8,9
  763.      db 9,9,9,9,9,9,9,9,9,9,9,9,9,9
  764. images:
  765. file 'pipes.raw'
  766. I_END:
  767.  
  768.  
  769.  
  770.  
  771.