Raster bars: Difference between revisions

m
→‎{{header|Wren}}: Changed to Wren S/H
m (→‎{{header|Wren}}: Changed to Wren S/H)
 
(5 intermediate revisions by 4 users not shown)
Line 11:
=={{header|Ada}}==
{{libheader|SDLAda}}
<langsyntaxhighlight Adalang="ada">with Ada.Numerics.Elementary_Functions;
 
with SDL.Video.Windows.Makers;
Line 107:
Window.Finalize;
SDL.Finalise;
end Raster_Bars;</langsyntaxhighlight>
 
=={{header|Go}}==
Line 122:
</pre>
 
<langsyntaxhighlight lang="go">package main
 
import (
Line 205:
log.Fatal(err2)
}
}</langsyntaxhighlight>
 
 
=={{header|Julia}}==
<langsyntaxhighlight lang="julia">using Colors, Cairo, Gtk
 
const can = GtkCanvas()
Line 261:
end
end
</syntaxhighlight>
</lang>
 
=={{header|Nim}}==
{{trans|Julia}}
{{libheader|gintro}}
<langsyntaxhighlight Nimlang="nim">import gintro/[gobject, glib, gdk, gtk, gio, cairo]
 
 
Line 353:
let app = newApplication(Application, "Rosetta.rasterbars")
discard app.connect("activate", activate)
discard app.run()</langsyntaxhighlight>
 
=={{header|Phix}}==
Some grey bars that vaguely shimmer as they march up the screen... (did not turn out quite as well as hoped)
<!--<syntaxhighlight lang="phix">(phixonline)-->
<lang Phix>-- demo\rosetta\Raster_bars.exw
<span style="color: #000080;font-style:italic;">-- demo\rosetta\Raster_bars.exw</span>
constant N = 10,
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
nColours = floor(255/N)
<span style="color: #008080;">constant</span> <span style="color: #000000;">title</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"Raster bars"</span><span style="color: #0000FF;">,</span>
integer offset = 0, clast = nColours
<span style="color: #000000;">N</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">10</span><span style="color: #0000FF;">,</span>
 
<span style="color: #000000;">nColours</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">255</span><span style="color: #0000FF;">/</span><span style="color: #000000;">N</span><span style="color: #0000FF;">)</span>
include pGUI.e
<span style="color: #004080;">integer</span> <span style="color: #000000;">offset</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">clast</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">nColours</span>
Ihandle dlg, canvas
cdCanvas cddbuffer, cdcanvas
function colour(integer i)
integer g = i*N
return cdEncodeColorAlpha(g, g, g, 255)
end function
 
function redraw_cb(Ihandle /*ih*/, integer /*posx*/, integer /*posy*/)
cdCanvasActivate(cddbuffer)
cdCanvasSetBackground(cddbuffer, colour(clast))
cdCanvasClear(cddbuffer)
integer {width, height} = IupGetIntInt(canvas, "DRAWSIZE"),
h = floor(height/(nColours-1)),
y = height+offset
cdCanvasSetInteriorStyle(cddbuffer, CD_SOLID)
for i=2 to nColours do
integer c = clast+i-1
if c>nColours then c -= nColours end if
cdCanvasSetForeground(cddbuffer, colour(c))
cdCanvasBox(cddbuffer, 0, width, y-h, y)
y -= h
end for
cdCanvasFlush(cddbuffer)
offset += 1
if offset>=h then
offset = 0
clast += 1
if clast>nColours then clast = 1 end if
end if
return IUP_DEFAULT
end function
function map_cb(Ihandle ih)
cdcanvas = cdCreateCanvas(CD_IUP, ih)
cddbuffer = cdCreateCanvas(CD_DBUFFER, cdcanvas)
return IUP_DEFAULT
end function
function unmap_cb(Ihandle /*ih*/)
cdKillCanvas(cddbuffer)
cdKillCanvas(cdcanvas)
return IUP_DEFAULT
end function
function timer_cb(Ihandle /*ih*/)
IupRedraw(dlg)
return IUP_DEFAULT
end function
 
