OpenCores
URL https://opencores.org/ocsvn/z3/z3/trunk

Subversion Repositories z3

[/] [z3/] [trunk/] [bios/] [bios.inf] - Rev 2

Compare with Previous | Blame | View Log

Constant Border       = 4;
Constant ScrWidth     = 240-Border+1;
Constant ScrHeight    = 320;
Constant BufferHeight = 630;
Constant LineStride   = 30;
Constant LineStrideW  = 15;
Constant TextHeight   = 10;
Constant KeyboardStartLine              = 240;
Constant KeyboardTextSpacing    = 20;
Constant KeyboardSepSpacing             = 5;
Constant StatusHeight = 10;
!                                    S c o r e : 0     M o v e s : 0
Constant ScoreXOffset = (240-Border-(4+5+4+3+4+2+4)-(3+6+4+4+4+4+2+4));

Constant DictionaryOff = 8;

Constant cAbbrev      = 0;
Constant cEncodO      = 2;
Constant cEncodB      = 4;
Constant cScrenX          = 8;
Constant cScrenY          = 10;
Constant cFontO           = 12;
Constant cFontB           = 14;
Constant cBitMpW          = 16;
Constant cScroll          = 18;
Constant cTextO           = 20;
Constant cTextB           = 22;
Constant cTextSep         = 24;
Constant cScrollStart = 26;
Constant cLastScroll  = 28;
Constant MaxTextSize  = $400;

Constant contextW     = $D800; ! $1B000

! Code should start at $1E580
! Font + Encoding data is directly before
! Game must be smaller than $1E000 (120Kb) to fit in BIOS

! BitMap buffer is at the top of the high RAM (18.75Kb)
! Scratch buffer is below the bitmap and is 1Kb
! Context structure is just below that
! Bottom of high RAM are the stacks growing up

[Main;
! Used as a table to pick out addresses of functions
SysInit();
SysPrint();
SysPrintChar();
SysPrintNum();
SysRead();
SysShowStatus();
SysQuit();
SysException();
];

[DecodeText
inputO inputW !inputs
outputO outputB encodingO encodingB alpha charWord c char charOut; !temps

outputO=cTextO==>contextW;
outputB=cTextB==>contextW;
encodingO=cEncodO==>contextW;
encodingB=cEncodB==>contextW;
do
{
        charWord = inputO-->inputW;
        for (c=0: c<3: c++)
        {
                if (c==0) char=(charWord&$7c00)/1024;
                else if (c==1) char=(charWord&$3e0)/32;
                else char=charWord&31;

                charOut=-1;
                if (alpha<=2 && char<=5)
                {
                        if (char==0)
                        {
                                charOut=' ';
                                alpha=0;
                        }
                        else
                        {
                                if (char>=4)
                                        alpha=char-3;
                                else
                                        alpha=char+2;
                        }
                }
                else if (char==6 && alpha==2)
                {
                        alpha=6;
                }
                else
                {
                        if (alpha<=2)
                        {
                                charOut=encodingO->(encodingB+26*alpha+char-6);
                                alpha=0;
                        }
                        else if (alpha<=5)
                        {
                                cTextB==>contextW=outputB;
                                outputB=DecodeText(0, (cAbbrev==>contextW)-->(32*(alpha-3)+char));
                                outputB=cTextB==>contextW;
                                alpha=0;
                        }
                        else if (alpha==6)
                        {
                                alpha=32+char*32;
                        }
                        else
                        {
                                charOut=(alpha-32)|char;
                                alpha=0;
                        }
                }
                if (charOut>=0)
                {
                        outputO=>outputB=charOut;
                        outputB++;
                }
        }
        inputW++;
}
until (charWord<0);
outputO=>outputB=0;

cTextB==>contextW=outputB;
];

[TextToConsole
textO textB
fontO fontB bitmapW char ptr a b w x y checkWrap firstLine;

x=cScrenX==>contextW;
y=cScrenY==>contextW;
fontO=cFontO==>contextW;
fontB=cFontB==>contextW;
bitmapW=cBitMpW==>contextW;
char=textO=>textB;
if (x~=Border)
        checkWrap=1;
firstLine=1;
while (char)
{
        if (char<=32)
        {
                checkWrap=1;
        }
        else if (checkWrap)
        {
                w=x;
                ptr=textB;
                while (textO=>ptr>32)
                {
                        w=w+(fontO->(fontB+(textO=>ptr)*TextHeight));
                        ptr++;
                }
                if (w>ScrWidth)
                {
                        x=ScrWidth+1;
                }
                checkWrap=0;
        }
        ptr=fontB+char*TextHeight;
        w=fontO->ptr;
        if (x+w>ScrWidth || char==10)
        {
                y=y+TextHeight;
                if (y>BufferHeight-TextHeight)
                        y=0;
                if (y>(KeyboardStartLine-StatusHeight)-TextHeight || cScrollStart==>contextW)
                {
                        cScrollStart==>contextW=1;
                        a=cScroll==>contextW;
                        a=a+TextHeight;
                        if (a>=BufferHeight)
                                a=0;
                        if (a==cLastScroll==>contextW)
                        {
                                cScrenY==>contextW=y;
                                b=UpdateScreen();
                                b=GetKey();
                        }
                        cScroll==>contextW=a;
                }
                a=y*LineStride;
                b=LineStride*5;
                while (b)
                {
                        a==>bitmapW=0;
                        a=a+2;
                        b--;
                }
                x=Border;
                firstLine=0;
        }
        if (x~=Border || char>32 || firstLine)
        {
                if (cTextSep==>contextW==0 || char==124)
                {
                        a=7-(x&7);
                        b=2;
                        while (a)
                        {
                                b=b*2;
                                a--;
                        }
                        a=x/8+y*LineStride;
                        for (char=0: char<9: char++)
                        {
                                ptr++;
                                a==>bitmapW=(a==>bitmapW)|((fontO->ptr)*b);
                                a=a+LineStride;
                        }
                }
                x=x+w;
        }
        textB++;
        char=textO=>textB;
}
cScrenX==>contextW=x;
cScrenY==>contextW=y;
];

