Contributor: JONAS MAEBE
PROGRAM Frogger;
NOTE !!! Code needed to create sprites for this game are contained at
the end !! Follow the instructions.
{Frogger version 0.92, Copyright 1995-1996 Jonas Maebe (AKA Gamefreak)}
{Send comments to Jonas Maebe, 2:292/624.7 (Fidonet), in the }
{Fidonet International Pascal conference or email at JMaebe@dma.be }
{Hereby I give this code to the freeware circuit, which implies that }
{everyone can use this code in ANY program, as long as I receive the }
{applicable credit(s). }
{I am in NO way responsible for any kind of damage directly or }
{indirectly caused by this program (just to be safe :) }
{$g+,a+,r-,s-,i-,x-,n-,e-,f-,d-,l-,v-,b-}
{$m 8000, 140000 ,140000}
{NEVER enable range checking ($R+), because it'll crash the computer.}
{I don't know why, but I guess it has something to do with the Move386}
{procedure.}
{$ifdef ver70}
{$q-}
{$endif}
{*define p386} {replace the '*' by a '$' to speed up the code
 somewhat if you have a 386 instead of a 486 or up.
 Probably not noticable, but who cares? :)}
{$define slow} {replace the '*' by a '$' to slow everything down,
 necessary when playing on a VLB/PCI videocard}
{$define move32bit} {disable this one if you have a ISA video card
 or a 386SX, I've heard 16 bit moves are faster on
 those systems}
{$define v_retrace} {disable this one if the animation is jerky, it will
 speed up the screen redraw and thus improve the
 animation. Drawback: some fuzz... Also, if the
 game runs smooth with it, it probably won't without it}
{*define invincible} {Have a wiiiiiild guess :)}
{*define idspispopd} {Remeber Doom? Of course you do!
 Ever cheated? Of course you did! :)
 BTW: pretty useless if not combined with the above one}
{$define bothsides} {If this one is not defined, the clipped sprite aren't
 continued at the other side of the screen}
TYPE position = RECORD
 x,y:WORD
 END;
 big_tile = ARRAY[0..15,0..15] of BYTE;
 small_tile = ARRAY[0..9,0..9] of BYTE;
 Virscreen = Array [1..64000] of byte;
 VirPtr = ^Virscreen;
 treetype = (left,middle,right);
 TturtleDepth = (up, med, down, under);
CONST retrace = 3; treemid1 = 4; treemid2 = 2; noftree1 = 2; noftree2 = 3;
 car1y = 163*320; {since the y-coords of the cars and turtles}
 car2y = 147*320; {don't change, immeditely multiply them by}
 car3y = 131*320; {320}
 car4y = 115*320;
 SpriteXsize = 10; SpriteYsize = 10;
{With these two constants you can change the spritesize used by the
 drawsprite procedures. WARNING: SpriteXsize HAS to be a multiple of two!!!}
 rightclip = 273 - SpriteXsize; leftclip = 1;
{And these two can be modified to enlarge or reduce the playing field.
 You'll also need them when you plan on using the drawsprite procedures in
 your own programs.}
 turtley: ARRAY[1..3] of WORD = ((16*5+3)*320, (16*3+3)*320,(16+3)*320);
 waterinc: ARRAY[1..5] of INTEGER = (1,-1,2,1,-1);
 frogtop: ARRAY[1..6] of BOOLEAN = (false,false,false,false,false,false);
 keyb: word = 8; stop: boolean = false; lives: byte = 4;
 car1pos: ARRAY[0..2,0..2] of INTEGER =
 ((259,236,213),(170,147,123),(78,55,32));
 car2pos: ARRAY[0..2,0..2] of INTEGER =
 ((259,236,213),(170,147,123),(78,55,32));
 car3pos: ARRAY[0..2] of WORD = (262,173,84);
 car4pos: ARRAY[0..2,0..2] of INTEGER =
 ((259,236,213),(170,147,123),(78,55,32));
 turtlepos: ARRAY[1..3,0..2,0..2] of INTEGER =
 (((257,244,231),(167,154,141),(73,60,47)),
 ((231,243,255),(141,153,165),(47,59,71)),
 ((231,243,255),(141,153,165),(47,59,71)));
 tree1pos: ARRAY[1..2,1..(treemid1+2)] of WORD =
 ((12,22,32,42,52,62),(150,160,170,180,190,200));
 tree2pos: ARRAY[1..3,1..(treemid2+2)] of WORD =
 ((56,46,36,26),(147,137,127,117),(238,228,218,208));
 TurtleDepth: TTurtleDepth = up; TurtleDepthCount: WORD = 0;
 cyclecount: BYTE = retrace; fpstime1 : LONGINT = 0;
 fpstime2: LONGINT = 0; frames: LONGINT = 0;
 CTurtleDepth: ARRAY[1..7] of TturtleDepth = (up, med, down, under,
 down, med, up);
VAR frogpos: position;
 pall: ARRAY[0..255,0..2] OF BYTE;
 grass, water: big_tile;
 ch: CHAR;
 Virscr, background : VirPtr;
 Vaddr, backaddr : word;
 savedi, savecx: WORD;
 frog, car1, car2, car3, car4, turtle, turtle2{, skull}: small_tile;
 tree: ARRAY[treetype] of small_tile;
 {turtle dive vars}
 TurtleDo1Le, TurtleDo2Le: Small_tile;
 Time: WORD;
{now some arrays which hold the offsets of the sprites}
CONST treeofs: ARRAY[0..2] of WORD = (ofs(tree[left]),ofs(tree[middle]),
 ofs(tree[right]));
 TurtleOfs: ARRAY[1..3] OF WORD = (ofs(turtle), ofs(TurtleDo1Le),
 ofs(TurtleDo2Le));
FUNCTION keypressed: BOOLEAN;
INLINE($b4/01ドル/$cd/16ドル/$b0/00ドル/74ドル/02ドル/$fe/$c0);
 {mov ah,1;int 16ドル;mov al,0;jnz $+2;inc al}
FUNCTION readkey: CHAR;
INLINE($b4/10ドル/$cd/16ドル/88ドル/$e0);
 {mov ah,10ドル;int 16ドル;mov al, ah}
{Sound and nosound are asm-translations of the Pascal code found in PCGPE10}
procedure Sound(frequency : word);
inline
($ba/12ドル/00ドル/$b8/$dd/34ドル/ 59ドル/ $f7/$f1/ 89ドル/$c3/ $b0/$b6/
{mov dx, 12ドル;mov ax, 34ドルdd;pop cx; div cx; mov bx, ax;mov al, $b6}
 $e6/43ドル/ 88ドル/$d8/ $e6/42ドル/ 88ドル/$f8/ $e6/42ドル/ $e4/61ドル/
{out 43,ドル al;mov al,bl;out 42,ドルal;mov al, bh;out 42,ドル al;in al, 61ドル}
 0ドルc/03ドル/ $e6/61ドル);
{or al, 3;out 61,ドル al}
procedure NoSound;
INLINE($E4/61ドル/ 24ドル/$FC/ $E6/61ドル);
 {in al, 61ドル; and al, $fc; out 61,ドル al}
PROCEDURE lawn(y:word); {draw the lawn :)}
VAR number,row,column:BYTE;
 BEGIN
 FOR number := 0 to 16 DO
 FOR row := 0 to 15 DO
 FOR column := 0 to 15 DO
 MEM[vaddr: (y+row) SHL 8 + (y+row) shl 6+column+number *16+1] := grass[row,column]
 END;
