Kod: Zaznacz cały
{$r msx.rc}
// TEDzakker demo music
const
MUSIC = $4000;
begin
asm { phr \ lda #0 \ jsr MUSIC \ plr };
repeat
pause;
asm { phr \ jsr MUSIC+3 \ plr };
until false;
end.
Kod: Zaznacz cały
{$r msx.rc}
// TEDzakker demo music
const
MUSIC = $4000;
begin
asm { phr \ lda #0 \ jsr MUSIC \ plr };
repeat
pause;
asm { phr \ jsr MUSIC+3 \ plr };
until false;
end.
a widzisz... nie wiedziałem.
Kod: Zaznacz cały
MUSIC rcdata 'demo.tzp.prg' 2
Kod: Zaznacz cały
// 06_plasma.ras, Turbo Rascal example
// TEDzakker demo music
{$r msx.rc}
uses fastmath;
//-----------------------------------------------------------------------------
const
COLOURRAM_ADDR = $0800; SCREEN_ADDR = $0c00;
SCR_W = 40; SCR_H = 25;
MUSIC = $4000;
DATA_CHAR: array [0..127] of byte = (
$00, $00, $00, $00, $00, $00, $00, $00,
$00, $00, $00, $10, $00, $00, $00, $00,
$00, $00, $18, $18, $00, $00, $00, $00,
$00, $00, $38, $38, $38, $00, $00, $00,
$00, $00, $3c, $3c, $3c, $3c, $00, $00,
$00, $7c, $7c, $7c, $7c, $7c, $00, $00,
$00, $7e, $7e, $7e, $7e, $7e, $7e, $00,
$fe, $fe, $fe, $fe, $fe, $fe, $fe, $00,
$00, $7f, $7f, $7f, $7f, $7f, $7f, $7f,
$00, $7e, $7e, $7e, $7e, $7e, $7e, $00,
$00, $7c, $7c, $7c, $7c, $7c, $00, $00,
$00, $00, $3c, $3c, $3c, $3c, $00, $00,
$00, $00, $38, $38, $38, $00, $00, $00,
$00, $00, $18, $18, $00, $00, $00, $00,
$00, $00, $00, $08, $00, $00, $00, $00,
$00, $00, $00, $00, $00, $00, $00, $00
);
//-----------------------------------------------------------------------------
var
DETIRQSRC : byte absolute $ff09; //detect IRQ source, and clear IRQ flag
SETIRQSRC : byte absolute $ff0a; //set IRQ source
RC : byte absolute $ff0b; //raser counter bits 0-7
RAMROMSEL : byte absolute $ff12;
CHBAS : byte absolute $ff13;
BACKGROUND : byte absolute $ff15;
BORDER : byte absolute $ff19;
VCOUNT : byte absolute $ff1d; //vertical line bits 0-7
IRQVEC : word absolute $fffe;
//-----------------------------------------------------------------------------
var
c1A : byte = 1;
c1B : byte = 5;
scrn : PByte absolute $60;
charset : array [0..0] of byte absolute $3000;
sinusTable : array [0..255] of byte absolute $3100;
lookupDiv16 : array [0..255] of byte absolute $3200;
xbuf : array [0..39] of byte absolute $3300;
//-----------------------------------------------------------------------------
procedure InitDivision16;
var x: byte;
begin
for x:=0 to 255 do lookupDiv16[x] := x shr 4; // Simply store values divided by 16
end;
procedure InitCharset;
begin
Move(DATA_CHAR, charset, SizeOf(DATA_CHAR));
// set bit 2
RAMROMSEL := RAMROMSEL and %11111011;
// 12 = $3000 / $400 on 2-7 bits
CHBAS := (CHBAS and %11) or 12 shl 2;
end;
//-----------------------------------------------------------------------------
procedure doPlasma;
var
_c1a, _c1b : byte;
i, ii, tmp : byte;
begin
scrn := pointer(SCREEN_ADDR);
_c1a := c1A; _c1b := c1B;
for i := (SCR_W - 1) downto 0 do begin
xbuf[i] := sinusTable[_c1a] + sinusTable[_c1b];
Inc(_c1a, 3); Inc(_c1b, 7);
end;
for ii := (SCR_H - 1) downto 0 do begin
tmp := sinusTable[_c1a] + sinusTable[_c1b];
Inc(_c1a, 4); Inc(_c1b, 9);
for i := (SCR_W - 1) downto 0 do
scrn[i] := lookupDiv16[xbuf[i] + tmp];
Inc(scrn, 40);
end;
Inc(c1A, 3); Dec(c1B, 5);
end;
//-----------------------------------------------------------------------------
procedure vbi; assembler; interrupt;
asm {
phr
mva #2 DETIRQSRC
inc c4p_time+2
bne off
inc c4p_time+1
bne off
inc c4p_time
off:
jsr MUSIC+3;
plr
};
end;
//-----------------------------------------------------------------------------
begin
asm {
sei \ sta $ff3f
txa:pha \ lda #0 \ jsr MUSIC \ pla:tax
};
RC := $d8; SETIRQSRC := 2; DETIRQSRC := 2;
IRQVEC := word(@vbi);
FillSinHigh(sinusTable); InitDivision16; InitCharset;
asm { cli };
repeat
Pause; doPlasma;
until false;
end.
Kod: Zaznacz cały
APLBIN rcdata 'mp.apl'
Kod: Zaznacz cały
//Mad Pascal logo by @bocianu
{$r hgfx_apl.rc}
uses aplib;
const
APLBIN = $3000;
LOGO = $5800;
var
SETBITMAP : byte absolute $ff06;
SETMCOLOR : byte absolute $ff07;
BITMAPADDR : byte absolute $ff12;
VIDEOMATRIX : byte absolute $ff14;
BORDER : byte absolute $ff19;
begin
unapl(pointer(APLBIN), pointer(LOGO));
SETBITMAP := SETBITMAP or $20;
SETMCOLOR := (SETMCOLOR and $40) or $8;
// (01011xxx) $5800 = 11 * $800;
VIDEOMATRIX := %01011000;
// (xx011xxx) $6000 = 3 * $2000; bit 2 set to 0 means reading from RAM
BITMAPADDR := %00011000 or (BITMAPADDR and %00000011);
BORDER := $3d;
repeat until false;
end.
Kod: Zaznacz cały
//-----------------------------------------------------------------------------
// Commodore Plus/4, C16 or 264 TED sound frequency tables PAL
// https://www.dtech.lv/techarticles_plus4_freq.html
//-----------------------------------------------------------------------------
const
a0 = 7; a1 = 516; a2 = 770; a3 = 897; a4 = 960; a5 = 992;
a0is = 64; a1is = 544; a2is = 784; a3is = 904; a4is = 964; a5is = 994;
b0 = 118; b1 = 571; b2 = 798; b3 = 911; b4 = 967; b5 = 996;
c1 = 169; c2 = 597; c3 = 810; c4 = 917; c5 = 971; c6 = 997;
c1is = 217; c2is = 621; c3is = 822; c4is = 923; c5is = 974;
d1 = 262; d2 = 643; d3 = 834; d4 = 929; d5 = 976;
d1is = 305; d2is = 665; d3is = 844; d4is = 934; d5is = 979;
e1 = 345; e2 = 685; e3 = 854; e4 = 939; e5 = 982;
f1 = 383; f2 = 704; f3 = 864; f4 = 944; f5 = 984;
f1is = 419; f2is = 722; f3is = 873; f4is = 948; f5is = 986;
g1 = 453; g2 = 739; g3 = 881; g4 = 953; g5 = 988;
g1is = 485; g2is = 755; g3is = 889; g4is = 957; g5is = 990;
//-----------------------------------------------------------------------------
// Zielony mosteczek
//-----------------------------------------------------------------------------
const
music_notes: array [0..39] of word = (
c3,c3,c3,c3,e3,g3,f3,e3,d3,c3,
g3,g3,g3,e3,g3,c4,a3,g3,f3,e3,
d3,d3,d3,d3,f3,a3,g3,f3,e3,d3,
c3,c3,c3,c3,e3,g3,f3,e3,d3,c3
);
music_duration: array [0..39] of byte = (
2,2,4,2,2,4,2,2,4,8,
2,2,4,2,2,4,3,1,2,2,
2,2,4,2,2,4,3,1,2,2,
2,2,4,2,2,4,2,2,4,4
);
//-----------------------------------------------------------------------------
const
TEMPO = 3;
//-----------------------------------------------------------------------------
{*
$FF0E 0-7 Low byte of frequency for voice 1
$FF0F 0-7 Low byte of frequency for voice 2
$FF10 0-1 High 2 bits of frequency for voice 2
$FF11 0-3 Volume
4 Select voice 1 (0 = off, 1 = on)
5 Select voice 2 (0 = off, 1 = on)
6 Select noise for voice 2 (0 = off, 1 = on)
7 Sound switch (0 = on, 1 = off)
$FF12 0-1 High 2 bits of frequency for voice 1
2-7 Nonsound uses
*}
var
TED_FF0E : byte absolute $FF0E;
TED_FF11 : byte absolute $FF11;
TED_FF12 : byte absolute $FF12;
//-----------------------------------------------------------------------------
var
note : word;
duration : byte;
i, ii : byte;
//-----------------------------------------------------------------------------
begin
//Select voice 1 with maximum volume
TED_FF11 := $9f;
for i := 0 to SizeOf(music_duration)-1 do begin
duration := music_duration[i];
note := music_notes[i];
TED_FF0E := Lo(note);
TED_FF12 := (TED_FF12 and $fc) or Hi(note);
//Turn on sound
TED_FF11 := TED_FF11 and $7f;
for ii := (duration shl TEMPO) downto 1 do pause;
//Turn off sound
TED_FF11 := TED_FF11 or $80;
pause;
end;
end.