[UpdateScreen
ptr size sizeW bitmapW scroll; !temps
        bitmapW=cBitMpW==>contextW;
        scroll=cScroll==>contextW;
        cLastScroll==>contextW=cScrenY==>contextW;
        @write_reg 32 0;
        @write_reg 33 0;
        @blit1 0 LineStride $49c2 $49c2;
        @write_reg 32 0;
        @write_reg 33 1;
        ptr=bitmapW+(LineStrideW*BufferHeight);
        sizeW=LineStride*(StatusHeight-1);
        @blit1 ptr sizeW $49c2 $ff14;
        @write_reg 32 0;
        @write_reg 33 StatusHeight;
        ptr=bitmapW+(LineStrideW*scroll);
        sizeW=LineStride*(KeyboardStartLine-StatusHeight);
        if (scroll > BufferHeight - (KeyboardStartLine-StatusHeight))
        {
                size=BufferHeight-scroll;
                sizeW=LineStride*size;
                @blit1 ptr sizeW $ff14 $49c2;
                ptr=bitmapW;
                size=size+StatusHeight;
                @write_reg 32 0;
                @write_reg 33 size;
                sizeW=LineStride*(KeyboardStartLine-size);
        }
        @blit1 ptr sizeW $ff14 $49c2;
];

[InitScreenRegs;
@write_reg $0000 $0000; ! Setting primes the screen for data
@write_reg $0001 $0100;
@write_reg $0002 $0700;
@write_reg $0003 $1030;
@write_reg $0008 $0302;
@write_reg $0009 $0000;
@write_reg $000A $0008;
@write_reg $0010 $0790;
@write_reg $0011 $0005;
@write_reg $0012 $0000;
@write_reg $0013 $0000;
@write_reg $0010 $12B0;
@write_reg $0011 $0007;
@write_reg $0012 $008C;
@write_reg $0013 $1700;
@write_reg $0029 $0022;
@write_reg $0030 $0000;
@write_reg $0031 $0505;
@write_reg $0032 $0205;
@write_reg $0035 $0206;
@write_reg $0036 $0408;
@write_reg $0037 $0000;
@write_reg $0038 $0504;
@write_reg $0039 $0206;
@write_reg $003C $0206;
@write_reg $003D $0408;
@write_reg $0050 $0000;
@write_reg $0051 $00EF;
@write_reg $0052 $0000;
@write_reg $0053 $013F;
@write_reg $0060 $A700;
@write_reg $0061 $0001;
@write_reg $0090 $0033;
@write_reg $0081 $0000;
@write_reg $0082 $0000;
@write_reg $0083 $013F;
];

[InitContext;
cAbbrev==>contextW=$18-->0;
cEncodO==>contextW=$FFFF; !1E500
cEncodB==>contextW=$E501;
cScrenX==>contextW=Border;
!cScrenY==>contextW=0;
cFontO ==>contextW=$FFFF; ! $1E000
cFontB ==>contextW=$E001;
cBitMpW==>contextW=-(BufferHeight+StatusHeight)*LineStrideW;
!cScroll==>contextW=0;
cTextO==>contextW=cBitMpW==>contextW;
cTextB==>contextW=cBitMpW==>contextW-MaxTextSize;
!cTextSep==>contextW=0;
!cScrollStart==>contextW=0;
!cLastScroll==>contextW=0;
];

[SysPrint
printO printW;
printW=DecodeText(printO&1, printW);
if (printO&2) ! Doing print_ret so need to add a newline
{
        printO=cTextO==>contextW;
        printW=cTextB==>contextW;
        printO=>printW=10;
        printW++;
        printO=>printW=0;
}
cTextB==>contextW=(cBitMpW==>contextW-MaxTextSize); ! reset buffer as Decode modifies it
printW=TextToConsole(cTextO==>contextW, cTextB==>contextW);
rtrue;
];

[SysPrintChar
char
textO textB;
textO=cTextO==>contextW;
textB=cTextB==>contextW;
textO=>textB=char;
textB++;
textO=>textB=0;
char=TextToConsole(textO, textB-1);
rtrue;
];

[SysPrintNum
num
digit writeStarted demon temp;
demon=10000;
if (num<0)
{
        temp=SysPrintChar('-');
        demon=-demon;
}
while (1)
{
        digit=num/demon;
        if (digit<0) ! Not sure why I need to do this but fixes -32678
                digit=-digit;
        if (digit>0 || writeStarted || demon==1 || demon==-1)
        {
                temp=SysPrintChar('0'+digit);
                writeStarted=1;
                if (demon==1 || demon==-1)
                        break;
        }
        num=num-digit*demon;
        demon=demon/10; 
}
rtrue;
];