procedure main()
IupOpen()
canvas = IupCanvas(NULL)
IupSetAttribute(canvas, "RASTERSIZE", "600x400")
IupSetCallback(canvas, "MAP_CB", Icallback("map_cb"))
IupSetCallback(canvas, "UNMAP_CB", Icallback("unmap_cb"))
dlg = IupDialog(canvas)
IupSetAttribute(dlg, "TITLE", "Raster bars")
IupSetCallback(canvas, "ACTION", Icallback("redraw_cb"))
Ihandle hTimer = IupTimer(Icallback("timer_cb"), 10)
IupMap(dlg)
IupSetAttribute(canvas, "RASTERSIZE", NULL)
IupShowXY(dlg,IUP_CENTER,IUP_CENTER)
<span style="color: #008080;">include</span> <span style="color: #000000;">pGUI</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>
IupMainLoop()
<span style="color: #004080;">Ihandle</span> <span style="color: #000000;">dlg</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">canvas</span>
<span style="color: #004080;">cdCanvas</span> <span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">cdcanvas</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">colour</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">g</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">*</span><span style="color: #000000;">N</span>
<span style="color: #008080;">return</span> <span style="color: #7060A8;">cdEncodeColorAlpha</span><span style="color: #0000FF;">(</span><span style="color: #000000;">g</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">g</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">g</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">255</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">redraw_cb</span><span style="color: #0000FF;">(</span><span style="color: #004080;">Ihandle</span> <span style="color: #000080;font-style:italic;">/*ih*/</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000080;font-style:italic;">/*posx*/</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">/*posy*/</span><span style="color: #0000FF;">)</span>
IupClose()
<span style="color: #7060A8;">cdCanvasActivate</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">)</span>
end procedure
<span style="color: #7060A8;">cdCanvasSetBackground</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">colour</span><span style="color: #0000FF;">(</span><span style="color: #000000;">clast</span><span style="color: #0000FF;">))</span>
<span style="color: #7060A8;">cdCanvasClear</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">integer</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">width</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">height</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupGetIntInt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">canvas</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"DRAWSIZE"</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">h</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">height</span><span style="color: #0000FF;">/(</span><span style="color: #000000;">nColours</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)),</span>
<span style="color: #000000;">y</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">height</span><span style="color: #0000FF;">+</span><span style="color: #000000;">offset</span>
<span style="color: #7060A8;">cdCanvasSetInteriorStyle</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">,</span> <span style="color: #004600;">CD_SOLID</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">2</span> <span style="color: #008080;">to</span> <span style="color: #000000;">nColours</span> <span style="color: #008080;">do</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">c</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">clast</span><span style="color: #0000FF;">+</span><span style="color: #000000;">i</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">c</span><span style="color: #0000FF;">></span><span style="color: #000000;">nColours</span> <span style="color: #008080;">then</span> <span style="color: #000000;">c</span> <span style="color: #0000FF;">-=</span> <span style="color: #000000;">nColours</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #7060A8;">cdCanvasSetForeground</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">colour</span><span style="color: #0000FF;">(</span><span style="color: #000000;">c</span><span style="color: #0000FF;">))</span>
<span style="color: #7060A8;">cdCanvasBox</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">width</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">y</span><span style="color: #0000FF;">-</span><span style="color: #000000;">h</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">y</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">y</span> <span style="color: #0000FF;">-=</span> <span style="color: #000000;">h</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #7060A8;">cdCanvasFlush</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">offset</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">offset</span><span style="color: #0000FF;">>=</span><span style="color: #000000;">h</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">offset</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
<span style="color: #000000;">clast</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">clast</span><span style="color: #0000FF;">></span><span style="color: #000000;">nColours</span> <span style="color: #008080;">then</span> <span style="color: #000000;">clast</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">return</span> <span style="color: #004600;">IUP_DEFAULT</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">map_cb</span><span style="color: #0000FF;">(</span><span style="color: #004080;">Ihandle</span> <span style="color: #000000;">ih</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">cdcanvas</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">cdCreateCanvas</span><span style="color: #0000FF;">(</span><span style="color: #004600;">CD_IUP</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">ih</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">cddbuffer</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">cdCreateCanvas</span><span style="color: #0000FF;">(</span><span style="color: #004600;">CD_DBUFFER</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">cdcanvas</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">return</span> <span style="color: #004600;">IUP_DEFAULT</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">unmap_cb</span><span style="color: #0000FF;">(</span><span style="color: #004080;">Ihandle</span> <span style="color: #000080;font-style:italic;">/*ih*/</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">cdKillCanvas</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">cdKillCanvas</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cdcanvas</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">return</span> <span style="color: #004600;">IUP_DEFAULT</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">timer_cb</span><span style="color: #0000FF;">(</span><span style="color: #004080;">Ihandle</span> <span style="color: #000080;font-style:italic;">/*ih*/</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">IupRedraw</span><span style="color: #0000FF;">(</span><span style="color: #000000;">dlg</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">return</span> <span style="color: #004600;">IUP_DEFAULT</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">procedure</span> <span style="color: #000000;">main</span><span style="color: #0000FF;">()</span>
main()</lang>
<span style="color: #7060A8;">IupOpen</span><span style="color: #0000FF;">()</span>
<span style="color: #000000;">canvas</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupCanvas</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"RASTERSIZE=600x400"</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">IupSetCallbacks</span><span style="color: #0000FF;">(</span><span style="color: #000000;">canvas</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">"MAP_CB"</span><span style="color: #0000FF;">,</span> <span style="color: #7060A8;">Icallback</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"map_cb"</span><span style="color: #0000FF;">),</span>
<span style="color: #008000;">"UNMAP_CB"</span><span style="color: #0000FF;">,</span> <span style="color: #7060A8;">Icallback</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"unmap_cb"</span><span style="color: #0000FF;">),</span>
<span style="color: #008000;">"ACTION"</span><span style="color: #0000FF;">,</span> <span style="color: #7060A8;">Icallback</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"redraw_cb"</span><span style="color: #0000FF;">)})</span>
<span style="color: #000000;">dlg</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupDialog</span><span style="color: #0000FF;">(</span><span style="color: #000000;">canvas</span><span style="color: #0000FF;">,</span><span style="color: #008000;">`TITLE="%s"`</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">title</span><span style="color: #0000FF;">})</span>
<span style="color: #004080;">Ihandle</span> <span style="color: #000000;">hTimer</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupTimer</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">Icallback</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"timer_cb"</span><span style="color: #0000FF;">),</span> <span style="color: #000000;">10</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">IupShow</span><span style="color: #0000FF;">(</span><span style="color: #000000;">dlg</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">IupSetAttribute</span><span style="color: #0000FF;">(</span><span style="color: #000000;">canvas</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"RASTERSIZE"</span><span style="color: #0000FF;">,</span> <span style="color: #004600;">NULL</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #7060A8;">platform</span><span style="color: #0000FF;">()!=</span><span style="color: #004600;">JS</span> <span style="color: #008080;">then</span>
<span style="color: #7060A8;">IupMainLoop</span><span style="color: #0000FF;">()</span>
<span style="color: #7060A8;">IupClose</span><span style="color: #0000FF;">()</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
<span style="color: #000000;">main</span><span style="color: #0000FF;">()</span>
<!--</syntaxhighlight>-->
 
=={{header|Raku}}==
Line 461 ⟶ 458:
* Press Q to exit.
 
<syntaxhighlight lang="raku" perl6line>unit sub MAIN (
Int :b(:$bar-height) is copy = 60; #= Height of the individual "Raster bars", minimum 32 (pixels)
Int :d(:$dir) is copy = -1; #= Scroll direction: -1 is "up" 1 is "down"
Line 660 ⟶ 657:
}
$fps
}</langsyntaxhighlight>
 
