home *** CD-ROM | disk | FTP | other *** search
/ Prima Shareware 3 / DuCom_Prima-Shareware-3_cd1.bin / PROGRAMO / PASCAL / HEJB / GRAPH / OBRAZ3D.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1993-12-10  |  23.2 KB  |  710 lines

  1. {$g+}
  2. unit obraz3d;
  3.  
  4. interface
  5. uses dos, crt;
  6.  
  7. const
  8.   _z_back        = $80;  { z sou⌐adnice pozadí }
  9.  
  10.   { viz typ bodu }
  11.   _mazat         = $10;  { bod je samostatne pamêti a se zhasnutím p⌐estane existovat }
  12.   _pouzit        = $20;  { bod je zobrazen }
  13.   _pozadi        = $40;  { bod je pozadí }
  14.  
  15. type
  16.   bod_fyz_obrazu = byte;
  17.  
  18. const
  19.   maximum_obrazu = 65535 div (4+sizeof(bod_fyz_obrazu))-1; { maximální poçet bodû spojitého obrazu }
  20.  
  21.   __sada_3d_8x8  = $80;         { grafické módy }
  22.   __sada_2d_8x8  = $40;
  23.  
  24.   _mnptr         = $fff0;
  25.   _mptr          = $ffff000f;
  26.  
  27. type
  28.   typ_pole_bytu         = array[0..65534]of byte; { pomocné typy }
  29.   ptr_to_pole_bytu      = ^typ_pole_bytu;
  30.  
  31.   typ_ind_obrazu        = 0..maximum_obrazu-1;
  32.   typ_souradnic = shortint; { typ sou⌐adnice dvou a t⌐írozmêrnÿch bodû }
  33.   tsou_2d       = record
  34.                    x, y : typ_souradnic;
  35.                  end;
  36.   tsou_3d       = record
  37.                    case boolean of
  38.                      true  : (x, y, z  : typ_souradnic);
  39.                      false : (x2d, y2d : typ_souradnic);
  40.                  end;
  41.   ptr_tsou_3d  = ^tsou_3d; { pomocnÿ ukazatel }
  42.  
  43.   typ_bod_3d  = ^typ_ob_bodu; { ukazatel na bod virtuální obrazovky }
  44.   typ_ob_bodu = record        { typ bodu virtuální obrazovky }
  45.                   case byte of
  46.                     0    : ( _l, _h : word); { pomocné promênné }
  47.                     1    : (typ   : byte;
  48.       { x x x x x x x x                                              }
  49.       { ^ ^ ^ ^ ^ ^ ^ ^                                              }
  50.       { | | | | | | | |                                              }
  51.       { | | | | -----------> lo adresy dal¿ího v segmentu            }
  52.       { | | | -------------> 1 .. bod je v samostné pamêti           }
  53.       { | | ---------------> 1 .. bod je pouæit v 3d obrazu          }
  54.       { | -----------------> 1 .. bod je souçástí pozadí             }
  55.       { -------------------> zatím nepouæit                          }
  56.                              z     : shortint;
  57.       { tohle je z souradnice daneho bodu                            }
  58.                              dalsi : word;
  59.       { segment dalsiho bodu obrazu                                  }
  60.                              obsah : bod_fyz_obrazu;);
  61.       { obsah fyzické obrazovky                                      }
  62.                     2    : ( point : typ_bod_3d); { pomocná promênná }
  63.                 end;
  64.  
  65.   typ_obrazu_3d    = array[typ_ind_obrazu]of typ_ob_bodu; { typ pole, ve kterém jsou uloæeny body pozadí virtuální obrazovky }
  66.   ptr_to_3d_obraz  = ^typ_obrazu_3d; { a typ ukazatele na toto pole }
  67.  
  68.   ptr_to_3d_obrazovka = ^typ_obrazovka_3d;
  69.   typ_obrazovka_3d = object{ typ virtuální obrazovky }
  70.              posunx, posuny, levy, pravy, horni, dolni : typ_souradnic;
  71.              sirka    : typ_souradnic;
  72.              velikost : word;
  73.              __obraz  : ptr_to_3d_obraz;
  74.               { v tomto poli jsou ulozeny body pozadi }
  75.  
  76.              procedure zobraz_bod_obsah_xy (x, y, z : typ_souradnic; co : bod_fyz_obrazu);
  77.              procedure zhasni_bod_obsah_xy (x, y, z : typ_souradnic; co : bod_fyz_obrazu);
  78.               { zobrazí a zhasnou znak a atribut (co) na danou posici [x, y, z]. p⌐i zhasnutí p⌐estane bod existovat v pamêti }
  79.              procedure zobraz_bod_pozadi_xy(x, y : typ_souradnic;co : bod_fyz_obrazu);
  80.               { zobrazí a zhasnou znak a atribut (co) na danou posici [x, y, -128] do pozadí obrazovky }
  81.  
  82.              procedure zobraz_bod_xy       (x, y : typ_souradnic; bod : typ_bod_3d);
  83.              procedure zhasni_bod_xy       (x, y : typ_souradnic; bod : typ_bod_3d);
  84.               { zobrazí a zhasnou bod ve virtuální obrazovce }
  85.              procedure obnov_bod_xy        (x, y : typ_souradnic);
  86.               { obnoví bod virtuální obrazovky }
  87.              procedure presun_bod_xy       (x1, y1, x2, y2 : typ_souradnic; bod : typ_bod_3d );
  88.               { p⌐esune bod ve virtuální obrazovce }
  89.  
  90.               { na pozici [x, y, z] se mûæe nacházet více bodû, jednoznaçnê }
  91.               { je bod u⌐çen pouze ukazatelem na tento bod }
  92.  
  93.              procedure zacni(_posunx, _posuny, _levy, _pravy, _horni, _dolni : typ_souradnic);
  94.               { zabere v dynamické pamêti místo pro pozadí virtuální obrazovky, }
  95.               { p⌐izpûsobí do pot⌐ebného tvaru a p⌐eçte do této pamêti to, }
  96.               { co je právê na fyzické obrazovce. }
  97.  
  98.              procedure cti_pozadi;
  99.               { p⌐eçte do pozadí virtuální obrazovky právê aktivní fyzickou obrazovku }
  100.  
  101.              procedure vytvor_pozadi;
  102.               { p⌐izpûsobí pamꃠpro pozadí virtuální obrazovky }
  103.               { do pot⌐ebného tvaru (t.j. x*y cyklickÿch seznamû) }
  104.  
  105.              procedure obnov_obraz;
  106.               { obnoví obsah virtuální obrazovky na fyzickou }
  107.  
  108.              procedure skoncuj;
  109.              procedure clrscr;
  110.               { vymaæe pozadí virtuální obrazovky }
  111.  
  112.  
  113.            private
  114.              procedure zrus_pozadi;
  115.               { na fyzickou obrazovku p⌐epí¿e pozadí z virtuální }
  116.               { a uvolní samostatnou pamꃠvirtuální obrazovky }
  117.               { (t.j. pozadí a samostatné body) }
  118.              procedure zobraz_bod_pozadi(adrobj : integer; co : bod_fyz_obrazu);
  119.              procedure copy_screen( pom3d :  ptr_to_3d_obraz; pomvel  : word;
  120.                                    zbytek :  bod_fyz_obrazu);
  121.  
  122.            end;
  123. const
  124.   pamet_bod_3d = sizeof(typ_ob_bodu);
  125.   __nula3d       : typ_ob_bodu = (typ : 0; z : -128; _h : 0; obsah : 0);
  126.   __nula_3d      : tsou_3d = (x:0;y:0;z:0);
  127.   mizera         : bod_fyz_obrazu = 0;
  128. var
  129.   ___bod    : tsou_3d; { pro predavani hodnot }
  130.  
  131.  
  132. function xyz_bod(x, y, z : typ_souradnic):ptr_tsou_3d;
  133. {procedure initgraph(var graphdriver:integer; var graphmode: integer;
  134.    pathtodriver: string);
  135. }implementation
  136. uses
  137.   graph;
  138.  
  139. {procedure initgraph(var graphdriver:integer; var graphmode: integer;
  140.    pathtodriver: string);
  141.  
  142. begin
  143.   graph.initgraph(graphdriver, graphmode, pathtodriver);
  144.   if graphdriver = vga
  145.     then asm
  146.            mov al, 13h
  147.        int 10h
  148.          end;
  149. end;
  150.  
  151. function getpixel(x,y: integer): bod_fyz_obrazu;
  152. var color : byte;
  153. begin
  154.   asm      mov ah, 0dh
  155.            mov bh, 0
  156.            mov dx, y
  157.            mov cx, x
  158.            mov color, al
  159.            int 10h
  160.   end;
  161.   getpixel := color;
  162. end;
  163.  
  164.  
  165. procedure putpixel(x, y : integer; color : bod_fyz_obrazu);
  166. begin
  167.   asm      mov ah, 0ch
  168.            mov bh, 0
  169.            mov dx, y
  170.            mov cx, x
  171.            mov al, byte ptr color
  172.            int 10h
  173.   end;
  174. end;
  175. }
  176. function xyz_bod(x, y, z : typ_souradnic):ptr_tsou_3d;
  177. begin
  178.   xyz_bod := @___bod;
  179.   ___bod.x := x;
  180.   ___bod.y := y;
  181.   ___bod.z := z;
  182. end;
  183.  
  184. procedure typ_obrazovka_3d.copy_screen( pom3d :  ptr_to_3d_obraz;
  185.                      pomvel  : word;
  186.                       zbytek : bod_fyz_obrazu);
  187. var velcykl1, velcykl2, i : word;
  188. begin
  189.   if pomvel > velikost
  190.     then begin velcykl1 := velikost-1; velcykl2 := pomvel-1 end
  191.     else begin velcykl2 := velikost-1; velcykl1 := pomvel-1 end;
  192.  
  193.   for i := 0 to velcykl1 do zobraz_bod_pozadi(i, pom3d^[i].obsah);
  194.   for i := velcykl1+1 to velcykl2 do zobraz_bod_pozadi(i, 0);
  195. end;
  196.  
  197. procedure typ_obrazovka_3d.zobraz_bod_obsah_xy(x, y, z : typ_souradnic;  co : bod_fyz_obrazu);
  198. label nezobrazit;
  199. var pom : typ_bod_3d;
  200. begin
  201.   if x >= levy then if x <= pravy then if y >= horni then if y <= dolni then
  202.     begin
  203.       new(pom);
  204.       pom^.z     := z;
  205.       pom^.typ   := _mazat;
  206.       pom^.obsah := co;
  207.       zobraz_bod_xy(x, y, pom);
  208.     end;
  209.   nezobrazit:
  210. end;
  211.  
  212. procedure typ_obrazovka_3d.zhasni_bod_obsah_xy(x, y, z : typ_souradnic; co : bod_fyz_obrazu);
  213. label dalsi, konec, nezobrazit;
  214. var    bod, tmpbod : typ_bod_3d;
  215.  
  216.     adrobj : integer;
  217.     barva  : bod_fyz_obrazu;
  218. begin
  219. (*  bod := nil;
  220.   if x >= levy then if x <= pravy then if y >= horni then if y <= dolni then
  221.     begin
  222. {      adrobj := x-levy + (y-horni)*(pravy-levy);
  223.       bod := @__obraz^[adrobj];
  224.       repeat
  225.         tmpbod := ptr(bod^._h, bod^._l and $0f);
  226.         if (tmpbod^.typ and _pozadi) <> 0 then exit;
  227.       until not(     ((tmpbod^.typ and _mazat) = 0)
  228.                   or (tmpbod^.z <> z)
  229.                   or (tmpbod^.obsah <> co)
  230.                );
  231.  
  232. }
  233.       asm
  234.                  les di, self
  235.  
  236.                  mov al, es:[di].pravy
  237.                  sub al, es:[di].levy
  238.                  xor ah, ah
  239.                  mov bl, y
  240.                  xor bh, bh
  241.                  mul bx
  242.                  xor ch, ch
  243.                  add ax, cx
  244.                  mov adrobj, ax
  245.  
  246.                  push ds
  247.  
  248.                  lds si, self                        { hejbaci objekt }
  249.                  lds si, ds:[si].__obraz             { obraz3d }
  250.  
  251.                  shl ax, 1
  252.                  mov dx, ax
  253.                  shl dx, 1
  254.                  add dx, ax                              { dx := dx*sizeof(typ_ob_bodu) }
  255.                  add si, dx                      { odkud se má zrusit }
  256.  
  257.                  mov al, z
  258.                  mov cx, co
  259.  
  260. { ds:si adresa dalsiho pixelu, dx:bx adresa predchoziho pixelu }
  261.  
  262.    dalsi:        mov bx, si                { uloæení predchozi adresy }
  263.                  mov dx, ds
  264.                  lds si, ds:[si]               { adresa dal¿ího prvku }
  265.                  and si, 0fh
  266.  
  267.                  test ds:typ_ob_bodu([si]).typ, _pozadi { je to pozadí ? }
  268.                  jnz konec { ne - to, co se ma ru¿it, v seznamu nejni }
  269.  
  270.  
  271.                  cmp al, ds:typ_ob_bodu([si]).z       { sou stejnÿ z ? }
  272.                  jne dalsi                { nejsou ! }
  273.                  cmp cx, ds:typ_ob_bodu([si]).obsah   { sou stejny obsahy ? }
  274.                  jne dalsi                { nejsou ! }
  275.                                           { sou stejny }
  276.                  test ds:typ_ob_bodu([si]).typ, _mazat{ je pixel samostatny ? }
  277.                  jz dalsi         { nejni, nemuzu mazat, ale hledat dal }
  278.  
  279.                  mov word ptr bod, si
  280.                  mov word ptr bod+2, ds
  281.                    { ds:si ruseny bod   }
  282.                    { dx:bx bod pred nim }
  283.                  lds si, ds:[si]         { pointer z ds:[si] se p⌐esune na dx:[bx] }
  284.                  mov ax, ds
  285.                  mov ds, dx
  286.                  mov cx, ds:[bx]
  287.                  and cl,0f0h
  288.                  and si,0fh
  289.                  or cx, si
  290.                  mov ds:[bx], cx
  291.                  mov ds:[bx+2], ax
  292.                    { dx:bx bod pred rusenym }
  293.  
  294.                  test ds:typ_ob_bodu([bx]).typ, _pozadi
  295.                  jz konec
  296.  
  297.                  lds bx, ds:[bx]
  298.                  and bx, 0fh
  299.                  mov ax, ds:typ_ob_bodu([bx]).obsah { bod byl vidêt, na obrazovku musí následující za tímto }
  300.                  mov barva, ax
  301.       end;
  302.                  putpixel(x+posunx, y+posuny, barva);
  303.       asm
  304.     konec :      pop ds
  305.       end;
  306.   end;
  307.   if bod <> nil then dispose(bod);
  308.   nezobrazit:
  309. *)end;
  310.  
  311. procedure typ_obrazovka_3d.vytvor_pozadi;
  312. { procedura vytvo⌐í pozadi v poli obraz, t.j do bod uloæí:      }
  313. {  - obsah fyzické obrazovky na dané pozici                     }
  314. {  - sou⌐adnici z = $80 (-128) _z_back                          }
  315. {  - do horních bitû pole typ nastaví hodnotu 0110              }
  316. {  - do spodních bitû pole typ a do pole dalsi                  }
  317. {    uloæí ukazatel na sebe sama                                }
  318.  
  319. var x, y : typ_souradnic;
  320.     k    : word;
  321.     pompoint : typ_bod_3d;
  322. begin
  323.   k := 0;
  324.   for y := horni to dolni do
  325.     for x := levy to pravy do
  326.       begin
  327.         pompoint := @__obraz^[k];
  328.         asm
  329.           mov ax, word ptr pompoint{normalisace adresy }
  330.           shr ax, 4
  331.           add word ptr pompoint+2, ax
  332.           and word ptr pompoint, $f
  333.         end;
  334.         pompoint^.point := typ_bod_3d(longint(pompoint)+_pozadi or _pouzit + _z_back shl 8);
  335.  
  336.         pompoint^.obsah := getpixel(x+posunx, y+posuny);
  337.  
  338.         inc(k);
  339.       end;
  340. end;
  341.  
  342. procedure typ_obrazovka_3d.zobraz_bod_pozadi_xy    (x, y : typ_souradnic;co : bod_fyz_obrazu);
  343. label nejni_videt;
  344. begin
  345. (*  if x >= levy then if x <= pravy then if y >= horni then if y <= dolni then
  346.     begin
  347.       asm
  348.                  push ds
  349.  
  350.                  les di, self
  351.  
  352.                  mov al, es:[di].pravy
  353.                  sub al, es:[di].levy
  354.                  xor ah, ah
  355.                  mov bl, y
  356.                  xor bh, bh
  357.                  mul bx
  358.                  xor ch, ch
  359.                  add ax, cx               { ax = adrobj }
  360.  
  361.                  lds si, self             { hejbaci objekt }
  362. {                 les di, ds:[si].fyz_obraz{ obrazovka }
  363.                  lds si, ds:[si].__obraz  { pozadi }
  364.  
  365.                  shl ax, 1                { adrobj * 2 }
  366.                  mov bx, ax
  367.  
  368.                  shl bx, 1                { adrobj * 4 }
  369.                  add bx, ax               { adrobj * 6 }
  370.                  add si, bx               { adrobj * 6 pricist k adr. pozadi }
  371.  
  372.                  mov ax, co               { uloæ co do 3d }
  373.                  mov ds:typ_ob_bodu([si]).obsah, ax
  374.  
  375.                  lds si, ds:[si]
  376.                  and si, 0fh
  377.                  test ds:typ_ob_bodu([si]).typ, _pozadi { je co taky na obrazovce ? }
  378.  
  379.                  jz nejni_videt           { t.j. za nim je pozadi }
  380.                  pop ds
  381.       end;
  382.                  putpixel(x+posunx, y+posuny, co);
  383.  
  384.       asm        push ds
  385.    nejni_videt : pop ds
  386.       end
  387.     end;
  388. *)end;
  389.  
  390. procedure typ_obrazovka_3d.zobraz_bod_pozadi(adrobj : integer; co : bod_fyz_obrazu);
  391. { do pozadí umístí procedura na posici adrobj co. pokud pozadí }
  392. { bylo vidêt, zobrazí co                                       }
  393. { procedura je v po⌐ádku                                       }
  394.  
  395. label nejni_videt;
  396. begin
  397. (*  asm
  398.                  push ds
  399.  
  400.                  lds si, self             { hejbaci objekt }
  401. {                 les di, ds:[si].fyz_obraz{ obrazovka }
  402.                  lds si, ds:[si].__obraz  { pozadi }
  403.  
  404.                  mov bx, adrobj           { adresa v obrazovce }
  405.                  cmp bx, 0ffffh
  406.                  jle nejni_videt
  407.                  cmp bx, ds:[si].velikost
  408.                  jg  nejni_videt
  409.  
  410.                  shl bx, 1                { adrobj * 2 }
  411.                  mov ax, bx
  412. {                 add di, bx               { pricist k adrese fyz. obrazovky }
  413.  
  414.                  shl bx, 1                { adrobj * 4 }
  415.                  add bx, ax               { adrobj * 6 }
  416.                  add si, bx               { adrobj * 6 pricist k adr. pozadi }
  417.  
  418.                  mov ax, co               { uloæ co do 3d }
  419.                  mov ds:typ_ob_bodu([si]).obsah, ax
  420.  
  421.                  lds si, ds:[si]
  422.                  and si, 0fh
  423.                  test ds:typ_ob_bodu([si]).typ, _pozadi { je co taky na obrazovce ? }
  424.                  jz nejni_videt           { t.j. za nim je pozadi }
  425.  
  426.                  pop ds
  427.   end;
  428.  
  429. {                 putpixel(x+posunx, y+posuny, co);}
  430.   asm
  431.                  push ds
  432.  
  433.    nejni_videt : pop ds
  434.   end
  435. *)end;
  436.  
  437. procedure typ_obrazovka_3d.cti_pozadi;
  438. { procedura p⌐eçte fyzickou obrazovku a uloæí do pozadí 3d obrazovky }
  439. { procedura je v po⌐ádku                                       }
  440. var i : word;
  441. begin
  442.   for i := 0 to velikost-1 do
  443.     zobraz_bod_pozadi(i, getpixel(i mod (sirka), i div (sirka)));
  444. end;
  445.  
  446. procedure typ_obrazovka_3d.obnov_obraz;
  447. var x, y, k : integer;
  448. begin
  449.   k := 0;
  450.   for y := horni to dolni do
  451.     for x := levy to pravy do
  452.       begin
  453.         putpixel(x+posunx, y+posuny, typ_bod_3d(ptr(__obraz^[k]._h, $0f and __obraz^[k]._h))^.obsah);
  454.         inc(k);
  455.       end;
  456. end;
  457.  
  458. procedure typ_obrazovka_3d.clrscr;
  459. var x, y, k : integer;
  460.     barva : bod_fyz_obrazu;
  461. label zvets, dalsi, konec;
  462. begin
  463.   k := 0;
  464.   for y := horni to dolni do
  465.     for x := levy to pravy do
  466.       begin
  467.         __obraz^[k].obsah := mizera;
  468.         inc(k);
  469.       end;
  470. end;
  471.  
  472. procedure typ_obrazovka_3d.zrus_pozadi;
  473. { procedura je v po⌐ádku                                       }
  474.  
  475. var rus_bod, fyz, o3d, tmp : typ_bod_3d;
  476. label nerusit, dalsi1, dalsi2, dalsi3, zvetsit;
  477. begin
  478. (*  asm
  479.                  push ds
  480.  
  481.                  les si, self
  482.                  mov cx, es:[si].velikost
  483. {                 dec cx}
  484. {                 les di, [si].fyz_obraz}
  485.                  lds si, [si].__obraz
  486.  
  487.     dalsi1:      mov bx, typ_ob_bodu([si]).obsah { je, presun 3d -> fyz_obraz }
  488.  
  489.  
  490.                  mov es:[di], bx
  491.                  test typ_ob_bodu([si]).typ, _pozadi
  492.                  jz zvetsit
  493.  
  494.                  mov word ptr o3d, si
  495.                  mov word ptr o3d+2, ds
  496.                  mov word ptr fyz, di
  497.                  mov word ptr fyz+2, es
  498.  
  499.     dalsi2:      lds si, ds:[si]
  500.                  and si, 0fh
  501.     dalsi3:      test ds:typ_ob_bodu([si]).typ, _pozadi
  502.                  jnz nerusit         { uæ neni æádnÿ volnÿ bod }
  503.                  test ds:typ_ob_bodu([si]).typ, _mazat
  504.                  jz dalsi2
  505.  
  506.                  mov word ptr rus_bod, si
  507.                  mov word ptr rus_bod+2, ds
  508.  
  509.                  lds si, ds:[si]
  510.                  and si, 0fh
  511.                  mov word ptr tmp, si
  512.                  mov word ptr tmp+2, ds
  513.  
  514.                  pop ds
  515.                  push cx
  516.  
  517.     end;         dispose(rus_bod);
  518.     asm          pop cx
  519.                  push ds
  520.  
  521.                  mov si, word ptr tmp
  522.                  mov ds, word ptr tmp+2
  523.                  jmp dalsi3
  524.  
  525.  
  526.     nerusit:     mov di, word ptr fyz
  527.                  mov es, word ptr fyz+2
  528.                  mov si, word ptr o3d
  529.                  mov ds, word ptr o3d+2
  530.  
  531.     zvetsit:     add si, 6
  532.                  add di, 2
  533.                  loop dalsi1
  534.  
  535.                  pop ds
  536.   end;
  537. *)end;
  538.  
  539. procedure typ_obrazovka_3d.skoncuj;
  540. { procedura je v po⌐ádku                                       }
  541. var pomvel : word;
  542. begin
  543.   pomvel := velikost;
  544.   zrus_pozadi;
  545.   freemem(__obraz, pomvel*pamet_bod_3d)
  546. end;
  547.  
  548. procedure typ_obrazovka_3d.zacni;
  549. { procedura je v po⌐ádku                                       }
  550. begin
  551.   posunx := _posunx;
  552.   posuny := _posuny;
  553.   levy   := _levy  ;
  554.   pravy  := _pravy ;
  555.   horni  := _horni ;
  556.   dolni  := _dolni ;
  557.  
  558.   sirka := pravy-levy+1;
  559.   velikost := sirka * (dolni-horni+1);
  560.  
  561.   getmem(__obraz, velikost*pamet_bod_3d);
  562.   rectangle(posunx+levy, posuny+horni, posunx+pravy, posuny+dolni);
  563.   vytvor_pozadi;
  564. {  cti_pozadi;}
  565. end;
  566.  
  567. procedure vypis(bod : typ_bod_3d);
  568. var bodvyhl, bodpred : typ_bod_3d;
  569.     pi : integer;
  570.     ven : text;
  571. begin
  572.   assign(ven,'con');
  573.   rewrite(ven);
  574.  
  575.   asm
  576.     mov ax, word ptr bod{normalisace adresy }
  577.     shr ax, 4
  578.     add word ptr bod+2, ax
  579.     and word ptr bod, $f
  580.   end;
  581.  
  582.   bodvyhl := bod;
  583.   repeat
  584.     writeln(ven, bodvyhl^. _h:4, ':',
  585.                  bodvyhl^. _l and $f, ' ',
  586.                  bodvyhl^. z : 4,
  587.                  bodvyhl^. obsah : 6,
  588.                  bodvyhl^. typ and $f0 : 5);
  589.     longint(bodvyhl) := longint(bodvyhl^.point) and $ffff000f;
  590.   until bod = bodvyhl;
  591.   writeln(ven);
  592.   close(ven);
  593. end;
  594.  
  595.  
  596. procedure typ_obrazovka_3d.zobraz_bod_xy(x, y : typ_souradnic; bod : typ_bod_3d);
  597. var bodvyhl, bodpred : typ_bod_3d;
  598.     pi : integer;
  599. begin
  600.   if (bod^.typ and _pouzit) = 0 then
  601.     if x >= levy then if x <= pravy then if y >= horni then if y <= dolni then
  602.       begin
  603.         asm
  604.           mov ax, word ptr bod{normalisace adresy }
  605.           shr ax, 4
  606.           add word ptr bod+2, ax
  607.           and word ptr bod, $f
  608.         end;
  609.         pi := (x-levy)+(y-horni)*(sirka);
  610.         bodvyhl := @__obraz^[pi].point;
  611.         repeat
  612.           bodpred := bodvyhl;
  613.           longint(bodvyhl) := longint(bodvyhl^.point) and $ffff000f;
  614.         until bod^.z > bodvyhl^.z;
  615. {        vypis(@__obraz^[pi].point);}
  616.         bod^.point := typ_bod_3d((longint(bod^.point) and $fff0) or longint(bodvyhl));
  617.         bod^.typ := bod^.typ or _pouzit;
  618.         bodpred^.point := typ_bod_3d((longint(bodpred^.point) and $fff0) or longint(bod));
  619.         if (bodpred^.typ and _pozadi) <> 0 then { zobrazuje se na fyzickou }
  620.           putpixel(x+posunx, y+posuny, bod^.obsah);
  621. {        vypis(@__obraz^[pi].point);}
  622.       end;
  623. end;
  624.  
  625. procedure typ_obrazovka_3d.zhasni_bod_xy    (x,y : typ_souradnic; bod : typ_bod_3d);
  626. label neni_co;
  627. var bodvyhl, bodpred : typ_bod_3d;
  628.  
  629. begin
  630.   if (bod^.typ and _pouzit) <> 0 then
  631.     if x >= levy then if x <= pravy then if y >= horni then if y <= dolni then
  632.       begin
  633.         asm
  634.           mov ax, word ptr bod{normalisace adresy }
  635.           shr ax, 4
  636.           add word ptr bod+2, ax
  637.           and word ptr bod, $f
  638.         end;
  639.         bodvyhl := @__obraz^[(x-levy)+(y-horni)*(sirka)].point;
  640.         repeat
  641.           bodpred := bodvyhl;
  642.           longint(bodvyhl) := longint(bodvyhl^.point) and $ffff000f;
  643.           if (bodvyhl^.typ and _pozadi) <> 0 then goto neni_co;
  644.         until bodvyhl = bod;
  645.  
  646.         bod^.typ := bod^.typ and not _pouzit;
  647.         bodpred^.point := typ_bod_3d((longint(bodpred^.point) and $fff0) or (longint(bod^.point) and $ffff000f));
  648.         if (bodpred^.typ and _pozadi) <> 0 then
  649.           putpixel(x+posunx, y+posuny, typ_bod_3d(longint(bodpred^.point) and $ffff000f)^.obsah);
  650.       end;
  651. neni_co:;
  652. end;
  653.  
  654. procedure typ_obrazovka_3d.obnov_bod_xy    (x, y : typ_souradnic);
  655. label dalsi, konec;
  656. var adrobj : integer;
  657. begin
  658.   if x >= levy then if x <= pravy then if y >= horni then if y <= dolni then
  659.     putpixel(x, y, typ_bod_3d(ptr(__obraz^[x+y*(sirka)]._h,
  660.                           $0f and __obraz^[x+y*(sirka)]._l))^.obsah);
  661.  
  662. end;
  663.  
  664. procedure typ_obrazovka_3d.presun_bod_xy(x1, y1, x2, y2 : typ_souradnic; bod : typ_bod_3d );
  665. label zobrazit;
  666. var bodvyhl, bodpred : typ_bod_3d;
  667.  
  668. begin
  669.         asm
  670.           mov ax, word ptr bod{normalisace adresy }
  671.           shr ax, 4
  672.           add word ptr bod+2, ax
  673.           and word ptr bod, $f
  674.         end;
  675.  
  676.   if (bod^.typ and _pouzit) <> 0 then
  677.     if x1 >= levy then if x1 <= pravy then if y1 >= horni then if y1 <= dolni then
  678.       begin
  679.         bodvyhl := @__obraz^[(x1-levy)+(y1-horni)*(sirka)].point;
  680.         repeat
  681.           bodpred := bodvyhl;
  682.           longint(bodvyhl) := longint(bodvyhl^.point) and $ffff000f;
  683.           if (bodvyhl^.typ and _pozadi) <> 0 then goto zobrazit;
  684.         until bodvyhl = bod;
  685.  
  686.         bod^.typ := bod^.typ or not _pouzit;
  687.         bodpred^.point := typ_bod_3d((longint(bodpred^.point) and $fff0) or (longint(bod^.point) and $ffff000f));
  688.         if (bodpred^.typ and _pozadi) <> 0 then
  689.           putpixel(x1+posunx, y1+posuny, typ_bod_3d(longint(bodpred^.point) and $ffff000f)^.obsah);
  690.       end;
  691.  
  692. zobrazit :
  693.  
  694.     if x2 >= levy then if x2 <= pravy then if y2 >= horni then if y2 <= dolni then
  695.       begin
  696.         bodvyhl := @__obraz^[(x2-levy)+(y2-horni)*(sirka)].point;
  697.         repeat
  698.           bodpred := bodvyhl;
  699.           longint(bodvyhl) := longint(bodvyhl^.point) and $ffff000f;
  700.         until bod^.z > bodvyhl^.z;
  701.         bod^.point := typ_bod_3d((longint(bod^.point) and $fff0) or longint(bodvyhl));
  702.         bodpred^.point := typ_bod_3d((longint(bodpred^.point) and $fff0) or longint(bod));
  703.         if (bodpred^.typ and _pozadi) <> 0 then { zobrazuje se na fyzickou }
  704.           putpixel(x2+posunx, y2+posuny, bod^.obsah);
  705.       end;
  706. end;
  707.  
  708. end.
  709.  
  710.