[DrawKeyboard
size ptr line i;
! Use print system to make keyboard bitmaps then blit to screen
for (: i<2: i++)
{
        cTextSep==>contextW=i;
        @print "  q   |  w   |   e   |   r   |   t   |   y   |   u   |    i   |   o   |   p^";
        @print "      a   |   s   |   d   |   f   |   g   |   h   |   j   |   k   |   l^";
        @print "          z   |   x   |   c   |   v   |   b   |   n   |  m   |   ,^";
        @print "         Delete         |          Space         |          Enter^";
}
cTextSep==>contextW=0;
@write_reg 32 0;
size=LineStride*TextHeight;
ptr=cBitMpW==>contextW;
i=ptr+4*TextHeight*LineStrideW;
line=KeyboardStartLine+1+KeyboardSepSpacing;
while (ptr<i)
{
        @write_reg 33 line;
        @blit1 ptr size $22b0 $d75f;
        ptr=ptr+TextHeight*LineStrideW;
        line=line+KeyboardTextSpacing;
}
size=LineStride*KeyboardSepSpacing;
line=KeyboardStartLine+1;
i=ptr+4*TextHeight*LineStrideW;
while (ptr<i)
{
        @write_reg 33 line;
        @blit1 ptr size $22b0 $d75f;
        line=line+TextHeight+KeyboardSepSpacing-1;
        @write_reg 33 line;
        @blit1 ptr size $22b0 $d75f;
        line=line+KeyboardSepSpacing+1;
        ptr=ptr+TextHeight*LineStrideW;
}
line=KeyboardStartLine;
i=line+4*(TextHeight+2*KeyboardSepSpacing);
size=LineStride;
while (line<i)
{
        @write_reg 33 line;
        @blit1 ptr size $d75f $d75f;
        line=line+TextHeight+2*KeyboardSepSpacing;
}
ptr=cBitMpW==>contextW;
i=ptr+LineStrideW*TextHeight*8;
while (ptr<i)
{
        0==>ptr=0;
        ptr++;
}
cScrenY==>contextW=0;
];

[GameSelect
palette
imageO imageP c col count p x y winW winWMax;

c=320;
@write_reg 32 0;
@write_reg 33 0;
while (c)
{
        p=240;
        while (p)
        {
                col=0;
                if ((c+p)&7 && (c-p)&7)
                        col=((0-->(palette+c))*(0-->(palette+(p+40))))&$7E0;
                p--;
                @write_reg 34 col;
        }
        c--;
        y++;
}
palette=palette+320;

imageP=(palette+128)*2+1;
imageO=$FFFF;
p=4;
while (p)
{
        winW=127;
        winWMax=226;
        if (p&1)
        {
                winW=13;
                winWMax=112;
        }
        y=167;
        if (p&2)
        {
                y=33;
        }
        @write_reg $0050 winW;
        @write_reg $0051 winWMax;
        @write_reg 32 winW;
        @write_reg 33 y;
        count=100*120;
        while (count>0)
        {
                c=imageO->imageP;
                col=0-->(palette+(c&$7F));
                imageP++;
                if (c&$80)
                {
                        c=imageO->imageP;
                        imageP++;
                        count=count-c;
                        while (c)
                        {
                                @write_reg 34 col;
                                c--;
                        }
                }
                else
                {
                        @write_reg 34 col;      
                        count--;
                }
        }
        p--;
}
@write_reg $0050 $0000;
@write_reg $0051 $00EF;
@write_reg $0007 $0133; ! Turn on the screen
        
do !wait for touch
{
        @get_touch $93 -> x;
        if (x<1000)
                y--;
        else
                y=10;
} until (y==0);
@get_touch $95 -> x; ! x
@get_touch $1A -> y; ! y
p=0;
if (x>510)
        p++;
if (y>508)
        p=p+2;

if (p>0)
        @switch_bank p;
];

[MandelbrotPalette;
@db 0;
@db $f800; @db $fb80; @db $f800; @db $fc00;
@db $f800; @db $fc00; @db $f800; @db $fc00;
@db $ff80; @db $df80; @db $bf80; @db $9f80;
@db $7f80; @db $5f80; @db $3f80; @db $1f80;
@db $1f81; @db $1f85; @db $1f89; @db $1f8d;
@db $1f91; @db $1f96; @db $1f9a; @db $1f9e;
@db $1d9f; @db $191f; @db $151f; @db $111f;
@db $0d1f; @db $091f; @db $049f; @db $009f;
];

[Mandelbrot
x y xtemp ytemp x0 y0 x00 y00 i;
@write_reg 32 0;
@write_reg 33 StatusHeight;
y0=60;
do
{
        x0=-120;
        y00=y0*40;
        do
        {
                xtemp=0;
                ytemp=0;
                y=0;
                i=0;
                x00=x0*20;
                do
                {
                        i++;
                        xtemp=xtemp-ytemp+y00;
                        y=(x*y+x00)/32;
                        if (y>=2*64 || y<=-2*64)
                                break;
                        x=xtemp/64;
                        if (x>=2*64 || x<=-2*64)
                                break;
                        xtemp=x*x;
                        ytemp=y*y;
                } until ( xtemp + ytemp >= 64*64*4 || i>=32);
                i=1-->(i+MandelbrotPalette);
                @write_reg 34 i;
                x0++;
        } until (x0>=120);
        y0--;
} until (y0==60-(KeyboardStartLine-StatusHeight));
@write_reg $0007 $0133; ! Turn on the screen
x=GetKey();
];