Screenshot still of typical run: [https://github.com/thundergnat/rc/blob/master/img/Raster-bars-Perl6.png (offsite .png image)]
 
(Small) Moving gif of swaying bars: [https://github.com/thundergnat/rc/blob/master/img/Raster-bars-swaying-Raku.gif (offsite .gif image)]
 
=={{header|Rust}}==
<syntaxhighlight lang="rust">
extern crate minifb;
 
use std::iter::repeat;
 
use minifb::{Key, Window, WindowOptions};
 
const WIDTH: usize = 640;
const HEIGHT: usize = 360;
 
struct Bar {
color: [f32; 3],
height: u32,
position: f32,
speed: f32,
}
 
impl Bar {
 
fn draw_column(&self, column_buffer: &mut [u32]) {
let start_row = (self.position.round() as i32).clamp(0, HEIGHT as i32) as usize;
let end_row = (start_row + self.height as usize).clamp(0, HEIGHT);
 
column_buffer[start_row..end_row].iter_mut().enumerate()
.for_each(|(row_index, color)| {
*color = self.row_color(row_index as i32);
});
}
 
fn row_color(&self, y: i32) -> u32 {
let yy = y as f32 / (self.height - 1) as f32;
let yy = 1.0 - 2.0 * (yy - 0.5).abs();
 
let r = (25.0 + yy.powf((2.0 - 2.0 * self.color[0]).exp()) * 230.0).round() as u8;
let g = (25.0 + yy.powf((2.0 - 2.0 * self.color[1]).exp()) * 230.0).round() as u8;
let b = (25.0 + yy.powf((2.0 - 2.0 * self.color[2]).exp()) * 230.0).round() as u8;
 
u32::from_be_bytes([255, r, g, b])
}
 
fn update_position(&mut self) {
self.position += self.speed;
 
if let Some(position) = self.bounce_position() {
self.position = position;
self.speed = -self.speed;
}
}
 
fn bounce_position(&self) -> Option<f32> {
if self.speed > 0.0 {
let limit = (HEIGHT as i32 - self.height as i32) as f32;
(self.position >= limit).then(|| limit - (self.position - limit))
} else {
(self.position <= 0.0).then(|| -self.position)
}
}
 
}
 
fn main() {
 
let mut window = Window::new(
"Raster Bars",
WIDTH,
HEIGHT,
WindowOptions::default(),
)
.unwrap_or_else(|e| {
panic!("{}", e);
});
 
// Limit to max ~60 fps update rate
window.limit_update_rate(Some(std::time::Duration::from_micros(16600)));
 
let mut bars = Vec::new();
 
bars.push(Bar { color: [1.0, 1.0, 0.0], height: 20, position: 0.0, speed: 3.1 });
bars.push(Bar { color: [1.0, 0.0, 0.0], height: 25, position: 0.0, speed: 0.2 });
bars.push(Bar { color: [0.0, 1.0, 0.0], height: 7, position: 0.0, speed: 0.4 });
bars.push(Bar { color: [0.0, 0.0, 1.0], height: 30, position: 0.0, speed: 1.0 });
 
while window.is_open() && !window.is_key_down(Key::Escape) {
 
let mut column_buffer = vec![0x_00_00_00_u32; HEIGHT];
for bar in &mut bars {
bar.draw_column(&mut column_buffer);
bar.update_position();
}
 
let buffer: Vec<u32> = column_buffer.iter()
.flat_map(|&row_color| repeat(row_color).take(WIDTH))
.collect();
 
window
.update_with_buffer(&buffer, WIDTH, HEIGHT)
.unwrap();
}
}
</syntaxhighlight>
 
 
=={{header|Wren}}==
Line 672 ⟶ 772:
 
As DOME has no facility to create an animated .gif file, the moving image is displayed but not saved.
<langsyntaxhighlight ecmascriptlang="wren">import "dome" for Window
import "graphics" for Canvas, Color
 
Line 759 ⟶ 859:
}
 
var Game = RasterBars.new(500, 500)</langsyntaxhighlight>
 
=={{header|X86 Assembly}}==
256 byte executable. Translation of XPL0. Output is the same.
<syntaxhighlight lang="asm">
page 240, 132 ;minimize annoying page headers
;Assemble with:
; tasm
; tlink /t
.model tiny
.code
.486
org 100h
 
;MS-DOS loads .com files with registers set this way:
; ax=0, bx=0, cx=00FFh, dx=cs, si=0100h, di=-2, bp=09xx, sp=-2, es=ds=cs=ss
;The direction flag (d) is clear (incrementing).
start:
if 0 ;if debug then must initialize registers
mov cx, 00FFh
mov dx, cs
mov si, 0100h
mov di, -2
mov bp, 0955h
endif
mov al,13h ;call BIOS to set graphic mode 13h
int 10h ; 320x200 with 256 colors (ah = 0)
 
;Set up color registers with sequential shades of red and green (gives yellow,
; gold, copper, brown, etc.). Since the hardware only allows 64 levels of
; intensity, the shades are not continuous. Code from SHR's YEW2 demo program.
yew10: mov al,cl ;cx is assumed set to 00ffh by loader
mov dx,03c8h ;select color register ffh down thru 01h
out dx,al
 
inc dx ;point to corresponding RGB registers
out dx,al ;set red intensity
 
aam ;set green intensity to 7/8 of red value
org $-1 ;ah <- al/8; al <- rem
db 8 ;(values other than 0a work just fine)
mov al,cl
sub al,ah
out dx,al
 
xor ax,ax ;set blue intensity to 0
out dx,al
loop yew10 ;loop for 255 color registers (ff-01)
 
fninit ;initialize math coprocessor (FPU)
fldz ;push (load) 0.0 onto FPU stack
fstp angle ; Angle:= 0.;
 
; - - - - - - - - - - - - - - - Main Loop - - - - - - - - - - - - - - - - - - -
ras60:
;WaitForVSync
mov dx, 03dah
wait10: in al, dx ;wait for vertical retrace to go away
and al, 08h
jne short wait10
wait20: in al, dx ;wait for vertical retrace
and al, 08h
je short wait20
 
;Erase buffer
mov di, offset buffer
mov cx, 200*320/2
xor ax, ax
rep stosw ;es:[di++]:= ax; cx--
 
; for N:= 2 to 9 do
mov dx, 2 ;dx = N
mov N, dx
ras70:
;Phase:= float(N)*0.4;
fild N ;can't use dx here; must be memory loc
fld n4
fmul
fstp phase
 
;Y:= fix(80.*Sin(Angle+Phase));
fld n80
fld angle
fld phase
fadd
fsin ;return the sine in one instruction!
fmul
push ax
mov bp, sp
fistp word ptr [bp]
pop ax
 
;ShowBar(Y+100, 2*N, 64*((3&N)+1)-1);
add ax, 100
mov sbY0, ax
imul ax, dx, 2
mov sbR, ax
mov ax, dx
and ax, 3
inc ax
shl ax, 6
dec ax
mov sbC0, ax
call ShowBar
 
inc N
mov dx, N
cmp dx, 9
jle short ras70
 
;Copy buffer to video RAM
mov cx, 320*200/2
mov si, offset buffer
xor di, di
push 0A000h
pop es
rep movsw ;es:[di++] <- ds:[si++]; cx--
push cs
pop es
 
; Angle:= Angle + 0.04;
fld angle
fld n04
fadd
fstp angle
 
mov ah, 1 ;a keystroke terminates the program
int 16h
je ras60 ;loop back if no keystroke
 
mov ah, 0 ;eat the keystroke
int 16h ; so it isn't echoed on the display
 
mov ax, 0003h ;restore the normal text display mode
int 10h
ret
 
;-------------------------------------------------------------------------------
ShowBar:
; proc ShowBar(Y0, R, C0); \Display cylindrical rod with its center
; int Y0, R, C0; \ at Y0, radius R, and center color C0
 
; for Y:= -R to +R do
mov ax, sbR
mov bp, ax ;bp = 'for' loop limit
neg ax
mov si, ax ;si = 'for' loop control variable
sb40:
;C:= C0 - 31*abs(Y)/R; \(looks better than a circular surface)
mov ax, si
sb45: neg ax
jl short sb45
imul ax, 31
cwd
idiv sbR
neg ax
add ax, sbC0
 
;Line(319, Y+Y0, C); \draw horizontal line from left to right
mov cx, 320
mov di, si
add di, sbY0
imul di, 320
add di, offset buffer
rep stosb ;es:[di++]:= al; cx--
 
inc si
cmp si, bp
jle short sb40
ret
 
n4 dd 0.4 ;single precision 'float' constants
n04 dd 0.04
n80 dd 80.0
N dw ?
angle dd ?
phase dd ?
sbY0 dw ?
sbR dw ?
sbC0 dw ?
buffer db 320*200 dup(?) ;stack starts above this at top of 64K
end start
</syntaxhighlight>
 
=={{header|XPL0}}==
[[File:RasterXPL0.gif|200px|thumb|right]]
<syntaxhighlight lang "XPL0">proc ShowBar(Y0, R, C0); \Display a cylindrical rod with its center
int Y0, R, C0; \ at Y0, radius R, and center color C0
int Y, C;
for Y:= -R to +R do
[C:= C0 - 31*abs(Y)/R; \(looks better than circular surface)
Move(0, Y+Y0); \start line at left side of screen
Line(319, Y+Y0, C); \draw horizontal line to right side
];
 
int N, Y;
real Angle, Phase;
[SetVid($13); \set 320x200x8 graphics
for N:= 0 to 255 do \set palette colors to
SetPalette(N, N<<2, (7*N/8)<<2, 0); \ copper, brass, and gold
Angle:= 0.;
repeat WaitForVSync; \regulate speed
Clear; \erase screen
for N:= 2 to 9 do
[Phase:= float(N)*0.4;
Y:= fix(80.*Sin(Angle+Phase));
ShowBar(Y+100, 2*N, 64*((3&N)+1)-1);
];
Angle:= Angle + 0.04;
until KeyHit;
]</syntaxhighlight>
9,476

edits