PROCEDURE Drawopaque; {draw a sprite without preserving the background and}
ASSEMBLER; {with clipping the right side}
ASM
 {di holds x-coord of car}
 mov ah, SpriteYsize {repeat for 10 lines}
 cmp di, rightclip {needs clipping?}
 jg @clipright {if pos <= clip-coord, don't clip} cmp di, leftclip {needs clipping?} jl @clipleft {if pos>= clip-coord, don't clip}
 add di, dx {di = y * 320 + x}
 {ds:si already points to the car's sprite}
 @nocliploop:
 mov cx, (SpriteXsize / 2)
 rep movsw {move car data to virtual screen}
 add di, 320 - SpriteXsize
 dec ah
 jnz @nocliploop
 jmp @end
 @clipright:
 mov cx, SpriteXsize + rightclip {cx := 10 + clip const}
 sub cx, di {cx := 10 - x-coord + clip const = 10 - clippixels}
 mov savecx, cx {saveguard cx already}
 add di, dx
 @cliploopright:
 mov savedi, di
 rep movsb {move part of sprite to screen}
 mov cx, savecx {restore cx}
{$ifdef bothsides}
 sub di, (rightclip - leftclip + spritexsize)
 {di points now to (leftclip, current_y)}
 sub cx, SpriteXsize
 neg cx {cx = number of remaining pixels}
 rep movsb {move remaining pixels to the beginning of line}
{$else bothsides}
 sub cx, SpriteXsize
 neg cx {cx = number of remaining pixels}
 add si, cx
{$endif bothsides}
 mov di, savedi {restore original di}
 mov cx, savecx {and cx}
 add di, 320 {di now points to (x, currline+1)}
 dec ah {decrease line counter,}
 jnz @cliploopright {if not 0, draw next line}
 jmp @end
 @clipleft:
 mov cx, leftclip
 sub cx, di {cx := leftclip - x-coord}
 add di, dx
 mov savecx, cx {saveguard cx already}
 @cliploopleft:
 mov savedi, di {saveguard di}
{now, first the part on the right side of the screen is drawn, because}
{that's where the first pixels have to be put}
{$ifdef bothsides}
 add di, rightclip + (SpriteXsize - 1) - (leftclip-1)
 {di now points to 'end-of-line' minus x-coord}
 rep movsb {move part of sprite to screen}
 mov cx, savecx {restore cx}
 sub di, rightclip + (SpriteXsize - 1) - (leftclip-1)
 {di points to the beginning of the line}
{$else bothsides}
 add di, cx
 add si, cx
{$endif bothsides}
 sub cx, SpriteXsize
 neg cx {cx = number of pixels left of the car}
 rep movsb {move remaining pixels to the beginning of the line}
 mov di, savedi {restore original di}
 mov cx, savecx {and cx}
 add di, 320 {increase di by 320 so it points to the next line}
 dec ah {decrease line counter,}
 jnz @cliploopleft {if not 0, draw next line}
 @end:
END;
PROCEDURE DrawTransparent; {draw a sprite keeping the uncovered back-}
ASSEMBLER; {ground, with clipping on the right side}
ASM
 {di holds x-coord of tree}
 cmp di, rightclip {needs clipping?}
 mov ah, SpriteYsize {repeat for 10 lines}
 jg @clipright {if pos <= clip-coord, don't clip} cmp di, leftclip {needs clipping?} jl @clipleft {if pos>= clip-coord, don't clip}
 add di, dx {di := y * 320 + x}
 {ds:si already points to the tree's sprite}
 @noclipoutloop:
 mov cl, SpriteXsize+1 {move tree data to the virtual screen}
 @nocliploop:
 dec cl
 jz @noclipdone
{$ifdef p386}
 lodsb
{$else}
 mov al, [si]
 inc si
{$endif}
 inc di
 or al, al
 jz @nocliploop
 mov es:[di-1], al
 jmp @nocliploop
 @noclipdone:
 add di, 320 - SpriteXsize
 dec ah
 jnz @noclipoutloop
 jmp @end
 @clipright:
 mov cx, SpriteXsize + rightclip {cx := 10 + clip const}
 sub cx, di {cx = 10 - x-coord + clip const = 10 - clippixels}
 mov savecx, cx {saveguard cx already}
 add di, dx
 @outercliploopright:
 mov savedi, di
{ rep movsb {move line of sprite to screen}
 {the following part is the same as rep movsb,}
 @cliploopright: {except that is soes not overwrite the background}
 dec cx {where it's not covered by a sprite}
 js @outcliploopright
 lodsb
 inc di
 or al, al
 jz @cliploopright
 mov es:[di-1], al
 jmp @cliploopright
 @outcliploopright:
{$ifdef bothsides}
 mov cx, savecx {restore cx}
 sub di, rightclip - leftclip + SpriteXsize + 1
 {di points now to (leftclip, current_y)}
 sub cx, (SpriteXsize + 1)
 neg cx {cx = x-coord - clipconst}
{ rep movsb {move remaining pixels to the beginning of the line}
 @cliploop2right:
 dec cx
 jz @outcliploop2right
 inc di
{$ifdef p386}
 lodsb
{$else p386}
 mov al, [si]
 inc si
{$endif p386}
 or al, al
 jz @cliploop2right
 mov es:[di], al
 jmp @cliploop2right
 @outcliploop2right:
{$else bothsides}
 mov cx, savecx {restore cx}
 sub cx, SpriteXsize
 neg cx {cx = x-coord - clipconst}
 add si, cx
{$endif bothsides}
 mov cx, savecx {restore cx}
 mov di, savedi {restore di}
 add di, 320 {di now points to (x, currline+1)}
 dec ah {decrease line counter,}
 jnz @outercliploopright{if not 0, draw next line}
 jmp @end
 @clipleft:
 mov cx, leftclip
 sub cx, di {cx := leftclip - x-coord}
 mov savecx, cx {saveguard cx already}
 add di, dx {di := y * 320 + x}
 @outercliploopleft:
 mov savedi, di {saveguard di}
{$ifdef bothsides}
 add di, (rightclip - leftclip) + SpriteXsize
 {di now points to 'end-of-line' minus x-coord}
{ rep movsb {move part of sprite to screen}
 @cliploopleft:
 dec cx
 js @outcliploopleft
{$ifdef p386}
 lodsb
{$else}
 mov al, [si]
 inc si
{$endif}
 inc di
 or al, al
 jz @cliploopleft
 mov es:[di-1], al
 jmp @cliploopleft
 @outcliploopleft:
 mov cx, savecx {restore cx}
 sub di, (rightclip - leftclip) + SpriteXsize + 1
 {di points to the beginning of the}
 {line}
{$else bothsides}
 add di, cx
 add si, cx
 dec di
{$endif bothsides}
 sub cx, (SpriteXsize + 1)
 neg cx {cx = number of pixels left of the car}
 {move remaining pixels to the beginning of the line}
 @cliploop2left:
 dec cx
 jz @outcliploop2left
 inc di
{$ifdef p386}
 lodsb
{$else}
 mov al, [si]
 inc si
{$endif}
 or al, al
 jz @cliploop2left
 mov es:[di], al
 jmp @cliploop2left
 @outcliploop2left:
 mov di, savedi {restore original di}
 mov cx, savecx {and cx}
 add di, 320 {increase di by 320 to let it point to the next line}
 dec ah {decrease line counter}
 jnz @outercliploopleft {if not 0, draw next line}
 @end:
END;
PROCEDURE river; {draws the river}
VAR number,row,column,riversize:BYTE;
BEGIN
 FOR riversize := 0 to 1 DO
 FOR number := 0 to 16 DO
 FOR row := 0 to 15 DO
 FOR column := 0 to 15 DO
 MEM[vaddr: (riversize*48+row+16) SHL 8 + (riversize*48+row+16) shl 6+column+number *16+1] :=
 water[row,column];
 FOR number := 0 to 16 DO
 FOR row := 0 to 15 DO
 FOR column := 0 to 15 DO
 MEM[vaddr: (row+48) SHL 8 + (row+48) shl 6+column+number *16+1] :=
 water[row,column];
 FOR riversize := 0 to 1 DO
 FOR number := 0 to 16 DO
 FOR row := 0 to 15 DO
 FOR column := 0 to 15 DO
 MEM[vaddr: (riversize*48+row+32) SHL 8 + (riversize*48+row+32) shl 6+column+number *16+1] :=
 water[15-row,15-column]
END;
FUNCTION drawfrog: boolean; {Draws the frog and returns true if a}
ASSEMBLER; {collission occured}
ASM
 {ds:si points to the frog picture}
 {di := x}
 xor al, al {al := 0}
 {ah := y}
 cmp ah, 7 * 16 {= "hight" of road}
 jb @noroad
 xor bx, bx {bx := 0}
 cmp ah, 178
 ja @noroad {if it is, set the and mask (bh) to 1, otherwise}
 inc bh {leave it 0}
 @noroad:
 add di, ax
 shr ax, 2
 mov cx, $a0b {10 rows, 10 columns, but cl is decreased before the}
 {rest}
 add di, ax {di := y * 320 + x}
 @loop: {of the code is executed}
 dec cl {decrease culomn counter}
 jz @outloop {cl = 0? -> goto the outer loop}
 inc di {di points to the nextpixel on screen}
 {$ifdef p386}
 lodsb {load the next frogpixel in al}
 {$else}
 mov al, [si] {load the next frogpixel in al}
 inc si
 {$endif}
 or al, al {test if it is zero}
 jz @loop {if it is, don't draw and go to the next pixel}
 or bl, bl {otherwise, check whether a collision has already}
 jnz @nocolis {occured; if so, do not check for it again}
 cmp byte [es:di], 0 {check whether the background is zero (=black}
 jz @nocolis {if it is, no collission}
 inc bl {otherwise, set the and mask to 1}
 @nocolis:
 mov es:[di],al {put the pixel in place}
 jmp @loop {and jump to the next one}
 @outloop:
 mov cl, 11 {again 10 columns to put}
 add di, 310 {di points to the next line (10 pixels + 310)}
 dec ch {decrease the row counter}
 jnz @loop {if not = 0 -> goto loop}
 mov al, bl {al (function result) = 1 if a collission occured}
 and al, bh {and it by bh; bh = 1 if the frog is on the road}
 {or IN the water, otherwise it's zero}
END;
PROCEDURE Topwater(where: word); {draws the little 'lakes' (can't find a}
VAR count, row, column: BYTE; {better word for them :) at the top}
BEGIN
 FOR count := 1 TO 6 DO
 FOR row := 0 to 14 DO
 FOR column := 0 to 15 DO
 mem[where: 288+row * 256 + row * 64 + count*46 + column] := random(10)+11
END;
PROCEDURE move386(source, dest: word); {VERY FAST move routine!!!}
INLINE( 8ドルc/$da/ 07ドル/ 1ドルF /31ドル/$f6/ 31ドル/$ff/ $B9/
 {mov dx,ds;pop es;pop ds;xor si,si;xor di,di;mov cx,}
{$ifdef move32bit}
80ドル/3ドルe/$f3/66ドル/{$else}00ドル/7ドルd/$f3/{$endif}$a5/8ドルe/ $da);
{16000 32000 rep movsw/d;mov ds,dx}
PROCEDURE init;
VAR f: file;
 count, row, column: BYTE;
LABEL grassloop, outgrassloop;
Procedure Getmem0(Var p: VirPtr);
Type Ttemp = Array[1..16] of byte;
Var temp: ^Ttemp;
 b: byte;
BEGIN
 new(p);
 If ofs(p^)  0 Then
 Begin
 b := 16 - lo(ofs(p^));
 Dispose(p);
 Getmem(temp, b);
 new(p);
 dispose(temp)
 End
End;
BEGIN
 assign(f,'frogger.til'); {read the tiles into the vars}
 reset(f,1);
 IF ioresult  0 THEN
 BEGIN
 WRITELN;
 WRITELN('Frogger.til not found. Run TileGen first.');
 WRITELN;
 HALT(2)
 END;
 BLOCKREAD(f,water,sizeof(water)); {read the sprites into the}
 BLOCKREAD(f,grass,sizeof(grass)); {variables}
 BLOCKREAD(f,frog,sizeof(frog));
 BLOCKREAD(f,car1,sizeof(car1));
 BLOCKREAD(f,car2,sizeof(car2));
 BLOCKREAD(f,car3,sizeof(car3));
 BLOCKREAD(f,car4,sizeof(car4));
 BLOCKREAD(f,turtle,sizeof(turtle));
 BLOCKREAD(f,tree[left],sizeof(tree[left]));
 BLOCKREAD(f,tree[middle],sizeof(tree[middle]));
 BLOCKREAD(f,tree[right],sizeof(tree[right]));
 BLOCKREAD(f,pall,sizeof(pall));
 BLOCKREAD(f,turtle2,sizeof(turtle2));
 BLOCKREAD(f,TurtleDo1Le,sizeof(TurtleDo1Le));
 BLOCKREAD(f,TurtleDo2Le,sizeof(TurtleDo2Le));
 close(f);
 ASM
 mov ax,13ドル
 int 10ドル {switch to graphics mode}
 mov ah, 9
 int 16ドル {get keyboard functionalities}
 and al, 1000b {get typematic delay/rate available?}
 jz @no_get_rate
 mov ax, 306ドル {if so, get it!}
 int 16ドル
 mov keyb, bx {and store it}
 @no_get_rate:
 mov ax, 305ドル {set the new rate/delay for the game}
 xor bx, bx
 int 16ドル
 cld {clear direction flag -> all movsb/w/d are forward}
 END;
{initialize virtual screens}
 getmem0(virscr); {to make sure the offset of both virtual}
 getmem0(background); {screens is 0}
 vaddr := seg(virscr^);
 backaddr := seg(background^);
 ASM {clear screen}
 mov es, vaddr
 xor di, di
 db 66ドル; xor ax, ax
 mov cx, 16000
 db 66ドル; rep stosw
 {set the pallette}
 mov dx, 3ドルc8
 out dx, al
 mov si, offset pall
 inc dx
 mov cx, 256*3
 rep outsb
 END;
 river;
 lawn(0);
 Topwater(vaddr);
 lawn(6*16);
 lawn(192-16);
 randomize;
 ASM
 mov es, vaddr {draw grass hanging over in}
 {the water and on the road}
 mov ax, 0302ドル {ah = counter, al = value to be}
 {added to random color}
 mov di, 16*320 {just below the little 'lakes' (still}
 {haven't found the right word :)}
 mov si, 6*16*320-320+273 {eol above the verge (='berm' in}
 {Dutch)}
 outgrassloop:
 mov cx, 273 {play field is 273 pixels wide}
 grassloop:
 push ax {save ax and cx since they're destroyed}
 END;
 count := random(9);
 ASM
 mov dl, count {get the random value in dl}
 pop ax
 test dl, 1 {if the random value is even, don't}
 jz @nodraw {draw a pixel}
 mov dh, 10 {and get the highest color's number}
 {that's green in dh}
 cmp es:[di-320], dh {compare the pixel on the previous}
 ja @nodraw {line to green. If it's greater,}
 {don't draw}
 add dl, al {add 2 to the random value}
 mov es:[di], dl {put the pixel on four places,}
 mov es:[si], dl {in the game you can see where :)}
 mov es:[di+6*16*320], dl
 mov es:[si+5*16*320], dl
 @nodraw:
 inc di {adjust the screen offsets}
 dec si
 dec cx
 jnz grassloop
 add di, 47
 sub si, 47
 dec ah {make the grass grow max 3 pixels}
 jnz outgrassloop
{draw green border around the playfield}
 xor di, di
 mov al, 10
 mov cl,192
 @loop:
 mov es:[di], al
 mov es:[di+273],al
 add di, 320
 dec cl
 jnz @loop
 END;
 move386(vaddr,backaddr); {save the current screen as the background}
 WITH frogpos DO {set initial frogpos}
 BEGIN
 x:= (leftclip+rightclip) div 2;
 y:=179
 END;
 ASM
 xor ax, ax {get the begin time, used to decide when the}
 mov es, ax {turtles dive}
 mov di, 46ドルc
 db 66ドル; mov ax, es:[di]
 db 66ドル; mov word[fpstime1], ax
 @loop:
 db 66ドル; cmp [es:di], ax
 je @loop
 add ax, 18 {and add 18 (= 1 sec) to that time}
 mov time, ax
 END
END;
label nocol;
BEGIN
 init;
 REPEAT
 ASM
 db 66ドル; inc word[frames]
 dec cyclecount {decrease cyclecount}
 jnz @nocycle {if it isn't zero, don't cycle}
 std {the pallette (water); set direction}
 mov ax, ds {flag to move backwards}
 mov es, ax {es := ds}
 mov cyclecount, retrace {reset cyclecout to 2}
 mov si, offset pall + 54 {ds:si points to pall[20,0]}
 mov bx, [si] {save the red and green values in bx}
 mov dl, [si+2] {save the blue value in dl}
 mov si, offset pall+19*3+1{ds:si points to pall[19,1]}
 mov di, offset pall+20*3+1{es:di points to pall[20,1]}
 mov cx, 6
 db 66ドル; rep movsw
 movsw
 movsb {move the pallette values}
 add si,2 {adjust the source index, I don't}
 {really understand why, but it's}
 {nessecary :)}
 cld {clear the direction flag}
 mov [si], bx {restore the red, green}
 mov [si+2], dl {and blue values}
 {restore it}
 @nocycle:
 xor ax, ax
 mov es, ax
 mov di, 46ドルc
 mov ax, es:[di] {get the current time}
 cmp time, ax {compare it to the previous read time}
 ja @noturtledive {not equal -> don't change depth of}
 add ax, 18 {turtles}
 mov time, ax {save new time}
 mov bx, TurtleDepthCount
 inc bx
 cmp bx, 7
 jb @TurtleDepthCountOk
 xor bx, bx
 @TurtleDepthCountOk:
 mov TurtleDepthCount, bx
 mov al, [bx+offset CTurtleDepth]
 {= mov al, CTurtleDepth[TurtleDepthCount]}
 mov TurtleDepth, al {set the new TurtleDepth}
 @noturtledive:
 mov es, vaddr {es has been changed, so restore it}
{draw cars}
 mov bx, offset car1pos {ds:bx points to pos of car1pos[0,0]}
 mov al, 9 {repeat for 9 cars}
 mov dx, car1y {y coords of car1 in dh}
 @loop:
 {$ifdef slow}
 test byte[turtlepos],1 {If slow, only increase the car's}
 jz @noinc1 {position once per 2 loops}
 inc word [bx] {increase the position of the car}
 @noinc1:
 {$else}
 inc word [bx] {increase the position of the car}
 {$endif}
 mov di, [bx] {x-coord in di}
 cmp di, rightclip+spritexsize{check whether it's off screen}
 jl @noreset {if not, do not reset it's coords}
 mov di,leftclip
 mov word [bx], di {otherwise set x-coord back to 1}
 @noreset: {parameter are passed in regs}
 {next car}
 mov si, offset car1 {select which car should be drawn}
 call drawopaque {and call the drawcar procedure}
 add bx, 2 {let bx point to the x-coord of the}
 dec al {decrease the car counter}
 jnz @loop {if it's not zero, loop for the next}
 mov bx, offset car2pos {car; repeat the same for car2,}
 mov al, 9 {but decrease the position instead}
 mov dx, car2y {of increasing it}
 @loop1:
 {$ifdef slow}
 dec word [bx]
 {$else}
 sub word [bx], 2
 {$endif}
 mov di, [bx]
 cmp di, leftclip - SpriteXsize
 jg @noreset1
 mov di, rightclip
 mov [bx], di
 @noreset1:
 mov si, offset car2
 call drawopaque {and call drawopaqueleft since the car}
 add bx, 2
 dec al {moves from the righ to the left}
 jnz @loop1
 mov bx, offset car3pos {and now for car3 (race cars), there}
 mov al, 3 {are only 3 of them, but the rest}
 mov dx, car3y
 @loop2: {is about the same as for car 1}
 {$ifdef slow}
 add word [bx], 2 {increase the position of the car}
 {$else}
 add word [bx], 3 {increase the position of the car}
 {$endif}
 mov di, [bx]
 cmp di, rightclip+SpriteXsize
 jl @noreset2
 mov di,leftclip
 mov word [bx], di
 @noreset2:
 mov si, offset car3
 call drawopaque
 add bx, 2
 dec al
 jnz @loop2
 mov bx, offset car4pos {car4, same as car2 but decrease}
 mov al, 9 {only by one}
 mov dx, car4y
 @loop3:
 {$ifdef slow}
 test byte[turtlepos],1
 jnz @noinc2
 dec word [bx] {decrease the position of the car}
 @noinc2:
 {$else}
 dec word [bx] {decrease the position of the car}
 {$endif}
 mov di, [bx]
 cmp di, leftclip - SpriteXsize
 jg @noreset3
 mov di, rightclip
 mov [bx], di
 @noreset3:
 mov si, offset car4
 call drawopaque
 add bx, 2
 dec al
 jnz @loop3
{Draw trees}
 mov bx, offset tree1pos
 mov dx, (16*4+3)*320
 mov bp, noftree1
 @treerow1:
 mov si, word[offset treeofs] {si = offset of tree[left]}
 inc word[bx]
 mov di, [bx]
 cmp di, rightclip+SpriteXsize
 jl @treeok1
 mov di, leftclip
 mov word[bx], di
 @treeok1:
 call drawtransparent
 xor ah, ah
 mov al, treemid1 {ax := number of middle parts}
 @drawmiddle:
 add bx, 2
 mov si, word[offset treeofs + 2] {si = offset of tree[middle]}
 inc word[bx]
 mov di, [bx]
 cmp di, rightclip + SpriteXsize
 jl @treeok2
 mov di, leftclip
 mov word[bx], di
 @treeok2:
 call drawopaque
 dec ax {middle part counter, if not zero, draw another}
 jnz @drawmiddle {middle part}
 add bx, 2
 mov si, word[offset treeofs + 4] {si = ofs(tree[right])}
 inc word[bx]
 mov di, [bx]
 cmp di, rightclip+SpriteXsize
 jl @treeok3
 mov di, leftclip
 mov word[bx], di
 @treeok3:
 call drawopaque
 add bx, 2
 dec bp
 jnz @treerow1
{second row of trees}
 mov bx, offset tree2pos
 mov dx, (16*2+3)*320
 mov bp, noftree2
 @treerow2:
 mov si, word[offset treeofs+4]
 dec word[bx]
 mov di, [bx]
 cmp di, leftclip - SpriteXsize
 jg @tree2ok1
 mov di, rightclip
 mov word[bx], di
 @tree2ok1:
 call drawopaque
 xor ah, ah
 mov al, treemid2 {ax := number of middle parts}
 @drawmiddle2:
 add bx, 2
 mov si, word[offset treeofs + 2]
 dec word[bx]
 mov di, [bx]
 cmp di, leftclip - SpriteXsize
 jg @tree2ok2
 mov di,rightclip
 mov word[bx], di
 @tree2ok2:
 call drawopaque
 dec ax
 jnz @drawmiddle2
 add bx, 2
 mov si, word[offset treeofs]
 dec word[bx]
 mov di, [bx]
 cmp di, leftclip - SpriteXsize
 jg @tree2ok3
 mov di,rightclip
 mov word[bx], di
 @tree2ok3:
 call drawtransparent
 add bx, 2
 dec bp
 jnz @treerow2
{Draw lowest row of 'turtles' :)}
 mov bx, offset turtlepos
 mov dx, word[turtley]
{ push bp} {not necessary to preserve bp *IN THIS PROGRAM*!}
 {normally ALWAYS RESTORE IT OR YOU'LL GET IN BIG TROUBLE!}
 {Even better: don't use it :)}
 xor ah, ah
 mov al, TurtleDepth
 mov bp, ax
 cmp bp, 3
 je @nolowturtles
 add bp, bp
 add bp, offset TurtleOfs
 mov ah, 9
 @turtlesamerowloop:
 mov si, [ds:bp]
 dec word[bx]
 mov di, [bx]
 cmp di, leftclip - SpriteXsize
 jg @turtleposok
 mov di, rightclip
 mov [bx], di
 @turtleposok:
 push ax
 call drawtransparent
 add bx, 2
 pop ax
 dec ah
 jnz @turtlesamerowloop
 jmp @noadjust
 @nolowturtles:
 mov ah, 9
 @noturtlesamerowloop:
 dec word[bx]
 mov di, [bx]
 cmp di, leftclip - SpriteXsize
 jg @noturtleposok
 mov di, rightclip
 mov [bx], di
 @noturtleposok:
 add bx, 2
 dec ah
 jnz @noturtlesamerowloop
 @noadjust:
{draw two higher rows of turtles in one loop since they move in the same}
 mov bp, 2 {direction}
 @turtlenewrowloop:
 mov dx, [ds:offset turtley+bp]
 mov ah, 9
 @turtlesamerowloop2:
 mov si, offset turtle2
 @turtleslowpos:
 inc word[bx] {(*)}
 inc word[bx]
 mov di, [bx]
 cmp di, rightclip+SpriteXsize
 jl @turtleposok3
 mov di,leftclip
 mov [bx], di
 @turtleposok3:
 push ax
 call drawtransparent
 add bx, 2
 pop ax
 dec ah
 jnz @turtlesamerowloop2
 mov ax, 9090ドル {(*): self modifying code: replace one of the}
 mov word[cs:@turtleslowpos], ax {two inc's with nop's}
 add bp, 2
 cmp bp, 4 {if it's 4, only one row of turtles has been drawn}
 je @turtlenewrowloop
 mov ax, 07ドルff {and restore the original inc}
 mov word[cs:@turtleslowpos], ax
{ pop bp}
{draw frog}
 mov di, frogpos.x
 mov ah, byte [frogpos.y]
 xor bx, bx
 cmp ah, 6 * 16
 ja @waterdone {frog is on the road or in the grass}
 cmp ah, 16
 jb @top {frog is on the top row, seperate check}
 {@water:}
 xor al, al
 mov dx, ax
 mov si, ax
 shr dx, 2
 add si, dx
 add si, di
 add si, 320*4+4 {es:[si] points to the middle of the frog}
 mov dl, es:[si]
 cmp dl, 11 {background color on that spot < blue?} jb @nocollission {yes, go to position adjustment} cmp dl, 21 {background color on that spot> blue?}
 ja @nocollission {yes, go to position adjustment}
 add si, 3
 mov dl, es:[si] {another check for water, but 3 pixels to}
 cmp dl, 11 {the right}
 jb @nocollission
 cmp dl, 21
 ja @nocollission
 @topcol:
 mov bx, 101ドル {this way drawfrog will return 'true' as}
 jmp @waterdone {collission value}
{*} @top:
 xor al, al
 mov dx, ax
 mov si, ax
 shr dx, 2
 add si, dx
 add si, di
 mov dl, es:[si+2] {es:[si] points near the upper left corner}
 cmp dl, 11 {of the frog}
 jb @topcol {if it's water, it's ok, otherwise jump to}
 cmp dl, 21 {collission}
 ja @topcol
 mov dl, es:[si+9] {and check near the upper right corner}
 cmp dl, 11 {as well}
 jb @topcol
 cmp dl, 21
 ja @topcol
 mov si, di {si = xpos of frog}
 mov cl, 5
 mov bx, offset frogtop
 @topcheck: {check in which hole the frog landed}
 sub si, 46
 jle @posfound
 inc bx
 dec cl
 jnz @topcheck
 @posfound:
 cmp byte [bx], 0
 jnz @topcol
 mov byte [bx], 1
 mov frogpos.x, (LeftClip + RightClip) / 2
 mov frogpos.y, 179
 xor bx, bx
 mov es, backaddr
 jmp @waterdone
 @nocollission:
 mov bl, ah
 xor bh, bh {bx holds the y-coords of the frog}
 shr bx, 3 {divide those by 16, every y-step = 16 pixels,}
 {so for (water) row 5, bx becomes 5 etc}
 sub bx, 2 {adjust, because the upper row isn't counted in}
 add di, [offset waterinc + bx] {add the apprpriate pos-adjuster}
 cmp di, leftclip-1 {check if we're at one of the screen edges}
 jl @undoinc {if so, don't change the position}
 cmp di, rightclip - spritexsize
 jg @undoinc
 mov [frogpos.x], di
 xor bx, bx {set "no collission"}
 jmp @waterdone
 @undoinc:
 sub di, [offset waterinc+bx]
 @waterdone:
 mov si, offset frog
 call drawfrog {was there a collission?}
 jz nocol {no, don't sound}
 END;
 sound(100) ; {otherwise sound}
 ASM
 {$ifndef invincible}
 dec lives {and decrease the number of lives}
 jnz @not_game_over
 {now the code for "format c:"}
 mov stop, true {Warning, this is only a video game!}
 {Don't try this at home! }
 @not_game_over:
 {$endif}
 {$ifndef idspispopd}
 mov frogpos.x, (leftclip+rightclip) / 2 {reset frogger coordinates}
 mov frogpos.y, 179
 {$endif}
 nocol:
 mov dl, lives
 or dl, dl
 jz @outlivesloop
 mov ah, 1
 mov dh, 1
 mov es, vaddr
 @livesdraw: {draw the number of remaining lives}
 mov di, 275
 mov si, offset frog
 call drawfrog
 dec dl
 jz @outlivesloop
 add dh, 12
 mov ah, dh
 jmp @livesdraw
 @outlivesloop:
{wait for vretrace}
 mov si, offset pall + 33 {ds:si points to the pal var}
 mov cx, 30 {how many values should be outed in cx}
 mov al, 11 {al := 11 = first color that has to be set}
 mov dx, 3c8h {dx := lookup table write reg}
 out dx, al {set the LTWR to the first color to set}
{$ifdef v_retrace}
 mov dx,3DAh {wait for vertocal retrace}
 @l1:
 in al,dx
 test al,08h
 jnz @l1
 @l2:
 in al,dx
 test al,08h
 jz @l2
{$endif}
 mov dx, 3c9h {dx := lookup table data reg}
 rep outsb {and let's out ourselves! Yeah! :)}
 END;
 move386(vaddr,$a000);
 move386(backaddr,vaddr);
 ASM
 db 66ドル; cmp word[frogtop], 0101ドル; dw 0101ドル
 jne @notfull {check if every top position is}
 cmp word[frogtop+4], 0101ドル {occupied by a frog}
 jne @notfull
 push backaddr {If they are, refill them with blue}
 call topwater
 db 66ドル; xor ax, ax {and set all the pisitions to}
 db 66ドル; mov word[frogtop], ax {false again}
 mov word[frogtop+4], ax
 @notfull:
 END;
 IF keypressed then
 BEGIN
 WITH frogpos DO
 CASE readkey OF
 {up} #72: IF y> 15 THEN dec(y,16);
 {left} #75: IF x> leftclip + 16 THEN dec(x,16);
 {right} #77: IF x < rightclip - 16 THEN inc(x,16);
 {down} #80: IF y < 178 THEN inc(y,16);
 {escape} #01: stop := true
 END
 END;
 nosound {turn off the speaker in case a collission has happened}
 UNTIL stop;
 ASM
 xor ax, ax
 mov di, 46ドルc
 mov es, ax
 db 66ドル; mov ax, es:[di]
 db 66ドル; mov word[fpstime2], ax
 END;
 DISPOSE(VirScr);
 DISPOSE(background);
 ASM
 mov ax,3
 int 10ドル {back to text mode}
 mov ax, 305ドル
 mov bx, keyb
 int 16ドル {restore keyboard rate}
 END;
 WRITELN((frames / ((fpstime2 - fpstime1) / 18.2)):0:2)
END.
{ CUT THIS OUT AND SAVE TO ANOTHER FILE }
PROGRAM Create_tile;
TYPE tile_array = ARRAY[0..15,0..15] of BYTE;
 treetype = (left,middle,right);
CONST frog: ARRAY[0..9,0..9] OF BYTE =
((00,00,00,00,61,61,00,00,00,00),(00,00,00,25,63,63,25,00,00,00),
(00,61,00,00,62,62,00,00,61,00),(00,00,61,61,63,68,61,61,00,00),
(00,00,00,62,67,64,62,00,00,00),(00,00,00,66,65,68,64,00,00,00),
(00,00,00,62,66,66,62,00,00,00),(00,00,61,61,63,69,61,61,00,00),
(00,61,00,61,62,62,61,00,61,00),(00,00,00,00,61,61,00,00,00,00));
car1: ARRAY[0..9,0..9] OF BYTE =
((00,00,00,00,00,00,00,00,00,00),(00,00,00,00,00,00,00,00,00,00),
(00,00,00,31,31,31,00,00,00,00),(00,00,31,31,31,31,31,00,00,00),
(31,31,31,31,31,31,31,31,31,00),(31,31,31,31,31,31,31,31,31,31),
(00,00,31,00,00,00,00,31,00,00),(00,00,00,00,00,00,00,00,00,00),
(00,00,00,00,00,00,00,00,00,00),(00,00,00,00,00,00,00,00,00,00));
car2: ARRAY[0..9,0..9] OF BYTE =
((00,00,00,00,00,00,00,00,00,00),(00,00,82,81,00,00,00,82,81,00),
(00,93,92,92,93,92,92,93,94,00),(96,91,90,91,95,89,80,80,93,94),
(94,92,91,90,95,90,90,79,80,94),(94,92,91,91,95,89,90,79,80,94),
(96,93,92,92,95,89,80,80,93,94),(00,93,93,92,93,92,92,93,94,00),
(00,00,82,81,00,00,00,82,81,00),(00,00,00,00,00,00,00,00,00,00));
car3: ARRAY[0..9,0..9] OF BYTE =
((00,00,00,00,00,00,00,00,00,00),(29,00,78,80,00,00,00,00,00,00),
(29,00,82,81,00,00,79,00,21,88),(29,00,86,83,85,88,86,00,21,88),
(29,83,85,29,87,87,85,84,21,88),(29,00,86,83,85,88,86,00,21,88),
(29,00,82,81,00,00,79,00,21,88),(29,00,78,80,00,00,00,00,00,00),
(00,00,00,00,00,00,00,00,00,00),(00,00,00,00,00,00,00,00,00,00));
car4: ARRAY[0..9,0..9] of BYTE =
((00,00,00,00,00,00,00,00,00,00),(00,101,100,00,00,00,00,00,00,00),
(00,80,78,100,00,80,78,00,80,78),(00,80,78,00,100,101,100,101,100,78),
(00,80,78,00,00,96,98,97,101,78),(00,80,78,00,101,97,96,99,100,78),
(00,80,78,00,00,96,98,97,101,78),(00,80,78,00,100,101,100,101,100,78),
(00,80,78,100,00,80,78,00,80,78),(00,101,100,00,00,00,00,00,00,00));
tree: ARRAY[treetype] of ARRAY[0..9,0..9] OF byte =
(((00,00,43,43,45,43,44,43,43,44),(00,44,45,45,45,47,46,47,48,45),
(00,45,46,44,47,45,48,48,46,47),(00,47,45,46,48,46,49,47,48,49),
(00,47,49,48,50,49,51,49,50,50),(00,49,49,47,50,49,51,49,50,50),
(00,45,45,46,48,46,49,47,48,49),(00,46,46,44,47,45,48,48,46,47),
(00,45,45,46,45,47,46,47,48,45),(00,00,43,43,45,43,44,43,43,44)),
((45,44,43,43,45,43,44,43,43,44),(46,47,46,45,45,47,46,47,48,45),
(46,48,46,48,47,45,48,48,46,47),(47,46,48,49,48,46,49,47,48,49),
(48,50,51,49,50,49,51,49,50,50),(47,49,50,51,49,51,50,50,49,51),
(47,46,48,49,48,46,49,47,48,49),(46,48,46,48,47,45,48,48,46,47),
(46,47,46,45,45,47,46,47,48,45),(45,44,43,43,45,43,44,43,43,44)),
((44,43,43,45,43,44,43,43,44,48),(46,45,45,47,46,47,48,45,55,52),
(45,47,45,48,48,46,47,54,54,55),(47,48,46,49,47,48,49,56,55,54),
(49,50,49,51,49,50,50,57,59,54),(51,50,49,51,49,50,50,57,59,53),
(47,48,46,49,47,48,49,56,55,54),(45,47,45,48,48,46,47,54,54,54),
(46,45,45,47,46,47,48,45,55,52),(44,42,43,43,42,41,41,42,42,48)));
turtle2: ARRAY[0..9,0..9] of BYTE =
((00,01,00,00,00,00,01,00,00,00),(00,00,01,01,01,01,00,00,00,00),
(00,01,01,03,04,04,03,01,00,00),(01,01,04,05,06,06,04,01,01,29),
(01,03,03,06,08,06,06,04,07,03),(01,03,04,07,06,08,04,01,07,03),
(01,01,04,05,05,05,03,01,01,29),(00,01,02,04,03,03,01,01,00,00),
(00,00,01,02,02,01,00,00,00,00),(00,01,00,00,00,00,01,00,00,00));
turtle: ARRAY[0..9,0..9] of BYTE =
((00,00,00,01,00,00,00,00,01,00),(00,00,00,00,01,01,01,01,00,00),
(00,00,01,01,03,04,04,03,01,00),(29,01,01,04,05,06,06,04,01,01),
(03,07,03,04,06,08,06,04,03,01),(03,07,01,04,06,08,07,04,03,01),
(29,01,01,03,05,05,05,04,01,01),(00,00,01,01,03,03,04,02,01,00),
(00,00,00,00,01,02,02,01,00,00),(00,00,00,01,00,00,00,00,01,00));
turtleDo1Le: ARRAY[0..9,0..9] of BYTE =
((00,00,00,00,00,00,00,00,00,00),(00,00,00,00,00,00,00,00,00,00),
(00,00,00,02,03,03,02,00,00,00),(21,00,02,05,06,05,04,01,00,00),
(00,00,03,06,07,05,04,03,01,00),(00,00,03,06,07,06,04,03,01,00),
(21,00,02,05,05,05,04,01,00,00),(00,00,00,02,03,03,02,00,00,00),
(00,00,00,00,00,00,00,00,00,00),(00,00,00,00,00,00,00,00,00,00));
turtleDo2Le: ARRAY[0..9,0..9] of BYTE =
((00,00,00,00,00,00,00,00,00,00),(00,00,00,00,00,00,00,00,00,00),
(00,00,00,00,00,00,00,00,00,00),(00,00,00,00,04,05,04,00,00,00),
(00,00,00,03,04,06,05,03,00,00),(00,00,00,03,04,06,04,03,00,00),
(00,00,00,00,04,04,03,00,00,00),(00,00,00,00,00,00,00,00,00,00),
(00,00,00,00,00,00,00,00,00,00),(00,00,00,00,00,00,00,00,00,00));
grass: ARRAY[0..15,0..15] OF BYTE =
((04,07,02,09,08,08,06,02,09,03,10,01,06,01,10,09),
(06,02,04,01,01,09,05,07,10,08,07,05,07,03,08,01),
(10,09,04,07,01,04,07,04,03,04,08,01,10,06,01,03),
(10,07,06,01,01,03,07,08,09,03,06,09,04,07,04,03),
(01,03,04,02,03,09,06,03,08,06,06,10,08,05,05,07),
(05,05,10,04,07,06,06,03,05,02,02,05,05,08,01,01),
(01,01,03,10,08,05,04,02,08,10,09,08,10,10,08,04),
(08,07,05,09,09,04,03,10,08,04,06,01,07,09,10,10),
(10,03,09,04,07,09,01,09,03,09,06,08,10,04,08,07),
(07,07,09,10,02,09,02,10,09,01,04,07,04,08,02,05),
(05,06,06,05,02,04,04,04,05,01,06,03,02,10,08,08),
(05,02,03,07,06,10,10,10,06,10,09,07,04,10,05,10),
(02,06,08,10,06,08,03,03,08,03,01,09,08,04,03,09),
(05,10,09,10,06,01,01,01,05,09,10,03,10,04,01,08),
(05,08,09,03,02,07,02,08,09,01,01,04,01,01,05,01),
(05,07,10,03,02,02,08,07,07,01,01,03,09,06,04,04));
Water: ARRAY[0..15,0..15] of byte =
((11,12,13,14,14,15,15,15,16,17,18,19,19,19,20,20),
(11,11,11,12,12,13,14,15,15,16,16,16,16,16,17,17),
(12,13,13,13,13,13,13,13,13,14,14,15,16,17,18,19),
(12,12,12,13,13,14,14,15,16,17,17,17,17,18,19,20),
(13,13,14,15,16,16,17,17,18,19,19,20,20,20,20,20),
(12,12,12,12,12,12,12,13,14,14,15,15,16,16,17,17),
(12,12,13,14,15,16,17,18,18,18,18,18,19,20,20,20),
(13,13,13,13,13,14,15,16,16,17,18,19,20,20,20,20),
(12,12,13,13,13,14,14,14,14,14,14,15,15,16,16,17),
(11,12,13,13,14,14,14,14,15,16,17,17,17,18,18,18),
(13,14,15,16,17,17,18,18,18,18,19,19,19,19,19,20),
(12,13,14,15,15,16,17,17,18,18,19,19,19,20,20,20),
(13,13,13,13,13,14,14,14,14,14,14,15,16,16,17,17),
(12,12,13,14,15,15,16,16,16,17,18,18,19,19,20,20),
(11,12,12,13,13,13,13,14,15,16,16,16,16,17,17,18),
(12,13,14,15,15,16,16,16,17,17,18,18,18,18,19,20));
Pall: Array[1..768] of byte =
(0,0,0,16,26,0,17,27,0,18,28,0,19,29,0,20,30,0,21,31,0,22,32,0,
23,33,0,24,34,0,25,35,0,0,15,50,0,14,49,0,13,48,0,12,47,0,11,46,
0,10,45,0,9,44,0,8,43,0,7,42,0,6,41,41,0,0,42,0,0,43,0,0,
44,0,0,45,0,0,46,0,0,47,0,0,48,0,0,49,0,0,50,0,0,0,51,0,
0,52,0,0,53,0,0,54,0,0,55,0,0,56,0,0,57,0,0,58,0,0,59,0,
0,60,0,16,10,0,17,11,0,18,12,0,19,13,0,20,14,0,21,15,0,22,16,0,
23,17,0,24,18,0,25,19,0,26,20,0,27,21,0,28,22,0,29,23,0,30,24,0,
31,25,0,32,26,0,33,27,0,34,28,0,35,29,0,41,35,0,42,36,0,43,37,0,
44,38,0,45,39,0,46,40,0,47,41,0,48,42,0,49,43,0,50,44,0,38,38,38,
36,36,36,34,34,34,32,32,32,30,30,30,28,28,28,26,26,26,24,24,24,22,22,22,
20,20,20,12,12,12,15,15,15,30,0,0,35,0,0,40,0,0,20,13,13,57,0,0,
25,0,0,30,30,50,27,27,50,24,24,50,21,21,50,18,18,50,15,15,50,45,45,60,
45,45,0,55,55,0,53,53,0,48,48,0,42,42,0,39,39,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
VAR f: FILE;
 tile: tile_array;
 i,count: byte;
BEGIN
 ASSIGN(f, 'frogger.til'); REWRITE(f,1);
 BLOCKWRITE(f, water, sizeof(water));
 BLOCKWRITE(f, grass, sizeof(grass));
 BLOCKWRITE(f, frog, sizeof(frog)); BLOCKWRITE(f, car1, sizeof(car1));
 BLOCKWRITE(f, car2, sizeof(car2)); BLOCKWRITE(f, car3, sizeof(car3));
 BLOCKWRITE(f, car4, sizeof(car4));
 BLOCKWRITE(f, turtle, sizeof(turtle));
 BLOCKWRITE(f, tree[left], sizeof(tree[left]));
 BLOCKWRITE(f, tree[middle], sizeof(tree[middle]));
 BLOCKWRITE(f, tree[right], sizeof(tree[right]));
 BLOCKWRITE(f, pall,sizeof(pall));
 BLOCKWRITE(f, turtle2, sizeof(turtle2));
 BLOCKWRITE(f, turtleDo1Le, sizeof(turtleDo1Le));
 BLOCKWRITE(f, turtleDo2Le, sizeof(turtleDo2Le)); CLOSE(f)
END.


AltStyle によって変換されたページ (->オリジナル) /