[SpaceInvadersSpriteData;
!squid1 Offset:0
@db 8*(8|16);
@db 8*(4|8|16|32);
@db 8*(2|4|8|16|32|64);
@db 8*(1|2|8|16|64|128);
@db 8*(1|2|4|8|16|32|64|128);
@db 8*(4|32);
@db 8*(2|8|16|64);
@db 8*(1|4|32|128);
!ant1 Offset:16
@db 4*(4|256);
@db 4*(8|128);
@db 4*(4|8|16|32|64|128|256);
@db 4*(2|4|16|32|64|256|512);
@db 4*(1|2|4|8|16|32|64|128|256|512|1024);
@db 4*(1|4|8|16|32|64|128|256|1024);
@db 4*(1|4|256|1024);
@db 4*(8|16|64|128);
!bug1 Offset:32
@db 4*(16|32|64|128);
@db 4*(2|4|8|16|32|64|128|256|512|1024);
@db 4*(1|2|4|8|16|32|64|128|256|512|1024|2048);
@db 4*(1|2|4|32|64|512|1024|2048);
@db 4*(1|2|4|8|16|32|64|128|256|512|1024|2048);
@db 4*(4|8|16|128|256|512);
@db 4*(2|4|32|64|512|1024);
@db 4*(4|8|256|512);
!squid2 Offset:48
@db 8*(8|16);
@db 8*(4|8|16|32);
@db 8*(2|4|8|16|32|64);
@db 8*(1|2|8|16|64|128);
@db 8*(1|2|4|8|16|32|64|128);
@db 8*(2|8|16|64);
@db 8*(1|128);
@db 8*(2|64);
!ant2 Offset:64
@db 4*(4|256);
@db 4*(1|8|128|1024);
@db 4*(1|4|8|16|32|64|128|256|1024);
@db 4*(1|2|4|16|32|64|256|512|1024);
@db 4*(1|2|4|8|16|32|64|128|256|512|1024);
@db 4*(2|4|8|16|32|64|128|256|512);
@db 4*(4|256);
@db 4*(2|512);
!bug2 Offset:80
@db 4*(16|32|64|128);
@db 4*(2|4|8|16|32|64|128|256|512|1024);
@db 4*(1|2|4|8|16|32|64|128|256|512|1024|2048);
@db 4*(1|2|4|32|64|512|1024|2048);
@db 4*(1|2|4|8|16|32|64|128|256|512|1024|2048);
@db 4*(8|16|128|256);
@db 4*(4|8|32|64|256|512);
@db 4*(1|2|1024|2048);
!ship Offset:96
@db 2*(64);
@db 2*(32|64|128);
@db 2*(32|64|128);
@db 2*(2|4|8|16|32|64|128|256|512|1024|2048);
@db 2*(1|2|4|8|16|32|64|128|256|512|1024|2048|4096);
@db 2*(1|2|4|8|16|32|64|128|256|512|1024|2048|4096);
@db 2*(1|2|4|8|16|32|64|128|256|512|1024|2048|4096);
@db 2*(1|2|4|8|16|32|64|128|256|512|1024|2048|4096);
!explosion Offset:112
@db 4*(16|256);
@db 4*(2|32|128|2048);
@db 4*(4|1024);
@db 4*(8|512);
@db 4*(1|2|2048); !|4096); Should really but messes with clear
@db 4*(8|512);
@db 4*(4|32|128|1024);
@db 4*(2|16|256|2048);
!ufo Offset:128
@db $03c0;
@db $0ff0;
@db $3ffc;
@db $6db6;
@db $ffff;
@db $3bdc;
@db $1008;
!base Offset:142
@db $0FFF; @db $C000;
@db $1FFF; @db $E000;
@db $3FFF; @db $F000;
@db $7FFF; @db $F800;
@db $FFFF; @db $FC00;
@db $FFFF; @db $FC00;
@db $FFFF; @db $FC00;
@db $FFFF; @db $FC00;
@db $FFFF; @db $FC00;
@db $FFFF; @db $FC00;
@db $FFFF; @db $FC00;
@db $FFFF; @db $FC00;
@db $FE03; @db $FC00;
@db $FC01; @db $FC00;
@db $F800; @db $FC00;
@db $F800; @db $FC00;
];

[SpaceInvaders
sprites x y i k s xd u c sx t p l ud j;

!copy sprite data
sprites=contextW-MaxTextSize/2;
i=SpaceInvadersSpriteData;
k=i+71;
c=sprites;
while (i<k)
{
        0==>c=1-->i;
        i++;
        c++;
}
!copy 4x bases as will get destroyed
c=sprites+135;
k=i+32;
t=4;
while (t)
{
        i=SpaceInvadersSpriteData+71;
        while (i<k)
        {
                0==>c=1-->i;
                i++;
                c++;
        }
        t--;
}

s=sprites;
k=s+5;
t=26;
c=234;
while (s<k)
{
        190==>s=0; !dying
        200==>s=8; !startX
        210==>s=t; !startY
        220==>s=$7ff; !alive
        c==>sprites=0; !bullet direction
        s++;
        t=t+16;
        c=c+6;
}
184==>sprites=0; ! dead timer
186==>sprites=0; ! ufo dead timer
188==>sprites=255; ! ufo position

@write_reg $0050 0;
@write_reg $0051 $EF;
@write_reg 32 0;
@write_reg 33 StatusHeight;
@blit1 0 6900 0 0;
xd=2;
sx=115;
l=3;
ud=1;
while (1)
{
        if (random(50)==1 && ~~184==>sprites)
        {
                x=random(11)-1;
                k=x;
                t=1;
                while (k)
                {
                        t=t*2;
                        k--;
                }
                s=228;
                y=0;
                for (k=0: k<5: k++)
                {
                        if (s==>sprites&t)
                        {
                                x=(s-20)==>sprites+16*x;
                                y=(s-10)==>sprites+6;
                                break;
                        }
                        s=s-2;
                }
                if (y)
                {
                        for (k=0: k<4: k++)
                        {
                                s=236+6*k;
                                if (~~(s+4)==>sprites)
                                {
                                        s==>sprites=x+8;
                                        (s+2)==>sprites=y;
                                        (s+4)==>sprites=1;
                                        break;
                                }
                        }
                }
        }

        x=188==>sprites;
        if (x<240-16)
        {
                i=2;
                while (i)
                {
                        @write_reg $0050 x;
                        @write_reg 32 x;
                        y=x+15;
                        @write_reg $0051 y;
                        @write_reg 33 16;
                        i--;
                        if (i)
                        {
                                @blit1 0 14 0 0;
                                x++;
                                188==>sprites=x;
                                if (x>=240-16)
                                        break;
                        }
                        else
                        {
                                s=sprites+64;
                                x=186==>sprites;
                                k=$f800;
                                if (x)
                                {
                                        s=sprites+56;
                                        x--;
                                        186==>sprites=x;
                                        if (~~x)
                                        {
                                                188==>sprites=255;
                                                k=0;
                                        }
                                }
                                @blit1 s 14 0 k;
                        }
                }
        }
        else if (random(2000)==1)
        {
                188==>sprites=0;
        }

        ud--;
        if (ud<=0)
        {
                k=0;    
                do
                {
                        u--;
                        if (u<0)
                                u=4;
                        x=220==>(sprites+u);
                        k++;
                } until (x || k>5);
                if (~~x)
                {
                        break; ! all enemies dead
                }
                if (x&$007)
                        ud++;
                if (x&$038)
                        ud++;
                if (x&$1C0)
                        ud++;
                if (x&$600)
                        ud++;
                k=5;
                while (k)
                {
                        k--;
                        t=220==>(sprites+k);
                        if (t)
                                j=k;
                        x=x|t;
                }
                k=x;
                c=8;
                while (~~(x&1))
                {
                        c=c-16;
                        x=x/2;
                }
                t=54;
                while (~~(k&$400))
                {
                        k=k*2;
                        t=t+16;
                }
                x=200==>(sprites+u)+xd;
                if (x>t || x<c)
                {
                        y=210==>(sprites+u);
                        @write_reg $0050 0;
                        @write_reg $0051 $EF;
                        @write_reg 32 0;
                        @write_reg 33 y;
                        @blit1 0 240 0 0;
                        210==>(sprites+u)=y+10;
                        if (u==j)
                                xd=-xd;
                        if (y>202) !touched the ship row
                        {
                                if (~~184==>sprites)
                                {
                                        184==>sprites=150;
                                }
                                l=0;
                        }
                }
                200==>(sprites+u)=x;
        }
        s=sprites+135;
        for (k=0: k<4: k++)
        {
                x=35+k*50;
                @write_reg $50 x;
                @write_reg 32 x;
                x=x+31;
                @write_reg $51 x;
                @write_reg 33 195;
                @blit1 s 64 0 $7E0;
                s=s+32;
        }
        for (k=0: k<5: k++)
        {
                x=200==>(sprites+k);
                y=210==>(sprites+k);
                p=220==>(sprites+k);
                c=y/8;
                c=(31-c)*32*64+c+1;
                s=sprites;
                if (x&2)
                        s=s+24;
                if (k>=3)
                        s=s+16;
                else if (k>=1)
                        s=s+8;
                t=1;
                for (i=0: i<11: i++)
                {
                        @write_reg $0050 x;
                        @write_reg 32 x;
                        @write_reg 33 y;
                        x=x+15;
                        @write_reg $0051 x;
                        x++;
                        if (p&t)
                        {
                                j=190==>(sprites+k);
                                if (j&t)
                                {
                                        if (j&$8000)
                                        {
                                                @blit1 s 16 0 0;
                                                p=p&~t;
                                        }
                                        else
                                        {
                                                j=sprites+56;
                                                @blit1 j 16 0 c;
                                        }
                                }
                                else
                                {
                                        @blit1 s 16 0 c;
                                }
                        }
                        t=t*2;
                }
                220==>(sprites+k)=p;
                p=190==>(sprites+k);
                if (p)
                {
                        if (p&$8000)
                                p=0;
                        else
                                p=p+$1000;
                        190==>(sprites+k)=p;
                }
        }
        s=230;
        for (j=-3: j<5: j++)
        {
                k=j;
                if (k<0)
                        k=0;
                x=(s+4)==>sprites;
                if (x)
                {
                        y=(s+2)==>sprites;
                        i=s==>sprites;  
                        @write_reg 32 i;
                        @write_reg $50 i;
                        @write_reg $51 i;
                        @write_reg 33 y;
                        @write_reg 34 0;
                        @write_reg 34 0;
                        if (x>0)
                        {
                                @write_reg 34 0;
                                @write_reg 34 0;
                        }
                        if (k) !not player bullet
                        {
                                if (234==>sprites)
                                {
                                        t=232==>sprites;
                                        if (y<=t && y+4>=t)
                                        {
                                                t=230==>sprites;
                                                if (i<=t+2 && i>=t-2)
                                                {
                                                        ! two bullets hit
                                                        234==>sprites=0;
                                                        (s+4)==>sprites=0;
                                                        ! erase player bullet
                                                        @write_reg 32 t;
                                                        @write_reg $50 t;
                                                        @write_reg $51 t;
                                                        t=232==>sprites;
                                                        @write_reg 33 t;
                                                        @write_reg 34 0;
                                                        @write_reg 34 0;
                                                }
                                        }
                                }
                        }
                        y=y+x;
                        (s+2)==>sprites=y;
                        if (x<0)
                        {
                                for (i=0: i<5: i++)
                                {
                                        t=210==>(sprites+i);
                                        if (y>=t && y<t+6)
                                        {
                                                t=s==>sprites-200==>(sprites+i);
                                                if (t>=0 && t<11*16)
                                                {
                                                        p=1;
                                                        c=0;
                                                        while (t>16)
                                                        {
                                                                p=p*2;
                                                                t=t-16;
                                                                c=c+16;
                                                        }
                                                        if (t>2 && t<14)
                                                        {
                                                                if (220==>(sprites+i)&p)
                                                                {
                                                                        190==>(sprites+i)=190==>(sprites+i)|p;
                                                                        (s+4)==>sprites=0;
                                                                        p=200==>(sprites+i)+c;
                                                                        t=210==>(sprites+i);
                                                                        break;
                                                                }
                                                        }
                                                }
                                        }
                                }
                        }
                        if (y>=195 && y<195+16)
                        {
                                t=s==>sprites-35;
                                if (t>=0 && t<4*50)
                                {
                                        i=t/50;
                                        t=t-i*50;
                                        if (t<22)
                                        {
                                                k=(270-1)+(64*i)+(4*(y-195));
                                                t=t+7;
                                                while (t>=12)
                                                {
                                                        t=t-8;
                                                        k=k++;
                                                }
                                                p=1;
                                                t=15-t;
                                                while (t)
                                                {
                                                        t--;
                                                        p=p*2;
                                                }
                                                t=k==>sprites;
                                                if (t&p)
                                                {
                                                        p=p/8;
                                                        k==>sprites=t&~(p*(1|2|4|8|16));
                                                        if (y<195+15)
                                                                (k+4)==>sprites=(k+4)==>sprites&~(p*(2|4|8));
                                                        if (y<195+14)
                                                                (k+8)==>sprites=(k+8)==>sprites&~(p*(1|4|16));
                                                        if (y>195)
                                                                (k-4)==>sprites=(k-4)==>sprites&~(p*(2|4|8));
                                                        if (y>196)
                                                                (k-8)==>sprites=(k-8)==>sprites&~(p*(1|4|16));
                                                        (s+4)==>sprites=0;
                                                }
                                        }
                                }
                        }
                        i=s==>sprites;
                        if (x>0 && i>sx+1 && i<sx+15 && y>=220 && y<217+8)
                        {
                                (s+4)==>sprites=0;
                                if (~~184==>sprites)
                                {
                                        184==>sprites=150;
                                        l--;
                                }
                        }
                        ;
                        if (x<0 && y>=16 && y<=16+7 && i>=188==>sprites && i<188==>sprites+16)
                        {
                                (s+4)==>sprites=0;
                                186==>sprites=8;
                        }
                        if (y>=217+8 || y<=StatusHeight)
                                (s+4)==>sprites=0;
                        if ((s+4)==>sprites)
                        {
                                @write_reg 33 y;
                                @write_reg 34 $7E0;
                                @write_reg 34 $7E0;
                                if (x>0)
                                {
                                        @write_reg 34 $7E0;
                                        @write_reg 34 $7E0;
                                }
                        }
                }
                if (j>=0)
                        s=s+6;
        }
        if (~~184==>sprites)
        {
                @get_touch $93 -> x;
                if (x<1000)
                {
                        @get_touch $1A -> y; ! y
                        if (y<720)
                        {
                                @get_touch $95 -> x; ! x
                                x=x-90;
                                x=x*2;
                                x=x/7;
                                x=x-7;
                                if (x>sx)
                                        sx++;
                                else
                                        sx--;
                        }
                        else if (234==>sprites==0)
                        {
                                230==>sprites=sx+8;
                                232==>sprites=217;
                                234==>sprites=-1;
                        }
                }
        }
        @write_reg $0050 sx;
        @write_reg 32 sx;
        x=sx+15;
        @write_reg $0051 x;
        @write_reg 33 218;
        s=sprites+96/2;
        k=$7e0;
        if (184==>sprites)
        {
                if (184==>sprites>130)
                        s=sprites+56;
                else
                        k=0;
                184==>sprites=184==>sprites-1;
        }
        else if (l<=0)
        {
                break;
        }
        @blit1 s 16 0 k;

        s=sprites+96/2;
        for (k=0: k<3: k++)
        {
                x=10+16*k;
                @write_reg $0050 x;
                @write_reg 32 x;
                x=x+15;
                @write_reg $0051 x;
                @write_reg 33 230;
                if (k<l)
                        @blit1 s 16 0 $7E0;
                else
                        @blit1 s 16 0 0;
        }

        x=7500; !Delay to keep game from running too fast
        do
        {
                x--;
        } until (~~x);
        @write_reg $0007 $0133; ! Turn on the screen
}
@write_reg $0050 0;
@write_reg $0051 $EF;
if (l>0)
        @print "You win!^^";
else
        @print "Bad luck.^^";
];

[SysInit
temp;
temp=InitContext();
temp=InitScreenRegs();
if (~~($FFFF->$E580))
        temp=GameSelect($B400);
temp=DrawKeyboard();
@new_line;
! Set flags
0->1=(0->1&$8f)|$40; ! Status line availible, Screen splitting not availible + variable pitch font
0->10=0->10&$fe; ! Transcripting off
];

[FindInDictionary
text parse
encodingO encodingB textO textB count limit i a c;

encodingO=cEncodO==>contextW;
textO=cTextO==>contextW;
textB=cTextB==>contextW;
limit=textB+6;

i=6;
while (i)
{
        i--;
        textO=>(textB+i)=5;
}

count=parse->2;
text=text+parse->3;

while (count && textB<limit)
{
        c=text->0;
        text++;
        count--;
        if (c==32)
        {
                textO=>textB=0;
                textB++;
        }
        else
        {
                i=0;
                a=3;
                encodingB=cEncodB==>contextW;
                while (c~=encodingO->encodingB)
                {
                        encodingB++;
                        i++;
                        if (i==26)
                        {
                                if (a==5)
                                        break;
                                a++;
                                i=0;
                        }
                }
                if (a>3)
                {
                        textO=>textB=a;
                        textB++;
                }
                if (i==26)
                {
                        textO=>textB=6;
                        textB++;
                        textO=>textB=(c/32)&$1F;
                        textB++;
                        textO=>textB=c&$1F;
                        textB++;
                }
                else
                {
                        textO=>textB=6+i;
                        textB++;
                }
        }
}

textB=cTextB==>contextW;
a=textO=>(textB  )*1024+textO=>(textB+1)*32+textO=>(textB+2);
c=textO=>(textB+3)*1024+textO=>(textB+4)*32+textO=>(textB+5);
c=c|$8000;

i=DictionaryOff-->0;
parse-->0=0;
i=i+i->0+1;
limit=i->0;
i++;
count=i-->0;
i=i+2;
while (count)
{
        if (i-->0==a && i-->1==c)
        {
                parse-->0=i;
                break;
        }
        i=i+limit;
        count--;
}
];

[UpdateStatus
x y scoreX;

x=cBitMpW==>contextW+BufferHeight*LineStrideW;
y=StatusHeight*LineStrideW;
while (y)
{
        0==>x=0;
        x++;
        y--;
}

x=cScrenX==>contextW;
y=cScrenY==>contextW;
cScrenX==>contextW=Border;
cScrenY==>contextW=BufferHeight;
@print_obj sys__glob0;
scoreX=ScoreXOffset;
if (sys__glob1>=1000)
        scoreX=scoreX-12;
else if (sys__glob1>=100)
        scoreX=scoreX-8;
else if (sys__glob1>=10)
        scoreX=scoreX-4;
if (sys__glob2>=1000)
        scoreX=scoreX-12;
else if (sys__glob2>=100)
        scoreX=scoreX-8;
else if (sys__glob2>=10)
        scoreX=scoreX-4;
cScrenX==>contextW=scoreX;
print "Score:";
@print_num sys__glob1;
print " Moves:";
@print_num sys__glob2;
cScrenX==>contextW=x;
cScrenY==>contextW=y;
];

[GetKey
x y
startY scrollStart scrollLimit scroll;
                        
startY=1024;
scrollLimit=cScroll==>contextW;
while (1)
{
        scrollStart=scroll;
        do !wait for not-touch
        {
                if (startY~=1024)
                {
                        @get_touch $1A -> y; ! y
                        scroll=scrollStart+(startY-y)/3;
                        if (scroll>0)
                        {
                                scroll=0;
                        }
                        else if (scroll<-BufferHeight+KeyboardStartLine-StatusHeight)
                        {
                                scroll=-BufferHeight+KeyboardStartLine-StatusHeight;
                        }
                        cScroll==>contextW=((scrollLimit+scroll+BufferHeight+BufferHeight)%BufferHeight);
                        x=UpdateScreen();
                }
                @get_touch $93 -> x;
        } until (x>=1000);
        y=10;
        do !wait for touch
        {
                @get_touch $93 -> x;
                if (x<1000)
                        y--;
                else
                        y=10;
        } until (y==0);
        startY=1024;
        @get_touch $95 -> x; ! x
        @get_touch $1A -> y; ! y
        if (y>=870)
        {
                if (x<=374)     ! delete
                        return 0;
                if (x<=649)
                        return ' ';
                return 10;
        }
        else if (y>=820)
                {
                        if (x<=256)
                                return 'z';
                        if (x<=340)
                                return 'x';
                        if (x<=423)
                                return 'c';
                        if (x<=506)
                                return 'v';
                        if (x<=590)
                                return 'b';
                        if (x<=673)
                                return 'n';
                        if (x<=753)
                                return 'm';
                        return ',';
                }
        else if (y>=770)
        {
                if (x<=215)
                        return 'a';
                if (x<=298)
                        return 's';
                if (x<=381)
                        return 'd';
                if (x<=465)
                        return 'f';
                if (x<=548)
                        return 'g';
                if (x<=631)
                        return 'h';
                if (x<=711)
                        return 'j';
                if (x<=794)
                        return 'k';
                return 'l';
        }
        else if (y>=720)
        {
                if (x<=173)
                        return 'q';
                if (x<=253)
                        return 'w';
                if (x<=336)
                        return 'e';
                if (x<=416)
                        return 'r';
                if (x<=499)
                        return 't';
                if (x<=583)
                        return 'y';
                if (x<=666)
                        return 'u';
                if (x<=753)
                        return 'i';
                if (x<=836)
                        return 'o';
                return 'p';
        }
        else
        {
                startY=y;
        }
}
];

[EraseConsole
sx sy
i ptr endptr bitmapW mask;

bitmapW=cBitMpW==>contextW;

i=sx;
mask=1;
while (sx&15)
{
        mask=mask*2;
        sx++;
}
mask=~(mask-1);
sx=i/16;

while (sy<=cScrenY==>contextW)
{
        for (i=0: i<10: i++)
        {
                ptr=(sy+i)*LineStride+sx+sx;
                endptr=(sy+i+1)*LineStride;
                ptr==>bitmapW=ptr==>bitmapW&mask;
                ptr=ptr+2;
                while (ptr<endptr)
                {
                        ptr==>bitmapW=0;
                        ptr=ptr+2;
                }
        }
        sx=0;
        sy=sy+10;
        mask=0;
}
];

[SysRead
parse text
count i c sep dict readingWord parse0 temp;

temp=UpdateStatus();
temp=UpdateScreen();
@write_reg $0007 $0133; ! Turn on the screen

c=cScrenX==>contextW;
sep=cScrenY==>contextW;
dict=cScroll==>contextW;

do
{
        i++;
        text->i=GetKey();
        if (text->i==0)
        {
                if (i>=2)
                        i=i-2;
                else
                        i--;
        }
        temp=EraseConsole(c,sep);
        cScrenX==>contextW=c;
        cScrenY==>contextW=sep;
        cScroll==>contextW=dict;
        text->(i+1)=0;
        temp=TextToConsole(1, text);
        temp=UpdateScreen();
} until (i && text->i==10);
text->i=0;
text->0=(i-1);

i=0;
if (text->0==10)
{
        if (text->1=='m' && text->2=='a' && text->3=='n' && text->4=='d' && text->5=='e'
         && text->6=='l' && text->7=='b' && text->8=='r' && text->9=='o' && text->10=='t')
        {
                parse0=Mandelbrot();
                i=1;
        }
}
else if (text->0==6)
{
        if (text->1=='i' && text->2=='n' && text->3=='v' && text->4=='a' && text->5=='d' && text->6=='e')
        {
                parse0=SpaceInvaders();
                i=1;
        }
}
if (i)
{
        text->0=4;
        text->1='w';
        text->2='a';
        text->3='i';
        text->4='t';
        text->5=0;
}

parse0=parse;
parse++;
parse++;

parse0->1=0;
count=text->0;
i=1;
while (count)
{
        c=text->i;
        if (c==32)
        {
                sep=-1;
        }
        else
        {
                dict=DictionaryOff-->0;
                sep=dict->0;
                while (sep)
                {
                        if (c==dict->sep)
                                break;
                        sep--;
                }
        }
        if (readingWord)
        {
                if (sep)
                {
                        parse0->1=parse0->1+1;
                        parse->2=i-parse->3;
                        temp=FindInDictionary(text, parse);
                        parse=parse+4;
                        readingWord=0;
                        if (sep>0)
                        {
                                parse->3=i;
                                readingWord=1;
                        }
                }
        }
        else if (sep>=0)
        {
                parse->3=i;
                readingWord=1;
        }
        count--;
        i++;
}
if (readingWord)
{
        parse0->1=parse0->1+1;
        parse->2=i-parse->3;
        temp=FindInDictionary(text, parse);
}
];

[SysShowStatus
temp;
temp=UpdateStatus();
temp=UpdateScreen();
];

[PressKeyToReboot
temp;
@print "Press any key to reboot]";
temp=UpdateScreen();
temp=GetKey();
@switch_bank 0;
];

[SysQuit
temp;
@print "^[Quit. ";
temp=PressKeyToReboot();
];

[SysException
pc oper0 oper1;
@print "^[Exception PC/2=";
@print_num pc;
@print " OP0=";
@print_num oper0;
@print " OP1=";
@print_num oper1;
@print "]^[";
pc=PressKeyToReboot();
];

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.